",m.innerHTML=y,z("setup-step-summary")}async function H(m){try{const y=await secureFetch("/api/v1/config",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(m)});return y.ok?(await y.json(),!0):(errorHandler.logError("[SetupWizard] Save Config",new Error(`Server returned ${y.status}`),{function:"saveConfigToServer"}),!1)}catch(y){return errorHandler.logError("[SetupWizard] Save Config",y,{function:"saveConfigToServer"}),!1}}async function A(){const m={setupComplete:!0,configurationType:b,timestamp:new Date().toISOString(),timezone:document.getElementById("setup-timezone")?.value||Intl.DateTimeFormat().resolvedOptions().timeZone||"UTC"};if(b==="homelab"){m.tld=document.getElementById("setup-tld")?.value?.trim()||".home",m.caName=document.getElementById("setup-ca-name")?.value?.trim()||"";const E=document.getElementById("setup-dns-provider")?.value||"technitium";m.dns={provider:E,ip:document.getElementById("setup-dns-ip")?.value?.trim()||"",port:document.getElementById("setup-dns-port")?.value?.trim()||DC.DEFAULTS.DNS_PORT,token:document.getElementById("setup-dns-token")?.value?.trim()||""},m.defaults={dnsType:"private",sslType:"internal",targetIP:"localhost"}}else b==="simple"?(m.defaultIP=document.getElementById("setup-simple-ip")?.value?.trim()||"localhost",m.defaults={dnsType:"none",sslType:"none",targetIP:m.defaultIP}):b==="public"&&(m.domain=document.getElementById("setup-public-domain")?.value?.trim()||"",m.email=document.getElementById("setup-public-email")?.value?.trim()||"",m.routingMode=document.querySelector('input[name="routing-mode"]:checked')?.value||"subdirectory",m.defaults={dnsType:m.routingMode==="subdirectory"?"none":"public",sslType:"letsencrypt",targetIP:"localhost"});const y=await H(m);safeSet("dashcaddy-config",JSON.stringify(m)),safeSet("dashcaddy-setup","completed"),document.getElementById("setup-wizard").style.display="none";const S=b==="homelab"?"Professional Home Lab":b==="simple"?"Simple Setup":"Public Server",f=y?"server (shared across all devices)":"locally (this browser only)";showNotification(`Setup Complete! Configured for: ${S}. Settings saved to: ${f}`,"success",5e3),setTimeout(()=>location.reload(),500)}const x=document.getElementById("setup-step-1-next");x&&(x.onclick=function(m){m.preventDefault();const y=document.querySelector('input[name="config-type"]:checked');y&&(b=y.value),z(b==="homelab"?"setup-step-homelab":b==="simple"?"setup-step-simple":b==="public"?"setup-step-public":"setup-step-homelab")});const B=document.getElementById("setup-skip");B&&(B.onclick=async function(m){m.preventDefault(),confirm("Skip setup? You can run it later from Settings.")&&(await H({setupComplete:!0,skipped:!0,timestamp:new Date().toISOString()}),safeSet("dashcaddy-setup","skipped"),document.getElementById("setup-wizard").style.display="none")});const w=document.getElementById("setup-tld");w&&(w.oninput=function(m){const y=m.target.value||".home",S=document.getElementById("tld-preview"),f=document.getElementById("tld-preview-2");S&&(S.textContent=y),f&&(f.textContent=y)});const M=document.getElementById("setup-homelab-back");M&&(M.onclick=function(m){m.preventDefault(),z("setup-step-1")});const L=document.getElementById("setup-homelab-next");L&&(L.onclick=function(m){m.preventDefault();const y=document.getElementById("setup-tld")?.value?.trim()||"",S=document.getElementById("setup-ca-name")?.value?.trim()||"",f=document.getElementById("setup-dns-ip")?.value?.trim()||"";if(!y||!y.startsWith(".")){showNotification("Please enter a valid TLD starting with a dot (e.g., .home)","warning");return}if(!S){showNotification("Please enter a Certificate Authority name","warning");return}if(!f){showNotification("Please enter your DNS server IP address","warning");return}P()});const $=document.getElementById("setup-simple-back");$&&($.onclick=function(m){m.preventDefault(),z("setup-step-1")});const u=document.getElementById("setup-simple-next");u&&(u.onclick=function(m){m.preventDefault(),P()}),document.querySelectorAll('input[name="routing-mode"]').forEach(function(m){m.onchange=function(){var y=document.getElementById("dns-requirement-note");y&&(y.textContent=this.value==="subdirectory"?"Only one DNS record needed (for the main domain)":"You'll need to configure DNS manually for each subdomain")}});const v=document.getElementById("setup-public-back");v&&(v.onclick=function(m){m.preventDefault(),z("setup-step-1")});const D=document.getElementById("setup-public-next");D&&(D.onclick=function(m){m.preventDefault();const y=document.getElementById("setup-public-domain")?.value?.trim()||"",S=document.getElementById("setup-public-email")?.value?.trim()||"";if(!y){showNotification("Please enter your domain name","warning");return}if(!S||!S.includes("@")){showNotification("Please enter a valid email address","warning");return}P()});const I=document.getElementById("setup-summary-back");I&&(I.onclick=function(m){m.preventDefault(),b==="homelab"?z("setup-step-homelab"):b==="simple"?z("setup-step-simple"):b==="public"&&z("setup-step-public")});const R=document.getElementById("setup-summary-next");R&&(R.onclick=function(m){m.preventDefault(),z("setup-step-disk-safety")});const N=document.getElementById("setup-disk-safety-back");N&&(N.onclick=function(m){m.preventDefault(),z("setup-step-summary")});const O=document.getElementById("setup-disk-safety-finish");O&&(O.onclick=function(m){m.preventDefault(),A()}),window.getGlobalConfig=async function(){try{const y=await fetch("/api/v1/config");if(y.ok){const S=await y.json();if(S&&S.setupComplete)return S}}catch{console.warn("Could not fetch config from server")}const m=safeGet("dashcaddy-config");return m?JSON.parse(m):{setupComplete:!1,configurationType:"homelab",tld:".home",caName:"",defaults:{dnsType:"private",sslType:"internal",targetIP:"localhost"}}},window.resetSetupWizard=async function(){if(confirm("Reset DashCaddy configuration? This will show the setup wizard again.")){try{await secureFetch("/api/v1/config",{method:"DELETE"})}catch{console.warn("Could not delete server config")}safeRemove("dashcaddy-setup"),safeRemove("dashcaddy-config"),location.reload()}}})(),(function(){const b=new ErrorHandler;injectModal("app-selector-modal",`
Choose an App
`),injectModal("app-deploy-modal",`
Deploy Application
Your app will be available at: uptime.home
\u2713 Detected from existing media servers:
Select folders from existing servers, browse, or type paths manually. Separate multiple with commas.
Token expires in 4 minutes! Get it right before clicking Deploy. Leave empty to configure Plex manually later.
Checking Tailscale status...
\u2699\uFE0F Advanced Options
Use 'localhost' for same-host containers, or specific IP for remote services
Customize where container data is stored on the host. Media volumes are configured above.
Optional CPU and memory constraints. Leave at 0 for unlimited.
`);const C="custom-apps";let j=null,k=null;const z=document.getElementById("app-selector-modal"),P=document.getElementById("app-selector-grid");async function H(){try{const p=await(await fetch("/api/v1/apps/templates")).json();if(p.success)return j=p.templates,k=p.categories,!0}catch(s){b.logError("[AppSelector] Fetch Templates",s,{function:"fetchApiTemplates"})}return!1}async function A(s){try{return await(await fetch(`/api/v1/apps/ports/${s}/check`)).json()}catch(p){return b.logError("[AppSelector] Check Port",p,{function:"checkPortAvailability"}),{available:!0}}}async function x(s){try{const l=await(await fetch(`/api/v1/apps/ports/${s}/suggest`)).json();if(l.success)return l.suggestedPort}catch(p){b.logError("[AppSelector] Get Suggested Port",p,{function:"getSuggestedPort"})}return s}async function B(){if(P.innerHTML='
Loading app templates...
',!j&&!await H()){P.innerHTML='
Failed to load app templates. Please try again.
';return}P.innerHTML="";const s={};for(const[l,g]of Object.entries(j)){const c=g.category||"Other";s[c]||(s[c]=[]),s[c].push({id:l,...g})}const p=k?Object.keys(k):Object.keys(s).sort();for(const l of p){const g=s[l];if(!g||g.length===0)continue;g.sort((e,a)=>(a.popularity||0)-(e.popularity||0));const c=document.createElement("div");c.className="app-category-header";const t=k?.[l]||{};c.innerHTML=`${escapeHtml(t.icon||"")} ${escapeHtml(l)}`,t.color&&(c.style.borderBottomColor=t.color),P.appendChild(c),g.forEach(e=>{const a=document.createElement("div");a.className="app-option";const o=e.isDashboardWidget,i=o&&safeGet("widget-"+e.id+"-enabled")!=="false",n=o?`
${i?"ON":"OFF"}
`:"",r=!o&&e.difficulty?`
${escapeHtml(e.difficulty)}
`:"";a.innerHTML=`
${escapeHtml(e.icon||"\u{1F4E6}")}
${escapeHtml(e.name)}
${escapeHtml(e.description||"")}
${n}${r}
`,o?a.onclick=()=>w(e,a):a.onclick=()=>M(e),P.appendChild(a)})}window.renderRecipeCards&&await window.renderRecipeCards(P)}function w(s,p){const l="widget-"+s.id+"-enabled",c=!(safeGet(l)!=="false");safeSet(l,String(c));const t=s.widgetSelector;if(t){const a=document.querySelector(t);a&&(a.style.display=c?"":"none")}const e=p.querySelector('div[style*="border-radius: 4px"]');e&&(e.textContent=c?"ON":"OFF",e.style.background=c?"#2ecc7130":"#e74c3c30",e.style.color=c?"#2ecc71":"#e74c3c"),showNotification(`${s.name} widget ${c?"enabled":"disabled"}`,"success",2e3)}async function M(s){const p=document.getElementById("app-deploy-modal"),l=document.getElementById("app-deploy-title"),g=document.getElementById("deploy-subdomain"),c=document.getElementById("deploy-url-preview"),t=document.getElementById("deploy-ip"),e=document.getElementById("deploy-port"),a=document.getElementById("deploy-tailscale-only"),o=document.getElementById("tailscale-status");try{const G=await(await secureFetch("/api/v1/apps/check-existing",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({appId:s.id})})).json();if(G.success&&G.exists){const V=G.container;confirm(`Found existing ${s.name} container:
Container: ${V.name}
Status: ${V.status}
Port: ${V.primaryPort||"N/A"}
Would you like to use this existing container?
Click OK to configure DNS/Caddy for the existing container.
Click Cancel to deploy a new container.`)&&(s._useExisting=!0,s._existingContainer=V)}}catch{}l.textContent=`Deploy ${s.name}`;const i=s.subdomain||s.id.replace(/-/g,"");g.value=i;const n=document.getElementById("subpath-compat-warning");if(n)if(SITE.routingMode==="subdirectory"){const W=s.subpathSupport||"strip";W==="none"?(n.style.display="block",n.innerHTML='⚠ '+s.name+" does not support subdirectory mode. It may not work correctly at a subpath."):W==="strip"?(n.style.display="block",n.innerHTML='ⓘ '+s.name+" has unverified subdirectory support. It may require additional configuration."):n.style.display="none"}else n.style.display="none";const r=SITE.defaults.dnsType||(SITE.configurationType==="public"?"public":"private"),d=SITE.defaults.sslType||(SITE.configurationType==="public"?"letsencrypt":"internal"),h=document.querySelector(`input[name="dns-type"][value="${r}"]`),T=document.querySelector(`input[name="ssl-type"][value="${d}"]`);h?h.checked=!0:document.querySelector('input[name="dns-type"][value="private"]').checked=!0,T?T.checked=!0:document.querySelector('input[name="ssl-type"][value="internal"]').checked=!0,t.value=SITE.defaults.targetIP||"localhost",a.checked=!1;const U=document.querySelector("#app-deploy-modal .flex-col-gap")?.closest("div"),q=document.querySelector("#app-deploy-modal details"),F=q?.querySelector("div");if(q&&F&&(SITE.configurationType==="public"||SITE.configurationType==="homelab")){const W=document.querySelectorAll('#app-deploy-modal input[name="dns-type"]')[0]?.closest("div.flex-col-gap")?.parentElement,G=document.querySelectorAll('#app-deploy-modal input[name="ssl-type"]')[0]?.closest("div.flex-col-gap")?.parentElement;W&&!W.dataset.moved&&(F.appendChild(W),W.dataset.moved="1"),G&&!G.dataset.moved&&(F.appendChild(G),G.dataset.moved="1")}const _=document.getElementById("media-path-section"),J=document.getElementById("deploy-media-path"),X=document.getElementById("media-path-description");if(s.mediaMount){_.style.display="block",J.value="",J.placeholder="/media/Movies, /media/TVShows or click Browse";const W=document.getElementById("detected-mounts-container"),G=document.getElementById("detected-mounts-list");try{const K=await(await fetch("/api/v1/media/detected-mounts")).json();if(K.success&&K.mounts.length>0){W.style.display="block",G.innerHTML="";const te=[...new Set(K.mounts.map(ee=>ee.hostPath))];J.value=te.join(", "),K.mounts.forEach(ee=>{const Z=document.createElement("button");Z.type="button";const de=te.includes(ee.hostPath);Z.style.cssText=`padding: 8px 14px; font-size: 0.85rem; background: color-mix(in srgb, var(--success) ${de?"40%":"15%"}, var(--card-bg)); border: 1px solid var(--success); border-radius: 6px; cursor: pointer; color: var(--fg);`,Z.innerHTML=`${escapeHtml(ee.folderName)} from ${escapeHtml(ee.sourceImage)}`,Z.title=`${ee.hostPath} (from ${ee.sourceContainer})`,Z.onclick=()=>{const le=J.value.split(",").map(ce=>ce.trim()).filter(ce=>ce),pe=le.indexOf(ee.hostPath);pe>=0?(le.splice(pe,1),Z.style.background="color-mix(in srgb, var(--success) 15%, var(--card-bg))"):(le.push(ee.hostPath),Z.style.background="color-mix(in srgb, var(--success) 40%, var(--card-bg))"),J.value=le.join(", ")},G.appendChild(Z)})}else W.style.display="none"}catch{W.style.display="none"}document.getElementById("browse-media-btn").onclick=()=>{openFolderBrowser(J)}}else _.style.display="none",J.value="",document.getElementById("detected-mounts-container").style.display="none";const Q=document.getElementById("plex-claim-section");Q&&(s.id==="plex"||s.claimToken?(Q.style.display="block",document.getElementById("deploy-plex-claim").value=""):Q.style.display="none");const ne=document.getElementById("volume-mounts-section"),oe=document.getElementById("volume-mounts-list");if(oe.innerHTML="",s.docker?.volumes?.length){const W=s.mediaMount?.containerPath,G=s.docker.volumes.filter(V=>!V.includes("{{MEDIA_PATH}}")&&!(W&&V.endsWith(":"+W)));G.length>0?(ne.style.display="block",G.forEach((V,K)=>{const[te,ee]=V.split(":"),Z=document.createElement("div");Z.style.cssText="display: flex; gap: 6px; align-items: center;",Z.innerHTML=`
\u2192 ${ee}
`,oe.appendChild(Z),Z.querySelector(".vol-browse-btn").onclick=()=>{const de=Z.querySelector(".vol-host-path");openFolderBrowser(de)}})):ne.style.display="none"}else ne.style.display="none";const se=s.defaultPort||8080;e.value="",e.placeholder=`Default: ${se}`;let Y=document.getElementById("deploy-port-status");Y||(Y=document.createElement("div"),Y.id="deploy-port-status",Y.style.cssText="font-size: 0.8rem; margin-top: 4px;",e.parentNode.appendChild(Y));async function ie(){const W=e.value||se;Y.innerHTML='Checking port...';const G=await A(W);if(G.available)Y.innerHTML=`Port ${escapeHtml(String(W))} is available`;else{const V=await x(se);Y.innerHTML=`
Port ${escapeHtml(W)} in use by ${escapeHtml(G.conflict?.usedBy||"unknown")}
`;const K=document.createElement("button");K.type="button",K.textContent=`Use ${V}`,K.style.cssText="margin-left: 8px; padding: 2px 8px; font-size: 0.75rem; cursor: pointer;",K.onclick=()=>{document.getElementById("deploy-port").value=V,Y.innerHTML=`Using suggested port ${escapeHtml(String(V))}`},Y.appendChild(K)}}let re;e.oninput=function(){clearTimeout(re),re=setTimeout(ie,500)},ie();try{const G=await(await fetch("/api/v1/tailscale/status")).json();G.success&&G.installed&&G.connected?o.innerHTML=`
Connected${G.self?.hostname} (${G.self?.ip})| ${G.deviceCount} devices
`:G.installed?o.innerHTML='Not connected':(o.innerHTML='Not available',a.disabled=!0)}catch{o.innerHTML='Could not check status'}function ae(){const W=g.value||"subdomain",G=document.querySelector('input[name="dns-type"]:checked').value,V=document.querySelector('input[name="ssl-type"]:checked').value;let K="";if(SITE.routingMode==="subdirectory"&&SITE.domain)K=`https://${SITE.domain}/${W}`;else if(G==="private")K=`${V==="none"?"http":"https"}://${buildDomain(W)}`;else if(G==="public"){const te=V==="none"?"http":"https",ee=SITE.domain||W;K=SITE.domain?`${te}://${W}.${SITE.domain}`:`${te}://${W}`}else{const te=e.value||s.defaultPort||DC.DEFAULTS.SERVICE_PORT;K=`http://${t.value}:${te}`}c.textContent=K}g.oninput=ae,t.oninput=ae,e.oninput=ae,document.querySelectorAll('input[name="dns-type"]').forEach(W=>{W.onchange=ae}),document.querySelectorAll('input[name="ssl-type"]').forEach(W=>{W.onchange=ae}),ae(),z.classList.remove("show"),p.classList.add("show"),p.dataset.appTemplate=JSON.stringify(s)}async function L(s){const p=s.appTemplate,l=safeGetJSON(C,[]),g=p._useExisting&&p._existingContainer,c=l.find(t=>t.id===s.subdomain);if(!(c&&!g&&!confirm(`An app with subdomain "${s.subdomain}" already exists. Redeploy?`))){if(c){const t=l.indexOf(c);l.splice(t,1),safeSet(C,JSON.stringify(l))}if(g)s.port=p._existingContainer.primaryPort;else{const t=s.port||p.defaultPort||8080;showNotification(`Checking port ${t} availability...`,"info",0);const e=await A(t);if(!e.available){const a=await x(p.defaultPort||8080);if(confirm(`Port ${t} is already in use by ${e.conflict?.usedBy||"another container"}.
Would you like to use port ${a} instead?`))s.port=a;else{showNotification("Deployment cancelled - port conflict","error",5e3);return}}}showNotification(g?`Configuring ${p.name} with existing container...`:`Deploying ${p.name}...`,"info",0);try{const t={appId:p.id,config:{subdomain:s.subdomain,ip:s.ip,createDns:s.dnsType==="private",port:s.port||p.defaultPort||null,sslType:s.sslType,dnsType:s.dnsType,tailscaleOnly:s.tailscaleOnly||!1,mediaPath:s.mediaPath||null,plexClaimToken:s.plexClaimToken||null,customVolumes:s.customVolumes||null}};g&&(t.config.useExisting=!0,t.config.existingContainerId=p._existingContainer.id,t.config.existingPort=p._existingContainer.primaryPort,!s.port&&p._existingContainer.primaryPort&&(t.config.port=p._existingContainer.primaryPort));const a=await(await secureFetch("/api/v1/apps/deploy",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)})).json();if(a.success){const o={id:s.subdomain,name:p.name,logo:`/assets/${p.id}.png`,containerId:a.containerId,url:a.url,ip:s.ip,appTemplate:p.id,tailscaleOnly:s.tailscaleOnly||!1};l.push(o),safeSet(C,JSON.stringify(l)),window.APPS&&!window.APPS.some(n=>n.id===p.id)&&(window.APPS.push(o),typeof window.buildGrid=="function"&&window.buildGrid(),typeof window.refreshAll=="function"&&setTimeout(()=>window.refreshAll(),500));let i=a.usedExisting?`${p.name} configured with existing container!
URL: ${a.url}`:`${p.name} deployed successfully!
URL: ${a.url}`;a.warning&&(i+=`
\u26A0 Warning: ${a.warning}`),showNotification(i,"success",8e3),delete p._useExisting,delete p._existingContainer,a.url&&a.url.startsWith("https://")&&$(a.url,p.name),a.setupInstructions&&a.setupInstructions.length>0&&setTimeout(()=>{const n=a.setupInstructions.join(`
`);showNotification(`Setup Instructions for ${p.name}: ${n}`,"info",1e4)},1e3)}else throw new Error(a.error||"Deployment failed")}catch(t){b.logError("[AppSelector] Deployment",t,{function:"deploy"}),showNotification(`Failed to deploy ${p.name}: ${t.message}`,"error",8e3)}}}async function $(s,p){showNotification(`\u23F3 Generating SSL certificate for ${p}...`,"warning",6e4);let l=0;const g=12,c=async()=>{l++;try{const t=await fetch(s,{method:"HEAD",mode:"no-cors"});return showNotification(`\u2705 ${p} is ready! SSL certificate generated.`,"success",5e3),!0}catch{return l{window.APPS.some(l=>l.id===p.id)||window.APPS.push(p)})}document.getElementById("add-service-btn")?.addEventListener("click",()=>{B(),z.classList.add("show")}),wireModal(z,document.getElementById("app-selector-cancel"));const v=document.getElementById("app-deploy-modal");document.getElementById("app-deploy-cancel")?.addEventListener("click",()=>{v.classList.remove("show")}),document.getElementById("app-deploy-confirm")?.addEventListener("click",()=>{const s=JSON.parse(v.dataset.appTemplate),p=document.getElementById("deploy-media-path").value.trim(),l=[];document.querySelectorAll("#volume-mounts-list .vol-host-path").forEach(c=>{l.push({hostPath:c.value.trim(),containerPath:c.dataset.containerPath})});const g={appTemplate:s,subdomain:document.getElementById("deploy-subdomain").value.trim(),dnsType:document.querySelector('input[name="dns-type"]:checked').value,sslType:document.querySelector('input[name="ssl-type"]:checked').value,ip:document.getElementById("deploy-ip").value.trim(),port:document.getElementById("deploy-port").value.trim(),tailscaleOnly:document.getElementById("deploy-tailscale-only").checked,mediaPath:p||null,plexClaimToken:document.getElementById("deploy-plex-claim")?.value.trim()||null,customVolumes:l.length>0?l:null,resources:{cpus:parseFloat(document.getElementById("deploy-cpu-limit").value)||0,memory:parseFloat(document.getElementById("deploy-memory-limit").value)||0}};if(!g.subdomain){showNotification("Please enter a subdomain or domain name","warning");return}if(s.mediaMount?.required&&!p){showNotification("Please enter a media library path for this application","warning");return}v.classList.remove("show"),L(g)}),wireModal(v);const D=document.getElementById("folder-browser-modal"),I=document.getElementById("folder-browser-path"),R=document.getElementById("folder-browser-list"),N=document.getElementById("folder-browser-selected"),O=document.getElementById("folder-browser-selected-list");let m="",y=[],S=null;window.openFolderBrowser=function(s){S=s,y=s.value.split(",").map(p=>p.trim()).filter(p=>p),m="",E(),f(""),D.classList.add("show")};async function f(s){I.textContent=s||"Select a drive...",R.innerHTML='
`,M.style.display="none",L.textContent="";return}if(!E&&s!==D)return;const c=Array.isArray(g.logs)?g.logs:[];if(c.length===0&&!E){const e=g.filters&&(g.filters.level||g.filters.context||g.filters.search||g.filters.since||g.filters.until)?"No error log entries match your filters.":"\u2705 No errors logged! Everything is working smoothly.";w.innerHTML=`
");for(const e of c){const a=(e.level||"?").toUpperCase(),o=a==="ERR"?"var(--bad-fg)":a==="WARN"?"var(--warn-fg, #f0c674)":"var(--muted)",i=e.timestamp?new Date(e.timestamp).toLocaleString():"\u2014",n=e.context||"\u2014",r=(e.error||"").split(`
`)[0],d=e.request&&e.request.ip||"";t+='
'})}})(),(function(){"use strict";const b=[{unit:"caddy",label:"Caddy (reverse proxy)"},{unit:"dashcaddy-api",label:"DashCaddy API (host systemd unit, not this container)"},{unit:"docker",label:"Docker daemon"},{unit:"ssh",label:"SSH server"},{unit:"systemd-journald",label:"systemd-journald"},{unit:"tailscaled",label:"Tailscale"},{unit:"networkd-dispatcher",label:"Networkd dispatcher"}];injectModal("journald-modal",`
\u{1F6F0}\uFE0F Host Logs (journald)
Stream host service logs from journalctl (read-only mount). Docker container logs are still in the Container Logs modal.
`}).join("");w.innerHTML=e,w.scrollHeight-w.scrollTop-w.clientHeight<80&&(w.scrollTop=w.scrollHeight)}M.textContent=`${I.length} entries`,L.textContent=c?`${t.length} of ${I.length} shown`:`${I.length} shown`}async function E(){if(!D)return;p();const c=j.value;if(!c)return;const t=Math.max(1,Math.min(5e3,Number(z.value)||200)),e=(k.value||"").trim();w.innerHTML='
Create and manage Docker container checkpoints for instant state recovery.
Image:
Status:
Created:
Container ID:
\u{1F4BE}Select a container to view its snapshots
`);const b=document.getElementById("snapshot-modal"),C=document.getElementById("snapshot-btn"),j=document.getElementById("snapshot-close"),k=document.getElementById("snapshot-container-select"),z=document.getElementById("snapshot-details"),P=document.getElementById("snapshot-create-btn"),H=document.getElementById("snapshot-create-status");let A=null;async function x(){try{const u=await(await fetch("/api/v1/containers")).json();if(!u.success||!u.containers)return;k.innerHTML='';for(const v of u.containers){const D=document.createElement("option");D.value=v.id,D.textContent=`${v.name||v.id} (${v.image||"unknown"})`,D.dataset.name=v.name,D.dataset.image=v.image,D.dataset.status=v.status,D.dataset.created=v.created,k.appendChild(D)}}catch($){console.error("Failed to load containers:",$)}}function B($){if(!$||!$.value){z.style.display="none",A=null;return}A=$.value,document.getElementById("snapshot-image").textContent=$.dataset.image||"-",document.getElementById("snapshot-status").textContent=$.dataset.status||"-",document.getElementById("snapshot-created").textContent=$.dataset.created?new Date($.dataset.created*1e3).toLocaleString():"-",document.getElementById("snapshot-id").textContent=$.value.substring(0,12),z.style.display=""}async function w(){if(!A){H.textContent="Please select a container first",H.style.color="var(--bad-fg)";return}const $=document.getElementById("snapshot-name").value.trim();if(!$){H.textContent="Please enter a snapshot name",H.style.color="var(--bad-fg)";return}const u=document.getElementById("snapshot-leave-running").checked;P.disabled=!0,P.textContent="Creating...",H.textContent="";try{const D=await(await fetch(`/api/v1/containers/${encodeURIComponent(A)}/checkpoint`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:$,leaveRunning:u})})).json();D.success?(H.textContent=`\u2713 Snapshot "${$}" created successfully`,H.style.color="var(--ok-fg)",document.getElementById("snapshot-name").value=""):(H.textContent=`\u2717 Failed: ${D.error||"Unknown error"}`,H.style.color="var(--bad-fg)")}catch(v){H.textContent=`\u2717 Error: ${v.message}`,H.style.color="var(--bad-fg)"}finally{P.disabled=!1,P.textContent="\u{1F4BE} Create Snapshot"}}function M(){b.classList.add("show"),x()}function L(){b.classList.remove("show"),z.style.display="none",A=null,k.selectedIndex=0}C?.addEventListener("click",M),j?.addEventListener("click",L),wireModal(b,j),k?.addEventListener("change",$=>{const u=k.options[k.selectedIndex];B(u)}),P?.addEventListener("click",w),b?.querySelectorAll(".panel-tab").forEach($=>{$.addEventListener("click",()=>{b.querySelectorAll(".panel-tab").forEach(u=>u.classList.remove("active")),b.querySelectorAll(".panel-section").forEach(u=>u.classList.remove("active")),$.classList.add("active"),b.querySelector(`#${$.dataset.panel}`).classList.add("active")})})})(),(function(){injectModal("arr-setup-modal",`
\u{1F3AC} Smart Arr Connect
Auto-discover and connect your entire media stack.
`,x.style.display="block"}}function O(f){let E="";const s=f.services,p=["radarr","sonarr","prowlarr"];for(const c of p){const t=s[c];if(!t||t.status==="not_found"&&!t.url)continue;const e=v[c],a=D[c],o=t.status==="connected";E+=`
`}B.innerHTML=E}window.smartTestConnection=async function(f){const E=document.getElementById(`smart-${f}-url`),s=document.getElementById(`smart-${f}-key`),p=document.getElementById(`smart-${f}-status`),l=E?.value.trim(),g=s?.value.trim();if(!l||!g){p.innerHTML='Enter URL and API key';return}p.innerHTML='';try{const t=await(await secureFetch("/api/v1/arr/test-connection",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({service:f,url:l,apiKey:g})})).json();t.success?p.innerHTML=`✓ ${escapeHtml(t.appName||"Connected")} v${escapeHtml(t.version||"")}`:p.innerHTML=`✗ ${escapeHtml(t.error)}`}catch(c){p.innerHTML=`✗ ${escapeHtml(c.message)}`}};async function m(){I("progress"),w.innerHTML='
Connecting services...
';const f={};for(const s of["radarr","sonarr","prowlarr"]){const p=document.getElementById(`smart-${s}-url`)?.value.trim(),l=document.getElementById(`smart-${s}-key`)?.value.trim();l&&p?f[s]={apiKey:l,url:p}:l&&(f[s]={apiKey:l})}const E={services:Object.keys(f).length>0?f:void 0,configurePlex:document.getElementById("smart-opt-plex")?.checked,configureProwlarr:document.getElementById("smart-opt-prowlarr")?.checked,configureSeerr:document.getElementById("smart-opt-seerr")?.checked,saveCredentials:document.getElementById("smart-opt-save")?.checked};try{const p=await(await secureFetch("/api/v1/arr/smart-connect",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(E)})).json();let l="";for(const g of p.steps||[]){const c=g.status==="success"?'✓':'✗',t=g.status==="success"?"var(--muted)":"var(--bad-fg)";l+=`
"}}}async function y(e,a){try{var o=await secureFetch("/api/v1/backups/schedule",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({appId:e,...a})}),i=await o.json();i.success?showNotification("Schedule updated for "+e,"success"):(showNotification("Update failed: "+(i.error||"Unknown"),"error"),m())}catch(n){showNotification("Error: "+n.message,"error")}}async function S(e){try{var a=await secureFetch("/api/v1/backups/backup/"+encodeURIComponent(e),{method:"POST",headers:{"Content-Type":"application/json"}}),o=await a.json();o.success?showNotification("Backup started for "+e+"!","success"):showNotification("Backup failed: "+(o.error||"Unknown"),"error")}catch(i){showNotification("Error: "+i.message,"error")}}async function f(e){if(confirm("Remove backup schedule for "+e+"?"))try{var a=await secureFetch("/api/v1/backups/schedule/"+encodeURIComponent(e),{method:"DELETE"}),o=await a.json();o.success?(showNotification("Schedule removed for "+e,"success"),m()):showNotification("Delete failed: "+(o.error||"Unknown"),"error")}catch(i){showNotification("Error: "+i.message,"error")}}async function E(){var e=document.getElementById("new-schedule-appid")?.value?.trim(),a=document.getElementById("new-schedule-interval")?.value||"daily",o=parseInt(document.getElementById("new-schedule-retention")?.value)||7;if(!e){showNotification("Please enter an App ID","warning");return}try{var i=await secureFetch("/api/v1/backups/schedule",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({appId:e,schedule:a,retention:{keep:o},enabled:!0})}),n=await i.json();if(n.success){showNotification("Schedule created for "+e,"success"),m();var r=document.getElementById("new-schedule-appid");r&&(r.value="")}else showNotification("Failed: "+(n.error||"Unknown"),"error")}catch(d){showNotification("Error: "+d.message,"error")}}async function s(){if(R){R.innerHTML='
Loading...
';try{var e=await fetch("/api/v1/backups/files"),a=await e.json();if(!a.success)throw new Error(a.error||"Failed to load");var o=a.files||[];if(o.length===0){R.innerHTML='
"}}}window.__restoreServerBackup=async function(e){if(confirm("Restore from this server backup? This will overwrite current configuration."))try{var a=await secureFetch("/api/v1/backups/restore/"+e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({restoreServices:!0,restoreConfig:!0})}),o=await a.json();o.success?(showNotification("Restore completed successfully!","success"),location.reload()):showNotification("Restore failed: "+(o.error||"Unknown error"),"error")}catch(i){showNotification("Restore error: "+i.message,"error")}},document.querySelector('[data-panel="backup-schedules-tab"]')?.addEventListener("click",m),document.querySelector('[data-panel="backup-disk-tab"]')?.addEventListener("click",s),document.querySelector('[data-panel="backup-pointintime-tab"]')?.addEventListener("click",l),document.querySelector('[data-panel="backup-history-tab"]')?.addEventListener("click",p);async function l(){if(N){try{var e=await fetch("/api/v1/license/status"),a=await e.json();if(a.tier!=="premium"){N.innerHTML=`
\u2B50
Premium Feature
Point-in-time restore requires DashCaddy Premium with auto-backup enabled.
Configuration differs \u2014 restoring will replace current settings
':r+='
No changes
',r+="
"}r+='
',document.body.insertAdjacentHTML("beforeend",r),document.getElementById("compare-close-btn")?.addEventListener("click",function(){document.getElementById("compare-overlay")?.remove()}),document.getElementById("compare-overlay")?.addEventListener("click",function(T){T.target===this&&this.remove()})}catch(T){showNotification("Compare error: "+T.message,"error")}}async function t(e,a){if(confirm("Restore "+a+" for "+e+`?
This will replace current configuration, credentials, and data. Containers will be restarted.`))try{var o=await secureFetch("/api/v1/apps/"+encodeURIComponent(e)+"/revert/"+encodeURIComponent(a),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({restartContainers:!0})}),i=await o.json();i.success?(showNotification(e+" restored to "+a,"success"),setTimeout(function(){location.reload()},1500)):showNotification("Restore failed: "+(i.error||"Unknown"),"error")}catch(n){showNotification("Restore error: "+n.message,"error")}}})(),(function(){injectModal("stats-modal",`
\u{1F4CA} Resource Monitor
Real-time and historical CPU, memory, network, and disk usage for containers.
Loading container stats...
\u{1F4C8}
Loading 24-hour aggregated metrics...
\u{1F4CA}
Choose a container and time range to view history.
\u{1F514}
Loading alert configurations...
`);const b=document.getElementById("stats-modal"),C=document.getElementById("container-stats-btn"),j=document.getElementById("stats-cancel"),k=document.getElementById("stats-refresh-btn"),z=document.getElementById("stats-auto-refresh"),P=document.getElementById("stats-container"),H=document.getElementById("stats-aggregated-container"),A=document.getElementById("stats-alerts-container"),x=document.getElementById("stats-last-update");let B=null,w=null;function M(l){if(l===0||!l)return"0 B";const g=1024,c=["B","KB","MB","GB"],t=Math.floor(Math.log(l)/Math.log(g));return parseFloat((l/Math.pow(g,t)).toFixed(1))+" "+c[t]}function L(l){return l<30?"#2ecc71":l<70?"#f39c12":"#e74c3c"}function $(l){return l<50?"#2ecc71":l<80?"#f39c12":"#e74c3c"}async function u(){try{let l=null,g=!1;try{const e=await(await fetch("/api/v1/monitoring/stats")).json();e.success&&e.stats&&(l=e.stats,g=!0,w=e.stats)}catch{}if(!g){const e=await(await fetch("/api/v1/stats/containers")).json();if(e.success&&e.stats){l={};for(const a of e.stats)l[a.name]={name:a.name,current:{cpu:a.cpu,memory:{percent:a.memory.percent,usage:a.memory.used,limit:a.memory.limit,usageMB:Math.round(a.memory.used/1048576),limitMB:Math.round(a.memory.limit/1048576)},network:{rxBytes:a.network.rx,txBytes:a.network.tx,rxMB:(a.network.rx/1048576).toFixed(1),txMB:(a.network.tx/1048576).toFixed(1)},disk:{readMB:0,writeMB:0}},status:a.status};w=l}}if(!l||Object.keys(l).length===0){P.innerHTML='
';try{const e=await(await fetch(`/api/v1/monitoring/history/${encodeURIComponent(l)}?startTime=${c}&endTime=${g}`)).json();if(!e.success)throw new Error(e.error||"Failed to load history");const a=e.samples||[],o=e.tier||"raw";if(a.length===0){O.innerHTML=`
\u{1F4CA}No data for the last ${y}. Tier: ${f(o)}.
Service uptime tracking, SLA monitoring, and incident management.
Loading health status...
\u{1F6A8} Loading incidents...
\u2699\uFE0F Loading configuration...
\u{1F30D} Global Settings
Applies to all health checks. Settings are stored locally in this browser.
How often each service's health endpoint is checked.
How often container statistics (CPU/memory) are sampled.
Cap on stored history records per service.
Health history older than this is pruned.
Warn when disk usage exceeds this level.
Add Health Check
`);const b=document.getElementById("health-modal"),C=document.getElementById("health-check-btn"),j=document.getElementById("health-cancel"),k=document.getElementById("health-refresh-btn"),z=document.getElementById("health-status-container"),P=document.getElementById("health-incidents-container"),H=document.getElementById("health-config-container"),A=document.getElementById("health-last-update"),x=document.getElementById("health-add-btn"),B=document.getElementById("health-config-form"),w=document.getElementById("health-form-title"),M=document.getElementById("health-form-cancel"),L=document.getElementById("health-form-save"),$="dashcaddy-health-settings",u={retentionDays:30,pollingInterval:60,statsPollingInterval:30,maxEntriesPerService:500,diskUsageThreshold:80},v=document.getElementById("health-global-save"),D=document.getElementById("health-global-reset"),I=document.getElementById("health-global-status"),R=document.getElementById("health-setting-retention"),N=document.getElementById("health-setting-interval"),O=document.getElementById("health-setting-stats-interval"),m=document.getElementById("health-setting-max-entries"),y=document.getElementById("health-setting-disk-threshold");function S(){try{const i=safeGet($),n=i?JSON.parse(i):{};return Object.assign({},u,n)}catch{return Object.assign({},u)}}function f(){const i=S();R&&(R.value=i.retentionDays),N&&(N.value=i.pollingInterval),O&&(O.value=i.statsPollingInterval),m&&(m.value=i.maxEntriesPerService),y&&(y.value=i.diskUsageThreshold)}function E(){const i={retentionDays:Math.max(1,Math.min(3650,parseInt(R?.value)||u.retentionDays)),pollingInterval:Math.max(5,Math.min(3600,parseInt(N?.value)||u.pollingInterval)),statsPollingInterval:Math.max(5,Math.min(3600,parseInt(O?.value)||u.statsPollingInterval)),maxEntriesPerService:Math.max(10,Math.min(1e5,parseInt(m?.value)||u.maxEntriesPerService)),diskUsageThreshold:Math.max(50,Math.min(99,parseInt(y?.value)||u.diskUsageThreshold))};try{safeSet($,JSON.stringify(i)),f(),I&&(I.textContent="Saved \u2713",I.style.color="var(--ok-fg)",setTimeout(()=>{I&&(I.textContent="")},2500)),typeof showNotification=="function"&&showNotification("Global health settings saved","success")}catch(n){I&&(I.textContent="Save failed",I.style.color="var(--bad-fg)"),typeof showNotification=="function"&&showNotification("Failed to save settings: "+n.message,"error")}}function s(){try{safeSet($,JSON.stringify(u))}catch{}f(),I&&(I.textContent="Reset to defaults \u2713",I.style.color="var(--ok-fg)",setTimeout(()=>{I&&(I.textContent="")},2500))}f(),v?.addEventListener("click",E),D?.addEventListener("click",s);let p=null;function l(i){return i>=99.9?"var(--ok-fg)":i>=95?"#f39c12":"var(--bad-fg)"}function g(i){const n={critical:"var(--bad-fg)",high:"#ff6b6b",medium:"#f39c12",low:"var(--muted)"};return`${i}`}async function c(){try{const n=await(await fetch("/api/v1/health-checks/status")).json();if(!n.success||!n.status||Object.keys(n.status).length===0){z.innerHTML='
\u{1F3E5}No health checks configured. Go to the Configure tab to add services.
';return}const r=Object.values(n.status);let d='
';d+='
',d+='
Service
Status
',d+='
Uptime 24h
Uptime 7d
',d+='
Avg Response
Last Check
';for(const h of r){const T=h.status==="up",U=T?"var(--dot-ok)":"var(--dot-bad)",q=h.uptime?.["24h"]??"-",F=h.uptime?.["7d"]??"-",_=h.avgResponseTime!=null?Math.round(h.avgResponseTime)+"ms":"-",J=h.timestamp?timeAgo(h.timestamp):"-";d+=`
';for(const q of U){const F=q.status==="resolved",_=F&&q.duration?q.duration<6e4?Math.round(q.duration/1e3)+"s":Math.round(q.duration/6e4)+"m":"-";h+='
',h+=`
${escapeHtml(q.serviceId)}
`,h+=`
${escapeHtml(q.type)}
`,h+=`
${g(q.severity)}
`,h+=`
${q.status}
`,h+=`
${_}
`,h+=`
${timeAgo(q.createdAt)}
`,h+="
"}h+="
"}P.innerHTML=h||'
\u{1F6A8}No incidents recorded yet.
'}catch(i){P.innerHTML=`
Failed: ${escapeHtml(i.message)}
`}}async function e(){try{const n=await(await fetch("/api/v1/health-checks/status")).json(),r=n.success&&n.status?Object.values(n.status):[];if(r.length===0){H.innerHTML='
\u2699\uFE0FNo health checks configured yet. Click "Add Health Check" below.
';return}let d='
';d+='
Service
Status
SLA Target
Actions
';for(const h of r){const T=h.status==="up";d+='
',d+=`
${escapeHtml(h.name||h.serviceId)}
`,d+=`
${T?"Up":"Down"}
`,d+=`
${h.sla?.target?h.sla.target+"%":"-"}
`,d+='
',d+=``,d+=``,d+="
"}d+="
",H.innerHTML=d}catch(i){H.innerHTML=`
Failed: ${escapeHtml(i.message)}
`}}function a(i,n,r,d,h,T,U){p=i||null,w.textContent=i?"Edit Health Check":"Add Health Check",document.getElementById("health-form-id").value=i||"",document.getElementById("health-form-id").disabled=!!i,document.getElementById("health-form-name").value=n||"",document.getElementById("health-form-url").value=r||"",document.getElementById("health-form-timeout").value=d||1e4,document.getElementById("health-form-codes").value=h||"200",document.getElementById("health-form-sla").value=T||99.9,document.getElementById("health-form-slow").value=U||5e3,B.style.display="",x.style.display="none"}function o(){B.style.display="none",x.style.display="",p=null}x?.addEventListener("click",()=>a("","","",1e4,"200",99.9,5e3)),M?.addEventListener("click",o),L?.addEventListener("click",async()=>{const i=p||document.getElementById("health-form-id").value.trim();if(!i)return showNotification("Service ID is required","warning");const n=document.getElementById("health-form-url").value.trim();if(!n)return showNotification("URL is required","warning");const r=document.getElementById("health-form-codes").value.split(",").map(h=>parseInt(h.trim())).filter(Boolean),d={name:document.getElementById("health-form-name").value.trim()||i,url:n,timeout:parseInt(document.getElementById("health-form-timeout").value)||1e4,expectedStatusCodes:r.length?r:[200],sla:{target:parseFloat(document.getElementById("health-form-sla").value)||99.9},slowResponseThreshold:parseInt(document.getElementById("health-form-slow").value)||5e3};try{L.textContent="Saving...",L.disabled=!0;const T=await(await secureFetch(`/api/v1/health-checks/${encodeURIComponent(i)}/configure`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(d)})).json();if(!T.success)throw new Error(T.error||"Save failed");o(),e(),c()}catch(h){showNotification("Error: "+h.message,"error")}finally{L.textContent="Save",L.disabled=!1}}),document.addEventListener("health-edit",async i=>{const n=i.detail;a(n,"","",1e4,"200",99.9,5e3)}),document.addEventListener("health-delete",async i=>{const n=i.detail;if(confirm(`Delete health check for "${n}"?`))try{const d=await(await secureFetch(`/api/v1/health-checks/${encodeURIComponent(n)}/configure`,{method:"DELETE"})).json();if(!d.success)throw new Error(d.error);e(),c()}catch(r){showNotification("Error: "+r.message,"error")}}),C?.addEventListener("click",()=>{b?.classList.add("show"),c()}),wireModal(b,j),k?.addEventListener("click",c),document.querySelector('[data-panel="health-incidents"]')?.addEventListener("click",t),document.querySelector('[data-panel="health-config"]')?.addEventListener("click",e)})(),(function(){injectModal("updates-modal",`
\u2B06\uFE0F Update Management
Check for container image updates, apply them, and manage rollbacks.
\u{1F4E6} Click "Check for Updates" to scan containers.
Loading update history...
\u{1F916} Loading auto-update configuration...
DashCaddy
Loading...
Update available
New version:
\u{1F4E6}No self-update history.
`);const b=document.getElementById("updates-modal"),C=document.getElementById("updates-btn"),j=document.getElementById("updates-cancel"),k=document.getElementById("updates-check-btn"),z=document.getElementById("updates-available-container"),P=document.getElementById("updates-history-container"),H=document.getElementById("updates-auto-container"),A=document.getElementById("updates-last-check");async function x(){try{const t=await(await fetch("/api/v1/updates/available")).json();if(!t.success)throw new Error(t.error);const e=t.updates||[];if(e.length===0){z.innerHTML='
';for(const n of e){const r=(()=>{const d=window.APPS||[];for(const h of d)if(h.containerId===n.containerId||h.name===n.containerName||h.id===n.containerName)return h.id;return n.containerName})();a+=`
`,a+=`
${escapeHtml(n.containerName)}
`,a+=`
${escapeHtml(n.imageName)}
`,a+=`
${escapeHtml(n.currentDigest)}
`,a+=`
${escapeHtml(n.latestDigest)}
`,a+='
',a+=``,a+=``,a+="
"}a+="
",z.innerHTML=a,A.textContent=e.length+" update(s) available";const o=document.getElementById("updates-count-badge"),i=document.getElementById("updates-update-all-btn");o&&(o.textContent=e.length+" pending",o.style.display=""),i&&e.length>0&&(i.style.display=""),window._pendingUpdates=e,z.querySelectorAll(".update-now-btn").forEach(n=>{n.addEventListener("click",async()=>{const r=n.dataset.id,d=n.dataset.name;if(confirm(`Update "${d}" to the latest version? The container will restart.`)){n.textContent="Updating...",n.disabled=!0;try{const T=await(await secureFetch(`/api/v1/updates/update/${encodeURIComponent(r)}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({autoRollback:!0})})).json();if(T.success)n.textContent="Done!",n.style.background="var(--ok-fg)",setTimeout(()=>x(),2e3);else throw new Error(T.error||"Update failed")}catch(h){n.textContent="Failed",n.style.color="var(--bad-fg)",showNotification("Update error: "+h.message,"error"),setTimeout(()=>{n.textContent="Update",n.disabled=!1,n.style.color="",n.style.background=""},3e3)}}})}),z.querySelectorAll(".rollback-btn").forEach(n=>{n.addEventListener("click",async()=>{const r=n.dataset.id,d=n.dataset.name;if(confirm(`Rollback "${d}" to its previous version?`)){n.textContent="Rolling back...",n.disabled=!0;try{const T=await(await secureFetch(`/api/v1/updates/rollback/${encodeURIComponent(r)}`,{method:"POST"})).json();if(T.success)n.textContent="Rolled back!",setTimeout(()=>x(),2e3);else throw new Error(T.error||"Rollback failed")}catch(h){n.textContent="Failed",showNotification("Rollback error: "+h.message,"error"),setTimeout(()=>{n.textContent="Rollback",n.disabled=!1},3e3)}}})})}catch(c){z.innerHTML=`
Failed: ${escapeHtml(c.message)}
`}}async function B(){const c=window._pendingUpdates||[];if(!c.length)return;const t=document.getElementById("updates-update-all-btn");if(!confirm(`Update all ${c.length} containers? Each will restart.`))return;t.textContent="\u23F3 Updating...",t.disabled=!0;let e=0,a=0;for(const o of c)try{(await(await secureFetch(`/api/v1/updates/update/${encodeURIComponent(o.containerId)}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({autoRollback:!0})})).json()).success?e++:a++}catch{a++}t.textContent="\u2705 Done",showNotification(`Update all: ${e} succeeded, ${a} failed.`,e>0&&a===0?"success":"error"),setTimeout(()=>{t.textContent="\u2B06\uFE0F Update All",t.disabled=!1,x()},3e3)}document.getElementById("updates-update-all-btn")?.addEventListener("click",B);async function w(){k.textContent="\u{1F50D} Checking...",k.disabled=!0;try{const t=await(await secureFetch("/api/v1/updates/check",{method:"POST"})).json();if(!t.success)throw new Error(t.error);k.textContent="\u2705 Done!",await x()}catch(c){k.textContent="\u274C Failed",showNotification("Check error: "+c.message,"error")}setTimeout(()=>{k.textContent="\u{1F50D} Check for Updates",k.disabled=!1},3e3)}async function M(){try{P.innerHTML='
Auto-updates run during maintenance window (default 2AM-4AM). Daily = every day, Weekly = Sundays, Monthly = 1st of month.
';n+='
',n+='
Container
Schedule
Window
Rollback
Last Run
Actions
';for(const r of o){const d=r.name||r.Names?.[0]?.replace(/^\//,"")||r.Id?.substring(0,12),h=r.containerId||r.Id,T=i[h]||{},U=T.enabled?T.schedule||"weekly":"",q=T.autoRollback!==!1,F=T.maintenanceWindow||"",_=T.lastAutoUpdate?timeAgo(T.lastAutoUpdate):"Never";n+=`
`}}const $=document.getElementById("dashcaddy-current-version"),u=document.getElementById("dashcaddy-update-badge"),v=document.getElementById("dashcaddy-update-details"),D=document.getElementById("dashcaddy-new-version"),I=document.getElementById("dashcaddy-changelog"),R=document.getElementById("dashcaddy-apply-btn"),N=document.getElementById("dashcaddy-check-btn"),O=document.getElementById("dashcaddy-rollback-btn"),m=document.getElementById("dashcaddy-status-bar"),y=document.getElementById("dashcaddy-history-container");let S=null;function f(c,t){m&&(m.style.display="block",m.style.background=t==="error"?"var(--bad-bg)":t==="success"?"var(--ok-bg)":"var(--bg)",m.style.color=t==="error"?"var(--bad-fg)":t==="success"?"var(--ok-fg)":"var(--fg)",m.textContent=c)}async function E(){try{const t=await(await fetch("/api/v1/system/version")).json();if(t.success){const e=t.commit&&t.commit!=="unknown"?t.commit:null;$.textContent="v"+t.version+(e?" ("+e.substring(0,7)+")":"")}}catch{$.textContent="Unable to fetch version"}}async function s(c){c||(N.textContent="Checking...",N.disabled=!0);try{const e=await(await fetch("/api/v1/system/update-check")).json();if(S=e,e.success&&e.available&&e.remote){u.style.display="",v.style.display="",D.textContent="v"+e.remote.version,I.textContent=e.remote.changelog||"No changelog available.";const a=document.getElementById("updates-btn");if(a&&!a.querySelector(".update-dot")){const i=document.createElement("span");i.className="update-dot",i.style.cssText="position:absolute;top:2px;right:2px;width:8px;height:8px;border-radius:50%;background:var(--accent);",a.style.position="relative",a.appendChild(i)}const o=document.getElementById("updates-dashcaddy-tab");if(o&&!o.querySelector(".update-dot")){const i=document.createElement("span");i.className="update-dot",i.style.cssText="display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--accent);margin-left:4px;vertical-align:middle;",o.appendChild(i)}}else u.style.display="none",v.style.display="none",await E(),c||f("You are running the latest version.","success");c||(N.textContent="Check for Updates",N.disabled=!1)}catch(t){c||(f("Failed to check: "+t.message,"error"),N.textContent="Check for Updates",N.disabled=!1)}}async function p(){if(!confirm("Apply DashCaddy update? The API container will restart."))return!1;R.textContent="Updating...",R.disabled=!0,f("Downloading and applying update...","info");try{const t=await(await secureFetch("/api/v1/system/update-apply",{method:"POST"})).json();if(t.success)return f("Update initiated: v"+(t.fromVersion||"?")+" \u2192 v"+(t.toVersion||"?")+". The container will restart shortly.","success"),R.textContent="Applied!",document.querySelectorAll(".update-dot").forEach(e=>e.remove()),!0;throw new Error(t.error||"Update failed")}catch(c){throw f("Update failed: "+c.message,"error"),R.textContent="Update Now",R.disabled=!1,c}}async function l(){try{const t=await(await fetch("/api/v1/system/update-history")).json(),e=t.success&&t.history?t.history:[];if(e.length===0){y.innerHTML='
\u{1F4E6}No self-update history.
';return}let a='
';a+='
When
Version
From
Status
';for(const o of e){const i=o.status==="success"?"\u2713 success":o.status==="pending"?"\u23F3 pending":o.status==="partial"?"\u26A0 partial":"\u2717 "+o.status,n=o.status==="success"?"var(--ok-fg)":o.status==="pending"?"var(--muted)":"var(--bad-fg)";a+='
"}}async function g(){try{const t=await(await fetch("/api/v1/system/rollback-versions")).json(),e=t.success&&t.versions?t.versions:[];if(e.length===0){showNotification("No rollback versions available.","info");return}const a=prompt(`Available rollback versions:
`+e.join(`
`)+`
Enter version to rollback to:`);if(!a)return;if(!e.includes(a)){showNotification("Invalid version: "+a,"error");return}if(!confirm("Rollback DashCaddy to v"+a+"? The container will restart."))return;f("Rolling back to v"+a+"...","info");const i=await(await secureFetch("/api/v1/system/rollback",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({version:a})})).json();if(i.success)f("Rollback to v"+a+" initiated. Container will restart.","success");else throw new Error(i.error||"Rollback failed")}catch(c){f("Rollback failed: "+c.message,"error")}}N?.addEventListener("click",()=>s(!1)),R?.addEventListener("click",()=>p().catch(()=>{})),O?.addEventListener("click",g),k?.addEventListener("click",w),C?.addEventListener("click",()=>{b?.classList.add("show"),x()}),wireModal(b,j),window.openUpdateModal=function(c){b?.classList.add("show"),x().then(()=>{if(!c)return;const t=z.querySelector(`[data-app-id="${c}"]`);t&&(t.scrollIntoView({behavior:"smooth",block:"center"}),t.style.background="rgba(249,115,22,0.15)",setTimeout(()=>{t.style.background=""},3e3))})},document.querySelector('[data-panel="updates-history"]')?.addEventListener("click",M),document.querySelector('[data-panel="updates-auto"]')?.addEventListener("click",L),document.querySelector('[data-panel="updates-dashcaddy"]')?.addEventListener("click",()=>{E(),l(),S||s(!0)}),window.dcApplyUpdate=p,window.dcCheckForUpdate=s,setTimeout(()=>s(!0),5e3)})(),(function(){injectModal("docker-resources-modal",`
",A.innerHTML=w,A.querySelectorAll(".dr-vol-del").forEach(M=>{M.addEventListener("click",async()=>{if(confirm(`Delete volume "${M.dataset.name}"? Data will be lost.`)){M.textContent="...",M.disabled=!0;try{await deleteAPI(`/api/v1/docker/volumes/${encodeURIComponent(M.dataset.name)}?force=true`),z()}catch(L){showNotification("Delete failed: "+L.message,"error"),M.textContent="Delete",M.disabled=!1}}})})}catch(x){A.innerHTML=`
Failed: ${escapeHtml(x.message)}
`}}document.getElementById("dr-vol-create")?.addEventListener("click",async()=>{const A=document.getElementById("dr-vol-name"),x=A.value.trim();if(!x){showNotification("Enter a volume name","warning");return}try{await postJSON("/api/v1/docker/volumes",{name:x}),A.value="",showNotification(`Volume "${x}" created`,"success"),z()}catch(B){showNotification("Create failed: "+B.message,"error")}});async function P(){const A=document.getElementById("dr-net-list");try{const B=(await getJSON("/api/v1/docker/networks")).networks||[];if(B.length===0){A.innerHTML='
\u{1F310}No networks found.
';return}let w='
';w+='
Name
Driver
Scope
Containers
Actions
';for(const M of B){const L=["bridge","host","none"].includes(M.name);w+='
';for(const w of x.results){const M=w.status==="deployed"||w.status==="created"?"\u2705":w.status==="exists"?"\u26A1":w.status==="skipped"?"\u23ED":"\u274C";B+='
`,w.style.display="none";return}if(!N&&O!==$)return;const l=Array.isArray(p.entries)?p.entries:[];if(l.length===0&&!N){const c=p.filters&&(p.filters.action||p.filters.outcome||p.filters.since||p.filters.until)?"No entries match your filters.":"No audit log entries yet. Actions will be logged automatically.";B.innerHTML=`
\u{1F4DC}${escapeHtml(c)}
`,w.style.display="none";return}let g="";N||(g='
',g+='
',g+='
When
',g+='
Actor
',g+='
IP
',g+='
Action
',g+='
Resource
',g+='
Result
',g+="
");for(const c of l){const t=c.outcome==="success",e=I(c);g+='
`}async function m(){try{const p=(await(await fetch("/api/v1/security/hosts")).json()).data?.hosts||[],l=v.value;v.innerHTML=''+p.map(g=>``).join(""),l&&(v.value=l)}catch{}}document.getElementById("sec-host-register-btn").addEventListener("click",S),document.getElementById("sec-hosts-refresh").addEventListener("click",y);async function y(){try{const p=(await(await fetch("/api/v1/security/hosts")).json()).data?.hosts||[];H=p;const l=document.getElementById("sec-hosts-container");if(!p.length){l.innerHTML='
No hosts registered. Click \u2795 Register Host to add one.
id: ${f(g.id)} \xB7
registered ${new Date(g.registered_at).toLocaleDateString()} \xB7
last seen ${g.last_seen_at?new Date(g.last_seen_at).toLocaleString():"never"}
${c}
${g.id==="self"?"":``}
`}).join(""),l.querySelectorAll(".sec-host-del").forEach(g=>{g.addEventListener("click",async()=>{confirm(`Remove host ${g.dataset.id}? Events already received will remain in the store.`)&&(await fetch(`/api/v1/security/hosts/${encodeURIComponent(g.dataset.id)}`,{method:"DELETE"}),y())})})}catch(s){document.getElementById("sec-hosts-container").innerHTML='
Load failed: '+f(s.message)+"
"}}async function S(){const s=prompt("Host id (lowercase, no spaces):");if(!s)return;const p=prompt("Display label:",s)||s,l=prompt('Type ("dashcaddy", "service", or "agent"):',"agent")||"agent";try{const g=await fetch("/api/v1/security/hosts",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({id:s,label:p,type:l})}),c=await g.json();if(!g.ok){alert("Failed: "+(c?.error?.message||g.statusText));return}alert(`\u2705 Host registered!
id: ${c.data.host.id}
label: ${c.data.host.label}
type: ${c.data.host.type}
\u{1F511} API KEY (save this NOW \u2014 won't be shown again):
${c.data.api_key}
Send this key as: Authorization: Bearer
To endpoint: POST /api/v1/security/events/ingest or /events/batch`),y()}catch(g){alert("Failed: "+g.message)}}function f(s){return String(s).replace(/[&<>"']/g,p=>({"&":"&","<":"<",">":">",'"':""","'":"'"})[p])}function E(s,p){let l;return function(){clearTimeout(l),l=setTimeout(()=>s.apply(this,arguments),p)}}})(),(function(){injectModal("deploys-modal",`
\u{1F69A} Deploys
Source deploys via shipdeck: build \u2192 package \u2192 systemd release \u2192 Caddy gate \u2192 DNS \u2192 verify.
Loading\u2026
Deploys are serialized fleet-side; a run takes ~30-60s. Output streams below when it finishes.
Loading\u2026
`);const b=u=>document.getElementById(u);let C=null,j=!1;function k(u){return window.escapeHtml?window.escapeHtml(String(u)):String(u).replace(/[&<>"']/g,v=>({"&":"&","<":"<",">":">",'"':""","'":"'"})[v])}async function z(u,v){const D=await fetch("/dashcaddy-api/api/v1/deploys"+u,Object.assign({credentials:"include"},v||{}));let I=null;try{I=await D.json()}catch{I={success:!1,error:"non-JSON response"}}return{status:D.status,body:I}}function P(u){const v=b("dep-output");v.style.display="block",v.textContent=u||"(no output)",v.scrollTop=v.scrollHeight}async function H(){const u=b("dep-services"),{body:v}=await z("/services");if(!v.success){u.innerHTML=""+k(v.error||"unavailable")+"";return}const D=v.services||[];if(!D.length){u.innerHTML="No shipdeck deployments on record yet.";return}u.innerHTML='
Service
Last action
When
Release
'+D.map(I=>"
"+k(I.name)+"
"+k(I.last_action)+"
"+k(I.last_time)+"
"+k(I.last_epoch)+'
').join("")+"
"}async function A(){const u=b("dep-repo-select"),{body:v}=await z("/repos");if(!v.success){u.innerHTML="";return}const D=v.repos||[];u.innerHTML=D.length?D.map(I=>'").join(""):''}async function x(u){const v=b("dep-journal"),D=u?"?service="+encodeURIComponent(u):"",{body:I}=await z("/journal"+D),R=I.rows||[];if(!R.length){v.innerHTML="No journal rows.";return}v.innerHTML='
Time
Service
Action
Release
Duration
'+R.map(N=>"
"+k(N.time)+"
"+k(N.service)+"
"+k(N.action)+"
"+k(N.epoch)+"
"+k(N.duration||"\u2014")+"
").join("")+"
"}function B(u,v,D){v&&(v.disabled=u,D&&(v.textContent=u?"Working\u2026":D))}async function w(){const u=b("dep-deploy-btn"),v=b("dep-repo-select").value;if(v){B(!0,u,"Deploy"),P("Deploying "+v+`
This can take ~30-60s\u2026`);try{const{body:D}=await z("/deploy",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({dir:v})});P((D.output||D.error||"")+(D.success?`
\u2705 SUCCESS`:`
\u274C FAILED`)),H()}catch(D){P("deploy error: "+D.message)}B(!1,u,"Deploy")}}async function M(u,v){if(confirm("Roll back "+u+" to the previous release?")){B(!0,v,"Rollback"),P("Rolling back "+u+"\u2026");try{const{body:D}=await z("/rollback",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({service:u})});P((D.output||D.error||"")+(D.success?`
\u2705 ROLLED BACK`:`
\u274C FAILED`)),H()}catch(D){P("rollback error: "+D.message)}B(!1,v,"Rollback")}}async function L(u,v){B(!0,v,"Status");try{const{body:D}=await z("/status?service="+encodeURIComponent(u));P(D.output||D.error||"(no output)")}catch(D){P("status error: "+D.message)}B(!1,v,"Status")}function $(){C=document.getElementById("deploys-btn"),C&&(C.addEventListener("click",async()=>{b("deploys-modal").classList.add("open"),j||(j=!0,H(),A(),x(""))}),b("dep-close").addEventListener("click",()=>{b("deploys-modal").classList.remove("open")}),document.querySelectorAll(".dep-tab").forEach(u=>{u.addEventListener("click",()=>{document.querySelectorAll(".dep-tab").forEach(v=>v.classList.remove("active")),u.classList.add("active"),document.querySelectorAll("#deploys-modal .dep-panel").forEach(v=>{v.style.display=v.dataset.panel===u.dataset.tab?"block":"none"})})}),b("dep-deploy-btn").addEventListener("click",w),b("dep-journal-btn").addEventListener("click",()=>x(b("dep-journal-name").value.trim())),b("dep-status-btn").addEventListener("click",()=>{const u=b("dep-status-name").value.trim();u&&L(u)}),b("dep-services").addEventListener("click",u=>{const v=u.target.closest(".dep-rollback");if(v)return M(v.dataset.service,v);const D=u.target.closest(".dep-status");if(D)return L(D.dataset.service,D)}))}document.readyState==="loading"?document.addEventListener("DOMContentLoaded",$):$()})(),(function(){const b=new ErrorHandler;injectModal("weather-modal",`
Weather Settings
Enter a city name, postal code, or “City, Country”
`);const C="weather-location",j="weather-zip",k="weather-geo",z="weather-unit";!safeGet(C)&&safeGet(j)&&safeSet(C,safeGet(j));function P(){return safeGet(z)||"imperial"}function H(){return{icon:document.querySelector(".weather-icon"),temp:document.querySelector(".weather-temp"),condition:document.querySelector(".weather-condition"),location:document.querySelector(".weather-location"),wind:document.querySelector(".weather-wind")}}const A={0:"Clear sky",1:"Mainly clear",2:"Partly cloudy",3:"Overcast",45:"Fog",48:"Rime fog",51:"Light drizzle",53:"Drizzle",55:"Dense drizzle",56:"Freezing drizzle",57:"Dense freezing drizzle",61:"Light rain",63:"Moderate rain",65:"Heavy rain",66:"Light freezing rain",67:"Heavy freezing rain",71:"Light snow",73:"Moderate snow",75:"Heavy snow",77:"Snow grains",80:"Light showers",81:"Moderate showers",82:"Violent showers",85:"Light snow showers",86:"Heavy snow showers",95:"Thunderstorm",96:"Thunderstorm with hail",99:"Severe thunderstorm"},x={0:"\u2600\uFE0F",1:"\u{1F324}\uFE0F",2:"\u26C5",3:"\u2601\uFE0F",45:"\u{1F32B}\uFE0F",48:"\u{1F32B}\uFE0F",51:"\u{1F326}\uFE0F",53:"\u{1F326}\uFE0F",55:"\u{1F326}\uFE0F",56:"\u{1F328}\uFE0F",57:"\u{1F328}\uFE0F",61:"\u{1F326}\uFE0F",63:"\u{1F327}\uFE0F",65:"\u{1F327}\uFE0F",66:"\u{1F328}\uFE0F",67:"\u{1F328}\uFE0F",71:"\u{1F328}\uFE0F",73:"\u2744\uFE0F",75:"\u2744\uFE0F",77:"\u2744\uFE0F",80:"\u{1F326}\uFE0F",81:"\u{1F327}\uFE0F",82:"\u{1F327}\uFE0F",85:"\u{1F328}\uFE0F",86:"\u2744\uFE0F",95:"\u26C8\uFE0F",96:"\u26C8\uFE0F",99:"\u26C8\uFE0F"},B=["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"];function w(I){return B[Math.round(I/22.5)%16]}async function M(I){const R=safeGet(k);if(R)try{const S=JSON.parse(R);if(S.query===I)return S}catch{}const N=await fetch(`https://geocoding-api.open-meteo.com/v1/search?name=${encodeURIComponent(I)}&count=1&language=en&format=json`);if(!N.ok)throw new Error("Geocoding failed");const O=await N.json();if(!O.results||!O.results.length)throw new Error("Location not found");const m=O.results[0],y={query:I,lat:m.latitude,lon:m.longitude,city:m.name,state:m.admin1||"",country:m.country||"",countryCode:m.country_code||""};return safeSet(k,JSON.stringify(y)),y}function L(I){return I.countryCode==="US"&&I.state?`${I.city}, ${I.state}`:I.country?`${I.city}, ${I.country}`:I.city}async function $(I){try{const R=await M(I),N=P(),O=N==="metric"?"celsius":"fahrenheit",m=N==="metric"?"kmh":"mph",y=`https://api.open-meteo.com/v1/forecast?latitude=${R.lat}&longitude=${R.lon}¤t=temperature_2m,weather_code,wind_speed_10m,wind_direction_10m&temperature_unit=${O}&wind_speed_unit=${m}`,S=await fetch(y);if(!S.ok)throw new Error("Weather fetch failed");const E=(await S.json()).current,s=E.weather_code;return{temp:Math.round(E.temperature_2m),condition:A[s]||"Unknown",icon:x[s]||"\u{1F324}\uFE0F",locationStr:L(R),windSpeed:Math.round(E.wind_speed_10m),windDir:w(E.wind_direction_10m),unit:N}}catch(R){return console.warn("Weather fetch failed:",R),null}}async function u(){const I=H();if(!I.icon||!I.temp||!I.condition||!I.location||!I.wind){console.warn("Weather widget elements not found");return}const R=safeGet(C);if(!R){I.location.textContent="Set Location",I.temp.textContent="--\xB0",I.condition.textContent="Click \u2699\uFE0F to configure",I.wind.textContent="--",I.icon.innerHTML='\u{1F324}\uFE0F';return}try{const N=await $(R);if(N){const O=N.unit==="metric"?"\xB0C":"\xB0F",m=N.unit==="metric"?"km/h":"mph";I.location.textContent=N.locationStr,I.temp.textContent=`${N.temp}${O}`,I.condition.textContent=N.condition,I.wind.textContent=`Wind: ${N.windSpeed} ${m} ${N.windDir}`,I.icon.innerHTML=`${escapeHtml(N.icon)}`}}catch(N){b.logError("[Weather] Update Error",N,{function:"updateWeather"}),I.location.textContent="Weather Error",I.temp.textContent="Error",I.condition.textContent="Failed to load",I.wind.textContent="--"}}const v=document.getElementById("weather-modal"),D=document.getElementById("weather-location-input");document.getElementById("weather-settings")?.addEventListener("click",()=>{D.value=safeGet(C)||"";const I=P(),R=v.querySelector(`input[name="weather-unit-radio"][value="${I}"]`);R&&(R.checked=!0),v.classList.add("show"),D.focus()}),document.getElementById("weather-cancel")?.addEventListener("click",()=>{v.classList.remove("show")}),document.getElementById("weather-save")?.addEventListener("click",()=>{const I=D.value.trim();if(I){safeGet(C)!==I&&safeSet(k,""),safeSet(C,I);const N=v.querySelector('input[name="weather-unit-radio"]:checked'),O=N?N.value:"imperial",m=P();safeSet(z,O),m!==O&&safeSet(k,""),v.classList.remove("show"),u()}else showNotification("Please enter a location (e.g., Hamburg, London, 90210)","warning")}),wireModal(v),document.addEventListener("keydown",I=>{I.key==="Escape"&&v.classList.contains("show")&&v.classList.remove("show")}),u(),setInterval(u,DC.POLL.WEATHER)})(),(function(){const b=document.getElementById("clock-widget"),C=document.getElementById("clock-render");if(!b||!C)return;const j=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],k=["January","February","March","April","May","June","July","August","September","October","November","December"],z=["XII","I","II","III","IV","V","VI","VII","VIII","IX","X","XI"];let P=safeGet("clock-style")||"default",H=-1,A=!1,x="",B="",w=null,M=null;function L(t){if(A||safeGet("clock-chimes")!=="true")return;A=!0;const e=parseInt(safeGet("clock-chime-volume")||"50",10)/100;let a=0;function o(){if(a>=t){A=!1;return}const i=new Audio("/assets/sounds/church-bell.mp3");i.volume=e,i.play().catch(()=>{}),a++,a{A=!1},2500)}o()}function $(t){return j[t.getDay()]+", "+k[t.getMonth()]+" "+t.getDate()+", "+t.getFullYear()}function u(){B="",w=null}function v(){return B!=="digital"&&(C.innerHTML='
`).join("")}async function I(){try{const f=await(await fetch("/api/v1/license/status")).json();f.success&&(D(f.license),O(f.license))}catch(S){console.warn("Failed to load license status:",S.message)}}async function R(){const S=C.value.trim();if(!S){u("Please enter a license code.");return}$(),j.disabled=!0,j.textContent="Activating...";try{const E=await(await secureFetch("/api/v1/license/activate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:S})})).json();E.success?(v(E.message),C.value="",D(E.license),showNotification("License activated! Premium features unlocked.","success",5e3),O(E.license)):u(E.error||"Activation failed")}catch(f){u("Network error: "+f.message)}finally{j.disabled=!1,j.textContent="Activate"}}async function N(){if(confirm("Deactivate your license? You can reuse the code on another machine.")){k.disabled=!0,k.textContent="Deactivating...";try{const f=await(await secureFetch("/api/v1/license/deactivate",{method:"POST"})).json();f.success?(v(f.message),await I(),showNotification("License deactivated.","info",3e3),O({active:!1})):u(f.error||"Deactivation failed")}catch(S){u("Network error: "+S.message)}finally{k.disabled=!1,k.textContent="Deactivate"}}}function O(S){const f=document.getElementById("license-status-topbar"),E=document.getElementById("license-topbar-icon"),s=document.getElementById("license-topbar-text"),p=document.getElementById("license-topbar-time");if(f)if(f.className="license-status-topbar "+(S.active?"premium":"free"),S.active)if(E.textContent="\u2605",s.textContent="PREMIUM",S.lifetime)p.textContent="\xB7 LIFETIME";else{const l=S.daysRemaining;p.textContent=l!=null?"\xB7 "+l+"d remaining":""}else E.textContent="\u2606",s.textContent=S.expired?"EXPIRED":"FREE TIER",p.textContent=""}function m(){$(),I(),b.classList.add("show")}C.addEventListener("input",function(){let S=this.value.toUpperCase().replace(/[^A-Z0-9-]/g,"");if(S.length>this._prevLength&&(S=S.replace(/-/g,""),S.length>2&&!S.startsWith("DC")&&(S="DC"+S),S.startsWith("DC")&&S.length>2)){const f=["DC"],E=S.substring(2);for(let s=0;s{S.key==="Enter"&&R()}),wireModal(b,document.getElementById("license-cancel"));const y=document.getElementById("license-status-topbar");y&&y.addEventListener("click",()=>window.openLicenseModal&&window.openLicenseModal()),window.openLicenseModal=m,window.checkPremiumFeature=async function(S){try{return(await(await fetch(`/api/v1/license/feature/${S}`)).json()).available}catch{return!1}},I().then(S=>{L&&O(L)})})(),(function(){"use strict";if(window.__dc_058_share_modal_loaded)return;window.__dc_058_share_modal_loaded=!0;const b=[{ms:3600*1e3,label:"1 hour"},{ms:1440*60*1e3,label:"24 hours"},{ms:10080*60*1e3,label:"7 days"}];injectModal("share-modal",`
Share \u2026
Create a public link or Tailscale invite so someone outside your network can access this service.
A single-use Tailscale pre-auth key is generated and emailed. The device joins your tailnet and is routed to this service via Caddy.
`}).join(""),B.querySelectorAll(".share-revoke").forEach(i=>{i.addEventListener("click",()=>s(i.dataset.shareId))})}catch{B.innerHTML='Could not load outstanding shares.'}}async function s(t){try{const e=await fetch(`/api/v1/share/${encodeURIComponent(t)}`,{method:"DELETE",credentials:"same-origin"});if(!e.ok){const a=await e.json().catch(()=>({}));R(a&&a.error||`Revoke failed (HTTP ${e.status}).`);return}N("Share revoked."),E()}catch{R("Network error while revoking.")}}async function p(){if(!v)return;I(),M.disabled=!0;const t=M.textContent;M.textContent="Creating\u2026";try{const e=parseInt(u.value,10),a=await fetch("/api/v1/share",{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/json"},body:JSON.stringify({serviceId:v.id,ttlMs:e})}),o=await a.json().catch(()=>({}));if(!a.ok||!o.success){g(a.status,o);return}const i=o.data.urlPath;z.value=m(i),H.textContent=`Public link \xB7 expires ${y(o.data.expiresAt)}`,k.style.display="block",N("Share link created."),E()}catch{R("Network error while creating share.")}finally{M.disabled=!1,M.textContent=t}}async function l(){if(!v)return;const t=($.value||"").trim();if(!t||!t.includes("@")){R("A valid recipient email is required.");return}I(),L.disabled=!0;const e=L.textContent;L.textContent="Creating\u2026";try{const a=await fetch("/api/v1/share/tailscale",{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/json"},body:JSON.stringify({serviceId:v.id,email:t})}),o=await a.json().catch(()=>({}));if(!a.ok||!o.success){g(a.status,o);return}const i=o.data&&o.data.urlPath;i?(z.value=m(i),H.textContent=`Tailscale invite \xB7 emailed to ${t} (or use this URL manually if delivery failed).`):(z.value="",H.textContent=`Tailscale invite sent to ${t}.`),k.style.display="block",N("Tailscale invite created."),$.value="",E()}catch{R("Network error while creating Tailscale invite.")}finally{L.disabled=!1,L.textContent=e}}function g(t,e){const a=e&&e.error||"";if(t===402){R("Share is a Pro feature. Activate a license to unlock.");return}if(t===400&&/tailscale/i.test(a)){R("Tailscale is not configured on this host. Set up Tailscale in the dashboard first.");return}if(t===403){R("You do not have permission to share services.");return}if(t===404){R("Service not found. It may have been deleted.");return}R(a||`Request failed (HTTP ${t}).`)}function c(t){!t||!t.id||(v={id:t.id,name:t.name||t.id},j.textContent=v.name,I(),f("public"),$.value="",u.value=String(b[1].ms),C.classList.add("show"),E())}C.querySelectorAll(".share-tab").forEach(t=>{t.addEventListener("click",()=>f(t.dataset.tab))}),M.addEventListener("click",p),L.addEventListener("click",l),w.addEventListener("click",()=>C.classList.remove("show")),wireModal(C,w),P.addEventListener("click",async()=>{const t=z.value;if(t)try{navigator.clipboard&&navigator.clipboard.writeText?await navigator.clipboard.writeText(t):(z.select(),document.execCommand("copy"));const e=P.textContent;P.textContent="Copied!",setTimeout(()=>{P.textContent=e},1200)}catch{R("Could not copy to clipboard. Select the URL manually.")}}),window.openShareModal=c})();
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLy8gTG9nbyBDdXN0b21pemF0aW9uIFN5c3RlbVxuKGZ1bmN0aW9uKCkge1xuICAvLyBJbmplY3QgbW9kYWwgSFRNTFxuICBpbmplY3RNb2RhbCgnbG9nby1tb2RhbCcsIGA8ZGl2IGlkPVwibG9nby1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogNDAwcHg7IG1heC13aWR0aDogNTIwcHg7XCI+XG4gICAgICA8aDM+RGFzaGJvYXJkIFNldHRpbmdzPC9oMz5cbiAgICAgIDxwIHN0eWxlPVwiZm9udC1zaXplOiAwLjg1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW46IDAgMCAxNnB4O1wiPlxuICAgICAgICBDdXN0b21pemUgeW91ciBkYXNoYm9hcmQncyBhcHBlYXJhbmNlIGFuZCBzeXN0ZW0gcHJlZmVyZW5jZXMuXG4gICAgICA8L3A+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi0xNlwiPlxuICAgICAgICA8bGFiZWwgZm9yPVwiZGFzaGJvYXJkLXRpdGxlXCIgY2xhc3M9XCJmb3JtLWxhYmVsLWJvbGRcIj5EYXNoYm9hcmQgVGl0bGU6PC9sYWJlbD5cbiAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJkYXNoYm9hcmQtdGl0bGVcIiBwbGFjZWhvbGRlcj1cIkRhc2hDYWRkeVwiIG1heGxlbmd0aD1cIjUwXCIgc3R5bGU9XCJ3aWR0aDogMTAwJTsgcGFkZGluZzogMTBweCAxMnB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA0cHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmcpOyBjb2xvcjogdmFyKC0tZmcpOyBmb250LXNpemU6IDFyZW07XCIgLz5cbiAgICAgICAgPHAgY2xhc3M9XCJ0aW55LWhpbnRcIj5TaG93biBpbiBicm93c2VyIHRhYiBhbmQgaGVhZGVyIChtYXggNTAgY2hhcmFjdGVycyk8L3A+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGhyIGNsYXNzPVwiaHItZGl2aWRlclwiIC8+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi0xNlwiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsLWJvbGRcIj5Mb2dvOjwvbGFiZWw+XG4gICAgICAgIDxwIGNsYXNzPVwidGlueS1oaW50XCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAycHg7XCI+U2VwYXJhdGUgbG9nb3MgZm9yIGRhcmsgYW5kIGxpZ2h0IHRoZW1lcywgb3IgdXNlIHRoZSBzYW1lIGZvciBib3RoLjwvcD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiAxMnB4OyBtYXJnaW4tYm90dG9tOiAxMnB4O1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleDogMTsgdGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiAxNnB4IDEwcHg7IGJvcmRlci1yYWRpdXM6IDhweDsgYmFja2dyb3VuZDogIzFhMWEyZTsgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwuMSk7XCI+XG4gICAgICAgICAgPGltZyBpZD1cImxvZ28tcHJldmlldy1kYXJrXCIgc3JjPVwiL2Fzc2V0cy9kYXNoY2FkZHktbG9nby1kYXJrLnBuZ1wiIGFsdD1cIkRhcmsgdGhlbWUgbG9nb1wiIHN0eWxlPVwibWF4LWhlaWdodDogNjBweDsgbWF4LXdpZHRoOiAxMDAlO1wiIC8+XG4gICAgICAgICAgPHAgc3R5bGU9XCJmb250LXNpemU6IDAuNjVyZW07IGNvbG9yOiAjOWFhNmJmOyBtYXJnaW4tdG9wOiA2cHg7XCI+RGFyayB0aGVtZXM8L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleDogMTsgdGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiAxNnB4IDEwcHg7IGJvcmRlci1yYWRpdXM6IDhweDsgYmFja2dyb3VuZDogI2YwZjBmMDsgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLDAsMCwuMSk7XCI+XG4gICAgICAgICAgPGltZyBpZD1cImxvZ28tcHJldmlldy1saWdodFwiIHNyYz1cIi9hc3NldHMvZGFzaGNhZGR5LWxvZ28tbGlnaHQucG5nXCIgYWx0PVwiTGlnaHQgdGhlbWUgbG9nb1wiIHN0eWxlPVwibWF4LWhlaWdodDogNjBweDsgbWF4LXdpZHRoOiAxMDAlO1wiIC8+XG4gICAgICAgICAgPHAgc3R5bGU9XCJmb250LXNpemU6IDAuNjVyZW07IGNvbG9yOiAjNWY2YjdhOyBtYXJnaW4tdG9wOiA2cHg7XCI+TGlnaHQgdGhlbWVzPC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPHAgaWQ9XCJsb2dvLXN0YXR1c1wiIHN0eWxlPVwiZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tYm90dG9tOiAxMnB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7XCI+VXNpbmcgZGVmYXVsdCBsb2dvczwvcD5cblxuICAgICAgPGRpdiBjbGFzcz1cIm1iLTE2XCI+XG4gICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogOHB4OyBmb250LXNpemU6IDAuODJyZW07IGN1cnNvcjogcG9pbnRlcjsgdXNlci1zZWxlY3Q6IG5vbmU7XCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwibG9nby1zYW1lLWJvdGhcIiAvPiBVc2Ugc2FtZSBsb2dvIGZvciBib3RoXG4gICAgICAgIDwvbGFiZWw+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBpZD1cImxvZ28tZHVhbC11cGxvYWRzXCIgY2xhc3M9XCJtYi0xNlwiIHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiAxMnB4O1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleDogMTtcIj5cbiAgICAgICAgICA8bGFiZWwgZm9yPVwibG9nby11cGxvYWQtZGFya1wiIHN0eWxlPVwiZGlzcGxheTogYmxvY2s7IG1hcmdpbi1ib3R0b206IDZweDsgZm9udC1zaXplOiAwLjhyZW07XCI+RGFyayB0aGVtZSBsb2dvOjwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJmaWxlXCIgaWQ9XCJsb2dvLXVwbG9hZC1kYXJrXCIgYWNjZXB0PVwiaW1hZ2UvKlwiIGNsYXNzPVwiaW5wdXQtY2FyZC1hbHRcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC43NXJlbTtcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImZsZXg6IDE7XCI+XG4gICAgICAgICAgPGxhYmVsIGZvcj1cImxvZ28tdXBsb2FkLWxpZ2h0XCIgc3R5bGU9XCJkaXNwbGF5OiBibG9jazsgbWFyZ2luLWJvdHRvbTogNnB4OyBmb250LXNpemU6IDAuOHJlbTtcIj5MaWdodCB0aGVtZSBsb2dvOjwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJmaWxlXCIgaWQ9XCJsb2dvLXVwbG9hZC1saWdodFwiIGFjY2VwdD1cImltYWdlLypcIiBjbGFzcz1cImlucHV0LWNhcmQtYWx0XCIgc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07XCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBpZD1cImxvZ28tc2luZ2xlLXVwbG9hZFwiIGNsYXNzPVwibWItMTZcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+XG4gICAgICAgIDxsYWJlbCBmb3I9XCJsb2dvLXVwbG9hZC1zaW5nbGVcIiBzdHlsZT1cImRpc3BsYXk6IGJsb2NrOyBtYXJnaW4tYm90dG9tOiA2cHg7IGZvbnQtc2l6ZTogMC44cmVtO1wiPlVwbG9hZCBsb2dvOjwvbGFiZWw+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwiZmlsZVwiIGlkPVwibG9nby11cGxvYWQtc2luZ2xlXCIgYWNjZXB0PVwiaW1hZ2UvKlwiIGNsYXNzPVwiaW5wdXQtY2FyZC1hbHRcIiAvPlxuICAgICAgICA8cCBjbGFzcz1cInRpbnktaGludFwiPlRoaXMgbG9nbyB3aWxsIGJlIHVzZWQgb24gYWxsIHRoZW1lczwvcD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwibWItMTZcIj5cbiAgICAgICAgPGxhYmVsIHN0eWxlPVwiZGlzcGxheTogYmxvY2s7IG1hcmdpbi1ib3R0b206IDhweDtcIj5Mb2dvIFBvc2l0aW9uOjwvbGFiZWw+XG4gICAgICAgIDxkaXYgaWQ9XCJsb2dvLXBvc2l0aW9uLWJ0bnNcIiBjbGFzcz1cImZsZXgtcm93LWdhcFwiPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGRhdGEtcG9zPVwibGVmdFwiIGNsYXNzPVwibG9nby1wb3MtYnRuIGJ0bi1vcHRpb25cIj5MZWZ0PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1wb3M9XCJjZW50ZXJcIiBjbGFzcz1cImxvZ28tcG9zLWJ0biBidG4tb3B0aW9uXCI+Q2VudGVyPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1wb3M9XCJyaWdodFwiIGNsYXNzPVwibG9nby1wb3MtYnRuIGJ0bi1vcHRpb25cIj5SaWdodDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8aHIgY2xhc3M9XCJoci1kaXZpZGVyXCIgLz5cblxuICAgICAgPGRpdiBjbGFzcz1cIm1iLTE2XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwtYm9sZFwiPkZhdmljb24gKEJyb3dzZXIgVGFiIEljb24pOjwvbGFiZWw+XG4gICAgICAgIDxkaXYgaWQ9XCJmYXZpY29uLXByZXZpZXctY29udGFpbmVyXCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDEycHg7IG1hcmdpbi1ib3R0b206IDhweDsgcGFkZGluZzogMTJweDsgYm9yZGVyLXJhZGl1czogNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTtcIj5cbiAgICAgICAgICA8aW1nIGlkPVwiZmF2aWNvbi1wcmV2aWV3XCIgc3JjPVwiL2Fzc2V0cy9kYXNoY2FkZHktZmF2aWNvbi5pY29cIiBhbHQ9XCJDdXJyZW50IGZhdmljb25cIiBzdHlsZT1cIndpZHRoOiAzMnB4OyBoZWlnaHQ6IDMycHg7IGltYWdlLXJlbmRlcmluZzogcGl4ZWxhdGVkO1wiIG9uZXJyb3I9XCJ0aGlzLnNyYz0nZGF0YTppbWFnZS9zdmcreG1sLDxzdmcgeG1sbnM9JTIyaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmclMjIgdmlld0JveD0lMjIwIDAgMzIgMzIlMjI+PHJlY3QgZmlsbD0lMjIlMjM2NjclMjIgd2lkdGg9JTIyMzIlMjIgaGVpZ2h0PSUyMjMyJTIyIHJ4PSUyMjQlMjIvPjwvc3ZnPidcIiAvPlxuICAgICAgICAgIDxzcGFuIGlkPVwiZmF2aWNvbi1zdGF0dXNcIiBjbGFzcz1cInRleHQtdGlueS1tdXRlZFwiPlVzaW5nIERhc2hDYWRkeSBmYXZpY29uPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGlucHV0IHR5cGU9XCJmaWxlXCIgaWQ9XCJmYXZpY29uLXVwbG9hZFwiIGFjY2VwdD1cImltYWdlL3BuZyxpbWFnZS9zdmcreG1sXCIgY2xhc3M9XCJpbnB1dC1jYXJkLWFsdFwiIC8+XG4gICAgICAgIDxwIGNsYXNzPVwidGlueS1oaW50XCI+VXBsb2FkIFBORyBvciBTVkcgLSBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZCB0byBJQ088L3A+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGhyIGNsYXNzPVwiaHItZGl2aWRlclwiIC8+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi0xNlwiPlxuICAgICAgICA8bGFiZWwgZm9yPVwic2V0dGluZ3MtdGltZXpvbmVcIiBjbGFzcz1cImZvcm0tbGFiZWwtYm9sZFwiPlRpbWV6b25lOjwvbGFiZWw+XG4gICAgICAgIDxzZWxlY3QgaWQ9XCJzZXR0aW5ncy10aW1lem9uZVwiIHN0eWxlPVwid2lkdGg6IDEwMCU7IHBhZGRpbmc6IDEwcHggMTJweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgZm9udC1zaXplOiAxcmVtO1wiPlxuICAgICAgICAgIDwhLS0gUG9wdWxhdGVkIGJ5IEpTIHdpdGggSUFOQSB0aW1lem9uZXMgLS0+XG4gICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8cCBjbGFzcz1cInRpbnktaGludFwiPlVzZWQgYnkgYWxsIGRlcGxveWVkIGNvbnRhaW5lcnMuIENoYW5nZXMgYXBwbHkgdG8gbmV3IGRlcGxveW1lbnRzLjwvcD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zXCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJsb2dvLXJlc2V0XCIgc3R5bGU9XCJiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgI2VmNDQ0NCAyMCUsIHRyYW5zcGFyZW50KTsgYm9yZGVyLWNvbG9yOiAjZWY0NDQ0OyBjb2xvcjogI2VmNDQ0NDtcIj5SZXNldCB0byBEZWZhdWx0PC9idXR0b24+XG4gICAgICAgIDxidXR0b24gaWQ9XCJsb2dvLWNhbmNlbFwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwibG9nby1zYXZlXCIgY2xhc3M9XCJidG4tYWNjZW50XCI+U2F2ZTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PmApO1xuXG4gIGNvbnN0IGxvZ29Nb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dvLW1vZGFsJyk7XG4gIGNvbnN0IHByZXZpZXdEYXJrID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ28tcHJldmlldy1kYXJrJyk7XG4gIGNvbnN0IHByZXZpZXdMaWdodCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dvLXByZXZpZXctbGlnaHQnKTtcbiAgY29uc3QgbG9nb1N0YXR1cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dvLXN0YXR1cycpO1xuICBjb25zdCBzYW1lQm90aENoZWNrYm94ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ28tc2FtZS1ib3RoJyk7XG4gIGNvbnN0IGR1YWxVcGxvYWRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ28tZHVhbC11cGxvYWRzJyk7XG4gIGNvbnN0IHNpbmdsZVVwbG9hZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dvLXNpbmdsZS11cGxvYWQnKTtcbiAgY29uc3QgdXBsb2FkRGFyayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dvLXVwbG9hZC1kYXJrJyk7XG4gIGNvbnN0IHVwbG9hZExpZ2h0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ28tdXBsb2FkLWxpZ2h0Jyk7XG4gIGNvbnN0IHVwbG9hZFNpbmdsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dvLXVwbG9hZC1zaW5nbGUnKTtcbiAgY29uc3QgYnJhbmRMb2dvRGFyayA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNicmFuZCAuYnJhbmQtbG9nby1kYXJrJyk7XG4gIGNvbnN0IGJyYW5kTG9nb0xpZ2h0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2JyYW5kIC5icmFuZC1sb2dvLWxpZ2h0Jyk7XG4gIGNvbnN0IHRvcFJvdyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy50b3Atcm93Jyk7XG4gIGNvbnN0IGRhc2hib2FyZFRpdGxlSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaGJvYXJkLXRpdGxlJyk7XG4gIGNvbnN0IERFRkFVTFRfVElUTEUgPSBEQy5OQU1FO1xuXG4gIGxldCBwZW5kaW5nRGFya0RhdGEgPSBudWxsO1xuICBsZXQgcGVuZGluZ0xpZ2h0RGF0YSA9IG51bGw7XG4gIGxldCBwZW5kaW5nU2luZ2xlRGF0YSA9IG51bGw7XG4gIGxldCBjdXJyZW50UG9zaXRpb24gPSAnbGVmdCc7XG4gIGxldCBjdXJyZW50VGl0bGUgPSBERUZBVUxUX1RJVExFO1xuXG4gIC8vIFRvZ2dsZSBiZXR3ZWVuIGR1YWwgYW5kIHNpbmdsZSB1cGxvYWQgbW9kZVxuICBzYW1lQm90aENoZWNrYm94Py5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgaWYgKHNhbWVCb3RoQ2hlY2tib3guY2hlY2tlZCkge1xuICAgICAgZHVhbFVwbG9hZHMuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIHNpbmdsZVVwbG9hZC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICAvLyBDbGVhciBpbmRpdmlkdWFsIHBlbmRpbmcgZGF0YVxuICAgICAgcGVuZGluZ0RhcmtEYXRhID0gbnVsbDtcbiAgICAgIHBlbmRpbmdMaWdodERhdGEgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBkdWFsVXBsb2Fkcy5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICAgICAgc2luZ2xlVXBsb2FkLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICBwZW5kaW5nU2luZ2xlRGF0YSA9IG51bGw7XG4gICAgfVxuICB9KTtcblxuICAvLyBSZWFkIGZpbGUgYXMgZGF0YSBVUkwgaGVscGVyXG4gIGZ1bmN0aW9uIHJlYWRGaWxlQXNEYXRhVVJMKGZpbGUsIGNhbGxiYWNrKSB7XG4gICAgaWYgKCFmaWxlIHx8ICFmaWxlLnR5cGUuc3RhcnRzV2l0aCgnaW1hZ2UvJykpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ1BsZWFzZSBzZWxlY3QgYW4gaW1hZ2UgZmlsZScsICd3YXJuaW5nJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgcmVhZGVyLm9ubG9hZCA9IChlKSA9PiBjYWxsYmFjayhlLnRhcmdldC5yZXN1bHQpO1xuICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xuICB9XG5cbiAgLy8gVXBsb2FkIGhhbmRsZXJzXG4gIHVwbG9hZERhcms/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIChlKSA9PiB7XG4gICAgcmVhZEZpbGVBc0RhdGFVUkwoZS50YXJnZXQuZmlsZXNbMF0sIChkYXRhKSA9PiB7XG4gICAgICBwZW5kaW5nRGFya0RhdGEgPSBkYXRhO1xuICAgICAgcHJldmlld0Rhcmsuc3JjID0gZGF0YTtcbiAgICAgIGxvZ29TdGF0dXMudGV4dENvbnRlbnQgPSAnTmV3IGRhcmsgbG9nbyByZWFkeSB0byBzYXZlJztcbiAgICB9KTtcbiAgfSk7XG5cbiAgdXBsb2FkTGlnaHQ/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIChlKSA9PiB7XG4gICAgcmVhZEZpbGVBc0RhdGFVUkwoZS50YXJnZXQuZmlsZXNbMF0sIChkYXRhKSA9PiB7XG4gICAgICBwZW5kaW5nTGlnaHREYXRhID0gZGF0YTtcbiAgICAgIHByZXZpZXdMaWdodC5zcmMgPSBkYXRhO1xuICAgICAgbG9nb1N0YXR1cy50ZXh0Q29udGVudCA9ICdOZXcgbGlnaHQgbG9nbyByZWFkeSB0byBzYXZlJztcbiAgICB9KTtcbiAgfSk7XG5cbiAgdXBsb2FkU2luZ2xlPy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoZSkgPT4ge1xuICAgIHJlYWRGaWxlQXNEYXRhVVJMKGUudGFyZ2V0LmZpbGVzWzBdLCAoZGF0YSkgPT4ge1xuICAgICAgcGVuZGluZ1NpbmdsZURhdGEgPSBkYXRhO1xuICAgICAgcHJldmlld0Rhcmsuc3JjID0gZGF0YTtcbiAgICAgIHByZXZpZXdMaWdodC5zcmMgPSBkYXRhO1xuICAgICAgbG9nb1N0YXR1cy50ZXh0Q29udGVudCA9ICdOZXcgbG9nbyByZWFkeSB0byBzYXZlIChib3RoIHRoZW1lcyknO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyBBcHBseSBsb2dvIHBvc2l0aW9uXG4gIGZ1bmN0aW9uIGFwcGx5TG9nb1Bvc2l0aW9uKHBvcykge1xuICAgIHRvcFJvdy5zZXRBdHRyaWJ1dGUoJ2RhdGEtbG9nby1wb3MnLCBwb3MpO1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5sb2dvLXBvcy1idG4nKS5mb3JFYWNoKGJ0biA9PiB7XG4gICAgICBidG4uc3R5bGUuYmFja2dyb3VuZCA9IGJ0bi5kYXRhc2V0LnBvcyA9PT0gcG9zID8gJ3ZhcigtLWFjY2VudCknIDogJ3ZhcigtLWNhcmQtYmcpJztcbiAgICAgIGJ0bi5zdHlsZS5jb2xvciA9IGJ0bi5kYXRhc2V0LnBvcyA9PT0gcG9zID8gJ3doaXRlJyA6ICd2YXIoLS1mZyknO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gQXBwbHkgZGFzaGJvYXJkIHRpdGxlXG4gIGZ1bmN0aW9uIGFwcGx5RGFzaGJvYXJkVGl0bGUodGl0bGUpIHtcbiAgICBjdXJyZW50VGl0bGUgPSB0aXRsZSB8fCBERUZBVUxUX1RJVExFO1xuICAgIGRvY3VtZW50LnRpdGxlID0gY3VycmVudFRpdGxlO1xuICAgIGNvbnN0IGhlYWRlclRpdGxlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmRhc2hib2FyZC10aXRsZScpO1xuICAgIGlmIChoZWFkZXJUaXRsZSkgaGVhZGVyVGl0bGUudGV4dENvbnRlbnQgPSBjdXJyZW50VGl0bGU7XG4gIH1cblxuICAvLyBMb2FkIGN1c3RvbSBsb2dvLCBwb3NpdGlvbiwgYW5kIHRpdGxlIG9uIHN0YXJ0dXBcbiAgYXN5bmMgZnVuY3Rpb24gbG9hZEN1c3RvbUxvZ28oKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvbG9nbycpO1xuICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIC8vIEFwcGx5IGRhcmsvbGlnaHQgdmFyaWFudHNcbiAgICAgICAgaWYgKGRhdGEuY3VzdG9tTG9nb0RhcmspIHtcbiAgICAgICAgICBicmFuZExvZ29EYXJrLnNyYyA9IGRhdGEuY3VzdG9tTG9nb0Rhcms7XG4gICAgICAgICAgcHJldmlld0Rhcmsuc3JjID0gZGF0YS5jdXN0b21Mb2dvRGFyaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0YS5jdXN0b21Mb2dvTGlnaHQpIHtcbiAgICAgICAgICBicmFuZExvZ29MaWdodC5zcmMgPSBkYXRhLmN1c3RvbUxvZ29MaWdodDtcbiAgICAgICAgICBwcmV2aWV3TGlnaHQuc3JjID0gZGF0YS5jdXN0b21Mb2dvTGlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTGVnYWN5IHNpbmdsZS1sb2dvIGZhbGxiYWNrXG4gICAgICAgIGlmICghZGF0YS5jdXN0b21Mb2dvRGFyayAmJiAhZGF0YS5jdXN0b21Mb2dvTGlnaHQgJiYgZGF0YS5jdXN0b21Mb2dvKSB7XG4gICAgICAgICAgYnJhbmRMb2dvRGFyay5zcmMgPSBkYXRhLmN1c3RvbUxvZ287XG4gICAgICAgICAgYnJhbmRMb2dvTGlnaHQuc3JjID0gZGF0YS5jdXN0b21Mb2dvO1xuICAgICAgICAgIHByZXZpZXdEYXJrLnNyYyA9IGRhdGEuY3VzdG9tTG9nbztcbiAgICAgICAgICBwcmV2aWV3TGlnaHQuc3JjID0gZGF0YS5jdXN0b21Mb2dvO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZGF0YS5pc0RlZmF1bHQpIHtcbiAgICAgICAgICBsb2dvU3RhdHVzLnRleHRDb250ZW50ID0gJ1VzaW5nIGN1c3RvbSBsb2dvJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0YS5wb3NpdGlvbikge1xuICAgICAgICAgIGN1cnJlbnRQb3NpdGlvbiA9IGRhdGEucG9zaXRpb247XG4gICAgICAgICAgYXBwbHlMb2dvUG9zaXRpb24oZGF0YS5wb3NpdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRhdGEuZGFzaGJvYXJkVGl0bGUpIHtcbiAgICAgICAgICBhcHBseURhc2hib2FyZFRpdGxlKGRhdGEuZGFzaGJvYXJkVGl0bGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignQ291bGQgbm90IGxvYWQgY3VzdG9tIGxvZ286JywgZXJyb3IubWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gUG9zaXRpb24gYnV0dG9uIGhhbmRsZXJzXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5sb2dvLXBvcy1idG4nKS5mb3JFYWNoKGJ0biA9PiB7XG4gICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgY3VycmVudFBvc2l0aW9uID0gYnRuLmRhdGFzZXQucG9zO1xuICAgICAgYXBwbHlMb2dvUG9zaXRpb24oY3VycmVudFBvc2l0aW9uKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gT3BlbiBsb2dvIG1vZGFsIG9uIGJyYW5kIGNsaWNrXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdicmFuZCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBwZW5kaW5nRGFya0RhdGEgPSBudWxsO1xuICAgIHBlbmRpbmdMaWdodERhdGEgPSBudWxsO1xuICAgIHBlbmRpbmdTaW5nbGVEYXRhID0gbnVsbDtcbiAgICBpZiAodXBsb2FkRGFyaykgdXBsb2FkRGFyay52YWx1ZSA9ICcnO1xuICAgIGlmICh1cGxvYWRMaWdodCkgdXBsb2FkTGlnaHQudmFsdWUgPSAnJztcbiAgICBpZiAodXBsb2FkU2luZ2xlKSB1cGxvYWRTaW5nbGUudmFsdWUgPSAnJztcbiAgICAvLyBSZXNldCBjaGVja2JveCB0byBkdWFsIG1vZGVcbiAgICBpZiAoc2FtZUJvdGhDaGVja2JveCkgc2FtZUJvdGhDaGVja2JveC5jaGVja2VkID0gZmFsc2U7XG4gICAgZHVhbFVwbG9hZHMuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgICBzaW5nbGVVcGxvYWQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAvLyBSZXNldCBwcmV2aWV3cyB0byBjdXJyZW50IGhlYWRlciBsb2dvc1xuICAgIHByZXZpZXdEYXJrLnNyYyA9IGJyYW5kTG9nb0Rhcmsuc3JjO1xuICAgIHByZXZpZXdMaWdodC5zcmMgPSBicmFuZExvZ29MaWdodC5zcmM7XG4gICAgY29uc3QgaXNDdXN0b20gPSBicmFuZExvZ29EYXJrLnNyYy5pbmNsdWRlcygnY3VzdG9tLWxvZ28nKSB8fCBicmFuZExvZ29MaWdodC5zcmMuaW5jbHVkZXMoJ2N1c3RvbS1sb2dvJyk7XG4gICAgbG9nb1N0YXR1cy50ZXh0Q29udGVudCA9IGlzQ3VzdG9tID8gJ1VzaW5nIGN1c3RvbSBsb2dvJyA6ICdVc2luZyBkZWZhdWx0IGxvZ29zJztcbiAgICBhcHBseUxvZ29Qb3NpdGlvbihjdXJyZW50UG9zaXRpb24pO1xuICAgIGRhc2hib2FyZFRpdGxlSW5wdXQudmFsdWUgPSBjdXJyZW50VGl0bGU7XG4gICAgbG9nb01vZGFsLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgfSk7XG5cbiAgLy8gU2F2ZSBsb2dvLCBwb3NpdGlvbiwgYW5kIHRpdGxlXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dvLXNhdmUnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG5ld1RpdGxlID0gZGFzaGJvYXJkVGl0bGVJbnB1dC52YWx1ZS50cmltKCkgfHwgREVGQVVMVF9USVRMRTtcbiAgICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICAgIHBvc2l0aW9uOiBjdXJyZW50UG9zaXRpb24sXG4gICAgICAgIGRhc2hib2FyZFRpdGxlOiBuZXdUaXRsZVxuICAgICAgfTtcblxuICAgICAgLy8gRGV0ZXJtaW5lIHdoaWNoIGxvZ28gZGF0YSB0byBzZW5kXG4gICAgICBpZiAoc2FtZUJvdGhDaGVja2JveD8uY2hlY2tlZCAmJiBwZW5kaW5nU2luZ2xlRGF0YSkge1xuICAgICAgICAvLyBTaW5nbGUgbG9nbyBmb3IgYm90aCB2YXJpYW50c1xuICAgICAgICBwYXlsb2FkLmRhdGFEYXJrID0gcGVuZGluZ1NpbmdsZURhdGE7XG4gICAgICAgIHBheWxvYWQuZGF0YUxpZ2h0ID0gcGVuZGluZ1NpbmdsZURhdGE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocGVuZGluZ0RhcmtEYXRhKSBwYXlsb2FkLmRhdGFEYXJrID0gcGVuZGluZ0RhcmtEYXRhO1xuICAgICAgICBpZiAocGVuZGluZ0xpZ2h0RGF0YSkgcGF5bG9hZC5kYXRhTGlnaHQgPSBwZW5kaW5nTGlnaHREYXRhO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2xvZ28nLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocGF5bG9hZClcbiAgICAgIH0pO1xuXG4gICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgY29uc3QgdCA9ICc/dD0nICsgRGF0ZS5ub3coKTtcbiAgICAgICAgaWYgKGRhdGEucGF0aERhcmspIHtcbiAgICAgICAgICBicmFuZExvZ29EYXJrLnNyYyA9IGRhdGEucGF0aERhcmsgKyB0O1xuICAgICAgICAgIHByZXZpZXdEYXJrLnNyYyA9IGRhdGEucGF0aERhcmsgKyB0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhLnBhdGhMaWdodCkge1xuICAgICAgICAgIGJyYW5kTG9nb0xpZ2h0LnNyYyA9IGRhdGEucGF0aExpZ2h0ICsgdDtcbiAgICAgICAgICBwcmV2aWV3TGlnaHQuc3JjID0gZGF0YS5wYXRoTGlnaHQgKyB0O1xuICAgICAgICB9XG4gICAgICAgIGFwcGx5TG9nb1Bvc2l0aW9uKGN1cnJlbnRQb3NpdGlvbik7XG4gICAgICAgIGFwcGx5RGFzaGJvYXJkVGl0bGUobmV3VGl0bGUpO1xuICAgICAgICBsb2dvTW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oJ0ZhaWxlZCB0byBzYXZlOiAnICsgZXJyb3IuZXJyb3IsICdlcnJvcicpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdFcnJvciBzYXZpbmc6ICcgKyBlcnJvci5tZXNzYWdlLCAnZXJyb3InKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIFJlc2V0IGFsbCBicmFuZGluZyB0byBkZWZhdWx0c1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9nby1yZXNldCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWNvbmZpcm0oJ1Jlc2V0IGFsbCBicmFuZGluZyB0byBEYXNoQ2FkZHkgZGVmYXVsdHM/XFxuXFxuVGhpcyB3aWxsIHJlc2V0IHRoZSBsb2dvLCBmYXZpY29uLCB0aXRsZSwgYW5kIHBvc2l0aW9uLicpKSByZXR1cm47XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgbG9nb1Jlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvbG9nbycsIHsgbWV0aG9kOiAnREVMRVRFJyB9KTtcbiAgICAgIGlmIChsb2dvUmVzcG9uc2Uub2spIHtcbiAgICAgICAgYnJhbmRMb2dvRGFyay5zcmMgPSAnL2Fzc2V0cy9kYXNoY2FkZHktbG9nby1kYXJrLnBuZyc7XG4gICAgICAgIGJyYW5kTG9nb0xpZ2h0LnNyYyA9ICcvYXNzZXRzL2Rhc2hjYWRkeS1sb2dvLWxpZ2h0LnBuZyc7XG4gICAgICAgIHByZXZpZXdEYXJrLnNyYyA9ICcvYXNzZXRzL2Rhc2hjYWRkeS1sb2dvLWRhcmsucG5nJztcbiAgICAgICAgcHJldmlld0xpZ2h0LnNyYyA9ICcvYXNzZXRzL2Rhc2hjYWRkeS1sb2dvLWxpZ2h0LnBuZyc7XG4gICAgICAgIGxvZ29TdGF0dXMudGV4dENvbnRlbnQgPSAnVXNpbmcgZGVmYXVsdCBsb2dvcyc7XG4gICAgICAgIHBlbmRpbmdEYXJrRGF0YSA9IG51bGw7XG4gICAgICAgIHBlbmRpbmdMaWdodERhdGEgPSBudWxsO1xuICAgICAgICBwZW5kaW5nU2luZ2xlRGF0YSA9IG51bGw7XG4gICAgICAgIGRhc2hib2FyZFRpdGxlSW5wdXQudmFsdWUgPSBERUZBVUxUX1RJVExFO1xuICAgICAgICBhcHBseURhc2hib2FyZFRpdGxlKERFRkFVTFRfVElUTEUpO1xuICAgICAgICBjdXJyZW50UG9zaXRpb24gPSAnbGVmdCc7XG4gICAgICAgIGFwcGx5TG9nb1Bvc2l0aW9uKCdsZWZ0Jyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZhdmljb25SZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2Zhdmljb24nLCB7IG1ldGhvZDogJ0RFTEVURScgfSk7XG4gICAgICBpZiAoZmF2aWNvblJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGNvbnN0IGZhdmljb25MaW5rID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbGlua1tyZWw9XCJpY29uXCJdJyk7XG4gICAgICAgIGNvbnN0IGZhdmljb25QcmV2aWV3ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Zhdmljb24tcHJldmlldycpO1xuICAgICAgICBjb25zdCBmYXZpY29uU3RhdHVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Zhdmljb24tc3RhdHVzJyk7XG4gICAgICAgIGlmIChmYXZpY29uTGluaykgZmF2aWNvbkxpbmsuaHJlZiA9ICcvYXNzZXRzL2Rhc2hjYWRkeS1mYXZpY29uLmljbz90PScgKyBEYXRlLm5vdygpO1xuICAgICAgICBpZiAoZmF2aWNvblByZXZpZXcpIGZhdmljb25QcmV2aWV3LnNyYyA9ICcvYXNzZXRzL2Rhc2hjYWRkeS1mYXZpY29uLmljbz90PScgKyBEYXRlLm5vdygpO1xuICAgICAgICBpZiAoZmF2aWNvblN0YXR1cykgZmF2aWNvblN0YXR1cy50ZXh0Q29udGVudCA9ICdVc2luZyBEYXNoQ2FkZHkgZmF2aWNvbic7XG4gICAgICAgIHBlbmRpbmdGYXZpY29uRGF0YSA9IG51bGw7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ0Vycm9yIHJlc2V0dGluZyBicmFuZGluZzogJyArIGVycm9yLm1lc3NhZ2UsICdlcnJvcicpO1xuICAgIH1cbiAgfSk7XG5cbiAgd2lyZU1vZGFsKGxvZ29Nb2RhbCwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ28tY2FuY2VsJykpO1xuXG4gIC8vID09PT09IEZBVklDT04gSEFORExJTkcgPT09PT1cbiAgY29uc3QgZmF2aWNvblByZXZpZXcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmF2aWNvbi1wcmV2aWV3Jyk7XG4gIGNvbnN0IGZhdmljb25TdGF0dXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmF2aWNvbi1zdGF0dXMnKTtcbiAgY29uc3QgZmF2aWNvblVwbG9hZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmYXZpY29uLXVwbG9hZCcpO1xuICBjb25zdCBmYXZpY29uTGluayA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2xpbmtbcmVsPVwiaWNvblwiXScpIHx8IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTtcbiAgbGV0IHBlbmRpbmdGYXZpY29uRGF0YSA9IG51bGw7XG5cbiAgaWYgKCFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdsaW5rW3JlbD1cImljb25cIl0nKSkge1xuICAgIGZhdmljb25MaW5rLnJlbCA9ICdpY29uJztcbiAgICBmYXZpY29uTGluay5ocmVmID0gJy9hc3NldHMvZGFzaGNhZGR5LWZhdmljb24uaWNvJztcbiAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGZhdmljb25MaW5rKTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRDdXN0b21GYXZpY29uKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2Zhdmljb24nKTtcbiAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICBpZiAoZGF0YS5jdXN0b21GYXZpY29uKSB7XG4gICAgICAgICAgZmF2aWNvbkxpbmsuaHJlZiA9IGRhdGEuY3VzdG9tRmF2aWNvbiArICc/dD0nICsgRGF0ZS5ub3coKTtcbiAgICAgICAgICBmYXZpY29uUHJldmlldy5zcmMgPSBkYXRhLmN1c3RvbUZhdmljb24gKyAnP3Q9JyArIERhdGUubm93KCk7XG4gICAgICAgICAgZmF2aWNvblN0YXR1cy50ZXh0Q29udGVudCA9ICdVc2luZyBjdXN0b20gZmF2aWNvbic7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdDb3VsZCBub3QgbG9hZCBjdXN0b20gZmF2aWNvbjonLCBlcnJvci5tZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICBmYXZpY29uVXBsb2FkPy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoZSkgPT4ge1xuICAgIGNvbnN0IGZpbGUgPSBlLnRhcmdldC5maWxlc1swXTtcbiAgICBpZiAoIWZpbGUpIHJldHVybjtcbiAgICBpZiAoIWZpbGUudHlwZS5tYXRjaCgvXmltYWdlXFwvKHBuZ3xzdmdcXCt4bWwpJC8pKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdQbGVhc2Ugc2VsZWN0IGEgUE5HIG9yIFNWRyBmaWxlJywgJ3dhcm5pbmcnKTtcbiAgICAgIGZhdmljb25VcGxvYWQudmFsdWUgPSAnJztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICByZWFkZXIub25sb2FkID0gKGV2ZW50KSA9PiB7XG4gICAgICBwZW5kaW5nRmF2aWNvbkRhdGEgPSBldmVudC50YXJnZXQucmVzdWx0O1xuICAgICAgZmF2aWNvblByZXZpZXcuc3JjID0gcGVuZGluZ0Zhdmljb25EYXRhO1xuICAgICAgZmF2aWNvblN0YXR1cy50ZXh0Q29udGVudCA9ICdOZXcgZmF2aWNvbiByZWFkeSB0byBzYXZlJztcbiAgICB9O1xuICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xuICB9KTtcblxuICAvLyBTYXZlIGZhdmljb24gYWxvbmdzaWRlIGxvZ28gc2F2ZVxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9nby1zYXZlJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmIChwZW5kaW5nRmF2aWNvbkRhdGEpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvZmF2aWNvbicsIHtcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGRhdGE6IHBlbmRpbmdGYXZpY29uRGF0YSB9KVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICBmYXZpY29uTGluay5ocmVmID0gZGF0YS5wYXRoICsgJz90PScgKyBEYXRlLm5vdygpO1xuICAgICAgICAgIGZhdmljb25QcmV2aWV3LnNyYyA9IGRhdGEucGF0aCArICc/dD0nICsgRGF0ZS5ub3coKTtcbiAgICAgICAgICBmYXZpY29uU3RhdHVzLnRleHRDb250ZW50ID0gJ1VzaW5nIGN1c3RvbSBmYXZpY29uJztcbiAgICAgICAgICBwZW5kaW5nRmF2aWNvbkRhdGEgPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgIHNob3dOb3RpZmljYXRpb24oJ0ZhaWxlZCB0byBzYXZlIGZhdmljb246ICcgKyBlcnJvci5lcnJvciwgJ2Vycm9yJyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oJ0Vycm9yIHNhdmluZyBmYXZpY29uOiAnICsgZXJyb3IubWVzc2FnZSwgJ2Vycm9yJyk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICBsb2FkQ3VzdG9tRmF2aWNvbigpO1xuICBsb2FkQ3VzdG9tTG9nbygpO1xuXG4gIC8vID09PT09IFRJTUVaT05FIFNFVFRJTkcgPT09PT1cbiAgY29uc3Qgc2V0dGluZ3NUelNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR0aW5ncy10aW1lem9uZScpO1xuICBpZiAoc2V0dGluZ3NUelNlbGVjdCkge1xuICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgaWYgKGxvZ29Nb2RhbC5jbGFzc0xpc3QuY29udGFpbnMoJ3Nob3cnKSAmJiBzZXR0aW5nc1R6U2VsZWN0Lm9wdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgbGV0IGN1cnJlbnRUejtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvY29uZmlnJyk7XG4gICAgICAgICAgICBpZiAocmVzLm9rKSB7IGNvbnN0IGNmZyA9IGF3YWl0IHJlcy5qc29uKCk7IGN1cnJlbnRUeiA9IGNmZy50aW1lem9uZTsgfVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgLyogaWdub3JlICovIH1cbiAgICAgICAgICB3aW5kb3cucG9wdWxhdGVUaW1lem9uZVNlbGVjdChzZXR0aW5nc1R6U2VsZWN0LCBjdXJyZW50VHopO1xuICAgICAgICB9KSgpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIG9ic2VydmVyLm9ic2VydmUobG9nb01vZGFsLCB7IGF0dHJpYnV0ZXM6IHRydWUsIGF0dHJpYnV0ZUZpbHRlcjogWydjbGFzcyddIH0pO1xuXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ28tc2F2ZScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR6ID0gc2V0dGluZ3NUelNlbGVjdC52YWx1ZTtcbiAgICAgIGlmICghdHopIHJldHVybjtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2NvbmZpZycpO1xuICAgICAgICBpZiAoIXJlcy5vaykgcmV0dXJuO1xuICAgICAgICBjb25zdCBjZmcgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICBjZmcudGltZXpvbmUgPSB0ejtcbiAgICAgICAgY2ZnLnVwZGF0ZWRBdCA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcbiAgICAgICAgYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvY29uZmlnJywge1xuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGNmZylcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIHNhdmUgdGltZXpvbmU6JywgZS5tZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufSkoKTtcbjtcbi8vIFNoYXJlZCB0aW1lem9uZSB1dGlsaXR5IFx1MjAxNCB1c2VkIGJ5IHNldHVwIHdpemFyZCBhbmQgc2V0dGluZ3MgbW9kYWxcbi8vIGVycm9ySGFuZGxlciBpcyBkZWNsYXJlZCBnbG9iYWxseSBpbiBnbG9iYWxzLmpzIChjb3JlLmpzIGJ1bmRsZSk7IHJldXNpbmcgaXRcbi8vIGhlcmUgc28gd2UgZG9uJ3QgZ2V0IFwicmVkZWNsYXJhdGlvbiBvZiBjb25zdCBlcnJvckhhbmRsZXJcIiBhdCBzY3JpcHQgc2NvcGUuXG5cbndpbmRvdy5wb3B1bGF0ZVRpbWV6b25lU2VsZWN0ID0gZnVuY3Rpb24oc2VsZWN0RWwsIHNlbGVjdGVkVHopIHtcbiAgY29uc3QgdGltZXpvbmVzID0gSW50bC5zdXBwb3J0ZWRWYWx1ZXNPZigndGltZVpvbmUnKTtcbiAgY29uc3QgZGV0ZWN0ZWQgPSBzZWxlY3RlZFR6IHx8IEludGwuRGF0ZVRpbWVGb3JtYXQoKS5yZXNvbHZlZE9wdGlvbnMoKS50aW1lWm9uZSB8fCAnVVRDJztcbiAgc2VsZWN0RWwuaW5uZXJIVE1MID0gJyc7XG4gIGZvciAoY29uc3QgdHogb2YgdGltZXpvbmVzKSB7XG4gICAgY29uc3Qgb3B0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb3B0aW9uJyk7XG4gICAgb3B0LnZhbHVlID0gdHo7XG4gICAgb3B0LnRleHRDb250ZW50ID0gdHoucmVwbGFjZSgvXy9nLCAnICcpO1xuICAgIGlmICh0eiA9PT0gZGV0ZWN0ZWQpIG9wdC5zZWxlY3RlZCA9IHRydWU7XG4gICAgc2VsZWN0RWwuYXBwZW5kQ2hpbGQob3B0KTtcbiAgfVxufTtcblxuLy8gU2V0dXAgV2l6YXJkIFN5c3RlbSAtIFNlcnZlci1zaWRlIGNvbmZpZyBzdG9yYWdlXG4oZnVuY3Rpb24gKCkge1xuICBsZXQgY3VycmVudENvbmZpZ1R5cGUgPSAnaG9tZWxhYic7XG4gIGxldCBzZXJ2ZXJDb25maWcgPSBudWxsO1xuXG4gIC8vIENoZWNrIHNlcnZlciBmb3IgZXhpc3RpbmcgY29uZmlnIG9uIHBhZ2UgbG9hZFxuICBhc3luYyBmdW5jdGlvbiBjaGVja1NlcnZlckNvbmZpZygpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9jb25maWcnKTtcbiAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICBzZXJ2ZXJDb25maWcgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIGlmIChzZXJ2ZXJDb25maWcgJiYgc2VydmVyQ29uZmlnLnNldHVwQ29tcGxldGUpIHtcbiAgICAgICAgICAvLyBDb25maWcgZXhpc3RzIG9uIHNlcnZlciAtIGRvbid0IHNob3cgd2l6YXJkXG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLXdpemFyZCcpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdDb3VsZCBub3QgZmV0Y2ggc2VydmVyIGNvbmZpZywgY2hlY2tpbmcgbG9jYWxTdG9yYWdlIGZhbGxiYWNrOicsIGVycm9yLm1lc3NhZ2UpO1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrOiBjaGVjayBsb2NhbFN0b3JhZ2UgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gICAgY29uc3QgbG9jYWxTZXR1cCA9IHNhZmVHZXQoJ2Rhc2hjYWRkeS1zZXR1cCcpO1xuICAgIGlmIChsb2NhbFNldHVwKSB7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtd2l6YXJkJykuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIE5vIGNvbmZpZyBmb3VuZCAtIHNob3cgd2l6YXJkXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLXdpemFyZCcpLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gSW5pdGlhbGl6ZSBvbiBwYWdlIGxvYWRcbiAgY2hlY2tTZXJ2ZXJDb25maWcoKTtcblxuICAvLyBQb3B1bGF0ZSB0aW1lem9uZSBkcm9wZG93biB3aXRoIGF1dG8tZGV0ZWN0aW9uXG4gIGNvbnN0IHNldHVwVHpTZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtdGltZXpvbmUnKTtcbiAgaWYgKHNldHVwVHpTZWxlY3QpIHdpbmRvdy5wb3B1bGF0ZVRpbWV6b25lU2VsZWN0KHNldHVwVHpTZWxlY3QpO1xuXG4gIC8vIFN0ZXAgbmF2aWdhdGlvblxuICBmdW5jdGlvbiBzaG93U3RlcChzdGVwSWQpIHtcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc2V0dXAtc3RlcCcpLmZvckVhY2goc3RlcCA9PiB7XG4gICAgICBzdGVwLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgfSk7XG4gICAgY29uc3QgdGFyZ2V0U3RlcCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHN0ZXBJZCk7XG4gICAgaWYgKHRhcmdldFN0ZXApIHtcbiAgICAgIHRhcmdldFN0ZXAuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgfVxuICB9XG5cbiAgLy8gU2hvdyBzdW1tYXJ5XG4gIGZ1bmN0aW9uIHNob3dTdW1tYXJ5KCkge1xuICAgIGNvbnN0IHN1bW1hcnlDb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLXN1bW1hcnktY29udGVudCcpO1xuICAgIGlmICghc3VtbWFyeUNvbnRlbnQpIHJldHVybjtcblxuICAgIGxldCBodG1sID0gJzxkaXYgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBnYXA6IDIwcHg7XCI+JztcblxuICAgIGlmIChjdXJyZW50Q29uZmlnVHlwZSA9PT0gJ2hvbWVsYWInKSB7XG4gICAgICBjb25zdCB0bGQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtdGxkJyk/LnZhbHVlPy50cmltKCkgfHwgJy5ob21lJztcbiAgICAgIGNvbnN0IGNhTmFtZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1jYS1uYW1lJyk/LnZhbHVlPy50cmltKCkgfHwgJyc7XG4gICAgICBjb25zdCBkbnNJUCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1kbnMtaXAnKT8udmFsdWU/LnRyaW0oKSB8fCAnJztcbiAgICAgIGNvbnN0IGRuc1BvcnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtZG5zLXBvcnQnKT8udmFsdWU/LnRyaW0oKSB8fCBEQy5ERUZBVUxUUy5ETlNfUE9SVDtcblxuICAgICAgaHRtbCArPSBgXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGgzIHN0eWxlPVwibWFyZ2luOiAwIDAgMTJweDsgY29sb3I6IHZhcigtLWFjY2VudCk7XCI+SG9tZSBMYWIgQ29uZmlndXJhdGlvbjwvaDM+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGdyaWQ7IGdhcDogMTJweDsgZm9udC1zaXplOiAwLjk1cmVtO1wiPlxuICAgICAgICAgICAgPGRpdj48c3Ryb25nPlRMRDo8L3N0cm9uZz4gJHt0bGR9PC9kaXY+XG4gICAgICAgICAgICA8ZGl2PjxzdHJvbmc+Q2VydGlmaWNhdGUgQXV0aG9yaXR5Ojwvc3Ryb25nPiAke2NhTmFtZX08L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+PHN0cm9uZz5ETlMgU2VydmVyOjwvc3Ryb25nPiAke2Ruc0lQfToke2Ruc1BvcnR9PC9kaXY+XG4gICAgICAgICAgICA8ZGl2PjxzdHJvbmc+RXhhbXBsZSBVUkxzOjwvc3Ryb25nPiBodHRwczovL3VwdGltZSR7dGxkfSwgaHR0cHM6Ly9uZXh0Y2xvdWQke3RsZH08L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICBgO1xuICAgIH0gZWxzZSBpZiAoY3VycmVudENvbmZpZ1R5cGUgPT09ICdzaW1wbGUnKSB7XG4gICAgICBjb25zdCBpcCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1zaW1wbGUtaXAnKT8udmFsdWU/LnRyaW0oKSB8fCAnbG9jYWxob3N0JztcblxuICAgICAgaHRtbCArPSBgXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGgzIHN0eWxlPVwibWFyZ2luOiAwIDAgMTJweDsgY29sb3I6IHZhcigtLWFjY2VudCk7XCI+U2ltcGxlIFNldHVwPC9oMz5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ2FwOiAxMnB4OyBmb250LXNpemU6IDAuOTVyZW07XCI+XG4gICAgICAgICAgICA8ZGl2PjxzdHJvbmc+QWNjZXNzIE1ldGhvZDo8L3N0cm9uZz4gSVA6UG9ydCBvbmx5PC9kaXY+XG4gICAgICAgICAgICA8ZGl2PjxzdHJvbmc+RGVmYXVsdCBJUDo8L3N0cm9uZz4gJHtpcH08L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+PHN0cm9uZz5TU0w6PC9zdHJvbmc+IE5vbmUgKEhUVFAgb25seSk8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+PHN0cm9uZz5FeGFtcGxlIFVSTHM6PC9zdHJvbmc+IGh0dHA6Ly8ke2lwfTo4MDgwLCBodHRwOi8vJHtpcH06MzAwMDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIGA7XG4gICAgfSBlbHNlIGlmIChjdXJyZW50Q29uZmlnVHlwZSA9PT0gJ3B1YmxpYycpIHtcbiAgICAgIGNvbnN0IGRvbWFpbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1wdWJsaWMtZG9tYWluJyk/LnZhbHVlPy50cmltKCkgfHwgJyc7XG4gICAgICBjb25zdCBlbWFpbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1wdWJsaWMtZW1haWwnKT8udmFsdWU/LnRyaW0oKSB8fCAnJztcbiAgICAgIGNvbnN0IHJvdXRpbmdNb2RlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaW5wdXRbbmFtZT1cInJvdXRpbmctbW9kZVwiXTpjaGVja2VkJyk/LnZhbHVlIHx8ICdzdWJkaXJlY3RvcnknO1xuICAgICAgY29uc3QgZXhhbXBsZVVybHMgPSByb3V0aW5nTW9kZSA9PT0gJ3N1YmRpcmVjdG9yeSdcbiAgICAgICAgPyBgaHR0cHM6Ly8ke2RvbWFpbn0vc29uYXJyLCBodHRwczovLyR7ZG9tYWlufS9ncmFmYW5hYFxuICAgICAgICA6IGBodHRwczovL3NvbmFyci4ke2RvbWFpbn0sIGh0dHBzOi8vZ3JhZmFuYS4ke2RvbWFpbn1gO1xuICAgICAgY29uc3Qgcm91dGluZ0xhYmVsID0gcm91dGluZ01vZGUgPT09ICdzdWJkaXJlY3RvcnknID8gJ1N1YmRpcmVjdG9yeSAoZG9tYWluLmNvbS9hcHApJyA6ICdTdWJkb21haW4gKGFwcC5kb21haW4uY29tKSc7XG5cbiAgICAgIGh0bWwgKz0gYFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxoMyBzdHlsZT1cIm1hcmdpbjogMCAwIDEycHg7IGNvbG9yOiB2YXIoLS1hY2NlbnQpO1wiPlB1YmxpYyBTZXJ2ZXI8L2gzPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBnYXA6IDEycHg7IGZvbnQtc2l6ZTogMC45NXJlbTtcIj5cbiAgICAgICAgICAgIDxkaXY+PHN0cm9uZz5Eb21haW46PC9zdHJvbmc+ICR7ZG9tYWlufTwvZGl2PlxuICAgICAgICAgICAgPGRpdj48c3Ryb25nPlNTTDo8L3N0cm9uZz4gTGV0J3MgRW5jcnlwdDwvZGl2PlxuICAgICAgICAgICAgPGRpdj48c3Ryb25nPkVtYWlsOjwvc3Ryb25nPiAke2VtYWlsfTwvZGl2PlxuICAgICAgICAgICAgPGRpdj48c3Ryb25nPlJvdXRpbmc6PC9zdHJvbmc+ICR7cm91dGluZ0xhYmVsfTwvZGl2PlxuICAgICAgICAgICAgPGRpdj48c3Ryb25nPkV4YW1wbGUgVVJMczo8L3N0cm9uZz4gJHtleGFtcGxlVXJsc308L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICBgO1xuICAgIH1cblxuICAgIC8vIFRpbWV6b25lICh1bml2ZXJzYWwgYWNyb3NzIGFsbCBjb25maWcgdHlwZXMpXG4gICAgY29uc3QgdHogPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtdGltZXpvbmUnKT8udmFsdWUgfHwgSW50bC5EYXRlVGltZUZvcm1hdCgpLnJlc29sdmVkT3B0aW9ucygpLnRpbWVab25lIHx8ICdVVEMnO1xuICAgIGh0bWwgKz0gYFxuICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDhweDsgcGFkZGluZy10b3A6IDEycHg7IGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjk1cmVtO1wiPjxzdHJvbmc+VGltZXpvbmU6PC9zdHJvbmc+ICR7dHoucmVwbGFjZSgvXy9nLCAnICcpfTwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgYDtcblxuICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gICAgc3VtbWFyeUNvbnRlbnQuaW5uZXJIVE1MID0gaHRtbDtcbiAgICBzaG93U3RlcCgnc2V0dXAtc3RlcC1zdW1tYXJ5Jyk7XG4gIH1cblxuICAvLyBTYXZlIGNvbmZpZyB0byBzZXJ2ZXJcbiAgYXN5bmMgZnVuY3Rpb24gc2F2ZUNvbmZpZ1RvU2VydmVyKGNvbmZpZykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2NvbmZpZycsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShjb25maWcpXG4gICAgICB9KTtcblxuICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvckhhbmRsZXIubG9nRXJyb3IoJ1tTZXR1cFdpemFyZF0gU2F2ZSBDb25maWcnLCBuZXcgRXJyb3IoYFNlcnZlciByZXR1cm5lZCAke3Jlc3BvbnNlLnN0YXR1c31gKSwgeyBmdW5jdGlvbjogJ3NhdmVDb25maWdUb1NlcnZlcicgfSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgZXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdbU2V0dXBXaXphcmRdIFNhdmUgQ29uZmlnJywgZXJyb3IsIHsgZnVuY3Rpb246ICdzYXZlQ29uZmlnVG9TZXJ2ZXInIH0pO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8vIEZpbmlzaCBzZXR1cCBoYW5kbGVyXG4gIGFzeW5jIGZ1bmN0aW9uIGZpbmlzaFNldHVwKCkge1xuICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgIHNldHVwQ29tcGxldGU6IHRydWUsXG4gICAgICBjb25maWd1cmF0aW9uVHlwZTogY3VycmVudENvbmZpZ1R5cGUsXG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIHRpbWV6b25lOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtdGltZXpvbmUnKT8udmFsdWUgfHwgSW50bC5EYXRlVGltZUZvcm1hdCgpLnJlc29sdmVkT3B0aW9ucygpLnRpbWVab25lIHx8ICdVVEMnXG4gICAgfTtcblxuICAgIGlmIChjdXJyZW50Q29uZmlnVHlwZSA9PT0gJ2hvbWVsYWInKSB7XG4gICAgICBjb25maWcudGxkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLXRsZCcpPy52YWx1ZT8udHJpbSgpIHx8ICcuaG9tZSc7XG4gICAgICBjb25maWcuY2FOYW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLWNhLW5hbWUnKT8udmFsdWU/LnRyaW0oKSB8fCAnJztcbiAgICAgIGNvbnN0IHNlbGVjdGVkUHJvdmlkZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtZG5zLXByb3ZpZGVyJyk/LnZhbHVlIHx8ICd0ZWNobml0aXVtJztcbiAgICAgIGNvbmZpZy5kbnMgPSB7XG4gICAgICAgIHByb3ZpZGVyOiBzZWxlY3RlZFByb3ZpZGVyLFxuICAgICAgICBpcDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLWRucy1pcCcpPy52YWx1ZT8udHJpbSgpIHx8ICcnLFxuICAgICAgICBwb3J0OiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtZG5zLXBvcnQnKT8udmFsdWU/LnRyaW0oKSB8fCBEQy5ERUZBVUxUUy5ETlNfUE9SVCxcbiAgICAgICAgdG9rZW46IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1kbnMtdG9rZW4nKT8udmFsdWU/LnRyaW0oKSB8fCAnJ1xuICAgICAgfTtcbiAgICAgIGNvbmZpZy5kZWZhdWx0cyA9IHtcbiAgICAgICAgZG5zVHlwZTogJ3ByaXZhdGUnLFxuICAgICAgICBzc2xUeXBlOiAnaW50ZXJuYWwnLFxuICAgICAgICB0YXJnZXRJUDogJ2xvY2FsaG9zdCdcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmIChjdXJyZW50Q29uZmlnVHlwZSA9PT0gJ3NpbXBsZScpIHtcbiAgICAgIGNvbmZpZy5kZWZhdWx0SVAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtc2ltcGxlLWlwJyk/LnZhbHVlPy50cmltKCkgfHwgJ2xvY2FsaG9zdCc7XG4gICAgICBjb25maWcuZGVmYXVsdHMgPSB7XG4gICAgICAgIGRuc1R5cGU6ICdub25lJyxcbiAgICAgICAgc3NsVHlwZTogJ25vbmUnLFxuICAgICAgICB0YXJnZXRJUDogY29uZmlnLmRlZmF1bHRJUFxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKGN1cnJlbnRDb25maWdUeXBlID09PSAncHVibGljJykge1xuICAgICAgY29uZmlnLmRvbWFpbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1wdWJsaWMtZG9tYWluJyk/LnZhbHVlPy50cmltKCkgfHwgJyc7XG4gICAgICBjb25maWcuZW1haWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtcHVibGljLWVtYWlsJyk/LnZhbHVlPy50cmltKCkgfHwgJyc7XG4gICAgICBjb25maWcucm91dGluZ01vZGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dFtuYW1lPVwicm91dGluZy1tb2RlXCJdOmNoZWNrZWQnKT8udmFsdWUgfHwgJ3N1YmRpcmVjdG9yeSc7XG4gICAgICBjb25maWcuZGVmYXVsdHMgPSB7XG4gICAgICAgIGRuc1R5cGU6IGNvbmZpZy5yb3V0aW5nTW9kZSA9PT0gJ3N1YmRpcmVjdG9yeScgPyAnbm9uZScgOiAncHVibGljJyxcbiAgICAgICAgc3NsVHlwZTogJ2xldHNlbmNyeXB0JyxcbiAgICAgICAgdGFyZ2V0SVA6ICdsb2NhbGhvc3QnXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIFNhdmUgdG8gc2VydmVyIChwcmltYXJ5KSBhbmQgbG9jYWxTdG9yYWdlIChmYWxsYmFjaylcbiAgICBjb25zdCBzYXZlZFRvU2VydmVyID0gYXdhaXQgc2F2ZUNvbmZpZ1RvU2VydmVyKGNvbmZpZyk7XG4gICAgc2FmZVNldCgnZGFzaGNhZGR5LWNvbmZpZycsIEpTT04uc3RyaW5naWZ5KGNvbmZpZykpO1xuICAgIHNhZmVTZXQoJ2Rhc2hjYWRkeS1zZXR1cCcsICdjb21wbGV0ZWQnKTtcblxuICAgIC8vIEhpZGUgd2l6YXJkXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLXdpemFyZCcpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgICAvLyBTaG93IHN1Y2Nlc3Mgbm90aWZpY2F0aW9uXG4gICAgY29uc3QgY29uZmlnTmFtZSA9IGN1cnJlbnRDb25maWdUeXBlID09PSAnaG9tZWxhYicgPyAnUHJvZmVzc2lvbmFsIEhvbWUgTGFiJyA6XG4gICAgICAgICAgICAgICAgICAgICAgY3VycmVudENvbmZpZ1R5cGUgPT09ICdzaW1wbGUnID8gJ1NpbXBsZSBTZXR1cCcgOiAnUHVibGljIFNlcnZlcic7XG4gICAgY29uc3Qgc2F2ZUxvY2F0aW9uID0gc2F2ZWRUb1NlcnZlciA/ICdzZXJ2ZXIgKHNoYXJlZCBhY3Jvc3MgYWxsIGRldmljZXMpJyA6ICdsb2NhbGx5ICh0aGlzIGJyb3dzZXIgb25seSknO1xuXG4gICAgc2hvd05vdGlmaWNhdGlvbihgU2V0dXAgQ29tcGxldGUhIENvbmZpZ3VyZWQgZm9yOiAke2NvbmZpZ05hbWV9LiBTZXR0aW5ncyBzYXZlZCB0bzogJHtzYXZlTG9jYXRpb259YCwgJ3N1Y2Nlc3MnLCA1MDAwKTtcblxuICAgIC8vIFJlbG9hZCBwYWdlIHRvIGFwcGx5IGNvbmZpZ3VyYXRpb25cbiAgICBzZXRUaW1lb3V0KCgpID0+IGxvY2F0aW9uLnJlbG9hZCgpLCA1MDApO1xuICB9XG5cbiAgLy8gPT09PT0gRXZlbnQgSGFuZGxlcnMgdXNpbmcgZGlyZWN0IG9uY2xpY2sgZm9yIHJlbGlhYmlsaXR5ID09PT09XG5cbiAgLy8gU3RlcCAxOiBDb250aW51ZSBidXR0b25cbiAgY29uc3Qgc3RlcDFOZXh0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLXN0ZXAtMS1uZXh0Jyk7XG4gIGlmIChzdGVwMU5leHQpIHtcbiAgICBzdGVwMU5leHQub25jbGljayA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IHNlbGVjdGVkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaW5wdXRbbmFtZT1cImNvbmZpZy10eXBlXCJdOmNoZWNrZWQnKTtcbiAgICAgIGlmIChzZWxlY3RlZCkge1xuICAgICAgICBjdXJyZW50Q29uZmlnVHlwZSA9IHNlbGVjdGVkLnZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKGN1cnJlbnRDb25maWdUeXBlID09PSAnaG9tZWxhYicpIHtcbiAgICAgICAgc2hvd1N0ZXAoJ3NldHVwLXN0ZXAtaG9tZWxhYicpO1xuICAgICAgfSBlbHNlIGlmIChjdXJyZW50Q29uZmlnVHlwZSA9PT0gJ3NpbXBsZScpIHtcbiAgICAgICAgc2hvd1N0ZXAoJ3NldHVwLXN0ZXAtc2ltcGxlJyk7XG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnRDb25maWdUeXBlID09PSAncHVibGljJykge1xuICAgICAgICBzaG93U3RlcCgnc2V0dXAtc3RlcC1wdWJsaWMnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNob3dTdGVwKCdzZXR1cC1zdGVwLWhvbWVsYWInKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLy8gU2tpcCBzZXR1cCBidXR0b25cbiAgY29uc3Qgc2tpcEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1za2lwJyk7XG4gIGlmIChza2lwQnRuKSB7XG4gICAgc2tpcEJ0bi5vbmNsaWNrID0gYXN5bmMgZnVuY3Rpb24oZSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgaWYgKGNvbmZpcm0oJ1NraXAgc2V0dXA/IFlvdSBjYW4gcnVuIGl0IGxhdGVyIGZyb20gU2V0dGluZ3MuJykpIHtcbiAgICAgICAgLy8gU2F2ZSBza2lwIHN0YXR1cyB0byBzZXJ2ZXJcbiAgICAgICAgYXdhaXQgc2F2ZUNvbmZpZ1RvU2VydmVyKHsgc2V0dXBDb21wbGV0ZTogdHJ1ZSwgc2tpcHBlZDogdHJ1ZSwgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkgfSk7XG4gICAgICAgIHNhZmVTZXQoJ2Rhc2hjYWRkeS1zZXR1cCcsICdza2lwcGVkJyk7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC13aXphcmQnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvLyBIb21lIExhYjogVExEIFByZXZpZXdcbiAgY29uc3QgdGxkSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtdGxkJyk7XG4gIGlmICh0bGRJbnB1dCkge1xuICAgIHRsZElucHV0Lm9uaW5wdXQgPSBmdW5jdGlvbihlKSB7XG4gICAgICBjb25zdCB0bGQgPSBlLnRhcmdldC52YWx1ZSB8fCAnLmhvbWUnO1xuICAgICAgY29uc3QgcHJldmlldzEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGxkLXByZXZpZXcnKTtcbiAgICAgIGNvbnN0IHByZXZpZXcyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RsZC1wcmV2aWV3LTInKTtcbiAgICAgIGlmIChwcmV2aWV3MSkgcHJldmlldzEudGV4dENvbnRlbnQgPSB0bGQ7XG4gICAgICBpZiAocHJldmlldzIpIHByZXZpZXcyLnRleHRDb250ZW50ID0gdGxkO1xuICAgIH07XG4gIH1cblxuICAvLyBIb21lIExhYiBuYXZpZ2F0aW9uXG4gIGNvbnN0IGhvbWVsYWJCYWNrID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLWhvbWVsYWItYmFjaycpO1xuICBpZiAoaG9tZWxhYkJhY2spIHtcbiAgICBob21lbGFiQmFjay5vbmNsaWNrID0gZnVuY3Rpb24oZSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgc2hvd1N0ZXAoJ3NldHVwLXN0ZXAtMScpO1xuICAgIH07XG4gIH1cblxuICBjb25zdCBob21lbGFiTmV4dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1ob21lbGFiLW5leHQnKTtcbiAgaWYgKGhvbWVsYWJOZXh0KSB7XG4gICAgaG9tZWxhYk5leHQub25jbGljayA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IHRsZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC10bGQnKT8udmFsdWU/LnRyaW0oKSB8fCAnJztcbiAgICAgIGNvbnN0IGNhTmFtZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1jYS1uYW1lJyk/LnZhbHVlPy50cmltKCkgfHwgJyc7XG4gICAgICBjb25zdCBkbnNJUCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1kbnMtaXAnKT8udmFsdWU/LnRyaW0oKSB8fCAnJztcblxuICAgICAgaWYgKCF0bGQgfHwgIXRsZC5zdGFydHNXaXRoKCcuJykpIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbignUGxlYXNlIGVudGVyIGEgdmFsaWQgVExEIHN0YXJ0aW5nIHdpdGggYSBkb3QgKGUuZy4sIC5ob21lKScsICd3YXJuaW5nJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICghY2FOYW1lKSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oJ1BsZWFzZSBlbnRlciBhIENlcnRpZmljYXRlIEF1dGhvcml0eSBuYW1lJywgJ3dhcm5pbmcnKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKCFkbnNJUCkge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdQbGVhc2UgZW50ZXIgeW91ciBETlMgc2VydmVyIElQIGFkZHJlc3MnLCAnd2FybmluZycpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzaG93U3VtbWFyeSgpO1xuICAgIH07XG4gIH1cblxuICAvLyBTaW1wbGUgbmF2aWdhdGlvblxuICBjb25zdCBzaW1wbGVCYWNrID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLXNpbXBsZS1iYWNrJyk7XG4gIGlmIChzaW1wbGVCYWNrKSB7XG4gICAgc2ltcGxlQmFjay5vbmNsaWNrID0gZnVuY3Rpb24oZSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgc2hvd1N0ZXAoJ3NldHVwLXN0ZXAtMScpO1xuICAgIH07XG4gIH1cblxuICBjb25zdCBzaW1wbGVOZXh0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLXNpbXBsZS1uZXh0Jyk7XG4gIGlmIChzaW1wbGVOZXh0KSB7XG4gICAgc2ltcGxlTmV4dC5vbmNsaWNrID0gZnVuY3Rpb24oZSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgc2hvd1N1bW1hcnkoKTtcbiAgICB9O1xuICB9XG5cbiAgLy8gUHVibGljIHJvdXRpbmcgbW9kZSB0b2dnbGUgXHUyMDE0IHVwZGF0ZSByZXF1aXJlbWVudCB0ZXh0XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W25hbWU9XCJyb3V0aW5nLW1vZGVcIl0nKS5mb3JFYWNoKGZ1bmN0aW9uKHJhZGlvKSB7XG4gICAgcmFkaW8ub25jaGFuZ2UgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBub3RlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rucy1yZXF1aXJlbWVudC1ub3RlJyk7XG4gICAgICBpZiAobm90ZSkge1xuICAgICAgICBub3RlLnRleHRDb250ZW50ID0gdGhpcy52YWx1ZSA9PT0gJ3N1YmRpcmVjdG9yeSdcbiAgICAgICAgICA/ICdPbmx5IG9uZSBETlMgcmVjb3JkIG5lZWRlZCAoZm9yIHRoZSBtYWluIGRvbWFpbiknXG4gICAgICAgICAgOiAnWW91XFwnbGwgbmVlZCB0byBjb25maWd1cmUgRE5TIG1hbnVhbGx5IGZvciBlYWNoIHN1YmRvbWFpbic7XG4gICAgICB9XG4gICAgfTtcbiAgfSk7XG5cbiAgLy8gUHVibGljIG5hdmlnYXRpb25cbiAgY29uc3QgcHVibGljQmFjayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1wdWJsaWMtYmFjaycpO1xuICBpZiAocHVibGljQmFjaykge1xuICAgIHB1YmxpY0JhY2sub25jbGljayA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHNob3dTdGVwKCdzZXR1cC1zdGVwLTEnKTtcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgcHVibGljTmV4dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1wdWJsaWMtbmV4dCcpO1xuICBpZiAocHVibGljTmV4dCkge1xuICAgIHB1YmxpY05leHQub25jbGljayA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IGRvbWFpbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1wdWJsaWMtZG9tYWluJyk/LnZhbHVlPy50cmltKCkgfHwgJyc7XG4gICAgICBjb25zdCBlbWFpbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1wdWJsaWMtZW1haWwnKT8udmFsdWU/LnRyaW0oKSB8fCAnJztcblxuICAgICAgaWYgKCFkb21haW4pIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbignUGxlYXNlIGVudGVyIHlvdXIgZG9tYWluIG5hbWUnLCAnd2FybmluZycpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoIWVtYWlsIHx8ICFlbWFpbC5pbmNsdWRlcygnQCcpKSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oJ1BsZWFzZSBlbnRlciBhIHZhbGlkIGVtYWlsIGFkZHJlc3MnLCAnd2FybmluZycpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzaG93U3VtbWFyeSgpO1xuICAgIH07XG4gIH1cblxuICAvLyBTdW1tYXJ5IG5hdmlnYXRpb25cbiAgY29uc3Qgc3VtbWFyeUJhY2sgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtc3VtbWFyeS1iYWNrJyk7XG4gIGlmIChzdW1tYXJ5QmFjaykge1xuICAgIHN1bW1hcnlCYWNrLm9uY2xpY2sgPSBmdW5jdGlvbihlKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBpZiAoY3VycmVudENvbmZpZ1R5cGUgPT09ICdob21lbGFiJykge1xuICAgICAgICBzaG93U3RlcCgnc2V0dXAtc3RlcC1ob21lbGFiJyk7XG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnRDb25maWdUeXBlID09PSAnc2ltcGxlJykge1xuICAgICAgICBzaG93U3RlcCgnc2V0dXAtc3RlcC1zaW1wbGUnKTtcbiAgICAgIH0gZWxzZSBpZiAoY3VycmVudENvbmZpZ1R5cGUgPT09ICdwdWJsaWMnKSB7XG4gICAgICAgIHNob3dTdGVwKCdzZXR1cC1zdGVwLXB1YmxpYycpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvLyBTdW1tYXJ5IFwiQ29udGludWUgXHUyMTkyXCIgXHUyMDE0IGFkdmFuY2UgdG8gdGhlIGRpc2stc2FmZXR5IHdhcm5pbmcgc3RlcFxuICBjb25zdCBzdW1tYXJ5TmV4dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1zdW1tYXJ5LW5leHQnKTtcbiAgaWYgKHN1bW1hcnlOZXh0KSB7XG4gICAgc3VtbWFyeU5leHQub25jbGljayA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHNob3dTdGVwKCdzZXR1cC1zdGVwLWRpc2stc2FmZXR5Jyk7XG4gICAgfTtcbiAgfVxuXG4gIC8vIERpc2stc2FmZXR5IHN0ZXAgbmF2aWdhdGlvblxuICBjb25zdCBkaXNrU2FmZXR5QmFjayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1kaXNrLXNhZmV0eS1iYWNrJyk7XG4gIGlmIChkaXNrU2FmZXR5QmFjaykge1xuICAgIGRpc2tTYWZldHlCYWNrLm9uY2xpY2sgPSBmdW5jdGlvbihlKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBzaG93U3RlcCgnc2V0dXAtc3RlcC1zdW1tYXJ5Jyk7XG4gICAgfTtcbiAgfVxuXG4gIC8vIEZpbmlzaCBzZXR1cCBidXR0b24gKG5vdyBvbiB0aGUgZGlzay1zYWZldHkgc3RlcClcbiAgY29uc3QgZmluaXNoQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLWRpc2stc2FmZXR5LWZpbmlzaCcpO1xuICBpZiAoZmluaXNoQnRuKSB7XG4gICAgZmluaXNoQnRuLm9uY2xpY2sgPSBmdW5jdGlvbihlKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBmaW5pc2hTZXR1cCgpO1xuICAgIH07XG4gIH1cblxuICAvLyBFeHBvc2UgZnVuY3Rpb24gdG8gZ2V0IGdsb2JhbCBjb25maWcgKGZyb20gc2VydmVyIG9yIGxvY2FsU3RvcmFnZSlcbiAgd2luZG93LmdldEdsb2JhbENvbmZpZyA9IGFzeW5jIGZ1bmN0aW9uKCkge1xuICAgIC8vIFRyeSBzZXJ2ZXIgZmlyc3RcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9jb25maWcnKTtcbiAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICBjb25zdCBjb25maWcgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIGlmIChjb25maWcgJiYgY29uZmlnLnNldHVwQ29tcGxldGUpIHtcbiAgICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS53YXJuKCdDb3VsZCBub3QgZmV0Y2ggY29uZmlnIGZyb20gc2VydmVyJyk7XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2sgdG8gbG9jYWxTdG9yYWdlXG4gICAgY29uc3QgY29uZmlnU3RyID0gc2FmZUdldCgnZGFzaGNhZGR5LWNvbmZpZycpO1xuICAgIGlmIChjb25maWdTdHIpIHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKGNvbmZpZ1N0cik7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIGRlZmF1bHQgY29uZmlnIGlmIG5vdCBzZXRcbiAgICByZXR1cm4ge1xuICAgICAgc2V0dXBDb21wbGV0ZTogZmFsc2UsXG4gICAgICBjb25maWd1cmF0aW9uVHlwZTogJ2hvbWVsYWInLFxuICAgICAgdGxkOiAnLmhvbWUnLFxuICAgICAgY2FOYW1lOiAnJyxcbiAgICAgIGRlZmF1bHRzOiB7XG4gICAgICAgIGRuc1R5cGU6ICdwcml2YXRlJyxcbiAgICAgICAgc3NsVHlwZTogJ2ludGVybmFsJyxcbiAgICAgICAgdGFyZ2V0SVA6ICdsb2NhbGhvc3QnXG4gICAgICB9XG4gICAgfTtcbiAgfTtcblxuICAvLyBFeHBvc2UgcmVzZXQgZnVuY3Rpb24gZm9yIHNldHRpbmdzXG4gIHdpbmRvdy5yZXNldFNldHVwV2l6YXJkID0gYXN5bmMgZnVuY3Rpb24oKSB7XG4gICAgaWYgKGNvbmZpcm0oJ1Jlc2V0IERhc2hDYWRkeSBjb25maWd1cmF0aW9uPyBUaGlzIHdpbGwgc2hvdyB0aGUgc2V0dXAgd2l6YXJkIGFnYWluLicpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9jb25maWcnLCB7IG1ldGhvZDogJ0RFTEVURScgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignQ291bGQgbm90IGRlbGV0ZSBzZXJ2ZXIgY29uZmlnJyk7XG4gICAgICB9XG4gICAgICBzYWZlUmVtb3ZlKCdkYXNoY2FkZHktc2V0dXAnKTtcbiAgICAgIHNhZmVSZW1vdmUoJ2Rhc2hjYWRkeS1jb25maWcnKTtcbiAgICAgIGxvY2F0aW9uLnJlbG9hZCgpO1xuICAgIH1cbiAgfTtcbn0pKCk7XG47XG4vLyBBcHAgU2VsZWN0b3IgU3lzdGVtXG4oZnVuY3Rpb24gKCkge1xuICBjb25zdCBlcnJvckhhbmRsZXIgPSBuZXcgRXJyb3JIYW5kbGVyKCk7XG4gIGluamVjdE1vZGFsKCdhcHAtc2VsZWN0b3ItbW9kYWwnLCBgPGRpdiBpZD1cImFwcC1zZWxlY3Rvci1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJhcHAtc2VsZWN0b3ItY29udGVudFwiPlxuICAgICAgPGgyIHN0eWxlPVwibWFyZ2luOiAwIDAgMjRweDsgY29sb3I6IHZhcigtLWZnKTsgdGV4dC1hbGlnbjogY2VudGVyO1wiPkNob29zZSBhbiBBcHA8L2gyPlxuICAgICAgPGRpdiBpZD1cImFwcC1zZWxlY3Rvci1ncmlkXCIgY2xhc3M9XCJhcHAtc2VsZWN0b3ItZ3JpZFwiPjwvZGl2PlxuICAgICAgPGRpdiBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjsgbWFyZ2luLXRvcDogMjRweDtcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImFwcC1zZWxlY3Rvci1jYW5jZWxcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5gKTtcblxuICBpbmplY3RNb2RhbCgnYXBwLWRlcGxveS1tb2RhbCcsIGA8ZGl2IGlkPVwiYXBwLWRlcGxveS1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogNjAwcHg7IG1heC13aWR0aDogNzAwcHg7XCI+XG4gICAgICA8aDMgaWQ9XCJhcHAtZGVwbG95LXRpdGxlXCI+RGVwbG95IEFwcGxpY2F0aW9uPC9oMz5cblxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOyBnYXA6IDE2cHg7IG1hcmdpbi10b3A6IDE2cHg7XCI+XG4gICAgICAgIDwhLS0gU3ViZG9tYWluL0RvbWFpbiAtLT5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8bGFiZWwgZm9yPVwiZGVwbG95LXN1YmRvbWFpblwiIGNsYXNzPVwiZm9ybS1sYWJlbC1hY2NlbnQtc21cIj5cbiAgICAgICAgICAgIFx1RDgzQ1x1REYxMCBTdWJkb21haW4gb3IgRG9tYWluXG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImRlcGxveS1zdWJkb21haW5cIiBwbGFjZWhvbGRlcj1cInVwdGltZVwiXG4gICAgICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7IHBhZGRpbmc6IDEwcHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmcpOyBjb2xvcjogdmFyKC0tZmcpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGZvbnQtc2l6ZTogMC45NXJlbTtcIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWhpbnQtc21cIj5cbiAgICAgICAgICAgIFlvdXIgYXBwIHdpbGwgYmUgYXZhaWxhYmxlIGF0OiA8c3BhbiBpZD1cImRlcGxveS11cmwtcHJldmlld1wiIHN0eWxlPVwiY29sb3I6IHZhcigtLWFjY2VudCk7IGZvbnQtd2VpZ2h0OiA1MDA7XCI+dXB0aW1lLmhvbWU8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBpZD1cInN1YnBhdGgtY29tcGF0LXdhcm5pbmdcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IHBhZGRpbmc6IDhweCAxMnB4OyBib3JkZXItcmFkaXVzOiA2cHg7IGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCAjZmY5ODAwIDEwJSwgdmFyKC0tY2FyZC1iZykpOyBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgI2ZmOTgwMCAzMCUsIHRyYW5zcGFyZW50KTsgbWFyZ2luLXRvcDogOHB4OyBmb250LXNpemU6IDAuODVyZW07XCI+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gRE5TIENvbmZpZ3VyYXRpb24gLS0+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbC1hY2NlbnRcIj5cbiAgICAgICAgICAgIFx1RDgzRFx1RERDMlx1RkUwRiBETlMgQ29uZmlndXJhdGlvblxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtY29sLWdhcFwiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwicmFkaW8tb3B0aW9uXCI+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiBuYW1lPVwiZG5zLXR5cGVcIiB2YWx1ZT1cInByaXZhdGVcIiBjaGVja2VkIHN0eWxlPVwibWFyZ2luLXJpZ2h0OiAxMHB4O1wiIC8+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZ3LTUwMFwiPlByaXZhdGUgRE5TIChUZWNobml0aXVtKTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWhpbnRcIj5Vc2UgeW91ciBsb2NhbCBETlMgc2VydmVyIHdpdGggY3VzdG9tIFRMRCAoLnNhbWksIC5ob21lLCBldGMuKTwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJyYWRpby1vcHRpb25cIj5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJkbnMtdHlwZVwiIHZhbHVlPVwicHVibGljXCIgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDEwcHg7XCIgLz5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnctNTAwXCI+UHVibGljIEROUzwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWhpbnRcIj5Vc2UgYSByZWFsIGRvbWFpbiAoZXhhbXBsZS5jb20pIC0gcmVxdWlyZXMgRE5TIHByb3ZpZGVyIHNldHVwPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInJhZGlvLW9wdGlvblwiPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgbmFtZT1cImRucy10eXBlXCIgdmFsdWU9XCJub25lXCIgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDEwcHg7XCIgLz5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnctNTAwXCI+Tm8gRE5TIChJUDpQb3J0IG9ubHkpPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtaGludFwiPkFjY2VzcyB2aWEgSVAgYWRkcmVzcyBhbmQgcG9ydCAtIG5vIGRvbWFpbiBzZXR1cDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gU1NMIENvbmZpZ3VyYXRpb24gLS0+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbC1hY2NlbnRcIj5cbiAgICAgICAgICAgIFx1RDgzRFx1REQxMiBTU0wvVExTIENlcnRpZmljYXRlXG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1jb2wtZ2FwXCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJyYWRpby1vcHRpb25cIj5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJzc2wtdHlwZVwiIHZhbHVlPVwiaW50ZXJuYWxcIiBjaGVja2VkIHN0eWxlPVwibWFyZ2luLXJpZ2h0OiAxMHB4O1wiIC8+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZ3LTUwMFwiPkludGVybmFsIENBPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtaGludFwiPlVzZSBDYWRkeSdzIGludGVybmFsIGNlcnRpZmljYXRlIGF1dGhvcml0eSAoc2VsZi1zaWduZWQpPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInJhZGlvLW9wdGlvblwiPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgbmFtZT1cInNzbC10eXBlXCIgdmFsdWU9XCJsZXRzZW5jcnlwdFwiIHN0eWxlPVwibWFyZ2luLXJpZ2h0OiAxMHB4O1wiIC8+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZ3LTUwMFwiPkxldCdzIEVuY3J5cHQ8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1oaW50XCI+RnJlZSBwdWJsaWMgU1NMIGNlcnRpZmljYXRlIChyZXF1aXJlcyBwdWJsaWMgZG9tYWluKTwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJyYWRpby1vcHRpb25cIj5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJzc2wtdHlwZVwiIHZhbHVlPVwibm9uZVwiIHN0eWxlPVwibWFyZ2luLXJpZ2h0OiAxMHB4O1wiIC8+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZ3LTUwMFwiPk5vIFNTTCAoSFRUUCBvbmx5KTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWhpbnRcIj5cdTI2QTBcdUZFMEYgTm90IHJlY29tbWVuZGVkIC0gdHJhZmZpYyB3aWxsIGJlIHVuZW5jcnlwdGVkPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBNZWRpYSBMaWJyYXJ5IFBhdGggKHNob3duIGZvciBtZWRpYSBhcHBzKSAtLT5cbiAgICAgICAgPGRpdiBpZD1cIm1lZGlhLXBhdGgtc2VjdGlvblwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsLWFjY2VudFwiPlxuICAgICAgICAgICAgXHVEODNEXHVEQ0MxIE1lZGlhIExpYnJhcnkgTG9jYXRpb25cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDEwcHg7XCI+XG4gICAgICAgICAgICA8IS0tIERldGVjdGVkIG1vdW50cyBmcm9tIGV4aXN0aW5nIG1lZGlhIHNlcnZlcnMgLS0+XG4gICAgICAgICAgICA8ZGl2IGlkPVwiZGV0ZWN0ZWQtbW91bnRzLWNvbnRhaW5lclwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj5cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC44NXJlbTsgY29sb3I6IHZhcigtLXN1Y2Nlc3MpOyBtYXJnaW4tYm90dG9tOiA2cHg7XCI+XG4gICAgICAgICAgICAgICAgXHUyNzEzIERldGVjdGVkIGZyb20gZXhpc3RpbmcgbWVkaWEgc2VydmVyczpcbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgaWQ9XCJkZXRlY3RlZC1tb3VudHMtbGlzdFwiIHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IGZsZXgtd3JhcDogd3JhcDtcIj48L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIFBhdGggaW5wdXQgd2l0aCBicm93c2UgYnV0dG9uIC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtcm93LWdhcFwiPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImRlcGxveS1tZWRpYS1wYXRoXCIgcGxhY2Vob2xkZXI9XCIvbWVkaWEvTW92aWVzLCAvbWVkaWEvVFZTaG93c1wiXG4gICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImlucHV0LWZsZXhcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC45NXJlbTtcIiAvPlxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBpZD1cImJyb3dzZS1tZWRpYS1idG5cIiBzdHlsZT1cInBhZGRpbmc6IDEwcHggMTZweDsgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50KTsgY29sb3I6IHdoaXRlOyBib3JkZXI6IG5vbmU7IGJvcmRlci1yYWRpdXM6IDZweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXdlaWdodDogNTAwOyB3aGl0ZS1zcGFjZTogbm93cmFwO1wiPlxuICAgICAgICAgICAgICAgIFx1RDgzRFx1RENDMiBCcm93c2VcbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBpZD1cIm1lZGlhLXBhdGgtZGVzY3JpcHRpb25cIiBjbGFzcz1cInRleHQtaGludFwiPlxuICAgICAgICAgICAgICBTZWxlY3QgZm9sZGVycyBmcm9tIGV4aXN0aW5nIHNlcnZlcnMsIGJyb3dzZSwgb3IgdHlwZSBwYXRocyBtYW51YWxseS4gU2VwYXJhdGUgbXVsdGlwbGUgd2l0aCBjb21tYXMuXG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBTZWxlY3RlZCBwYXRocyBkaXNwbGF5IC0tPlxuICAgICAgICAgICAgPGRpdiBpZD1cInNlbGVjdGVkLW1lZGlhLXBhdGhzXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBmbGV4LXdyYXA6IHdyYXA7IGdhcDogNnB4O1wiPjwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFBsZXggQ2xhaW0gVG9rZW4gKHNob3duIG9ubHkgZm9yIFBsZXggZGVwbG95bWVudHMpIC0tPlxuICAgICAgICA8ZGl2IGlkPVwicGxleC1jbGFpbS1zZWN0aW9uXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwtYWNjZW50XCI+XG4gICAgICAgICAgICBcdUQ4M0RcdUREMTEgUGxleCBDbGFpbSBUb2tlblxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtcm93LWdhcFwiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJkZXBsb3ktcGxleC1jbGFpbVwiIHBsYWNlaG9sZGVyPVwiY2xhaW0teHh4eHh4eHh4eHh4eHh4eHh4eHhcIlxuICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaW5wdXQtZmxleFwiIHN0eWxlPVwiZm9udC1zaXplOiAwLjk1cmVtO1wiIC8+XG4gICAgICAgICAgICA8YSBocmVmPVwiaHR0cHM6Ly9wbGV4LnR2L2NsYWltXCIgdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiXG4gICAgICAgICAgICAgICBzdHlsZT1cInBhZGRpbmc6IDEwcHggMTZweDsgYmFja2dyb3VuZDogI2U1YTAwZDsgY29sb3I6ICMwMDA7IGJvcmRlcjogbm9uZTsgYm9yZGVyLXJhZGl1czogNnB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtd2VpZ2h0OiA1MDA7IHdoaXRlLXNwYWNlOiBub3dyYXA7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjtcIj5cbiAgICAgICAgICAgICAgR2V0IFRva2VuXG4gICAgICAgICAgICA8L2E+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogI2U1YTAwZDsgbWFyZ2luLXRvcDogNHB4O1wiPlxuICAgICAgICAgICAgVG9rZW4gZXhwaXJlcyBpbiA0IG1pbnV0ZXMhIEdldCBpdCByaWdodCBiZWZvcmUgY2xpY2tpbmcgRGVwbG95LiBMZWF2ZSBlbXB0eSB0byBjb25maWd1cmUgUGxleCBtYW51YWxseSBsYXRlci5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBUYWlsc2NhbGUgU2VjdXJpdHkgLS0+XG4gICAgICAgIDxkaXYgaWQ9XCJ0YWlsc2NhbGUtc2VjdGlvblwiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwtYWNjZW50XCI+XG4gICAgICAgICAgICBcdUQ4M0RcdUREMTAgVGFpbHNjYWxlIFNlY3VyaXR5XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1jb2wtZ2FwXCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJyYWRpby1vcHRpb25cIj5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwiZGVwbG95LXRhaWxzY2FsZS1vbmx5XCIgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDEwcHg7IHdpZHRoOiAxOHB4OyBoZWlnaHQ6IDE4cHg7XCIgLz5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnctNTAwXCI+VGFpbHNjYWxlLU9ubHkgQWNjZXNzPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtaGludFwiPlJlc3RyaWN0IHRoaXMgc2VydmljZSB0byBUYWlsc2NhbGUgdXNlcnMgb25seSAoMTAwLngueC54IElQcyk8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPGRpdiBpZD1cInRhaWxzY2FsZS1zdGF0dXNcIiBzdHlsZT1cInBhZGRpbmc6IDhweCAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgYm9yZGVyLXJhZGl1czogNnB4OyBmb250LXNpemU6IDAuODVyZW07XCI+XG4gICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj5DaGVja2luZyBUYWlsc2NhbGUgc3RhdHVzLi4uPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gQWR2YW5jZWQgT3B0aW9ucyAoQ29sbGFwc2libGUpIC0tPlxuICAgICAgICA8ZGV0YWlscz5cbiAgICAgICAgICA8c3VtbWFyeSBzdHlsZT1cImN1cnNvcjogcG9pbnRlcjsgY29sb3I6IHZhcigtLWFjY2VudCk7IGZvbnQtd2VpZ2h0OiA1MDA7IG1hcmdpbi1ib3R0b206IDhweDtcIj5cdTI2OTlcdUZFMEYgQWR2YW5jZWQgT3B0aW9uczwvc3VtbWFyeT5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMTJweDsgZGlzcGxheTogZ3JpZDsgZ2FwOiAxMnB4O1wiPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImRlcGxveS1wb3J0XCIgc3R5bGU9XCJkaXNwbGF5OiBibG9jazsgbWFyZ2luLWJvdHRvbTogNnB4O1wiPkN1c3RvbSBQb3J0IChvcHRpb25hbCk8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiZGVwbG95LXBvcnRcIiBwbGFjZWhvbGRlcj1cIkxlYXZlIGVtcHR5IGZvciBkZWZhdWx0XCJcbiAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1pbnB1dC1jYXJkXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImRlcGxveS1pcFwiIHN0eWxlPVwiZGlzcGxheTogYmxvY2s7IG1hcmdpbi1ib3R0b206IDZweDtcIj5UYXJnZXQgSVAgQWRkcmVzczwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZGVwbG95LWlwXCIgdmFsdWU9XCJsb2NhbGhvc3RcIlxuICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWlucHV0LWNhcmRcIiAvPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1oaW50LXNtXCI+XG4gICAgICAgICAgICAgICAgVXNlICdsb2NhbGhvc3QnIGZvciBzYW1lLWhvc3QgY29udGFpbmVycywgb3Igc3BlY2lmaWMgSVAgZm9yIHJlbW90ZSBzZXJ2aWNlc1xuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBpZD1cInZvbHVtZS1tb3VudHMtc2VjdGlvblwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbC1hY2NlbnQtc21cIj5cdUQ4M0RcdURDQzIgVm9sdW1lIE1vdW50czwvbGFiZWw+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLWJvdHRvbTogOHB4O1wiPlxuICAgICAgICAgICAgICAgIEN1c3RvbWl6ZSB3aGVyZSBjb250YWluZXIgZGF0YSBpcyBzdG9yZWQgb24gdGhlIGhvc3QuIE1lZGlhIHZvbHVtZXMgYXJlIGNvbmZpZ3VyZWQgYWJvdmUuXG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGlkPVwidm9sdW1lLW1vdW50cy1saXN0XCIgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBnYXA6IDhweDtcIj48L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDEycHg7XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwtYWNjZW50LXNtXCI+XHUyNjk5XHVGRTBGIFJlc291cmNlIExpbWl0czwvbGFiZWw+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLWJvdHRvbTogOHB4O1wiPlxuICAgICAgICAgICAgICAgIE9wdGlvbmFsIENQVSBhbmQgbWVtb3J5IGNvbnN0cmFpbnRzLiBMZWF2ZSBhdCAwIGZvciB1bmxpbWl0ZWQuXG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyOyBnYXA6IDEwcHg7XCI+XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJkZXBsb3ktY3B1LWxpbWl0XCIgc3R5bGU9XCJkaXNwbGF5OiBibG9jazsgZm9udC1zaXplOiAwLjc4cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tYm90dG9tOiA0cHg7XCI+Q1BVIENvcmVzPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJkZXBsb3ktY3B1LWxpbWl0XCIgdmFsdWU9XCIwXCIgbWluPVwiMFwiIG1heD1cIjY0XCIgc3RlcD1cIjAuMjVcIiBjbGFzcz1cImZvcm0taW5wdXQtY2FyZFwiIHN0eWxlPVwid2lkdGg6IDEwMCU7XCIgcGxhY2Vob2xkZXI9XCIwID0gdW5saW1pdGVkXCIgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImRlcGxveS1tZW1vcnktbGltaXRcIiBzdHlsZT1cImRpc3BsYXk6IGJsb2NrOyBmb250LXNpemU6IDAuNzhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi1ib3R0b206IDRweDtcIj5NZW1vcnkgKE1CKTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiZGVwbG95LW1lbW9yeS1saW1pdFwiIHZhbHVlPVwiMFwiIG1pbj1cIjBcIiBtYXg9XCIxMzEwNzJcIiBzdGVwPVwiNjRcIiBjbGFzcz1cImZvcm0taW5wdXQtY2FyZFwiIHN0eWxlPVwid2lkdGg6IDEwMCU7XCIgcGxhY2Vob2xkZXI9XCIwID0gdW5saW1pdGVkXCIgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kZXRhaWxzPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWJ1dHRvbnNcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDI0cHg7XCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJhcHAtZGVwbG95LWNhbmNlbFwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwiYXBwLWRlcGxveS1jb25maXJtXCIgY2xhc3M9XCJidG4tYWNjZW50XCI+XG4gICAgICAgICAgXHVEODNEXHVERTgwIERlcGxveVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5gKTtcblxuICBjb25zdCBBUFBTX0tFWSA9ICdjdXN0b20tYXBwcyc7XG5cbiAgLy8gQ2FjaGUgZm9yIEFQSSB0ZW1wbGF0ZXNcbiAgbGV0IGFwaVRlbXBsYXRlcyA9IG51bGw7XG4gIGxldCBhcGlDYXRlZ29yaWVzID0gbnVsbDtcblxuICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcHAtc2VsZWN0b3ItbW9kYWwnKTtcbiAgY29uc3QgZ3JpZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcHAtc2VsZWN0b3ItZ3JpZCcpO1xuXG4gIC8vIEZldGNoIGFwcCB0ZW1wbGF0ZXMgZnJvbSBBUElcbiAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hBcHBUZW1wbGF0ZXMoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvYXBwcy90ZW1wbGF0ZXMnKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIGFwaVRlbXBsYXRlcyA9IGRhdGEudGVtcGxhdGVzO1xuICAgICAgICBhcGlDYXRlZ29yaWVzID0gZGF0YS5jYXRlZ29yaWVzO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBlcnJvckhhbmRsZXIubG9nRXJyb3IoJ1tBcHBTZWxlY3Rvcl0gRmV0Y2ggVGVtcGxhdGVzJywgZSwgeyBmdW5jdGlvbjogJ2ZldGNoQXBpVGVtcGxhdGVzJyB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gQ2hlY2sgcG9ydCBhdmFpbGFiaWxpdHlcbiAgYXN5bmMgZnVuY3Rpb24gY2hlY2tQb3J0QXZhaWxhYmlsaXR5KHBvcnQpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgL2FwaS92MS9hcHBzL3BvcnRzLyR7cG9ydH0vY2hlY2tgKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBlcnJvckhhbmRsZXIubG9nRXJyb3IoJ1tBcHBTZWxlY3Rvcl0gQ2hlY2sgUG9ydCcsIGUsIHsgZnVuY3Rpb246ICdjaGVja1BvcnRBdmFpbGFiaWxpdHknIH0pO1xuICAgICAgcmV0dXJuIHsgYXZhaWxhYmxlOiB0cnVlIH07IC8vIEFzc3VtZSBhdmFpbGFibGUgb24gZXJyb3JcbiAgICB9XG4gIH1cblxuICAvLyBHZXQgc3VnZ2VzdGVkIGF2YWlsYWJsZSBwb3J0XG4gIGFzeW5jIGZ1bmN0aW9uIGdldFN1Z2dlc3RlZFBvcnQoYmFzZVBvcnQpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgL2FwaS92MS9hcHBzL3BvcnRzLyR7YmFzZVBvcnR9L3N1Z2dlc3RgKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIHJldHVybiBkYXRhLnN1Z2dlc3RlZFBvcnQ7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdbQXBwU2VsZWN0b3JdIEdldCBTdWdnZXN0ZWQgUG9ydCcsIGUsIHsgZnVuY3Rpb246ICdnZXRTdWdnZXN0ZWRQb3J0JyB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGJhc2VQb3J0O1xuICB9XG5cbiAgLy8gQnVpbGQgYXBwIHNlbGVjdG9yIGdyaWQgZnJvbSBBUEkgdGVtcGxhdGVzXG4gIGFzeW5jIGZ1bmN0aW9uIGJ1aWxkQXBwU2VsZWN0b3IoKSB7XG4gICAgZ3JpZC5pbm5lckhUTUwgPSAnPGRpdiBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogNDBweDsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5Mb2FkaW5nIGFwcCB0ZW1wbGF0ZXMuLi48L2Rpdj4nO1xuXG4gICAgLy8gRmV0Y2ggdGVtcGxhdGVzIGlmIG5vdCBjYWNoZWRcbiAgICBpZiAoIWFwaVRlbXBsYXRlcykge1xuICAgICAgY29uc3Qgc3VjY2VzcyA9IGF3YWl0IGZldGNoQXBwVGVtcGxhdGVzKCk7XG4gICAgICBpZiAoIXN1Y2Nlc3MpIHtcbiAgICAgICAgZ3JpZC5pbm5lckhUTUwgPSAnPGRpdiBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogNDBweDsgY29sb3I6IHZhcigtLWVycm9yKTtcIj5GYWlsZWQgdG8gbG9hZCBhcHAgdGVtcGxhdGVzLiBQbGVhc2UgdHJ5IGFnYWluLjwvZGl2Pic7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBncmlkLmlubmVySFRNTCA9ICcnO1xuXG4gICAgLy8gR3JvdXAgdGVtcGxhdGVzIGJ5IGNhdGVnb3J5XG4gICAgY29uc3QgYnlDYXRlZ29yeSA9IHt9O1xuICAgIGZvciAoY29uc3QgW2FwcElkLCB0ZW1wbGF0ZV0gb2YgT2JqZWN0LmVudHJpZXMoYXBpVGVtcGxhdGVzKSkge1xuICAgICAgY29uc3QgY2F0ZWdvcnkgPSB0ZW1wbGF0ZS5jYXRlZ29yeSB8fCAnT3RoZXInO1xuICAgICAgaWYgKCFieUNhdGVnb3J5W2NhdGVnb3J5XSkge1xuICAgICAgICBieUNhdGVnb3J5W2NhdGVnb3J5XSA9IFtdO1xuICAgICAgfVxuICAgICAgYnlDYXRlZ29yeVtjYXRlZ29yeV0ucHVzaCh7IGlkOiBhcHBJZCwgLi4udGVtcGxhdGUgfSk7XG4gICAgfVxuXG4gICAgLy8gU29ydCBjYXRlZ29yaWVzIGJ5IHRoZSBvcmRlciBpbiBhcGlDYXRlZ29yaWVzIGlmIGF2YWlsYWJsZVxuICAgIGNvbnN0IGNhdGVnb3J5T3JkZXIgPSBhcGlDYXRlZ29yaWVzID8gT2JqZWN0LmtleXMoYXBpQ2F0ZWdvcmllcykgOiBPYmplY3Qua2V5cyhieUNhdGVnb3J5KS5zb3J0KCk7XG5cbiAgICBmb3IgKGNvbnN0IGNhdGVnb3J5IG9mIGNhdGVnb3J5T3JkZXIpIHtcbiAgICAgIGNvbnN0IGFwcHMgPSBieUNhdGVnb3J5W2NhdGVnb3J5XTtcbiAgICAgIGlmICghYXBwcyB8fCBhcHBzLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG5cbiAgICAgIC8vIFNvcnQgYXBwcyBieSBwb3B1bGFyaXR5IChkZXNjZW5kaW5nKVxuICAgICAgYXBwcy5zb3J0KChhLCBiKSA9PiAoYi5wb3B1bGFyaXR5IHx8IDApIC0gKGEucG9wdWxhcml0eSB8fCAwKSk7XG5cbiAgICAgIC8vIENhdGVnb3J5IGhlYWRlciB3aXRoIGljb24gYW5kIGNvbG9yIGZyb20gQVBJXG4gICAgICBjb25zdCBoZWFkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGhlYWRlci5jbGFzc05hbWUgPSAnYXBwLWNhdGVnb3J5LWhlYWRlcic7XG4gICAgICBjb25zdCBjYXRlZ29yeUluZm8gPSBhcGlDYXRlZ29yaWVzPy5bY2F0ZWdvcnldIHx8IHt9O1xuICAgICAgaGVhZGVyLmlubmVySFRNTCA9IGAke2VzY2FwZUh0bWwoY2F0ZWdvcnlJbmZvLmljb24gfHwgJycpfSAke2VzY2FwZUh0bWwoY2F0ZWdvcnkpfWA7XG4gICAgICBpZiAoY2F0ZWdvcnlJbmZvLmNvbG9yKSB7XG4gICAgICAgIGhlYWRlci5zdHlsZS5ib3JkZXJCb3R0b21Db2xvciA9IGNhdGVnb3J5SW5mby5jb2xvcjtcbiAgICAgIH1cbiAgICAgIGdyaWQuYXBwZW5kQ2hpbGQoaGVhZGVyKTtcblxuICAgICAgLy8gQXBwIG9wdGlvbnNcbiAgICAgIGFwcHMuZm9yRWFjaChhcHAgPT4ge1xuICAgICAgICBjb25zdCBvcHRpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgb3B0aW9uLmNsYXNzTmFtZSA9ICdhcHAtb3B0aW9uJztcblxuICAgICAgICAvLyBXaWRnZXQgZW5hYmxlZCBiYWRnZVxuICAgICAgICBjb25zdCBpc1dpZGdldCA9IGFwcC5pc0Rhc2hib2FyZFdpZGdldDtcbiAgICAgICAgY29uc3Qgd2lkZ2V0RW5hYmxlZCA9IGlzV2lkZ2V0ICYmIHNhZmVHZXQoJ3dpZGdldC0nICsgYXBwLmlkICsgJy1lbmFibGVkJykgIT09ICdmYWxzZSc7XG4gICAgICAgIGNvbnN0IHdpZGdldEJhZGdlID0gaXNXaWRnZXRcbiAgICAgICAgICA/IGA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjY1cmVtOyBwYWRkaW5nOiAycHggNnB4OyBib3JkZXItcmFkaXVzOiA0cHg7IG1hcmdpbi10b3A6IDRweDsgYmFja2dyb3VuZDogJHt3aWRnZXRFbmFibGVkID8gJyMyZWNjNzEzMCcgOiAnI2U3NGMzYzMwJ307IGNvbG9yOiAke3dpZGdldEVuYWJsZWQgPyAnIzJlY2M3MScgOiAnI2U3NGMzYyd9OyBmb250LXdlaWdodDogNjAwO1wiPiR7d2lkZ2V0RW5hYmxlZCA/ICdPTicgOiAnT0ZGJ308L2Rpdj5gXG4gICAgICAgICAgOiAnJztcblxuICAgICAgICAvLyBTaG93IGRpZmZpY3VsdHkgYmFkZ2UgKG5vbi13aWRnZXRzIG9ubHkpXG4gICAgICAgIGNvbnN0IGRpZmZpY3VsdHlCYWRnZSA9ICFpc1dpZGdldCAmJiBhcHAuZGlmZmljdWx0eSA/XG4gICAgICAgICAgYDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNjVyZW07IHBhZGRpbmc6IDJweCA2cHg7IGJvcmRlci1yYWRpdXM6IDRweDsgbWFyZ2luLXRvcDogNHB4OyBiYWNrZ3JvdW5kOiAke1xuICAgICAgICAgICAgYXBwLmRpZmZpY3VsdHkgPT09ICdFYXN5JyA/ICcjMmVjYzcxJyA6XG4gICAgICAgICAgICBhcHAuZGlmZmljdWx0eSA9PT0gJ0ludGVybWVkaWF0ZScgPyAnI2YzOWMxMicgOiAnI2U3NGMzYydcbiAgICAgICAgICB9MjA7IGNvbG9yOiAke1xuICAgICAgICAgICAgYXBwLmRpZmZpY3VsdHkgPT09ICdFYXN5JyA/ICcjMmVjYzcxJyA6XG4gICAgICAgICAgICBhcHAuZGlmZmljdWx0eSA9PT0gJ0ludGVybWVkaWF0ZScgPyAnI2YzOWMxMicgOiAnI2U3NGMzYydcbiAgICAgICAgICB9O1wiPiR7ZXNjYXBlSHRtbChhcHAuZGlmZmljdWx0eSl9PC9kaXY+YCA6ICcnO1xuXG4gICAgICAgIG9wdGlvbi5pbm5lckhUTUwgPSBgXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFwcC1vcHRpb24taWNvblwiPiR7ZXNjYXBlSHRtbChhcHAuaWNvbiB8fCAnXHVEODNEXHVEQ0U2Jyl9PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFwcC1vcHRpb24tbmFtZVwiPiR7ZXNjYXBlSHRtbChhcHAubmFtZSl9PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFwcC1vcHRpb24tZGVzY1wiPiR7ZXNjYXBlSHRtbChhcHAuZGVzY3JpcHRpb24gfHwgJycpfTwvZGl2PlxuICAgICAgICAgICR7d2lkZ2V0QmFkZ2V9JHtkaWZmaWN1bHR5QmFkZ2V9XG4gICAgICAgIGA7XG5cbiAgICAgICAgaWYgKGlzV2lkZ2V0KSB7XG4gICAgICAgICAgb3B0aW9uLm9uY2xpY2sgPSAoKSA9PiB0b2dnbGVEYXNoYm9hcmRXaWRnZXQoYXBwLCBvcHRpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9wdGlvbi5vbmNsaWNrID0gKCkgPT4gc2hvd0RlcGxveUNvbmZpZyhhcHApO1xuICAgICAgICB9XG4gICAgICAgIGdyaWQuYXBwZW5kQ2hpbGQob3B0aW9uKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFJlbmRlciByZWNpcGUgY2FyZHMgYXQgdGhlIGVuZCBvZiB0aGUgZ3JpZFxuICAgIGlmICh3aW5kb3cucmVuZGVyUmVjaXBlQ2FyZHMpIHtcbiAgICAgIGF3YWl0IHdpbmRvdy5yZW5kZXJSZWNpcGVDYXJkcyhncmlkKTtcbiAgICB9XG4gIH1cblxuICAvLyBUb2dnbGUgYSBkYXNoYm9hcmQgd2lkZ2V0IG9uL29mZlxuICBmdW5jdGlvbiB0b2dnbGVEYXNoYm9hcmRXaWRnZXQoYXBwLCBvcHRpb25FbCkge1xuICAgIGNvbnN0IGtleSA9ICd3aWRnZXQtJyArIGFwcC5pZCArICctZW5hYmxlZCc7XG4gICAgY29uc3QgY3VycmVudGx5RW5hYmxlZCA9IHNhZmVHZXQoa2V5KSAhPT0gJ2ZhbHNlJztcbiAgICBjb25zdCBuZXdTdGF0ZSA9ICFjdXJyZW50bHlFbmFibGVkO1xuICAgIHNhZmVTZXQoa2V5LCBTdHJpbmcobmV3U3RhdGUpKTtcblxuICAgIC8vIFVwZGF0ZSB2aXNpYmlsaXR5IGltbWVkaWF0ZWx5XG4gICAgY29uc3Qgc2VsZWN0b3IgPSBhcHAud2lkZ2V0U2VsZWN0b3I7XG4gICAgaWYgKHNlbGVjdG9yKSB7XG4gICAgICBjb25zdCBlbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgICAgaWYgKGVsKSBlbC5zdHlsZS5kaXNwbGF5ID0gbmV3U3RhdGUgPyAnJyA6ICdub25lJztcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgdGhlIGJhZGdlIGluIHRoZSBhcHAgc2VsZWN0b3IgY2FyZFxuICAgIGNvbnN0IGJhZGdlID0gb3B0aW9uRWwucXVlcnlTZWxlY3RvcignZGl2W3N0eWxlKj1cImJvcmRlci1yYWRpdXM6IDRweFwiXScpO1xuICAgIGlmIChiYWRnZSkge1xuICAgICAgYmFkZ2UudGV4dENvbnRlbnQgPSBuZXdTdGF0ZSA/ICdPTicgOiAnT0ZGJztcbiAgICAgIGJhZGdlLnN0eWxlLmJhY2tncm91bmQgPSBuZXdTdGF0ZSA/ICcjMmVjYzcxMzAnIDogJyNlNzRjM2MzMCc7XG4gICAgICBiYWRnZS5zdHlsZS5jb2xvciA9IG5ld1N0YXRlID8gJyMyZWNjNzEnIDogJyNlNzRjM2MnO1xuICAgIH1cblxuICAgIHNob3dOb3RpZmljYXRpb24oYCR7YXBwLm5hbWV9IHdpZGdldCAke25ld1N0YXRlID8gJ2VuYWJsZWQnIDogJ2Rpc2FibGVkJ31gLCAnc3VjY2VzcycsIDIwMDApO1xuICB9XG5cbiAgLy8gU2hvdyBkZXBsb3ltZW50IGNvbmZpZ3VyYXRpb24gbW9kYWxcbiAgYXN5bmMgZnVuY3Rpb24gc2hvd0RlcGxveUNvbmZpZyhhcHBUZW1wbGF0ZSkge1xuICAgIGNvbnN0IGRlcGxveU1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FwcC1kZXBsb3ktbW9kYWwnKTtcbiAgICBjb25zdCB0aXRsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcHAtZGVwbG95LXRpdGxlJyk7XG4gICAgY29uc3Qgc3ViZG9tYWluSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVwbG95LXN1YmRvbWFpbicpO1xuICAgIGNvbnN0IHVybFByZXZpZXcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVwbG95LXVybC1wcmV2aWV3Jyk7XG4gICAgY29uc3QgaXBJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZXBsb3ktaXAnKTtcbiAgICBjb25zdCBwb3J0SW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVwbG95LXBvcnQnKTtcbiAgICBjb25zdCB0YWlsc2NhbGVDaGVja2JveCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZXBsb3ktdGFpbHNjYWxlLW9ubHknKTtcbiAgICBjb25zdCB0YWlsc2NhbGVTdGF0dXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFpbHNjYWxlLXN0YXR1cycpO1xuXG4gICAgLy8gQ2hlY2sgZm9yIGV4aXN0aW5nIGNvbnRhaW5lciB3aXRoIHNhbWUgaW1hZ2VcbiAgICB0cnkge1xuICAgICAgY29uc3QgY2hlY2tSZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2FwcHMvY2hlY2stZXhpc3RpbmcnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBhcHBJZDogYXBwVGVtcGxhdGUuaWQgfSlcbiAgICAgIH0pO1xuICAgICAgY29uc3QgY2hlY2tSZXN1bHQgPSBhd2FpdCBjaGVja1Jlc3BvbnNlLmpzb24oKTtcblxuICAgICAgaWYgKGNoZWNrUmVzdWx0LnN1Y2Nlc3MgJiYgY2hlY2tSZXN1bHQuZXhpc3RzKSB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGNoZWNrUmVzdWx0LmNvbnRhaW5lcjtcbiAgICAgICAgY29uc3QgdXNlRXhpc3RpbmcgPSBjb25maXJtKFxuICAgICAgICAgIGBGb3VuZCBleGlzdGluZyAke2FwcFRlbXBsYXRlLm5hbWV9IGNvbnRhaW5lcjpcXG5cXG5gICtcbiAgICAgICAgICBgQ29udGFpbmVyOiAke2NvbnRhaW5lci5uYW1lfVxcbmAgK1xuICAgICAgICAgIGBTdGF0dXM6ICR7Y29udGFpbmVyLnN0YXR1c31cXG5gICtcbiAgICAgICAgICBgUG9ydDogJHtjb250YWluZXIucHJpbWFyeVBvcnQgfHwgJ04vQSd9XFxuXFxuYCArXG4gICAgICAgICAgYFdvdWxkIHlvdSBsaWtlIHRvIHVzZSB0aGlzIGV4aXN0aW5nIGNvbnRhaW5lcj9cXG5cXG5gICtcbiAgICAgICAgICBgQ2xpY2sgT0sgdG8gY29uZmlndXJlIEROUy9DYWRkeSBmb3IgdGhlIGV4aXN0aW5nIGNvbnRhaW5lci5cXG5gICtcbiAgICAgICAgICBgQ2xpY2sgQ2FuY2VsIHRvIGRlcGxveSBhIG5ldyBjb250YWluZXIuYFxuICAgICAgICApO1xuXG4gICAgICAgIGlmICh1c2VFeGlzdGluZykge1xuICAgICAgICAgIC8vIFN0b3JlIGV4aXN0aW5nIGNvbnRhaW5lciBpbmZvIGZvciBkZXBsb3ltZW50XG4gICAgICAgICAgYXBwVGVtcGxhdGUuX3VzZUV4aXN0aW5nID0gdHJ1ZTtcbiAgICAgICAgICBhcHBUZW1wbGF0ZS5fZXhpc3RpbmdDb250YWluZXIgPSBjb250YWluZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBJZ25vcmUgY29udGFpbmVyIGNoZWNrIGVycm9yc1xuICAgIH1cblxuICAgIC8vIFNldCB0aXRsZSB3aXRoIGFwcCBpbmZvXG4gICAgdGl0bGUudGV4dENvbnRlbnQgPSBgRGVwbG95ICR7YXBwVGVtcGxhdGUubmFtZX1gO1xuXG4gICAgLy8gUHJlLWZpbGwgc3ViZG9tYWluIGZyb20gdGVtcGxhdGUgb3IgYXBwIElEXG4gICAgY29uc3QgZGVmYXVsdFN1YmRvbWFpbiA9IGFwcFRlbXBsYXRlLnN1YmRvbWFpbiB8fCBhcHBUZW1wbGF0ZS5pZC5yZXBsYWNlKC8tL2csICcnKTtcbiAgICBzdWJkb21haW5JbnB1dC52YWx1ZSA9IGRlZmF1bHRTdWJkb21haW47XG5cbiAgICAvLyBTaG93IHN1YnBhdGggY29tcGF0aWJpbGl0eSB3YXJuaW5nIGluIHN1YmRpcmVjdG9yeSBtb2RlXG4gICAgY29uc3Qgc3VicGF0aFdhcm5pbmcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3VicGF0aC1jb21wYXQtd2FybmluZycpO1xuICAgIGlmIChzdWJwYXRoV2FybmluZykge1xuICAgICAgaWYgKFNJVEUucm91dGluZ01vZGUgPT09ICdzdWJkaXJlY3RvcnknKSB7XG4gICAgICAgIGNvbnN0IHN1cHBvcnQgPSBhcHBUZW1wbGF0ZS5zdWJwYXRoU3VwcG9ydCB8fCAnc3RyaXAnO1xuICAgICAgICBpZiAoc3VwcG9ydCA9PT0gJ25vbmUnKSB7XG4gICAgICAgICAgc3VicGF0aFdhcm5pbmcuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgc3VicGF0aFdhcm5pbmcuaW5uZXJIVE1MID0gJzxzcGFuIHN0eWxlPVwiY29sb3I6ICNmZjk4MDA7XCI+JiM5ODg4OyA8c3Ryb25nPicgKyBhcHBUZW1wbGF0ZS5uYW1lICsgJzwvc3Ryb25nPiBkb2VzIG5vdCBzdXBwb3J0IHN1YmRpcmVjdG9yeSBtb2RlLiBJdCBtYXkgbm90IHdvcmsgY29ycmVjdGx5IGF0IGEgc3VicGF0aC48L3NwYW4+JztcbiAgICAgICAgfSBlbHNlIGlmIChzdXBwb3J0ID09PSAnc3RyaXAnKSB7XG4gICAgICAgICAgc3VicGF0aFdhcm5pbmcuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgc3VicGF0aFdhcm5pbmcuaW5uZXJIVE1MID0gJzxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj4mIzk0MzI7ICcgKyBhcHBUZW1wbGF0ZS5uYW1lICsgJyBoYXMgdW52ZXJpZmllZCBzdWJkaXJlY3Rvcnkgc3VwcG9ydC4gSXQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjb25maWd1cmF0aW9uLjwvc3Bhbj4nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN1YnBhdGhXYXJuaW5nLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN1YnBhdGhXYXJuaW5nLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUHJlLXNlbGVjdCBETlMvU1NMIGZyb20gc2l0ZSBjb25maWcgKHNldCBkdXJpbmcgc2V0dXAgd2l6YXJkKVxuICAgIGNvbnN0IGNmZ0Ruc1R5cGUgPSBTSVRFLmRlZmF1bHRzLmRuc1R5cGUgfHwgKFNJVEUuY29uZmlndXJhdGlvblR5cGUgPT09ICdwdWJsaWMnID8gJ3B1YmxpYycgOiAncHJpdmF0ZScpO1xuICAgIGNvbnN0IGNmZ1NzbFR5cGUgPSBTSVRFLmRlZmF1bHRzLnNzbFR5cGUgfHwgKFNJVEUuY29uZmlndXJhdGlvblR5cGUgPT09ICdwdWJsaWMnID8gJ2xldHNlbmNyeXB0JyA6ICdpbnRlcm5hbCcpO1xuICAgIGNvbnN0IGRuc1JhZGlvID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgaW5wdXRbbmFtZT1cImRucy10eXBlXCJdW3ZhbHVlPVwiJHtjZmdEbnNUeXBlfVwiXWApO1xuICAgIGNvbnN0IHNzbFJhZGlvID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgaW5wdXRbbmFtZT1cInNzbC10eXBlXCJdW3ZhbHVlPVwiJHtjZmdTc2xUeXBlfVwiXWApO1xuICAgIGlmIChkbnNSYWRpbykgZG5zUmFkaW8uY2hlY2tlZCA9IHRydWU7XG4gICAgZWxzZSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dFtuYW1lPVwiZG5zLXR5cGVcIl1bdmFsdWU9XCJwcml2YXRlXCJdJykuY2hlY2tlZCA9IHRydWU7XG4gICAgaWYgKHNzbFJhZGlvKSBzc2xSYWRpby5jaGVja2VkID0gdHJ1ZTtcbiAgICBlbHNlIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W25hbWU9XCJzc2wtdHlwZVwiXVt2YWx1ZT1cImludGVybmFsXCJdJykuY2hlY2tlZCA9IHRydWU7XG4gICAgaXBJbnB1dC52YWx1ZSA9IFNJVEUuZGVmYXVsdHMudGFyZ2V0SVAgfHwgJ2xvY2FsaG9zdCc7XG4gICAgdGFpbHNjYWxlQ2hlY2tib3guY2hlY2tlZCA9IGZhbHNlO1xuXG4gICAgLy8gTW92ZSBETlMvU1NMIGludG8gQWR2YW5jZWQgc2VjdGlvbiB3aGVuIGFscmVhZHkgY29uZmlndXJlZFxuICAgIGNvbnN0IGRuc1NlY3Rpb24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYXBwLWRlcGxveS1tb2RhbCAuZmxleC1jb2wtZ2FwJyk/LmNsb3Nlc3QoJ2RpdicpO1xuICAgIGNvbnN0IGFkdmFuY2VkRGV0YWlscyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNhcHAtZGVwbG95LW1vZGFsIGRldGFpbHMnKTtcbiAgICBjb25zdCBhZHZhbmNlZENvbnRlbnQgPSBhZHZhbmNlZERldGFpbHM/LnF1ZXJ5U2VsZWN0b3IoJ2RpdicpO1xuICAgIGlmIChhZHZhbmNlZERldGFpbHMgJiYgYWR2YW5jZWRDb250ZW50ICYmIChTSVRFLmNvbmZpZ3VyYXRpb25UeXBlID09PSAncHVibGljJyB8fCBTSVRFLmNvbmZpZ3VyYXRpb25UeXBlID09PSAnaG9tZWxhYicpKSB7XG4gICAgICAvLyBNb3ZlIEROUyBhbmQgU1NMIHNlY3Rpb25zIGluc2lkZSBBZHZhbmNlZFxuICAgICAgY29uc3QgZG5zU2VjdGlvbkVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI2FwcC1kZXBsb3ktbW9kYWwgaW5wdXRbbmFtZT1cImRucy10eXBlXCJdJylbMF0/LmNsb3Nlc3QoJ2Rpdi5mbGV4LWNvbC1nYXAnKT8ucGFyZW50RWxlbWVudDtcbiAgICAgIGNvbnN0IHNzbFNlY3Rpb25FbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNhcHAtZGVwbG95LW1vZGFsIGlucHV0W25hbWU9XCJzc2wtdHlwZVwiXScpWzBdPy5jbG9zZXN0KCdkaXYuZmxleC1jb2wtZ2FwJyk/LnBhcmVudEVsZW1lbnQ7XG4gICAgICBpZiAoZG5zU2VjdGlvbkVsICYmICFkbnNTZWN0aW9uRWwuZGF0YXNldC5tb3ZlZCkge1xuICAgICAgICBhZHZhbmNlZENvbnRlbnQuYXBwZW5kQ2hpbGQoZG5zU2VjdGlvbkVsKTtcbiAgICAgICAgZG5zU2VjdGlvbkVsLmRhdGFzZXQubW92ZWQgPSAnMSc7XG4gICAgICB9XG4gICAgICBpZiAoc3NsU2VjdGlvbkVsICYmICFzc2xTZWN0aW9uRWwuZGF0YXNldC5tb3ZlZCkge1xuICAgICAgICBhZHZhbmNlZENvbnRlbnQuYXBwZW5kQ2hpbGQoc3NsU2VjdGlvbkVsKTtcbiAgICAgICAgc3NsU2VjdGlvbkVsLmRhdGFzZXQubW92ZWQgPSAnMSc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIG1lZGlhIHBhdGggc2VjdGlvbiBmb3IgbWVkaWEgYXBwc1xuICAgIGNvbnN0IG1lZGlhUGF0aFNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWVkaWEtcGF0aC1zZWN0aW9uJyk7XG4gICAgY29uc3QgbWVkaWFQYXRoSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVwbG95LW1lZGlhLXBhdGgnKTtcbiAgICBjb25zdCBtZWRpYVBhdGhEZXNjcmlwdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZWRpYS1wYXRoLWRlc2NyaXB0aW9uJyk7XG5cbiAgICBpZiAoYXBwVGVtcGxhdGUubWVkaWFNb3VudCkge1xuICAgICAgbWVkaWFQYXRoU2VjdGlvbi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgIG1lZGlhUGF0aElucHV0LnZhbHVlID0gJyc7XG4gICAgICBtZWRpYVBhdGhJbnB1dC5wbGFjZWhvbGRlciA9ICcvbWVkaWEvTW92aWVzLCAvbWVkaWEvVFZTaG93cyBvciBjbGljayBCcm93c2UnO1xuXG4gICAgICAvLyBGZXRjaCBkZXRlY3RlZCBtb3VudHMgZnJvbSBleGlzdGluZyBtZWRpYSBzZXJ2ZXJzXG4gICAgICBjb25zdCBkZXRlY3RlZE1vdW50c0NvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZXRlY3RlZC1tb3VudHMtY29udGFpbmVyJyk7XG4gICAgICBjb25zdCBkZXRlY3RlZE1vdW50c0xpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGV0ZWN0ZWQtbW91bnRzLWxpc3QnKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbW91bnRzUmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9tZWRpYS9kZXRlY3RlZC1tb3VudHMnKTtcbiAgICAgICAgY29uc3QgbW91bnRzUmVzdWx0ID0gYXdhaXQgbW91bnRzUmVzcG9uc2UuanNvbigpO1xuXG4gICAgICAgIGlmIChtb3VudHNSZXN1bHQuc3VjY2VzcyAmJiBtb3VudHNSZXN1bHQubW91bnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBkZXRlY3RlZE1vdW50c0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgICBkZXRlY3RlZE1vdW50c0xpc3QuaW5uZXJIVE1MID0gJyc7XG5cbiAgICAgICAgICAvLyBBdXRvLWZpbGwgbWVkaWEgcGF0aCB3aXRoIGFsbCBkZXRlY3RlZCBtb3VudHNcbiAgICAgICAgICBjb25zdCBhdXRvUGF0aHMgPSBbLi4ubmV3IFNldChtb3VudHNSZXN1bHQubW91bnRzLm1hcChtID0+IG0uaG9zdFBhdGgpKV07XG4gICAgICAgICAgbWVkaWFQYXRoSW5wdXQudmFsdWUgPSBhdXRvUGF0aHMuam9pbignLCAnKTtcblxuICAgICAgICAgIG1vdW50c1Jlc3VsdC5tb3VudHMuZm9yRWFjaChtb3VudCA9PiB7XG4gICAgICAgICAgICBjb25zdCBidG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgICAgICAgICAgIGJ0bi50eXBlID0gJ2J1dHRvbic7XG4gICAgICAgICAgICBjb25zdCBpc1NlbGVjdGVkID0gYXV0b1BhdGhzLmluY2x1ZGVzKG1vdW50Lmhvc3RQYXRoKTtcbiAgICAgICAgICAgIGJ0bi5zdHlsZS5jc3NUZXh0ID0gYHBhZGRpbmc6IDhweCAxNHB4OyBmb250LXNpemU6IDAuODVyZW07IGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1zdWNjZXNzKSAke2lzU2VsZWN0ZWQgPyAnNDAlJyA6ICcxNSUnfSwgdmFyKC0tY2FyZC1iZykpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1zdWNjZXNzKTsgYm9yZGVyLXJhZGl1czogNnB4OyBjdXJzb3I6IHBvaW50ZXI7IGNvbG9yOiB2YXIoLS1mZyk7YDtcbiAgICAgICAgICAgIGJ0bi5pbm5lckhUTUwgPSBgPHNwYW4gc3R5bGU9XCJmb250LXdlaWdodDogNTAwO1wiPiR7ZXNjYXBlSHRtbChtb3VudC5mb2xkZXJOYW1lKX08L3NwYW4+PGJyPjxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAwLjdyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+ZnJvbSAke2VzY2FwZUh0bWwobW91bnQuc291cmNlSW1hZ2UpfTwvc3Bhbj5gO1xuICAgICAgICAgICAgYnRuLnRpdGxlID0gYCR7bW91bnQuaG9zdFBhdGh9IChmcm9tICR7bW91bnQuc291cmNlQ29udGFpbmVyfSlgO1xuICAgICAgICAgICAgYnRuLm9uY2xpY2sgPSAoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRQYXRocyA9IG1lZGlhUGF0aElucHV0LnZhbHVlLnNwbGl0KCcsJykubWFwKHAgPT4gcC50cmltKCkpLmZpbHRlcihwID0+IHApO1xuICAgICAgICAgICAgICBjb25zdCBpZHggPSBjdXJyZW50UGF0aHMuaW5kZXhPZihtb3VudC5ob3N0UGF0aCk7XG4gICAgICAgICAgICAgIGlmIChpZHggPj0gMCkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRQYXRocy5zcGxpY2UoaWR4LCAxKTtcbiAgICAgICAgICAgICAgICBidG4uc3R5bGUuYmFja2dyb3VuZCA9ICdjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tc3VjY2VzcykgMTUlLCB2YXIoLS1jYXJkLWJnKSknO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRQYXRocy5wdXNoKG1vdW50Lmhvc3RQYXRoKTtcbiAgICAgICAgICAgICAgICBidG4uc3R5bGUuYmFja2dyb3VuZCA9ICdjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tc3VjY2VzcykgNDAlLCB2YXIoLS1jYXJkLWJnKSknO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIG1lZGlhUGF0aElucHV0LnZhbHVlID0gY3VycmVudFBhdGhzLmpvaW4oJywgJyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZGV0ZWN0ZWRNb3VudHNMaXN0LmFwcGVuZENoaWxkKGJ0bik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGV0ZWN0ZWRNb3VudHNDb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBkZXRlY3RlZE1vdW50c0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgdXAgYnJvd3NlIGJ1dHRvblxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Jyb3dzZS1tZWRpYS1idG4nKS5vbmNsaWNrID0gKCkgPT4ge1xuICAgICAgICBvcGVuRm9sZGVyQnJvd3NlcihtZWRpYVBhdGhJbnB1dCk7XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBtZWRpYVBhdGhTZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICBtZWRpYVBhdGhJbnB1dC52YWx1ZSA9ICcnO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RldGVjdGVkLW1vdW50cy1jb250YWluZXInKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIH1cblxuICAgIC8vIFNob3cgUGxleCBjbGFpbSB0b2tlbiBzZWN0aW9uIGZvciBQbGV4IGRlcGxveW1lbnRzXG4gICAgY29uc3QgcGxleENsYWltU2VjdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwbGV4LWNsYWltLXNlY3Rpb24nKTtcbiAgICBpZiAocGxleENsYWltU2VjdGlvbikge1xuICAgICAgaWYgKGFwcFRlbXBsYXRlLmlkID09PSAncGxleCcgfHwgYXBwVGVtcGxhdGUuY2xhaW1Ub2tlbikge1xuICAgICAgICBwbGV4Q2xhaW1TZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVwbG95LXBsZXgtY2xhaW0nKS52YWx1ZSA9ICcnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGxleENsYWltU2VjdGlvbi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFBvcHVsYXRlIHZvbHVtZSBtb3VudHMgaW4gQWR2YW5jZWQgT3B0aW9uc1xuICAgIGNvbnN0IHZvbHVtZVNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndm9sdW1lLW1vdW50cy1zZWN0aW9uJyk7XG4gICAgY29uc3Qgdm9sdW1lTGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2b2x1bWUtbW91bnRzLWxpc3QnKTtcbiAgICB2b2x1bWVMaXN0LmlubmVySFRNTCA9ICcnO1xuXG4gICAgaWYgKGFwcFRlbXBsYXRlLmRvY2tlcj8udm9sdW1lcz8ubGVuZ3RoKSB7XG4gICAgICBjb25zdCBtZWRpYUNvbnRhaW5lclBhdGggPSBhcHBUZW1wbGF0ZS5tZWRpYU1vdW50Py5jb250YWluZXJQYXRoO1xuICAgICAgY29uc3Qgbm9uTWVkaWFWb2x1bWVzID0gYXBwVGVtcGxhdGUuZG9ja2VyLnZvbHVtZXMuZmlsdGVyKHYgPT4gIXYuaW5jbHVkZXMoJ3t7TUVESUFfUEFUSH19JykgJiYgIShtZWRpYUNvbnRhaW5lclBhdGggJiYgdi5lbmRzV2l0aCgnOicgKyBtZWRpYUNvbnRhaW5lclBhdGgpKSk7XG5cbiAgICAgIGlmIChub25NZWRpYVZvbHVtZXMubGVuZ3RoID4gMCkge1xuICAgICAgICB2b2x1bWVTZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICBub25NZWRpYVZvbHVtZXMuZm9yRWFjaCgodm9sLCBpKSA9PiB7XG4gICAgICAgICAgY29uc3QgW2hvc3REZWZhdWx0LCBjb250YWluZXJQYXRoXSA9IHZvbC5zcGxpdCgnOicpO1xuICAgICAgICAgIGNvbnN0IHJvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgIHJvdy5zdHlsZS5jc3NUZXh0ID0gJ2Rpc3BsYXk6IGZsZXg7IGdhcDogNnB4OyBhbGlnbi1pdGVtczogY2VudGVyOyc7XG4gICAgICAgICAgcm93LmlubmVySFRNTCA9IGBcbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwidm9sLWhvc3QtcGF0aFwiIGRhdGEtY29udGFpbmVyLXBhdGg9XCIke2NvbnRhaW5lclBhdGh9XCIgdmFsdWU9XCIke2hvc3REZWZhdWx0fVwiXG4gICAgICAgICAgICAgICAgICAgc3R5bGU9XCJmbGV4OiAxOyBwYWRkaW5nOiA4cHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmcpOyBjb2xvcjogdmFyKC0tZmcpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGZvbnQtc2l6ZTogMC44NXJlbTtcIiAvPlxuICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpOyBmb250LXNpemU6IDAuODVyZW07IHdoaXRlLXNwYWNlOiBub3dyYXA7XCI+XHUyMTkyICR7Y29udGFpbmVyUGF0aH08L3NwYW4+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInZvbC1icm93c2UtYnRuXCIgc3R5bGU9XCJwYWRkaW5nOiA4cHggMTBweDsgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50KTsgY29sb3I6IHdoaXRlOyBib3JkZXI6IG5vbmU7IGJvcmRlci1yYWRpdXM6IDZweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXNpemU6IDAuOHJlbTtcIj5cdUQ4M0RcdURDQzI8L2J1dHRvbj5cbiAgICAgICAgICBgO1xuICAgICAgICAgIHZvbHVtZUxpc3QuYXBwZW5kQ2hpbGQocm93KTtcbiAgICAgICAgICByb3cucXVlcnlTZWxlY3RvcignLnZvbC1icm93c2UtYnRuJykub25jbGljayA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlucHV0ID0gcm93LnF1ZXJ5U2VsZWN0b3IoJy52b2wtaG9zdC1wYXRoJyk7XG4gICAgICAgICAgICBvcGVuRm9sZGVyQnJvd3NlcihpbnB1dCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2b2x1bWVTZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHZvbHVtZVNlY3Rpb24uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB9XG5cbiAgICAvLyBTZXQgZGVmYXVsdCBwb3J0IGZyb20gdGVtcGxhdGUgYW5kIGNoZWNrIGF2YWlsYWJpbGl0eVxuICAgIGNvbnN0IGRlZmF1bHRQb3J0ID0gYXBwVGVtcGxhdGUuZGVmYXVsdFBvcnQgfHwgODA4MDtcbiAgICBwb3J0SW5wdXQudmFsdWUgPSAnJztcbiAgICBwb3J0SW5wdXQucGxhY2Vob2xkZXIgPSBgRGVmYXVsdDogJHtkZWZhdWx0UG9ydH1gO1xuXG4gICAgLy8gQWRkIHBvcnQgc3RhdHVzIGVsZW1lbnQgaWYgbm90IGV4aXN0c1xuICAgIGxldCBwb3J0U3RhdHVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlcGxveS1wb3J0LXN0YXR1cycpO1xuICAgIGlmICghcG9ydFN0YXR1cykge1xuICAgICAgcG9ydFN0YXR1cyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgcG9ydFN0YXR1cy5pZCA9ICdkZXBsb3ktcG9ydC1zdGF0dXMnO1xuICAgICAgcG9ydFN0YXR1cy5zdHlsZS5jc3NUZXh0ID0gJ2ZvbnQtc2l6ZTogMC44cmVtOyBtYXJnaW4tdG9wOiA0cHg7JztcbiAgICAgIHBvcnRJbnB1dC5wYXJlbnROb2RlLmFwcGVuZENoaWxkKHBvcnRTdGF0dXMpO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGRlZmF1bHQgcG9ydCBhdmFpbGFiaWxpdHlcbiAgICBhc3luYyBmdW5jdGlvbiBjaGVja0FuZFVwZGF0ZVBvcnRTdGF0dXMoKSB7XG4gICAgICBjb25zdCBwb3J0VG9DaGVjayA9IHBvcnRJbnB1dC52YWx1ZSB8fCBkZWZhdWx0UG9ydDtcbiAgICAgIHBvcnRTdGF0dXMuaW5uZXJIVE1MID0gJzxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj5DaGVja2luZyBwb3J0Li4uPC9zcGFuPic7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNoZWNrUG9ydEF2YWlsYWJpbGl0eShwb3J0VG9DaGVjayk7XG4gICAgICBpZiAocmVzdWx0LmF2YWlsYWJsZSkge1xuICAgICAgICBwb3J0U3RhdHVzLmlubmVySFRNTCA9IGA8c3BhbiBzdHlsZT1cImNvbG9yOiAjNGNhZjUwO1wiPlBvcnQgJHtlc2NhcGVIdG1sKFN0cmluZyhwb3J0VG9DaGVjaykpfSBpcyBhdmFpbGFibGU8L3NwYW4+YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHN1Z2dlc3RlZFBvcnQgPSBhd2FpdCBnZXRTdWdnZXN0ZWRQb3J0KGRlZmF1bHRQb3J0KTtcbiAgICAgICAgcG9ydFN0YXR1cy5pbm5lckhUTUwgPSBgXG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjogI2U3NGMzYztcIj5Qb3J0ICR7ZXNjYXBlSHRtbChwb3J0VG9DaGVjayl9IGluIHVzZSBieSAke2VzY2FwZUh0bWwocmVzdWx0LmNvbmZsaWN0Py51c2VkQnkgfHwgJ3Vua25vd24nKX08L3NwYW4+XG4gICAgICAgIGA7XG4gICAgICAgIGNvbnN0IHVzZUJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgICAgICB1c2VCdG4udHlwZSA9ICdidXR0b24nO1xuICAgICAgICB1c2VCdG4udGV4dENvbnRlbnQgPSBgVXNlICR7c3VnZ2VzdGVkUG9ydH1gO1xuICAgICAgICB1c2VCdG4uc3R5bGUuY3NzVGV4dCA9ICdtYXJnaW4tbGVmdDogOHB4OyBwYWRkaW5nOiAycHggOHB4OyBmb250LXNpemU6IDAuNzVyZW07IGN1cnNvcjogcG9pbnRlcjsnO1xuICAgICAgICB1c2VCdG4ub25jbGljayA9ICgpID0+IHtcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVwbG95LXBvcnQnKS52YWx1ZSA9IHN1Z2dlc3RlZFBvcnQ7XG4gICAgICAgICAgcG9ydFN0YXR1cy5pbm5lckhUTUwgPSBgPHNwYW4gc3R5bGU9XCJjb2xvcjogIzRjYWY1MDtcIj5Vc2luZyBzdWdnZXN0ZWQgcG9ydCAke2VzY2FwZUh0bWwoU3RyaW5nKHN1Z2dlc3RlZFBvcnQpKX08L3NwYW4+YDtcbiAgICAgICAgfTtcbiAgICAgICAgcG9ydFN0YXR1cy5hcHBlbmRDaGlsZCh1c2VCdG4pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrIHBvcnQgb24gaW5wdXQgY2hhbmdlIChkZWJvdW5jZWQpXG4gICAgbGV0IHBvcnRDaGVja1RpbWVvdXQ7XG4gICAgcG9ydElucHV0Lm9uaW5wdXQgPSBmdW5jdGlvbigpIHtcbiAgICAgIGNsZWFyVGltZW91dChwb3J0Q2hlY2tUaW1lb3V0KTtcbiAgICAgIHBvcnRDaGVja1RpbWVvdXQgPSBzZXRUaW1lb3V0KGNoZWNrQW5kVXBkYXRlUG9ydFN0YXR1cywgNTAwKTtcbiAgICB9O1xuXG4gICAgLy8gSW5pdGlhbCBwb3J0IGNoZWNrXG4gICAgY2hlY2tBbmRVcGRhdGVQb3J0U3RhdHVzKCk7XG5cbiAgICAvLyBGZXRjaCBUYWlsc2NhbGUgc3RhdHVzXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvdGFpbHNjYWxlL3N0YXR1cycpO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MgJiYgZGF0YS5pbnN0YWxsZWQgJiYgZGF0YS5jb25uZWN0ZWQpIHtcbiAgICAgICAgdGFpbHNjYWxlU3RhdHVzLmlubmVySFRNTCA9IGBcbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiAjNGNhZjUwO1wiPkNvbm5lY3RlZDwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi1sZWZ0OiA4cHg7XCI+JHtkYXRhLnNlbGY/Lmhvc3RuYW1lfSAoJHtkYXRhLnNlbGY/LmlwfSk8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tbGVmdDogOHB4O1wiPnwgJHtkYXRhLmRldmljZUNvdW50fSBkZXZpY2VzPC9zcGFuPlxuICAgICAgICBgO1xuICAgICAgfSBlbHNlIGlmIChkYXRhLmluc3RhbGxlZCkge1xuICAgICAgICB0YWlsc2NhbGVTdGF0dXMuaW5uZXJIVE1MID0gYDxzcGFuIHN0eWxlPVwiY29sb3I6ICNmZjk4MDA7XCI+Tm90IGNvbm5lY3RlZDwvc3Bhbj5gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFpbHNjYWxlU3RhdHVzLmlubmVySFRNTCA9IGA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+Tm90IGF2YWlsYWJsZTwvc3Bhbj5gO1xuICAgICAgICB0YWlsc2NhbGVDaGVja2JveC5kaXNhYmxlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGFpbHNjYWxlU3RhdHVzLmlubmVySFRNTCA9IGA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+Q291bGQgbm90IGNoZWNrIHN0YXR1czwvc3Bhbj5gO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBVUkwgcHJldmlldyBpbiByZWFsLXRpbWVcbiAgICBmdW5jdGlvbiB1cGRhdGVVcmxQcmV2aWV3KCkge1xuICAgICAgY29uc3Qgc3ViZG9tYWluID0gc3ViZG9tYWluSW5wdXQudmFsdWUgfHwgJ3N1YmRvbWFpbic7XG4gICAgICBjb25zdCBkbnNUeXBlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaW5wdXRbbmFtZT1cImRucy10eXBlXCJdOmNoZWNrZWQnKS52YWx1ZTtcbiAgICAgIGNvbnN0IHNzbFR5cGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dFtuYW1lPVwic3NsLXR5cGVcIl06Y2hlY2tlZCcpLnZhbHVlO1xuXG4gICAgICBsZXQgdXJsID0gJyc7XG4gICAgICBpZiAoU0lURS5yb3V0aW5nTW9kZSA9PT0gJ3N1YmRpcmVjdG9yeScgJiYgU0lURS5kb21haW4pIHtcbiAgICAgICAgLy8gU3ViZGlyZWN0b3J5IG1vZGU6IGRvbWFpbi5jb20vYXBwXG4gICAgICAgIHVybCA9IGBodHRwczovLyR7U0lURS5kb21haW59LyR7c3ViZG9tYWlufWA7XG4gICAgICB9IGVsc2UgaWYgKGRuc1R5cGUgPT09ICdwcml2YXRlJykge1xuICAgICAgICBjb25zdCBwcm90b2NvbCA9IHNzbFR5cGUgPT09ICdub25lJyA/ICdodHRwJyA6ICdodHRwcyc7XG4gICAgICAgIHVybCA9IGAke3Byb3RvY29sfTovLyR7YnVpbGREb21haW4oc3ViZG9tYWluKX1gO1xuICAgICAgfSBlbHNlIGlmIChkbnNUeXBlID09PSAncHVibGljJykge1xuICAgICAgICBjb25zdCBwcm90b2NvbCA9IHNzbFR5cGUgPT09ICdub25lJyA/ICdodHRwJyA6ICdodHRwcyc7XG4gICAgICAgIGNvbnN0IGRvbWFpbiA9IFNJVEUuZG9tYWluIHx8IHN1YmRvbWFpbjtcbiAgICAgICAgdXJsID0gU0lURS5kb21haW4gPyBgJHtwcm90b2NvbH06Ly8ke3N1YmRvbWFpbn0uJHtTSVRFLmRvbWFpbn1gIDogYCR7cHJvdG9jb2x9Oi8vJHtzdWJkb21haW59YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHBvcnQgPSBwb3J0SW5wdXQudmFsdWUgfHwgYXBwVGVtcGxhdGUuZGVmYXVsdFBvcnQgfHwgREMuREVGQVVMVFMuU0VSVklDRV9QT1JUO1xuICAgICAgICB1cmwgPSBgaHR0cDovLyR7aXBJbnB1dC52YWx1ZX06JHtwb3J0fWA7XG4gICAgICB9XG4gICAgICB1cmxQcmV2aWV3LnRleHRDb250ZW50ID0gdXJsO1xuICAgIH1cblxuICAgIC8vIEF0dGFjaCBsaXN0ZW5lcnNcbiAgICBzdWJkb21haW5JbnB1dC5vbmlucHV0ID0gdXBkYXRlVXJsUHJldmlldztcbiAgICBpcElucHV0Lm9uaW5wdXQgPSB1cGRhdGVVcmxQcmV2aWV3O1xuICAgIHBvcnRJbnB1dC5vbmlucHV0ID0gdXBkYXRlVXJsUHJldmlldztcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFtuYW1lPVwiZG5zLXR5cGVcIl0nKS5mb3JFYWNoKHJhZGlvID0+IHtcbiAgICAgIHJhZGlvLm9uY2hhbmdlID0gdXBkYXRlVXJsUHJldmlldztcbiAgICB9KTtcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFtuYW1lPVwic3NsLXR5cGVcIl0nKS5mb3JFYWNoKHJhZGlvID0+IHtcbiAgICAgIHJhZGlvLm9uY2hhbmdlID0gdXBkYXRlVXJsUHJldmlldztcbiAgICB9KTtcblxuICAgIHVwZGF0ZVVybFByZXZpZXcoKTtcblxuICAgIC8vIENsb3NlIGFwcCBzZWxlY3Rvciwgb3BlbiBkZXBsb3kgY29uZmlnXG4gICAgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgIGRlcGxveU1vZGFsLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcblxuICAgIC8vIFN0b3JlIGFwcCB0ZW1wbGF0ZSBmb3IgZGVwbG95bWVudFxuICAgIGRlcGxveU1vZGFsLmRhdGFzZXQuYXBwVGVtcGxhdGUgPSBKU09OLnN0cmluZ2lmeShhcHBUZW1wbGF0ZSk7XG4gIH1cblxuICAvLyBBZGQgYXBwIHRvIGdyaWQgd2l0aCBmdWxsIERvY2tlciBkZXBsb3ltZW50XG4gIGFzeW5jIGZ1bmN0aW9uIGFkZEFwcFRvR3JpZChkZXBsb3lDb25maWcpIHtcbiAgICBjb25zdCBhcHBUZW1wbGF0ZSA9IGRlcGxveUNvbmZpZy5hcHBUZW1wbGF0ZTtcbiAgICBjb25zdCBjdXN0b21BcHBzID0gc2FmZUdldEpTT04oQVBQU19LRVksIFtdKTtcblxuICAgIC8vIENoZWNrIGlmIHVzaW5nIGV4aXN0aW5nIGNvbnRhaW5lclxuICAgIGNvbnN0IHVzaW5nRXhpc3RpbmcgPSBhcHBUZW1wbGF0ZS5fdXNlRXhpc3RpbmcgJiYgYXBwVGVtcGxhdGUuX2V4aXN0aW5nQ29udGFpbmVyO1xuXG4gICAgLy8gQ2hlY2sgaWYgYXBwIGFscmVhZHkgZXhpc3RzIC0gc2tpcCBpZiB1c2luZyBleGlzdGluZyBjb250YWluZXIgKHVzZXIgYWxyZWFkeSBjb25maXJtZWQpXG4gICAgY29uc3QgZXhpc3RpbmdBcHAgPSBjdXN0b21BcHBzLmZpbmQoYSA9PiBhLmlkID09PSBkZXBsb3lDb25maWcuc3ViZG9tYWluKTtcbiAgICBpZiAoZXhpc3RpbmdBcHAgJiYgIXVzaW5nRXhpc3RpbmcpIHtcbiAgICAgIGNvbnN0IGNvbmZpcm1lZCA9IGNvbmZpcm0oYEFuIGFwcCB3aXRoIHN1YmRvbWFpbiBcIiR7ZGVwbG95Q29uZmlnLnN1YmRvbWFpbn1cIiBhbHJlYWR5IGV4aXN0cy4gUmVkZXBsb3k/YCk7XG4gICAgICBpZiAoIWNvbmZpcm1lZCkgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBSZW1vdmUgZnJvbSBsb2NhbFN0b3JhZ2UgdG8gYWxsb3cgcmVkZXBsb3ltZW50L3VwZGF0ZVxuICAgIGlmIChleGlzdGluZ0FwcCkge1xuICAgICAgY29uc3QgaW5kZXggPSBjdXN0b21BcHBzLmluZGV4T2YoZXhpc3RpbmdBcHApO1xuICAgICAgY3VzdG9tQXBwcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgc2FmZVNldChBUFBTX0tFWSwgSlNPTi5zdHJpbmdpZnkoY3VzdG9tQXBwcykpO1xuICAgIH1cblxuICAgIC8vIENoZWNrIHBvcnQgYXZhaWxhYmlsaXR5IGJlZm9yZSBkZXBsb3ltZW50IChza2lwIGlmIHVzaW5nIGV4aXN0aW5nIGNvbnRhaW5lcilcbiAgICBpZiAoIXVzaW5nRXhpc3RpbmcpIHtcbiAgICAgIGNvbnN0IHBvcnRUb1VzZSA9IGRlcGxveUNvbmZpZy5wb3J0IHx8IGFwcFRlbXBsYXRlLmRlZmF1bHRQb3J0IHx8IDgwODA7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKGBDaGVja2luZyBwb3J0ICR7cG9ydFRvVXNlfSBhdmFpbGFiaWxpdHkuLi5gLCAnaW5mbycsIDApO1xuXG4gICAgICBjb25zdCBwb3J0Q2hlY2sgPSBhd2FpdCBjaGVja1BvcnRBdmFpbGFiaWxpdHkocG9ydFRvVXNlKTtcbiAgICAgIGlmICghcG9ydENoZWNrLmF2YWlsYWJsZSkge1xuICAgICAgICBjb25zdCBzdWdnZXN0ZWRQb3J0ID0gYXdhaXQgZ2V0U3VnZ2VzdGVkUG9ydChhcHBUZW1wbGF0ZS5kZWZhdWx0UG9ydCB8fCA4MDgwKTtcbiAgICAgICAgY29uc3QgdXNlQWx0ZXJuYXRlID0gY29uZmlybShcbiAgICAgICAgICBgUG9ydCAke3BvcnRUb1VzZX0gaXMgYWxyZWFkeSBpbiB1c2UgYnkgJHtwb3J0Q2hlY2suY29uZmxpY3Q/LnVzZWRCeSB8fCAnYW5vdGhlciBjb250YWluZXInfS5cXG5cXG5gICtcbiAgICAgICAgICBgV291bGQgeW91IGxpa2UgdG8gdXNlIHBvcnQgJHtzdWdnZXN0ZWRQb3J0fSBpbnN0ZWFkP2BcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHVzZUFsdGVybmF0ZSkge1xuICAgICAgICAgIGRlcGxveUNvbmZpZy5wb3J0ID0gc3VnZ2VzdGVkUG9ydDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdEZXBsb3ltZW50IGNhbmNlbGxlZCAtIHBvcnQgY29uZmxpY3QnLCAnZXJyb3InLCA1MDAwKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVXNlIGV4aXN0aW5nIGNvbnRhaW5lcidzIHBvcnRcbiAgICAgIGRlcGxveUNvbmZpZy5wb3J0ID0gYXBwVGVtcGxhdGUuX2V4aXN0aW5nQ29udGFpbmVyLnByaW1hcnlQb3J0O1xuICAgIH1cbiAgICBzaG93Tm90aWZpY2F0aW9uKFxuICAgICAgdXNpbmdFeGlzdGluZ1xuICAgICAgICA/IGBDb25maWd1cmluZyAke2FwcFRlbXBsYXRlLm5hbWV9IHdpdGggZXhpc3RpbmcgY29udGFpbmVyLi4uYFxuICAgICAgICA6IGBEZXBsb3lpbmcgJHthcHBUZW1wbGF0ZS5uYW1lfS4uLmAsXG4gICAgICAnaW5mbycsIDBcbiAgICApO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFByZXBhcmUgZGVwbG95bWVudCBjb25maWcgZnJvbSB1c2VyJ3MgY2hvaWNlc1xuICAgICAgY29uc3QgYXBpRGVwbG95Q29uZmlnID0ge1xuICAgICAgICBhcHBJZDogYXBwVGVtcGxhdGUuaWQsXG4gICAgICAgIGNvbmZpZzoge1xuICAgICAgICAgIHN1YmRvbWFpbjogZGVwbG95Q29uZmlnLnN1YmRvbWFpbixcbiAgICAgICAgICBpcDogZGVwbG95Q29uZmlnLmlwLFxuICAgICAgICAgIGNyZWF0ZURuczogZGVwbG95Q29uZmlnLmRuc1R5cGUgPT09ICdwcml2YXRlJywgIC8vIE9ubHkgY3JlYXRlIEROUyBmb3IgcHJpdmF0ZVxuICAgICAgICAgIHBvcnQ6IGRlcGxveUNvbmZpZy5wb3J0IHx8IGFwcFRlbXBsYXRlLmRlZmF1bHRQb3J0IHx8IG51bGwsICAvLyBVc2UgY3VzdG9tLCB0ZW1wbGF0ZSBkZWZhdWx0LCBvciBudWxsXG4gICAgICAgICAgc3NsVHlwZTogZGVwbG95Q29uZmlnLnNzbFR5cGUsXG4gICAgICAgICAgZG5zVHlwZTogZGVwbG95Q29uZmlnLmRuc1R5cGUsXG4gICAgICAgICAgdGFpbHNjYWxlT25seTogZGVwbG95Q29uZmlnLnRhaWxzY2FsZU9ubHkgfHwgZmFsc2UsICAvLyBUYWlsc2NhbGUtb25seSBhY2Nlc3MgcmVzdHJpY3Rpb25cbiAgICAgICAgICBtZWRpYVBhdGg6IGRlcGxveUNvbmZpZy5tZWRpYVBhdGggfHwgbnVsbCwgIC8vIE1lZGlhIGZvbGRlciBwYXRoIGZvciBtZWRpYSBhcHBzXG4gICAgICAgICAgcGxleENsYWltVG9rZW46IGRlcGxveUNvbmZpZy5wbGV4Q2xhaW1Ub2tlbiB8fCBudWxsLCAgLy8gUGxleCBjbGFpbSB0b2tlbiBmb3IgYXV0by1jbGFpbVxuICAgICAgICAgIGN1c3RvbVZvbHVtZXM6IGRlcGxveUNvbmZpZy5jdXN0b21Wb2x1bWVzIHx8IG51bGwgIC8vIEN1c3RvbSB2b2x1bWUgbW91bnQgb3ZlcnJpZGVzXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIC8vIEFkZCBleGlzdGluZyBjb250YWluZXIgaW5mbyBpZiB1c2luZyBleGlzdGluZ1xuICAgICAgaWYgKHVzaW5nRXhpc3RpbmcpIHtcbiAgICAgICAgYXBpRGVwbG95Q29uZmlnLmNvbmZpZy51c2VFeGlzdGluZyA9IHRydWU7XG4gICAgICAgIGFwaURlcGxveUNvbmZpZy5jb25maWcuZXhpc3RpbmdDb250YWluZXJJZCA9IGFwcFRlbXBsYXRlLl9leGlzdGluZ0NvbnRhaW5lci5pZDtcbiAgICAgICAgYXBpRGVwbG95Q29uZmlnLmNvbmZpZy5leGlzdGluZ1BvcnQgPSBhcHBUZW1wbGF0ZS5fZXhpc3RpbmdDb250YWluZXIucHJpbWFyeVBvcnQ7XG4gICAgICAgIC8vIFVzZSBleGlzdGluZyBjb250YWluZXIncyBwb3J0IGlmIG5vIGN1c3RvbSBwb3J0IHNwZWNpZmllZFxuICAgICAgICBpZiAoIWRlcGxveUNvbmZpZy5wb3J0ICYmIGFwcFRlbXBsYXRlLl9leGlzdGluZ0NvbnRhaW5lci5wcmltYXJ5UG9ydCkge1xuICAgICAgICAgIGFwaURlcGxveUNvbmZpZy5jb25maWcucG9ydCA9IGFwcFRlbXBsYXRlLl9leGlzdGluZ0NvbnRhaW5lci5wcmltYXJ5UG9ydDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBDYWxsIGRlcGxveW1lbnQgQVBJXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2FwcHMvZGVwbG95Jywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGFwaURlcGxveUNvbmZpZylcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgICAgIGlmIChyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAvLyBBZGQgdG8gc2F2ZWQgYXBwcyAoc3RvcmUgSVAgZm9yIGxhdGVyIGRlbGV0aW9uKVxuICAgICAgICBjb25zdCBuZXdBcHAgPSB7XG4gICAgICAgICAgaWQ6IGRlcGxveUNvbmZpZy5zdWJkb21haW4sICAvLyBVc2Ugc3ViZG9tYWluIGFzIElEXG4gICAgICAgICAgbmFtZTogYXBwVGVtcGxhdGUubmFtZSxcbiAgICAgICAgICBsb2dvOiBgL2Fzc2V0cy8ke2FwcFRlbXBsYXRlLmlkfS5wbmdgLFxuICAgICAgICAgIGNvbnRhaW5lcklkOiByZXN1bHQuY29udGFpbmVySWQsXG4gICAgICAgICAgdXJsOiByZXN1bHQudXJsLFxuICAgICAgICAgIGlwOiBkZXBsb3lDb25maWcuaXAsICAvLyBTdG9yZSBJUCBmb3IgRE5TIHJlY29yZCBkZWxldGlvblxuICAgICAgICAgIGFwcFRlbXBsYXRlOiBhcHBUZW1wbGF0ZS5pZCwgIC8vIFN0b3JlIG9yaWdpbmFsIHRlbXBsYXRlIElEXG4gICAgICAgICAgdGFpbHNjYWxlT25seTogZGVwbG95Q29uZmlnLnRhaWxzY2FsZU9ubHkgfHwgZmFsc2UgIC8vIFRhaWxzY2FsZSBwcm90ZWN0aW9uIHN0YXR1c1xuICAgICAgICB9O1xuICAgICAgICBjdXN0b21BcHBzLnB1c2gobmV3QXBwKTtcbiAgICAgICAgc2FmZVNldChBUFBTX0tFWSwgSlNPTi5zdHJpbmdpZnkoY3VzdG9tQXBwcykpO1xuXG4gICAgICAgIC8vIEFkZCB0byBBUFBTIGFycmF5IGFuZCByZWJ1aWxkIGdyaWRcbiAgICAgICAgLy8gQWNjZXNzIEFQUFMgZnJvbSBwYXJlbnQgc2NvcGUgdmlhIHdpbmRvd1xuICAgICAgICBpZiAod2luZG93LkFQUFMgJiYgIXdpbmRvdy5BUFBTLnNvbWUoYSA9PiBhLmlkID09PSBhcHBUZW1wbGF0ZS5pZCkpIHtcbiAgICAgICAgICB3aW5kb3cuQVBQUy5wdXNoKG5ld0FwcCk7XG4gICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cuYnVpbGRHcmlkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB3aW5kb3cuYnVpbGRHcmlkKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93LnJlZnJlc2hBbGwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gd2luZG93LnJlZnJlc2hBbGwoKSwgNTAwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTaG93IHN1Y2Nlc3Mgd2l0aCBVUkwgKGFuZCB3YXJuaW5nIGlmIEROUyBmYWlsZWQpXG4gICAgICAgIGxldCBtZXNzYWdlID0gcmVzdWx0LnVzZWRFeGlzdGluZ1xuICAgICAgICAgID8gYCR7YXBwVGVtcGxhdGUubmFtZX0gY29uZmlndXJlZCB3aXRoIGV4aXN0aW5nIGNvbnRhaW5lciFcXG5VUkw6ICR7cmVzdWx0LnVybH1gXG4gICAgICAgICAgOiBgJHthcHBUZW1wbGF0ZS5uYW1lfSBkZXBsb3llZCBzdWNjZXNzZnVsbHkhXFxuVVJMOiAke3Jlc3VsdC51cmx9YDtcbiAgICAgICAgaWYgKHJlc3VsdC53YXJuaW5nKSB7XG4gICAgICAgICAgbWVzc2FnZSArPSBgXFxuXFxuXHUyNkEwIFdhcm5pbmc6ICR7cmVzdWx0Lndhcm5pbmd9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIHNob3dOb3RpZmljYXRpb24obWVzc2FnZSwgJ3N1Y2Nlc3MnLCA4MDAwKTtcblxuICAgICAgICAvLyBDbGVhbiB1cCB0ZW1wb3JhcnkgcHJvcGVydGllc1xuICAgICAgICBkZWxldGUgYXBwVGVtcGxhdGUuX3VzZUV4aXN0aW5nO1xuICAgICAgICBkZWxldGUgYXBwVGVtcGxhdGUuX2V4aXN0aW5nQ29udGFpbmVyO1xuICAgICAgICBcbiAgICAgICAgLy8gRm9yIEhUVFBTIFVSTHMsIGNoZWNrIFNTTCBjZXJ0aWZpY2F0ZSBzdGF0dXNcbiAgICAgICAgaWYgKHJlc3VsdC51cmwgJiYgcmVzdWx0LnVybC5zdGFydHNXaXRoKCdodHRwczovLycpKSB7XG4gICAgICAgICAgY2hlY2tTU0xDZXJ0aWZpY2F0ZShyZXN1bHQudXJsLCBhcHBUZW1wbGF0ZS5uYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNob3cgc2V0dXAgaW5zdHJ1Y3Rpb25zIGlmIGF2YWlsYWJsZVxuICAgICAgICBpZiAocmVzdWx0LnNldHVwSW5zdHJ1Y3Rpb25zICYmIHJlc3VsdC5zZXR1cEluc3RydWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSByZXN1bHQuc2V0dXBJbnN0cnVjdGlvbnMuam9pbignXFxuJyk7XG4gICAgICAgICAgICBzaG93Tm90aWZpY2F0aW9uKGBTZXR1cCBJbnN0cnVjdGlvbnMgZm9yICR7YXBwVGVtcGxhdGUubmFtZX06ICR7aW5zdHJ1Y3Rpb25zfWAsICdpbmZvJywgMTAwMDApO1xuICAgICAgICAgIH0sIDEwMDApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocmVzdWx0LmVycm9yIHx8ICdEZXBsb3ltZW50IGZhaWxlZCcpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBlcnJvckhhbmRsZXIubG9nRXJyb3IoJ1tBcHBTZWxlY3Rvcl0gRGVwbG95bWVudCcsIGVycm9yLCB7IGZ1bmN0aW9uOiAnZGVwbG95JyB9KTtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oXG4gICAgICAgIGBGYWlsZWQgdG8gZGVwbG95ICR7YXBwVGVtcGxhdGUubmFtZX06ICR7ZXJyb3IubWVzc2FnZX1gLFxuICAgICAgICAnZXJyb3InLFxuICAgICAgICA4MDAwXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vIENoZWNrIFNTTCBjZXJ0aWZpY2F0ZSBzdGF0dXMgYW5kIG5vdGlmeSB3aGVuIHJlYWR5XG4gIGFzeW5jIGZ1bmN0aW9uIGNoZWNrU1NMQ2VydGlmaWNhdGUodXJsLCBhcHBOYW1lKSB7XG4gICAgc2hvd05vdGlmaWNhdGlvbihgXHUyM0YzIEdlbmVyYXRpbmcgU1NMIGNlcnRpZmljYXRlIGZvciAke2FwcE5hbWV9Li4uYCwgJ3dhcm5pbmcnLCA2MDAwMCk7XG4gICAgXG4gICAgbGV0IGF0dGVtcHRzID0gMDtcbiAgICBjb25zdCBtYXhBdHRlbXB0cyA9IDEyOyAvLyA2MCBzZWNvbmRzIHRvdGFsICg1IHNlY29uZCBpbnRlcnZhbHMpXG4gICAgXG4gICAgY29uc3QgY2hlY2tDZXJ0ID0gYXN5bmMgKCkgPT4ge1xuICAgICAgYXR0ZW1wdHMrKztcbiAgICAgIFxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gVHJ5IHRvIGZldGNoIHRoZSBVUkwgLSBpZiBTU0wgd29ya3MsIHRoaXMgd2lsbCBzdWNjZWVkXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7IFxuICAgICAgICAgIG1ldGhvZDogJ0hFQUQnLFxuICAgICAgICAgIG1vZGU6ICduby1jb3JzJyAvLyBBdm9pZCBDT1JTIGlzc3Vlc1xuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIC8vIElmIHdlIGdldCBoZXJlLCBTU0wgaXMgd29ya2luZ1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKGBcdTI3MDUgJHthcHBOYW1lfSBpcyByZWFkeSEgU1NMIGNlcnRpZmljYXRlIGdlbmVyYXRlZC5gLCAnc3VjY2VzcycsIDUwMDApO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIFNTTCBub3QgcmVhZHkgeWV0XG4gICAgICAgIGlmIChhdHRlbXB0cyA8IG1heEF0dGVtcHRzKSB7XG4gICAgICAgICAgc2V0VGltZW91dChjaGVja0NlcnQsIDUwMDApOyAvLyBDaGVjayBhZ2FpbiBpbiA1IHNlY29uZHNcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzaG93Tm90aWZpY2F0aW9uKFxuICAgICAgICAgICAgYFx1MjZBMFx1RkUwRiAke2FwcE5hbWV9IGRlcGxveWVkIGJ1dCBTU0wgY2VydGlmaWNhdGUgbWF5IHN0aWxsIGJlIGdlbmVyYXRpbmcuXFxuVHJ5IHJlZnJlc2hpbmcgaW4gYSBtb21lbnQgaWYgeW91IHNlZSBhIGNlcnRpZmljYXRlIGVycm9yLmAsXG4gICAgICAgICAgICAnd2FybmluZycsXG4gICAgICAgICAgICAxMDAwMFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH07XG4gICAgXG4gICAgLy8gU3RhcnQgY2hlY2tpbmcgYWZ0ZXIgMyBzZWNvbmRzIChnaXZlIENhZGR5IHRpbWUgdG8gc3RhcnQpXG4gICAgc2V0VGltZW91dChjaGVja0NlcnQsIDMwMDApO1xuICB9XG5cbiAgLy8gTG9hZCBjdXN0b20gYXBwcyBvbiBzdGFydHVwXG4gIGZ1bmN0aW9uIGxvYWRDdXN0b21BcHBzKCkge1xuICAgIGNvbnN0IGN1c3RvbUFwcHMgPSBzYWZlR2V0SlNPTihBUFBTX0tFWSwgW10pO1xuICAgIGN1c3RvbUFwcHMuZm9yRWFjaChhcHAgPT4ge1xuICAgICAgaWYgKCF3aW5kb3cuQVBQUy5zb21lKGEgPT4gYS5pZCA9PT0gYXBwLmlkKSkge1xuICAgICAgICB3aW5kb3cuQVBQUy5wdXNoKGFwcCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBFdmVudCBsaXN0ZW5lcnNcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkZC1zZXJ2aWNlLWJ0bicpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBidWlsZEFwcFNlbGVjdG9yKCk7XG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICB9KTtcblxuICB3aXJlTW9kYWwobW9kYWwsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcHAtc2VsZWN0b3ItY2FuY2VsJykpO1xuXG4gIC8vIERlcGxveSBtb2RhbCBldmVudCBsaXN0ZW5lcnNcbiAgY29uc3QgZGVwbG95TW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXBwLWRlcGxveS1tb2RhbCcpO1xuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcHAtZGVwbG95LWNhbmNlbCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBkZXBsb3lNb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gIH0pO1xuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcHAtZGVwbG95LWNvbmZpcm0nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgLy8gR2V0IHVzZXIgY29uZmlndXJhdGlvblxuICAgIGNvbnN0IGFwcFRlbXBsYXRlID0gSlNPTi5wYXJzZShkZXBsb3lNb2RhbC5kYXRhc2V0LmFwcFRlbXBsYXRlKTtcbiAgICBjb25zdCBtZWRpYVBhdGggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVwbG95LW1lZGlhLXBhdGgnKS52YWx1ZS50cmltKCk7XG5cbiAgICAvLyBDb2xsZWN0IGN1c3RvbSB2b2x1bWUgb3ZlcnJpZGVzXG4gICAgY29uc3QgY3VzdG9tVm9sdW1lcyA9IFtdO1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyN2b2x1bWUtbW91bnRzLWxpc3QgLnZvbC1ob3N0LXBhdGgnKS5mb3JFYWNoKGlucHV0ID0+IHtcbiAgICAgIGN1c3RvbVZvbHVtZXMucHVzaCh7IGhvc3RQYXRoOiBpbnB1dC52YWx1ZS50cmltKCksIGNvbnRhaW5lclBhdGg6IGlucHV0LmRhdGFzZXQuY29udGFpbmVyUGF0aCB9KTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGRlcGxveUNvbmZpZyA9IHtcbiAgICAgIGFwcFRlbXBsYXRlOiBhcHBUZW1wbGF0ZSxcbiAgICAgIHN1YmRvbWFpbjogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlcGxveS1zdWJkb21haW4nKS52YWx1ZS50cmltKCksXG4gICAgICBkbnNUeXBlOiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dFtuYW1lPVwiZG5zLXR5cGVcIl06Y2hlY2tlZCcpLnZhbHVlLFxuICAgICAgc3NsVHlwZTogZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaW5wdXRbbmFtZT1cInNzbC10eXBlXCJdOmNoZWNrZWQnKS52YWx1ZSxcbiAgICAgIGlwOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVwbG95LWlwJykudmFsdWUudHJpbSgpLFxuICAgICAgcG9ydDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlcGxveS1wb3J0JykudmFsdWUudHJpbSgpLFxuICAgICAgdGFpbHNjYWxlT25seTogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlcGxveS10YWlsc2NhbGUtb25seScpLmNoZWNrZWQsXG4gICAgICBtZWRpYVBhdGg6IG1lZGlhUGF0aCB8fCBudWxsLFxuICAgICAgcGxleENsYWltVG9rZW46IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZXBsb3ktcGxleC1jbGFpbScpPy52YWx1ZS50cmltKCkgfHwgbnVsbCxcbiAgICAgIGN1c3RvbVZvbHVtZXM6IGN1c3RvbVZvbHVtZXMubGVuZ3RoID4gMCA/IGN1c3RvbVZvbHVtZXMgOiBudWxsLFxuICAgICAgcmVzb3VyY2VzOiB7XG4gICAgICAgIGNwdXM6IHBhcnNlRmxvYXQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlcGxveS1jcHUtbGltaXQnKS52YWx1ZSkgfHwgMCxcbiAgICAgICAgbWVtb3J5OiBwYXJzZUZsb2F0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZXBsb3ktbWVtb3J5LWxpbWl0JykudmFsdWUpIHx8IDAsXG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIFZhbGlkYXRlIHN1YmRvbWFpblxuICAgIGlmICghZGVwbG95Q29uZmlnLnN1YmRvbWFpbikge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignUGxlYXNlIGVudGVyIGEgc3ViZG9tYWluIG9yIGRvbWFpbiBuYW1lJywgJ3dhcm5pbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBtZWRpYSBwYXRoIGZvciBtZWRpYSBhcHBzXG4gICAgaWYgKGFwcFRlbXBsYXRlLm1lZGlhTW91bnQ/LnJlcXVpcmVkICYmICFtZWRpYVBhdGgpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ1BsZWFzZSBlbnRlciBhIG1lZGlhIGxpYnJhcnkgcGF0aCBmb3IgdGhpcyBhcHBsaWNhdGlvbicsICd3YXJuaW5nJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2xvc2UgZGVwbG95IG1vZGFsXG4gICAgZGVwbG95TW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuXG4gICAgLy8gU3RhcnQgZGVwbG95bWVudFxuICAgIGFkZEFwcFRvR3JpZChkZXBsb3lDb25maWcpO1xuICB9KTtcblxuICB3aXJlTW9kYWwoZGVwbG95TW9kYWwpO1xuXG4gIC8vID09PT09IEZPTERFUiBCUk9XU0VSIEZVTkNUSU9OQUxJVFkgPT09PT1cbiAgY29uc3QgZm9sZGVyQnJvd3Nlck1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZvbGRlci1icm93c2VyLW1vZGFsJyk7XG4gIGNvbnN0IGZvbGRlckJyb3dzZXJQYXRoID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZvbGRlci1icm93c2VyLXBhdGgnKTtcbiAgY29uc3QgZm9sZGVyQnJvd3Nlckxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZm9sZGVyLWJyb3dzZXItbGlzdCcpO1xuICBjb25zdCBmb2xkZXJCcm93c2VyU2VsZWN0ZWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZm9sZGVyLWJyb3dzZXItc2VsZWN0ZWQnKTtcbiAgY29uc3QgZm9sZGVyQnJvd3NlclNlbGVjdGVkTGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmb2xkZXItYnJvd3Nlci1zZWxlY3RlZC1saXN0Jyk7XG4gIGxldCBjdXJyZW50QnJvd3NlclBhdGggPSAnJztcbiAgbGV0IHNlbGVjdGVkRm9sZGVycyA9IFtdO1xuICBsZXQgdGFyZ2V0TWVkaWFJbnB1dCA9IG51bGw7XG5cbiAgd2luZG93Lm9wZW5Gb2xkZXJCcm93c2VyID0gZnVuY3Rpb24obWVkaWFJbnB1dCkge1xuICAgIHRhcmdldE1lZGlhSW5wdXQgPSBtZWRpYUlucHV0O1xuICAgIHNlbGVjdGVkRm9sZGVycyA9IG1lZGlhSW5wdXQudmFsdWUuc3BsaXQoJywnKS5tYXAocCA9PiBwLnRyaW0oKSkuZmlsdGVyKHAgPT4gcCk7XG4gICAgY3VycmVudEJyb3dzZXJQYXRoID0gJyc7XG4gICAgdXBkYXRlU2VsZWN0ZWRGb2xkZXJzRGlzcGxheSgpO1xuICAgIGxvYWRGb2xkZXJDb250ZW50cygnJyk7XG4gICAgZm9sZGVyQnJvd3Nlck1vZGFsLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgfTtcblxuICBhc3luYyBmdW5jdGlvbiBsb2FkRm9sZGVyQ29udGVudHMocGF0aCkge1xuICAgIGZvbGRlckJyb3dzZXJQYXRoLnRleHRDb250ZW50ID0gcGF0aCB8fCAnU2VsZWN0IGEgZHJpdmUuLi4nO1xuICAgIGZvbGRlckJyb3dzZXJMaXN0LmlubmVySFRNTCA9ICc8ZGl2IHN0eWxlPVwicGFkZGluZzogMjBweDsgdGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPkxvYWRpbmcuLi48L2Rpdj4nO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYC9hcGkvdjEvYnJvd3NlL2RpcmVjdG9yaWVzP3BhdGg9JHtlbmNvZGVVUklDb21wb25lbnQocGF0aCl9YCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgZm9sZGVyQnJvd3Nlckxpc3QuaW5uZXJIVE1MID0gYDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAyMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiB2YXIoLS1lcnJvcik7XCI+RXJyb3I6ICR7ZXNjYXBlSHRtbChyZXN1bHQuZXJyb3IpfTwvZGl2PmA7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY3VycmVudEJyb3dzZXJQYXRoID0gcmVzdWx0LnBhdGggfHwgJyc7XG4gICAgICBmb2xkZXJCcm93c2VyUGF0aC50ZXh0Q29udGVudCA9IGN1cnJlbnRCcm93c2VyUGF0aCB8fCAnU2VsZWN0IGEgZHJpdmUuLi4nO1xuXG4gICAgICBsZXQgaHRtbCA9ICcnO1xuXG4gICAgICAvLyBBZGQgcGFyZW50IGZvbGRlciBuYXZpZ2F0aW9uXG4gICAgICBpZiAocmVzdWx0LnBhcmVudCAmJiByZXN1bHQucGFyZW50ICE9PSByZXN1bHQucGF0aCkge1xuICAgICAgICBodG1sICs9IGA8ZGl2IGNsYXNzPVwiZm9sZGVyLWl0ZW1cIiBkYXRhLXBhdGg9XCIke2VzY2FwZUh0bWwocmVzdWx0LnBhcmVudCl9XCIgc3R5bGU9XCJwYWRkaW5nOiAxMnB4IDE2cHg7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBjdXJzb3I6IHBvaW50ZXI7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogMTBweDtcIj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTogMS4ycmVtO1wiPlx1MkIwNlx1RkUwRjwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+Li4gUGFyZW50IERpcmVjdG9yeTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+YDtcbiAgICAgIH1cblxuICAgICAgLy8gQWRkIGZvbGRlcnNcbiAgICAgIGlmIChyZXN1bHQuaXRlbXMubGVuZ3RoID09PSAwICYmICFyZXN1bHQucGFyZW50KSB7XG4gICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJwYWRkaW5nOiAyMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+Tm8gYnJvd3NlYWJsZSBkcml2ZXMgY29uZmlndXJlZC4gQ2hlY2sgeW91ciBkb2NrZXItY29tcG9zZS55bWwgdm9sdW1lIG1vdW50cy48L2Rpdj4nO1xuICAgICAgfSBlbHNlIGlmIChyZXN1bHQuaXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJwYWRkaW5nOiAyMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+Tm8gc3ViZm9sZGVycyBmb3VuZDwvZGl2Pic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQuaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICBjb25zdCBpY29uID0gaXRlbS50eXBlID09PSAnZHJpdmUnID8gJ1x1RDgzRFx1RENCRScgOiAnXHVEODNEXHVEQ0MxJztcbiAgICAgICAgICBjb25zdCBpc1NlbGVjdGVkID0gc2VsZWN0ZWRGb2xkZXJzLmluY2x1ZGVzKGl0ZW0ucGF0aCk7XG4gICAgICAgICAgY29uc3Qgc2VsZWN0ZWRTdHlsZSA9IGlzU2VsZWN0ZWQgPyAnYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLXN1Y2Nlc3MpIDIwJSwgdHJhbnNwYXJlbnQpOycgOiAnJztcbiAgICAgICAgICBodG1sICs9IGA8ZGl2IGNsYXNzPVwiZm9sZGVyLWl0ZW1cIiBkYXRhLXBhdGg9XCIke2VzY2FwZUh0bWwoaXRlbS5wYXRoKX1cIiBzdHlsZT1cInBhZGRpbmc6IDEycHggMTZweDsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGN1cnNvcjogcG9pbnRlcjsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiAxMHB4OyAke3NlbGVjdGVkU3R5bGV9XCI+XG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTogMS4ycmVtO1wiPiR7aWNvbn08L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cImZsZXg6IDE7XCI+JHtlc2NhcGVIdG1sKGl0ZW0ubmFtZSl9PC9zcGFuPlxuICAgICAgICAgICAgJHtpc1NlbGVjdGVkID8gJzxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLXN1Y2Nlc3MpO1wiPlx1MjcxMzwvc3Bhbj4nIDogJyd9XG4gICAgICAgICAgPC9kaXY+YDtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGZvbGRlckJyb3dzZXJMaXN0LmlubmVySFRNTCA9IGh0bWw7XG5cbiAgICAgIC8vIEFkZCBjbGljayBoYW5kbGVyc1xuICAgICAgZm9sZGVyQnJvd3Nlckxpc3QucXVlcnlTZWxlY3RvckFsbCgnLmZvbGRlci1pdGVtJykuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICBsb2FkRm9sZGVyQ29udGVudHMoaXRlbS5kYXRhc2V0LnBhdGgpO1xuICAgICAgICB9KTtcbiAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWVudGVyJywgKCkgPT4ge1xuICAgICAgICAgIGl0ZW0uc3R5bGUuYmFja2dyb3VuZCA9ICd2YXIoLS1jYXJkLWJnKSc7XG4gICAgICAgIH0pO1xuICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgaXNTZWxlY3RlZCA9IHNlbGVjdGVkRm9sZGVycy5pbmNsdWRlcyhpdGVtLmRhdGFzZXQucGF0aCk7XG4gICAgICAgICAgaXRlbS5zdHlsZS5iYWNrZ3JvdW5kID0gaXNTZWxlY3RlZCA/ICdjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tc3VjY2VzcykgMjAlLCB0cmFuc3BhcmVudCknIDogJyc7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgZm9sZGVyQnJvd3Nlckxpc3QuaW5uZXJIVE1MID0gYDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAyMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiB2YXIoLS1lcnJvcik7XCI+RmFpbGVkIHRvIGxvYWQ6ICR7ZXNjYXBlSHRtbChlcnJvci5tZXNzYWdlKX08L2Rpdj5gO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZVNlbGVjdGVkRm9sZGVyc0Rpc3BsYXkoKSB7XG4gICAgaWYgKHNlbGVjdGVkRm9sZGVycy5sZW5ndGggPT09IDApIHtcbiAgICAgIGZvbGRlckJyb3dzZXJTZWxlY3RlZC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb2xkZXJCcm93c2VyU2VsZWN0ZWQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgZm9sZGVyQnJvd3NlclNlbGVjdGVkTGlzdC5pbm5lckhUTUwgPSBzZWxlY3RlZEZvbGRlcnMubWFwKHBhdGggPT4gYFxuICAgICAgPHNwYW4gc3R5bGU9XCJwYWRkaW5nOiA2cHggMTJweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iZyk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLXN1Y2Nlc3MpOyBib3JkZXItcmFkaXVzOiA0cHg7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogNnB4O1wiPlxuICAgICAgICAke2VzY2FwZUh0bWwocGF0aCl9XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG9uY2xpY2s9XCJyZW1vdmVTZWxlY3RlZEZvbGRlcignJHtlc2NhcGVIdG1sKHBhdGgpfScpXCIgc3R5bGU9XCJiYWNrZ3JvdW5kOiBub25lOyBib3JkZXI6IG5vbmU7IGN1cnNvcjogcG9pbnRlcjsgY29sb3I6IHZhcigtLWVycm9yKTsgZm9udC1zaXplOiAxcmVtOyBwYWRkaW5nOiAwO1wiPlx1MDBENzwvYnV0dG9uPlxuICAgICAgPC9zcGFuPlxuICAgIGApLmpvaW4oJycpO1xuICB9XG5cbiAgd2luZG93LnJlbW92ZVNlbGVjdGVkRm9sZGVyID0gZnVuY3Rpb24ocGF0aCkge1xuICAgIHNlbGVjdGVkRm9sZGVycyA9IHNlbGVjdGVkRm9sZGVycy5maWx0ZXIocCA9PiBwICE9PSBwYXRoKTtcbiAgICB1cGRhdGVTZWxlY3RlZEZvbGRlcnNEaXNwbGF5KCk7XG4gICAgbG9hZEZvbGRlckNvbnRlbnRzKGN1cnJlbnRCcm93c2VyUGF0aCk7IC8vIFJlZnJlc2ggdG8gdXBkYXRlIGNoZWNrbWFya3NcbiAgfTtcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZm9sZGVyLWJyb3dzZXItc2VsZWN0LWN1cnJlbnQnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBpZiAoY3VycmVudEJyb3dzZXJQYXRoICYmICFzZWxlY3RlZEZvbGRlcnMuaW5jbHVkZXMoY3VycmVudEJyb3dzZXJQYXRoKSkge1xuICAgICAgc2VsZWN0ZWRGb2xkZXJzLnB1c2goY3VycmVudEJyb3dzZXJQYXRoKTtcbiAgICAgIHVwZGF0ZVNlbGVjdGVkRm9sZGVyc0Rpc3BsYXkoKTtcbiAgICAgIGxvYWRGb2xkZXJDb250ZW50cyhjdXJyZW50QnJvd3NlclBhdGgpOyAvLyBSZWZyZXNoIHRvIHNob3cgY2hlY2ttYXJrXG4gICAgfVxuICB9KTtcblxuICB3aXJlTW9kYWwoZm9sZGVyQnJvd3Nlck1vZGFsLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZm9sZGVyLWJyb3dzZXItY2FuY2VsJykpO1xuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmb2xkZXItYnJvd3Nlci1kb25lJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgaWYgKHRhcmdldE1lZGlhSW5wdXQpIHtcbiAgICAgIHRhcmdldE1lZGlhSW5wdXQudmFsdWUgPSBzZWxlY3RlZEZvbGRlcnMuam9pbignLCAnKTtcbiAgICB9XG4gICAgZm9sZGVyQnJvd3Nlck1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgfSk7XG5cbiAgLy8gTG9hZCBjdXN0b20gYXBwcyBvbiBwYWdlIGxvYWRcbiAgbG9hZEN1c3RvbUFwcHMoKTtcbn0pKCk7XG47XG4vLyBSZWNpcGUgU3lzdGVtIFx1MjAxNCBtdWx0aS1jb250YWluZXIgc3RhY2sgZGVwbG95bWVudFxuKGZ1bmN0aW9uKCkge1xuICAvLyA9PT0gUkVDSVBFIERFUExPWSBXSVpBUkQgTU9EQUwgPT09XG4gIGluamVjdE1vZGFsKCdyZWNpcGUtZGVwbG95LW1vZGFsJywgYDxkaXYgaWQ9XCJyZWNpcGUtZGVwbG95LW1vZGFsXCIgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsXCI+XG4gICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtY29udGVudFwiIHN0eWxlPVwibWluLXdpZHRoOiA2MjBweDsgbWF4LXdpZHRoOiA3NDBweDtcIj5cbiAgICAgIDxoMyBpZD1cInJlY2lwZS1kZXBsb3ktdGl0bGVcIj5EZXBsb3kgUmVjaXBlPC9oMz5cblxuICAgICAgPCEtLSBTdGVwIGluZGljYXRvciAtLT5cbiAgICAgIDxkaXYgaWQ9XCJyZWNpcGUtc3RlcHNcIiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogNHB4OyBtYXJnaW46IDE2cHggMCAyNHB4O1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicmVjaXBlLXN0ZXAgYWN0aXZlXCIgZGF0YS1zdGVwPVwiMVwiPjxzcGFuPjE8L3NwYW4+IENvbXBvbmVudHM8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJlY2lwZS1zdGVwXCIgZGF0YS1zdGVwPVwiMlwiPjxzcGFuPjI8L3NwYW4+IENvbmZpZ3VyYXRpb248L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJlY2lwZS1zdGVwXCIgZGF0YS1zdGVwPVwiM1wiPjxzcGFuPjM8L3NwYW4+IFJldmlldzwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicmVjaXBlLXN0ZXBcIiBkYXRhLXN0ZXA9XCI0XCI+PHNwYW4+NDwvc3Bhbj4gUHJvZ3Jlc3M8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFN0ZXAgMTogQ29tcG9uZW50IFNlbGVjdGlvbiAtLT5cbiAgICAgIDxkaXYgaWQ9XCJyZWNpcGUtc3RlcC0xXCIgY2xhc3M9XCJyZWNpcGUtc3RlcC1wYW5lbFwiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsLWFjY2VudC1zbVwiPlNlbGVjdCBDb21wb25lbnRzOjwvbGFiZWw+XG4gICAgICAgIDxkaXYgaWQ9XCJyZWNpcGUtY29tcG9uZW50LWxpc3RcIiBzdHlsZT1cImRpc3BsYXk6IGdyaWQ7IGdhcDogMTBweDsgbWFyZ2luLXRvcDogOHB4O1wiPjwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gU3RlcCAyOiBTaGFyZWQgQ29uZmlndXJhdGlvbiAtLT5cbiAgICAgIDxkaXYgaWQ9XCJyZWNpcGUtc3RlcC0yXCIgY2xhc3M9XCJyZWNpcGUtc3RlcC1wYW5lbFwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ2FwOiAxNnB4O1wiPlxuICAgICAgICAgIDwhLS0gU2hhcmVkIHZvbHVtZXMgLS0+XG4gICAgICAgICAgPGRpdiBpZD1cInJlY2lwZS12b2x1bWVzLXNlY3Rpb25cIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwtYWNjZW50LXNtXCI+U2hhcmVkIFZvbHVtZXM6PC9sYWJlbD5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJyZWNpcGUtdm9sdW1lLWxpc3RcIiBzdHlsZT1cImRpc3BsYXk6IGdyaWQ7IGdhcDogMTBweDsgbWFyZ2luLXRvcDogOHB4O1wiPjwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBUaW1lem9uZSAtLT5cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbC1hY2NlbnQtc21cIj5UaW1lem9uZTo8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJyZWNpcGUtdGltZXpvbmVcIiB2YWx1ZT1cIlVUQ1wiIHBsYWNlaG9sZGVyPVwiZS5nLiBBbWVyaWNhL05ld19Zb3JrXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJTsgcGFkZGluZzogOHB4IDEycHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmcpOyBjb2xvcjogdmFyKC0tZmcpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7XCIgLz5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gVGFyZ2V0IElQIC0tPlxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsLWFjY2VudC1zbVwiPlRhcmdldCBJUCBBZGRyZXNzOjwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInJlY2lwZS1pcFwiIHZhbHVlPVwiaG9zdC5kb2NrZXIuaW50ZXJuYWxcIiBwbGFjZWhvbGRlcj1cImxvY2FsaG9zdCBvciBJUFwiXG4gICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7IHBhZGRpbmc6IDhweCAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4O1wiIC8+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1oaW50LXNtXCI+SVAgd2hlcmUgY29udGFpbmVycyBleHBvc2UgcG9ydHM8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gVGFpbHNjYWxlIC0tPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LWxhYmVsXCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJyZWNpcGUtdGFpbHNjYWxlXCIgLz5cbiAgICAgICAgICAgIDxzcGFuPlJlc3RyaWN0IHRvIFRhaWxzY2FsZSBuZXR3b3JrIG9ubHk8L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBTdGVwIDM6IFJldmlldyAtLT5cbiAgICAgIDxkaXYgaWQ9XCJyZWNpcGUtc3RlcC0zXCIgY2xhc3M9XCJyZWNpcGUtc3RlcC1wYW5lbFwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiPlxuICAgICAgICA8ZGl2IGlkPVwicmVjaXBlLXJldmlldy1jb250ZW50XCIgc3R5bGU9XCJmb250LXNpemU6IDAuOXJlbTsgbGluZS1oZWlnaHQ6IDEuNztcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFN0ZXAgNDogUHJvZ3Jlc3MgLS0+XG4gICAgICA8ZGl2IGlkPVwicmVjaXBlLXN0ZXAtNFwiIGNsYXNzPVwicmVjaXBlLXN0ZXAtcGFuZWxcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIj5cbiAgICAgICAgPGRpdiBpZD1cInJlY2lwZS1wcm9ncmVzcy1saXN0XCIgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBnYXA6IDhweDtcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cInJlY2lwZS1kZXBsb3ktcmVzdWx0XCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAxNnB4OyBkaXNwbGF5Om5vbmU7XCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9uc1wiIHN0eWxlPVwibWFyZ2luLXRvcDogMjBweDtcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cInJlY2lwZS1jYW5jZWxcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cInJlY2lwZS1wcmV2XCIgY2xhc3M9XCJidG4tYWNjZW50XCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+QmFjazwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwicmVjaXBlLW5leHRcIiBjbGFzcz1cImJ0bi1hY2NlbnQtc29saWRcIj5OZXh0PC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YCk7XG5cbiAgLy8gPT09IFNUQVRFID09PVxuICBsZXQgcmVjaXBlVGVtcGxhdGVzID0gbnVsbDtcbiAgbGV0IHJlY2lwZUNhdGVnb3JpZXMgPSBudWxsO1xuICBsZXQgY3VycmVudFJlY2lwZSA9IG51bGw7XG4gIGxldCBjdXJyZW50U3RlcCA9IDE7XG4gIGxldCBpc1ByZW1pdW0gPSBmYWxzZTtcblxuICBjb25zdCBkZXBsb3lNb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWNpcGUtZGVwbG95LW1vZGFsJyk7XG4gIGNvbnN0IGNhbmNlbEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWNpcGUtY2FuY2VsJyk7XG4gIGNvbnN0IHByZXZCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVjaXBlLXByZXYnKTtcbiAgY29uc3QgbmV4dEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWNpcGUtbmV4dCcpO1xuXG4gIHdpcmVNb2RhbChkZXBsb3lNb2RhbCwgY2FuY2VsQnRuKTtcblxuICAvLyA9PT0gRkVUQ0ggUkVDSVBFIFRFTVBMQVRFUyA9PT1cbiAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hSZWNpcGVUZW1wbGF0ZXMoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9yZWNpcGVzL3RlbXBsYXRlcycpO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3AuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICByZWNpcGVUZW1wbGF0ZXMgPSBkYXRhLnRlbXBsYXRlcztcbiAgICAgICAgcmVjaXBlQ2F0ZWdvcmllcyA9IGRhdGEuY2F0ZWdvcmllcztcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICAvLyBQcmVtaXVtIHJlcXVpcmVkIFx1MjAxNCB0ZW1wbGF0ZXMgQVBJIGdhdGVkXG4gICAgICBpZiAocmVzcC5zdGF0dXMgPT09IDQwMykge1xuICAgICAgICBpc1ByZW1pdW0gPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIGZldGNoIHJlY2lwZSB0ZW1wbGF0ZXM6JywgZS5tZXNzYWdlKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gPT09IENIRUNLIFBSRU1JVU0gPT09XG4gIGFzeW5jIGZ1bmN0aW9uIGNoZWNrUmVjaXBlUHJlbWl1bSgpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2xpY2Vuc2UvZmVhdHVyZS9yZWNpcGVzJyk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcC5qc29uKCk7XG4gICAgICBpc1ByZW1pdW0gPSBkYXRhLmF2YWlsYWJsZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGlzUHJlbWl1bSA9IGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gaXNQcmVtaXVtO1xuICB9XG5cbiAgLy8gPT09IFJFTkRFUiBSRUNJUEUgQ0FSRFMgSU5UTyBBUFAgU0VMRUNUT1IgPT09XG4gIC8vIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBhcHAgc2VsZWN0b3IgdG8gaW5qZWN0IHJlY2lwZSBjYXJkc1xuICB3aW5kb3cucmVuZGVyUmVjaXBlQ2FyZHMgPSBhc3luYyBmdW5jdGlvbihncmlkKSB7XG4gICAgYXdhaXQgY2hlY2tSZWNpcGVQcmVtaXVtKCk7XG5cbiAgICAvLyBCdWlsZCByZWNpcGUgZGF0YSBcdTIwMTQgd2UgY2FuIHNob3cgY2FyZCBtZXRhZGF0YSBldmVuIHdpdGhvdXQgcHJlbWl1bVxuICAgIC8vIChjYXJkcyBqdXN0IHNob3cgYSBsb2NrIGFuZCBwcm9tcHQgdG8gdXBncmFkZSlcbiAgICBsZXQgcmVjaXBlcztcbiAgICBpZiAoaXNQcmVtaXVtICYmIHJlY2lwZVRlbXBsYXRlcykge1xuICAgICAgcmVjaXBlcyA9IHJlY2lwZVRlbXBsYXRlcztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU2hvdyBoYXJkY29kZWQgcHJldmlldyBjYXJkcyB3aGVuIG5vdCBwcmVtaXVtXG4gICAgICByZWNpcGVzID0gZ2V0UHJldmlld1JlY2lwZXMoKTtcbiAgICB9XG5cbiAgICBpZiAoIXJlY2lwZXMgfHwgcmVjaXBlcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIC8vIENhdGVnb3J5IGhlYWRlclxuICAgIGNvbnN0IGhlYWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGhlYWRlci5jbGFzc05hbWUgPSAnYXBwLWNhdGVnb3J5LWhlYWRlcic7XG4gICAgaGVhZGVyLmlubmVySFRNTCA9IGBcXHVEODNFXFx1RERFQSBSZWNpcGVzYDtcbiAgICBoZWFkZXIuc3R5bGUuYm9yZGVyQm90dG9tQ29sb3IgPSAnIzhlNDRhZCc7XG4gICAgZ3JpZC5hcHBlbmRDaGlsZChoZWFkZXIpO1xuXG4gICAgY29uc3QgcmVjaXBlTGlzdCA9IEFycmF5LmlzQXJyYXkocmVjaXBlcykgPyByZWNpcGVzIDogT2JqZWN0LnZhbHVlcyhyZWNpcGVzKTtcbiAgICByZWNpcGVMaXN0LnNvcnQoKGEsIGIpID0+IChiLnBvcHVsYXJpdHkgfHwgMCkgLSAoYS5wb3B1bGFyaXR5IHx8IDApKTtcblxuICAgIGZvciAoY29uc3QgcmVjaXBlIG9mIHJlY2lwZUxpc3QpIHtcbiAgICAgIGNvbnN0IG9wdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgb3B0aW9uLmNsYXNzTmFtZSA9ICdhcHAtb3B0aW9uJztcbiAgICAgIG9wdGlvbi5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XG5cbiAgICAgIGNvbnN0IGNvbXBvbmVudEJhZGdlID0gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNjVyZW07IHBhZGRpbmc6IDJweCA2cHg7IGJvcmRlci1yYWRpdXM6IDRweDsgbWFyZ2luLXRvcDogNHB4OyBiYWNrZ3JvdW5kOiByZ2JhKDE0Miw2OCwxNzMsMC4yKTsgY29sb3I6ICNhODU1Zjc7XCI+JHtyZWNpcGUuY29tcG9uZW50Q291bnQgfHwgcmVjaXBlLmNvbXBvbmVudHM/Lmxlbmd0aCB8fCAnPyd9IGFwcHM8L2Rpdj5gO1xuXG4gICAgICBjb25zdCBsb2NrT3ZlcmxheSA9ICFpc1ByZW1pdW0gPyBgPGRpdiBzdHlsZT1cInBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiA2cHg7IHJpZ2h0OiA2cHg7IGZvbnQtc2l6ZTogMC42NXJlbTsgcGFkZGluZzogMnB4IDhweDsgYm9yZGVyLXJhZGl1czogMTBweDsgYmFja2dyb3VuZDogcmdiYSgyNDEsMTk2LDE1LDAuMik7IGNvbG9yOiAjZjFjNDBmOyBmb250LXdlaWdodDogNjAwO1wiPlBSRU1JVU08L2Rpdj5gIDogJyc7XG5cbiAgICAgIG9wdGlvbi5pbm5lckhUTUwgPSBgXG4gICAgICAgICR7bG9ja092ZXJsYXl9XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhcHAtb3B0aW9uLWljb25cIj4ke2VzY2FwZUh0bWwocmVjaXBlLmljb24gfHwgJ1xcdUQ4M0VcXHVEREVBJyl9PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhcHAtb3B0aW9uLW5hbWVcIj4ke2VzY2FwZUh0bWwocmVjaXBlLm5hbWUpfTwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXBwLW9wdGlvbi1kZXNjXCI+JHtlc2NhcGVIdG1sKHJlY2lwZS5kZXNjcmlwdGlvbiB8fCAnJyl9PC9kaXY+XG4gICAgICAgICR7Y29tcG9uZW50QmFkZ2V9XG4gICAgICBgO1xuXG4gICAgICBvcHRpb24ub25jbGljayA9ICgpID0+IHtcbiAgICAgICAgaWYgKCFpc1ByZW1pdW0pIHtcbiAgICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdSZWNpcGVzIHJlcXVpcmUgYSBEYXNoQ2FkZHkgUHJlbWl1bSBsaWNlbnNlLiBDbGljayB0aGUgTGljZW5zZSBidXR0b24gdG8gYWN0aXZhdGUuJywgJ3dhcm5pbmcnLCA1MDAwKTtcbiAgICAgICAgICBpZiAod2luZG93Lm9wZW5MaWNlbnNlTW9kYWwpIHdpbmRvdy5vcGVuTGljZW5zZU1vZGFsKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIG9wZW5SZWNpcGVEZXBsb3lXaXphcmQocmVjaXBlKTtcbiAgICAgIH07XG5cbiAgICAgIGdyaWQuYXBwZW5kQ2hpbGQob3B0aW9uKTtcbiAgICB9XG4gIH07XG5cbiAgZnVuY3Rpb24gZ2V0UHJldmlld1JlY2lwZXMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHsgaWQ6ICdodHBjLXN1aXRlJywgbmFtZTogJ0hUUEMgU3VpdGUnLCBpY29uOiAnXFx1RDgzQ1xcdURGQUMnLCBkZXNjcmlwdGlvbjogJ0NvbXBsZXRlIG1lZGlhIGF1dG9tYXRpb246IGZpbmQsIGRvd25sb2FkLCBvcmdhbml6ZSwgYW5kIHN0cmVhbScsIGNvbXBvbmVudENvdW50OiA2LCBwb3B1bGFyaXR5OiA5OCB9LFxuICAgICAgeyBpZDogJ25leHRjbG91ZC1jb21wbGV0ZScsIG5hbWU6ICdOZXh0Y2xvdWQgQ29tcGxldGUnLCBpY29uOiAnXFx1MjYwMVxcdUZFMEYnLCBkZXNjcmlwdGlvbjogJ0Z1bGwgcHJvZHVjdGl2aXR5IHN1aXRlOiBjbG91ZCBzdG9yYWdlLCBvZmZpY2UgZWRpdGluZywgYW5kIGNvbGxhYm9yYXRpb24nLCBjb21wb25lbnRDb3VudDogNCwgcG9wdWxhcml0eTogOTAgfSxcbiAgICAgIHsgaWQ6ICdzbWFydC1ob21lJywgbmFtZTogJ1NtYXJ0IEhvbWUgSHViJywgaWNvbjogJ1xcdUQ4M0NcXHVERkUwJywgZGVzY3JpcHRpb246ICdIb21lIGF1dG9tYXRpb246IGNvbnRyb2wsIGF1dG9tYXRlLCBhbmQgbW9uaXRvciBJb1QgZGV2aWNlcycsIGNvbXBvbmVudENvdW50OiA0LCBwb3B1bGFyaXR5OiA4OCB9LFxuICAgICAgeyBpZDogJ2Rldi1lbnZpcm9ubWVudCcsIG5hbWU6ICdEZXYgRW52aXJvbm1lbnQnLCBpY29uOiAnXFx1RDgzRFxcdURDQkInLCBkZXNjcmlwdGlvbjogJ1NlbGYtaG9zdGVkIGRldmVsb3BtZW50IHdvcmtmbG93OiBHaXQsIENJL0NELCBJREUsIGFuZCBkYXRhYmFzZScsIGNvbXBvbmVudENvdW50OiA0LCBwb3B1bGFyaXR5OiA4MiB9XG4gICAgXTtcbiAgfVxuXG4gIC8vID09PSBSRUNJUEUgREVQTE9ZIFdJWkFSRCA9PT1cbiAgZnVuY3Rpb24gb3BlblJlY2lwZURlcGxveVdpemFyZChyZWNpcGUpIHtcbiAgICBjdXJyZW50UmVjaXBlID0gcmVjaXBlO1xuICAgIGN1cnJlbnRTdGVwID0gMTtcblxuICAgIC8vIENsb3NlIGFwcCBzZWxlY3RvclxuICAgIGNvbnN0IGFwcFNlbGVjdG9yTW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXBwLXNlbGVjdG9yLW1vZGFsJyk7XG4gICAgaWYgKGFwcFNlbGVjdG9yTW9kYWwpIGFwcFNlbGVjdG9yTW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlY2lwZS1kZXBsb3ktdGl0bGUnKS50ZXh0Q29udGVudCA9IGBEZXBsb3kgJHtyZWNpcGUubmFtZX1gO1xuXG4gICAgLy8gUmVzZXQgc3RlcHNcbiAgICB1cGRhdGVTdGVwVUkoKTtcbiAgICByZW5kZXJTdGVwMSgpO1xuXG4gICAgZGVwbG95TW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlU3RlcFVJKCkge1xuICAgIC8vIFN0ZXAgaW5kaWNhdG9yc1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNyZWNpcGUtc3RlcHMgLnJlY2lwZS1zdGVwJykuZm9yRWFjaChlbCA9PiB7XG4gICAgICBjb25zdCBzdGVwID0gcGFyc2VJbnQoZWwuZGF0YXNldC5zdGVwKTtcbiAgICAgIGVsLmNsYXNzTGlzdC50b2dnbGUoJ2FjdGl2ZScsIHN0ZXAgPT09IGN1cnJlbnRTdGVwKTtcbiAgICAgIGVsLmNsYXNzTGlzdC50b2dnbGUoJ2NvbXBsZXRlZCcsIHN0ZXAgPCBjdXJyZW50U3RlcCk7XG4gICAgfSk7XG5cbiAgICAvLyBTdGVwIHBhbmVsc1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IDQ7IGkrKykge1xuICAgICAgY29uc3QgcGFuZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcmVjaXBlLXN0ZXAtJHtpfWApO1xuICAgICAgaWYgKHBhbmVsKSBwYW5lbC5zdHlsZS5kaXNwbGF5ID0gaSA9PT0gY3VycmVudFN0ZXAgPyAnJyA6ICdub25lJztcbiAgICB9XG5cbiAgICAvLyBOYXZpZ2F0aW9uIGJ1dHRvbnNcbiAgICBwcmV2QnRuLnN0eWxlLmRpc3BsYXkgPSBjdXJyZW50U3RlcCA+IDEgJiYgY3VycmVudFN0ZXAgPCA0ID8gJycgOiAnbm9uZSc7XG4gICAgaWYgKGN1cnJlbnRTdGVwID09PSA0KSB7XG4gICAgICBuZXh0QnRuLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICBjYW5jZWxCdG4udGV4dENvbnRlbnQgPSAnQ2xvc2UnO1xuICAgIH0gZWxzZSBpZiAoY3VycmVudFN0ZXAgPT09IDMpIHtcbiAgICAgIG5leHRCdG4udGV4dENvbnRlbnQgPSAnXFx1RDgzRFxcdURFODAgRGVwbG95JztcbiAgICAgIG5leHRCdG4uc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgY2FuY2VsQnRuLnRleHRDb250ZW50ID0gJ0NhbmNlbCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHRCdG4udGV4dENvbnRlbnQgPSAnTmV4dCc7XG4gICAgICBuZXh0QnRuLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgIGNhbmNlbEJ0bi50ZXh0Q29udGVudCA9ICdDYW5jZWwnO1xuICAgIH1cbiAgfVxuXG4gIC8vIFN0ZXAgMTogQ29tcG9uZW50IHNlbGVjdGlvblxuICBmdW5jdGlvbiByZW5kZXJTdGVwMSgpIHtcbiAgICBjb25zdCBsaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlY2lwZS1jb21wb25lbnQtbGlzdCcpO1xuICAgIGxpc3QuaW5uZXJIVE1MID0gJyc7XG5cbiAgICBjb25zdCBjb21wb25lbnRzID0gY3VycmVudFJlY2lwZS5jb21wb25lbnRzIHx8IFtdO1xuICAgIGZvciAoY29uc3QgY29tcCBvZiBjb21wb25lbnRzKSB7XG4gICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgZWwuc3R5bGUuY3NzVGV4dCA9ICdkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDEycHg7IHBhZGRpbmc6IDEycHg7IGJvcmRlci1yYWRpdXM6IDhweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iZyk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7JztcblxuICAgICAgY29uc3QgaXNSZXF1aXJlZCA9IGNvbXAucmVxdWlyZWQ7XG4gICAgICBjb25zdCBpc0ludGVybmFsID0gY29tcC5pbnRlcm5hbDtcblxuICAgICAgZWwuaW5uZXJIVE1MID0gYFxuICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgJHtpc1JlcXVpcmVkID8gJ2NoZWNrZWQgZGlzYWJsZWQnIDogJ2NoZWNrZWQnfSBkYXRhLWNvbXBvbmVudC1pZD1cIiR7Y29tcC5pZH1cIlxuICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDE4cHg7IGhlaWdodDogMThweDsgYWNjZW50LWNvbG9yOiB2YXIoLS1hY2NlbnQpO1wiIC8+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJmbGV4OiAxO1wiPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDogNjAwOyBmb250LXNpemU6IDAuOXJlbTtcIj4ke2VzY2FwZUh0bWwoY29tcC5yb2xlIHx8IGNvbXAuaWQpfTwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNzhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+XG4gICAgICAgICAgICAke2NvbXAudGVtcGxhdGVSZWYgPyBlc2NhcGVIdG1sKGNvbXAudGVtcGxhdGVSZWYpIDogJ0J1aWx0LWluJ31cbiAgICAgICAgICAgICR7aXNSZXF1aXJlZCA/ICc8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1hY2NlbnQpOyBtYXJnaW4tbGVmdDogNnB4O1wiPlJlcXVpcmVkPC9zcGFuPicgOiAnPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tbGVmdDogNnB4O1wiPk9wdGlvbmFsPC9zcGFuPid9XG4gICAgICAgICAgICAke2lzSW50ZXJuYWwgPyAnPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tbGVmdDogNnB4O1wiPihJbnRlcm5hbCk8L3NwYW4+JyA6ICcnfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICR7Y29tcC5ub3RlID8gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS13YXJuLWZnKTsgbWFyZ2luLXRvcDogNHB4O1wiPlxcdTI2QTAgJHtlc2NhcGVIdG1sKGNvbXAubm90ZSl9PC9kaXY+YCA6ICcnfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIGA7XG4gICAgICBsaXN0LmFwcGVuZENoaWxkKGVsKTtcbiAgICB9XG4gIH1cblxuICAvLyBTdGVwIDI6IFNoYXJlZCBjb25maWd1cmF0aW9uXG4gIGZ1bmN0aW9uIHJlbmRlclN0ZXAyKCkge1xuICAgIGNvbnN0IHZvbHVtZVNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVjaXBlLXZvbHVtZXMtc2VjdGlvbicpO1xuICAgIGNvbnN0IHZvbHVtZUxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVjaXBlLXZvbHVtZS1saXN0Jyk7XG5cbiAgICBjb25zdCBzaGFyZWRWb2x1bWVzID0gY3VycmVudFJlY2lwZS5zaGFyZWRWb2x1bWVzO1xuICAgIGlmIChzaGFyZWRWb2x1bWVzICYmIE9iamVjdC5rZXlzKHNoYXJlZFZvbHVtZXMpLmxlbmd0aCA+IDApIHtcbiAgICAgIHZvbHVtZVNlY3Rpb24uc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgdm9sdW1lTGlzdC5pbm5lckhUTUwgPSAnJztcblxuICAgICAgZm9yIChjb25zdCBba2V5LCB2b2xdIG9mIE9iamVjdC5lbnRyaWVzKHNoYXJlZFZvbHVtZXMpKSB7XG4gICAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGVsLnN0eWxlLmNzc1RleHQgPSAnZGlzcGxheTogZ3JpZDsgZ2FwOiA0cHg7JztcbiAgICAgICAgZWwuaW5uZXJIVE1MID0gYFxuICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImZvbnQtd2VpZ2h0OiA1MDA7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj4ke2VzY2FwZUh0bWwodm9sLmxhYmVsIHx8IGtleSl9PC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBkYXRhLXZvbHVtZS1rZXk9XCIke2tleX1cIiB2YWx1ZT1cIiR7ZXNjYXBlSHRtbCh2b2wuZGVmYXVsdFBhdGggfHwgJycpfVwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIiR7ZXNjYXBlSHRtbCh2b2wuZGVmYXVsdFBhdGggfHwgJy9wYXRoJyl9XCJcbiAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7IHBhZGRpbmc6IDhweCAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4OyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBmb250LXNpemU6IDAuODVyZW07XCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1oaW50LXNtXCI+JHtlc2NhcGVIdG1sKHZvbC5kZXNjcmlwdGlvbiB8fCAnJyl9PC9kaXY+XG4gICAgICAgIGA7XG4gICAgICAgIHZvbHVtZUxpc3QuYXBwZW5kQ2hpbGQoZWwpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB2b2x1bWVTZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgfVxuICB9XG5cbiAgLy8gU3RlcCAzOiBSZXZpZXdcbiAgZnVuY3Rpb24gcmVuZGVyU3RlcDMoKSB7XG4gICAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWNpcGUtcmV2aWV3LWNvbnRlbnQnKTtcbiAgICBjb25zdCBzZWxlY3RlZENvbXBvbmVudHMgPSBnZXRTZWxlY3RlZENvbXBvbmVudHMoKTtcblxuICAgIGNvbnN0IHZvbHVtZUlucHV0cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNyZWNpcGUtdm9sdW1lLWxpc3QgaW5wdXRbZGF0YS12b2x1bWUta2V5XScpO1xuICAgIGNvbnN0IHZvbHVtZXMgPSB7fTtcbiAgICB2b2x1bWVJbnB1dHMuZm9yRWFjaChpbnB1dCA9PiB7XG4gICAgICB2b2x1bWVzW2lucHV0LmRhdGFzZXQudm9sdW1lS2V5XSA9IGlucHV0LnZhbHVlO1xuICAgIH0pO1xuXG4gICAgY29uc3QgdHogPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVjaXBlLXRpbWV6b25lJykudmFsdWUgfHwgJ1VUQyc7XG4gICAgY29uc3QgaXAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVjaXBlLWlwJykudmFsdWUgfHwgJ2hvc3QuZG9ja2VyLmludGVybmFsJztcbiAgICBjb25zdCB0YWlsc2NhbGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVjaXBlLXRhaWxzY2FsZScpLmNoZWNrZWQ7XG5cbiAgICBjb250ZW50LmlubmVySFRNTCA9IGBcbiAgICAgIDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDogNjAwOyBmb250LXNpemU6IDFyZW07IG1hcmdpbi1ib3R0b206IDEycHg7XCI+JHtlc2NhcGVIdG1sKGN1cnJlbnRSZWNpcGUubmFtZSl9PC9kaXY+XG4gICAgICA8ZGl2IHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLWJvdHRvbTogMTZweDtcIj4ke2VzY2FwZUh0bWwoY3VycmVudFJlY2lwZS5kZXNjcmlwdGlvbiB8fCAnJyl9PC9kaXY+XG5cbiAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAxMnB4O1wiPlxuICAgICAgICA8c3Ryb25nPkNvbXBvbmVudHMgKCR7c2VsZWN0ZWRDb21wb25lbnRzLmxlbmd0aH0pOjwvc3Ryb25nPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ2FwOiA0cHg7IG1hcmdpbi10b3A6IDZweDtcIj5cbiAgICAgICAgICAke3NlbGVjdGVkQ29tcG9uZW50cy5tYXAoYyA9PiBgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDRweCAwOyBmb250LXNpemU6IDAuODVyZW07XCI+XG4gICAgICAgICAgICBcXHUyMDIyIDxzdHJvbmc+JHtlc2NhcGVIdG1sKGMucm9sZSB8fCBjLmlkKX08L3N0cm9uZz4gJHtjLmludGVybmFsID8gJzxzcGFuIHN0eWxlPVwiY29sb3I6dmFyKC0tbXV0ZWQpXCI+KGludGVybmFsKTwvc3Bhbj4nIDogJyd9XG4gICAgICAgICAgPC9kaXY+YCkuam9pbignJyl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgICR7T2JqZWN0LmtleXModm9sdW1lcykubGVuZ3RoID4gMCA/IGA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMTJweDtcIj5cbiAgICAgICAgPHN0cm9uZz5Wb2x1bWVzOjwvc3Ryb25nPlxuICAgICAgICAke09iamVjdC5lbnRyaWVzKHZvbHVtZXMpLm1hcCgoW2ssIHZdKSA9PiBgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC44NXJlbTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj4ke2t9OiAke2VzY2FwZUh0bWwodil9PC9kaXY+YCkuam9pbignJyl9XG4gICAgICA8L2Rpdj5gIDogJyd9XG5cbiAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuODVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+XG4gICAgICAgIFRpbWV6b25lOiAke2VzY2FwZUh0bWwodHopfSAmYnVsbDsgSVA6ICR7ZXNjYXBlSHRtbChpcCl9ICR7dGFpbHNjYWxlID8gJyZidWxsOyBUYWlsc2NhbGUgb25seScgOiAnJ31cbiAgICAgIDwvZGl2PlxuXG4gICAgICAke2N1cnJlbnRSZWNpcGUubmV0d29yayA/IGA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjg1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tdG9wOiA0cHg7XCI+RG9ja2VyIG5ldHdvcms6IDxjb2RlPiR7ZXNjYXBlSHRtbChjdXJyZW50UmVjaXBlLm5ldHdvcmsubmFtZSl9PC9jb2RlPjwvZGl2PmAgOiAnJ31cbiAgICBgO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0U2VsZWN0ZWRDb21wb25lbnRzKCkge1xuICAgIGNvbnN0IGNoZWNrYm94ZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjcmVjaXBlLWNvbXBvbmVudC1saXN0IGlucHV0W2RhdGEtY29tcG9uZW50LWlkXScpO1xuICAgIGNvbnN0IHNlbGVjdGVkSWRzID0gbmV3IFNldCgpO1xuICAgIGNoZWNrYm94ZXMuZm9yRWFjaChjYiA9PiB7XG4gICAgICBpZiAoY2IuY2hlY2tlZCkgc2VsZWN0ZWRJZHMuYWRkKGNiLmRhdGFzZXQuY29tcG9uZW50SWQpO1xuICAgIH0pO1xuXG4gICAgLy8gQWx3YXlzIGluY2x1ZGUgcmVxdWlyZWQgY29tcG9uZW50c1xuICAgIGNvbnN0IGNvbXBvbmVudHMgPSBjdXJyZW50UmVjaXBlLmNvbXBvbmVudHMgfHwgW107XG4gICAgY29tcG9uZW50cy5maWx0ZXIoYyA9PiBjLnJlcXVpcmVkKS5mb3JFYWNoKGMgPT4gc2VsZWN0ZWRJZHMuYWRkKGMuaWQpKTtcblxuICAgIHJldHVybiBjb21wb25lbnRzLmZpbHRlcihjID0+IHNlbGVjdGVkSWRzLmhhcyhjLmlkKSk7XG4gIH1cblxuICAvLyBTdGVwIDQ6IERlcGxveVxuICBhc3luYyBmdW5jdGlvbiBleGVjdXRlRGVwbG95KCkge1xuICAgIGNvbnN0IHByb2dyZXNzTGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWNpcGUtcHJvZ3Jlc3MtbGlzdCcpO1xuICAgIGNvbnN0IHJlc3VsdEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlY2lwZS1kZXBsb3ktcmVzdWx0Jyk7XG4gICAgcmVzdWx0RWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBwcm9ncmVzc0xpc3QuaW5uZXJIVE1MID0gJyc7XG5cbiAgICBjb25zdCBzZWxlY3RlZENvbXBvbmVudHMgPSBnZXRTZWxlY3RlZENvbXBvbmVudHMoKTtcblxuICAgIC8vIFNob3cgcHJvZ3Jlc3MgaXRlbXNcbiAgICBmb3IgKGNvbnN0IGNvbXAgb2Ygc2VsZWN0ZWRDb21wb25lbnRzKSB7XG4gICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgZWwuaWQgPSBgcmVjaXBlLXByb2dyZXNzLSR7Y29tcC5pZH1gO1xuICAgICAgZWwuc3R5bGUuY3NzVGV4dCA9ICdkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDEwcHg7IHBhZGRpbmc6IDEwcHggMTJweDsgYm9yZGVyLXJhZGl1czogNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgZm9udC1zaXplOiAwLjg1cmVtOyc7XG4gICAgICBlbC5pbm5lckhUTUwgPSBgXG4gICAgICAgIDxzcGFuIGNsYXNzPVwicmVjaXBlLXByb2dyZXNzLWljb25cIiBzdHlsZT1cImZvbnQtc2l6ZTogMS4xcmVtO1wiPlxcdTIzRjM8L3NwYW4+XG4gICAgICAgIDxzcGFuIHN0eWxlPVwiZmxleDoxOyBmb250LXdlaWdodDogNTAwO1wiPiR7ZXNjYXBlSHRtbChjb21wLnJvbGUgfHwgY29tcC5pZCl9PC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInJlY2lwZS1wcm9ncmVzcy1zdGF0dXNcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+UXVldWVkPC9zcGFuPlxuICAgICAgYDtcbiAgICAgIHByb2dyZXNzTGlzdC5hcHBlbmRDaGlsZChlbCk7XG4gICAgfVxuXG4gICAgLy8gQ29sbGVjdCBjb25maWdcbiAgICBjb25zdCB2b2x1bWVJbnB1dHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjcmVjaXBlLXZvbHVtZS1saXN0IGlucHV0W2RhdGEtdm9sdW1lLWtleV0nKTtcbiAgICBjb25zdCB2b2x1bWVzID0ge307XG4gICAgdm9sdW1lSW5wdXRzLmZvckVhY2goaW5wdXQgPT4ge1xuICAgICAgdm9sdW1lc1tpbnB1dC5kYXRhc2V0LnZvbHVtZUtleV0gPSBpbnB1dC52YWx1ZTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgIHNlbGVjdGVkQ29tcG9uZW50czogc2VsZWN0ZWRDb21wb25lbnRzLm1hcChjID0+IGMuaWQpLFxuICAgICAgc2hhcmVkQ29uZmlnOiB7XG4gICAgICAgIGlwOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVjaXBlLWlwJykudmFsdWUgfHwgJ2hvc3QuZG9ja2VyLmludGVybmFsJyxcbiAgICAgICAgdGltZXpvbmU6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWNpcGUtdGltZXpvbmUnKS52YWx1ZSB8fCAnVVRDJyxcbiAgICAgICAgdGFpbHNjYWxlT25seTogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlY2lwZS10YWlsc2NhbGUnKS5jaGVja2VkLFxuICAgICAgICB2b2x1bWVzXG4gICAgICB9LFxuICAgICAgY29tcG9uZW50T3ZlcnJpZGVzOiB7fVxuICAgIH07XG5cbiAgICAvLyBNYXJrIGFsbCBhcyBkZXBsb3lpbmdcbiAgICBmb3IgKGNvbnN0IGNvbXAgb2Ygc2VsZWN0ZWRDb21wb25lbnRzKSB7XG4gICAgICB1cGRhdGVQcm9ncmVzc0l0ZW0oY29tcC5pZCwgJ2RlcGxveWluZycsICdEZXBsb3lpbmcuLi4nKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL3JlY2lwZXMvZGVwbG95Jywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgcmVjaXBlSWQ6IGN1cnJlbnRSZWNpcGUuaWQsIGNvbmZpZyB9KVxuICAgICAgfSk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcC5qc29uKCk7XG5cbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgLy8gTWFyayBkZXBsb3llZCBjb21wb25lbnRzXG4gICAgICAgIGZvciAoY29uc3QgZGVwbG95ZWQgb2YgKGRhdGEuZGVwbG95ZWQgfHwgW10pKSB7XG4gICAgICAgICAgdXBkYXRlUHJvZ3Jlc3NJdGVtKGRlcGxveWVkLmlkLCAnc3VjY2VzcycsIGRlcGxveWVkLnVybCA/IGBSdW5uaW5nIFxcdTIxOTIgJHtkZXBsb3llZC51cmx9YCA6ICdSdW5uaW5nJyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTWFyayBlcnJvcnNcbiAgICAgICAgZm9yIChjb25zdCBlcnIgb2YgKGRhdGEuZXJyb3JzIHx8IFtdKSkge1xuICAgICAgICAgIHVwZGF0ZVByb2dyZXNzSXRlbShlcnIuY29tcG9uZW50SWQsICdlcnJvcicsIGVyci5lcnJvcik7XG4gICAgICAgIH1cblxuICAgICAgICByZXN1bHRFbC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICAgIHJlc3VsdEVsLmlubmVySFRNTCA9IGBcbiAgICAgICAgICA8ZGl2IHN0eWxlPVwicGFkZGluZzogMTRweDsgYm9yZGVyLXJhZGl1czogOHB4OyBiYWNrZ3JvdW5kOiByZ2JhKDQ2LDIwNCwxMTMsMC4xKTsgYm9yZGVyOiAxcHggc29saWQgcmdiYSg0NiwyMDQsMTEzLDAuMyk7XCI+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6IDYwMDsgY29sb3I6IHZhcigtLW9rLWZnKTsgbWFyZ2luLWJvdHRvbTogNnB4O1wiPiR7ZXNjYXBlSHRtbChkYXRhLm1lc3NhZ2UgfHwgJ0RlcGxveWVkIScpfTwvZGl2PlxuICAgICAgICAgICAgJHtkYXRhLnNldHVwSW5zdHJ1Y3Rpb25zID8gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLXRvcDogOHB4O1wiPlxuICAgICAgICAgICAgICA8c3Ryb25nPlNldHVwIHRpcHM6PC9zdHJvbmc+XG4gICAgICAgICAgICAgIDx1bCBzdHlsZT1cIm1hcmdpbjogNHB4IDAgMCAxNnB4OyBwYWRkaW5nOiAwO1wiPiR7ZGF0YS5zZXR1cEluc3RydWN0aW9ucy5tYXAocyA9PiBgPGxpPiR7ZXNjYXBlSHRtbChzKX08L2xpPmApLmpvaW4oJycpfTwvdWw+XG4gICAgICAgICAgICA8L2Rpdj5gIDogJyd9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIGA7XG5cbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbihgJHtjdXJyZW50UmVjaXBlLm5hbWV9IHJlY2lwZSBkZXBsb3llZCBzdWNjZXNzZnVsbHkhYCwgJ3N1Y2Nlc3MnLCA1MDAwKTtcblxuICAgICAgICAvLyBSZWZyZXNoIGRhc2hib2FyZFxuICAgICAgICBpZiAod2luZG93LmxvYWRTZXJ2aWNlcykgd2luZG93LmxvYWRTZXJ2aWNlcygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0RWwuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgICByZXN1bHRFbC5pbm5lckhUTUwgPSBgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDE0cHg7IGJvcmRlci1yYWRpdXM6IDhweDsgYmFja2dyb3VuZDogcmdiYSgyMzEsNzYsNjAsMC4xKTsgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyMzEsNzYsNjAsMC4zKTsgY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+XG4gICAgICAgICAgPHN0cm9uZz5EZXBsb3ltZW50IGZhaWxlZDo8L3N0cm9uZz4gJHtlc2NhcGVIdG1sKGRhdGEuZXJyb3IgfHwgJ1Vua25vd24gZXJyb3InKX1cbiAgICAgICAgPC9kaXY+YDtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbihgUmVjaXBlIGRlcGxveW1lbnQgZmFpbGVkOiAke2RhdGEuZXJyb3J9YCwgJ2Vycm9yJywgNTAwMCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmVzdWx0RWwuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgcmVzdWx0RWwuaW5uZXJIVE1MID0gYDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAxNHB4OyBib3JkZXItcmFkaXVzOiA4cHg7IGJhY2tncm91bmQ6IHJnYmEoMjMxLDc2LDYwLDAuMSk7IGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjMxLDc2LDYwLDAuMyk7IGNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPlxuICAgICAgICA8c3Ryb25nPk5ldHdvcmsgZXJyb3I6PC9zdHJvbmc+ICR7ZXNjYXBlSHRtbChlLm1lc3NhZ2UpfVxuICAgICAgPC9kaXY+YDtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVQcm9ncmVzc0l0ZW0oY29tcG9uZW50SWQsIHN0YXR1cywgdGV4dCkge1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHJlY2lwZS1wcm9ncmVzcy0ke2NvbXBvbmVudElkfWApO1xuICAgIGlmICghZWwpIHJldHVybjtcbiAgICBjb25zdCBpY29uID0gZWwucXVlcnlTZWxlY3RvcignLnJlY2lwZS1wcm9ncmVzcy1pY29uJyk7XG4gICAgY29uc3Qgc3RhdHVzRWwgPSBlbC5xdWVyeVNlbGVjdG9yKCcucmVjaXBlLXByb2dyZXNzLXN0YXR1cycpO1xuXG4gICAgaWYgKHN0YXR1cyA9PT0gJ2RlcGxveWluZycpIHtcbiAgICAgIGljb24udGV4dENvbnRlbnQgPSAnXFx1MjNGMyc7XG4gICAgICBzdGF0dXNFbC5zdHlsZS5jb2xvciA9ICd2YXIoLS1hY2NlbnQpJztcbiAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gJ3N1Y2Nlc3MnKSB7XG4gICAgICBpY29uLnRleHRDb250ZW50ID0gJ1xcdTI3MDUnO1xuICAgICAgc3RhdHVzRWwuc3R5bGUuY29sb3IgPSAndmFyKC0tb2stZmcpJztcbiAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gJ2Vycm9yJykge1xuICAgICAgaWNvbi50ZXh0Q29udGVudCA9ICdcXHUyNzRDJztcbiAgICAgIHN0YXR1c0VsLnN0eWxlLmNvbG9yID0gJ3ZhcigtLWJhZC1mZyknO1xuICAgIH1cbiAgICBzdGF0dXNFbC50ZXh0Q29udGVudCA9IHRleHQ7XG4gIH1cblxuICAvLyA9PT0gU1RFUCBOQVZJR0FUSU9OID09PVxuICBuZXh0QnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGlmIChjdXJyZW50U3RlcCA9PT0gMykge1xuICAgICAgY3VycmVudFN0ZXAgPSA0O1xuICAgICAgdXBkYXRlU3RlcFVJKCk7XG4gICAgICBleGVjdXRlRGVwbG95KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChjdXJyZW50U3RlcCA8IDMpIHtcbiAgICAgIGN1cnJlbnRTdGVwKys7XG4gICAgICB1cGRhdGVTdGVwVUkoKTtcbiAgICAgIGlmIChjdXJyZW50U3RlcCA9PT0gMikgcmVuZGVyU3RlcDIoKTtcbiAgICAgIGlmIChjdXJyZW50U3RlcCA9PT0gMykgcmVuZGVyU3RlcDMoKTtcbiAgICB9XG4gIH0pO1xuXG4gIHByZXZCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgaWYgKGN1cnJlbnRTdGVwID4gMSAmJiBjdXJyZW50U3RlcCA8IDQpIHtcbiAgICAgIGN1cnJlbnRTdGVwLS07XG4gICAgICB1cGRhdGVTdGVwVUkoKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vID09PSBSRUNJUEUgQ0FSRCBHUk9VUElORyBPTiBEQVNIQk9BUkQgPT09XG4gIC8vIEFmdGVyIGRhc2hib2FyZCBsb2FkcywgZ3JvdXAgY2FyZHMgdGhhdCBzaGFyZSBhIHJlY2lwZUlkXG4gIHdpbmRvdy5ncm91cFJlY2lwZUNhcmRzID0gZnVuY3Rpb24oKSB7XG4gICAgY29uc3QgY2FyZHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc2VydmljZS1jYXJkW2RhdGEtcmVjaXBlLWlkXScpO1xuICAgIGlmIChjYXJkcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIGNvbnN0IGdyb3VwcyA9IHt9O1xuICAgIGNhcmRzLmZvckVhY2goY2FyZCA9PiB7XG4gICAgICBjb25zdCByZWNpcGVJZCA9IGNhcmQuZGF0YXNldC5yZWNpcGVJZDtcbiAgICAgIGlmICghZ3JvdXBzW3JlY2lwZUlkXSkgZ3JvdXBzW3JlY2lwZUlkXSA9IFtdO1xuICAgICAgZ3JvdXBzW3JlY2lwZUlkXS5wdXNoKGNhcmQpO1xuICAgIH0pO1xuXG4gICAgZm9yIChjb25zdCBbcmVjaXBlSWQsIGdyb3VwQ2FyZHNdIG9mIE9iamVjdC5lbnRyaWVzKGdyb3VwcykpIHtcbiAgICAgIGlmIChncm91cENhcmRzLmxlbmd0aCA8IDIpIGNvbnRpbnVlO1xuXG4gICAgICAvLyBBcHBseSBzdWJ0bGUgdmlzdWFsIGdyb3VwaW5nXG4gICAgICBncm91cENhcmRzLmZvckVhY2goKGNhcmQsIGkpID0+IHtcbiAgICAgICAgY2FyZC5zdHlsZS5ib3JkZXJMZWZ0ID0gJzNweCBzb2xpZCByZ2JhKDE0Miw2OCwxNzMsMC41KSc7XG4gICAgICAgIGlmIChpID09PSAwKSB7XG4gICAgICAgICAgLy8gQWRkIGEgcmVjaXBlIGxhYmVsIHRvIHRoZSBmaXJzdCBjYXJkXG4gICAgICAgICAgbGV0IGxhYmVsID0gY2FyZC5xdWVyeVNlbGVjdG9yKCcucmVjaXBlLWdyb3VwLWxhYmVsJyk7XG4gICAgICAgICAgaWYgKCFsYWJlbCkge1xuICAgICAgICAgICAgbGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIGxhYmVsLmNsYXNzTmFtZSA9ICdyZWNpcGUtZ3JvdXAtbGFiZWwnO1xuICAgICAgICAgICAgbGFiZWwuc3R5bGUuY3NzVGV4dCA9ICdwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogLThweDsgbGVmdDogMTJweDsgZm9udC1zaXplOiAwLjZyZW07IHBhZGRpbmc6IDFweCA4cHg7IGJvcmRlci1yYWRpdXM6IDhweDsgYmFja2dyb3VuZDogcmdiYSgxNDIsNjgsMTczLDAuMyk7IGNvbG9yOiAjZDRhNWZmOyBmb250LXdlaWdodDogNjAwOyB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOyBsZXR0ZXItc3BhY2luZzogMC41cHg7JztcbiAgICAgICAgICAgIGxhYmVsLnRleHRDb250ZW50ID0gcmVjaXBlSWQucmVwbGFjZSgvLS9nLCAnICcpO1xuICAgICAgICAgICAgY2FyZC5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XG4gICAgICAgICAgICBjYXJkLmFwcGVuZENoaWxkKGxhYmVsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICAvLyA9PT0gUkVDSVBFIE1BTkFHRU1FTlQgQUNUSU9OUyA9PT1cbiAgd2luZG93Lm1hbmFnZVJlY2lwZSA9IGFzeW5jIGZ1bmN0aW9uKHJlY2lwZUlkLCBhY3Rpb24pIHtcbiAgICBjb25zdCBlbmRwb2ludCA9IGAvYXBpL3YxL3JlY2lwZXMvJHtyZWNpcGVJZH0vJHthY3Rpb259YDtcbiAgICBjb25zdCBtZXRob2QgPSBhY3Rpb24gPT09ICdyZW1vdmUnID8gJ0RFTEVURScgOiAnUE9TVCc7XG4gICAgY29uc3QgdXJsID0gYWN0aW9uID09PSAncmVtb3ZlJyA/IGAvYXBpL3YxL3JlY2lwZXMvJHtyZWNpcGVJZH1gIDogZW5kcG9pbnQ7XG5cbiAgICBpZiAoYWN0aW9uID09PSAncmVtb3ZlJyAmJiAhY29uZmlybShgUmVtb3ZlIHRoZSBlbnRpcmUgJHtyZWNpcGVJZH0gcmVjaXBlPyBUaGlzIHdpbGwgZGVsZXRlIGFsbCBjb250YWluZXJzIGFuZCBjb25maWd1cmF0aW9uLmApKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBzZWN1cmVGZXRjaCh1cmwsIHsgbWV0aG9kIH0pO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3AuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKGBSZWNpcGUgJHthY3Rpb259OiAke2RhdGEucmVzdWx0cz8uZmlsdGVyKHIgPT4gci5zdGF0dXMgIT09ICdmYWlsZWQnKS5sZW5ndGggfHwgMH0gY29tcG9uZW50cyBwcm9jZXNzZWRgLCAnc3VjY2VzcycsIDQwMDApO1xuICAgICAgICBpZiAod2luZG93LmxvYWRTZXJ2aWNlcykgd2luZG93LmxvYWRTZXJ2aWNlcygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbihgUmVjaXBlICR7YWN0aW9ufSBmYWlsZWQ6ICR7ZGF0YS5lcnJvcn1gLCAnZXJyb3InLCA1MDAwKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKGBOZXR3b3JrIGVycm9yOiAke2UubWVzc2FnZX1gLCAnZXJyb3InLCA1MDAwKTtcbiAgICB9XG4gIH07XG5cbiAgLy8gPT09IElOSkVDVCBDU1MgPT09XG4gIGNvbnN0IHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgc3R5bGUudGV4dENvbnRlbnQgPSBgXG4gICAgLnJlY2lwZS1zdGVwIHtcbiAgICAgIGZsZXg6IDE7XG4gICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICBwYWRkaW5nOiA4cHggNHB4O1xuICAgICAgZm9udC1zaXplOiAwLjc4cmVtO1xuICAgICAgY29sb3I6IHZhcigtLW11dGVkKTtcbiAgICAgIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1xuICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMnM7XG4gICAgfVxuICAgIC5yZWNpcGUtc3RlcCBzcGFuIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgd2lkdGg6IDIwcHg7XG4gICAgICBoZWlnaHQ6IDIwcHg7XG4gICAgICBib3JkZXItcmFkaXVzOiA1MCU7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ib3JkZXIpO1xuICAgICAgY29sb3I6IHZhcigtLW11dGVkKTtcbiAgICAgIGZvbnQtc2l6ZTogMC43cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgIH1cbiAgICAucmVjaXBlLXN0ZXAuYWN0aXZlIHtcbiAgICAgIGNvbG9yOiB2YXIoLS1hY2NlbnQpO1xuICAgICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogdmFyKC0tYWNjZW50KTtcbiAgICB9XG4gICAgLnJlY2lwZS1zdGVwLmFjdGl2ZSBzcGFuIHtcbiAgICAgIGJhY2tncm91bmQ6IHZhcigtLWFjY2VudCk7XG4gICAgICBjb2xvcjogI2ZmZjtcbiAgICB9XG4gICAgLnJlY2lwZS1zdGVwLmNvbXBsZXRlZCB7XG4gICAgICBjb2xvcjogdmFyKC0tb2stZmcpO1xuICAgICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogdmFyKC0tb2stZmcpO1xuICAgIH1cbiAgICAucmVjaXBlLXN0ZXAuY29tcGxldGVkIHNwYW4ge1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tb2stZmcpO1xuICAgICAgY29sb3I6ICNmZmY7XG4gICAgfVxuICAgIC5yZWNpcGUtc3RlcC1wYW5lbCB7XG4gICAgICBtaW4taGVpZ2h0OiAxODBweDtcbiAgICB9XG4gIGA7XG4gIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xuXG4gIC8vID09PSBJTklUID09PVxuICAvLyBQcmUtZmV0Y2ggcHJlbWl1bSBzdGF0dXMgb24gbG9hZFxuICBjaGVja1JlY2lwZVByZW1pdW0oKTtcbn0pKCk7XG47XG4vLyA9PT09PT09PT09IENBRERZIFJFTE9BRCBCVVRUT04gPT09PT09PT09PVxuKGZ1bmN0aW9uKCkge1xuICAvLyBSZWxvYWQgQ2FkZHkgYnV0dG9uIGhhbmRsZXJcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlbG9hZC1jYWRkeS10b3AnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlbG9hZC1jYWRkeS10b3AnKTtcbiAgICBjb25zdCBvcmlnaW5hbFRleHQgPSBidXR0b24udGV4dENvbnRlbnQ7XG5cbiAgICB0cnkge1xuICAgICAgYnV0dG9uLnRleHRDb250ZW50ID0gJ1x1MjNGMyBSZWxvYWRpbmcuLi4nO1xuICAgICAgYnV0dG9uLmRpc2FibGVkID0gdHJ1ZTtcblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9jYWRkeS9yZWxvYWQnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcblxuICAgICAgaWYgKHJlc3BvbnNlLm9rICYmIHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgIGJ1dHRvbi50ZXh0Q29udGVudCA9ICdcdTI3MDUgUmVsb2FkZWQhJztcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgYnV0dG9uLnRleHRDb250ZW50ID0gb3JpZ2luYWxUZXh0O1xuICAgICAgICAgIGJ1dHRvbi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICB9LCAyMDAwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihyZXN1bHQuZXJyb3IgfHwgJ1JlbG9hZCBmYWlsZWQnKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYnV0dG9uLnRleHRDb250ZW50ID0gJ1x1Mjc0QyBGYWlsZWQnO1xuICAgICAgc2hvd05vdGlmaWNhdGlvbihgRmFpbGVkIHRvIHJlbG9hZCBDYWRkeTogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGJ1dHRvbi50ZXh0Q29udGVudCA9IG9yaWdpbmFsVGV4dDtcbiAgICAgICAgYnV0dG9uLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICB9LCAyMDAwKTtcbiAgICB9XG4gIH0pO1xufSkoKTtcbjtcbi8vID09PT09PT09PT0gRVJST1IgTE9HIFZJRVdFUiAoREMtMDUyKSA9PT09PT09PT09XG4vLyBEQy0wNTI6IEFkZHMgTGV2ZWwgLyBDb250ZXh0IC8gU2VhcmNoIC8gVGltZS1yYW5nZSBmaWx0ZXJzLCBzZXJ2ZXItc2lkZVxuLy8gcGFnaW5hdGlvbiB3aXRoIExvYWQgTW9yZSwgY2xpY2stdG8tZXhwYW5kIHN0YWNrIGZyYW1lcywgYW5kIGEgZGlzdGluY3Rcbi8vIGNvbnRleHRzIGRyb3Bkb3duIGJhY2tlZCBieSAvYXBpL3YxL2Vycm9yLWxvZ3MvY29udGV4dHMuIE1pcnJvcnMgdGhlXG4vLyBhdWRpdC1sb2cgVVggKERDLTA1MCkgc28gb3BlcmF0b3JzIGNhbiBkcmlsbCBpbnRvIGEgc3Vic3lzdGVtIGFzIGVhc2lseVxuLy8gYXMgdGhleSBjYW4gYXVkaXQgd2hvLWRpZC13aGF0LlxuKGZ1bmN0aW9uKCkge1xuICAvLyBJbmplY3QgbW9kYWwgSFRNTC4gU2FtZSB3ZWF0aGVyLW1vZGFsIHNoZWxsIGFzIGF1ZGl0LWxvZyBzbyBzdHlsZXNcbiAgLy8gYXJlIHNoYXJlZDsgd2lkZXIgbWluLXdpZHRoIGJlY2F1c2UgZXJyb3Igc3RhY2tzIG5lZWQgcm9vbSB0byBicmVhdGhlLlxuICBpbmplY3RNb2RhbCgnZXJyb3ItbG9nLW1vZGFsJywgYDxkaXYgaWQ9XCJlcnJvci1sb2ctbW9kYWxcIiBjbGFzcz1cIndlYXRoZXItbW9kYWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1jb250ZW50XCIgc3R5bGU9XCJtaW4td2lkdGg6IDk1MHB4OyBtYXgtd2lkdGg6IDExNTBweDtcIj5cbiAgICAgIDxoMz5cdUQ4M0RcdURDQ0IgRXJyb3IgTG9nczwvaDM+XG4gICAgICA8cCBjbGFzcz1cIm1vZGFsLXN1YnRpdGxlXCI+XG4gICAgICAgIEVycm9ycyBhbmQgd2FybmluZ3MgZnJvbSB0aGUgRGFzaENhZGR5IEFQSS4gQ2xpY2sgYSByb3cgdG8gc2VlIHRoZSBmdWxsIHN0YWNrIHRyYWNlLlxuICAgICAgPC9wPlxuXG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiAxMnB4OyBtYXJnaW4tYm90dG9tOiAxMnB4OyBhbGlnbi1pdGVtczogY2VudGVyOyBmbGV4LXdyYXA6IHdyYXA7XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cInRleHQtbXV0ZWQtc21cIj5MZXZlbDo8L2xhYmVsPlxuICAgICAgICA8c2VsZWN0IGlkPVwiZXJyb3ItbG9nLWxldmVsXCIgc3R5bGU9XCJwYWRkaW5nOiA2cHggMTBweDsgYm9yZGVyLXJhZGl1czogNnB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+QWxsPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIkVSUlwiPkVycm9yczwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJXQVJOXCI+V2FybmluZ3M8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiSU5GT1wiPkluZm88L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiREVCVUdcIj5EZWJ1Zzwvb3B0aW9uPlxuICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwidGV4dC1tdXRlZC1zbVwiPkNvbnRleHQ6PC9sYWJlbD5cbiAgICAgICAgPHNlbGVjdCBpZD1cImVycm9yLWxvZy1jb250ZXh0XCIgc3R5bGU9XCJwYWRkaW5nOiA2cHggMTBweDsgYm9yZGVyLXJhZGl1czogNnB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7IGZvbnQtc2l6ZTogMC44NXJlbTsgbWF4LXdpZHRoOiAyMjBweDtcIj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+QWxsPC9vcHRpb24+XG4gICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJ0ZXh0LW11dGVkLXNtXCIgc3R5bGU9XCJtYXJnaW4tbGVmdDogOHB4O1wiPlNlYXJjaDo8L2xhYmVsPlxuICAgICAgICA8aW5wdXQgaWQ9XCJlcnJvci1sb2ctc2VhcmNoXCIgdHlwZT1cInNlYXJjaFwiIHBsYWNlaG9sZGVyPVwibWVzc2FnZSAvIHN0YWNrIC8gaXBcIiBzdHlsZT1cInBhZGRpbmc6IDVweCA4cHg7IGJvcmRlci1yYWRpdXM6IDZweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBjb2xvcjogdmFyKC0tZmcpOyBmb250LXNpemU6IDAuODJyZW07IG1pbi13aWR0aDogMTgwcHg7XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cInRleHQtbXV0ZWQtc21cIiBzdHlsZT1cIm1hcmdpbi1sZWZ0OiA4cHg7XCI+U2luY2U6PC9sYWJlbD5cbiAgICAgICAgPGlucHV0IGlkPVwiZXJyb3ItbG9nLXNpbmNlXCIgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCIgc3R5bGU9XCJwYWRkaW5nOiA1cHggOHB4OyBib3JkZXItcmFkaXVzOiA2cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgZm9udC1zaXplOiAwLjgycmVtO1wiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJ0ZXh0LW11dGVkLXNtXCI+VW50aWw6PC9sYWJlbD5cbiAgICAgICAgPGlucHV0IGlkPVwiZXJyb3ItbG9nLXVudGlsXCIgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCIgc3R5bGU9XCJwYWRkaW5nOiA1cHggOHB4OyBib3JkZXItcmFkaXVzOiA2cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgZm9udC1zaXplOiAwLjgycmVtO1wiPlxuICAgICAgICA8YnV0dG9uIGlkPVwiZXJyb3ItbG9nLXJlZnJlc2hcIiBjbGFzcz1cImJ0bi1zbVwiPlx1RDgzRFx1REQwNCBSZWZyZXNoPC9idXR0b24+XG4gICAgICAgIDxzcGFuIHN0eWxlPVwiZmxleDogMTtcIj48L3NwYW4+XG4gICAgICAgIDxidXR0b24gaWQ9XCJlcnJvci1sb2ctY2xlYXJcIiBzdHlsZT1cInBhZGRpbmc6IDZweCAxMnB4OyBmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLWJhZC1mZyk7IGJvcmRlci1jb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5cdUQ4M0RcdURERDFcdUZFMEYgQ2xlYXIgTG9nPC9idXR0b24+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBpZD1cImVycm9yLWxvZy1jb250YWluZXJcIiBjbGFzcz1cInNjcm9sbC1jb250YWluZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJicmFuZC1zcGlubmVyXCI+PC9zcGFuPiBMb2FkaW5nIGVycm9yIGxvZ3MuLi48L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMTJweDsgdGV4dC1hbGlnbjogY2VudGVyO1wiPlxuICAgICAgICA8YnV0dG9uIGlkPVwiZXJyb3ItbG9nLWxvYWQtbW9yZVwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgcGFkZGluZzogNnB4IDE2cHg7IGZvbnQtc2l6ZTogMC44cmVtO1wiPkxvYWQgTW9yZTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiA4cHg7IGZvbnQtc2l6ZTogMC43OHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgdGV4dC1hbGlnbjogcmlnaHQ7XCI+XG4gICAgICAgIDxzcGFuIGlkPVwiZXJyb3ItbG9nLXRvdGFsXCI+PC9zcGFuPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWJ1dHRvbnMgbW9kYWwtZm9vdGVyLWJhclwiPlxuICAgICAgICA8YnV0dG9uIGlkPVwiZXJyb3ItbG9nLWNsb3NlXCI+Q2xvc2U8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5gKTtcblxuICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlcnJvci1sb2ctbW9kYWwnKTtcbiAgY29uc3Qgdmlld0J0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2aWV3LWVycm9yLWxvZ3MnKTtcbiAgY29uc3QgcmVmcmVzaEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlcnJvci1sb2ctcmVmcmVzaCcpO1xuICBjb25zdCBjbGVhckJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlcnJvci1sb2ctY2xlYXInKTtcbiAgY29uc3QgY2xvc2VCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXJyb3ItbG9nLWNsb3NlJyk7XG4gIGNvbnN0IGxldmVsU2VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Vycm9yLWxvZy1sZXZlbCcpO1xuICBjb25zdCBjb250ZXh0U2VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Vycm9yLWxvZy1jb250ZXh0Jyk7XG4gIGNvbnN0IHNlYXJjaElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Vycm9yLWxvZy1zZWFyY2gnKTtcbiAgY29uc3Qgc2luY2VJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlcnJvci1sb2ctc2luY2UnKTtcbiAgY29uc3QgdW50aWxJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlcnJvci1sb2ctdW50aWwnKTtcbiAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Vycm9yLWxvZy1jb250YWluZXInKTtcbiAgY29uc3QgbG9hZE1vcmVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXJyb3ItbG9nLWxvYWQtbW9yZScpO1xuICBjb25zdCB0b3RhbFNwYW4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXJyb3ItbG9nLXRvdGFsJyk7XG5cbiAgY29uc3QgUEFHRV9TSVpFID0gNTA7XG4gIGxldCBjdXJyZW50T2Zmc2V0ID0gMDtcbiAgbGV0IGluZmxpZ2h0ID0gbnVsbDtcbiAgbGV0IGZpbHRlck5vbmNlID0gMDtcbiAgLy8gQ2FjaGVkIGRpc3RpbmN0IGNvbnRleHRzIHNvIHRoZSBkcm9wZG93biBpcyBwb3B1bGF0ZWQgb25jZSBwZXIgb3BlbiBhbmRcbiAgLy8gcmUtcG9wdWxhdGVkIGFmdGVyIGEgY2xlYXIgKHdoaWNoIHJlbW92ZXMgYWxsIGNvbnRleHRzKSBvciBhIHJlZnJlc2hcbiAgLy8gdGhhdCBzdXJmYWNlcyBhIG5ldyBzdWJzeXN0ZW0gZm9yIHRoZSBmaXJzdCB0aW1lLlxuICBsZXQga25vd25Db250ZXh0cyA9IFtdO1xuXG4gIC8vIGRhdGV0aW1lLWxvY2FsIGZpZWxkcyBhcmUgbmFpdmUgbG9jYWwgdGltZSBcdTIwMTQgY29udmVydCB0byBVVEMgSVNPIHNvIHRoZVxuICAvLyBzZXJ2ZXIgY29tcGFyZXMgY29ycmVjdGx5LiBTYW1lIHNoYXBlIGFzIGF1ZGl0LWxvZy5qcyBzbyB0aGUgb3BlcmF0b3JcbiAgLy8gc2VlcyBjb25zaXN0ZW50IGJlaGF2aW91ciBiZXR3ZWVuIHRoZSB0d28gbW9kYWxzLlxuICBmdW5jdGlvbiB0b0lzbyhsb2NhbER0VmFsdWUpIHtcbiAgICBpZiAoIWxvY2FsRHRWYWx1ZSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgZCA9IG5ldyBEYXRlKGxvY2FsRHRWYWx1ZSk7XG4gICAgaWYgKGlzTmFOKGQuZ2V0VGltZSgpKSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIGQudG9JU09TdHJpbmcoKTtcbiAgfVxuXG4gIC8vIFB1bGwgdGhlIGRpc3RpbmN0IGNvbnRleHRzIGxpc3Qgb25jZSBwZXIgb3Blbi4gRmFpbHVyZXMgYXJlIHNpbGVudFxuICAvLyAodGhlIGRyb3Bkb3duIHdpbGwganVzdCBzaG93IFwiQWxsXCIgb25seSkgc28gYSB0cmFuc2llbnQgYmFja2VuZCBoaWNjdXBcbiAgLy8gZG9lc24ndCBibG9jayB0aGUgb3BlcmF0b3IgZnJvbSBzZWVpbmcgdGhlIGFjdHVhbCBlcnJvciByb3dzLlxuICBhc3luYyBmdW5jdGlvbiByZWZyZXNoQ29udGV4dHMoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2Vycm9yLWxvZ3MvY29udGV4dHMnKTtcbiAgICAgIGlmICghcmVzLm9rKSByZXR1cm47XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmICghZGF0YS5zdWNjZXNzIHx8ICFBcnJheS5pc0FycmF5KGRhdGEuY29udGV4dHMpKSByZXR1cm47XG4gICAgICBrbm93bkNvbnRleHRzID0gZGF0YS5jb250ZXh0cztcbiAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGNvbnRleHRTZWwudmFsdWU7XG4gICAgICBjb250ZXh0U2VsLmlubmVySFRNTCA9ICc8b3B0aW9uIHZhbHVlPVwiXCI+QWxsPC9vcHRpb24+JztcbiAgICAgIGZvciAoY29uc3QgYyBvZiBkYXRhLmNvbnRleHRzKSB7XG4gICAgICAgIGNvbnN0IG9wdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpO1xuICAgICAgICBvcHQudmFsdWUgPSBjLm5hbWU7XG4gICAgICAgIG9wdC50ZXh0Q29udGVudCA9IGAke2MubmFtZX0gKCR7Yy5jb3VudH0pYDtcbiAgICAgICAgY29udGV4dFNlbC5hcHBlbmRDaGlsZChvcHQpO1xuICAgICAgfVxuICAgICAgLy8gUmVzdG9yZSBwcmV2aW91cyBzZWxlY3Rpb24gaWYgc3RpbGwgcHJlc2VudC5cbiAgICAgIGlmIChjdXJyZW50VmFsdWUgJiYgZGF0YS5jb250ZXh0cy5zb21lKChjKSA9PiBjLm5hbWUgPT09IGN1cnJlbnRWYWx1ZSkpIHtcbiAgICAgICAgY29udGV4dFNlbC52YWx1ZSA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHsgLyogaWdub3JlICovIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGJ1aWxkUXVlcnkoKSB7XG4gICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICAgIHBhcmFtcy5zZXQoJ2xpbWl0JywgU3RyaW5nKFBBR0VfU0laRSkpO1xuICAgIHBhcmFtcy5zZXQoJ29mZnNldCcsIFN0cmluZyhjdXJyZW50T2Zmc2V0KSk7XG4gICAgaWYgKGxldmVsU2VsLnZhbHVlKSBwYXJhbXMuc2V0KCdsZXZlbCcsIGxldmVsU2VsLnZhbHVlKTtcbiAgICBpZiAoY29udGV4dFNlbC52YWx1ZSkgcGFyYW1zLnNldCgnY29udGV4dCcsIGNvbnRleHRTZWwudmFsdWUpO1xuICAgIGNvbnN0IHNpbmNlID0gdG9Jc28oc2luY2VJbnB1dC52YWx1ZSk7XG4gICAgY29uc3QgdW50aWwgPSB0b0lzbyh1bnRpbElucHV0LnZhbHVlKTtcbiAgICBpZiAoc2luY2UpIHBhcmFtcy5zZXQoJ3NpbmNlJywgc2luY2UpO1xuICAgIGlmICh1bnRpbCkgcGFyYW1zLnNldCgndW50aWwnLCB1bnRpbCk7XG4gICAgY29uc3Qgc2VhcmNoID0gKHNlYXJjaElucHV0LnZhbHVlIHx8ICcnKS50cmltKCk7XG4gICAgaWYgKHNlYXJjaCkgcGFyYW1zLnNldCgnc2VhcmNoJywgc2VhcmNoKTtcbiAgICByZXR1cm4gcGFyYW1zO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZExvZ3MoYXBwZW5kKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghYXBwZW5kKSB7XG4gICAgICAgIGlmIChpbmZsaWdodCkgaW5mbGlnaHQuYWJvcnQoKTtcbiAgICAgICAgaW5mbGlnaHQgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICAgIGN1cnJlbnRPZmZzZXQgPSAwO1xuICAgICAgICBmaWx0ZXJOb25jZSsrO1xuICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiYnJhbmQtc3Bpbm5lclwiPjwvc3Bhbj4gTG9hZGluZy4uLjwvZGl2Pic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoaW5mbGlnaHQpIGluZmxpZ2h0LmFib3J0KCk7XG4gICAgICAgIGluZmxpZ2h0ID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgfVxuICAgICAgY29uc3QgbXlOb25jZSA9IGZpbHRlck5vbmNlO1xuICAgICAgY29uc3QgcGFyYW1zID0gYnVpbGRRdWVyeSgpO1xuXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9lcnJvci1sb2dzPycgKyBwYXJhbXMudG9TdHJpbmcoKSwge1xuICAgICAgICBzaWduYWw6IGluZmxpZ2h0LnNpZ25hbCxcbiAgICAgIH0pO1xuICAgICAgLy8gTWlycm9yIGF1ZGl0LWxvZzogc3VyZmFjZSA0eHgvNXh4IGV4cGxpY2l0bHkgaW5zdGVhZCBvZiBmYWxsaW5nXG4gICAgICAvLyB0aHJvdWdoIHRvIGEgbWlzbGVhZGluZyBcIm5vIGVudHJpZXMgeWV0XCIgZW1wdHkgc3RhdGUuXG4gICAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RmFpbGVkOiBIVFRQICR7cmVzLnN0YXR1c308L2Rpdj5gO1xuICAgICAgICBsb2FkTW9yZUJ0bi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICB0b3RhbFNwYW4udGV4dENvbnRlbnQgPSAnJztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoIWRhdGEuc3VjY2Vzcykge1xuICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RmFpbGVkOiAke2VzY2FwZUh0bWwoZGF0YS5lcnJvciB8fCAndW5rbm93bicpfTwvZGl2PmA7XG4gICAgICAgIGxvYWRNb3JlQnRuLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIHRvdGFsU3Bhbi50ZXh0Q29udGVudCA9ICcnO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBTdGFsZS1yZXNwb25zZSBndWFyZDogYSBub24tYXBwZW5kIGxvYWQgaGFwcGVuZWQgYWZ0ZXIgdGhpcyBmZXRjaCxcbiAgICAgIC8vIGRpc2NhcmQgc28gd2UgZG9uJ3Qgc3BsaWNlIGludG8gdGhlIHdyb25nIERPTS5cbiAgICAgIGlmICghYXBwZW5kICYmIG15Tm9uY2UgIT09IGZpbHRlck5vbmNlKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGxvZ3MgPSBBcnJheS5pc0FycmF5KGRhdGEubG9ncykgPyBkYXRhLmxvZ3MgOiBbXTtcbiAgICAgIGlmIChsb2dzLmxlbmd0aCA9PT0gMCAmJiAhYXBwZW5kKSB7XG4gICAgICAgIGNvbnN0IHJlYXNvbiA9IChkYXRhLmZpbHRlcnMgJiYgKGRhdGEuZmlsdGVycy5sZXZlbCB8fCBkYXRhLmZpbHRlcnMuY29udGV4dCB8fCBkYXRhLmZpbHRlcnMuc2VhcmNoIHx8IGRhdGEuZmlsdGVycy5zaW5jZSB8fCBkYXRhLmZpbHRlcnMudW50aWwpKVxuICAgICAgICAgID8gJ05vIGVycm9yIGxvZyBlbnRyaWVzIG1hdGNoIHlvdXIgZmlsdGVycy4nXG4gICAgICAgICAgOiAnXHUyNzA1IE5vIGVycm9ycyBsb2dnZWQhIEV2ZXJ5dGhpbmcgaXMgd29ya2luZyBzbW9vdGhseS4nO1xuICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1RDgzRFx1RENDQjwvc3Bhbj4ke2VzY2FwZUh0bWwocmVhc29uKX08L2Rpdj5gO1xuICAgICAgICBsb2FkTW9yZUJ0bi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICB0b3RhbFNwYW4udGV4dENvbnRlbnQgPSBkYXRhLnRvdGFsID8gYCR7ZGF0YS50b3RhbH0gdG90YWxgIDogJyc7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGV0IGh0bWwgPSAnJztcbiAgICAgIGlmICghYXBwZW5kKSB7XG4gICAgICAgIGh0bWwgPSAnPHRhYmxlIHN0eWxlPVwid2lkdGg6IDEwMCU7IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IGZvbnQtc2l6ZTogMC44MnJlbTtcIj4nO1xuICAgICAgICBodG1sICs9ICc8dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj4nO1xuICAgICAgICBodG1sICs9ICc8dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7IHdpZHRoOiAxNjBweDtcIj5XaGVuPC90aD4nO1xuICAgICAgICBodG1sICs9ICc8dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7IHdpZHRoOiA4MHB4O1wiPkxldmVsPC90aD4nO1xuICAgICAgICBodG1sICs9ICc8dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7IHdpZHRoOiAxNDBweDtcIj5Db250ZXh0PC90aD4nO1xuICAgICAgICBodG1sICs9ICc8dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+TWVzc2FnZTwvdGg+JztcbiAgICAgICAgaHRtbCArPSAnPHRoIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBsZWZ0OyB3aWR0aDogMTEwcHg7XCI+SVA8L3RoPic7XG4gICAgICAgIGh0bWwgKz0gJzwvdHI+JztcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBsb2cgb2YgbG9ncykge1xuICAgICAgICBjb25zdCBsZXZlbCA9IChsb2cubGV2ZWwgfHwgJz8nKS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICBjb25zdCBsZXZlbENvbG9yID0gbGV2ZWwgPT09ICdFUlInID8gJ3ZhcigtLWJhZC1mZyknIDogKGxldmVsID09PSAnV0FSTicgPyAndmFyKC0td2Fybi1mZywgI2YwYzY3NCknIDogJ3ZhcigtLW11dGVkKScpO1xuICAgICAgICBjb25zdCB0cyA9IGxvZy50aW1lc3RhbXAgPyBuZXcgRGF0ZShsb2cudGltZXN0YW1wKS50b0xvY2FsZVN0cmluZygpIDogJ1x1MjAxNCc7XG4gICAgICAgIGNvbnN0IGN0eCA9IGxvZy5jb250ZXh0IHx8ICdcdTIwMTQnO1xuICAgICAgICBjb25zdCBtc2cgPSAobG9nLmVycm9yIHx8ICcnKS5zcGxpdCgnXFxuJylbMF07XG4gICAgICAgIGNvbnN0IGlwID0gKGxvZy5yZXF1ZXN0ICYmIGxvZy5yZXF1ZXN0LmlwKSB8fCAnJztcbiAgICAgICAgaHRtbCArPSBgPHRyIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGN1cnNvcjogcG9pbnRlcjtcIiBjbGFzcz1cImVycm9yLWxvZy1yb3dcIj5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCIgdGl0bGU9XCIke2VzY2FwZUh0bWwobG9nLnRpbWVzdGFtcCB8fCAnJyl9XCI+JHtlc2NhcGVIdG1sKHRzKX08L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweDtcIj48c3BhbiBzdHlsZT1cImNvbG9yOiAke2xldmVsQ29sb3J9OyBmb250LXdlaWdodDogNjAwO1wiPiR7ZXNjYXBlSHRtbChsZXZlbCl9PC9zcGFuPjwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4OyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBmb250LXNpemU6IDAuNzhyZW07XCI+JHtlc2NhcGVIdG1sKGN0eCl9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7XCI+JHtlc2NhcGVIdG1sKG1zZyl9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IGZvbnQtc2l6ZTogMC43OHJlbTtcIj4ke2VzY2FwZUh0bWwoaXApfTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSAnPC90cj4nO1xuICAgICAgICBpZiAobG9nLmRldGFpbCkge1xuICAgICAgICAgIGh0bWwgKz0gYDx0ciBjbGFzcz1cImVycm9yLWxvZy1kZXRhaWxcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+PHRkIGNvbHNwYW49XCI1XCIgc3R5bGU9XCJwYWRkaW5nOiA2cHggNnB4IDEwcHg7IGZvbnQtc2l6ZTogMC43OHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj48cHJlIHN0eWxlPVwibWFyZ2luOiAwOyB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IG1heC1oZWlnaHQ6IDMyMHB4OyBvdmVyZmxvdzogYXV0bztcIj4ke2VzY2FwZUh0bWwobG9nLmRldGFpbCl9PC9wcmU+PC90ZD48L3RyPmA7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFhcHBlbmQpIHtcbiAgICAgICAgaHRtbCArPSAnPC90YWJsZT4nO1xuICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gaHRtbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHRhYmxlID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ3RhYmxlJyk7XG4gICAgICAgIGlmICh0YWJsZSkgdGFibGUuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLCBodG1sKTtcbiAgICAgIH1cblxuICAgICAgY3VycmVudE9mZnNldCArPSBsb2dzLmxlbmd0aDtcbiAgICAgIGxvYWRNb3JlQnRuLnN0eWxlLmRpc3BsYXkgPSBkYXRhLmhhc01vcmUgPyAnJyA6ICdub25lJztcbiAgICAgIHRvdGFsU3Bhbi50ZXh0Q29udGVudCA9IGAke2RhdGEudG90YWx9IHRvdGFsJHtkYXRhLmhhc01vcmUgPyAnIChzaG93aW5nICcgKyBjdXJyZW50T2Zmc2V0ICsgJyknIDogJyd9YDtcblxuICAgICAgLy8gVG9nZ2xlIGRldGFpbCByb3dzIG9uIGNsaWNrIFx1MjAxNCBzYW1lIHBhdHRlcm4gYXMgYXVkaXQtbG9nLmpzXG4gICAgICBjb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnLmVycm9yLWxvZy1yb3cnKS5mb3JFYWNoKChyb3cpID0+IHtcbiAgICAgICAgaWYgKHJvdy5kYXRhc2V0LndpcmVkKSByZXR1cm47XG4gICAgICAgIHJvdy5kYXRhc2V0LndpcmVkID0gJ3RydWUnO1xuICAgICAgICByb3cuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgZGV0YWlsID0gcm93Lm5leHRFbGVtZW50U2libGluZztcbiAgICAgICAgICBpZiAoZGV0YWlsICYmIGRldGFpbC5jbGFzc0xpc3QuY29udGFpbnMoJ2Vycm9yLWxvZy1kZXRhaWwnKSkge1xuICAgICAgICAgICAgZGV0YWlsLnN0eWxlLmRpc3BsYXkgPSBkZXRhaWwuc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnID8gJycgOiAnbm9uZSc7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChlICYmIGUubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSByZXR1cm47XG4gICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RmFpbGVkOiAke2VzY2FwZUh0bWwoZS5tZXNzYWdlKX08L2Rpdj5gO1xuICAgICAgdG90YWxTcGFuLnRleHRDb250ZW50ID0gJyc7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gY2xlYXJMb2dzKCkge1xuICAgIGlmICghY29uZmlybSgnQ2xlYXIgdGhlIGVudGlyZSBlcnJvciBsb2c/IFRoaXMgY2Fubm90IGJlIHVuZG9uZS4nKSkgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9lcnJvci1sb2dzJywge1xuICAgICAgICBtZXRob2Q6ICdERUxFVEUnLFxuICAgICAgICBoZWFkZXJzOiB7ICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBjb25maXJtOiAnQ0xFQVInIH0pLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgLy8gQWZ0ZXIgYSBjbGVhciwgdGhlIGNvbnRleHRzIGxpc3Qgd2lsbCBiZSBlbXB0eSBcdTIwMTQgcmUtZmV0Y2ggc28gdGhlXG4gICAgICAgIC8vIGRyb3Bkb3duIHJlZmxlY3RzIHJlYWxpdHkuIExvYWQgdGhlIG5vdy1lbXB0eSBwYWdlIGluIHBhcmFsbGVsLlxuICAgICAgICBhd2FpdCByZWZyZXNoQ29udGV4dHMoKTtcbiAgICAgICAgbG9hZExvZ3MoZmFsc2UpO1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdcdTI3MDUgRXJyb3IgbG9ncyBjbGVhcmVkJywgJ3N1Y2Nlc3MnLCAzMDAwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oJ1x1Mjc0QyAnICsgKGRhdGEuZXJyb3IgfHwgJ0NsZWFyIGZhaWxlZCcpLCAnZXJyb3InLCA0MDAwKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdcdTI3NEMgJyArIGUubWVzc2FnZSwgJ2Vycm9yJywgNDAwMCk7XG4gICAgfVxuICB9XG5cbiAgLy8gRGVib3VuY2UgdGV4dC1pbnB1dCBjaGFuZ2VzIHNvIHdlIGRvbid0IHJlZmV0Y2ggb24gZXZlcnkga2V5c3Ryb2tlLlxuICBsZXQgc2VhcmNoRGVib3VuY2U7XG4gIGZ1bmN0aW9uIHdpcmVGaWx0ZXJzKCkge1xuICAgIGxldmVsU2VsPy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiBsb2FkTG9ncyhmYWxzZSkpO1xuICAgIGNvbnRleHRTZWw/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IGxvYWRMb2dzKGZhbHNlKSk7XG4gICAgc2VhcmNoSW5wdXQ/LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xuICAgICAgY2xlYXJUaW1lb3V0KHNlYXJjaERlYm91bmNlKTtcbiAgICAgIHNlYXJjaERlYm91bmNlID0gc2V0VGltZW91dCgoKSA9PiBsb2FkTG9ncyhmYWxzZSksIDI1MCk7XG4gICAgfSk7XG4gICAgbGV0IGRhdGVEZWJvdW5jZTtcbiAgICBbc2luY2VJbnB1dCwgdW50aWxJbnB1dF0uZm9yRWFjaCgoZWwpID0+IHtcbiAgICAgIGVsPy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dChkYXRlRGVib3VuY2UpO1xuICAgICAgICBkYXRlRGVib3VuY2UgPSBzZXRUaW1lb3V0KCgpID0+IGxvYWRMb2dzKGZhbHNlKSwgMjUwKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJlZnJlc2hCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gbG9hZExvZ3MoZmFsc2UpKTtcbiAgICBsb2FkTW9yZUJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBsb2FkTG9ncyh0cnVlKSk7XG4gICAgY2xlYXJCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xlYXJMb2dzKTtcbiAgICB3aXJlTW9kYWwobW9kYWwsIGNsb3NlQnRuKTtcbiAgfVxuXG4gIHZpZXdCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgIG1vZGFsPy5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG4gICAgYXdhaXQgcmVmcmVzaENvbnRleHRzKCk7XG4gICAgbG9hZExvZ3MoZmFsc2UpO1xuICB9KTtcbiAgd2lyZUZpbHRlcnMoKTtcbn0pKCk7XG47XG4vLyA9PT09PT09PT09IENPTlRBSU5FUiBMT0cgVklFV0VSID09PT09PT09PT1cbihmdW5jdGlvbigpIHtcbiAgLy8gSW5qZWN0IG1vZGFsIEhUTUxcbiAgaW5qZWN0TW9kYWwoJ2NvbnRhaW5lci1sb2dzLW1vZGFsJywgYDxkaXYgaWQ9XCJjb250YWluZXItbG9ncy1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiIHN0eWxlPVwiei1pbmRleDogMTAwMTtcIj5cbiAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1jb250ZW50XCIgc3R5bGU9XCJtaW4td2lkdGg6IDkwMHB4OyBtYXgtd2lkdGg6IDk1dnc7IGhlaWdodDogODB2aDsgZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJsb2dzLWhlYWRlclwiIHN0eWxlPVwiZGlzcGxheTogZmxleDsganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOyBhbGlnbi1pdGVtczogY2VudGVyOyBwYWRkaW5nLWJvdHRvbTogMTJweDsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IG1hcmdpbi1ib3R0b206IDEycHg7XCI+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGgzIHN0eWxlPVwibWFyZ2luOiAwO1wiPlx1RDgzRFx1RENEQyBDb250YWluZXIgTG9nczwvaDM+XG4gICAgICAgICAgPHAgY2xhc3M9XCJtb2RhbC1zdWJ0aXRsZVwiIHN0eWxlPVwibWFyZ2luOiA0cHggMCAwIDA7IGZvbnQtc2l6ZTogMC44NXJlbTsgb3BhY2l0eTogMC43O1wiPlZpZXcgYW5kIHN0cmVhbSBEb2NrZXIgY29udGFpbmVyIGxvZ3M8L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibG9ncy1jb250cm9sc1wiIHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7XCI+XG4gICAgICAgICAgPHNlbGVjdCBpZD1cImNsLWNvbnRhaW5lci1zZWxlY3RcIiBzdHlsZT1cInBhZGRpbmc6IDZweCAxMHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgbWluLXdpZHRoOiAyMDBweDtcIj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj5TZWxlY3QgYSBjb250YWluZXIuLi48L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImNsLWxvZy1zZWFyY2hcIiBwbGFjZWhvbGRlcj1cIlNlYXJjaCBsb2dzLi4uXCIgc3R5bGU9XCJwYWRkaW5nOiA2cHggMTBweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7IHdpZHRoOiAxNTBweDtcIiAvPlxuICAgICAgICAgIDxzZWxlY3QgaWQ9XCJjbC1sb2ctdGFpbFwiIHN0eWxlPVwicGFkZGluZzogNnB4IDEwcHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDZweDsgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBjb2xvcjogdmFyKC0tZmcpO1wiPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjUwXCI+TGFzdCA1MCBsaW5lczwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjEwMFwiIHNlbGVjdGVkPkxhc3QgMTAwIGxpbmVzPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiNTAwXCI+TGFzdCA1MDAgbGluZXM8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIxMDAwXCI+TGFzdCAxMDAwIGxpbmVzPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiYWxsXCI+QWxsIGxvZ3M8L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiY2wtcmVmcmVzaFwiIGNsYXNzPVwiYnRuLWFjY2VudC1zb2xpZFwiIHN0eWxlPVwicGFkZGluZzogNnB4IDE0cHg7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj5cdUQ4M0RcdUREMDQgUmVmcmVzaDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJjbC1zdHJlYW1cIiBjbGFzcz1cImJ0bi1hY2NlbnQtc29saWRcIiBzdHlsZT1cInBhZGRpbmc6IDZweCAxNHB4OyBmb250LXNpemU6IDAuODVyZW07XCI+XHUyNUI2IFN0cmVhbTwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJjbC1kb3dubG9hZFwiIHN0eWxlPVwicGFkZGluZzogNnB4IDE0cHg7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj5cdUQ4M0RcdURDQkUgRG93bmxvYWQ8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiY2wtY2xlYXItc2VhcmNoXCIgc3R5bGU9XCJwYWRkaW5nOiA2cHggMTBweDsgZm9udC1zaXplOiAwLjg1cmVtO1wiIHRpdGxlPVwiQ2xlYXIgc2VhcmNoXCI+XHUyNzE1PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImNsLWNsb3NlXCIgY2xhc3M9XCJjbG9zZS1idG5cIiBzdHlsZT1cInBhZGRpbmc6IDZweCAxMHB4O1wiPlx1MjcxNTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgXG4gICAgICA8ZGl2IGlkPVwiY2wtY29udGFpbmVyLWluZm9cIiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogMTZweDsgbWFyZ2luLWJvdHRvbTogMTJweDsgcGFkZGluZzogOHB4IDEycHg7IGJhY2tncm91bmQ6IHZhcigtLWJnLXNlY29uZGFyeSwgdmFyKC0tYmcpKTsgYm9yZGVyLXJhZGl1czogNnB4OyBmb250LXNpemU6IDAuODJyZW07XCI+XG4gICAgICAgIDxzcGFuPjxzdHJvbmc+SW1hZ2U6PC9zdHJvbmc+IDxzcGFuIGlkPVwiY2wtaW1hZ2VcIj4tPC9zcGFuPjwvc3Bhbj5cbiAgICAgICAgPHNwYW4+PHN0cm9uZz5TdGF0dXM6PC9zdHJvbmc+IDxzcGFuIGlkPVwiY2wtc3RhdHVzXCI+LTwvc3Bhbj48L3NwYW4+XG4gICAgICAgIDxzcGFuPjxzdHJvbmc+Q3JlYXRlZDo8L3N0cm9uZz4gPHNwYW4gaWQ9XCJjbC1jcmVhdGVkXCI+LTwvc3Bhbj48L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIFxuICAgICAgPGRpdiBpZD1cImNsLWxvZy1jb250ZW50XCIgY2xhc3M9XCJsb2dzLWNvbnRlbnQgc2Nyb2xsLWNvbnRhaW5lclwiIHN0eWxlPVwiZmxleDogMTsgbWluLWhlaWdodDogMDsgYmFja2dyb3VuZDogIzFhMWExYTsgYm9yZGVyLXJhZGl1czogNnB4OyBwYWRkaW5nOiAxMnB4OyBmb250LWZhbWlseTogJ01vbmFjbycsICdNZW5sbycsICdVYnVudHUgTW9ubycsIG1vbm9zcGFjZTsgZm9udC1zaXplOiAwLjc4cmVtOyBvdmVyZmxvdzogYXV0bztcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxvZ3MtbG9hZGluZ1wiIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgdGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiA0MHB4O1wiPlNlbGVjdCBhIGNvbnRhaW5lciB0byB2aWV3IGxvZ3M8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgXG4gICAgICA8ZGl2IGlkPVwiY2wtc3RyZWFtLXN0YXR1c1wiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgcGFkZGluZzogOHB4IDEycHg7IGJhY2tncm91bmQ6IHZhcigtLW9rLWJnLCAjMWEzYTFhKTsgY29sb3I6IHZhcigtLW9rLWZnLCAjNGFkZTgwKTsgYm9yZGVyLXJhZGl1czogNnB4OyBtYXJnaW4tdG9wOiA4cHg7IGZvbnQtc2l6ZTogMC44MnJlbTtcIj5cbiAgICAgICAgPHNwYW4gaWQ9XCJjbC1zdHJlYW0taW5kaWNhdG9yXCI+XHVEODNEXHVERDM0PC9zcGFuPiA8c3BhbiBpZD1cImNsLXN0cmVhbS10ZXh0XCI+RGlzY29ubmVjdGVkPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICBcbiAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWJ1dHRvbnMgbW9kYWwtZm9vdGVyLWJhclwiIHN0eWxlPVwibWFyZ2luLXRvcDogMTJweDsgcGFkZGluZy10b3A6IDEycHg7IGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IGZvbnQtc2l6ZTogMC43OHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5cbiAgICAgICAgICA8c3BhbiBpZD1cImNsLWxpbmUtY291bnRcIj4wIGxpbmVzPC9zcGFuPlxuICAgICAgICAgIDxzcGFuPnw8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gaWQ9XCJjbC1maWx0ZXItY291bnRcIj4wIGZpbHRlcmVkPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImNsLWNsb3NlLWJ0blwiIGNsYXNzPVwiYnRuLXNlY29uZGFyeVwiPkNsb3NlPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YCk7XG5cbiAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udGFpbmVyLWxvZ3MtbW9kYWwnKTtcbiAgY29uc3QgY29udGFpbmVyU2VsZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLWNvbnRhaW5lci1zZWxlY3QnKTtcbiAgY29uc3QgbG9nQ29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1sb2ctY29udGVudCcpO1xuICBjb25zdCBsb2dTZWFyY2ggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtbG9nLXNlYXJjaCcpO1xuICBjb25zdCBsb2dUYWlsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLWxvZy10YWlsJyk7XG4gIGNvbnN0IHJlZnJlc2hCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtcmVmcmVzaCcpO1xuICBjb25zdCBzdHJlYW1CdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtc3RyZWFtJyk7XG4gIGNvbnN0IGRvd25sb2FkQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLWRvd25sb2FkJyk7XG4gIGNvbnN0IGNsZWFyU2VhcmNoQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLWNsZWFyLXNlYXJjaCcpO1xuICBjb25zdCBjbG9zZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1jbG9zZScpO1xuICBjb25zdCBjbG9zZUJ0bjIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtY2xvc2UtYnRuJyk7XG4gIGNvbnN0IHN0cmVhbVN0YXR1cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1zdHJlYW0tc3RhdHVzJyk7XG4gIGNvbnN0IHN0cmVhbUluZGljYXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1zdHJlYW0taW5kaWNhdG9yJyk7XG4gIGNvbnN0IHN0cmVhbVRleHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtc3RyZWFtLXRleHQnKTtcbiAgY29uc3QgbGluZUNvdW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLWxpbmUtY291bnQnKTtcbiAgY29uc3QgZmlsdGVyQ291bnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtZmlsdGVyLWNvdW50Jyk7XG4gIFxuICAvLyBDb250YWluZXIgaW5mbyBlbGVtZW50c1xuICBjb25zdCBpbWFnZUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLWltYWdlJyk7XG4gIGNvbnN0IHN0YXR1c0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLXN0YXR1cycpO1xuICBjb25zdCBjcmVhdGVkRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtY3JlYXRlZCcpO1xuXG4gIGxldCBjdXJyZW50Q29udGFpbmVySWQgPSBudWxsO1xuICBsZXQgY3VycmVudExvZ3MgPSBbXTtcbiAgbGV0IGZpbHRlcmVkTG9ncyA9IFtdO1xuICBsZXQgZXZlbnRTb3VyY2UgPSBudWxsO1xuICBsZXQgaXNTdHJlYW1pbmcgPSBmYWxzZTtcbiAgbGV0IHNlYXJjaFRpbWVvdXQgPSBudWxsO1xuXG4gIC8vIEZvcm1hdCBkYXRlXG4gIGZ1bmN0aW9uIGZvcm1hdERhdGUoZGF0ZVN0cikge1xuICAgIGlmICghZGF0ZVN0cikgcmV0dXJuICctJztcbiAgICBjb25zdCBkID0gbmV3IERhdGUoZGF0ZVN0cik7XG4gICAgaWYgKGlzTmFOKGQuZ2V0VGltZSgpKSkgcmV0dXJuIGRhdGVTdHI7XG4gICAgcmV0dXJuIGQudG9Mb2NhbGVTdHJpbmcoKTtcbiAgfVxuXG4gIC8vIEVzY2FwZSBIVE1MXG4gIGZ1bmN0aW9uIGVzY2FwZUh0bWwoc3RyKSB7XG4gICAgaWYgKCFzdHIpIHJldHVybiAnJztcbiAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBkaXYudGV4dENvbnRlbnQgPSBzdHI7XG4gICAgcmV0dXJuIGRpdi5pbm5lckhUTUw7XG4gIH1cblxuICAvLyBGb3JtYXQgbG9nIGVudHJ5IGZvciBkaXNwbGF5XG4gIGZ1bmN0aW9uIGZvcm1hdExvZ0VudHJ5KGxvZywgaW5kZXgpIHtcbiAgICBjb25zdCBzdHJlYW1DbGFzcyA9IGxvZy5zdHJlYW0gPT09ICdzdGRlcnInID8gJ2xvZy1zdGRlcnInIDogJ2xvZy1zdGRvdXQnO1xuICAgIGNvbnN0IHN0cmVhbUljb24gPSBsb2cuc3RyZWFtID09PSAnc3RkZXJyJyA/ICdcdTI2QTBcdUZFMEYnIDogJ1x1RDgzRFx1RENFNCc7XG4gICAgcmV0dXJuIGBcbiAgICAgIDxkaXYgY2xhc3M9XCJsb2ctZW50cnkgJHtzdHJlYW1DbGFzc31cIiBkYXRhLWluZGV4PVwiJHtpbmRleH1cIiBzdHlsZT1cInBhZGRpbmc6IDRweCA4cHg7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjMzMzOyBkaXNwbGF5OiBmbGV4OyBnYXA6IDhweDtcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJsb2ctbGluZS1udW1cIiBzdHlsZT1cImNvbG9yOiAjNjY2OyBtaW4td2lkdGg6IDQwcHg7IHRleHQtYWxpZ246IHJpZ2h0OyB1c2VyLXNlbGVjdDogbm9uZTtcIj4ke2luZGV4ICsgMX08L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibG9nLXN0cmVhbS1pY29uXCIgc3R5bGU9XCJjb2xvcjogJHtsb2cuc3RyZWFtID09PSAnc3RkZXJyJyA/ICcjZjU5ZTBiJyA6ICcjMjJjNTVlJ307XCI+JHtzdHJlYW1JY29ufTwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJsb2ctdGV4dFwiIHN0eWxlPVwiZmxleDogMTsgd2hpdGUtc3BhY2U6IHByZS13cmFwOyB3b3JkLWJyZWFrOiBicmVhay1hbGw7IGNvbG9yOiAjZTVlNWU1O1wiPiR7ZXNjYXBlSHRtbChsb2cudGV4dCl9PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgYDtcbiAgfVxuXG4gIC8vIFJlbmRlciBsb2dzIHRvIHRoZSBjb250ZW50IGFyZWFcbiAgZnVuY3Rpb24gcmVuZGVyTG9ncyhsb2dzLCBzZWFyY2hUZXJtID0gJycpIHtcbiAgICBpZiAoIWxvZ3MgfHwgbG9ncy5sZW5ndGggPT09IDApIHtcbiAgICAgIGxvZ0NvbnRlbnQuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJsb2dzLWxvYWRpbmdcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IHRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogNDBweDtcIj5ObyBsb2dzIGF2YWlsYWJsZTwvZGl2Pic7XG4gICAgICBsaW5lQ291bnQudGV4dENvbnRlbnQgPSAnMCBsaW5lcyc7XG4gICAgICBmaWx0ZXJDb3VudC50ZXh0Q29udGVudCA9ICcwIGZpbHRlcmVkJztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjdXJyZW50TG9ncyA9IGxvZ3M7XG4gICAgZmlsdGVyZWRMb2dzID0gc2VhcmNoVGVybSA/IGxvZ3MuZmlsdGVyKGxvZyA9PiBcbiAgICAgIGxvZy50ZXh0ICYmIGxvZy50ZXh0LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoVGVybS50b0xvd2VyQ2FzZSgpKVxuICAgICkgOiBsb2dzO1xuXG4gICAgbGluZUNvdW50LnRleHRDb250ZW50ID0gYCR7bG9ncy5sZW5ndGh9IGxpbmVzYDtcbiAgICBmaWx0ZXJDb3VudC50ZXh0Q29udGVudCA9IHNlYXJjaFRlcm0gPyBgJHtmaWx0ZXJlZExvZ3MubGVuZ3RofSBvZiAke2xvZ3MubGVuZ3RofSBzaG93bmAgOiBgJHtsb2dzLmxlbmd0aH0gc2hvd25gO1xuXG4gICAgaWYgKGZpbHRlcmVkTG9ncy5sZW5ndGggPT09IDApIHtcbiAgICAgIGxvZ0NvbnRlbnQuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJsb2dzLWxvYWRpbmdcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IHRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogNDBweDtcIj5ObyBsb2dzIG1hdGNoIFwiJHtlc2NhcGVIdG1sKHNlYXJjaFRlcm0pfVwiPC9kaXY+YDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsb2dDb250ZW50LmlubmVySFRNTCA9IGZpbHRlcmVkTG9ncy5tYXAoKGxvZywgaSkgPT4gZm9ybWF0TG9nRW50cnkobG9nLCBpKSkuam9pbignJyk7XG4gICAgXG4gICAgLy8gU2Nyb2xsIHRvIGJvdHRvbVxuICAgIGxvZ0NvbnRlbnQuc2Nyb2xsVG9wID0gbG9nQ29udGVudC5zY3JvbGxIZWlnaHQ7XG4gIH1cblxuICAvLyBMb2FkIGNvbnRhaW5lciBsaXN0XG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRDb250YWluZXJzKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgZ2V0SlNPTignL2FwaS92MS9sb2dzL2NvbnRhaW5lcnMnKTtcbiAgICAgIGNvbnN0IGNvbnRhaW5lcnMgPSBkYXRhLmNvbnRhaW5lcnMgfHwgW107XG4gICAgICBcbiAgICAgIC8vIFN0b3JlIGN1cnJlbnQgc2VsZWN0aW9uXG4gICAgICBjb25zdCBjdXJyZW50VmFsID0gY29udGFpbmVyU2VsZWN0LnZhbHVlO1xuICAgICAgXG4gICAgICBjb250YWluZXJTZWxlY3QuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9XCJcIj5TZWxlY3QgYSBjb250YWluZXIuLi48L29wdGlvbj4nO1xuICAgICAgXG4gICAgICBjb250YWluZXJzLmZvckVhY2goYyA9PiB7XG4gICAgICAgIGNvbnN0IG9wdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpO1xuICAgICAgICBvcHRpb24udmFsdWUgPSBjLmlkO1xuICAgICAgICBvcHRpb24udGV4dENvbnRlbnQgPSBgJHtjLm5hbWV9ICgke2MuaW1hZ2Uuc3BsaXQoJzonKVswXX0pIC0gJHtjLnN0YXR1c31gO1xuICAgICAgICBvcHRpb24uZGF0YXNldC5uYW1lID0gYy5uYW1lO1xuICAgICAgICBvcHRpb24uZGF0YXNldC5pbWFnZSA9IGMuaW1hZ2U7XG4gICAgICAgIG9wdGlvbi5kYXRhc2V0LnN0YXR1cyA9IGMuc3RhdHVzO1xuICAgICAgICBvcHRpb24uZGF0YXNldC5jcmVhdGVkID0gYy5jcmVhdGVkO1xuICAgICAgICBjb250YWluZXJTZWxlY3QuYXBwZW5kQ2hpbGQob3B0aW9uKTtcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICAvLyBSZXN0b3JlIHNlbGVjdGlvbiBpZiBzdGlsbCB2YWxpZFxuICAgICAgaWYgKGN1cnJlbnRWYWwgJiYgY29udGFpbmVyU2VsZWN0LnF1ZXJ5U2VsZWN0b3IoYG9wdGlvblt2YWx1ZT1cIiR7Y3VycmVudFZhbH1cIl1gKSkge1xuICAgICAgICBjb250YWluZXJTZWxlY3QudmFsdWUgPSBjdXJyZW50VmFsO1xuICAgICAgICBsb2FkQ29udGFpbmVySW5mbyhjdXJyZW50VmFsKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBsb2FkIGNvbnRhaW5lcnM6JywgZXJyKTtcbiAgICB9XG4gIH1cblxuICAvLyBMb2FkIGNvbnRhaW5lciBpbmZvXG4gIGZ1bmN0aW9uIGxvYWRDb250YWluZXJJbmZvKGNvbnRhaW5lcklkKSB7XG4gICAgY29uc3Qgb3B0aW9uID0gY29udGFpbmVyU2VsZWN0LnF1ZXJ5U2VsZWN0b3IoYG9wdGlvblt2YWx1ZT1cIiR7Y29udGFpbmVySWR9XCJdYCk7XG4gICAgaWYgKG9wdGlvbikge1xuICAgICAgaW1hZ2VFbC50ZXh0Q29udGVudCA9IG9wdGlvbi5kYXRhc2V0LmltYWdlIHx8ICctJztcbiAgICAgIHN0YXR1c0VsLnRleHRDb250ZW50ID0gb3B0aW9uLmRhdGFzZXQuc3RhdHVzIHx8ICctJztcbiAgICAgIHN0YXR1c0VsLnN0eWxlLmNvbG9yID0gb3B0aW9uLmRhdGFzZXQuc3RhdHVzID09PSAncnVubmluZycgPyAndmFyKC0tb2stZmcsICM0YWRlODApJyA6ICd2YXIoLS1iYWQtZmcsICNlZjQ0NDQpJztcbiAgICAgIGNyZWF0ZWRFbC50ZXh0Q29udGVudCA9IGZvcm1hdERhdGUob3B0aW9uLmRhdGFzZXQuY3JlYXRlZCk7XG4gICAgfVxuICB9XG5cbiAgLy8gTG9hZCBsb2dzIGZvciBzZWxlY3RlZCBjb250YWluZXJcbiAgYXN5bmMgZnVuY3Rpb24gbG9hZExvZ3MoKSB7XG4gICAgY29uc3QgY29udGFpbmVySWQgPSBjb250YWluZXJTZWxlY3QudmFsdWU7XG4gICAgaWYgKCFjb250YWluZXJJZCkge1xuICAgICAgbG9nQ29udGVudC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImxvZ3MtbG9hZGluZ1wiIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgdGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiA0MHB4O1wiPlNlbGVjdCBhIGNvbnRhaW5lciB0byB2aWV3IGxvZ3M8L2Rpdj4nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFN0b3AgYW55IGV4aXN0aW5nIHN0cmVhbVxuICAgIHN0b3BTdHJlYW0oKTtcblxuICAgIGN1cnJlbnRDb250YWluZXJJZCA9IGNvbnRhaW5lcklkO1xuICAgIGxvYWRDb250YWluZXJJbmZvKGNvbnRhaW5lcklkKTtcblxuICAgIGNvbnN0IHRhaWwgPSBsb2dUYWlsLnZhbHVlO1xuICAgIGNvbnN0IHNlYXJjaFRlcm0gPSBsb2dTZWFyY2gudmFsdWUudHJpbSgpO1xuXG4gICAgbG9nQ29udGVudC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImxvZ3MtbG9hZGluZ1wiIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgdGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiA0MHB4O1wiPkxvYWRpbmcgbG9ncy4uLjwvZGl2Pic7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgdXJsID0gYC9hcGkvdjEvbG9ncy9jb250YWluZXIvJHtjb250YWluZXJJZH0ke3RhaWwgIT09ICdhbGwnID8gYD90YWlsPSR7dGFpbH1gIDogJyd9YDtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBnZXRKU09OKHVybCk7XG5cbiAgICAgIGlmIChkYXRhLmxvZ3MgJiYgZGF0YS5sb2dzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVuZGVyTG9ncyhkYXRhLmxvZ3MsIHNlYXJjaFRlcm0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nQ29udGVudC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImxvZ3MtbG9hZGluZ1wiIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgdGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiA0MHB4O1wiPk5vIGxvZ3MgZm91bmQgZm9yIHRoaXMgY29udGFpbmVyPC9kaXY+JztcbiAgICAgICAgbGluZUNvdW50LnRleHRDb250ZW50ID0gJzAgbGluZXMnO1xuICAgICAgICBmaWx0ZXJDb3VudC50ZXh0Q29udGVudCA9ICcwIGZpbHRlcmVkJztcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZ0NvbnRlbnQuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJsb2dzLWxvYWRpbmdcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcsICNlZjQ0NDQpOyB0ZXh0LWFsaWduOiBjZW50ZXI7IHBhZGRpbmc6IDQwcHg7XCI+RXJyb3IgbG9hZGluZyBsb2dzOiAke2VzY2FwZUh0bWwoZXJyLm1lc3NhZ2UpfTwvZGl2PmA7XG4gICAgfVxuICB9XG5cbiAgLy8gU3RhcnQgc3RyZWFtaW5nIGxvZ3NcbiAgZnVuY3Rpb24gc3RhcnRTdHJlYW0oKSB7XG4gICAgY29uc3QgY29udGFpbmVySWQgPSBjb250YWluZXJTZWxlY3QudmFsdWU7XG4gICAgaWYgKCFjb250YWluZXJJZCkgcmV0dXJuO1xuXG4gICAgLy8gU3RvcCBhbnkgZXhpc3Rpbmcgc3RyZWFtXG4gICAgc3RvcFN0cmVhbSgpO1xuXG4gICAgaXNTdHJlYW1pbmcgPSB0cnVlO1xuICAgIHN0cmVhbUJ0bi50ZXh0Q29udGVudCA9ICdcdTIzRjkgU3RvcCc7XG4gICAgc3RyZWFtU3RhdHVzLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gICAgc3RyZWFtSW5kaWNhdG9yLnRleHRDb250ZW50ID0gJ1x1RDgzRFx1REZFMic7XG4gICAgc3RyZWFtVGV4dC50ZXh0Q29udGVudCA9ICdDb25uZWN0aW5nLi4uJztcblxuICAgIGNvbnN0IHVybCA9IGAvYXBpL3YxL2xvZ3Mvc3RyZWFtLyR7Y29udGFpbmVySWR9YDtcbiAgICBldmVudFNvdXJjZSA9IG5ldyBFdmVudFNvdXJjZSh1cmwpO1xuXG4gICAgZXZlbnRTb3VyY2Uub25vcGVuID0gKCkgPT4ge1xuICAgICAgc3RyZWFtSW5kaWNhdG9yLnRleHRDb250ZW50ID0gJ1x1RDgzRFx1REZFMic7XG4gICAgICBzdHJlYW1UZXh0LnRleHRDb250ZW50ID0gJ0Nvbm5lY3RlZCAtIHN0cmVhbWluZyBsb2dzJztcbiAgICB9O1xuXG4gICAgZXZlbnRTb3VyY2Uub25tZXNzYWdlID0gKGV2ZW50KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBsb2cgPSBKU09OLnBhcnNlKGV2ZW50LmRhdGEpO1xuICAgICAgICBcbiAgICAgICAgaWYgKGxvZy5lcnJvcikge1xuICAgICAgICAgIHN0cmVhbUluZGljYXRvci50ZXh0Q29udGVudCA9ICdcdUQ4M0RcdUREMzQnO1xuICAgICAgICAgIHN0cmVhbVRleHQudGV4dENvbnRlbnQgPSBgRXJyb3I6ICR7bG9nLmVycm9yfWA7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRkIHRvIGN1cnJlbnQgbG9nc1xuICAgICAgICBjdXJyZW50TG9ncy5wdXNoKGxvZyk7XG4gICAgICAgIGZpbHRlcmVkTG9ncy5wdXNoKGxvZyk7XG4gICAgICAgIFxuICAgICAgICAvLyBVcGRhdGUgY291bnRzXG4gICAgICAgIGxpbmVDb3VudC50ZXh0Q29udGVudCA9IGAke2N1cnJlbnRMb2dzLmxlbmd0aH0gbGluZXNgO1xuICAgICAgICBmaWx0ZXJDb3VudC50ZXh0Q29udGVudCA9IGAke2ZpbHRlcmVkTG9ncy5sZW5ndGh9IHNob3duYDtcbiAgICAgICAgXG4gICAgICAgIC8vIEFwcGVuZCBuZXcgbG9nIGVudHJ5XG4gICAgICAgIGNvbnN0IHNlYXJjaFRlcm0gPSBsb2dTZWFyY2gudmFsdWUudHJpbSgpO1xuICAgICAgICBpZiAoIXNlYXJjaFRlcm0gfHwgKGxvZy50ZXh0ICYmIGxvZy50ZXh0LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoVGVybS50b0xvd2VyQ2FzZSgpKSkpIHtcbiAgICAgICAgICBjb25zdCBlbnRyeSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgIGVudHJ5LmlubmVySFRNTCA9IGZvcm1hdExvZ0VudHJ5KGxvZywgZmlsdGVyZWRMb2dzLmxlbmd0aCAtIDEpO1xuICAgICAgICAgIGNvbnN0IGVudHJ5RGl2ID0gZW50cnkuZmlyc3RFbGVtZW50Q2hpbGQ7XG4gICAgICAgICAgZW50cnlEaXYuc3R5bGUuYmFja2dyb3VuZCA9ICcjMWEzYTFhJztcbiAgICAgICAgICBsb2dDb250ZW50LmFwcGVuZENoaWxkKGVudHJ5RGl2KTtcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBBdXRvLXNjcm9sbCB0byBib3R0b21cbiAgICAgICAgICBsb2dDb250ZW50LnNjcm9sbFRvcCA9IGxvZ0NvbnRlbnQuc2Nyb2xsSGVpZ2h0O1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHBhcnNpbmcgbG9nOicsIGUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBldmVudFNvdXJjZS5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgc3RyZWFtSW5kaWNhdG9yLnRleHRDb250ZW50ID0gJ1x1RDgzRFx1REQzNCc7XG4gICAgICBzdHJlYW1UZXh0LnRleHRDb250ZW50ID0gJ0Rpc2Nvbm5lY3RlZCc7XG4gICAgICBpc1N0cmVhbWluZyA9IGZhbHNlO1xuICAgICAgc3RyZWFtQnRuLnRleHRDb250ZW50ID0gJ1x1MjVCNiBTdHJlYW0nO1xuICAgIH07XG5cbiAgICAvLyBTdG9yZSB0aGUgRXZlbnRTb3VyY2UgZm9yIGNsZWFudXBcbiAgICBtb2RhbC5fZXZlbnRTb3VyY2UgPSBldmVudFNvdXJjZTtcbiAgfVxuXG4gIC8vIFN0b3Agc3RyZWFtaW5nIGxvZ3NcbiAgZnVuY3Rpb24gc3RvcFN0cmVhbSgpIHtcbiAgICBpZiAoZXZlbnRTb3VyY2UpIHtcbiAgICAgIGV2ZW50U291cmNlLmNsb3NlKCk7XG4gICAgICBldmVudFNvdXJjZSA9IG51bGw7XG4gICAgfVxuICAgIGlmIChtb2RhbC5fZXZlbnRTb3VyY2UpIHtcbiAgICAgIG1vZGFsLl9ldmVudFNvdXJjZS5jbG9zZSgpO1xuICAgICAgbW9kYWwuX2V2ZW50U291cmNlID0gbnVsbDtcbiAgICB9XG4gICAgaXNTdHJlYW1pbmcgPSBmYWxzZTtcbiAgICBzdHJlYW1CdG4udGV4dENvbnRlbnQgPSAnXHUyNUI2IFN0cmVhbSc7XG4gICAgc3RyZWFtU3RhdHVzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIH1cblxuICAvLyBEb3dubG9hZCBsb2dzIGFzIGZpbGVcbiAgZnVuY3Rpb24gZG93bmxvYWRMb2dzKCkge1xuICAgIGlmICghY3VycmVudExvZ3MgfHwgY3VycmVudExvZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdObyBsb2dzIHRvIGRvd25sb2FkJywgJ2Vycm9yJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29udGFpbmVyTmFtZSA9IGNvbnRhaW5lclNlbGVjdC5xdWVyeVNlbGVjdG9yKGBvcHRpb25bdmFsdWU9XCIke2N1cnJlbnRDb250YWluZXJJZH1cIl1gKT8uZGF0YXNldC5uYW1lIHx8IGN1cnJlbnRDb250YWluZXJJZDtcbiAgICBjb25zdCB0aW1lc3RhbXAgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkucmVwbGFjZSgvWzouXS9nLCAnLScpO1xuICAgIGNvbnN0IGZpbGVuYW1lID0gYCR7Y29udGFpbmVyTmFtZX0tbG9ncy0ke3RpbWVzdGFtcH0udHh0YDtcblxuICAgIGNvbnN0IGNvbnRlbnQgPSBjdXJyZW50TG9ncy5tYXAobG9nID0+IHtcbiAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IGxvZy50aW1lc3RhbXAgfHwgJyc7XG4gICAgICBjb25zdCBzdHJlYW0gPSBsb2cuc3RyZWFtID09PSAnc3RkZXJyJyA/ICdbRVJSXScgOiAnW09VVF0nO1xuICAgICAgcmV0dXJuIGAke3RpbWVzdGFtcCA/IHRpbWVzdGFtcCArICcgJyA6ICcnfSR7c3RyZWFtfSAke2xvZy50ZXh0fWA7XG4gICAgfSkuam9pbignXFxuJyk7XG5cbiAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2NvbnRlbnRdLCB7IHR5cGU6ICd0ZXh0L3BsYWluJyB9KTtcbiAgICBjb25zdCB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgYS5ocmVmID0gdXJsO1xuICAgIGEuZG93bmxvYWQgPSBmaWxlbmFtZTtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpO1xuICAgIGEuY2xpY2soKTtcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpO1xuICAgIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKTtcblxuICAgIHNob3dOb3RpZmljYXRpb24oYERvd25sb2FkZWQgJHtjdXJyZW50TG9ncy5sZW5ndGh9IGxvZyBsaW5lc2AsICdzdWNjZXNzJyk7XG4gIH1cblxuICAvLyBFdmVudCBsaXN0ZW5lcnNcbiAgY29udGFpbmVyU2VsZWN0Py5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgbG9hZExvZ3MoKTtcbiAgfSk7XG5cbiAgbG9nVGFpbD8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4ge1xuICAgIGxvYWRMb2dzKCk7XG4gIH0pO1xuXG4gIHJlZnJlc2hCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGxvYWRMb2dzKCk7XG4gIH0pO1xuXG4gIHN0cmVhbUJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgaWYgKGlzU3RyZWFtaW5nKSB7XG4gICAgICBzdG9wU3RyZWFtKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXJ0U3RyZWFtKCk7XG4gICAgfVxuICB9KTtcblxuICBkb3dubG9hZEJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgZG93bmxvYWRMb2dzKCk7XG4gIH0pO1xuXG4gIGNsZWFyU2VhcmNoQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBsb2dTZWFyY2gudmFsdWUgPSAnJztcbiAgICByZW5kZXJMb2dzKGN1cnJlbnRMb2dzLCAnJyk7XG4gIH0pO1xuXG4gIGxvZ1NlYXJjaD8uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XG4gICAgLy8gRGVib3VuY2Ugc2VhcmNoXG4gICAgY2xlYXJUaW1lb3V0KHNlYXJjaFRpbWVvdXQpO1xuICAgIHNlYXJjaFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHJlbmRlckxvZ3MoY3VycmVudExvZ3MsIGxvZ1NlYXJjaC52YWx1ZS50cmltKCkpO1xuICAgIH0sIDMwMCk7XG4gIH0pO1xuXG4gIGxvZ1NlYXJjaD8uYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChlKSA9PiB7XG4gICAgaWYgKGUua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgbG9nU2VhcmNoLnZhbHVlID0gJyc7XG4gICAgICByZW5kZXJMb2dzKGN1cnJlbnRMb2dzLCAnJyk7XG4gICAgfVxuICB9KTtcblxuICAvLyBPcGVuIG1vZGFsXG4gIGNvbnN0IG9wZW5CdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndmlldy1jb250YWluZXItbG9ncycpO1xuICBvcGVuQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBtb2RhbC5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG4gICAgbG9hZENvbnRhaW5lcnMoKTtcbiAgfSk7XG5cbiAgLy8gQ2xvc2UgbW9kYWwgaGFuZGxlcnNcbiAgZnVuY3Rpb24gY2xvc2VNb2RhbCgpIHtcbiAgICBzdG9wU3RyZWFtKCk7XG4gICAgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICB9XG5cbiAgY2xvc2VCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xvc2VNb2RhbCk7XG4gIGNsb3NlQnRuMj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjbG9zZU1vZGFsKTtcblxuICAvLyBDbG9zZSBvbiBlc2NhcGUga2V5XG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4ge1xuICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScgJiYgbW9kYWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdzaG93JykpIHtcbiAgICAgIGNsb3NlTW9kYWwoKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIFdpcmUgYmFja2Ryb3AgY2xpY2sgdG8gY2xvc2VNb2RhbCBzbyB0aGUgbG9nIHN0cmVhbSBzdG9wcyB0b28uXG4gIC8vIChDYW4ndCB1c2Ugd2lyZU1vZGFsIGhlcmUgXHUyMDE0IGl0IG9ubHkgZG9lcyBtb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93JylcbiAgLy8gb24gYmFja2Ryb3AgY2xpY2ssIHdoaWNoIHdvdWxkIGxlYWsgdGhlIFNTRS9zdHJlYW0gY29ubmVjdGlvbi4pXG4gIG1vZGFsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHsgaWYgKGUudGFyZ2V0ID09PSBtb2RhbCkgY2xvc2VNb2RhbCgpOyB9KTtcblxuICAvLyBFeHBvc2UgZm9yIHVzZSBieSBzZXJ2aWNlIGNhcmQgYnV0dG9ucyAoZ3JpZC5qcyBjYWxscyBvcGVuQ29udGFpbmVyTG9nc01vZGFsKVxuICB3aW5kb3cub3BlbkNvbnRhaW5lckxvZ3NNb2RhbCA9IGZ1bmN0aW9uKGNvbnRhaW5lcklkLCBjb250YWluZXJOYW1lKSB7XG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICAgIGxvYWRDb250YWluZXJzKCkudGhlbigoKSA9PiB7XG4gICAgICAvLyBUcnkgdG8gZmluZCBhbmQgc2VsZWN0IHRoZSBjb250YWluZXJcbiAgICAgIGNvbnN0IG9wdGlvbiA9IEFycmF5LmZyb20oY29udGFpbmVyU2VsZWN0Lm9wdGlvbnMpLmZpbmQob3B0ID0+IFxuICAgICAgICBvcHQudmFsdWUgPT09IGNvbnRhaW5lcklkIHx8IG9wdC5kYXRhc2V0Lm5hbWUgPT09IGNvbnRhaW5lck5hbWVcbiAgICAgICk7XG4gICAgICBpZiAob3B0aW9uKSB7XG4gICAgICAgIGNvbnRhaW5lclNlbGVjdC52YWx1ZSA9IG9wdGlvbi52YWx1ZTtcbiAgICAgICAgbG9hZENvbnRhaW5lckluZm8ob3B0aW9uLnZhbHVlKTtcbiAgICAgICAgbG9hZExvZ3MoKTtcbiAgICAgIH0gZWxzZSBpZiAoY29udGFpbmVySWQpIHtcbiAgICAgICAgLy8gSWYgY29udGFpbmVyIG5vdCBmb3VuZCBpbiBsaXN0IGJ1dCB3ZSBoYXZlIGFuIElELCB0cnkgbG9hZGluZyBkaXJlY3RseVxuICAgICAgICBjdXJyZW50Q29udGFpbmVySWQgPSBjb250YWluZXJJZDtcbiAgICAgICAgaW1hZ2VFbC50ZXh0Q29udGVudCA9IGNvbnRhaW5lck5hbWUgfHwgY29udGFpbmVySWQ7XG4gICAgICAgIHN0YXR1c0VsLnRleHRDb250ZW50ID0gJy0nO1xuICAgICAgICBjcmVhdGVkRWwudGV4dENvbnRlbnQgPSAnLSc7XG4gICAgICAgIGxvYWRMb2dzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBObyBjb250YWluZXIgSUQsIGp1c3Qgc2hvdyBtb2RhbCB3aXRoIGNvbnRhaW5lciBsaXN0XG4gICAgICAgIGxvZ0NvbnRlbnQuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJsb2dzLWxvYWRpbmdcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IHRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogNDBweDtcIj5TZWxlY3QgYSBjb250YWluZXIgdG8gdmlldyBsb2dzPC9kaXY+JztcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbn0pKCk7XG47XG4vLyA9PT09PT09PT09IERDLTA1NTogSE9TVCBKT1VSTkFMRCBMT0cgVklFV0VSID09PT09PT09PT1cbi8vIFN0cmVhbXMgaG9zdCBzZXJ2aWNlIGxvZ3MgKGNhZGR5LCBkYXNoY2FkZHktYXBpLCBkb2NrZXIsIHNzaCwgXHUyMDI2KSB2aWEgdGhlXG4vLyBqb3VybmFsY3RsIGJpbmQtbW91bnQgYWRkZWQgaW4gc3RhcnQuc2guIFNlcnZlci1TZW50IEV2ZW50cyBmb3IgbGl2ZVxuLy8gdGFpbGluZzsgYm91bmRlZCBub24tc3RyZWFtaW5nIHJlYWQgZm9yIGhpc3RvcmljYWwgdmlld3MuXG4oZnVuY3Rpb24oKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICAvLyBBbGxvdy1saXN0IG1pcnJvcnMgdGhlIGJhY2tlbmQncyBBTExPV0VEX1VOSVRTIHNvIHRoZSBkcm9wZG93biBzdGF5c1xuICAvLyBob25lc3Qgd2hlbiB0aGUgYmluZC1tb3VudCBpc24ndCBhdmFpbGFibGUuIFRoZSBzZXJ2ZXIgaXMgc3RpbGwgdGhlXG4gIC8vIHNvdXJjZSBvZiB0cnV0aCBcdTIwMTQgYW55dGhpbmcgbm90IGluIGl0cyBhbGxvdy1saXN0IHJldHVybnMgNDAwLlxuICBjb25zdCBVTklUX1BSRVNFVFMgPSBbXG4gICAgeyB1bml0OiAnY2FkZHknLCAgICAgICAgICBsYWJlbDogJ0NhZGR5IChyZXZlcnNlIHByb3h5KScgfSxcbiAgICB7IHVuaXQ6ICdkYXNoY2FkZHktYXBpJywgIGxhYmVsOiAnRGFzaENhZGR5IEFQSSAoaG9zdCBzeXN0ZW1kIHVuaXQsIG5vdCB0aGlzIGNvbnRhaW5lciknIH0sXG4gICAgeyB1bml0OiAnZG9ja2VyJywgICAgICAgICBsYWJlbDogJ0RvY2tlciBkYWVtb24nIH0sXG4gICAgeyB1bml0OiAnc3NoJywgICAgICAgICAgICBsYWJlbDogJ1NTSCBzZXJ2ZXInIH0sXG4gICAgeyB1bml0OiAnc3lzdGVtZC1qb3VybmFsZCcsIGxhYmVsOiAnc3lzdGVtZC1qb3VybmFsZCcgfSxcbiAgICB7IHVuaXQ6ICd0YWlsc2NhbGVkJywgICAgIGxhYmVsOiAnVGFpbHNjYWxlJyB9LFxuICAgIHsgdW5pdDogJ25ldHdvcmtkLWRpc3BhdGNoZXInLCBsYWJlbDogJ05ldHdvcmtkIGRpc3BhdGNoZXInIH0sXG4gIF07XG5cbiAgaW5qZWN0TW9kYWwoJ2pvdXJuYWxkLW1vZGFsJywgYFxuICAgIDxkaXYgaWQ9XCJqb3VybmFsZC1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiIHN0eWxlPVwiei1pbmRleDogMTAwMjtcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogOTAwcHg7IG1heC13aWR0aDogOTV2dzsgaGVpZ2h0OiA4MHZoOyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibG9ncy1oZWFkZXJcIiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsgYWxpZ24taXRlbXM6IGNlbnRlcjsgcGFkZGluZy1ib3R0b206IDEycHg7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBtYXJnaW4tYm90dG9tOiAxMnB4O1wiPlxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8aDMgc3R5bGU9XCJtYXJnaW46IDA7XCI+XHVEODNEXHVERUYwXHVGRTBGIEhvc3QgTG9ncyAoam91cm5hbGQpPC9oMz5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwibW9kYWwtc3VidGl0bGVcIiBzdHlsZT1cIm1hcmdpbjogNHB4IDAgMCAwOyBmb250LXNpemU6IDAuODVyZW07IG9wYWNpdHk6IDAuNztcIj5cbiAgICAgICAgICAgICAgU3RyZWFtIGhvc3Qgc2VydmljZSBsb2dzIGZyb20gPGNvZGU+am91cm5hbGN0bDwvY29kZT4gKHJlYWQtb25seSBtb3VudCkuIERvY2tlciBjb250YWluZXIgbG9ncyBhcmUgc3RpbGwgaW4gdGhlIDxlbT5Db250YWluZXIgTG9nczwvZW0+IG1vZGFsLlxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2dzLWNvbnRyb2xzXCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDhweDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZmxleC13cmFwOiB3cmFwOyBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1wiPlxuICAgICAgICAgICAgPHNlbGVjdCBpZD1cImpkLXVuaXQtc2VsZWN0XCIgc3R5bGU9XCJwYWRkaW5nOiA2cHggMTBweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7IG1pbi13aWR0aDogMjIwcHg7XCI+PC9zZWxlY3Q+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImpkLXNlYXJjaFwiIHBsYWNlaG9sZGVyPVwiU2VhcmNoIGxvZ3MuLi5cIiBzdHlsZT1cInBhZGRpbmc6IDZweCAxMHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgd2lkdGg6IDE2MHB4O1wiIC8+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiamQtdGFpbFwiIG1pbj1cIjFcIiBtYXg9XCI1MDAwXCIgdmFsdWU9XCIyMDBcIiB0aXRsZT1cIkxpbmVzIHRvIGxvYWQgKGhpc3RvcmljYWwgdmlldylcIiBzdHlsZT1cInBhZGRpbmc6IDZweCAxMHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgd2lkdGg6IDkwcHg7XCIgLz5cbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJqZC1yZWZyZXNoXCIgY2xhc3M9XCJidG4tYWNjZW50LXNvbGlkXCIgc3R5bGU9XCJwYWRkaW5nOiA2cHggMTRweDsgZm9udC1zaXplOiAwLjg1cmVtO1wiPlx1RDgzRFx1REQwNCBMb2FkIHRhaWw8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJqZC1zdHJlYW1cIiBjbGFzcz1cImJ0bi1hY2NlbnQtc29saWRcIiBzdHlsZT1cInBhZGRpbmc6IDZweCAxNHB4OyBmb250LXNpemU6IDAuODVyZW07XCI+XHUyNUI2IFN0cmVhbTwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImpkLWNsZWFyLXNlYXJjaFwiIHN0eWxlPVwicGFkZGluZzogNnB4IDEwcHg7IGZvbnQtc2l6ZTogMC44NXJlbTtcIiB0aXRsZT1cIkNsZWFyIHNlYXJjaFwiPlx1MjcxNTwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImpkLWNsb3NlXCIgY2xhc3M9XCJjbG9zZS1idG5cIiBzdHlsZT1cInBhZGRpbmc6IDZweCAxMHB4O1wiPlx1MjcxNTwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGlkPVwiamQtbWV0YVwiIHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiAxNnB4OyBtYXJnaW4tYm90dG9tOiAxMnB4OyBwYWRkaW5nOiA4cHggMTJweDsgYmFja2dyb3VuZDogdmFyKC0tYmctc2Vjb25kYXJ5LCB2YXIoLS1iZykpOyBib3JkZXItcmFkaXVzOiA2cHg7IGZvbnQtc2l6ZTogMC44MnJlbTsgZmxleC13cmFwOiB3cmFwO1wiPlxuICAgICAgICAgIDxzcGFuPjxzdHJvbmc+U291cmNlOjwvc3Ryb25nPiA8c3BhbiBpZD1cImpkLXNvdXJjZVwiPmpvdXJuYWxkPC9zcGFuPjwvc3Bhbj5cbiAgICAgICAgICA8c3Bhbj48c3Ryb25nPlVuaXQ6PC9zdHJvbmc+IDxzcGFuIGlkPVwiamQtdW5pdC1kaXNwbGF5XCI+LTwvc3Bhbj48L3NwYW4+XG4gICAgICAgICAgPHNwYW4+PHN0cm9uZz5TdHJlYW06PC9zdHJvbmc+IDxzcGFuIGlkPVwiamQtc3RyZWFtLXN0YXRlXCI+ZGlzY29ubmVjdGVkPC9zcGFuPjwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBpZD1cImpkLWNvbnRlbnRcIiBjbGFzcz1cImxvZ3MtY29udGVudCBzY3JvbGwtY29udGFpbmVyXCIgc3R5bGU9XCJmbGV4OiAxOyBtaW4taGVpZ2h0OiAwOyBiYWNrZ3JvdW5kOiAjMWExYTFhOyBib3JkZXItcmFkaXVzOiA2cHg7IHBhZGRpbmc6IDEycHg7IGZvbnQtZmFtaWx5OiAnTW9uYWNvJywgJ01lbmxvJywgJ1VidW50dSBNb25vJywgbW9ub3NwYWNlOyBmb250LXNpemU6IDAuNzhyZW07IG92ZXJmbG93OiBhdXRvO1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2dzLWxvYWRpbmdcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IHRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogNDBweDtcIj5TZWxlY3QgYSB1bml0IGFuZCBjbGljayA8ZW0+TG9hZCB0YWlsPC9lbT4gb3IgPGVtPlN0cmVhbTwvZW0+LjwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zIG1vZGFsLWZvb3Rlci1iYXJcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDEycHg7IHBhZGRpbmctdG9wOiAxMnB4OyBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IGZvbnQtc2l6ZTogMC43OHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5cbiAgICAgICAgICAgIDxzcGFuIGlkPVwiamQtbGluZS1jb3VudFwiPjAgbGluZXM8L3NwYW4+XG4gICAgICAgICAgICA8c3Bhbj58PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gaWQ9XCJqZC1maWx0ZXItY291bnRcIj4wIHNob3duPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4+fDwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGlkPVwiamQtb3ZlcmZsb3dcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IGNvbG9yOiB2YXIoLS13YXJuLWZnLCAjZmJiZjI0KTtcIj5cdTI2QTAgc3RyZWFtIG92ZXJmbG93IFx1MjAxNCByZS1sb2FkIHdpdGggbmFycm93ZXIgd2luZG93PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJqZC1jbG9zZS1idG5cIiBjbGFzcz1cImJ0bi1zZWNvbmRhcnlcIj5DbG9zZTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgKTtcblxuICBjb25zdCBtb2RhbCAgICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnam91cm5hbGQtbW9kYWwnKTtcbiAgY29uc3QgdW5pdFNlbGVjdCAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pkLXVuaXQtc2VsZWN0Jyk7XG4gIGNvbnN0IHNlYXJjaElucHV0ICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqZC1zZWFyY2gnKTtcbiAgY29uc3QgdGFpbElucHV0ICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pkLXRhaWwnKTtcbiAgY29uc3QgcmVmcmVzaEJ0biAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pkLXJlZnJlc2gnKTtcbiAgY29uc3Qgc3RyZWFtQnRuICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pkLXN0cmVhbScpO1xuICBjb25zdCBjbGVhclNlYXJjaCAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnamQtY2xlYXItc2VhcmNoJyk7XG4gIGNvbnN0IGNsb3NlQnRuICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqZC1jbG9zZScpO1xuICBjb25zdCBjbG9zZUJ0bjIgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnamQtY2xvc2UtYnRuJyk7XG4gIGNvbnN0IGNvbnRlbnQgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqZC1jb250ZW50Jyk7XG4gIGNvbnN0IGxpbmVDb3VudCAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqZC1saW5lLWNvdW50Jyk7XG4gIGNvbnN0IGZpbHRlckNvdW50ICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqZC1maWx0ZXItY291bnQnKTtcbiAgY29uc3Qgb3ZlcmZsb3dIaW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pkLW92ZXJmbG93Jyk7XG4gIGNvbnN0IHVuaXREaXNwbGF5ICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqZC11bml0LWRpc3BsYXknKTtcbiAgY29uc3Qgc3RyZWFtU3RhdGUgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pkLXN0cmVhbS1zdGF0ZScpO1xuXG4gIGxldCBhdmFpbGFibGUgPSBmYWxzZTsgICAgIC8vIC92YXIvbG9nL2pvdXJuYWwgbW91bnRlZD9cbiAgbGV0IGxpbmVzID0gW107ICAgICAgICAgICAgLy8gY3VycmVudCBidWZmZXIgKGFycmF5IG9mIHt0aW1lc3RhbXAsIHVuaXQsIHRleHR9KVxuICBsZXQgc3RyZWFtaW5nID0gZmFsc2U7XG4gIGxldCBldmVudFNvdXJjZSA9IG51bGw7XG4gIGxldCBzZWFyY2hUaW1lciA9IG51bGw7XG5cbiAgZnVuY3Rpb24gZXNjYXBlSHRtbChzKSB7XG4gICAgLy8gTG9jYWwgcmUtZGVjbGFyYXRpb24gc28gd2UgZG9uJ3QgZGVwZW5kIG9uIGEgZ2xvYmFsOyBzYW1lIHNlbWFudGljc1xuICAgIC8vIGFzIHRoZSBoZWxwZXIgdXNlZCBieSBjb250YWluZXItbG9ncy5qcyBhbmQgZXJyb3ItbG9ncy5qcy5cbiAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBkaXYudGV4dENvbnRlbnQgPSBTdHJpbmcocyk7XG4gICAgcmV0dXJuIGRpdi5pbm5lckhUTUw7XG4gIH1cblxuICBmdW5jdGlvbiBzZXRBdmFpbGFibGUoaXNBdmFpbGFibGUpIHtcbiAgICBhdmFpbGFibGUgPSBpc0F2YWlsYWJsZTtcbiAgICB1bml0U2VsZWN0LmlubmVySFRNTCA9ICcnO1xuICAgIFVOSVRfUFJFU0VUUy5mb3JFYWNoKHAgPT4ge1xuICAgICAgY29uc3Qgb3B0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb3B0aW9uJyk7XG4gICAgICBvcHQudmFsdWUgPSBwLnVuaXQ7XG4gICAgICBvcHQudGV4dENvbnRlbnQgPSBwLmxhYmVsICsgJyAoJyArIHAudW5pdCArICcpJztcbiAgICAgIHVuaXRTZWxlY3QuYXBwZW5kQ2hpbGQob3B0KTtcbiAgICB9KTtcbiAgICB1bml0U2VsZWN0LmRpc2FibGVkID0gIWlzQXZhaWxhYmxlO1xuICAgIGlmICghaXNBdmFpbGFibGUpIHtcbiAgICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJsb2dzLWxvYWRpbmdcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IHRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogNDBweDtcIj5qb3VybmFsZCBiaW5kLW1vdW50IG5vdCBhdmFpbGFibGUgaW4gdGhpcyBjb250YWluZXIuPGJyLz48c21hbGw+UmVxdWlyZXMgPGNvZGU+L3Zhci9sb2cvam91cm5hbDwvY29kZT4gKyA8Y29kZT4vdXNyL2Jpbi9qb3VybmFsY3RsPC9jb2RlPiBtb3VudGVkIChzdGFydC5zaCkuPC9zbWFsbD48L2Rpdj4nO1xuICAgICAgcmVmcmVzaEJ0bi5kaXNhYmxlZCA9IHRydWU7XG4gICAgICBzdHJlYW1CdG4uZGlzYWJsZWQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZWZyZXNoQnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICBzdHJlYW1CdG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBwcm9iZUF2YWlsYWJsZSgpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2xvZ3Mvam91cm5hbC91bml0cycpO1xuICAgICAgaWYgKCFyZXNwLm9rKSB7IHNldEF2YWlsYWJsZShmYWxzZSk7IHJldHVybjsgfVxuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3AuanNvbigpO1xuICAgICAgc2V0QXZhaWxhYmxlKCEhZGF0YS5hdmFpbGFibGUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHNldEF2YWlsYWJsZShmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVuZGVyTGluZXMoKSB7XG4gICAgY29uc3QgdGVybSA9IChzZWFyY2hJbnB1dC52YWx1ZSB8fCAnJykudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgZmlsdGVyZWQgPSB0ZXJtID8gbGluZXMuZmlsdGVyKGwgPT4gKGwudGV4dENvbnRlbnQgfHwgJycpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGVybSkpIDogbGluZXM7XG4gICAgaWYgKGZpbHRlcmVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29udGVudC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImxvZ3MtbG9hZGluZ1wiIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgdGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiA0MHB4O1wiPk5vIGVudHJpZXMnICsgKHRlcm0gPyBgIG1hdGNoaW5nICZxdW90OyR7ZXNjYXBlSHRtbCh0ZXJtKX0mcXVvdDtgIDogJycpICsgJzwvZGl2Pic7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGh0bWwgPSBmaWx0ZXJlZC5tYXAobGluZSA9PiB7XG4gICAgICAgIGNvbnN0IHRzID0gbGluZS50aW1lc3RhbXAgPyBlc2NhcGVIdG1sKGxpbmUudGltZXN0YW1wKSA6ICdcdTIwMTQnO1xuICAgICAgICBjb25zdCB0ID0gZXNjYXBlSHRtbChsaW5lLnRleHRDb250ZW50KTtcbiAgICAgICAgcmV0dXJuIGA8ZGl2IGNsYXNzPVwiamQtbGluZVwiIHN0eWxlPVwicGFkZGluZzogMXB4IDA7IGxpbmUtaGVpZ2h0OiAxLjQ7IGNvbG9yOiAjZDRkNGQ0O1wiPjxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLXJpZ2h0OiA4cHg7XCI+JHt0c308L3NwYW4+JHt0fTwvZGl2PmA7XG4gICAgICB9KS5qb2luKCcnKTtcbiAgICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gaHRtbDtcbiAgICAgIC8vIEF1dG8tc2Nyb2xsIG9ubHkgaWYgdXNlciBpcyBhbHJlYWR5IGF0IHRoZSBib3R0b20gKGRvbid0IGZpZ2h0IHRoZW0pLlxuICAgICAgY29uc3QgbmVhckJvdHRvbSA9IGNvbnRlbnQuc2Nyb2xsSGVpZ2h0IC0gY29udGVudC5zY3JvbGxUb3AgLSBjb250ZW50LmNsaWVudEhlaWdodCA8IDgwO1xuICAgICAgaWYgKG5lYXJCb3R0b20pIGNvbnRlbnQuc2Nyb2xsVG9wID0gY29udGVudC5zY3JvbGxIZWlnaHQ7XG4gICAgfVxuICAgIGxpbmVDb3VudC50ZXh0Q29udGVudCA9IGAke2xpbmVzLmxlbmd0aH0gZW50cmllc2A7XG4gICAgZmlsdGVyQ291bnQudGV4dENvbnRlbnQgPSB0ZXJtID8gYCR7ZmlsdGVyZWQubGVuZ3RofSBvZiAke2xpbmVzLmxlbmd0aH0gc2hvd25gIDogYCR7bGluZXMubGVuZ3RofSBzaG93bmA7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBsb2FkVGFpbCgpIHtcbiAgICBpZiAoIWF2YWlsYWJsZSkgcmV0dXJuO1xuICAgIHN0b3BTdHJlYW0oKTtcbiAgICBjb25zdCB1bml0ID0gdW5pdFNlbGVjdC52YWx1ZTtcbiAgICBpZiAoIXVuaXQpIHJldHVybjtcbiAgICBjb25zdCB0YWlsID0gTWF0aC5tYXgoMSwgTWF0aC5taW4oNTAwMCwgTnVtYmVyKHRhaWxJbnB1dC52YWx1ZSkgfHwgMjAwKSk7XG4gICAgY29uc3QgdGVybSA9IChzZWFyY2hJbnB1dC52YWx1ZSB8fCAnJykudHJpbSgpO1xuICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJsb2dzLWxvYWRpbmdcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IHRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogNDBweDtcIj5Mb2FkaW5nXHUyMDI2PC9kaXY+JztcbiAgICB0cnkge1xuICAgICAgY29uc3QgdXJsID0gbmV3IFVSTCgnL2FwaS92MS9sb2dzL2pvdXJuYWwnLCB3aW5kb3cubG9jYXRpb24ub3JpZ2luKTtcbiAgICAgIHVybC5zZWFyY2hQYXJhbXMuc2V0KCd1bml0JywgdW5pdCk7XG4gICAgICB1cmwuc2VhcmNoUGFyYW1zLnNldCgndGFpbCcsIFN0cmluZyh0YWlsKSk7XG4gICAgICBpZiAodGVybSkgdXJsLnNlYXJjaFBhcmFtcy5zZXQoJ3NlYXJjaCcsIHRlcm0pO1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKHVybC50b1N0cmluZygpKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwLmpzb24oKTtcbiAgICAgIGlmICghcmVzcC5vayB8fCAhZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJsb2dzLWxvYWRpbmdcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcsICNlZjQ0NDQpOyB0ZXh0LWFsaWduOiBjZW50ZXI7IHBhZGRpbmc6IDQwcHg7XCI+RmFpbGVkOiAnICsgZXNjYXBlSHRtbCgoZGF0YSAmJiBkYXRhLmVycm9yKSB8fCAoJ0hUVFAgJyArIHJlc3Auc3RhdHVzKSkgKyAnPC9kaXY+JztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdW5pdERpc3BsYXkudGV4dENvbnRlbnQgPSB1bml0O1xuICAgICAgbGluZXMgPSAoZGF0YS5lbnRyaWVzIHx8IFtdKS5tYXAoZSA9PiAoe1xuICAgICAgICB0aW1lc3RhbXA6IGUudGltZXN0YW1wLFxuICAgICAgICB1bml0OiBlLnVuaXQsXG4gICAgICAgIHRleHRDb250ZW50OiBlLnRleHQgfHwgJycsXG4gICAgICB9KSk7XG4gICAgICBvdmVyZmxvd0hpbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIHJlbmRlckxpbmVzKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29udGVudC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImxvZ3MtbG9hZGluZ1wiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZywgI2VmNDQ0NCk7IHRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogNDBweDtcIj5FcnJvcjogJyArIGVzY2FwZUh0bWwoZS5tZXNzYWdlKSArICc8L2Rpdj4nO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHN0YXJ0U3RyZWFtKCkge1xuICAgIGlmICghYXZhaWxhYmxlKSByZXR1cm47XG4gICAgc3RvcFN0cmVhbSgpO1xuICAgIGNvbnN0IHVuaXQgPSB1bml0U2VsZWN0LnZhbHVlO1xuICAgIGlmICghdW5pdCkgcmV0dXJuO1xuICAgIGNvbnN0IHRlcm0gPSAoc2VhcmNoSW5wdXQudmFsdWUgfHwgJycpLnRyaW0oKTtcbiAgICB1bml0RGlzcGxheS50ZXh0Q29udGVudCA9IHVuaXQ7XG4gICAgc3RyZWFtQnRuLnRleHRDb250ZW50ID0gJ1x1MjNGOCBTdG9wJztcbiAgICBzdHJlYW1CdG4uY2xhc3NMaXN0LmFkZCgnc3RyZWFtaW5nJyk7XG4gICAgc3RyZWFtU3RhdGUudGV4dENvbnRlbnQgPSAnc3RyZWFtaW5nJztcbiAgICBzdHJlYW1TdGF0ZS5zdHlsZS5jb2xvciA9ICd2YXIoLS1vay1mZywgIzRhZGU4MCknO1xuICAgIGxpbmVzID0gW107XG4gICAgcmVuZGVyTGluZXMoKTtcbiAgICBvdmVyZmxvd0hpbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKCcvYXBpL3YxL2xvZ3Mvam91cm5hbC9zdHJlYW0nLCB3aW5kb3cubG9jYXRpb24ub3JpZ2luKTtcbiAgICB1cmwuc2VhcmNoUGFyYW1zLnNldCgndW5pdCcsIHVuaXQpO1xuICAgIGlmICh0ZXJtKSB1cmwuc2VhcmNoUGFyYW1zLnNldCgnc2VhcmNoJywgdGVybSk7XG4gICAgZXZlbnRTb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UodXJsLnRvU3RyaW5nKCkpO1xuICAgIGV2ZW50U291cmNlLm9ubWVzc2FnZSA9IChldikgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZW50cnkgPSBKU09OLnBhcnNlKGV2LmRhdGEpO1xuICAgICAgICBpZiAoZW50cnkuZXJyb3IpIHtcbiAgICAgICAgICAvLyBPdmVyZmxvdyAvIHZhbGlkYXRpb24gLyBiaW5kLW1vdW50IGVycm9yc1xuICAgICAgICAgIGlmICgvc3RyZWFtIChleGNlZWRlZHxsaW5lIGNhcCkvLnRlc3QoZW50cnkuZXJyb3IpKSB7XG4gICAgICAgICAgICBvdmVyZmxvd0hpbnQuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgICAgICAgc3RvcFN0cmVhbSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250ZW50LmlubmVySFRNTCArPSAnPGRpdiBjbGFzcz1cImpkLWxpbmVcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcsICNlZjQ0NDQpOyBwYWRkaW5nOiA0cHggMDtcIj5cdTI2QTAgJyArIGVzY2FwZUh0bWwoZW50cnkuZXJyb3IpICsgJzwvZGl2Pic7XG4gICAgICAgICAgY29udGVudC5zY3JvbGxUb3AgPSBjb250ZW50LnNjcm9sbEhlaWdodDtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGluZXMucHVzaCh7XG4gICAgICAgICAgdGltZXN0YW1wOiBlbnRyeS50aW1lc3RhbXAsXG4gICAgICAgICAgdW5pdDogZW50cnkudW5pdCB8fCB1bml0LFxuICAgICAgICAgIHRleHRDb250ZW50OiBlbnRyeS50ZXh0IHx8ICcnLFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gSGFyZCBjYXAgdG8ga2VlcCBtZW1vcnkgYm91bmRlZCBpZiBvcGVyYXRvciBzdHJlYW1zIGZvcmV2ZXIuXG4gICAgICAgIGlmIChsaW5lcy5sZW5ndGggPiA1MDAwKSB7XG4gICAgICAgICAgbGluZXMgPSBsaW5lcy5zbGljZShsaW5lcy5sZW5ndGggLSA1MDAwKTtcbiAgICAgICAgICBvdmVyZmxvd0hpbnQuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgICB9XG4gICAgICAgIHJlbmRlckxpbmVzKCk7XG4gICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgIC8vIElnbm9yZSBtYWxmb3JtZWQgZXZlbnRzOyB0aGUgc2VydmVyIGlzIGF1dGhvcml0YXRpdmUuXG4gICAgICB9XG4gICAgfTtcbiAgICBldmVudFNvdXJjZS5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgLy8gRXZlbnRTb3VyY2UgYXV0by1yZWNvbm5lY3RzOyBtYXJrIHRyYW5zaWVudCBpZiB3ZSB3ZXJlIGV4cGVjdGluZ1xuICAgICAgLy8gbW9yZSwgb3RoZXJ3aXNlIHdlIGNsb3NlZCBpdCBkZWxpYmVyYXRlbHkuXG4gICAgICBpZiAoIXN0cmVhbWluZykgcmV0dXJuO1xuICAgIH07XG4gICAgc3RyZWFtaW5nID0gdHJ1ZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHN0b3BTdHJlYW0oKSB7XG4gICAgc3RyZWFtaW5nID0gZmFsc2U7XG4gICAgaWYgKGV2ZW50U291cmNlKSB7XG4gICAgICB0cnkgeyBldmVudFNvdXJjZS5jbG9zZSgpOyB9IGNhdGNoIChfKSB7IC8qIGlnbm9yZSAqLyB9XG4gICAgICBldmVudFNvdXJjZSA9IG51bGw7XG4gICAgfVxuICAgIHN0cmVhbUJ0bi50ZXh0Q29udGVudCA9ICdcdTI1QjYgU3RyZWFtJztcbiAgICBzdHJlYW1CdG4uY2xhc3NMaXN0LnJlbW92ZSgnc3RyZWFtaW5nJyk7XG4gICAgc3RyZWFtU3RhdGUudGV4dENvbnRlbnQgPSAnZGlzY29ubmVjdGVkJztcbiAgICBzdHJlYW1TdGF0ZS5zdHlsZS5jb2xvciA9ICd2YXIoLS1tdXRlZCknO1xuICB9XG5cbiAgZnVuY3Rpb24gY2xvc2UoKSB7XG4gICAgc3RvcFN0cmVhbSgpO1xuICAgIG1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgfVxuXG4gIC8vIFdpcmUgZXZlbnRzXG4gIHJlZnJlc2hCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBsb2FkVGFpbCk7XG4gIHN0cmVhbUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHN0cmVhbWluZyA/IHN0b3BTdHJlYW0oKSA6IHN0YXJ0U3RyZWFtKCkpO1xuICBjbGVhclNlYXJjaC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHsgc2VhcmNoSW5wdXQudmFsdWUgPSAnJzsgcmVuZGVyTGluZXMoKTsgfSk7XG4gIHNlYXJjaElucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xuICAgIGNsZWFyVGltZW91dChzZWFyY2hUaW1lcik7XG4gICAgc2VhcmNoVGltZXIgPSBzZXRUaW1lb3V0KHJlbmRlckxpbmVzLCAyMDApO1xuICB9KTtcbiAgc2VhcmNoSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChlKSA9PiB7XG4gICAgaWYgKGUua2V5ID09PSAnRXNjYXBlJykgeyBzZWFyY2hJbnB1dC52YWx1ZSA9ICcnOyByZW5kZXJMaW5lcygpOyB9XG4gIH0pO1xuICBjbG9zZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNsb3NlKTtcbiAgY2xvc2VCdG4yLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xvc2UpO1xuICBtb2RhbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7IGlmIChlLnRhcmdldCA9PT0gbW9kYWwpIGNsb3NlKCk7IH0pO1xuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGUpID0+IHtcbiAgICBpZiAoZS5rZXkgPT09ICdFc2NhcGUnICYmIG1vZGFsLmNsYXNzTGlzdC5jb250YWlucygnc2hvdycpKSBjbG9zZSgpO1xuICB9KTtcbiAgLy8gUmVsb2FkIHRhaWwgYXV0b21hdGljYWxseSB3aGVuIHRoZSB1bml0IGRyb3Bkb3duIGNoYW5nZXMgKGlmIHdlIGhhdmVcbiAgLy8gZGF0YSBhbHJlYWR5IFx1MjAxNCBzYXZlcyBhIGNsaWNrKS5cbiAgdW5pdFNlbGVjdC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgaWYgKGxpbmVzLmxlbmd0aCA+IDApIGxvYWRUYWlsKCk7XG4gIH0pO1xuXG4gIC8vIEhvb2sgaW50byB0aGUgZXhpc3RpbmcgXCJDb250YWluZXIgTG9nc1wiIG1vZGFsIGJ1dHRvbiBzbyBvcGVyYXRvcnMgZ2V0IGFcbiAgLy8gc2VwYXJhdGUgZW50cnkgcG9pbnQ7IG1pcnJvciB0aGUgb3BlbkNvbnRhaW5lckxvZ3NNb2RhbCBwYXR0ZXJuLlxuICBmdW5jdGlvbiBvcGVuSm91cm5hbGRNb2RhbCgpIHtcbiAgICBtb2RhbC5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG4gICAgcHJvYmVBdmFpbGFibGUoKTtcbiAgfVxuICB3aW5kb3cub3BlbkpvdXJuYWxkTW9kYWwgPSBvcGVuSm91cm5hbGRNb2RhbDtcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndmlldy1qb3VybmFsZC1sb2dzJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb3BlbkpvdXJuYWxkTW9kYWwpO1xufSkoKTs7XG4vLyA9PT09PT09PT09IENPTlRBSU5FUiBTTkFQU0hPVCAvIENIRUNLUE9JTlQgPT09PT09PT09PVxuKGZ1bmN0aW9uKCkge1xuICAvLyBJbmplY3QgbW9kYWwgSFRNTFxuICBpbmplY3RNb2RhbCgnc25hcHNob3QtbW9kYWwnLCBgPGRpdiBpZD1cInNuYXBzaG90LW1vZGFsXCIgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsXCI+XG4gICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtY29udGVudFwiIHN0eWxlPVwibWluLXdpZHRoOiA3MDBweDsgbWF4LXdpZHRoOiA4NTBweDtcIj5cbiAgICAgIDxoMz5cdUQ4M0RcdURDQkUgQ29udGFpbmVyIFNuYXBzaG90czwvaDM+XG4gICAgICA8cCBjbGFzcz1cIm1vZGFsLXN1YnRpdGxlXCI+XG4gICAgICAgIENyZWF0ZSBhbmQgbWFuYWdlIERvY2tlciBjb250YWluZXIgY2hlY2twb2ludHMgZm9yIGluc3RhbnQgc3RhdGUgcmVjb3ZlcnkuXG4gICAgICA8L3A+XG5cbiAgICAgIDxkaXYgaWQ9XCJzbmFwc2hvdC1jb250YWluZXItc2VsZWN0LXdyYXBwZXJcIiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDE2cHg7XCI+XG4gICAgICAgIDxsYWJlbCBzdHlsZT1cImZvbnQtc2l6ZTogMC44NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5TZWxlY3QgQ29udGFpbmVyOjwvbGFiZWw+XG4gICAgICAgIDxzZWxlY3QgaWQ9XCJzbmFwc2hvdC1jb250YWluZXItc2VsZWN0XCIgc3R5bGU9XCJ3aWR0aDogMTAwJTsgcGFkZGluZzogOHB4IDEycHg7IG1hcmdpbi10b3A6IDRweDsgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGNvbG9yOiB2YXIoLS1mZyk7IGZvbnQtc2l6ZTogMC45cmVtO1wiPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj4tLSBTZWxlY3QgYSBjb250YWluZXIgLS08L29wdGlvbj5cbiAgICAgICAgPC9zZWxlY3Q+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBpZD1cInNuYXBzaG90LWRldGFpbHNcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IG1hcmdpbi1ib3R0b206IDE2cHg7IHBhZGRpbmc6IDEycHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDhweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1ob3Zlcik7XCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnI7IGdhcDogOHB4OyBmb250LXNpemU6IDAuODVyZW07XCI+XG4gICAgICAgICAgPGRpdj48c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+SW1hZ2U6PC9zcGFuPiA8c3BhbiBpZD1cInNuYXBzaG90LWltYWdlXCI+PC9zcGFuPjwvZGl2PlxuICAgICAgICAgIDxkaXY+PHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPlN0YXR1czo8L3NwYW4+IDxzcGFuIGlkPVwic25hcHNob3Qtc3RhdHVzXCI+PC9zcGFuPjwvZGl2PlxuICAgICAgICAgIDxkaXY+PHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPkNyZWF0ZWQ6PC9zcGFuPiA8c3BhbiBpZD1cInNuYXBzaG90LWNyZWF0ZWRcIj48L3NwYW4+PC9kaXY+XG4gICAgICAgICAgPGRpdj48c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+Q29udGFpbmVyIElEOjwvc3Bhbj4gPHNwYW4gaWQ9XCJzbmFwc2hvdC1pZFwiIHN0eWxlPVwiZm9udC1mYW1pbHk6IG1vbm9zcGFjZTtcIj48L3NwYW4+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC10YWJzXCIgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAxMnB4O1wiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwicGFuZWwtdGFiIGFjdGl2ZVwiIGRhdGEtcGFuZWw9XCJzbmFwc2hvdC1jcmVhdGVcIj5DcmVhdGUgU25hcHNob3Q8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInBhbmVsLXRhYlwiIGRhdGEtcGFuZWw9XCJzbmFwc2hvdC1saXN0XCI+TWFuYWdlIFNuYXBzaG90czwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgaWQ9XCJzbmFwc2hvdC1jcmVhdGVcIiBjbGFzcz1cInBhbmVsLXNlY3Rpb24gYWN0aXZlXCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAxMnB4O1wiPlxuICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImZvbnQtc2l6ZTogMC44NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5TbmFwc2hvdCBOYW1lOjwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJzbmFwc2hvdC1uYW1lXCIgcGxhY2Vob2xkZXI9XCJlLmcuLCBiZWZvcmUtdXBkYXRlLTIwMjRcIiBcbiAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7IHBhZGRpbmc6IDhweCAxMnB4OyBtYXJnaW4tdG9wOiA0cHg7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4OyBjb2xvcjogdmFyKC0tZmcpOyBmb250LXNpemU6IDAuOXJlbTsgYm94LXNpemluZzogYm9yZGVyLWJveDtcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDEycHg7XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtbGFiZWxcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC44NXJlbTtcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cInNuYXBzaG90LWxlYXZlLXJ1bm5pbmdcIiBjaGVja2VkIC8+XG4gICAgICAgICAgICBMZWF2ZSBjb250YWluZXIgcnVubmluZyBhZnRlciBjaGVja3BvaW50IChyZXN1bWUgd2l0aG91dCByZXN0YXJ0KVxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8YnV0dG9uIGlkPVwic25hcHNob3QtY3JlYXRlLWJ0blwiIGNsYXNzPVwiYnRuLWFjY2VudC1zb2xpZFwiIHN0eWxlPVwid2lkdGg6IDEwMCU7XCI+XHVEODNEXHVEQ0JFIENyZWF0ZSBTbmFwc2hvdDwvYnV0dG9uPlxuICAgICAgICA8ZGl2IGlkPVwic25hcHNob3QtY3JlYXRlLXN0YXR1c1wiIHN0eWxlPVwibWFyZ2luLXRvcDogMTJweDsgdGV4dC1hbGlnbjogY2VudGVyOyBmb250LXNpemU6IDAuODVyZW07XCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBpZD1cInNuYXBzaG90LWxpc3RcIiBjbGFzcz1cInBhbmVsLXNlY3Rpb25cIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+XG4gICAgICAgIDxkaXYgaWQ9XCJzbmFwc2hvdC1saXN0LWNvbnRhaW5lclwiIGNsYXNzPVwic2Nyb2xsLWNvbnRhaW5lclwiIHN0eWxlPVwibWF4LWhlaWdodDogMzAwcHg7XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHVEODNEXHVEQ0JFPC9zcGFuPlNlbGVjdCBhIGNvbnRhaW5lciB0byB2aWV3IGl0cyBzbmFwc2hvdHM8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9ucyBtb2RhbC1mb290ZXItYmFyXCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJzbmFwc2hvdC1jbG9zZVwiPkNsb3NlPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YCk7XG5cbiAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc25hcHNob3QtbW9kYWwnKTtcbiAgY29uc3Qgb3BlbkJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzbmFwc2hvdC1idG4nKTtcbiAgY29uc3QgY2xvc2VCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc25hcHNob3QtY2xvc2UnKTtcbiAgY29uc3QgY29udGFpbmVyU2VsZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NuYXBzaG90LWNvbnRhaW5lci1zZWxlY3QnKTtcbiAgY29uc3QgZGV0YWlsc0RpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzbmFwc2hvdC1kZXRhaWxzJyk7XG4gIGNvbnN0IGNyZWF0ZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzbmFwc2hvdC1jcmVhdGUtYnRuJyk7XG4gIGNvbnN0IGNyZWF0ZVN0YXR1cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzbmFwc2hvdC1jcmVhdGUtc3RhdHVzJyk7XG5cbiAgbGV0IGN1cnJlbnRDb250YWluZXJJZCA9IG51bGw7XG5cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZENvbnRhaW5lcnMoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2NvbnRhaW5lcnMnKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKCFkYXRhLnN1Y2Nlc3MgfHwgIWRhdGEuY29udGFpbmVycykgcmV0dXJuO1xuICAgICAgXG4gICAgICBjb250YWluZXJTZWxlY3QuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9XCJcIj4tLSBTZWxlY3QgYSBjb250YWluZXIgLS08L29wdGlvbj4nO1xuICAgICAgZm9yIChjb25zdCBjIG9mIGRhdGEuY29udGFpbmVycykge1xuICAgICAgICBjb25zdCBvcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24nKTtcbiAgICAgICAgb3B0LnZhbHVlID0gYy5pZDtcbiAgICAgICAgb3B0LnRleHRDb250ZW50ID0gYCR7Yy5uYW1lIHx8IGMuaWR9ICgke2MuaW1hZ2UgfHwgJ3Vua25vd24nfSlgO1xuICAgICAgICBvcHQuZGF0YXNldC5uYW1lID0gYy5uYW1lO1xuICAgICAgICBvcHQuZGF0YXNldC5pbWFnZSA9IGMuaW1hZ2U7XG4gICAgICAgIG9wdC5kYXRhc2V0LnN0YXR1cyA9IGMuc3RhdHVzO1xuICAgICAgICBvcHQuZGF0YXNldC5jcmVhdGVkID0gYy5jcmVhdGVkO1xuICAgICAgICBjb250YWluZXJTZWxlY3QuYXBwZW5kQ2hpbGQob3B0KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gbG9hZCBjb250YWluZXJzOicsIGUpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNob3dDb250YWluZXJEZXRhaWxzKG9wdCkge1xuICAgIGlmICghb3B0IHx8ICFvcHQudmFsdWUpIHtcbiAgICAgIGRldGFpbHNEaXYuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIGN1cnJlbnRDb250YWluZXJJZCA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGN1cnJlbnRDb250YWluZXJJZCA9IG9wdC52YWx1ZTtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc25hcHNob3QtaW1hZ2UnKS50ZXh0Q29udGVudCA9IG9wdC5kYXRhc2V0LmltYWdlIHx8ICctJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc25hcHNob3Qtc3RhdHVzJykudGV4dENvbnRlbnQgPSBvcHQuZGF0YXNldC5zdGF0dXMgfHwgJy0nO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzbmFwc2hvdC1jcmVhdGVkJykudGV4dENvbnRlbnQgPSBvcHQuZGF0YXNldC5jcmVhdGVkID8gbmV3IERhdGUob3B0LmRhdGFzZXQuY3JlYXRlZCAqIDEwMDApLnRvTG9jYWxlU3RyaW5nKCkgOiAnLSc7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NuYXBzaG90LWlkJykudGV4dENvbnRlbnQgPSBvcHQudmFsdWUuc3Vic3RyaW5nKDAsIDEyKTtcbiAgICBkZXRhaWxzRGl2LnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVNuYXBzaG90KCkge1xuICAgIGlmICghY3VycmVudENvbnRhaW5lcklkKSB7XG4gICAgICBjcmVhdGVTdGF0dXMudGV4dENvbnRlbnQgPSAnUGxlYXNlIHNlbGVjdCBhIGNvbnRhaW5lciBmaXJzdCc7XG4gICAgICBjcmVhdGVTdGF0dXMuc3R5bGUuY29sb3IgPSAndmFyKC0tYmFkLWZnKSc7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5hbWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc25hcHNob3QtbmFtZScpLnZhbHVlLnRyaW0oKTtcbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIGNyZWF0ZVN0YXR1cy50ZXh0Q29udGVudCA9ICdQbGVhc2UgZW50ZXIgYSBzbmFwc2hvdCBuYW1lJztcbiAgICAgIGNyZWF0ZVN0YXR1cy5zdHlsZS5jb2xvciA9ICd2YXIoLS1iYWQtZmcpJztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbGVhdmVSdW5uaW5nID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NuYXBzaG90LWxlYXZlLXJ1bm5pbmcnKS5jaGVja2VkO1xuICAgIFxuICAgIGNyZWF0ZUJ0bi5kaXNhYmxlZCA9IHRydWU7XG4gICAgY3JlYXRlQnRuLnRleHRDb250ZW50ID0gJ0NyZWF0aW5nLi4uJztcbiAgICBjcmVhdGVTdGF0dXMudGV4dENvbnRlbnQgPSAnJztcbiAgICBcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYC9hcGkvdjEvY29udGFpbmVycy8ke2VuY29kZVVSSUNvbXBvbmVudChjdXJyZW50Q29udGFpbmVySWQpfS9jaGVja3BvaW50YCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgbmFtZSwgbGVhdmVSdW5uaW5nIH0pXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICBjcmVhdGVTdGF0dXMudGV4dENvbnRlbnQgPSBgXHUyNzEzIFNuYXBzaG90IFwiJHtuYW1lfVwiIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5YDtcbiAgICAgICAgY3JlYXRlU3RhdHVzLnN0eWxlLmNvbG9yID0gJ3ZhcigtLW9rLWZnKSc7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzbmFwc2hvdC1uYW1lJykudmFsdWUgPSAnJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNyZWF0ZVN0YXR1cy50ZXh0Q29udGVudCA9IGBcdTI3MTcgRmFpbGVkOiAke2RhdGEuZXJyb3IgfHwgJ1Vua25vd24gZXJyb3InfWA7XG4gICAgICAgIGNyZWF0ZVN0YXR1cy5zdHlsZS5jb2xvciA9ICd2YXIoLS1iYWQtZmcpJztcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjcmVhdGVTdGF0dXMudGV4dENvbnRlbnQgPSBgXHUyNzE3IEVycm9yOiAke2UubWVzc2FnZX1gO1xuICAgICAgY3JlYXRlU3RhdHVzLnN0eWxlLmNvbG9yID0gJ3ZhcigtLWJhZC1mZyknO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBjcmVhdGVCdG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIGNyZWF0ZUJ0bi50ZXh0Q29udGVudCA9ICdcdUQ4M0RcdURDQkUgQ3JlYXRlIFNuYXBzaG90JztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvcGVuTW9kYWwoKSB7XG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICAgIGxvYWRDb250YWluZXJzKCk7XG4gIH1cblxuICBmdW5jdGlvbiBjbG9zZU1vZGFsKCkge1xuICAgIG1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgICBkZXRhaWxzRGl2LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgY3VycmVudENvbnRhaW5lcklkID0gbnVsbDtcbiAgICBjb250YWluZXJTZWxlY3Quc2VsZWN0ZWRJbmRleCA9IDA7XG4gIH1cblxuICBvcGVuQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG9wZW5Nb2RhbCk7XG4gIGNsb3NlQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNsb3NlTW9kYWwpO1xuICB3aXJlTW9kYWwobW9kYWwsIGNsb3NlQnRuKTtcbiAgXG4gIGNvbnRhaW5lclNlbGVjdD8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKGUpID0+IHtcbiAgICBjb25zdCBvcHQgPSBjb250YWluZXJTZWxlY3Qub3B0aW9uc1tjb250YWluZXJTZWxlY3Quc2VsZWN0ZWRJbmRleF07XG4gICAgc2hvd0NvbnRhaW5lckRldGFpbHMob3B0KTtcbiAgfSk7XG4gIFxuICBjcmVhdGVCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY3JlYXRlU25hcHNob3QpO1xuICBcbiAgLy8gVGFiIHN3aXRjaGluZ1xuICBtb2RhbD8ucXVlcnlTZWxlY3RvckFsbCgnLnBhbmVsLXRhYicpLmZvckVhY2godGFiID0+IHtcbiAgICB0YWIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBtb2RhbC5xdWVyeVNlbGVjdG9yQWxsKCcucGFuZWwtdGFiJykuZm9yRWFjaCh0ID0+IHQuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJykpO1xuICAgICAgbW9kYWwucXVlcnlTZWxlY3RvckFsbCgnLnBhbmVsLXNlY3Rpb24nKS5mb3JFYWNoKHMgPT4gcy5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKSk7XG4gICAgICB0YWIuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gICAgICBtb2RhbC5xdWVyeVNlbGVjdG9yKGAjJHt0YWIuZGF0YXNldC5wYW5lbH1gKS5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgICB9KTtcbiAgfSk7XG59KSgpO1xuO1xuLy8gPT09PT09PT09PSBTTUFSVCBBUlIgQ09OTkVDVCA9PT09PT09PT09XG4oZnVuY3Rpb24oKSB7XG4gIGluamVjdE1vZGFsKCdhcnItc2V0dXAtbW9kYWwnLCBgPGRpdiBpZD1cImFyci1zZXR1cC1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogNjAwcHg7IG1heC13aWR0aDogNzIwcHg7XCI+XG4gICAgICA8aDM+XHVEODNDXHVERkFDIFNtYXJ0IEFyciBDb25uZWN0PC9oMz5cbiAgICAgIDxwIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luOiAwIDAgMTZweDsgZm9udC1zaXplOiAwLjlyZW07XCI+XG4gICAgICAgIEF1dG8tZGlzY292ZXIgYW5kIGNvbm5lY3QgeW91ciBlbnRpcmUgbWVkaWEgc3RhY2suXG4gICAgICA8L3A+XG5cbiAgICAgIDwhLS0gUGhhc2UgMTogRGV0ZWN0aW9uIC0tPlxuICAgICAgPGRpdiBpZD1cInNtYXJ0LXBoYXNlLWRldGVjdFwiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiAyMHB4O1wiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnJhbmQtc3Bpbm5lclwiIHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMTJweDsgZGlzcGxheTogaW5saW5lLWJsb2NrO1wiPjwvc3Bhbj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgZm9udC1zaXplOiAwLjlyZW07XCI+U2Nhbm5pbmcgZm9yIHNlcnZpY2VzLi4uPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwic21hcnQtZGV0ZWN0LXJlc3VsdHNcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBQaGFzZSAyOiBDcmVkZW50aWFsIElucHV0IChvbmx5IGZvciBzZXJ2aWNlcyBuZWVkaW5nIGtleXMpIC0tPlxuICAgICAgPGRpdiBpZD1cInNtYXJ0LXBoYXNlLWNyZWRlbnRpYWxzXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPlxuICAgICAgICA8aDQgY2xhc3M9XCJoZWFkaW5nLWFjY2VudC1zZWN0aW9uXCI+RW50ZXIgTWlzc2luZyBBUEkgS2V5czwvaDQ+XG4gICAgICAgIDxkaXYgaWQ9XCJzbWFydC1jcmVkZW50aWFsLWlucHV0c1wiPjwvZGl2PlxuXG4gICAgICAgIDwhLS0gQ29ubmVjdGlvbiBPcHRpb25zIC0tPlxuICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMTZweDsgcGFkZGluZzogMTJweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTsgYm9yZGVyLXJhZGl1czogOHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPlxuICAgICAgICAgIDxoNCBzdHlsZT1cIm1hcmdpbjogMCAwIDEwcHg7IGZvbnQtc2l6ZTogMC44NXJlbTsgY29sb3I6IHZhcigtLWFjY2VudCk7XCI+Q29ubmVjdGlvbiBPcHRpb25zPC9oND5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJvcHRpb24tbGFiZWxcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cInNtYXJ0LW9wdC1zZWVyclwiIGNoZWNrZWQgY2xhc3M9XCJjaGVja2JveC1zbVwiIC8+XG4gICAgICAgICAgICBDb25maWd1cmUgU2VlcnIgd2l0aCBSYWRhcnIgKyBTb25hcnJcbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cIm9wdGlvbi1sYWJlbFwiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwic21hcnQtb3B0LXBsZXhcIiBjaGVja2VkIGNsYXNzPVwiY2hlY2tib3gtc21cIiAvPlxuICAgICAgICAgICAgQ29ubmVjdCBQbGV4IHRvIFNlZXJyXG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJvcHRpb24tbGFiZWxcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cInNtYXJ0LW9wdC1wcm93bGFyclwiIGNoZWNrZWQgY2xhc3M9XCJjaGVja2JveC1zbVwiIC8+XG4gICAgICAgICAgICBDb25uZWN0IFByb3dsYXJyIHRvIFJhZGFyciArIFNvbmFyclxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGxhYmVsIHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA4cHg7IGN1cnNvcjogcG9pbnRlcjsgZm9udC1zaXplOiAwLjg1cmVtO1wiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwic21hcnQtb3B0LXNhdmVcIiBjaGVja2VkIGNsYXNzPVwiY2hlY2tib3gtc21cIiAvPlxuICAgICAgICAgICAgU2F2ZSBBUEkga2V5cyBmb3Igb25lLWNsaWNrIHJlY29ubmVjdFxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxidXR0b24gaWQ9XCJzbWFydC1jb25uZWN0LWJ0blwiIHN0eWxlPVwid2lkdGg6IDEwMCU7IG1hcmdpbi10b3A6IDE2cHg7IHBhZGRpbmc6IDEycHg7IGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsICNlNzRjM2MgMCUsICM5YjU5YjYgMTAwJSk7IGJvcmRlcjogbm9uZTsgY29sb3I6IHdoaXRlOyBmb250LXdlaWdodDogNjAwOyBmb250LXNpemU6IDFyZW07IGJvcmRlci1yYWRpdXM6IDhweDsgY3Vyc29yOiBwb2ludGVyO1wiPlxuICAgICAgICAgIFNtYXJ0IENvbm5lY3RcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBQaGFzZSAzOiBDb25uZWN0aW9uIFByb2dyZXNzIC0tPlxuICAgICAgPGRpdiBpZD1cInNtYXJ0LXBoYXNlLXByb2dyZXNzXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPlxuICAgICAgICA8aDQgY2xhc3M9XCJoZWFkaW5nLWFjY2VudC1zZWN0aW9uXCI+Q29ubmVjdGluZyBFdmVyeXRoaW5nLi4uPC9oND5cbiAgICAgICAgPGRpdiBpZD1cInNtYXJ0LXByb2dyZXNzLXN0ZXBzXCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDZweDtcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFBoYXNlIDQ6IFJlc3VsdHMgLS0+XG4gICAgICA8ZGl2IGlkPVwic21hcnQtcGhhc2UtcmVzdWx0c1wiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj5cbiAgICAgICAgPGRpdiBpZD1cInNtYXJ0LXJlc3VsdHMtY29udGVudFwiPjwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwic21hcnQtcGxleC1saWJyYXJpZXNcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IG1hcmdpbi10b3A6IDEycHg7XCI+PC9kaXY+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDhweDsgbWFyZ2luLXRvcDogMTZweDtcIj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwic21hcnQtcmV0cnktYnRuXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBmbGV4OiAxOyBwYWRkaW5nOiAxMHB4OyBiYWNrZ3JvdW5kOiAjZjM5YzEyOyBib3JkZXI6IG5vbmU7IGNvbG9yOiB3aGl0ZTsgZm9udC13ZWlnaHQ6IDUwMDsgYm9yZGVyLXJhZGl1czogOHB4OyBjdXJzb3I6IHBvaW50ZXI7XCI+XG4gICAgICAgICAgICBSZXRyeSBGYWlsZWQgU3RlcHNcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YSBpZD1cInNtYXJ0LW9wZW4tc2VlcnJcIiBocmVmPVwiI1wiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIlxuICAgICAgICAgICAgIHN0eWxlPVwiZmxleDogMTsgcGFkZGluZzogMTBweDsgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50KTsgY29sb3I6IHdoaXRlOyBib3JkZXI6IG5vbmU7IGJvcmRlci1yYWRpdXM6IDhweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXdlaWdodDogNTAwOyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IHRleHQtYWxpZ246IGNlbnRlcjtcIj5cbiAgICAgICAgICAgIE9wZW4gU2VlcnJcbiAgICAgICAgICA8L2E+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gSGVscCBUZXh0IC0tPlxuICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLXRvcDogMTJweDsgcGFkZGluZzogMTBweDsgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWFjY2VudCkgNSUsIHRyYW5zcGFyZW50KTsgYm9yZGVyLXJhZGl1czogNnB4O1wiPlxuICAgICAgICA8c3Ryb25nPldoZXJlIHRvIGZpbmQgQVBJIGtleXM6PC9zdHJvbmc+PGJyPlxuICAgICAgICBSYWRhcnIvU29uYXJyL1Byb3dsYXJyOiBTZXR0aW5ncyAtPiBHZW5lcmFsIC0+IFNlY3VyaXR5IC0+IEFQSSBLZXlcbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIENsb3NlIEJ1dHRvbiAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWJ1dHRvbnMgbW9kYWwtZm9vdGVyLWJhclwiPlxuICAgICAgICA8YnV0dG9uIGlkPVwiYXJyLXNldHVwLWNhbmNlbFwiPkNsb3NlPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YCk7XG5cbiAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXJyLXNldHVwLW1vZGFsJyk7XG4gIGNvbnN0IG9wZW5CdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXJyLXNldHVwLWJ0bicpO1xuICBjb25zdCBjYW5jZWxCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXJyLXNldHVwLWNhbmNlbCcpO1xuICBjb25zdCBjb25uZWN0QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NtYXJ0LWNvbm5lY3QtYnRuJyk7XG5cbiAgLy8gUGhhc2UgZWxlbWVudHNcbiAgY29uc3QgcGhhc2VEZXRlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc21hcnQtcGhhc2UtZGV0ZWN0Jyk7XG4gIGNvbnN0IHBoYXNlQ3JlZGVudGlhbHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc21hcnQtcGhhc2UtY3JlZGVudGlhbHMnKTtcbiAgY29uc3QgcGhhc2VQcm9ncmVzcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzbWFydC1waGFzZS1wcm9ncmVzcycpO1xuICBjb25zdCBwaGFzZVJlc3VsdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc21hcnQtcGhhc2UtcmVzdWx0cycpO1xuXG4gIGNvbnN0IGRldGVjdFJlc3VsdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc21hcnQtZGV0ZWN0LXJlc3VsdHMnKTtcbiAgY29uc3QgY3JlZGVudGlhbElucHV0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzbWFydC1jcmVkZW50aWFsLWlucHV0cycpO1xuICBjb25zdCBwcm9ncmVzc1N0ZXBzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NtYXJ0LXByb2dyZXNzLXN0ZXBzJyk7XG4gIGNvbnN0IHJlc3VsdHNDb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NtYXJ0LXJlc3VsdHMtY29udGVudCcpO1xuICBjb25zdCBwbGV4TGlicmFyaWVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NtYXJ0LXBsZXgtbGlicmFyaWVzJyk7XG4gIGNvbnN0IHJldHJ5QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NtYXJ0LXJldHJ5LWJ0bicpO1xuXG4gIGxldCBkZXRlY3RlZERhdGEgPSBudWxsOyAvLyBTdG9yZSBkZXRlY3Rpb24gcmVzdWx0cyBmb3Igc21hcnQtY29ubmVjdFxuXG4gIGNvbnN0IHNlcnZpY2VJY29ucyA9IHsgcGxleDogJ1x1RDgzQ1x1REZBQycsIHJhZGFycjogJ1x1RDgzQ1x1REZBQycsIHNvbmFycjogJ1x1RDgzRFx1RENGQScsIHByb3dsYXJyOiAnXHVEODNEXHVERDBEJywgc2VlcnI6ICdcdUQ4M0RcdURDQ0InIH07XG4gIGNvbnN0IHNlcnZpY2VMYWJlbHMgPSB7IHBsZXg6ICdQbGV4JywgcmFkYXJyOiAnUmFkYXJyIChNb3ZpZXMpJywgc29uYXJyOiAnU29uYXJyIChUViknLCBwcm93bGFycjogJ1Byb3dsYXJyIChJbmRleGVycyknLCBzZWVycjogJ1NlZXJyJyB9O1xuXG4gIGZ1bmN0aW9uIHNob3dQaGFzZShwaGFzZSkge1xuICAgIHBoYXNlRGV0ZWN0LnN0eWxlLmRpc3BsYXkgPSBwaGFzZSA9PT0gJ2RldGVjdCcgPyAnYmxvY2snIDogJ25vbmUnO1xuICAgIHBoYXNlQ3JlZGVudGlhbHMuc3R5bGUuZGlzcGxheSA9IHBoYXNlID09PSAnY3JlZGVudGlhbHMnID8gJ2Jsb2NrJyA6ICdub25lJztcbiAgICBwaGFzZVByb2dyZXNzLnN0eWxlLmRpc3BsYXkgPSBwaGFzZSA9PT0gJ3Byb2dyZXNzJyA/ICdibG9jaycgOiAnbm9uZSc7XG4gICAgcGhhc2VSZXN1bHRzLnN0eWxlLmRpc3BsYXkgPSBwaGFzZSA9PT0gJ3Jlc3VsdHMnID8gJ2Jsb2NrJyA6ICdub25lJztcbiAgfVxuXG4gIGZ1bmN0aW9uIHN0YXR1c0JhZGdlKHN0YXR1cykge1xuICAgIGNvbnN0IGNvbG9ycyA9IHtcbiAgICAgIGNvbm5lY3RlZDogeyBiZzogJ3ZhcigtLW9rLWZnKScsIGljb246ICcmIzEwMDAzOycsIHRleHQ6ICdDb25uZWN0ZWQnIH0sXG4gICAgICBuZWVkc19rZXk6IHsgYmc6ICcjZjM5YzEyJywgaWNvbjogJyYjMTI4MjczOycsIHRleHQ6ICdOZWVkcyBBUEkgS2V5JyB9LFxuICAgICAgbm90X2ZvdW5kOiB7IGJnOiAndmFyKC0tbXV0ZWQpJywgaWNvbjogJyZtZGFzaDsnLCB0ZXh0OiAnTm90IEZvdW5kJyB9LFxuICAgICAgZXJyb3I6IHsgYmc6ICd2YXIoLS1iYWQtZmcpJywgaWNvbjogJyYjMTAwMDc7JywgdGV4dDogJ0Vycm9yJyB9XG4gICAgfTtcbiAgICBjb25zdCBjID0gY29sb3JzW3N0YXR1c10gfHwgY29sb3JzLm5vdF9mb3VuZDtcbiAgICByZXR1cm4gYDxzcGFuIHN0eWxlPVwiZGlzcGxheTogaW5saW5lLWZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogNHB4OyBwYWRkaW5nOiAycHggOHB4OyBib3JkZXItcmFkaXVzOiA0cHg7IGZvbnQtc2l6ZTogMC43NXJlbTsgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsICR7Yy5iZ30gMjAlLCB0cmFuc3BhcmVudCk7IGNvbG9yOiAke2MuYmd9O1wiPiR7Yy5pY29ufSAke2MudGV4dH08L3NwYW4+YDtcbiAgfVxuXG4gIC8vIFBoYXNlIDE6IFNtYXJ0IERldGVjdGlvblxuICBhc3luYyBmdW5jdGlvbiBzbWFydERldGVjdCgpIHtcbiAgICBzaG93UGhhc2UoJ2RldGVjdCcpO1xuICAgIGRldGVjdFJlc3VsdHMuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2Fyci9zbWFydC1kZXRlY3QnKTtcbiAgICAgIGRldGVjdGVkRGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcblxuICAgICAgaWYgKCFkZXRlY3RlZERhdGEuc3VjY2Vzcykge1xuICAgICAgICBkZXRlY3RSZXN1bHRzLmlubmVySFRNTCA9IGA8ZGl2IHN0eWxlPVwicGFkZGluZzogMTJweDsgY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RGV0ZWN0aW9uIGZhaWxlZDogJHtlc2NhcGVIdG1sKGRldGVjdGVkRGF0YS5lcnJvcil9PC9kaXY+YDtcbiAgICAgICAgZGV0ZWN0UmVzdWx0cy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBSZW5kZXIgZGV0ZWN0aW9uIHJlc3VsdHNcbiAgICAgIGxldCBodG1sID0gJzxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDhweDtcIj4nO1xuXG4gICAgICBmb3IgKGNvbnN0IFtzdmMsIGluZm9dIG9mIE9iamVjdC5lbnRyaWVzKGRldGVjdGVkRGF0YS5zZXJ2aWNlcykpIHtcbiAgICAgICAgY29uc3QgaWNvbiA9IHNlcnZpY2VJY29uc1tzdmNdIHx8ICdcdUQ4M0RcdURDRTYnO1xuICAgICAgICBjb25zdCBsYWJlbCA9IHNlcnZpY2VMYWJlbHNbc3ZjXSB8fCBzdmM7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IGluZm8uc291cmNlID8gYDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAwLjdyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IHBhZGRpbmc6IDFweCA2cHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmcpOyBib3JkZXItcmFkaXVzOiAzcHg7XCI+JHtlc2NhcGVIdG1sKGluZm8uc291cmNlKX08L3NwYW4+YCA6ICcnO1xuICAgICAgICBjb25zdCB2ZXJzaW9uID0gaW5mby52ZXJzaW9uID8gYDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAwLjdyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+diR7ZXNjYXBlSHRtbChpbmZvLnZlcnNpb24pfTwvc3Bhbj5gIDogJyc7XG4gICAgICAgIGNvbnN0IGtleVNhdmVkID0gKGluZm8uaGFzQXBpS2V5IHx8IGluZm8uaGFzVG9rZW4pICYmIGluZm8uc3RhdHVzID09PSAnY29ubmVjdGVkJ1xuICAgICAgICAgID8gJzxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAwLjdyZW07IGNvbG9yOiB2YXIoLS1vay1mZyk7XCI+S2V5IHNhdmVkPC9zcGFuPicgOiAnJztcblxuICAgICAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiAxMHB4OyBwYWRkaW5nOiAxMHB4IDEycHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGJvcmRlci1yYWRpdXM6IDhweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTogMS4xcmVtO1wiPiR7aWNvbn08L3NwYW4+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImZsZXg6IDE7XCI+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6IDUwMDsgZm9udC1zaXplOiAwLjlyZW07XCI+JHtsYWJlbH08L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDZweDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZmxleC13cmFwOiB3cmFwO1wiPlxuICAgICAgICAgICAgICAke3NvdXJjZX0gJHt2ZXJzaW9ufSAke2tleVNhdmVkfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgJHtzdGF0dXNCYWRnZShpbmZvLnN0YXR1cyl9XG4gICAgICAgIDwvZGl2PmA7XG4gICAgICB9XG5cbiAgICAgIGh0bWwgKz0gJzwvZGl2Pic7XG5cbiAgICAgIC8vIFN1bW1hcnlcbiAgICAgIGNvbnN0IHMgPSBkZXRlY3RlZERhdGEuc3VtbWFyeTtcbiAgICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAxMnB4OyBwYWRkaW5nOiAxMHB4OyBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tYWNjZW50KSA4JSwgdHJhbnNwYXJlbnQpOyBib3JkZXItcmFkaXVzOiA4cHg7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj5cbiAgICAgICAgJHtlc2NhcGVIdG1sKFN0cmluZyhzLmZ1bGx5Q29ubmVjdGVkKSl9LyR7ZXNjYXBlSHRtbChTdHJpbmcocy50b3RhbERldGVjdGVkICsgKDUgLSBzLnRvdGFsRGV0ZWN0ZWQpKSl9IHNlcnZpY2VzIGRldGVjdGVkICZtaWRkb3Q7XG4gICAgICAgICR7ZXNjYXBlSHRtbChTdHJpbmcocy5mdWxseUNvbm5lY3RlZCkpfSBjb25uZWN0ZWQke3MubmVlZHNBcGlLZXkgPiAwID8gYCAmbWlkZG90OyA8c3Ryb25nPiR7ZXNjYXBlSHRtbChTdHJpbmcocy5uZWVkc0FwaUtleSkpfSBuZWVkcyBBUEkga2V5PC9zdHJvbmc+YCA6ICcnfVxuICAgICAgPC9kaXY+YDtcblxuICAgICAgZGV0ZWN0UmVzdWx0cy5pbm5lckhUTUwgPSBodG1sO1xuICAgICAgZGV0ZWN0UmVzdWx0cy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcblxuICAgICAgLy8gQnVpbGQgY3JlZGVudGlhbCBpbnB1dHMgZm9yIHNlcnZpY2VzIHRoYXQgbmVlZCBrZXlzXG4gICAgICBidWlsZENyZWRlbnRpYWxJbnB1dHMoZGV0ZWN0ZWREYXRhKTtcblxuICAgICAgLy8gQXV0by1hZHZhbmNlIGFmdGVyIGEgc2hvcnQgZGVsYXlcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBzaG93UGhhc2UoJ2NyZWRlbnRpYWxzJyk7XG4gICAgICB9LCA4MDApO1xuXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZGV0ZWN0UmVzdWx0cy5pbm5lckhUTUwgPSBgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDEycHg7IGNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPkVycm9yOiAke2VzY2FwZUh0bWwoZS5tZXNzYWdlKX08L2Rpdj5gO1xuICAgICAgZGV0ZWN0UmVzdWx0cy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICB9XG4gIH1cblxuICAvLyBCdWlsZCBjcmVkZW50aWFsIGlucHV0IGZpZWxkc1xuICBmdW5jdGlvbiBidWlsZENyZWRlbnRpYWxJbnB1dHMoZGF0YSkge1xuICAgIGxldCBodG1sID0gJyc7XG4gICAgY29uc3Qgc2VydmljZXMgPSBkYXRhLnNlcnZpY2VzO1xuICAgIGNvbnN0IGFyclNlcnZpY2VzID0gWydyYWRhcnInLCAnc29uYXJyJywgJ3Byb3dsYXJyJ107XG5cbiAgICBmb3IgKGNvbnN0IHN2YyBvZiBhcnJTZXJ2aWNlcykge1xuICAgICAgY29uc3QgaW5mbyA9IHNlcnZpY2VzW3N2Y107XG4gICAgICBpZiAoIWluZm8gfHwgaW5mby5zdGF0dXMgPT09ICdub3RfZm91bmQnICYmICFpbmZvLnVybCkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IGljb24gPSBzZXJ2aWNlSWNvbnNbc3ZjXTtcbiAgICAgIGNvbnN0IGxhYmVsID0gc2VydmljZUxhYmVsc1tzdmNdO1xuICAgICAgY29uc3QgaXNDb25uZWN0ZWQgPSBpbmZvLnN0YXR1cyA9PT0gJ2Nvbm5lY3RlZCc7XG4gICAgICBjb25zdCBib3JkZXJDb2xvciA9IGlzQ29ubmVjdGVkID8gJ3ZhcigtLW9rLWZnKScgOiAndmFyKC0tYm9yZGVyKSc7XG5cbiAgICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAxMHB4OyBwYWRkaW5nOiAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpOyBib3JkZXItcmFkaXVzOiA4cHg7IGJvcmRlcjogMXB4IHNvbGlkICR7Ym9yZGVyQ29sb3J9O1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA4cHg7IG1hcmdpbi1ib3R0b206IDhweDtcIj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTogMS4xcmVtO1wiPiR7aWNvbn08L3NwYW4+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXdlaWdodDogNTAwO1wiPiR7bGFiZWx9PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGlkPVwic21hcnQtJHtzdmN9LXN0YXR1c1wiIHN0eWxlPVwibWFyZ2luLWxlZnQ6IGF1dG87IGZvbnQtc2l6ZTogMC43NXJlbTtcIj5cbiAgICAgICAgICAgICR7aXNDb25uZWN0ZWQgPyAnPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tb2stZmcpO1wiPiYjMTAwMDM7IENvbm5lY3RlZDwvc3Bhbj4nIDogJyd9XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogMmZyIDFmcjsgZ2FwOiA4cHg7XCI+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5VUkw6PC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwic21hcnQtJHtzdmN9LXVybFwiIHZhbHVlPVwiJHtlc2NhcGVIdG1sKGluZm8udXJsIHx8ICcnKX1cIiBwbGFjZWhvbGRlcj1cImh0dHBzOi8vc2VlZGJveC5jb20vJHtzdmN9L1wiXG4gICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJTsgZm9udC1zaXplOiAwLjg1cmVtOyBwYWRkaW5nOiA2cHggOHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNHB4O1wiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5BUEkgS2V5OjwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInBhc3N3b3JkXCIgaWQ9XCJzbWFydC0ke3N2Y30ta2V5XCIgcGxhY2Vob2xkZXI9XCIke2lzQ29ubmVjdGVkID8gJyhzYXZlZCknIDogJ1Bhc3RlIEFQSSBrZXknfVwiXG4gICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJTsgZm9udC1zaXplOiAwLjg1cmVtOyBwYWRkaW5nOiA2cHggOHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNHB4O1wiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8YnV0dG9uIG9uY2xpY2s9XCJzbWFydFRlc3RDb25uZWN0aW9uKCcke3N2Y30nKVwiIHN0eWxlPVwibWFyZ2luLXRvcDogOHB4OyBwYWRkaW5nOiA0cHggMTJweDsgZm9udC1zaXplOiAwLjc1cmVtOyBjdXJzb3I6IHBvaW50ZXI7XCI+VGVzdDwvYnV0dG9uPlxuICAgICAgPC9kaXY+YDtcbiAgICB9XG5cbiAgICAvLyBQbGV4IHN0YXR1cyAobm9uLWVkaXRhYmxlLCBqdXN0IHNob3dzIHN0YXR1cylcbiAgICBjb25zdCBwbGV4ID0gc2VydmljZXMucGxleDtcbiAgICBpZiAocGxleCkge1xuICAgICAgY29uc3QgcGxleENvbm5lY3RlZCA9IHBsZXguc3RhdHVzID09PSAnY29ubmVjdGVkJztcbiAgICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAxMHB4IDEycHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGJvcmRlci1yYWRpdXM6IDhweDsgYm9yZGVyOiAxcHggc29saWQgJHtwbGV4Q29ubmVjdGVkID8gJ3ZhcigtLW9rLWZnKScgOiAndmFyKC0tYm9yZGVyKSd9OyBtYXJnaW4tYm90dG9tOiAxMHB4O1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA4cHg7XCI+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6IDEuMXJlbTtcIj5cdUQ4M0NcdURGQUM8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXdlaWdodDogNTAwO1wiPlBsZXg8L3NwYW4+XG4gICAgICAgICAgJHtzdGF0dXNCYWRnZShwbGV4LnN0YXR1cyl9XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJtYXJnaW4tbGVmdDogYXV0bzsgZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPiR7ZXNjYXBlSHRtbChwbGV4LnNvdXJjZSB8fCAnJyl9PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PmA7XG4gICAgfVxuXG4gICAgLy8gU2VlcnIgc3RhdHVzXG4gICAgY29uc3Qgc2VlcnIgPSBzZXJ2aWNlcy5zZWVycjtcbiAgICBpZiAoc2VlcnIpIHtcbiAgICAgIGNvbnN0IHNlZXJyT2sgPSBzZWVyci5zdGF0dXMgPT09ICdjb25uZWN0ZWQnO1xuICAgICAgbGV0IGNvbmZpZ3VyZWRIdG1sID0gJyc7XG4gICAgICBpZiAoc2VlcnIuY29uZmlndXJlZFNlcnZpY2VzKSB7XG4gICAgICAgIGNvbnN0IGNzID0gc2VlcnIuY29uZmlndXJlZFNlcnZpY2VzO1xuICAgICAgICBjb25maWd1cmVkSHRtbCA9IGA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tdG9wOiA0cHg7XCI+XG4gICAgICAgICAgQ29uZmlndXJlZDogJHtjcy5yYWRhcnIgPyAnJiMxMDAwMzsgUmFkYXJyJyA6ICcmIzEwMDA3OyBSYWRhcnInfSAmbWlkZG90O1xuICAgICAgICAgICR7Y3Muc29uYXJyID8gJyYjMTAwMDM7IFNvbmFycicgOiAnJiMxMDAwNzsgU29uYXJyJ30gJm1pZGRvdDtcbiAgICAgICAgICAke2NzLnBsZXggPyAnJiMxMDAwMzsgUGxleCcgOiAnJiMxMDAwNzsgUGxleCd9XG4gICAgICAgIDwvZGl2PmA7XG4gICAgICB9XG4gICAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwicGFkZGluZzogMTBweCAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpOyBib3JkZXItcmFkaXVzOiA4cHg7IGJvcmRlcjogMXB4IHNvbGlkICR7c2VlcnJPayA/ICd2YXIoLS1vay1mZyknIDogJ3ZhcigtLWJvcmRlciknfTtcIj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogOHB4O1wiPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAxLjFyZW07XCI+XHVEODNEXHVEQ0NCPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC13ZWlnaHQ6IDUwMDtcIj5TZWVycjwvc3Bhbj5cbiAgICAgICAgICAke3N0YXR1c0JhZGdlKHNlZXJyLnN0YXR1cyl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgICAke2NvbmZpZ3VyZWRIdG1sfVxuICAgICAgPC9kaXY+YDtcbiAgICB9XG5cbiAgICBjcmVkZW50aWFsSW5wdXRzLmlubmVySFRNTCA9IGh0bWw7XG4gIH1cblxuICAvLyBUZXN0IGNvbm5lY3Rpb24gKGdsb2JhbCBmb3Igb25jbGljaylcbiAgd2luZG93LnNtYXJ0VGVzdENvbm5lY3Rpb24gPSBhc3luYyBmdW5jdGlvbihzZXJ2aWNlKSB7XG4gICAgY29uc3QgdXJsSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc21hcnQtJHtzZXJ2aWNlfS11cmxgKTtcbiAgICBjb25zdCBrZXlJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzbWFydC0ke3NlcnZpY2V9LWtleWApO1xuICAgIGNvbnN0IHN0YXR1c1NwYW4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc21hcnQtJHtzZXJ2aWNlfS1zdGF0dXNgKTtcblxuICAgIGNvbnN0IHVybCA9IHVybElucHV0Py52YWx1ZS50cmltKCk7XG4gICAgY29uc3QgYXBpS2V5ID0ga2V5SW5wdXQ/LnZhbHVlLnRyaW0oKTtcblxuICAgIGlmICghdXJsIHx8ICFhcGlLZXkpIHtcbiAgICAgIHN0YXR1c1NwYW4uaW5uZXJIVE1MID0gJzxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RW50ZXIgVVJMIGFuZCBBUEkga2V5PC9zcGFuPic7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3RhdHVzU3Bhbi5pbm5lckhUTUwgPSAnPHNwYW4gY2xhc3M9XCJicmFuZC1zcGlubmVyXCI+PC9zcGFuPic7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9hcnIvdGVzdC1jb25uZWN0aW9uJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgc2VydmljZSwgdXJsLCBhcGlLZXkgfSlcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgc3RhdHVzU3Bhbi5pbm5lckhUTUwgPSBgPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tb2stZmcpO1wiPiYjMTAwMDM7ICR7ZXNjYXBlSHRtbChkYXRhLmFwcE5hbWUgfHwgJ0Nvbm5lY3RlZCcpfSB2JHtlc2NhcGVIdG1sKGRhdGEudmVyc2lvbiB8fCAnJyl9PC9zcGFuPmA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0dXNTcGFuLmlubmVySFRNTCA9IGA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPiYjMTAwMDc7ICR7ZXNjYXBlSHRtbChkYXRhLmVycm9yKX08L3NwYW4+YDtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzdGF0dXNTcGFuLmlubmVySFRNTCA9IGA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPiYjMTAwMDc7ICR7ZXNjYXBlSHRtbChlLm1lc3NhZ2UpfTwvc3Bhbj5gO1xuICAgIH1cbiAgfTtcblxuICAvLyBQaGFzZSAzOiBTbWFydCBDb25uZWN0XG4gIGFzeW5jIGZ1bmN0aW9uIHNtYXJ0Q29ubmVjdCgpIHtcbiAgICBzaG93UGhhc2UoJ3Byb2dyZXNzJyk7XG4gICAgcHJvZ3Jlc3NTdGVwcy5pbm5lckhUTUwgPSAnPGRpdiBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogMjBweDtcIj48c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+PGRpdiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi10b3A6IDhweDtcIj5Db25uZWN0aW5nIHNlcnZpY2VzLi4uPC9kaXY+PC9kaXY+JztcblxuICAgIC8vIEdhdGhlciBpbnB1dFxuICAgIGNvbnN0IHNlcnZpY2VzID0ge307XG4gICAgZm9yIChjb25zdCBzdmMgb2YgWydyYWRhcnInLCAnc29uYXJyJywgJ3Byb3dsYXJyJ10pIHtcbiAgICAgIGNvbnN0IHVybCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzbWFydC0ke3N2Y30tdXJsYCk/LnZhbHVlLnRyaW0oKTtcbiAgICAgIGNvbnN0IGFwaUtleSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzbWFydC0ke3N2Y30ta2V5YCk/LnZhbHVlLnRyaW0oKTtcbiAgICAgIGlmIChhcGlLZXkgJiYgdXJsKSB7XG4gICAgICAgIHNlcnZpY2VzW3N2Y10gPSB7IGFwaUtleSwgdXJsIH07XG4gICAgICB9IGVsc2UgaWYgKGFwaUtleSkge1xuICAgICAgICAvLyBLZXkgcHJvdmlkZWQgd2l0aG91dCBVUkwgLSBsZXQgYmFja2VuZCByZXNvbHZlXG4gICAgICAgIHNlcnZpY2VzW3N2Y10gPSB7IGFwaUtleSB9O1xuICAgICAgfVxuICAgICAgLy8gSWYgbm8ga2V5IGVudGVyZWQgYnV0IHNlcnZpY2Ugd2FzIGFscmVhZHkgY29ubmVjdGVkLCBiYWNrZW5kIHVzZXMgc3RvcmVkIGNyZWRlbnRpYWxzXG4gICAgfVxuXG4gICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgIHNlcnZpY2VzOiBPYmplY3Qua2V5cyhzZXJ2aWNlcykubGVuZ3RoID4gMCA/IHNlcnZpY2VzIDogdW5kZWZpbmVkLFxuICAgICAgY29uZmlndXJlUGxleDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NtYXJ0LW9wdC1wbGV4Jyk/LmNoZWNrZWQsXG4gICAgICBjb25maWd1cmVQcm93bGFycjogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NtYXJ0LW9wdC1wcm93bGFycicpPy5jaGVja2VkLFxuICAgICAgY29uZmlndXJlU2VlcnI6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzbWFydC1vcHQtc2VlcnInKT8uY2hlY2tlZCxcbiAgICAgIHNhdmVDcmVkZW50aWFsczogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NtYXJ0LW9wdC1zYXZlJyk/LmNoZWNrZWRcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvYXJyL3NtYXJ0LWNvbm5lY3QnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocGF5bG9hZClcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuXG4gICAgICAvLyBSZW5kZXIgcHJvZ3Jlc3Mgc3RlcHNcbiAgICAgIGxldCBzdGVwc0h0bWwgPSAnJztcbiAgICAgIGZvciAoY29uc3Qgc3RlcCBvZiAoZGF0YS5zdGVwcyB8fCBbXSkpIHtcbiAgICAgICAgY29uc3QgaWNvbiA9IHN0ZXAuc3RhdHVzID09PSAnc3VjY2VzcycgPyAnPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tb2stZmcpO1wiPiYjMTAwMDM7PC9zcGFuPidcbiAgICAgICAgICAgICAgICAgICA6ICc8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPiYjMTAwMDc7PC9zcGFuPic7XG4gICAgICAgIGNvbnN0IGRldGFpbENvbG9yID0gc3RlcC5zdGF0dXMgPT09ICdzdWNjZXNzJyA/ICd2YXIoLS1tdXRlZCknIDogJ3ZhcigtLWJhZC1mZyknO1xuICAgICAgICBzdGVwc0h0bWwgKz0gYDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDhweDsgcGFkZGluZzogNnB4IDEwcHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGJvcmRlci1yYWRpdXM6IDZweDsgZm9udC1zaXplOiAwLjg1cmVtO1wiPlxuICAgICAgICAgICR7aWNvbn1cbiAgICAgICAgICA8c3Bhbj4ke2VzY2FwZUh0bWwoc3RlcC5zdGVwKX08L3NwYW4+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJtYXJnaW4tbGVmdDogYXV0bzsgZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogJHtkZXRhaWxDb2xvcn07XCI+JHtlc2NhcGVIdG1sKHN0ZXAuZGV0YWlscyB8fCAnJyl9PC9zcGFuPlxuICAgICAgICA8L2Rpdj5gO1xuICAgICAgfVxuICAgICAgcHJvZ3Jlc3NTdGVwcy5pbm5lckhUTUwgPSBzdGVwc0h0bWw7XG5cbiAgICAgIC8vIFNob3cgcmVzdWx0cyBhZnRlciBicmllZiBkZWxheVxuICAgICAgc2V0VGltZW91dCgoKSA9PiBzaG93UmVzdWx0cyhkYXRhKSwgNTAwKTtcblxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHByb2dyZXNzU3RlcHMuaW5uZXJIVE1MID0gYDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAxMnB4OyBjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5Db25uZWN0aW9uIGVycm9yOiAke2VzY2FwZUh0bWwoZS5tZXNzYWdlKX08L2Rpdj5gO1xuICAgIH1cbiAgfVxuXG4gIC8vIFBoYXNlIDQ6IFJlc3VsdHNcbiAgZnVuY3Rpb24gc2hvd1Jlc3VsdHMoZGF0YSkge1xuICAgIHNob3dQaGFzZSgncmVzdWx0cycpO1xuXG4gICAgY29uc3QgcyA9IGRhdGEuc3VtbWFyeSB8fCB7fTtcbiAgICBjb25zdCBhbGxHb29kID0gcy5mYWlsZWQgPT09IDAgJiYgcy5zdWNjZWVkZWQgPiAwO1xuICAgIGNvbnN0IGhlYWRlckNvbG9yID0gYWxsR29vZCA/ICd2YXIoLS1vay1mZyknIDogJyNmMzljMTInO1xuICAgIGNvbnN0IGhlYWRlckljb24gPSBhbGxHb29kID8gJyYjMTAwMDM7JyA6ICcmIzk4ODg7JztcbiAgICBjb25zdCBoZWFkZXJUZXh0ID0gYWxsR29vZCA/ICdBbGwgQ29ubmVjdGVkIScgOiBgJHtlc2NhcGVIdG1sKFN0cmluZyhzLnN1Y2NlZWRlZCkpfS8ke2VzY2FwZUh0bWwoU3RyaW5nKHMudG90YWxTdGVwcykpfSBTdGVwcyBTdWNjZWVkZWRgO1xuXG4gICAgbGV0IGh0bWwgPSBgPGRpdiBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogMTZweDsgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsICR7aGVhZGVyQ29sb3J9IDEyJSwgdHJhbnNwYXJlbnQpOyBib3JkZXItcmFkaXVzOiAxMHB4OyBib3JkZXI6IDFweCBzb2xpZCAke2hlYWRlckNvbG9yfTsgbWFyZ2luLWJvdHRvbTogMTJweDtcIj5cbiAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDEuNXJlbTsgY29sb3I6ICR7aGVhZGVyQ29sb3J9O1wiPiR7aGVhZGVySWNvbn08L2Rpdj5cbiAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDEuMXJlbTsgZm9udC13ZWlnaHQ6IDYwMDsgY29sb3I6ICR7aGVhZGVyQ29sb3J9O1wiPiR7aGVhZGVyVGV4dH08L2Rpdj5cbiAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuODVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi10b3A6IDRweDtcIj4ke2VzY2FwZUh0bWwoU3RyaW5nKHMuc3VjY2VlZGVkKSl9IHN1Y2NlZWRlZCwgJHtlc2NhcGVIdG1sKFN0cmluZyhzLmZhaWxlZCkpfSBmYWlsZWQ8L2Rpdj5cbiAgICA8L2Rpdj5gO1xuXG4gICAgLy8gU3RlcHMgZGV0YWlsXG4gICAgaHRtbCArPSAnPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogNHB4O1wiPic7XG4gICAgZm9yIChjb25zdCBzdGVwIG9mIChkYXRhLnN0ZXBzIHx8IFtdKSkge1xuICAgICAgY29uc3QgaWNvbiA9IHN0ZXAuc3RhdHVzID09PSAnc3VjY2VzcycgPyAnPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tb2stZmcpO1wiPiYjMTAwMDM7PC9zcGFuPidcbiAgICAgICAgICAgICAgICAgOiAnPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj4mIzEwMDA3Ozwvc3Bhbj4nO1xuICAgICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogOHB4OyBwYWRkaW5nOiA0cHggOHB4OyBmb250LXNpemU6IDAuOHJlbTtcIj5cbiAgICAgICAgJHtpY29ufSAke2VzY2FwZUh0bWwoc3RlcC5zdGVwKX0gPHNwYW4gc3R5bGU9XCJtYXJnaW4tbGVmdDogYXV0bzsgY29sb3I6IHZhcigtLW11dGVkKTsgZm9udC1zaXplOiAwLjc1cmVtO1wiPiR7ZXNjYXBlSHRtbChzdGVwLmRldGFpbHMgfHwgJycpfTwvc3Bhbj5cbiAgICAgIDwvZGl2PmA7XG4gICAgfVxuICAgIGh0bWwgKz0gJzwvZGl2Pic7XG5cbiAgICByZXN1bHRzQ29udGVudC5pbm5lckhUTUwgPSBodG1sO1xuXG4gICAgLy8gU2hvdyByZXRyeSBidXR0b24gaWYgYW55IGZhaWx1cmVzXG4gICAgcmV0cnlCdG4uc3R5bGUuZGlzcGxheSA9IHMuZmFpbGVkID4gMCA/ICdibG9jaycgOiAnbm9uZSc7XG5cbiAgICAvLyBGZXRjaCBQbGV4IGxpYnJhcmllcyBpZiBQbGV4IHdhcyBjb25uZWN0ZWRcbiAgICBpZiAoZGF0YS5zdGVwcz8uc29tZShzdCA9PiBzdC5zdGVwLmluY2x1ZGVzKCdQbGV4JykgJiYgc3Quc3RhdHVzID09PSAnc3VjY2VzcycpKSB7XG4gICAgICBmZXRjaFBsZXhMaWJyYXJpZXMoKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBmZXRjaFBsZXhMaWJyYXJpZXMoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL3BsZXgvbGlicmFyaWVzJyk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MgJiYgZGF0YS5saWJyYXJpZXM/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgbGV0IGh0bWwgPSBgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDEycHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGJvcmRlci1yYWRpdXM6IDhweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5cbiAgICAgICAgICA8aDQgc3R5bGU9XCJtYXJnaW46IDAgMCA4cHg7IGZvbnQtc2l6ZTogMC44NXJlbTsgY29sb3I6IHZhcigtLWFjY2VudCk7XCI+XHVEODNDXHVERkFDICR7ZXNjYXBlSHRtbChkYXRhLnNlcnZlck5hbWUpfSBMaWJyYXJpZXM8L2g0PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBmbGV4LXdyYXA6IHdyYXA7IGdhcDogOHB4O1wiPmA7XG4gICAgICAgIGZvciAoY29uc3QgbGliIG9mIGRhdGEubGlicmFyaWVzKSB7XG4gICAgICAgICAgY29uc3QgdHlwZUljb24gPSBsaWIudHlwZSA9PT0gJ21vdmllJyA/ICdcdUQ4M0NcdURGQUMnIDogbGliLnR5cGUgPT09ICdzaG93JyA/ICdcdUQ4M0RcdURDRkEnIDogJ1x1RDgzQ1x1REZCNSc7XG4gICAgICAgICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDhweCAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgYm9yZGVyLXJhZGl1czogNnB4OyBmb250LXNpemU6IDAuODVyZW07XCI+XG4gICAgICAgICAgICAke3R5cGVJY29ufSA8c3Ryb25nPiR7ZXNjYXBlSHRtbChsaWIudGl0bGUpfTwvc3Ryb25nPlxuICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpOyBmb250LXNpemU6IDAuNzVyZW07XCI+JHtlc2NhcGVIdG1sKFN0cmluZyhsaWIuY291bnQpKX0gaXRlbXM8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+YDtcbiAgICAgICAgfVxuICAgICAgICBodG1sICs9ICc8L2Rpdj48L2Rpdj4nO1xuICAgICAgICBwbGV4TGlicmFyaWVzLmlubmVySFRNTCA9IGh0bWw7XG4gICAgICAgIHBsZXhMaWJyYXJpZXMuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gSWdub3JlIFBsZXggbGlicmFyeSBmZXRjaCBlcnJvcnNcbiAgICB9XG4gIH1cblxuICAvLyBFdmVudCBsaXN0ZW5lcnNcbiAgb3BlbkJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICAgIHBsZXhMaWJyYXJpZXMuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBzbWFydERldGVjdCgpO1xuICB9KTtcblxuICB3aXJlTW9kYWwobW9kYWwsIGNhbmNlbEJ0bik7XG4gIGNvbm5lY3RCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc21hcnRDb25uZWN0KTtcbiAgcmV0cnlCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc21hcnRDb25uZWN0KTtcbn0pKCk7XG47XG4vLyA9PT09PT09PT09IE5PVElGSUNBVElPTiBTRVRUSU5HUyA9PT09PT09PT09XG4oZnVuY3Rpb24oKSB7XG4gIGNvbnN0IGVycm9ySGFuZGxlciA9IG5ldyBFcnJvckhhbmRsZXIoKTtcbiAgLy8gSW5qZWN0IG1vZGFsIEhUTUxcbiAgaW5qZWN0TW9kYWwoJ25vdGlmaWNhdGlvbnMtbW9kYWwnLCBgPGRpdiBpZD1cIm5vdGlmaWNhdGlvbnMtbW9kYWxcIiBjbGFzcz1cIndlYXRoZXItbW9kYWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1jb250ZW50XCIgc3R5bGU9XCJtaW4td2lkdGg6IDU1MHB4OyBtYXgtd2lkdGg6IDY1MHB4O1wiPlxuICAgICAgPGgzPlx1RDgzRFx1REQxNCBOb3RpZmljYXRpb24gU2V0dGluZ3M8L2gzPlxuXG4gICAgICA8IS0tIE1hc3RlciBUb2dnbGUgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiYWNjZW50LWluZm8tYm94XCI+XG4gICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogMTBweDsgY3Vyc29yOiBwb2ludGVyO1wiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cIm5vdGlmaWNhdGlvbnMtZW5hYmxlZFwiIC8+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC13ZWlnaHQ6IDYwMDsgY29sb3I6IHZhcigtLWFjY2VudCk7XCI+RW5hYmxlIE5vdGlmaWNhdGlvbnM8L3NwYW4+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC10aW55LW11dGVkXCI+UmVjZWl2ZSBhbGVydHMgd2hlbiBjb250YWluZXJzIGdvIHVwL2Rvd248L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFByb3ZpZGVycyBTZWN0aW9uIC0tPlxuICAgICAgPGg0IGNsYXNzPVwic2VjdGlvbi1oZWFkaW5nXCI+Tm90aWZpY2F0aW9uIFByb3ZpZGVyczwvaDQ+XG5cbiAgICAgIDwhLS0gRGlzY29yZCAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJub3RpZmljYXRpb24tcHJvdmlkZXIgcHJvdmlkZXItY2FyZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicHJvdmlkZXItaGVhZGVyXCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtbGFiZWxcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImRpc2NvcmQtZW5hYmxlZFwiIC8+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZ3LTUwMFwiPkRpc2NvcmQ8L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiZGlzY29yZC10ZXN0XCIgY2xhc3M9XCJ0ZXN0LWJ0biBidG4teHNcIj5UZXN0PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwiZGlzY29yZC1jb25maWdcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWwtc21cIj5XZWJob29rIFVSTDo8L2xhYmVsPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZGlzY29yZC13ZWJob29rXCIgcGxhY2Vob2xkZXI9XCJodHRwczovL2Rpc2NvcmQuY29tL2FwaS92MS93ZWJob29rcy8uLi5cIiBzdHlsZT1cIndpZHRoOiAxMDAlO1wiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gVGVsZWdyYW0gLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwibm90aWZpY2F0aW9uLXByb3ZpZGVyIHByb3ZpZGVyLWNhcmRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInByb3ZpZGVyLWhlYWRlclwiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LWxhYmVsXCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJ0ZWxlZ3JhbS1lbmFibGVkXCIgLz5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZnctNTAwXCI+VGVsZWdyYW08L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwidGVsZWdyYW0tdGVzdFwiIGNsYXNzPVwidGVzdC1idG4gYnRuLXhzXCI+VGVzdDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cInRlbGVncmFtLWNvbmZpZ1wiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZC0yY29sXCI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbC1zbVwiPkJvdCBUb2tlbjo8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInRlbGVncmFtLWJvdC10b2tlblwiIHBsYWNlaG9sZGVyPVwiMTIzNDU2OkFCQy4uLlwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpZWxkLWxhYmVsLXNtXCI+Q2hhdCBJRDo8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInRlbGVncmFtLWNoYXQtaWRcIiBwbGFjZWhvbGRlcj1cIi0xMDAxMjM0NTY3ODkwXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIG50Znkuc2ggLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwibm90aWZpY2F0aW9uLXByb3ZpZGVyIHByb3ZpZGVyLWNhcmRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInByb3ZpZGVyLWhlYWRlclwiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LWxhYmVsXCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJudGZ5LWVuYWJsZWRcIiAvPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmdy01MDBcIj5udGZ5LnNoPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cIm50ZnktdGVzdFwiIGNsYXNzPVwidGVzdC1idG4gYnRuLXhzXCI+VGVzdDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cIm50ZnktY29uZmlnXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDJmciAxZnI7IGdhcDogOHB4O1wiPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWwtc21cIj5TZXJ2ZXIgVVJMOjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwibnRmeS1zZXJ2ZXJcIiBwbGFjZWhvbGRlcj1cImh0dHBzOi8vbnRmeS5zaFwiIHZhbHVlPVwiaHR0cHM6Ly9udGZ5LnNoXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWwtc21cIj5Ub3BpYzo8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cIm50ZnktdG9waWNcIiBwbGFjZWhvbGRlcj1cImRhc2hjYWRkeS1hbGVydHNcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gRW1haWwgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwibm90aWZpY2F0aW9uLXByb3ZpZGVyIHByb3ZpZGVyLWNhcmRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInByb3ZpZGVyLWhlYWRlclwiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LWxhYmVsXCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJlbWFpbC1lbmFibGVkXCIgLz5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZnctNTAwXCI+RW1haWwgKFNNVFApPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImVtYWlsLXRlc3RcIiBjbGFzcz1cInRlc3QtYnRuIGJ0bi14c1wiPlRlc3Q8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJlbWFpbC1jb25maWdcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogMmZyIDFmcjsgZ2FwOiA4cHg7IG1hcmdpbi1ib3R0b206IDhweDtcIj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpZWxkLWxhYmVsLXNtXCI+U01UUCBIb3N0OjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZW1haWwtaG9zdFwiIHBsYWNlaG9sZGVyPVwic210cC5nbWFpbC5jb21cIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbC1zbVwiPlBvcnQ6PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cImVtYWlsLXBvcnRcIiB2YWx1ZT1cIjU4N1wiIHBsYWNlaG9sZGVyPVwiNTg3XCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnI7IGdhcDogOHB4OyBtYXJnaW4tYm90dG9tOiA4cHg7XCI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbC1zbVwiPlVzZXJuYW1lOjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZW1haWwtdXNlclwiIHBsYWNlaG9sZGVyPVwidXNlckBnbWFpbC5jb21cIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbC1zbVwiPlBhc3N3b3JkOjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicGFzc3dvcmRcIiBpZD1cImVtYWlsLXBhc3NcIiBwbGFjZWhvbGRlcj1cImFwcCBwYXNzd29yZFwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyOyBnYXA6IDhweDtcIj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpZWxkLWxhYmVsLXNtXCI+RnJvbTo8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImVtYWlsLWZyb21cIiBwbGFjZWhvbGRlcj1cIkRhc2hDYWRkeSAmbHQ7bm9yZXBseUBleGFtcGxlLmNvbSZndDtcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbC1zbVwiPlRvOjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZW1haWwtdG9cIiBwbGFjZWhvbGRlcj1cImFkbWluQGV4YW1wbGUuY29tXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogNnB4OyBtYXJnaW4tdG9wOiA4cHg7IGZvbnQtc2l6ZTogMC44cmVtO1wiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwiZW1haWwtc2VjdXJlXCIgLz4gVXNlIFRMUyAocG9ydCA0NjUpXG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBIZWFsdGggQ2hlY2sgU2V0dGluZ3MgLS0+XG4gICAgICA8aDQgY2xhc3M9XCJzZWN0aW9uLWhlYWRpbmdcIj5IZWFsdGggTW9uaXRvcmluZzwvaDQ+XG4gICAgICA8ZGl2IHN0eWxlPVwicGFkZGluZzogMTJweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTsgYm9yZGVyLXJhZGl1czogOHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPlxuICAgICAgICA8bGFiZWwgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDEwcHg7IGN1cnNvcjogcG9pbnRlcjsgbWFyZ2luLWJvdHRvbTogMTBweDtcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJoZWFsdGgtY2hlY2stZW5hYmxlZFwiIC8+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZnctNTAwXCI+RW5hYmxlIEhlYWx0aCBNb25pdG9yaW5nPC9zcGFuPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtdGlueS1tdXRlZFwiPlBlcmlvZGljYWxseSBjaGVjayBjb250YWluZXIgc3RhdHVzPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxkaXYgaWQ9XCJoZWFsdGgtY2hlY2stY29uZmlnXCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDEwcHg7XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWwtc21cIj5DaGVjayBpbnRlcnZhbDo8L2xhYmVsPlxuICAgICAgICAgIDxzZWxlY3QgaWQ9XCJoZWFsdGgtY2hlY2staW50ZXJ2YWxcIiBzdHlsZT1cIndpZHRoOiBhdXRvO1wiPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjFcIj4xIG1pbnV0ZTwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjVcIiBzZWxlY3RlZD41IG1pbnV0ZXM8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIxNVwiPjE1IG1pbnV0ZXM8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIzMFwiPjMwIG1pbnV0ZXM8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCI2MFwiPjEgaG91cjwvb3B0aW9uPlxuICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJoZWFsdGgtY2hlY2stbm93XCIgc3R5bGU9XCJwYWRkaW5nOiA0cHggMTBweDsgZm9udC1zaXplOiAwLjc1cmVtOyBtYXJnaW4tbGVmdDogYXV0bztcIj5DaGVjayBOb3c8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJoZWFsdGgtY2hlY2stc3RhdHVzXCIgc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi10b3A6IDhweDtcIj5cbiAgICAgICAgICBMYXN0IGNoZWNrOiBOZXZlclxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEV2ZW50IFR5cGVzIC0tPlxuICAgICAgPGg0IGNsYXNzPVwic2VjdGlvbi1oZWFkaW5nXCI+RXZlbnRzIHRvIE5vdGlmeTwvaDQ+XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyOyBnYXA6IDZweDsgcGFkZGluZzogMTJweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTsgYm9yZGVyLXJhZGl1czogOHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC1sYWJlbC1zbVwiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImV2ZW50LWNvbnRhaW5lci1kb3duXCIgY2hlY2tlZCAvPiBDb250YWluZXIgRG93blxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC1sYWJlbC1zbVwiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImV2ZW50LWNvbnRhaW5lci11cFwiIGNoZWNrZWQgLz4gQ29udGFpbmVyIFJlY292ZXJlZFxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC1sYWJlbC1zbVwiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImV2ZW50LWRlcGxveS1zdWNjZXNzXCIgY2hlY2tlZCAvPiBEZXBsb3ltZW50IFN1Y2Nlc3NcbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtbGFiZWwtc21cIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJldmVudC1kZXBsb3ktZmFpbGVkXCIgY2hlY2tlZCAvPiBEZXBsb3ltZW50IEZhaWxlZFxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC1sYWJlbC1zbVwiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImV2ZW50LXNzbC1jZXJ0LWV4cGlyeVwiIGNoZWNrZWQgLz4gU1NMIEV4cGlyeVxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC1sYWJlbC1zbVwiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImV2ZW50LWRucy1wcm9wYWdhdGlvblwiIGNoZWNrZWQgLz4gRE5TIFByb3BhZ2F0aW9uXG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LWxhYmVsLXNtXCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwiZXZlbnQtZHJpZnQtZGV0ZWN0ZWRcIiBjaGVja2VkIC8+IENvbmZpZyBEcmlmdFxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC1sYWJlbC1zbVwiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImV2ZW50LWRlcGVuZGVuY3ktcmVzdGFydFwiIGNoZWNrZWQgLz4gRGVwZW5kZW5jeSBSZXN0YXJ0c1xuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC1sYWJlbC1zbVwiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImV2ZW50LXJlY2lwZS1yZW1vdmVkXCIgY2hlY2tlZCAvPiBSZWNpcGUgUmVtb3ZlZFxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC1sYWJlbC1zbVwiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImV2ZW50LXdvcmtmbG93XCIgY2hlY2tlZCAvPiBXb3JrZmxvdyBBY3Rpb25zXG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LWxhYmVsLXNtXCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwiZXZlbnQtYmFja3VwLWNvbXBsZXRlXCIgY2hlY2tlZCAvPiBCYWNrdXAgQ29tcGxldGVcbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtbGFiZWwtc21cIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJldmVudC1iYWNrdXAtZmFpbGVkXCIgY2hlY2tlZCAvPiBCYWNrdXAgRmFpbGVkXG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LWxhYmVsLXNtXCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwiZXZlbnQtdXBkYXRlLWF2YWlsYWJsZVwiIGNoZWNrZWQgLz4gVXBkYXRlc1xuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC1sYWJlbC1zbVwiIHN0eWxlPVwiZ3JpZC1jb2x1bW46IDEgLyAtMTtcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJldmVudC1yZXNvdXJjZS1hbGVydFwiIGNoZWNrZWQgLz4gUmVzb3VyY2UgQWxlcnRzXG4gICAgICAgIDwvbGFiZWw+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBIaXN0b3J5IC0tPlxuICAgICAgPGg0IGNsYXNzPVwic2VjdGlvbi1oZWFkaW5nXCI+Tm90aWZpY2F0aW9uIEhpc3Rvcnk8L2g0PlxuICAgICAgPGRpdiBpZD1cIm5vdGlmaWNhdGlvbi1oaXN0b3J5XCIgc3R5bGU9XCJtYXgtaGVpZ2h0OiAxNTBweDsgb3ZlcmZsb3cteTogYXV0bzsgcGFkZGluZzogOHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpOyBib3JkZXItcmFkaXVzOiA4cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGZvbnQtc2l6ZTogMC44cmVtO1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgdGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiAyMHB4O1wiPk5vIG5vdGlmaWNhdGlvbnMgeWV0PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgaWQ9XCJsYXN0LW5vdGlmaWNhdGlvbi1zZW50XCIgc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IHRleHQtYWxpZ246IGNlbnRlcjsgbWFyZ2luLXRvcDogNnB4O1wiPjwvZGl2PlxuXG4gICAgICA8IS0tIEJ1dHRvbnMgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zIG1vZGFsLWZvb3Rlci1iYXJcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cIm5vdGlmaWNhdGlvbnMtc2VuZC10ZXN0XCIgY2xhc3M9XCJidG4tc2Vjb25kYXJ5XCIgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IGF1dG87XCI+U2VuZCBUZXN0PC9idXR0b24+XG4gICAgICAgIDxidXR0b24gaWQ9XCJub3RpZmljYXRpb25zLWNhbmNlbFwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwibm90aWZpY2F0aW9ucy1zYXZlXCIgY2xhc3M9XCJidG4tYWNjZW50XCI+U2F2ZSBTZXR0aW5nczwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PmApO1xuXG4gIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25vdGlmaWNhdGlvbnMtbW9kYWwnKTtcbiAgY29uc3Qgb3BlbkJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYW5hZ2Utbm90aWZpY2F0aW9ucycpO1xuICBjb25zdCBzYXZlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25vdGlmaWNhdGlvbnMtc2F2ZScpO1xuICBjb25zdCBjYW5jZWxCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbm90aWZpY2F0aW9ucy1jYW5jZWwnKTtcblxuICAvLyBQcm92aWRlciB0b2dnbGUgaGFuZGxlcnNcbiAgWydkaXNjb3JkJywgJ3RlbGVncmFtJywgJ250ZnknLCAnZW1haWwnXS5mb3JFYWNoKHByb3ZpZGVyID0+IHtcbiAgICBjb25zdCBjaGVja2JveCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke3Byb3ZpZGVyfS1lbmFibGVkYCk7XG4gICAgY29uc3QgY29uZmlnID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7cHJvdmlkZXJ9LWNvbmZpZ2ApO1xuXG4gICAgY2hlY2tib3g/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHtcbiAgICAgIGNvbmZpZy5zdHlsZS5kaXNwbGF5ID0gY2hlY2tib3guY2hlY2tlZCA/ICdibG9jaycgOiAnbm9uZSc7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIEhlYWx0aCBjaGVjayB0b2dnbGVcbiAgY29uc3QgaGVhbHRoQ2hlY2tFbmFibGVkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1jaGVjay1lbmFibGVkJyk7XG4gIGNvbnN0IGhlYWx0aENoZWNrQ29uZmlnID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1jaGVjay1jb25maWcnKTtcbiAgaGVhbHRoQ2hlY2tFbmFibGVkPy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgaGVhbHRoQ2hlY2tDb25maWcuc3R5bGUub3BhY2l0eSA9IGhlYWx0aENoZWNrRW5hYmxlZC5jaGVja2VkID8gJzEnIDogJzAuNSc7XG4gIH0pO1xuXG4gIC8vIExvYWQgbm90aWZpY2F0aW9uIGNvbmZpZyBmcm9tIEFQSVxuICBhc3luYyBmdW5jdGlvbiBsb2FkTm90aWZpY2F0aW9uQ29uZmlnKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL25vdGlmaWNhdGlvbnMvY29uZmlnJyk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuXG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGRhdGEuY29uZmlnO1xuXG4gICAgICAgIC8vIE1hc3RlciB0b2dnbGVcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25vdGlmaWNhdGlvbnMtZW5hYmxlZCcpLmNoZWNrZWQgPSBjb25maWcuZW5hYmxlZDtcblxuICAgICAgICAvLyBQcm92aWRlcnNcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rpc2NvcmQtZW5hYmxlZCcpLmNoZWNrZWQgPSBjb25maWcucHJvdmlkZXJzPy5kaXNjb3JkPy5lbmFibGVkIHx8IGZhbHNlO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVsZWdyYW0tZW5hYmxlZCcpLmNoZWNrZWQgPSBjb25maWcucHJvdmlkZXJzPy50ZWxlZ3JhbT8uZW5hYmxlZCB8fCBmYWxzZTtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ250ZnktZW5hYmxlZCcpLmNoZWNrZWQgPSBjb25maWcucHJvdmlkZXJzPy5udGZ5Py5lbmFibGVkIHx8IGZhbHNlO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZW1haWwtZW5hYmxlZCcpLmNoZWNrZWQgPSBjb25maWcucHJvdmlkZXJzPy5lbWFpbD8uZW5hYmxlZCB8fCBmYWxzZTtcblxuICAgICAgICAvLyBTaG93L2hpZGUgY29uZmlnIHNlY3Rpb25zXG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkaXNjb3JkLWNvbmZpZycpLnN0eWxlLmRpc3BsYXkgPSBjb25maWcucHJvdmlkZXJzPy5kaXNjb3JkPy5lbmFibGVkID8gJ2Jsb2NrJyA6ICdub25lJztcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RlbGVncmFtLWNvbmZpZycpLnN0eWxlLmRpc3BsYXkgPSBjb25maWcucHJvdmlkZXJzPy50ZWxlZ3JhbT8uZW5hYmxlZCA/ICdibG9jaycgOiAnbm9uZSc7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdudGZ5LWNvbmZpZycpLnN0eWxlLmRpc3BsYXkgPSBjb25maWcucHJvdmlkZXJzPy5udGZ5Py5lbmFibGVkID8gJ2Jsb2NrJyA6ICdub25lJztcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VtYWlsLWNvbmZpZycpLnN0eWxlLmRpc3BsYXkgPSBjb25maWcucHJvdmlkZXJzPy5lbWFpbD8uZW5hYmxlZCA/ICdibG9jaycgOiAnbm9uZSc7XG5cbiAgICAgICAgLy8gbnRmeSBzZXJ2ZXIgVVJMXG4gICAgICAgIGlmIChjb25maWcucHJvdmlkZXJzPy5udGZ5Py5zZXJ2ZXJVcmwpIHtcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbnRmeS1zZXJ2ZXInKS52YWx1ZSA9IGNvbmZpZy5wcm92aWRlcnMubnRmeS5zZXJ2ZXJVcmw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBlbWFpbCBmaWVsZHMgXHUyMDE0IERDLTA5MjogcHJlZmlsbCB0aGUgRlVMTCBmb3JtIHNvIGEgc2F2ZSBkb2Vzbid0XG4gICAgICAgIC8vIHNpbGVudGx5IHdpcGUgZmllbGRzIHRoZSBHRVQgcmVzcG9uc2UgcHJldmlvdXNseSBvbWl0dGVkLiBQYXNzd29yZFxuICAgICAgICAvLyBpcyBuZXZlciByZXR1cm5lZDsgd2hlbiBvbmUgaXMgc3RvcmVkIHRoZSBmaWVsZCBzaG93cyBhIGtlZXAtaGludFxuICAgICAgICAvLyBhbmQgYW4gZW1wdHkgc3VibWl0IHByZXNlcnZlcyB0aGUgc3RvcmVkIGNyZWRlbnRpYWwgc2VydmVyLXNpZGUuXG4gICAgICAgIGlmIChjb25maWcucHJvdmlkZXJzPy5lbWFpbD8uaG9zdCkgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VtYWlsLWhvc3QnKS52YWx1ZSA9IGNvbmZpZy5wcm92aWRlcnMuZW1haWwuaG9zdDtcbiAgICAgICAgaWYgKGNvbmZpZy5wcm92aWRlcnM/LmVtYWlsPy5mcm9tKSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZW1haWwtZnJvbScpLnZhbHVlID0gY29uZmlnLnByb3ZpZGVycy5lbWFpbC5mcm9tO1xuICAgICAgICBpZiAoY29uZmlnLnByb3ZpZGVycz8uZW1haWw/LnRvKSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZW1haWwtdG8nKS52YWx1ZSA9IGNvbmZpZy5wcm92aWRlcnMuZW1haWwudG87XG4gICAgICAgIGlmIChjb25maWcucHJvdmlkZXJzPy5lbWFpbD8ucG9ydCkgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VtYWlsLXBvcnQnKS52YWx1ZSA9IGNvbmZpZy5wcm92aWRlcnMuZW1haWwucG9ydDtcbiAgICAgICAgaWYgKGNvbmZpZy5wcm92aWRlcnM/LmVtYWlsPy5zZWN1cmUgIT09IHVuZGVmaW5lZCkgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VtYWlsLXNlY3VyZScpLmNoZWNrZWQgPSBjb25maWcucHJvdmlkZXJzLmVtYWlsLnNlY3VyZSA9PT0gdHJ1ZTtcbiAgICAgICAgaWYgKGNvbmZpZy5wcm92aWRlcnM/LmVtYWlsPy51c2VybmFtZSkgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VtYWlsLXVzZXInKS52YWx1ZSA9IGNvbmZpZy5wcm92aWRlcnMuZW1haWwudXNlcm5hbWU7XG4gICAgICAgIGNvbnN0IGVtYWlsUGFzc0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VtYWlsLXBhc3MnKTtcbiAgICAgICAgaWYgKGNvbmZpZy5wcm92aWRlcnM/LmVtYWlsPy5oYXNQYXNzd29yZCkge1xuICAgICAgICAgIGVtYWlsUGFzc0VsLnZhbHVlID0gJyc7XG4gICAgICAgICAgZW1haWxQYXNzRWwucGxhY2Vob2xkZXIgPSAnc2F2ZWQgXHUyMDE0IGxlYXZlIGJsYW5rIHRvIGtlZXAnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVtYWlsUGFzc0VsLnBsYWNlaG9sZGVyID0gJ2FwcCBwYXNzd29yZCc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIZWFsdGggY2hlY2tcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1jaGVjay1lbmFibGVkJykuY2hlY2tlZCA9IGNvbmZpZy5oZWFsdGhDaGVjaz8uZW5hYmxlZCB8fCBmYWxzZTtcbiAgICAgICAgaWYgKGNvbmZpZy5oZWFsdGhDaGVjaz8uaW50ZXJ2YWxNaW51dGVzKSB7XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1jaGVjay1pbnRlcnZhbCcpLnZhbHVlID0gY29uZmlnLmhlYWx0aENoZWNrLmludGVydmFsTWludXRlcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnLmhlYWx0aENoZWNrPy5sYXN0Q2hlY2spIHtcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWNoZWNrLXN0YXR1cycpLnRleHRDb250ZW50ID1cbiAgICAgICAgICAgIGBMYXN0IGNoZWNrOiAke25ldyBEYXRlKGNvbmZpZy5oZWFsdGhDaGVjay5sYXN0Q2hlY2spLnRvTG9jYWxlU3RyaW5nKCl9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEV2ZW50cyBcdTIwMTQgY2Fub25pY2FsIGtlYmFiLWNhc2Uga2V5cywgbWF0Y2hpbmcgdGhlIGJhY2tlbmQgc3RvcmVcbiAgICAgICAgLy8gKERDLTA5MjogcHJldmlvdXNseSByZWFkIGNhbWVsQ2FzZSBrZXlzIHRoYXQgbmV2ZXIgZXhpc3RlZCwgc29cbiAgICAgICAgLy8gZXZlcnkgdG9nZ2xlIHJlLXJlbmRlcmVkIGFzICdjaGVja2VkJyByZWdhcmRsZXNzIG9mIHN0b3JlZCBzdGF0ZSkuXG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdldmVudC1jb250YWluZXItZG93bicpLmNoZWNrZWQgPSBjb25maWcuZXZlbnRzPy5bJ2NvbnRhaW5lci1kb3duJ10gIT09IGZhbHNlO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXZlbnQtY29udGFpbmVyLXVwJykuY2hlY2tlZCA9IGNvbmZpZy5ldmVudHM/LlsnY29udGFpbmVyLXVwJ10gPT09IHRydWU7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdldmVudC1kZXBsb3ktc3VjY2VzcycpLmNoZWNrZWQgPSBjb25maWcuZXZlbnRzPy5bJ2RlcGxveS1zdWNjZXNzJ10gIT09IGZhbHNlO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXZlbnQtZGVwbG95LWZhaWxlZCcpLmNoZWNrZWQgPSBjb25maWcuZXZlbnRzPy5bJ2RlcGxveS1mYWlsZWQnXSAhPT0gZmFsc2U7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdldmVudC1zc2wtY2VydC1leHBpcnknKS5jaGVja2VkID0gY29uZmlnLmV2ZW50cz8uWydzc2wtY2VydC1leHBpcnknXSAhPT0gZmFsc2U7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdldmVudC1kbnMtcHJvcGFnYXRpb24nKS5jaGVja2VkID0gY29uZmlnLmV2ZW50cz8uWydkbnMtcHJvcGFnYXRpb24nXSAhPT0gZmFsc2U7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdldmVudC1kcmlmdC1kZXRlY3RlZCcpLmNoZWNrZWQgPSBjb25maWcuZXZlbnRzPy5bJ2RyaWZ0LWRldGVjdGVkJ10gIT09IGZhbHNlO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXZlbnQtZGVwZW5kZW5jeS1yZXN0YXJ0JykuY2hlY2tlZCA9IGNvbmZpZy5ldmVudHM/LlsnZGVwZW5kZW5jeS1yZXN0YXJ0J10gIT09IGZhbHNlO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXZlbnQtcmVjaXBlLXJlbW92ZWQnKS5jaGVja2VkID0gY29uZmlnLmV2ZW50cz8uWydyZWNpcGUtcmVtb3ZlZCddICE9PSBmYWxzZTtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V2ZW50LXdvcmtmbG93JykuY2hlY2tlZCA9IGNvbmZpZy5ldmVudHM/Llsnd29ya2Zsb3cnXSAhPT0gZmFsc2U7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdldmVudC1iYWNrdXAtY29tcGxldGUnKS5jaGVja2VkID0gY29uZmlnLmV2ZW50cz8uWydiYWNrdXAtY29tcGxldGUnXSAhPT0gZmFsc2U7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdldmVudC1iYWNrdXAtZmFpbGVkJykuY2hlY2tlZCA9IGNvbmZpZy5ldmVudHM/LlsnYmFja3VwLWZhaWxlZCddICE9PSBmYWxzZTtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V2ZW50LXVwZGF0ZS1hdmFpbGFibGUnKS5jaGVja2VkID0gY29uZmlnLmV2ZW50cz8uWyd1cGRhdGUtYXZhaWxhYmxlJ10gIT09IGZhbHNlO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXZlbnQtcmVzb3VyY2UtYWxlcnQnKS5jaGVja2VkID0gY29uZmlnLmV2ZW50cz8uWydhbGVydCddICE9PSBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgZXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdbTm90aWZpY2F0aW9uc10gTG9hZCBDb25maWcnLCBlcnJvciwgeyBmdW5jdGlvbjogJ2xvYWRDb25maWcnIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIExvYWQgbm90aWZpY2F0aW9uIGhpc3RvcnlcbiAgYXN5bmMgZnVuY3Rpb24gbG9hZE5vdGlmaWNhdGlvbkhpc3RvcnkoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvbm90aWZpY2F0aW9ucy9oaXN0b3J5P2xpbWl0PTEwJyk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuXG4gICAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbm90aWZpY2F0aW9uLWhpc3RvcnknKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MgJiYgZGF0YS5oaXN0b3J5Py5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBkYXRhLmhpc3RvcnkubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShpdGVtLnRpbWVzdGFtcCkudG9Mb2NhbGVTdHJpbmcoKTtcbiAgICAgICAgICBjb25zdCB0eXBlQ29sb3JzID0ge1xuICAgICAgICAgICAgc3VjY2VzczogJ3ZhcigtLW9rLWZnKScsXG4gICAgICAgICAgICBlcnJvcjogJ3ZhcigtLWJhZC1mZyknLFxuICAgICAgICAgICAgd2FybmluZzogJyNmMzljMTInLFxuICAgICAgICAgICAgaW5mbzogJ3ZhcigtLWFjY2VudCknXG4gICAgICAgICAgfTtcbiAgICAgICAgICByZXR1cm4gYFxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDZweCA4cHg7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBkaXNwbGF5OiBmbGV4OyBnYXA6IDhweDsgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7XCI+XG4gICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6ICR7dHlwZUNvbG9yc1tpdGVtLnR5cGVdIHx8ICd2YXIoLS1tdXRlZCknfVwiPiR7aXRlbS50eXBlID09PSAnc3VjY2VzcycgPyAnXHUyNzEzJyA6IGl0ZW0udHlwZSA9PT0gJ2Vycm9yJyA/ICdcdTI3MTcnIDogJ1x1MjEzOSd9PC9zcGFuPlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleDogMTsgbWluLXdpZHRoOiAwO1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDogNTAwOyB3aGl0ZS1zcGFjZTogbm93cmFwOyBvdmVyZmxvdzogaGlkZGVuOyB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcIj4ke2VzY2FwZUh0bWwoaXRlbS50aXRsZSl9PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC43cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPiR7ZGF0ZX08L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBgO1xuICAgICAgICB9KS5qb2luKCcnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRpdiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IHRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogMjBweDtcIj5ObyBub3RpZmljYXRpb25zIHlldDwvZGl2Pic7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGVycm9ySGFuZGxlci5sb2dFcnJvcignW05vdGlmaWNhdGlvbnNdIExvYWQgSGlzdG9yeScsIGVycm9yLCB7IGZ1bmN0aW9uOiAnbG9hZEhpc3RvcnknIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIFNhdmUgbm90aWZpY2F0aW9uIGNvbmZpZ1xuICBhc3luYyBmdW5jdGlvbiBzYXZlTm90aWZpY2F0aW9uQ29uZmlnKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICAgIGVuYWJsZWQ6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdub3RpZmljYXRpb25zLWVuYWJsZWQnKS5jaGVja2VkLFxuICAgICAgICBwcm92aWRlcnM6IHtcbiAgICAgICAgICBkaXNjb3JkOiB7XG4gICAgICAgICAgICBlbmFibGVkOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGlzY29yZC1lbmFibGVkJykuY2hlY2tlZCxcbiAgICAgICAgICAgIHdlYmhvb2tVcmw6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkaXNjb3JkLXdlYmhvb2snKS52YWx1ZS50cmltKClcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRlbGVncmFtOiB7XG4gICAgICAgICAgICBlbmFibGVkOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVsZWdyYW0tZW5hYmxlZCcpLmNoZWNrZWQsXG4gICAgICAgICAgICBib3RUb2tlbjogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RlbGVncmFtLWJvdC10b2tlbicpLnZhbHVlLnRyaW0oKSxcbiAgICAgICAgICAgIGNoYXRJZDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RlbGVncmFtLWNoYXQtaWQnKS52YWx1ZS50cmltKClcbiAgICAgICAgICB9LFxuICAgICAgICAgIG50Znk6IHtcbiAgICAgICAgICAgIGVuYWJsZWQ6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdudGZ5LWVuYWJsZWQnKS5jaGVja2VkLFxuICAgICAgICAgICAgc2VydmVyVXJsOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbnRmeS1zZXJ2ZXInKS52YWx1ZS50cmltKCkgfHwgJ2h0dHBzOi8vbnRmeS5zaCcsXG4gICAgICAgICAgICB0b3BpYzogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ250ZnktdG9waWMnKS52YWx1ZS50cmltKClcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVtYWlsOiB7XG4gICAgICAgICAgICBlbmFibGVkOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZW1haWwtZW5hYmxlZCcpLmNoZWNrZWQsXG4gICAgICAgICAgICBob3N0OiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZW1haWwtaG9zdCcpLnZhbHVlLnRyaW0oKSxcbiAgICAgICAgICAgIHBvcnQ6IHBhcnNlSW50KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlbWFpbC1wb3J0JykudmFsdWUpIHx8IDU4NyxcbiAgICAgICAgICAgIHNlY3VyZTogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VtYWlsLXNlY3VyZScpLmNoZWNrZWQsXG4gICAgICAgICAgICB1c2VybmFtZTogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VtYWlsLXVzZXInKS52YWx1ZS50cmltKCksXG4gICAgICAgICAgICBwYXNzd29yZDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VtYWlsLXBhc3MnKS52YWx1ZS50cmltKCksXG4gICAgICAgICAgICBmcm9tOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZW1haWwtZnJvbScpLnZhbHVlLnRyaW0oKSxcbiAgICAgICAgICAgIHRvOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZW1haWwtdG8nKS52YWx1ZS50cmltKClcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGV2ZW50czoge1xuICAgICAgICAgICdjb250YWluZXItZG93bic6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdldmVudC1jb250YWluZXItZG93bicpLmNoZWNrZWQsXG4gICAgICAgICAgJ2NvbnRhaW5lci11cCc6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdldmVudC1jb250YWluZXItdXAnKS5jaGVja2VkLFxuICAgICAgICAgICdkZXBsb3ktc3VjY2Vzcyc6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdldmVudC1kZXBsb3ktc3VjY2VzcycpLmNoZWNrZWQsXG4gICAgICAgICAgJ2RlcGxveS1mYWlsZWQnOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXZlbnQtZGVwbG95LWZhaWxlZCcpLmNoZWNrZWQsXG4gICAgICAgICAgJ3NzbC1jZXJ0LWV4cGlyeSc6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdldmVudC1zc2wtY2VydC1leHBpcnknKS5jaGVja2VkLFxuICAgICAgICAgICdkbnMtcHJvcGFnYXRpb24nOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXZlbnQtZG5zLXByb3BhZ2F0aW9uJykuY2hlY2tlZCxcbiAgICAgICAgICAnZHJpZnQtZGV0ZWN0ZWQnOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXZlbnQtZHJpZnQtZGV0ZWN0ZWQnKS5jaGVja2VkLFxuICAgICAgICAgICdkZXBlbmRlbmN5LXJlc3RhcnQnOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXZlbnQtZGVwZW5kZW5jeS1yZXN0YXJ0JykuY2hlY2tlZCxcbiAgICAgICAgICAncmVjaXBlLXJlbW92ZWQnOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXZlbnQtcmVjaXBlLXJlbW92ZWQnKS5jaGVja2VkLFxuICAgICAgICAgICd3b3JrZmxvdyc6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdldmVudC13b3JrZmxvdycpLmNoZWNrZWQsXG4gICAgICAgICAgJ2JhY2t1cC1jb21wbGV0ZSc6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdldmVudC1iYWNrdXAtY29tcGxldGUnKS5jaGVja2VkLFxuICAgICAgICAgICdiYWNrdXAtZmFpbGVkJzogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V2ZW50LWJhY2t1cC1mYWlsZWQnKS5jaGVja2VkLFxuICAgICAgICAgICd1cGRhdGUtYXZhaWxhYmxlJzogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V2ZW50LXVwZGF0ZS1hdmFpbGFibGUnKS5jaGVja2VkLFxuICAgICAgICAgICdhbGVydCc6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdldmVudC1yZXNvdXJjZS1hbGVydCcpLmNoZWNrZWRcbiAgICAgICAgfSxcbiAgICAgICAgaGVhbHRoQ2hlY2s6IHtcbiAgICAgICAgICBlbmFibGVkOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWNoZWNrLWVuYWJsZWQnKS5jaGVja2VkLFxuICAgICAgICAgIGludGVydmFsTWludXRlczogcGFyc2VJbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1jaGVjay1pbnRlcnZhbCcpLnZhbHVlKSB8fCA1XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvbm90aWZpY2F0aW9ucy9jb25maWcnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoY29uZmlnKVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oJ05vdGlmaWNhdGlvbiBzZXR0aW5ncyBzYXZlZCcsICdzdWNjZXNzJywgMzAwMCk7XG4gICAgICAgIG1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oYEZhaWxlZCB0byBzYXZlOiAke2RhdGEuZXJyb3J9YCwgJ2Vycm9yJywgMzAwMCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oYEVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgMzAwMCk7XG4gICAgfVxuICB9XG5cbiAgLy8gVGVzdCBub3RpZmljYXRpb24gaGFuZGxlcnNcbiAgYXN5bmMgZnVuY3Rpb24gdGVzdFByb3ZpZGVyKHByb3ZpZGVyKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvbm90aWZpY2F0aW9ucy90ZXN0Jywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgcHJvdmlkZXIgfSlcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKGBUZXN0ICR7cHJvdmlkZXJ9IG5vdGlmaWNhdGlvbiBzZW50IWAsICdzdWNjZXNzJywgMzAwMCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKGBUZXN0IGZhaWxlZDogJHtkYXRhLmVycm9yfWAsICdlcnJvcicsIDMwMDApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKGBFcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIDMwMDApO1xuICAgIH1cbiAgfVxuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkaXNjb3JkLXRlc3QnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0ZXN0UHJvdmlkZXIoJ2Rpc2NvcmQnKSk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0ZWxlZ3JhbS10ZXN0Jyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGVzdFByb3ZpZGVyKCd0ZWxlZ3JhbScpKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ250ZnktdGVzdCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRlc3RQcm92aWRlcignbnRmeScpKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VtYWlsLXRlc3QnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0ZXN0UHJvdmlkZXIoJ2VtYWlsJykpO1xuXG4gIC8vIEhlYWx0aCBjaGVjayBub3cgYnV0dG9uXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtY2hlY2stbm93Jyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL25vdGlmaWNhdGlvbnMvaGVhbHRoLWNoZWNrJywgeyBtZXRob2Q6ICdQT1NUJyB9KTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1jaGVjay1zdGF0dXMnKS50ZXh0Q29udGVudCA9XG4gICAgICAgICAgYExhc3QgY2hlY2s6ICR7bmV3IERhdGUoZGF0YS5sYXN0Q2hlY2spLnRvTG9jYWxlU3RyaW5nKCl9ICgke2RhdGEuY29udGFpbmVyc01vbml0b3JlZH0gY29udGFpbmVycylgO1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdIZWFsdGggY2hlY2sgY29tcGxldGVkJywgJ3N1Y2Nlc3MnLCAyMDAwKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbihgRXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCAzMDAwKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIE1vZGFsIGhhbmRsZXJzXG4gIG9wZW5CdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIG1vZGFsLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgICBsb2FkTm90aWZpY2F0aW9uQ29uZmlnKCk7XG4gICAgbG9hZE5vdGlmaWNhdGlvbkhpc3RvcnkoKTtcbiAgfSk7XG5cbiAgc2F2ZUJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBzYXZlTm90aWZpY2F0aW9uQ29uZmlnKTtcblxuICAvLyBTZW5kIFRlc3QgYnV0dG9uIC0gc2VuZHMgdGVzdCBub3RpZmljYXRpb24gdG8gYWxsIGVuYWJsZWQgcHJvdmlkZXJzXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdub3RpZmljYXRpb25zLXNlbmQtdGVzdCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBidG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbm90aWZpY2F0aW9ucy1zZW5kLXRlc3QnKTtcbiAgICBjb25zdCBvcmlnaW5hbFRleHQgPSBidG4udGV4dENvbnRlbnQ7XG4gICAgYnRuLnRleHRDb250ZW50ID0gJ1NlbmRpbmcuLi4nO1xuICAgIGJ0bi5kaXNhYmxlZCA9IHRydWU7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9ub3RpZmljYXRpb25zL3NlbmQnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBcbiAgICAgICAgICBldmVudDogJ3Rlc3QnLFxuICAgICAgICAgIGRhdGE6IHsgbWVzc2FnZTogJ1RoaXMgaXMgYSB0ZXN0IG5vdGlmaWNhdGlvbiBmcm9tIERhc2hDYWRkeS4nIH0sXG4gICAgICAgICAgdHlwZTogJ2luZm8nXG4gICAgICAgIH0pXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbignVGVzdCBub3RpZmljYXRpb24gc2VudCEnLCAnc3VjY2VzcycsIDMwMDApO1xuICAgICAgICAvLyBVcGRhdGUgbGFzdCBzZW50IHRpbWVzdGFtcFxuICAgICAgICBsb2FkTm90aWZpY2F0aW9uU3RhdHVzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKGBUZXN0IGZhaWxlZDogJHtkYXRhLnJlc3VsdHM/Lm1hcChyID0+IGAke3IucHJvdmlkZXJ9OiAke3IuZXJyb3IgfHwgJ29rJ31gKS5qb2luKCcsICcpfWAsICdlcnJvcicsIDUwMDApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKGBFcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIDMwMDApO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBidG4udGV4dENvbnRlbnQgPSBvcmlnaW5hbFRleHQ7XG4gICAgICBidG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIExvYWQgbm90aWZpY2F0aW9uIHN0YXR1cyAobGFzdCBzZW50IHRpbWVzdGFtcClcbiAgYXN5bmMgZnVuY3Rpb24gbG9hZE5vdGlmaWNhdGlvblN0YXR1cygpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9ub3RpZmljYXRpb25zL3N0YXR1cycpO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MgJiYgZGF0YS5sYXN0U2VudCkge1xuICAgICAgICBjb25zdCBsYXN0U2VudEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xhc3Qtbm90aWZpY2F0aW9uLXNlbnQnKTtcbiAgICAgICAgaWYgKGxhc3RTZW50RWwpIHtcbiAgICAgICAgICBsYXN0U2VudEVsLnRleHRDb250ZW50ID0gYExhc3Qgc2VudDogJHtuZXcgRGF0ZShkYXRhLmxhc3RTZW50KS50b0xvY2FsZVN0cmluZygpfWA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gU2lsZW50bHkgZmFpbCAtIHN0YXR1cyBpcyBub3QgY3JpdGljYWxcbiAgICB9XG4gIH1cblxuICB3aXJlTW9kYWwobW9kYWwsIGNhbmNlbEJ0bik7XG59KSgpO1xuO1xuLy8gPT09PT09PT09PSBQQU5FTCBUQUIgU1dJVENISU5HIChzaGFyZWQgdXRpbGl0eSkgPT09PT09PT09PVxuKGZ1bmN0aW9uKCkge1xuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgY29uc3QgdGFiID0gZS50YXJnZXQuY2xvc2VzdCgnLnBhbmVsLXRhYicpO1xuICAgIGlmICghdGFiKSByZXR1cm47XG4gICAgY29uc3QgcGFuZWxJZCA9IHRhYi5kYXRhc2V0LnBhbmVsO1xuICAgIGlmICghcGFuZWxJZCkgcmV0dXJuO1xuICAgIGNvbnN0IHRhYkJhciA9IHRhYi5jbG9zZXN0KCcucGFuZWwtdGFicycpO1xuICAgIGNvbnN0IG1vZGFsQ29udGVudCA9IHRhYkJhci5jbG9zZXN0KCcud2VhdGhlci1tb2RhbC1jb250ZW50Jyk7XG4gICAgdGFiQmFyLnF1ZXJ5U2VsZWN0b3JBbGwoJy5wYW5lbC10YWInKS5mb3JFYWNoKHQgPT4gdC5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKSk7XG4gICAgdGFiLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICAgIG1vZGFsQ29udGVudC5xdWVyeVNlbGVjdG9yQWxsKCcucGFuZWwtc2VjdGlvbicpLmZvckVhY2gocyA9PiBzLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpKTtcbiAgICBjb25zdCB0YXJnZXQgPSBtb2RhbENvbnRlbnQucXVlcnlTZWxlY3RvcignIycgKyBwYW5lbElkKTtcbiAgICBpZiAodGFyZ2V0KSB0YXJnZXQuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gIH0pO1xufSkoKTtcbjtcbi8vID09PT09PT09PT0gVU5JRklFRCBCQUNLVVAvUkVTVE9SRSB2Mi4wID09PT09PT09PT1cbi8vIFNpbmdsZSBmaWxlIGNhcHR1cmVzIGV2ZXJ5dGhpbmc6IHNlcnZlciBjb25maWcgKyBicm93c2VyIHN0YXRlICsgdGhlbWVzICsgZW5jcnlwdGlvbiBrZXlcbihmdW5jdGlvbigpIHtcbiAgLy8gQWxsIERhc2hDYWRkeSBsb2NhbFN0b3JhZ2Uga2V5cyB0byBpbmNsdWRlIGluIGJhY2t1cFxuICB2YXIgQlJPV1NFUl9TVEFURV9LRVlTID0gW1xuICAgICdkYXNoY2FkZHlfc2l0ZV9jb25maWcnLCAnZGFzaGNhZGR5X29uYm9hcmRpbmcnLCAnZGFzaGNhZGR5LWVuY3J5cHRpb24ta2V5JyxcbiAgICAnZGFzaGNhZGR5LXNldHVwJywgJ2Rhc2hjYWRkeS1jb25maWcnLFxuICAgICd0aGVtZScsICd1c2VyLXRoZW1lcycsICdjdXN0b20tdGhlbWUnLFxuICAgICdjdXN0b20tYXBwcycsICdjdXN0b20tc2VydmljZXMnLCAndG9vbGJhci1zZWN0aW9ucycsXG4gICAgJ3dlYXRoZXItbG9jYXRpb24nLCAnd2VhdGhlci16aXAnLCAnd2VhdGhlci1nZW8nLCAnd2VhdGhlci11bml0JyxcbiAgICAnY2xvY2stc3R5bGUnLCAnY2xvY2stY2hpbWVzJywgJ2Nsb2NrLWNoaW1lLXZvbHVtZSdcbiAgXTtcblxuICAvLyBDb2xsZWN0IGFsbCBEYXNoQ2FkZHkgYnJvd3NlciBzdGF0ZSBmcm9tIGxvY2FsU3RvcmFnZVxuICBmdW5jdGlvbiBjb2xsZWN0QnJvd3NlclN0YXRlKCkge1xuICAgIHZhciBzdGF0ZSA9IHt9O1xuICAgIC8vIEdyYWIgYWxsIHdoaXRlbGlzdGVkIGtleXNcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IEJST1dTRVJfU1RBVEVfS0VZUy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGtleSA9IEJST1dTRVJfU1RBVEVfS0VZU1tpXTtcbiAgICAgIHZhciB2YWwgPSBzYWZlR2V0KGtleSk7XG4gICAgICBpZiAodmFsICE9PSBudWxsICYmIHZhbCAhPT0gdW5kZWZpbmVkKSBzdGF0ZVtrZXldID0gdmFsO1xuICAgIH1cbiAgICAvLyBHcmFiIGR5bmFtaWMgd2lkZ2V0LSotZW5hYmxlZCBrZXlzXG4gICAgdHJ5IHtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbG9jYWxTdG9yYWdlLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBrID0gbG9jYWxTdG9yYWdlLmtleShqKTtcbiAgICAgICAgaWYgKC9ed2lkZ2V0LS4rLWVuYWJsZWQkLy50ZXN0KGspKSB7XG4gICAgICAgICAgc3RhdGVba10gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHsgLyogcHJpdmF0ZSBicm93c2luZyAqLyB9XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgLy8gUmVzdG9yZSBicm93c2VyIHN0YXRlIGZyb20gYmFja3VwIGludG8gbG9jYWxTdG9yYWdlXG4gIGZ1bmN0aW9uIHJlc3RvcmVCcm93c2VyU3RhdGUoYnJvd3NlclN0YXRlKSB7XG4gICAgaWYgKCFicm93c2VyU3RhdGUgfHwgdHlwZW9mIGJyb3dzZXJTdGF0ZSAhPT0gJ29iamVjdCcpIHJldHVybiAwO1xuICAgIHZhciBjb3VudCA9IDA7XG4gICAgZm9yICh2YXIga2V5IGluIGJyb3dzZXJTdGF0ZSkge1xuICAgICAgaWYgKCFicm93c2VyU3RhdGUuaGFzT3duUHJvcGVydHkoa2V5KSkgY29udGludWU7XG4gICAgICBzYWZlU2V0KGtleSwgYnJvd3NlclN0YXRlW2tleV0pO1xuICAgICAgY291bnQrKztcbiAgICB9XG4gICAgcmV0dXJuIGNvdW50O1xuICB9XG5cbiAgLy8gSGFuZGxlIGxlZ2FjeSB2MS4wLjAgaW1wb3J0LWV4cG9ydCBmb3JtYXQgKHByZS1iYWNrdXAgbW9kYWwpXG4gIGZ1bmN0aW9uIGlzTGVnYWN5Rm9ybWF0KGRhdGEpIHtcbiAgICByZXR1cm4gZGF0YS52ZXJzaW9uICYmICFkYXRhLmZpbGVzICYmIGRhdGEuc2VydmljZXM7XG4gIH1cblxuICBmdW5jdGlvbiByZXN0b3JlTGVnYWN5Rm9ybWF0KGRhdGEpIHtcbiAgICAvLyBNYXAgdGhlIG9sZCBmbGF0IGtleXMgaW50byBicm93c2VyU3RhdGUgZm9yIGxvY2FsU3RvcmFnZSByZXN0b3JlXG4gICAgdmFyIGJyb3dzZXJTdGF0ZSA9IHt9O1xuICAgIGlmIChkYXRhLmN1c3RvbVNlcnZpY2VzKSBicm93c2VyU3RhdGVbJ2N1c3RvbS1zZXJ2aWNlcyddID0gSlNPTi5zdHJpbmdpZnkoZGF0YS5jdXN0b21TZXJ2aWNlcyk7XG4gICAgaWYgKGRhdGEuY3VzdG9tQXBwcykgYnJvd3NlclN0YXRlWydjdXN0b20tYXBwcyddID0gSlNPTi5zdHJpbmdpZnkoZGF0YS5jdXN0b21BcHBzKTtcbiAgICBpZiAoZGF0YS53ZWF0aGVyWmlwKSBicm93c2VyU3RhdGVbJ3dlYXRoZXItemlwJ10gPSBkYXRhLndlYXRoZXJaaXA7XG4gICAgaWYgKGRhdGEudGhlbWUpIGJyb3dzZXJTdGF0ZVsndGhlbWUnXSA9IGRhdGEudGhlbWU7XG4gICAgaWYgKGRhdGEudXNlclRoZW1lcyAmJiBPYmplY3Qua2V5cyhkYXRhLnVzZXJUaGVtZXMpLmxlbmd0aCkgYnJvd3NlclN0YXRlWyd1c2VyLXRoZW1lcyddID0gSlNPTi5zdHJpbmdpZnkoZGF0YS51c2VyVGhlbWVzKTtcbiAgICByZXN0b3JlQnJvd3NlclN0YXRlKGJyb3dzZXJTdGF0ZSk7XG5cbiAgICAvLyBQdXNoIHNlcnZpY2VzIHRvIHNlcnZlciBpZiBhdmFpbGFibGVcbiAgICBpZiAoZGF0YS5zZXJ2aWNlcyAmJiBBcnJheS5pc0FycmF5KGRhdGEuc2VydmljZXMpKSB7XG4gICAgICBzZWN1cmVGZXRjaCgnL2FwaS92MS9zZXJ2aWNlcycsIHtcbiAgICAgICAgbWV0aG9kOiAnUFVUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGRhdGEuc2VydmljZXMpXG4gICAgICB9KS5jYXRjaChmdW5jdGlvbigpIHt9KTtcbiAgICB9XG5cbiAgICAvLyBQdXNoIHRoZW1lcyB0byBzZXJ2ZXIgaWYgYXZhaWxhYmxlXG4gICAgaWYgKGRhdGEudXNlclRoZW1lcykge1xuICAgICAgT2JqZWN0LmtleXMoZGF0YS51c2VyVGhlbWVzKS5mb3JFYWNoKGZ1bmN0aW9uKHNsdWcpIHtcbiAgICAgICAgdmFyIHQgPSBkYXRhLnVzZXJUaGVtZXNbc2x1Z107XG4gICAgICAgIHZhciBjb2xvcnMgPSB7fTtcbiAgICAgICAgKHdpbmRvdy5USEVNRV9QUk9QUyB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbihwKSB7IGlmICh0W3BdKSBjb2xvcnNbcF0gPSB0W3BdOyB9KTtcbiAgICAgICAgc2VjdXJlRmV0Y2goJy9hcGkvdjEvdGhlbWVzLycgKyBzbHVnLCB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBuYW1lOiB0Lm5hbWUgfHwgc2x1ZywgY29sb3JzOiBjb2xvcnMgfSlcbiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24oKSB7fSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvLyBJbmplY3QgbW9kYWwgSFRNTFxuICBpbmplY3RNb2RhbCgnYmFja3VwLW1vZGFsJywgYDxkaXYgaWQ9XCJiYWNrdXAtbW9kYWxcIiBjbGFzcz1cIndlYXRoZXItbW9kYWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1jb250ZW50XCIgc3R5bGU9XCJtaW4td2lkdGg6IDU1MHB4OyBtYXgtd2lkdGg6IDY1MHB4O1wiPlxuICAgICAgPGgzPlx1RDgzRFx1RENCRSBCYWNrdXAgJiBSZXN0b3JlPC9oMz5cbiAgICAgIDxwIGNsYXNzPVwibW9kYWwtc3VidGl0bGVcIj5cbiAgICAgICAgRnVsbCBiYWNrdXAgb2YgeW91ciBlbnRpcmUgRGFzaENhZGR5IHNldHVwIFx1MjAxNCBzZXJ2ZXIgY29uZmlnLCBjcmVkZW50aWFscywgdGhlbWVzLCBhbmQgYnJvd3NlciBwcmVmZXJlbmNlcyBpbiBvbmUgZmlsZS5cbiAgICAgIDwvcD5cblxuICAgICAgPCEtLSBUYWIgYmFyIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLXRhYnNcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInBhbmVsLXRhYiBhY3RpdmVcIiBkYXRhLXBhbmVsPVwiYmFja3VwLW1hbnVhbFwiPk1hbnVhbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwicGFuZWwtdGFiXCIgZGF0YS1wYW5lbD1cImJhY2t1cC1zY2hlZHVsZXMtdGFiXCI+U2NoZWR1bGVzPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJwYW5lbC10YWJcIiBkYXRhLXBhbmVsPVwiYmFja3VwLWRpc2stdGFiXCI+QmFja3VwcyBvbiBEaXNrPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJwYW5lbC10YWJcIiBkYXRhLXBhbmVsPVwiYmFja3VwLXBvaW50aW50aW1lLXRhYlwiPlBvaW50LWluLVRpbWU8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInBhbmVsLXRhYlwiIGRhdGEtcGFuZWw9XCJiYWNrdXAtaGlzdG9yeS10YWJcIj5IaXN0b3J5PC9idXR0b24+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBUYWI6IE1hbnVhbCAtLT5cbiAgICAgIDxkaXYgaWQ9XCJiYWNrdXAtbWFudWFsXCIgY2xhc3M9XCJwYW5lbC1zZWN0aW9uIGFjdGl2ZVwiPlxuICAgICAgICA8IS0tIEV4cG9ydCBTZWN0aW9uIC0tPlxuICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMjBweDsgcGFkZGluZzogMTZweDsgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgY29sb3ItbWl4KGluIHNyZ2IsICMyN2FlNjAgMTUlLCB0cmFuc3BhcmVudCksIGNvbG9yLW1peChpbiBzcmdiLCAjMmVjYzcxIDEwJSwgdHJhbnNwYXJlbnQpKTsgYm9yZGVyLXJhZGl1czogMTBweDsgYm9yZGVyOiAxcHggc29saWQgIzI3YWU2MDtcIj5cbiAgICAgICAgICA8aDQgc3R5bGU9XCJtYXJnaW46IDAgMCA4cHg7IGNvbG9yOiAjMmVjYzcxOyBmb250LXNpemU6IDAuOTVyZW07XCI+XHVEODNEXHVEQ0U0IEV4cG9ydCBCYWNrdXA8L2g0PlxuICAgICAgICAgIDxwIHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbjogMCAwIDEycHg7XCI+XG4gICAgICAgICAgICBEb3dubG9hZHMgZXZlcnl0aGluZyBcdTIwMTQgc2VydmljZXMsIENhZGR5ZmlsZSwgY3JlZGVudGlhbHMsIGVuY3J5cHRpb24ga2V5LCB0aGVtZXMsIGFuZCBhbGwgYnJvd3NlciBwcmVmZXJlbmNlcy5cbiAgICAgICAgICA8L3A+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImJhY2t1cC1leHBvcnQtYnRuXCIgc3R5bGU9XCJ3aWR0aDogMTAwJTsgcGFkZGluZzogMTBweDsgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgIzI3YWU2MCAwJSwgIzJlY2M3MSAxMDAlKTsgYm9yZGVyOiBub25lOyBjb2xvcjogd2hpdGU7IGZvbnQtd2VpZ2h0OiA2MDA7IGJvcmRlci1yYWRpdXM6IDhweDsgY3Vyc29yOiBwb2ludGVyO1wiPlxuICAgICAgICAgICAgXHUyQjA3XHVGRTBGIERvd25sb2FkIEZ1bGwgQmFja3VwXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gSW1wb3J0IFNlY3Rpb24gLS0+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAxNnB4OyBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCBjb2xvci1taXgoaW4gc3JnYiwgIzM0OThkYiAxNSUsIHRyYW5zcGFyZW50KSwgY29sb3ItbWl4KGluIHNyZ2IsICMyOTgwYjkgMTAlLCB0cmFuc3BhcmVudCkpOyBib3JkZXItcmFkaXVzOiAxMHB4OyBib3JkZXI6IDFweCBzb2xpZCAjMzQ5OGRiO1wiPlxuICAgICAgICAgIDxoNCBzdHlsZT1cIm1hcmdpbjogMCAwIDhweDsgY29sb3I6ICMzNDk4ZGI7IGZvbnQtc2l6ZTogMC45NXJlbTtcIj5cdUQ4M0RcdURDRTUgUmVzdG9yZSBCYWNrdXA8L2g0PlxuICAgICAgICAgIDxwIHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbjogMCAwIDEycHg7XCI+XG4gICAgICAgICAgICBVcGxvYWQgYSBiYWNrdXAgZmlsZSB0byByZXN0b3JlIHlvdXIgZW50aXJlIGNvbmZpZ3VyYXRpb24gXHUyMDE0IGRyYWcgYW5kIGRyb3AgcmVhZHkuXG4gICAgICAgICAgPC9wPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZmlsZVwiIGlkPVwiYmFja3VwLWZpbGUtaW5wdXRcIiBhY2NlcHQ9XCIuanNvblwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIiAvPlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJiYWNrdXAtc2VsZWN0LWZpbGVcIiBzdHlsZT1cIndpZHRoOiAxMDAlOyBwYWRkaW5nOiAxMHB4OyBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjMzQ5OGRiIDAlLCAjMjk4MGI5IDEwMCUpOyBib3JkZXI6IG5vbmU7IGNvbG9yOiB3aGl0ZTsgZm9udC13ZWlnaHQ6IDYwMDsgYm9yZGVyLXJhZGl1czogOHB4OyBjdXJzb3I6IHBvaW50ZXI7XCI+XG4gICAgICAgICAgICBcdUQ4M0RcdURDQzEgU2VsZWN0IEJhY2t1cCBGaWxlXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGRpdiBpZD1cImJhY2t1cC1maWxlLW5hbWVcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IG1hcmdpbi10b3A6IDhweDsgcGFkZGluZzogOHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpOyBib3JkZXItcmFkaXVzOiA2cHg7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBQcmV2aWV3IFNlY3Rpb24gKHNob3duIGFmdGVyIGZpbGUgc2VsZWN0ZWQpIC0tPlxuICAgICAgICA8ZGl2IGlkPVwiYmFja3VwLXByZXZpZXdcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IG1hcmdpbi10b3A6IDE2cHg7IHBhZGRpbmc6IDE2cHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGJvcmRlci1yYWRpdXM6IDEwcHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCI+XG4gICAgICAgICAgPGg0IHN0eWxlPVwibWFyZ2luOiAwIDAgMTJweDsgZm9udC1zaXplOiAwLjlyZW07XCI+XHVEODNEXHVEQ0NCIEJhY2t1cCBDb250ZW50czwvaDQ+XG4gICAgICAgICAgPGRpdiBpZD1cImJhY2t1cC1wcmV2aWV3LWNvbnRlbnRcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC44NXJlbTtcIj48L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMTJweDsgcGFkZGluZy10b3A6IDEycHg7IGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtbGFiZWxcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC44NXJlbTtcIj5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwiYmFja3VwLXJlbG9hZC1jYWRkeVwiIGNoZWNrZWQgLz5cbiAgICAgICAgICAgICAgUmVsb2FkIENhZGR5IGFmdGVyIHJlc3RvcmVcbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImJhY2t1cC1kby1yZXN0b3JlLWJ0blwiIHN0eWxlPVwid2lkdGg6IDEwMCU7IG1hcmdpbi10b3A6IDEycHg7IHBhZGRpbmc6IDEwcHg7IGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsICNlNzRjM2MgMCUsICNjMDM5MmIgMTAwJSk7IGJvcmRlcjogbm9uZTsgY29sb3I6IHdoaXRlOyBmb250LXdlaWdodDogNjAwOyBib3JkZXItcmFkaXVzOiA4cHg7IGN1cnNvcjogcG9pbnRlcjtcIj5cbiAgICAgICAgICAgIFx1MjZBMSBSZXN0b3JlIEV2ZXJ5dGhpbmdcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBSZXN1bHQgTWVzc2FnZSAtLT5cbiAgICAgICAgPGRpdiBpZD1cImJhY2t1cC1yZXN1bHRcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IG1hcmdpbi10b3A6IDE2cHg7IHBhZGRpbmc6IDEycHg7IGJvcmRlci1yYWRpdXM6IDhweDtcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFRhYjogU2NoZWR1bGVzIChQcmVtaXVtKSAtLT5cbiAgICAgIDxkaXYgaWQ9XCJiYWNrdXAtc2NoZWR1bGVzLXRhYlwiIGNsYXNzPVwicGFuZWwtc2VjdGlvblwiPlxuICAgICAgICA8ZGl2IGlkPVwiYmFja3VwLXNjaGVkdWxlcy1jb250YWluZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1MjNGMDwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnJhbmQtc3Bpbm5lclwiPjwvc3Bhbj4gTG9hZGluZyBzY2hlZHVsZXMuLi5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBUYWI6IEJhY2t1cHMgb24gRGlzayAtLT5cbiAgICAgIDxkaXYgaWQ9XCJiYWNrdXAtZGlzay10YWJcIiBjbGFzcz1cInBhbmVsLXNlY3Rpb25cIj5cbiAgICAgICAgPGRpdiBpZD1cImJhY2t1cC1kaXNrLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHVEODNEXHVEQ0JFPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJicmFuZC1zcGlubmVyXCI+PC9zcGFuPiBMb2FkaW5nIGJhY2t1cCBmaWxlcy4uLlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFRhYjogUG9pbnQtaW4tVGltZSBSZXN0b3JlIC0tPlxuICAgICAgPGRpdiBpZD1cImJhY2t1cC1wb2ludGludGltZS10YWJcIiBjbGFzcz1cInBhbmVsLXNlY3Rpb25cIj5cbiAgICAgICAgPGRpdiBpZD1cInBvaW50aW50aW1lLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHUyM0VBPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJicmFuZC1zcGlubmVyXCI+PC9zcGFuPiBMb2FkaW5nLi4uXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gVGFiOiBCYWNrdXAgSGlzdG9yeSAtLT5cbiAgICAgIDxkaXYgaWQ9XCJiYWNrdXAtaGlzdG9yeS10YWJcIiBjbGFzcz1cInBhbmVsLXNlY3Rpb25cIj5cbiAgICAgICAgPGRpdiBpZD1cImJhY2t1cC1oaXN0b3J5LWNvbnRhaW5lclwiIHN0eWxlPVwibWF4LWhlaWdodDogNDAwcHg7IG92ZXJmbG93LXk6IGF1dG87XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdUQ4M0RcdURDQ0I8L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+IExvYWRpbmcgYmFja3VwIGhpc3RvcnkuLi5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBDbG9zZSBCdXR0b24gLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zIG1vZGFsLWZvb3Rlci1iYXJcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImJhY2t1cC1jYW5jZWxcIj5DbG9zZTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PmApO1xuXG4gIHZhciBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYWNrdXAtbW9kYWwnKTtcbiAgdmFyIG9wZW5CdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFja3VwLXJlc3RvcmUtYnRuJyk7XG4gIHZhciBjYW5jZWxCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFja3VwLWNhbmNlbCcpO1xuICB2YXIgZXhwb3J0QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhY2t1cC1leHBvcnQtYnRuJyk7XG4gIHZhciBzZWxlY3RGaWxlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhY2t1cC1zZWxlY3QtZmlsZScpO1xuICB2YXIgZmlsZUlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhY2t1cC1maWxlLWlucHV0Jyk7XG4gIHZhciBmaWxlTmFtZURpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYWNrdXAtZmlsZS1uYW1lJyk7XG4gIHZhciBwcmV2aWV3RGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhY2t1cC1wcmV2aWV3Jyk7XG4gIHZhciBwcmV2aWV3Q29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYWNrdXAtcHJldmlldy1jb250ZW50Jyk7XG4gIHZhciByZXN0b3JlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhY2t1cC1kby1yZXN0b3JlLWJ0bicpO1xuICB2YXIgcmVzdWx0RGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhY2t1cC1yZXN1bHQnKTtcbiAgdmFyIHNjaGVkdWxlQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhY2t1cC1zY2hlZHVsZXMtY29udGFpbmVyJyk7XG4gIHZhciBoaXN0b3J5Q29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhY2t1cC1oaXN0b3J5LWNvbnRhaW5lcicpO1xuICB2YXIgZGlza0NvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYWNrdXAtZGlzay1jb250YWluZXInKTtcbiAgdmFyIHBvaW50aW50aW1lQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BvaW50aW50aW1lLWNvbnRhaW5lcicpO1xuXG4gIHZhciBzZWxlY3RlZEJhY2t1cCA9IG51bGw7XG5cbiAgLy8gT3BlbiBtb2RhbFxuICBvcGVuQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKCkge1xuICAgIG1vZGFsLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgICBpZiAocmVzdWx0RGl2KSByZXN1bHREaXYuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBpZiAocHJldmlld0RpdikgcHJldmlld0Rpdi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIGlmIChmaWxlTmFtZURpdikgZmlsZU5hbWVEaXYuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBzZWxlY3RlZEJhY2t1cCA9IG51bGw7XG4gIH0pO1xuXG4gIHdpcmVNb2RhbChtb2RhbCwgY2FuY2VsQnRuKTtcblxuICAvLyA9PT0gRVhQT1JUOiBTZXJ2ZXIgYmFja3VwICsgYnJvd3NlciBzdGF0ZSBpbiBvbmUgZmlsZSA9PT1cbiAgZXhwb3J0QnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jIGZ1bmN0aW9uKCkge1xuICAgIGV4cG9ydEJ0bi5kaXNhYmxlZCA9IHRydWU7XG4gICAgZXhwb3J0QnRuLmlubmVySFRNTCA9ICc8c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+IEV4cG9ydGluZy4uLic7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEZldGNoIHNlcnZlci1zaWRlIGJhY2t1cCAoY29uZmlnLCBzZXJ2aWNlcywgY2FkZHlmaWxlLCBjcmVkZW50aWFscywgZW5jcnlwdGlvbiBrZXksIHRoZW1lcywgZXRjLilcbiAgICAgIHZhciByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2JhY2t1cC9leHBvcnQnKTtcbiAgICAgIHZhciBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuXG4gICAgICAvLyBBZGQgYWxsIGJyb3dzZXIgbG9jYWxTdG9yYWdlIHN0YXRlXG4gICAgICBkYXRhLmJyb3dzZXJTdGF0ZSA9IGNvbGxlY3RCcm93c2VyU3RhdGUoKTtcblxuICAgICAgLy8gRG93bmxvYWQgdW5pZmllZCBiYWNrdXBcbiAgICAgIHZhciBibG9iID0gbmV3IEJsb2IoW0pTT04uc3RyaW5naWZ5KGRhdGEsIG51bGwsIDIpXSwgeyB0eXBlOiAnYXBwbGljYXRpb24vanNvbicgfSk7XG4gICAgICB2YXIgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICAgIHZhciBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgYS5ocmVmID0gdXJsO1xuICAgICAgYS5kb3dubG9hZCA9ICdkYXNoY2FkZHktYmFja3VwLScgKyBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXSArICcuanNvbic7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpO1xuICAgICAgYS5jbGljaygpO1xuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChhKTtcbiAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKTtcblxuICAgICAgdmFyIHN0YXRlQ291bnQgPSBPYmplY3Qua2V5cyhkYXRhLmJyb3dzZXJTdGF0ZSkubGVuZ3RoO1xuICAgICAgdmFyIHRoZW1lQ291bnQgPSBkYXRhLnRoZW1lcyA/IE9iamVjdC5rZXlzKGRhdGEudGhlbWVzKS5sZW5ndGggOiAwO1xuICAgICAgcmVzdWx0RGl2LmlubmVySFRNTCA9ICdcdTI3MDUgRnVsbCBiYWNrdXAgZG93bmxvYWRlZCBcdTIwMTQgc2VydmVyIGNvbmZpZyArICcgKyBzdGF0ZUNvdW50ICsgJyBicm93c2VyIHNldHRpbmdzJyArICh0aGVtZUNvdW50ID8gJyArICcgKyB0aGVtZUNvdW50ICsgJyB0aGVtZXMnIDogJycpO1xuICAgICAgcmVzdWx0RGl2LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgcmVzdWx0RGl2LnN0eWxlLmJhY2tncm91bmQgPSAnY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW9rLWZnKSAxNSUsIHRyYW5zcGFyZW50KSc7XG4gICAgICByZXN1bHREaXYuc3R5bGUuYm9yZGVyID0gJzFweCBzb2xpZCB2YXIoLS1vay1mZyknO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJlc3VsdERpdi5pbm5lckhUTUwgPSAnXHUyNzRDIEV4cG9ydCBmYWlsZWQ6ICcgKyBlc2NhcGVIdG1sKGUubWVzc2FnZSk7XG4gICAgICByZXN1bHREaXYuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICByZXN1bHREaXYuc3R5bGUuYmFja2dyb3VuZCA9ICdjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tYmFkLWZnKSAxNSUsIHRyYW5zcGFyZW50KSc7XG4gICAgICByZXN1bHREaXYuc3R5bGUuYm9yZGVyID0gJzFweCBzb2xpZCB2YXIoLS1iYWQtZmcpJztcbiAgICB9XG4gICAgZXhwb3J0QnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgZXhwb3J0QnRuLmlubmVySFRNTCA9ICdcdTJCMDdcdUZFMEYgRG93bmxvYWQgRnVsbCBCYWNrdXAnO1xuICB9KTtcblxuICAvLyBTZWxlY3QgZmlsZSBidXR0b25cbiAgc2VsZWN0RmlsZUJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpIHsgZmlsZUlucHV0LmNsaWNrKCk7IH0pO1xuXG4gIC8vID09PSBGSUxFIFNFTEVDVEVEOiBQcmV2aWV3IGNvbnRlbnRzID09PVxuICBmaWxlSW5wdXQ/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGFzeW5jIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgZmlsZSA9IGUudGFyZ2V0LmZpbGVzWzBdO1xuICAgIGlmICghZmlsZSkgcmV0dXJuO1xuICAgIGZpbGVOYW1lRGl2LnRleHRDb250ZW50ID0gJ1x1RDgzRFx1RENDNCAnICsgZmlsZS5uYW1lO1xuICAgIGZpbGVOYW1lRGl2LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgIHJlc3VsdERpdi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIHRyeSB7XG4gICAgICB2YXIgdGV4dCA9IGF3YWl0IGZpbGUudGV4dCgpO1xuICAgICAgdmFyIGJhY2t1cCA9IEpTT04ucGFyc2UodGV4dCk7XG5cbiAgICAgIC8vIEhhbmRsZSBsZWdhY3kgdjEuMC4wIGZvcm1hdCAoZnJvbSBvbGQgaW1wb3J0LWV4cG9ydC5qcylcbiAgICAgIGlmIChpc0xlZ2FjeUZvcm1hdChiYWNrdXApKSB7XG4gICAgICAgIHNlbGVjdGVkQmFja3VwID0gYmFja3VwO1xuICAgICAgICB2YXIgaHRtbCA9ICc8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogOHB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBmb250LXNpemU6IDAuOHJlbTtcIj5MZWdhY3kgZm9ybWF0ICh2JyArIGVzY2FwZUh0bWwoYmFja3VwLnZlcnNpb24pICsgJyk8L2Rpdj4nO1xuICAgICAgICBodG1sICs9ICc8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZmxleC13cmFwOiB3cmFwOyBnYXA6IDZweDtcIj4nO1xuICAgICAgICBpZiAoYmFja3VwLnNlcnZpY2VzPy5sZW5ndGgpIGh0bWwgKz0gJzxzcGFuIHN0eWxlPVwicGFkZGluZzogNHB4IDhweDsgYmFja2dyb3VuZDogdmFyKC0tYmFzZSk7IGJvcmRlci1yYWRpdXM6IDRweDsgZm9udC1zaXplOiAwLjhyZW07XCI+XHVEODNEXHVEQ0NCICcgKyBiYWNrdXAuc2VydmljZXMubGVuZ3RoICsgJyBzZXJ2aWNlczwvc3Bhbj4nO1xuICAgICAgICBpZiAoYmFja3VwLmN1c3RvbUFwcHM/Lmxlbmd0aCkgaHRtbCArPSAnPHNwYW4gc3R5bGU9XCJwYWRkaW5nOiA0cHggOHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iYXNlKTsgYm9yZGVyLXJhZGl1czogNHB4OyBmb250LXNpemU6IDAuOHJlbTtcIj5cdUQ4M0RcdURDRTYgJyArIGJhY2t1cC5jdXN0b21BcHBzLmxlbmd0aCArICcgY3VzdG9tIGFwcHM8L3NwYW4+JztcbiAgICAgICAgaWYgKGJhY2t1cC50aGVtZSkgaHRtbCArPSAnPHNwYW4gc3R5bGU9XCJwYWRkaW5nOiA0cHggOHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iYXNlKTsgYm9yZGVyLXJhZGl1czogNHB4OyBmb250LXNpemU6IDAuOHJlbTtcIj5cdUQ4M0NcdURGQTggVGhlbWU6ICcgKyBlc2NhcGVIdG1sKGJhY2t1cC50aGVtZSkgKyAnPC9zcGFuPic7XG4gICAgICAgIGlmIChiYWNrdXAudXNlclRoZW1lcykgaHRtbCArPSAnPHNwYW4gc3R5bGU9XCJwYWRkaW5nOiA0cHggOHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iYXNlKTsgYm9yZGVyLXJhZGl1czogNHB4OyBmb250LXNpemU6IDAuOHJlbTtcIj5cdUQ4M0NcdURGQTggJyArIE9iamVjdC5rZXlzKGJhY2t1cC51c2VyVGhlbWVzKS5sZW5ndGggKyAnIGN1c3RvbSB0aGVtZXM8L3NwYW4+JztcbiAgICAgICAgaHRtbCArPSAnPC9kaXY+JztcbiAgICAgICAgcHJldmlld0NvbnRlbnQuaW5uZXJIVE1MID0gaHRtbDtcbiAgICAgICAgcHJldmlld0Rpdi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyB2MS4xKyAvIHYyLjAgZm9ybWF0IFx1MjAxNCBzZW5kIHRvIHNlcnZlciBmb3IgcHJldmlld1xuICAgICAgdmFyIHJlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvYmFja3VwL3ByZXZpZXcnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYmFja3VwKVxuICAgICAgfSk7XG4gICAgICB2YXIgcHJldmlldyA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgIGlmIChwcmV2aWV3LnN1Y2Nlc3MpIHtcbiAgICAgICAgc2VsZWN0ZWRCYWNrdXAgPSBiYWNrdXA7XG4gICAgICAgIHZhciBodG1sID0gJzxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiA4cHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7IGZvbnQtc2l6ZTogMC44cmVtO1wiPkV4cG9ydGVkOiAnICsgbmV3IERhdGUoYmFja3VwLmV4cG9ydGVkQXQpLnRvTG9jYWxlU3RyaW5nKCkgKyAnICh2JyArIGVzY2FwZUh0bWwoYmFja3VwLnZlcnNpb24pICsgJyk8L2Rpdj4nO1xuXG4gICAgICAgIC8vIFNlcnZlciBmaWxlc1xuICAgICAgICBodG1sICs9ICc8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogNnB4OyBmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7IGxldHRlci1zcGFjaW5nOiAwLjVweDtcIj5TZXJ2ZXIgQ29uZmlnPC9kaXY+JztcbiAgICAgICAgaHRtbCArPSAnPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGZsZXgtd3JhcDogd3JhcDsgZ2FwOiA2cHg7IG1hcmdpbi1ib3R0b206IDEwcHg7XCI+JztcbiAgICAgICAgZm9yICh2YXIga2V5IGluIHByZXZpZXcucHJldmlldy5maWxlcykge1xuICAgICAgICAgIHZhciBpbmZvID0gcHJldmlldy5wcmV2aWV3LmZpbGVzW2tleV07XG4gICAgICAgICAgdmFyIGljb24gPSBpbmZvLmFjdGlvbiA9PT0gJ2NyZWF0ZScgPyAnXHVEODNDXHVERDk1JyA6ICdcdUQ4M0RcdURDREQnO1xuICAgICAgICAgIGh0bWwgKz0gJzxzcGFuIHN0eWxlPVwicGFkZGluZzogNHB4IDhweDsgYmFja2dyb3VuZDogdmFyKC0tYmFzZSk7IGJvcmRlci1yYWRpdXM6IDRweDsgZm9udC1zaXplOiAwLjhyZW07XCI+JyArIGljb24gKyAnICcgKyBlc2NhcGVIdG1sKGluZm8uZGVzY3JpcHRpb24pICsgJzwvc3Bhbj4nO1xuICAgICAgICB9XG4gICAgICAgIGh0bWwgKz0gJzwvZGl2Pic7XG5cbiAgICAgICAgLy8gU2VydmljZXMgY291bnRcbiAgICAgICAgaWYgKHByZXZpZXcucHJldmlldy5zZXJ2aWNlQ291bnQpIHtcbiAgICAgICAgICBodG1sICs9ICc8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1hY2NlbnQpOyBtYXJnaW4tYm90dG9tOiA2cHg7XCI+JyArIHByZXZpZXcucHJldmlldy5zZXJ2aWNlQ291bnQgKyAnIHNlcnZpY2VzPC9kaXY+JztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZW1lc1xuICAgICAgICBpZiAocHJldmlldy5wcmV2aWV3LnRoZW1lQ291bnQpIHtcbiAgICAgICAgICBodG1sICs9ICc8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1hY2NlbnQpOyBtYXJnaW4tYm90dG9tOiA2cHg7XCI+XHVEODNDXHVERkE4ICcgKyBwcmV2aWV3LnByZXZpZXcudGhlbWVDb3VudCArICcgY3VzdG9tIHRoZW1lczwvZGl2Pic7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCcm93c2VyIHN0YXRlXG4gICAgICAgIGlmIChwcmV2aWV3LnByZXZpZXcuYnJvd3NlclN0YXRlQ291bnQpIHtcbiAgICAgICAgICBodG1sICs9ICc8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogNnB4OyBmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7IGxldHRlci1zcGFjaW5nOiAwLjVweDtcIj5Ccm93c2VyIFByZWZlcmVuY2VzPC9kaXY+JztcbiAgICAgICAgICBodG1sICs9ICc8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1hY2NlbnQpO1wiPlx1RDgzRFx1RERBNVx1RkUwRiAnICsgcHJldmlldy5wcmV2aWV3LmJyb3dzZXJTdGF0ZUNvdW50ICsgJyBzYXZlZCBzZXR0aW5ncyAodGhlbWUsIHdlYXRoZXIsIGNsb2NrLCB3aWRnZXRzLCBldGMuKTwvZGl2Pic7XG4gICAgICAgIH1cblxuICAgICAgICBwcmV2aWV3Q29udGVudC5pbm5lckhUTUwgPSBodG1sO1xuICAgICAgICBwcmV2aWV3RGl2LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0RGl2LmlubmVySFRNTCA9ICdcdTI2QTBcdUZFMEYgSW52YWxpZCBiYWNrdXAgZmlsZTogJyArIGVzY2FwZUh0bWwocHJldmlldy5lcnJvcik7XG4gICAgICAgIHJlc3VsdERpdi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgcmVzdWx0RGl2LnN0eWxlLmJhY2tncm91bmQgPSAnY29sb3ItbWl4KGluIHNyZ2IsICNmMzljMTIgMTUlLCB0cmFuc3BhcmVudCknO1xuICAgICAgICByZXN1bHREaXYuc3R5bGUuYm9yZGVyID0gJzFweCBzb2xpZCAjZjM5YzEyJztcbiAgICAgICAgcHJldmlld0Rpdi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJlc3VsdERpdi5pbm5lckhUTUwgPSAnXHUyNzRDIENvdWxkIG5vdCByZWFkIGZpbGU6ICcgKyBlc2NhcGVIdG1sKGUubWVzc2FnZSk7XG4gICAgICByZXN1bHREaXYuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICByZXN1bHREaXYuc3R5bGUuYmFja2dyb3VuZCA9ICdjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tYmFkLWZnKSAxNSUsIHRyYW5zcGFyZW50KSc7XG4gICAgICByZXN1bHREaXYuc3R5bGUuYm9yZGVyID0gJzFweCBzb2xpZCB2YXIoLS1iYWQtZmcpJztcbiAgICAgIHByZXZpZXdEaXYuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB9XG4gIH0pO1xuXG4gIC8vID09PSBSRVNUT1JFOiBTZXJ2ZXIgKyBicm93c2VyIHN0YXRlID09PVxuICByZXN0b3JlQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jIGZ1bmN0aW9uKCkge1xuICAgIGlmICghc2VsZWN0ZWRCYWNrdXApIHJldHVybjtcbiAgICBpZiAoIWNvbmZpcm0oJ1RoaXMgd2lsbCBvdmVyd3JpdGUgeW91ciBjdXJyZW50IGNvbmZpZ3VyYXRpb24gYW5kIGJyb3dzZXIgcHJlZmVyZW5jZXMuIENvbnRpbnVlPycpKSByZXR1cm47XG4gICAgcmVzdG9yZUJ0bi5kaXNhYmxlZCA9IHRydWU7XG4gICAgcmVzdG9yZUJ0bi5pbm5lckhUTUwgPSAnPHNwYW4gY2xhc3M9XCJicmFuZC1zcGlubmVyXCI+PC9zcGFuPiBSZXN0b3JpbmcuLi4nO1xuICAgIHRyeSB7XG4gICAgICAvLyBIYW5kbGUgbGVnYWN5IGZvcm1hdFxuICAgICAgaWYgKGlzTGVnYWN5Rm9ybWF0KHNlbGVjdGVkQmFja3VwKSkge1xuICAgICAgICByZXN0b3JlTGVnYWN5Rm9ybWF0KHNlbGVjdGVkQmFja3VwKTtcbiAgICAgICAgcmVzdWx0RGl2LmlubmVySFRNTCA9ICdcdTI3MDUgTGVnYWN5IGJhY2t1cCByZXN0b3JlZCBcdTIwMTQgYnJvd3NlciBzZXR0aW5ncyBhbmQgc2VydmljZXMgaW1wb3J0ZWQuJztcbiAgICAgICAgcmVzdWx0RGl2LnN0eWxlLmJhY2tncm91bmQgPSAnY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW9rLWZnKSAxNSUsIHRyYW5zcGFyZW50KSc7XG4gICAgICAgIHJlc3VsdERpdi5zdHlsZS5ib3JkZXIgPSAnMXB4IHNvbGlkIHZhcigtLW9rLWZnKSc7XG4gICAgICAgIHJlc3VsdERpdi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsgbG9jYXRpb24ucmVsb2FkKCk7IH0sIDIwMDApO1xuICAgICAgICByZXN0b3JlQnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICAgIHJlc3RvcmVCdG4uaW5uZXJIVE1MID0gJ1x1MjZBMSBSZXN0b3JlIEV2ZXJ5dGhpbmcnO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIHYxLjErIC8gdjIuMCBcdTIwMTQgcmVzdG9yZSBzZXJ2ZXItc2lkZSBmaXJzdFxuICAgICAgdmFyIHJlbG9hZENhZGR5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhY2t1cC1yZWxvYWQtY2FkZHknKT8uY2hlY2tlZCA/PyB0cnVlO1xuICAgICAgdmFyIHJlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvYmFja3VwL3Jlc3RvcmUnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBiYWNrdXA6IHNlbGVjdGVkQmFja3VwLCBvcHRpb25zOiB7IHJlbG9hZENhZGR5OiByZWxvYWRDYWRkeSB9IH0pXG4gICAgICB9KTtcbiAgICAgIHZhciBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuXG4gICAgICAvLyBUaGVuIHJlc3RvcmUgYnJvd3NlciBzdGF0ZVxuICAgICAgdmFyIGJyb3dzZXJDb3VudCA9IDA7XG4gICAgICBpZiAoc2VsZWN0ZWRCYWNrdXAuYnJvd3NlclN0YXRlKSB7XG4gICAgICAgIGJyb3dzZXJDb3VudCA9IHJlc3RvcmVCcm93c2VyU3RhdGUoc2VsZWN0ZWRCYWNrdXAuYnJvd3NlclN0YXRlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICB2YXIgbXNnID0gJ1x1MjcwNSAnICsgZGF0YS5tZXNzYWdlO1xuICAgICAgICBpZiAoYnJvd3NlckNvdW50ID4gMCkgbXNnICs9ICc8YnI+PHNtYWxsIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj4nICsgYnJvd3NlckNvdW50ICsgJyBicm93c2VyIHNldHRpbmdzIHJlc3RvcmVkPC9zbWFsbD4nO1xuICAgICAgICBpZiAoZGF0YS5yZXN1bHRzLmNhZGR5UmVsb2FkZWQpIG1zZyArPSAnPGJyPjxzbWFsbCBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+Q2FkZHkgY29uZmlndXJhdGlvbiByZWxvYWRlZDwvc21hbGw+JztcbiAgICAgICAgcmVzdWx0RGl2LmlubmVySFRNTCA9IG1zZztcbiAgICAgICAgcmVzdWx0RGl2LnN0eWxlLmJhY2tncm91bmQgPSAnY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW9rLWZnKSAxNSUsIHRyYW5zcGFyZW50KSc7XG4gICAgICAgIHJlc3VsdERpdi5zdHlsZS5ib3JkZXIgPSAnMXB4IHNvbGlkIHZhcigtLW9rLWZnKSc7XG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IGxvY2F0aW9uLnJlbG9hZCgpOyB9LCAyMDAwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdERpdi5pbm5lckhUTUwgPSAnXHUyNkEwXHVGRTBGICcgKyBlc2NhcGVIdG1sKGRhdGEubWVzc2FnZSk7XG4gICAgICAgIGlmIChicm93c2VyQ291bnQgPiAwKSByZXN1bHREaXYuaW5uZXJIVE1MICs9ICc8YnI+PHNtYWxsIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj4nICsgYnJvd3NlckNvdW50ICsgJyBicm93c2VyIHNldHRpbmdzIHdlcmUgcmVzdG9yZWQ8L3NtYWxsPic7XG4gICAgICAgIGlmIChkYXRhLnJlc3VsdHM/LmVycm9ycz8ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJlc3VsdERpdi5pbm5lckhUTUwgKz0gJzxicj48c21hbGw+JyArIGRhdGEucmVzdWx0cy5lcnJvcnMubWFwKGZ1bmN0aW9uKGUpIHsgcmV0dXJuIGVzY2FwZUh0bWwoZS5maWxlKSArICc6ICcgKyBlc2NhcGVIdG1sKGUuZXJyb3IpOyB9KS5qb2luKCcsICcpICsgJzwvc21hbGw+JztcbiAgICAgICAgfVxuICAgICAgICByZXN1bHREaXYuc3R5bGUuYmFja2dyb3VuZCA9ICdjb2xvci1taXgoaW4gc3JnYiwgI2YzOWMxMiAxNSUsIHRyYW5zcGFyZW50KSc7XG4gICAgICAgIHJlc3VsdERpdi5zdHlsZS5ib3JkZXIgPSAnMXB4IHNvbGlkICNmMzljMTInO1xuICAgICAgfVxuICAgICAgcmVzdWx0RGl2LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJlc3VsdERpdi5pbm5lckhUTUwgPSAnXHUyNzRDIFJlc3RvcmUgZmFpbGVkOiAnICsgZXNjYXBlSHRtbChlLm1lc3NhZ2UpO1xuICAgICAgcmVzdWx0RGl2LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgcmVzdWx0RGl2LnN0eWxlLmJhY2tncm91bmQgPSAnY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWJhZC1mZykgMTUlLCB0cmFuc3BhcmVudCknO1xuICAgICAgcmVzdWx0RGl2LnN0eWxlLmJvcmRlciA9ICcxcHggc29saWQgdmFyKC0tYmFkLWZnKSc7XG4gICAgfVxuICAgIHJlc3RvcmVCdG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICByZXN0b3JlQnRuLmlubmVySFRNTCA9ICdcdTI2QTEgUmVzdG9yZSBFdmVyeXRoaW5nJztcbiAgfSk7XG5cbiAgLy8gPT09IFNjaGVkdWxlcyBUYWIgKFByZW1pdW0pID09PVxuICBhc3luYyBmdW5jdGlvbiBsb2FkU2NoZWR1bGVzVGFiKCkge1xuICAgIGlmICghc2NoZWR1bGVDb250YWluZXIpIHJldHVybjtcbiAgICBzY2hlZHVsZUNvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJicmFuZC1zcGlubmVyXCI+PC9zcGFuPiBMb2FkaW5nLi4uPC9kaXY+JztcbiAgICB0cnkge1xuICAgICAgdmFyIHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2JhY2t1cHMvc2NoZWR1bGUnKTtcbiAgICAgIHZhciBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIFxuICAgICAgaWYgKGRhdGEucHJlbWl1bVJlcXVpcmVkKSB7XG4gICAgICAgIHNjaGVkdWxlQ29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIiBzdHlsZT1cInBhZGRpbmc6IDI0cHg7IHRleHQtYWxpZ246IGNlbnRlcjtcIj4nICtcbiAgICAgICAgICAnPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMnJlbTsgbWFyZ2luLWJvdHRvbTogMTJweDtcIj5cdTJCNTA8L2Rpdj4nICtcbiAgICAgICAgICAnPGRpdiBzdHlsZT1cImZvbnQtd2VpZ2h0OiA2MDA7IG1hcmdpbi1ib3R0b206IDhweDtcIj5QcmVtaXVtIEZlYXR1cmU8L2Rpdj4nICtcbiAgICAgICAgICAnPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC44NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5BdXRvLWJhY2t1cCBzY2hlZHVsaW5nIHJlcXVpcmVzIGEgRGFzaENhZGR5IFByZW1pdW0gc3Vic2NyaXB0aW9uLjwvZGl2PicgK1xuICAgICAgICAgICc8YnV0dG9uIG9uY2xpY2s9XCJzaG93Tm90aWZpY2F0aW9uKFxcJ1VwZ3JhZGUgdG8gUHJlbWl1bSB0byBlbmFibGUgYXV0by1iYWNrdXBzIVxcJywgXFwnaW5mb1xcJyk7IHNjcm9sbFRvU2VjdGlvbihcXCdsaWNlbnNlXFwnKTtcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDE2cHg7IHBhZGRpbmc6IDhweCAyMHB4OyBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjZjM5YzEyLCAjZTY3ZTIyKTsgYm9yZGVyOiBub25lOyBjb2xvcjogd2hpdGU7IGJvcmRlci1yYWRpdXM6IDhweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXdlaWdodDogNjAwO1wiPlVwZ3JhZGUgdG8gUHJlbWl1bTwvYnV0dG9uPicgK1xuICAgICAgICAgICc8L2Rpdj4nO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBcbiAgICAgIGlmICghZGF0YS5zdWNjZXNzKSB0aHJvdyBuZXcgRXJyb3IoZGF0YS5lcnJvciB8fCAnRmFpbGVkIHRvIGxvYWQgc2NoZWR1bGVzJyk7XG4gICAgICBcbiAgICAgIHZhciBzY2hlZHVsZXMgPSBkYXRhLnNjaGVkdWxlcyB8fCBbXTtcbiAgICAgIFxuICAgICAgaWYgKHNjaGVkdWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgc2NoZWR1bGVDb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPicgK1xuICAgICAgICAgICc8c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdTIzRjA8L3NwYW4+JyArXG4gICAgICAgICAgJzxkaXY+Tm8gYmFja3VwIHNjaGVkdWxlcyBjb25maWd1cmVkPC9kaXY+JyArXG4gICAgICAgICAgJzxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLXRvcDogNHB4O1wiPlNlbGVjdCBhcHBzIGJlbG93IHRvIGVuYWJsZSBhdXRvLWJhY2t1cDwvZGl2PicgK1xuICAgICAgICAgICc8L2Rpdj4nO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBcbiAgICAgIHZhciBodG1sID0gJzxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDhweDtcIj4nO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzY2hlZHVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHNjaCA9IHNjaGVkdWxlc1tpXTtcbiAgICAgICAgdmFyIG5leHRSdW5TdHIgPSBzY2gubmV4dFJ1biA/IG5ldyBEYXRlKHNjaC5uZXh0UnVuKS50b0xvY2FsZVN0cmluZygpIDogJ05vdCBzY2hlZHVsZWQnO1xuICAgICAgICB2YXIgbGFzdFJ1blN0ciA9IHNjaC5sYXN0UnVuID8gbmV3IERhdGUoc2NoLmxhc3RSdW4pLnRvTG9jYWxlU3RyaW5nKCkgOiAnTmV2ZXInO1xuICAgICAgICBcbiAgICAgICAgaHRtbCArPSAnPGRpdiBzdHlsZT1cInBhZGRpbmc6IDEycHggMTRweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTsgYm9yZGVyLXJhZGl1czogOHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPicgK1xuICAgICAgICAgICc8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOyBhbGlnbi1pdGVtczogY2VudGVyOyBtYXJnaW4tYm90dG9tOiA4cHg7XCI+JyArXG4gICAgICAgICAgJyAgPGRpdiBzdHlsZT1cImZvbnQtd2VpZ2h0OiA2MDA7IGZvbnQtc2l6ZTogMC45cmVtO1wiPicgKyBlc2NhcGVIdG1sKHNjaC5hcHBJZCkgKyAnPC9kaXY+JyArXG4gICAgICAgICAgJyAgPGxhYmVsIGNsYXNzPVwidG9nZ2xlLXN3aXRjaFwiIHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA2cHg7XCI+JyArXG4gICAgICAgICAgJyAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJzY2hlZHVsZS10b2dnbGVcIiBkYXRhLWFwcGlkPVwiJyArIGVzY2FwZUh0bWwoc2NoLmFwcElkKSArICdcIicgKyAoc2NoLmVuYWJsZWQgPyAnIGNoZWNrZWQnIDogJycpICsgJyAvPicgK1xuICAgICAgICAgICcgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+JyArIChzY2guZW5hYmxlZCA/ICdPTicgOiAnT0ZGJykgKyAnPC9zcGFuPicgK1xuICAgICAgICAgICcgIDwvbGFiZWw+JyArXG4gICAgICAgICAgJzwvZGl2PicgK1xuICAgICAgICAgICc8ZGl2IHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyOyBnYXA6IDhweDsgZm9udC1zaXplOiAwLjhyZW07IG1hcmdpbi1ib3R0b206IDEwcHg7XCI+JyArXG4gICAgICAgICAgJyAgPGRpdj48c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+U2NoZWR1bGU6PC9zcGFuPiA8c2VsZWN0IGNsYXNzPVwic2NoZWR1bGUtc2VsZWN0XCIgZGF0YS1hcHBpZD1cIicgKyBlc2NhcGVIdG1sKHNjaC5hcHBJZCkgKyAnXCIgc3R5bGU9XCJiYWNrZ3JvdW5kOiB2YXIoLS1iYXNlKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNHB4OyBwYWRkaW5nOiAycHggNnB4O1wiPicgK1xuICAgICAgICAgICcgICAgPG9wdGlvbiB2YWx1ZT1cImhvdXJseVwiJyArIChzY2guc2NoZWR1bGUgPT09ICdob3VybHknID8gJyBzZWxlY3RlZCcgOiAnJykgKyAnPkhvdXJseTwvb3B0aW9uPicgK1xuICAgICAgICAgICcgICAgPG9wdGlvbiB2YWx1ZT1cImRhaWx5XCInICsgKHNjaC5zY2hlZHVsZSA9PT0gJ2RhaWx5JyA/ICcgc2VsZWN0ZWQnIDogJycpICsgJz5EYWlseTwvb3B0aW9uPicgK1xuICAgICAgICAgICcgICAgPG9wdGlvbiB2YWx1ZT1cIndlZWtseVwiJyArIChzY2guc2NoZWR1bGUgPT09ICd3ZWVrbHknID8gJyBzZWxlY3RlZCcgOiAnJykgKyAnPldlZWtseTwvb3B0aW9uPicgK1xuICAgICAgICAgICcgICAgPG9wdGlvbiB2YWx1ZT1cIm1vbnRobHlcIicgKyAoc2NoLnNjaGVkdWxlID09PSAnbW9udGhseScgPyAnIHNlbGVjdGVkJyA6ICcnKSArICc+TW9udGhseTwvb3B0aW9uPicgK1xuICAgICAgICAgICcgIDwvc2VsZWN0PjwvZGl2PicgK1xuICAgICAgICAgICcgIDxkaXY+PHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPktlZXAgbGFzdDo8L3NwYW4+IDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgY2xhc3M9XCJyZXRlbnRpb24taW5wdXRcIiBkYXRhLWFwcGlkPVwiJyArIGVzY2FwZUh0bWwoc2NoLmFwcElkKSArICdcIiB2YWx1ZT1cIicgKyAoc2NoLnJldGVudGlvbj8ua2VlcCB8fCA3KSArICdcIiBtaW49XCIxXCIgbWF4PVwiMTAwXCIgc3R5bGU9XCJ3aWR0aDogNTBweDsgYmFja2dyb3VuZDogdmFyKC0tYmFzZSk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDRweDsgcGFkZGluZzogMnB4IDZweDtcIiAvPjwvZGl2PicgK1xuICAgICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgICAnPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLWJvdHRvbTogMTBweDtcIj4nICtcbiAgICAgICAgICAnICA8ZGl2Pk5leHQgcnVuOiAnICsgZXNjYXBlSHRtbChuZXh0UnVuU3RyKSArICc8L2Rpdj4nICtcbiAgICAgICAgICAnICA8ZGl2Pkxhc3QgcnVuOiAnICsgZXNjYXBlSHRtbChsYXN0UnVuU3RyKSArICc8L2Rpdj4nICtcbiAgICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICAgJzxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDZweDtcIj4nICtcbiAgICAgICAgICAnICA8YnV0dG9uIGNsYXNzPVwic2NoZWR1bGUtcnVuLW5vd1wiIGRhdGEtYXBwaWQ9XCInICsgZXNjYXBlSHRtbChzY2guYXBwSWQpICsgJ1wiIHN0eWxlPVwicGFkZGluZzogNXB4IDEycHg7IGZvbnQtc2l6ZTogMC44cmVtOyBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tb2stZmcpIDIwJSwgdHJhbnNwYXJlbnQpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1vay1mZyk7IGNvbG9yOiB2YXIoLS1vay1mZyk7IGJvcmRlci1yYWRpdXM6IDZweDsgY3Vyc29yOiBwb2ludGVyO1wiPlx1MjVCNlx1RkUwRiBSdW4gTm93PC9idXR0b24+JyArXG4gICAgICAgICAgJyAgPGJ1dHRvbiBjbGFzcz1cInNjaGVkdWxlLWRlbGV0ZVwiIGRhdGEtYXBwaWQ9XCInICsgZXNjYXBlSHRtbChzY2guYXBwSWQpICsgJ1wiIHN0eWxlPVwicGFkZGluZzogNXB4IDEycHg7IGZvbnQtc2l6ZTogMC44cmVtOyBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYmFkLWZnKTsgY29sb3I6IHZhcigtLWJhZC1mZyk7IGJvcmRlci1yYWRpdXM6IDZweDsgY3Vyc29yOiBwb2ludGVyO1wiPlx1RDgzRFx1REREMVx1RkUwRiBSZW1vdmU8L2J1dHRvbj4nICtcbiAgICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICAgJzwvZGl2Pic7XG4gICAgICB9XG4gICAgICBodG1sICs9ICc8L2Rpdj4nO1xuICAgICAgXG4gICAgICAvLyBBZGQgXCJBZGQgU2NoZWR1bGVcIiBzZWN0aW9uIGF0IGJvdHRvbVxuICAgICAgaHRtbCArPSAnPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDE2cHg7IHBhZGRpbmc6IDE2cHg7IGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1hY2NlbnQpIDUlLCB0cmFuc3BhcmVudCk7IGJvcmRlci1yYWRpdXM6IDEwcHg7IGJvcmRlcjogMXB4IGRhc2hlZCB2YXIoLS1ib3JkZXIpO1wiPicgK1xuICAgICAgICAnPGg0IHN0eWxlPVwibWFyZ2luOiAwIDAgMTJweDsgZm9udC1zaXplOiAwLjg1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPlx1Mjc5NSBBZGQgTmV3IFNjaGVkdWxlPC9oND4nICtcbiAgICAgICAgJzxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDhweDsgZmxleC13cmFwOiB3cmFwO1wiPicgK1xuICAgICAgICAnICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cIm5ldy1zY2hlZHVsZS1hcHBpZFwiIHBsYWNlaG9sZGVyPVwiQXBwIElEIChlLmcuLCBwbGV4LCBzb25hcnIpXCIgc3R5bGU9XCJmbGV4OiAxOyBtaW4td2lkdGg6IDE1MHB4OyBwYWRkaW5nOiA4cHg7IGJvcmRlci1yYWRpdXM6IDZweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYmFja2dyb3VuZDogdmFyKC0tYmFzZSk7XCIgLz4nICtcbiAgICAgICAgJyAgPHNlbGVjdCBpZD1cIm5ldy1zY2hlZHVsZS1pbnRlcnZhbFwiIHN0eWxlPVwicGFkZGluZzogOHB4OyBib3JkZXItcmFkaXVzOiA2cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJhY2tncm91bmQ6IHZhcigtLWJhc2UpO1wiPicgK1xuICAgICAgICAnICAgIDxvcHRpb24gdmFsdWU9XCJob3VybHlcIj5Ib3VybHk8L29wdGlvbj4nICtcbiAgICAgICAgJyAgICA8b3B0aW9uIHZhbHVlPVwiZGFpbHlcIiBzZWxlY3RlZD5EYWlseTwvb3B0aW9uPicgK1xuICAgICAgICAnICAgIDxvcHRpb24gdmFsdWU9XCJ3ZWVrbHlcIj5XZWVrbHk8L29wdGlvbj4nICtcbiAgICAgICAgJyAgICA8b3B0aW9uIHZhbHVlPVwibW9udGhseVwiPk1vbnRobHk8L29wdGlvbj4nICtcbiAgICAgICAgJyAgICA8b3B0aW9uIHZhbHVlPVwiNmhcIj5FdmVyeSA2IGhvdXJzPC9vcHRpb24+JyArXG4gICAgICAgICcgICAgPG9wdGlvbiB2YWx1ZT1cIjMwbVwiPkV2ZXJ5IDMwIG1pbnV0ZXM8L29wdGlvbj4nICtcbiAgICAgICAgJyAgPC9zZWxlY3Q+JyArXG4gICAgICAgICcgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJuZXctc2NoZWR1bGUtcmV0ZW50aW9uXCIgdmFsdWU9XCI3XCIgbWluPVwiMVwiIG1heD1cIjEwMFwiIHBsYWNlaG9sZGVyPVwiS2VlcFwiIHN0eWxlPVwid2lkdGg6IDcwcHg7IHBhZGRpbmc6IDhweDsgYm9yZGVyLXJhZGl1czogNnB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBiYWNrZ3JvdW5kOiB2YXIoLS1iYXNlKTtcIiAvPicgK1xuICAgICAgICAnICA8YnV0dG9uIGlkPVwiYWRkLXNjaGVkdWxlLWJ0blwiIHN0eWxlPVwicGFkZGluZzogOHB4IDE2cHg7IGJhY2tncm91bmQ6IHZhcigtLWFjY2VudCk7IGJvcmRlcjogbm9uZTsgY29sb3I6IHdoaXRlOyBib3JkZXItcmFkaXVzOiA2cHg7IGN1cnNvcjogcG9pbnRlcjsgZm9udC13ZWlnaHQ6IDUwMDtcIj5BZGQgU2NoZWR1bGU8L2J1dHRvbj4nICtcbiAgICAgICAgJzwvZGl2PicgK1xuICAgICAgICAnPC9kaXY+JztcbiAgICAgIFxuICAgICAgc2NoZWR1bGVDb250YWluZXIuaW5uZXJIVE1MID0gaHRtbDtcbiAgICAgIFxuICAgICAgLy8gV2lyZSB1cCBldmVudCBsaXN0ZW5lcnNcbiAgICAgIHNjaGVkdWxlQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJy5zY2hlZHVsZS10b2dnbGUnKS5mb3JFYWNoKGZ1bmN0aW9uKHRvZ2dsZSkge1xuICAgICAgICB0b2dnbGUuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZnVuY3Rpb24oKSB7IHVwZGF0ZVNjaGVkdWxlKHRvZ2dsZS5kYXRhc2V0LmFwcGlkLCB7IGVuYWJsZWQ6IHRvZ2dsZS5jaGVja2VkIH0pOyB9KTtcbiAgICAgIH0pO1xuICAgICAgc2NoZWR1bGVDb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnLnNjaGVkdWxlLXNlbGVjdCcpLmZvckVhY2goZnVuY3Rpb24oc2VsKSB7XG4gICAgICAgIHNlbC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmdW5jdGlvbigpIHsgdXBkYXRlU2NoZWR1bGUoc2VsLmRhdGFzZXQuYXBwaWQsIHsgc2NoZWR1bGU6IHNlbC52YWx1ZSB9KTsgfSk7XG4gICAgICB9KTtcbiAgICAgIHNjaGVkdWxlQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJy5yZXRlbnRpb24taW5wdXQnKS5mb3JFYWNoKGZ1bmN0aW9uKGlucCkge1xuICAgICAgICBpbnAuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZnVuY3Rpb24oKSB7IHVwZGF0ZVNjaGVkdWxlKGlucC5kYXRhc2V0LmFwcGlkLCB7IHJldGVudGlvbjogeyBrZWVwOiBwYXJzZUludChpbnAudmFsdWUpIHx8IDcgfSB9KTsgfSk7XG4gICAgICB9KTtcbiAgICAgIHNjaGVkdWxlQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJy5zY2hlZHVsZS1ydW4tbm93JykuZm9yRWFjaChmdW5jdGlvbihidG4pIHtcbiAgICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKSB7IHJ1bkJhY2t1cE5vdyhidG4uZGF0YXNldC5hcHBpZCk7IH0pO1xuICAgICAgfSk7XG4gICAgICBzY2hlZHVsZUNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCcuc2NoZWR1bGUtZGVsZXRlJykuZm9yRWFjaChmdW5jdGlvbihidG4pIHtcbiAgICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKSB7IGRlbGV0ZVNjaGVkdWxlKGJ0bi5kYXRhc2V0LmFwcGlkKTsgfSk7XG4gICAgICB9KTtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhZGQtc2NoZWR1bGUtYnRuJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYWRkTmV3U2NoZWR1bGUpO1xuICAgICAgXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2NoZWR1bGVDb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RmFpbGVkIHRvIGxvYWQ6ICcgKyBlc2NhcGVIdG1sKGUubWVzc2FnZSkgKyAnPC9kaXY+JztcbiAgICB9XG4gIH1cbiAgXG4gIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVNjaGVkdWxlKGFwcElkLCB1cGRhdGVzKSB7XG4gICAgdHJ5IHtcbiAgICAgIHZhciByZXMgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9iYWNrdXBzL3NjaGVkdWxlJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgYXBwSWQsIC4uLnVwZGF0ZXMgfSlcbiAgICAgIH0pO1xuICAgICAgdmFyIGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdTY2hlZHVsZSB1cGRhdGVkIGZvciAnICsgYXBwSWQsICdzdWNjZXNzJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdVcGRhdGUgZmFpbGVkOiAnICsgKGRhdGEuZXJyb3IgfHwgJ1Vua25vd24nKSwgJ2Vycm9yJyk7XG4gICAgICAgIGxvYWRTY2hlZHVsZXNUYWIoKTsgLy8gUmVmcmVzaCBvbiBmYWlsdXJlXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignRXJyb3I6ICcgKyBlLm1lc3NhZ2UsICdlcnJvcicpO1xuICAgIH1cbiAgfVxuICBcbiAgYXN5bmMgZnVuY3Rpb24gcnVuQmFja3VwTm93KGFwcElkKSB7XG4gICAgdHJ5IHtcbiAgICAgIHZhciByZXMgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9iYWNrdXBzL2JhY2t1cC8nICsgZW5jb2RlVVJJQ29tcG9uZW50KGFwcElkKSwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH1cbiAgICAgIH0pO1xuICAgICAgdmFyIGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdCYWNrdXAgc3RhcnRlZCBmb3IgJyArIGFwcElkICsgJyEnLCAnc3VjY2VzcycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbignQmFja3VwIGZhaWxlZDogJyArIChkYXRhLmVycm9yIHx8ICdVbmtub3duJyksICdlcnJvcicpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ0Vycm9yOiAnICsgZS5tZXNzYWdlLCAnZXJyb3InKTtcbiAgICB9XG4gIH1cbiAgXG4gIGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZVNjaGVkdWxlKGFwcElkKSB7XG4gICAgaWYgKCFjb25maXJtKCdSZW1vdmUgYmFja3VwIHNjaGVkdWxlIGZvciAnICsgYXBwSWQgKyAnPycpKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIHZhciByZXMgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9iYWNrdXBzL3NjaGVkdWxlLycgKyBlbmNvZGVVUklDb21wb25lbnQoYXBwSWQpLCB7IG1ldGhvZDogJ0RFTEVURScgfSk7XG4gICAgICB2YXIgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oJ1NjaGVkdWxlIHJlbW92ZWQgZm9yICcgKyBhcHBJZCwgJ3N1Y2Nlc3MnKTtcbiAgICAgICAgbG9hZFNjaGVkdWxlc1RhYigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbignRGVsZXRlIGZhaWxlZDogJyArIChkYXRhLmVycm9yIHx8ICdVbmtub3duJyksICdlcnJvcicpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ0Vycm9yOiAnICsgZS5tZXNzYWdlLCAnZXJyb3InKTtcbiAgICB9XG4gIH1cbiAgXG4gIGFzeW5jIGZ1bmN0aW9uIGFkZE5ld1NjaGVkdWxlKCkge1xuICAgIHZhciBhcHBJZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduZXctc2NoZWR1bGUtYXBwaWQnKT8udmFsdWU/LnRyaW0oKTtcbiAgICB2YXIgaW50ZXJ2YWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmV3LXNjaGVkdWxlLWludGVydmFsJyk/LnZhbHVlIHx8ICdkYWlseSc7XG4gICAgdmFyIHJldGVudGlvbiA9IHBhcnNlSW50KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduZXctc2NoZWR1bGUtcmV0ZW50aW9uJyk/LnZhbHVlKSB8fCA3O1xuICAgIFxuICAgIGlmICghYXBwSWQpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ1BsZWFzZSBlbnRlciBhbiBBcHAgSUQnLCAnd2FybmluZycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBcbiAgICB0cnkge1xuICAgICAgdmFyIHJlcyA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2JhY2t1cHMvc2NoZWR1bGUnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBhcHBJZCwgc2NoZWR1bGU6IGludGVydmFsLCByZXRlbnRpb246IHsga2VlcDogcmV0ZW50aW9uIH0sIGVuYWJsZWQ6IHRydWUgfSlcbiAgICAgIH0pO1xuICAgICAgdmFyIGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdTY2hlZHVsZSBjcmVhdGVkIGZvciAnICsgYXBwSWQsICdzdWNjZXNzJyk7XG4gICAgICAgIGxvYWRTY2hlZHVsZXNUYWIoKTtcbiAgICAgICAgLy8gQ2xlYXIgaW5wdXRzXG4gICAgICAgIHZhciBhcHBJZElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25ldy1zY2hlZHVsZS1hcHBpZCcpO1xuICAgICAgICBpZiAoYXBwSWRJbnB1dCkgYXBwSWRJbnB1dC52YWx1ZSA9ICcnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbignRmFpbGVkOiAnICsgKGRhdGEuZXJyb3IgfHwgJ1Vua25vd24nKSwgJ2Vycm9yJyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignRXJyb3I6ICcgKyBlLm1lc3NhZ2UsICdlcnJvcicpO1xuICAgIH1cbiAgfVxuICBcbiAgLy8gPT09IEJhY2t1cHMgb24gRGlzayBUYWIgPT09XG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWREaXNrQmFja3VwcygpIHtcbiAgICBpZiAoIWRpc2tDb250YWluZXIpIHJldHVybjtcbiAgICBkaXNrQ29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+IExvYWRpbmcuLi48L2Rpdj4nO1xuICAgIHRyeSB7XG4gICAgICB2YXIgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvYmFja3Vwcy9maWxlcycpO1xuICAgICAgdmFyIGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKCFkYXRhLnN1Y2Nlc3MpIHRocm93IG5ldyBFcnJvcihkYXRhLmVycm9yIHx8ICdGYWlsZWQgdG8gbG9hZCcpO1xuXG4gICAgICB2YXIgZmlsZXMgPSBkYXRhLmZpbGVzIHx8IFtdO1xuXG4gICAgICBpZiAoZmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGRpc2tDb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPicgK1xuICAgICAgICAgICc8c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdUQ4M0RcdURDQkU8L3NwYW4+JyArXG4gICAgICAgICAgJzxkaXY+Tm8gYmFja3VwIGZpbGVzIG9uIGRpc2s8L2Rpdj4nICtcbiAgICAgICAgICAnPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tdG9wOiA0cHg7XCI+UnVuIGEgYmFja3VwIHRvIGNyZWF0ZSBiYWNrdXAgZmlsZXM8L2Rpdj4nICtcbiAgICAgICAgICAnPC9kaXY+JztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBHcm91cCBieSBhcHBJZFxuICAgICAgdmFyIGJ5QXBwID0ge307XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBmID0gZmlsZXNbaV07XG4gICAgICAgIHZhciBhcHBJZCA9IGYuYXBwSWQgfHwgJ3Vua25vd24nO1xuICAgICAgICBpZiAoIWJ5QXBwW2FwcElkXSkgYnlBcHBbYXBwSWRdID0gW107XG4gICAgICAgIGJ5QXBwW2FwcElkXS5wdXNoKGYpO1xuICAgICAgfVxuXG4gICAgICB2YXIgaHRtbCA9ICc8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tYm90dG9tOiAxMnB4O1wiPicgKyBmaWxlcy5sZW5ndGggKyAnIGJhY2t1cCBmaWxlKHMpIGFjcm9zcyAnICsgT2JqZWN0LmtleXMoYnlBcHApLmxlbmd0aCArICcgYXBwKHMpPC9kaXY+JztcbiAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDEycHg7XCI+JztcblxuICAgICAgdmFyIGFwcElkcyA9IE9iamVjdC5rZXlzKGJ5QXBwKS5zb3J0KCk7XG4gICAgICBmb3IgKHZhciBhID0gMDsgYSA8IGFwcElkcy5sZW5ndGg7IGErKykge1xuICAgICAgICB2YXIgYXBwSWQgPSBhcHBJZHNbYV07XG4gICAgICAgIHZhciBhcHBGaWxlcyA9IGJ5QXBwW2FwcElkXTtcbiAgICAgICAgaHRtbCArPSAnPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGJvcmRlci1yYWRpdXM6IDhweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgb3ZlcmZsb3c6IGhpZGRlbjtcIj4nICtcbiAgICAgICAgICAnPGRpdiBzdHlsZT1cInBhZGRpbmc6IDhweCAxMnB4OyBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tYWNjZW50KSA4JSwgdHJhbnNwYXJlbnQpOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgZm9udC13ZWlnaHQ6IDYwMDsgZm9udC1zaXplOiAwLjg1cmVtO1wiPicgK1xuICAgICAgICAgIGVzY2FwZUh0bWwoYXBwSWQpICsgJyA8c3BhbiBzdHlsZT1cImZvbnQtd2VpZ2h0OiBub3JtYWw7IGNvbG9yOiB2YXIoLS1tdXRlZCk7IGZvbnQtc2l6ZTogMC43NXJlbTtcIj4oJyArIGFwcEZpbGVzLmxlbmd0aCArICcgYmFja3VwKHMpKTwvc3Bhbj4nICtcbiAgICAgICAgICAnPC9kaXY+JztcblxuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGFwcEZpbGVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgdmFyIGYgPSBhcHBGaWxlc1tqXTtcbiAgICAgICAgICB2YXIgZGF0ZVN0ciA9IG5ldyBEYXRlKGYudGltZXN0YW1wKS50b0xvY2FsZVN0cmluZygpO1xuICAgICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJwYWRkaW5nOiAxMHB4IDEycHg7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPicgK1xuICAgICAgICAgICAgJzxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IGFsaWduLWl0ZW1zOiBjZW50ZXI7IG1hcmdpbi1ib3R0b206IDRweDtcIj4nICtcbiAgICAgICAgICAgICcgIDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDogNTAwOyBmb250LXNpemU6IDAuODVyZW07XCI+JyArIGVzY2FwZUh0bWwoZi5uYW1lKSArICc8L2Rpdj4nICtcbiAgICAgICAgICAgICcgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+JyArIGYuc2l6ZUZvcm1hdHRlZCArICc8L2Rpdj4nICtcbiAgICAgICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgICAgICc8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tYm90dG9tOiA4cHg7XCI+JyArIGRhdGVTdHIgKyAnPC9kaXY+JyArXG4gICAgICAgICAgICAnPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogNnB4O1wiPicgK1xuICAgICAgICAgICAgJyAgPGJ1dHRvbiBjbGFzcz1cImRpc2stY29tcGFyZS1idG5cIiBkYXRhLWFwcGlkPVwiJyArIGVzY2FwZUh0bWwoYXBwSWQpICsgJ1wiIGRhdGEtZmlsZW5hbWU9XCInICsgZXNjYXBlSHRtbChmLm5hbWUpICsgJ1wiIHN0eWxlPVwicGFkZGluZzogM3B4IDhweDsgZm9udC1zaXplOiAwLjc1cmVtOyBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYWNjZW50KTsgY29sb3I6IHZhcigtLWFjY2VudCk7IGJvcmRlci1yYWRpdXM6IDVweDsgY3Vyc29yOiBwb2ludGVyO1wiPkNvbXBhcmU8L2J1dHRvbj4nICtcbiAgICAgICAgICAgICcgIDxidXR0b24gY2xhc3M9XCJkaXNrLXJlc3RvcmUtYnRuXCIgZGF0YS1hcHBpZD1cIicgKyBlc2NhcGVIdG1sKGFwcElkKSArICdcIiBkYXRhLWZpbGVuYW1lPVwiJyArIGVzY2FwZUh0bWwoZi5uYW1lKSArICdcIiBzdHlsZT1cInBhZGRpbmc6IDNweCA4cHg7IGZvbnQtc2l6ZTogMC43NXJlbTsgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgdmFyKC0tb2stZmcpLCAjMjdhZTYwKTsgYm9yZGVyOiBub25lOyBjb2xvcjogd2hpdGU7IGJvcmRlci1yYWRpdXM6IDVweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXdlaWdodDogNTAwO1wiPlJlc3RvcmU8L2J1dHRvbj4nICtcbiAgICAgICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgICAgICc8L2Rpdj4nO1xuICAgICAgICB9XG4gICAgICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gICAgICB9XG4gICAgICBodG1sICs9ICc8L2Rpdj4nO1xuXG4gICAgICBkaXNrQ29udGFpbmVyLmlubmVySFRNTCA9IGh0bWw7XG5cbiAgICAgIC8vIFdpcmUgdXAgYnV0dG9uc1xuICAgICAgZGlza0NvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCcuZGlzay1jb21wYXJlLWJ0bicpLmZvckVhY2goZnVuY3Rpb24oYnRuKSB7XG4gICAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKCkgeyBjb21wYXJlQmFja3VwRmlsZShidG4uZGF0YXNldC5hcHBpZCwgYnRuLmRhdGFzZXQuZmlsZW5hbWUpOyB9KTtcbiAgICAgIH0pO1xuICAgICAgZGlza0NvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCcuZGlzay1yZXN0b3JlLWJ0bicpLmZvckVhY2goZnVuY3Rpb24oYnRuKSB7XG4gICAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKCkgeyByZXN0b3JlQmFja3VwRmlsZShidG4uZGF0YXNldC5hcHBpZCwgYnRuLmRhdGFzZXQuZmlsZW5hbWUpOyB9KTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGRpc2tDb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RmFpbGVkOiAnICsgZXNjYXBlSHRtbChlLm1lc3NhZ2UpICsgJzwvZGl2Pic7XG4gICAgfVxuICB9XG4gIFxuICAvLyA9PT0gQmFja3VwIEhpc3RvcnkgVGFiID09PVxuICBhc3luYyBmdW5jdGlvbiBsb2FkQmFja3VwSGlzdG9yeSgpIHtcbiAgICBpZiAoIWhpc3RvcnlDb250YWluZXIpIHJldHVybjtcbiAgICBoaXN0b3J5Q29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+IExvYWRpbmcuLi48L2Rpdj4nO1xuICAgIHRyeSB7XG4gICAgICB2YXIgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvYmFja3Vwcy9oaXN0b3J5P2xpbWl0PTUwJyk7XG4gICAgICB2YXIgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoIWRhdGEuc3VjY2VzcyB8fCAhZGF0YS5oaXN0b3J5Py5sZW5ndGgpIHtcbiAgICAgICAgaGlzdG9yeUNvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHVEODNEXHVEQ0NCPC9zcGFuPiBObyBiYWNrdXAgaGlzdG9yeSB5ZXQ8L2Rpdj4nO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YXIgaHRtbCA9ICc8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgZ2FwOiA2cHg7XCI+JztcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5oaXN0b3J5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBiayA9IGRhdGEuaGlzdG9yeVtpXTtcbiAgICAgICAgdmFyIHNpemVNQiA9IGJrLnNpemUgPyAoYmsuc2l6ZSAvIDEwMjQgLyAxMDI0KS50b0ZpeGVkKDIpIDogJz8nO1xuICAgICAgICBodG1sICs9ICc8ZGl2IHN0eWxlPVwicGFkZGluZzogMTBweCAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpOyBib3JkZXItcmFkaXVzOiA2cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj4nO1xuICAgICAgICBodG1sICs9ICcgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IGFsaWduLWl0ZW1zOiBjZW50ZXI7IG1hcmdpbi1ib3R0b206IDRweDtcIj4nO1xuICAgICAgICBodG1sICs9ICcgICAgPHNwYW4gc3R5bGU9XCJmb250LXdlaWdodDogNTAwO1wiPicgKyBlc2NhcGVIdG1sKGJrLm5hbWUgfHwgJ2JhY2t1cCcpICsgJzwvc3Bhbj4nO1xuICAgICAgICBodG1sICs9ICcgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogOHB4O1wiPic7XG4gICAgICAgIGh0bWwgKz0gJyAgICAgIDxzcGFuIGNsYXNzPVwic3RhdHVzLWJhZGdlICcgKyAoYmsuc3RhdHVzID09PSAnc3VjY2VzcycgPyAnc3VjY2VzcycgOiAnZG93bicpICsgJ1wiPicgKyBlc2NhcGVIdG1sKGJrLnN0YXR1cykgKyAnPC9zcGFuPic7XG4gICAgICAgIGlmIChiay5zdGF0dXMgPT09ICdzdWNjZXNzJykgaHRtbCArPSAnICAgICAgPGJ1dHRvbiBjbGFzcz1cImJhY2t1cC1yZXN0b3JlLWJ0blwiIGRhdGEtYmFja3VwLWlkPVwiJyArIGVzY2FwZUh0bWwoYmsuaWQpICsgJ1wiIHN0eWxlPVwicGFkZGluZzogM3B4IDhweDsgZm9udC1zaXplOiAwLjc1cmVtO1wiPlJlc3RvcmU8L2J1dHRvbj4nO1xuICAgICAgICBodG1sICs9ICcgICAgPC9kaXY+JztcbiAgICAgICAgaHRtbCArPSAnICA8L2Rpdj4nO1xuICAgICAgICBodG1sICs9ICcgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+JztcbiAgICAgICAgaHRtbCArPSAnICAgICcgKyBuZXcgRGF0ZShiay50aW1lc3RhbXApLnRvTG9jYWxlU3RyaW5nKCkgKyAnIHwgJyArIHNpemVNQiArICcgTUIgfCAnICsgKGJrLmR1cmF0aW9uID8gKGJrLmR1cmF0aW9uIC8gMTAwMCkudG9GaXhlZCgxKSArICdzJyA6ICctLScpO1xuICAgICAgICBpZiAoYmsuZW5jcnlwdGVkKSBodG1sICs9ICcgfCBcdUQ4M0RcdUREMTInO1xuICAgICAgICBodG1sICs9ICcgIDwvZGl2Pic7XG4gICAgICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gICAgICB9XG4gICAgICBodG1sICs9ICc8L2Rpdj4nO1xuICAgICAgaGlzdG9yeUNvbnRhaW5lci5pbm5lckhUTUwgPSBodG1sO1xuICAgICAgaGlzdG9yeUNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCcuYmFja3VwLXJlc3RvcmUtYnRuJykuZm9yRWFjaChmdW5jdGlvbihidG4pIHtcbiAgICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKSB7IHdpbmRvdy5fX3Jlc3RvcmVTZXJ2ZXJCYWNrdXAoYnRuLmRhdGFzZXQuYmFja3VwSWQpOyB9KTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGhpc3RvcnlDb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RmFpbGVkOiAnICsgZXNjYXBlSHRtbChlLm1lc3NhZ2UpICsgJzwvZGl2Pic7XG4gICAgfVxuICB9XG5cbiAgd2luZG93Ll9fcmVzdG9yZVNlcnZlckJhY2t1cCA9IGFzeW5jIGZ1bmN0aW9uKGJhY2t1cElkKSB7XG4gICAgaWYgKCFjb25maXJtKCdSZXN0b3JlIGZyb20gdGhpcyBzZXJ2ZXIgYmFja3VwPyBUaGlzIHdpbGwgb3ZlcndyaXRlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4nKSkgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICB2YXIgcmVzID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvYmFja3Vwcy9yZXN0b3JlLycgKyBiYWNrdXBJZCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgcmVzdG9yZVNlcnZpY2VzOiB0cnVlLCByZXN0b3JlQ29uZmlnOiB0cnVlIH0pXG4gICAgICB9KTtcbiAgICAgIHZhciBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbignUmVzdG9yZSBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IScsICdzdWNjZXNzJyk7XG4gICAgICAgIGxvY2F0aW9uLnJlbG9hZCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbignUmVzdG9yZSBmYWlsZWQ6ICcgKyAoZGF0YS5lcnJvciB8fCAnVW5rbm93biBlcnJvcicpLCAnZXJyb3InKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7IHNob3dOb3RpZmljYXRpb24oJ1Jlc3RvcmUgZXJyb3I6ICcgKyBlLm1lc3NhZ2UsICdlcnJvcicpOyB9XG4gIH07XG5cbiAgLy8gTGF6eS1sb2FkIHRhYnNcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtcGFuZWw9XCJiYWNrdXAtc2NoZWR1bGVzLXRhYlwiXScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGxvYWRTY2hlZHVsZXNUYWIpO1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1wYW5lbD1cImJhY2t1cC1kaXNrLXRhYlwiXScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGxvYWREaXNrQmFja3Vwcyk7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXBhbmVsPVwiYmFja3VwLXBvaW50aW50aW1lLXRhYlwiXScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGxvYWRQb2ludEluVGltZVRhYik7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXBhbmVsPVwiYmFja3VwLWhpc3RvcnktdGFiXCJdJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbG9hZEJhY2t1cEhpc3RvcnkpO1xuXG4gIC8vID09PT09IFBvaW50LWluLVRpbWUgUmVzdG9yZSBUYWIgPT09PT1cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZFBvaW50SW5UaW1lVGFiKCkge1xuICAgIGlmICghcG9pbnRpbnRpbWVDb250YWluZXIpIHJldHVybjtcblxuICAgIC8vIENoZWNrIHByZW1pdW1cbiAgICB0cnkge1xuICAgICAgdmFyIGxpY2Vuc2VSZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9saWNlbnNlL3N0YXR1cycpO1xuICAgICAgdmFyIGxpY2Vuc2VEYXRhID0gYXdhaXQgbGljZW5zZVJlcy5qc29uKCk7XG4gICAgICBpZiAobGljZW5zZURhdGEudGllciAhPT0gJ3ByZW1pdW0nKSB7XG4gICAgICAgIHBvaW50aW50aW1lQ29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIiBzdHlsZT1cInBhZGRpbmc6IDI0cHg7IHRleHQtYWxpZ246IGNlbnRlcjtcIj4nICtcbiAgICAgICAgICAnPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMnJlbTsgbWFyZ2luLWJvdHRvbTogMTJweDtcIj5cdTJCNTA8L2Rpdj4nICtcbiAgICAgICAgICAnPGRpdiBzdHlsZT1cImZvbnQtd2VpZ2h0OiA2MDA7IG1hcmdpbi1ib3R0b206IDhweDtcIj5QcmVtaXVtIEZlYXR1cmU8L2Rpdj4nICtcbiAgICAgICAgICAnPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC44NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5Qb2ludC1pbi10aW1lIHJlc3RvcmUgcmVxdWlyZXMgRGFzaENhZGR5IFByZW1pdW0gd2l0aCBhdXRvLWJhY2t1cCBlbmFibGVkLjwvZGl2PicgK1xuICAgICAgICAgICc8YnV0dG9uIG9uY2xpY2s9XCJzaG93Tm90aWZpY2F0aW9uKFxcJ1VwZ3JhZGUgdG8gUHJlbWl1bSBmb3IgcG9pbnQtaW4tdGltZSByZXN0b3JlIVxcJywgXFwnaW5mb1xcJyk7IHNjcm9sbFRvU2VjdGlvbihcXCdsaWNlbnNlXFwnKTtcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDE2cHg7IHBhZGRpbmc6IDhweCAyMHB4OyBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjZjM5YzEyLCAjZTY3ZTIyKTsgYm9yZGVyOiBub25lOyBjb2xvcjogd2hpdGU7IGJvcmRlci1yYWRpdXM6IDhweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXdlaWdodDogNjAwO1wiPlVwZ3JhZGUgdG8gUHJlbWl1bTwvYnV0dG9uPicgK1xuICAgICAgICAgICc8L2Rpdj4nO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkgeyAvKiBpZ25vcmUgKi8gfVxuXG4gICAgcG9pbnRpbnRpbWVDb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiYnJhbmQtc3Bpbm5lclwiPjwvc3Bhbj4gTG9hZGluZy4uLjwvZGl2Pic7XG5cbiAgICB0cnkge1xuICAgICAgLy8gRmV0Y2ggc2VydmljZXMgZm9yIGRyb3Bkb3duXG4gICAgICB2YXIgc2VydmljZXNSZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9zZXJ2aWNlcycpO1xuICAgICAgdmFyIHNlcnZpY2VzRGF0YSA9IGF3YWl0IHNlcnZpY2VzUmVzLmpzb24oKTtcbiAgICAgIHZhciBzZXJ2aWNlcyA9IHNlcnZpY2VzRGF0YS5zZXJ2aWNlcyB8fCBbXTtcblxuICAgICAgaWYgKHNlcnZpY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBwb2ludGludGltZUNvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHVEODNEXHVEQ0U2PC9zcGFuPiBObyBhcHBzIGRlcGxveWVkIHlldDwvZGl2Pic7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGh0bWwgPSAnPGRpdiBzdHlsZT1cInBhZGRpbmc6IDhweCAwIDEycHg7XCI+JyArXG4gICAgICAgICc8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IG1hcmdpbi1ib3R0b206IDEycHg7XCI+JyArXG4gICAgICAgICcgIDxsYWJlbCBzdHlsZT1cImZvbnQtc2l6ZTogMC44NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgd2hpdGUtc3BhY2U6IG5vd3JhcDtcIj5BcHA6PC9sYWJlbD4nICtcbiAgICAgICAgJyAgPHNlbGVjdCBpZD1cInBpdC1hcHAtc2VsZWN0XCIgc3R5bGU9XCJmbGV4OiAxOyBwYWRkaW5nOiA4cHg7IGJvcmRlci1yYWRpdXM6IDZweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYmFja2dyb3VuZDogdmFyKC0tYmFzZSk7IG1heC13aWR0aDogMjQwcHg7XCI+JztcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VydmljZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaHRtbCArPSAnPG9wdGlvbiB2YWx1ZT1cIicgKyBlc2NhcGVIdG1sKHNlcnZpY2VzW2ldLmlkIHx8IHNlcnZpY2VzW2ldLm5hbWUgfHwgJycpICsgJ1wiPicgK1xuICAgICAgICAgIGVzY2FwZUh0bWwoc2VydmljZXNbaV0ubmFtZSB8fCBzZXJ2aWNlc1tpXS5pZCB8fCAnJykgKyAnPC9vcHRpb24+JztcbiAgICAgIH1cbiAgICAgIGh0bWwgKz0gJzwvc2VsZWN0PicgK1xuICAgICAgICAnICA8YnV0dG9uIGlkPVwicGl0LWxvYWQtYnRuXCIgc3R5bGU9XCJwYWRkaW5nOiA4cHggMTZweDsgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50KTsgYm9yZGVyOiBub25lOyBjb2xvcjogd2hpdGU7IGJvcmRlci1yYWRpdXM6IDZweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXdlaWdodDogNTAwO1wiPkxvYWQgQmFja3VwczwvYnV0dG9uPicgK1xuICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICc8ZGl2IGlkPVwicGl0LWJhY2t1cHMtbGlzdFwiIHN0eWxlPVwibWF4LWhlaWdodDogMzIwcHg7IG92ZXJmbG93LXk6IGF1dG87XCI+PC9kaXY+JyArXG4gICAgICAgICc8L2Rpdj4nO1xuXG4gICAgICBwb2ludGludGltZUNvbnRhaW5lci5pbm5lckhUTUwgPSBodG1sO1xuXG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGl0LWxvYWQtYnRuJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBhcHBJZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwaXQtYXBwLXNlbGVjdCcpPy52YWx1ZTtcbiAgICAgICAgaWYgKGFwcElkKSBsb2FkUG9pbnRJblRpbWVCYWNrdXBzKGFwcElkKTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHBvaW50aW50aW1lQ29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPkZhaWxlZDogJyArIGVzY2FwZUh0bWwoZS5tZXNzYWdlKSArICc8L2Rpdj4nO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRQb2ludEluVGltZUJhY2t1cHMoYXBwSWQpIHtcbiAgICB2YXIgbGlzdEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BpdC1iYWNrdXBzLWxpc3QnKTtcbiAgICBpZiAoIWxpc3RFbCkgcmV0dXJuO1xuXG4gICAgbGlzdEVsLmlubmVySFRNTCA9ICc8ZGl2IHN0eWxlPVwicGFkZGluZzogMjBweDsgdGV4dC1hbGlnbjogY2VudGVyO1wiPjxzcGFuIGNsYXNzPVwiYnJhbmQtc3Bpbm5lclwiPjwvc3Bhbj4gTG9hZGluZyBiYWNrdXBzLi4uPC9kaXY+JztcblxuICAgIHRyeSB7XG4gICAgICB2YXIgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvYmFja3Vwcy9maWxlcy8nICsgZW5jb2RlVVJJQ29tcG9uZW50KGFwcElkKSk7XG4gICAgICB2YXIgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG5cbiAgICAgIGlmICghZGF0YS5zdWNjZXNzIHx8ICFkYXRhLmZpbGVzIHx8IGRhdGEuZmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGxpc3RFbC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHVEODNEXHVEQ0JFPC9zcGFuPiBObyBiYWNrdXAgZmlsZXMgZm9yICcgKyBlc2NhcGVIdG1sKGFwcElkKSArICc8L2Rpdj4nO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBodG1sID0gJzxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi1ib3R0b206IDhweDtcIj4nICsgZGF0YS5maWxlcy5sZW5ndGggKyAnIGJhY2t1cChzKTwvZGl2PicgK1xuICAgICAgICAnPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogNnB4O1wiPic7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5maWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZiA9IGRhdGEuZmlsZXNbaV07XG4gICAgICAgIHZhciBkYXRlU3RyID0gbmV3IERhdGUoZi50aW1lc3RhbXApLnRvTG9jYWxlU3RyaW5nKCk7XG4gICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJwYWRkaW5nOiAxMHB4IDEycHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGJvcmRlci1yYWRpdXM6IDhweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj4nICtcbiAgICAgICAgICAnPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsgYWxpZ24taXRlbXM6IGNlbnRlcjsgbWFyZ2luLWJvdHRvbTogNHB4O1wiPicgK1xuICAgICAgICAgICcgIDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDogNTAwOyBmb250LXNpemU6IDAuODVyZW07XCI+JyArIGVzY2FwZUh0bWwoZi5uYW1lKSArICc8L2Rpdj4nICtcbiAgICAgICAgICAnICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPicgKyBmLnNpemVGb3JtYXR0ZWQgKyAnPC9kaXY+JyArXG4gICAgICAgICAgJzwvZGl2PicgK1xuICAgICAgICAgICc8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tYm90dG9tOiA4cHg7XCI+JyArIGRhdGVTdHIgKyAnPC9kaXY+JyArXG4gICAgICAgICAgJzxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDZweDtcIj4nICtcbiAgICAgICAgICAnICA8YnV0dG9uIGNsYXNzPVwicGl0LWNvbXBhcmUtYnRuXCIgZGF0YS1hcHBpZD1cIicgKyBlc2NhcGVIdG1sKGFwcElkKSArICdcIiBkYXRhLWZpbGVuYW1lPVwiJyArIGVzY2FwZUh0bWwoZi5uYW1lKSArICdcIiBzdHlsZT1cInBhZGRpbmc6IDRweCAxMHB4OyBmb250LXNpemU6IDAuNzVyZW07IGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1hY2NlbnQpOyBjb2xvcjogdmFyKC0tYWNjZW50KTsgYm9yZGVyLXJhZGl1czogNXB4OyBjdXJzb3I6IHBvaW50ZXI7XCI+Q29tcGFyZTwvYnV0dG9uPicgK1xuICAgICAgICAgICcgIDxidXR0b24gY2xhc3M9XCJwaXQtcmVzdG9yZS1idG5cIiBkYXRhLWFwcGlkPVwiJyArIGVzY2FwZUh0bWwoYXBwSWQpICsgJ1wiIGRhdGEtZmlsZW5hbWU9XCInICsgZXNjYXBlSHRtbChmLm5hbWUpICsgJ1wiIHN0eWxlPVwicGFkZGluZzogNHB4IDEwcHg7IGZvbnQtc2l6ZTogMC43NXJlbTsgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgdmFyKC0tb2stZmcpLCAjMjdhZTYwKTsgYm9yZGVyOiBub25lOyBjb2xvcjogd2hpdGU7IGJvcmRlci1yYWRpdXM6IDVweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXdlaWdodDogNTAwO1wiPlJlc3RvcmU8L2J1dHRvbj4nICtcbiAgICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICAgJzwvZGl2Pic7XG4gICAgICB9XG4gICAgICBodG1sICs9ICc8L2Rpdj4nO1xuICAgICAgbGlzdEVsLmlubmVySFRNTCA9IGh0bWw7XG5cbiAgICAgIC8vIFdpcmUgdXAgYnV0dG9uc1xuICAgICAgbGlzdEVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5waXQtY29tcGFyZS1idG4nKS5mb3JFYWNoKGZ1bmN0aW9uKGJ0bikge1xuICAgICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpIHsgY29tcGFyZUJhY2t1cEZpbGUoYnRuLmRhdGFzZXQuYXBwaWQsIGJ0bi5kYXRhc2V0LmZpbGVuYW1lKTsgfSk7XG4gICAgICB9KTtcbiAgICAgIGxpc3RFbC5xdWVyeVNlbGVjdG9yQWxsKCcucGl0LXJlc3RvcmUtYnRuJykuZm9yRWFjaChmdW5jdGlvbihidG4pIHtcbiAgICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKSB7IHJlc3RvcmVCYWNrdXBGaWxlKGJ0bi5kYXRhc2V0LmFwcGlkLCBidG4uZGF0YXNldC5maWxlbmFtZSk7IH0pO1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbGlzdEVsLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPkZhaWxlZDogJyArIGVzY2FwZUh0bWwoZS5tZXNzYWdlKSArICc8L2Rpdj4nO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGNvbXBhcmVCYWNrdXBGaWxlKGFwcElkLCBmaWxlbmFtZSkge1xuICAgIHRyeSB7XG4gICAgICB2YXIgcmVzID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvYmFja3Vwcy9jb21wYXJlLycgKyBlbmNvZGVVUklDb21wb25lbnQoZmlsZW5hbWUpLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe30pXG4gICAgICB9KTtcbiAgICAgIHZhciBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmICghZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oJ0NvbXBhcmUgZmFpbGVkOiAnICsgKGRhdGEuZXJyb3IgfHwgJ1Vua25vd24nKSwgJ2Vycm9yJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGRpZmYgPSBkYXRhLmRpZmY7XG4gICAgICB2YXIgaHRtbCA9ICc8ZGl2IHN0eWxlPVwicG9zaXRpb246IGZpeGVkOyB0b3A6IDA7IGxlZnQ6IDA7IHJpZ2h0OiAwOyBib3R0b206IDA7IGJhY2tncm91bmQ6IHJnYmEoMCwwLDAsMC41KTsgei1pbmRleDogMTAwMDA7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyO1wiIGlkPVwiY29tcGFyZS1vdmVybGF5XCI+JyArXG4gICAgICAgICc8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDogdmFyKC0tYmFzZSk7IGJvcmRlci1yYWRpdXM6IDEycHg7IG1heC13aWR0aDogNjAwcHg7IHdpZHRoOiA5MCU7IG1heC1oZWlnaHQ6IDgwdmg7IG92ZXJmbG93OiBhdXRvOyBwYWRkaW5nOiAyMHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPicgK1xuICAgICAgICAnPGg0IHN0eWxlPVwibWFyZ2luOiAwIDAgMTZweDtcIj5cdUQ4M0RcdURDQ0EgQ29tcGFyZTogJyArIGVzY2FwZUh0bWwoZmlsZW5hbWUpICsgJzwvaDQ+JyArXG4gICAgICAgICc8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi1ib3R0b206IDE2cHg7XCI+U2l6ZTogJyArIChkaWZmLnNpemVGb3JtYXR0ZWQgfHwgJz8nKSArICcgfCBDcmVhdGVkOiAnICsgbmV3IERhdGUoZGlmZi50aW1lc3RhbXApLnRvTG9jYWxlU3RyaW5nKCkgKyAnPC9kaXY+JztcblxuICAgICAgaWYgKGRpZmYuc2VydmljZXMpIHtcbiAgICAgICAgdmFyIHN2Y0NoYW5nZWQgPSBkaWZmLnNlcnZpY2VzLmhhc0NoYW5nZXMgPyAnXHVEODNEXHVERDM0JyA6ICdcdUQ4M0RcdURGRTInO1xuICAgICAgICBodG1sICs9ICc8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMTJweDsgcGFkZGluZzogMTBweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTsgYm9yZGVyLXJhZGl1czogNnB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPicgK1xuICAgICAgICAgICc8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6IDYwMDsgZm9udC1zaXplOiAwLjg1cmVtOyBtYXJnaW4tYm90dG9tOiA0cHg7XCI+JyArIHN2Y0NoYW5nZWQgKyAnIFNlcnZpY2VzIChiYWNrdXAgdnMgY3VycmVudCk8L2Rpdj4nICtcbiAgICAgICAgICAnPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPkJhY2t1cDogJyArIGRpZmYuc2VydmljZXMuYmFja3VwQ291bnQgKyAnIHNlcnZpY2VzIHwgQ3VycmVudDogJyArIGRpZmYuc2VydmljZXMuY3VycmVudENvdW50ICsgJyBzZXJ2aWNlczwvZGl2Pic7XG4gICAgICAgIGlmIChkaWZmLnNlcnZpY2VzLmhhc0NoYW5nZXMpIHtcbiAgICAgICAgICBodG1sICs9ICc8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogNnB4OyBmb250LXNpemU6IDAuOHJlbTsgY29sb3I6ICNmMzljMTI7XCI+U2VydmljZXMgZGlmZmVyIFx1MjAxNCByZXN0b3Jpbmcgd2lsbCByZXBsYWNlIGN1cnJlbnQgY29uZmlndXJhdGlvbjwvZGl2Pic7XG4gICAgICAgIH1cbiAgICAgICAgaHRtbCArPSAnPC9kaXY+JztcbiAgICAgIH1cblxuICAgICAgaWYgKGRpZmYuY29uZmlnKSB7XG4gICAgICAgIHZhciBjZmdDaGFuZ2VkID0gZGlmZi5jb25maWcuaGFzQ2hhbmdlcyA/ICdcdUQ4M0RcdUREMzQnIDogJ1x1RDgzRFx1REZFMic7XG4gICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAxMnB4OyBwYWRkaW5nOiAxMHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpOyBib3JkZXItcmFkaXVzOiA2cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCI+JyArXG4gICAgICAgICAgJzxkaXYgc3R5bGU9XCJmb250LXdlaWdodDogNjAwOyBmb250LXNpemU6IDAuODVyZW07IG1hcmdpbi1ib3R0b206IDRweDtcIj4nICsgY2ZnQ2hhbmdlZCArICcgQ29uZmlndXJhdGlvbjwvZGl2Pic7XG4gICAgICAgIGlmIChkaWZmLmNvbmZpZy5oYXNDaGFuZ2VzKSB7XG4gICAgICAgICAgaHRtbCArPSAnPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogI2YzOWMxMjtcIj5Db25maWd1cmF0aW9uIGRpZmZlcnMgXHUyMDE0IHJlc3RvcmluZyB3aWxsIHJlcGxhY2UgY3VycmVudCBzZXR0aW5nczwvZGl2Pic7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaHRtbCArPSAnPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogdmFyKC0tb2stZmcpO1wiPk5vIGNoYW5nZXM8L2Rpdj4nO1xuICAgICAgICB9XG4gICAgICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gICAgICB9XG5cbiAgICAgIGh0bWwgKz0gJzxidXR0b24gaWQ9XCJjb21wYXJlLWNsb3NlLWJ0blwiIHN0eWxlPVwicGFkZGluZzogOHB4IDIwcHg7IGJhY2tncm91bmQ6IHZhcigtLWFjY2VudCk7IGJvcmRlcjogbm9uZTsgY29sb3I6IHdoaXRlOyBib3JkZXItcmFkaXVzOiA2cHg7IGN1cnNvcjogcG9pbnRlcjsgZm9udC13ZWlnaHQ6IDUwMDtcIj5DbG9zZTwvYnV0dG9uPicgK1xuICAgICAgICAnPC9kaXY+PC9kaXY+JztcblxuICAgICAgZG9jdW1lbnQuYm9keS5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsIGh0bWwpO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbXBhcmUtY2xvc2UtYnRuJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKSB7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb21wYXJlLW92ZXJsYXknKT8ucmVtb3ZlKCk7XG4gICAgICB9KTtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb21wYXJlLW92ZXJsYXknKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbihlKSB7XG4gICAgICAgIGlmIChlLnRhcmdldCA9PT0gdGhpcykgdGhpcy5yZW1vdmUoKTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ0NvbXBhcmUgZXJyb3I6ICcgKyBlLm1lc3NhZ2UsICdlcnJvcicpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHJlc3RvcmVCYWNrdXBGaWxlKGFwcElkLCBmaWxlbmFtZSkge1xuICAgIGlmICghY29uZmlybSgnUmVzdG9yZSAnICsgZmlsZW5hbWUgKyAnIGZvciAnICsgYXBwSWQgKyAnP1xcblxcblRoaXMgd2lsbCByZXBsYWNlIGN1cnJlbnQgY29uZmlndXJhdGlvbiwgY3JlZGVudGlhbHMsIGFuZCBkYXRhLiBDb250YWluZXJzIHdpbGwgYmUgcmVzdGFydGVkLicpKSByZXR1cm47XG5cbiAgICB0cnkge1xuICAgICAgdmFyIHJlcyA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2FwcHMvJyArIGVuY29kZVVSSUNvbXBvbmVudChhcHBJZCkgKyAnL3JldmVydC8nICsgZW5jb2RlVVJJQ29tcG9uZW50KGZpbGVuYW1lKSwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgcmVzdGFydENvbnRhaW5lcnM6IHRydWUgfSlcbiAgICAgIH0pO1xuICAgICAgdmFyIGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKGFwcElkICsgJyByZXN0b3JlZCB0byAnICsgZmlsZW5hbWUsICdzdWNjZXNzJyk7XG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IGxvY2F0aW9uLnJlbG9hZCgpOyB9LCAxNTAwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oJ1Jlc3RvcmUgZmFpbGVkOiAnICsgKGRhdGEuZXJyb3IgfHwgJ1Vua25vd24nKSwgJ2Vycm9yJyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignUmVzdG9yZSBlcnJvcjogJyArIGUubWVzc2FnZSwgJ2Vycm9yJyk7XG4gICAgfVxuICB9XG59KSgpO1xuO1xuLy8gPT09PT09PT09PSBSRVNPVVJDRSBNT05JVE9SIChFbmhhbmNlZCkgPT09PT09PT09PVxuKGZ1bmN0aW9uKCkge1xuICAvLyBJbmplY3QgbW9kYWwgSFRNTFxuICBpbmplY3RNb2RhbCgnc3RhdHMtbW9kYWwnLCBgPGRpdiBpZD1cInN0YXRzLW1vZGFsXCIgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsXCI+XG4gICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtY29udGVudFwiIHN0eWxlPVwibWluLXdpZHRoOiA3NTBweDsgbWF4LXdpZHRoOiA5NTBweDtcIj5cbiAgICAgIDxoMz5cdUQ4M0RcdURDQ0EgUmVzb3VyY2UgTW9uaXRvcjwvaDM+XG4gICAgICA8cCBjbGFzcz1cIm1vZGFsLXN1YnRpdGxlXCI+XG4gICAgICAgIFJlYWwtdGltZSBhbmQgaGlzdG9yaWNhbCBDUFUsIG1lbW9yeSwgbmV0d29yaywgYW5kIGRpc2sgdXNhZ2UgZm9yIGNvbnRhaW5lcnMuXG4gICAgICA8L3A+XG5cbiAgICAgIDwhLS0gVGFiIGJhciAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC10YWJzXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJwYW5lbC10YWIgYWN0aXZlXCIgZGF0YS1wYW5lbD1cInN0YXRzLWxpdmVcIj5MaXZlIFN0YXRzPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJwYW5lbC10YWJcIiBkYXRhLXBhbmVsPVwic3RhdHMtYWdncmVnYXRlZFwiPjI0aCBTdW1tYXJ5PC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJwYW5lbC10YWJcIiBkYXRhLXBhbmVsPVwic3RhdHMtaGlzdG9yeVwiPkhpc3Rvcnk8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInBhbmVsLXRhYlwiIGRhdGEtcGFuZWw9XCJzdGF0cy1hbGVydHNcIj5BbGVydHM8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFRhYjogTGl2ZSBTdGF0cyAtLT5cbiAgICAgIDxkaXYgaWQ9XCJzdGF0cy1saXZlXCIgY2xhc3M9XCJwYW5lbC1zZWN0aW9uIGFjdGl2ZVwiPlxuICAgICAgICA8ZGl2IGlkPVwic3RhdHMtY29udGFpbmVyXCIgY2xhc3M9XCJzY3JvbGwtY29udGFpbmVyXCI+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogNDBweDsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnJhbmQtc3Bpbm5lclwiPjwvc3Bhbj4gTG9hZGluZyBjb250YWluZXIgc3RhdHMuLi5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBUYWI6IDI0aCBBZ2dyZWdhdGVkIFN1bW1hcnkgLS0+XG4gICAgICA8ZGl2IGlkPVwic3RhdHMtYWdncmVnYXRlZFwiIGNsYXNzPVwicGFuZWwtc2VjdGlvblwiPlxuICAgICAgICA8ZGl2IGlkPVwic3RhdHMtYWdncmVnYXRlZC1jb250YWluZXJcIiBjbGFzcz1cInNjcm9sbC1jb250YWluZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1RDgzRFx1RENDODwvc3Bhbj5cbiAgICAgICAgICAgIExvYWRpbmcgMjQtaG91ciBhZ2dyZWdhdGVkIG1ldHJpY3MuLi5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBUYWI6IExvbmctdGVybSBIaXN0b3J5IC0tPlxuICAgICAgPGRpdiBpZD1cInN0YXRzLWhpc3RvcnlcIiBjbGFzcz1cInBhbmVsLXNlY3Rpb25cIj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogOHB4OyBhbGlnbi1pdGVtczogY2VudGVyOyBtYXJnaW4tYm90dG9tOiAxMnB4OyBmbGV4LXdyYXA6IHdyYXA7XCI+XG4gICAgICAgICAgPGxhYmVsIHN0eWxlPVwiZm9udC1zaXplOiAwLjg1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPkNvbnRhaW5lcjo8L2xhYmVsPlxuICAgICAgICAgIDxzZWxlY3QgaWQ9XCJzdGF0cy1oaXN0b3J5LWNvbnRhaW5lclwiIHN0eWxlPVwicGFkZGluZzogNHB4IDhweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgY29sb3I6IHZhcigtLWZnKTsgYm9yZGVyLXJhZGl1czogNHB4OyBmb250LXNpemU6IDAuODVyZW07IGZsZXg6IDE7IG1pbi13aWR0aDogMTgwcHg7XCI+PC9zZWxlY3Q+XG4gICAgICAgICAgPGRpdiBpZD1cInN0YXRzLWhpc3RvcnktcmFuZ2UtYnV0dG9uc1wiIHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiA0cHg7XCI+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic3RhdHMtcmFuZ2UtYnRuIGFjdGl2ZVwiIGRhdGEtcmFuZ2U9XCIxaFwiPjFoPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic3RhdHMtcmFuZ2UtYnRuXCIgZGF0YS1yYW5nZT1cIjI0aFwiPjI0aDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInN0YXRzLXJhbmdlLWJ0blwiIGRhdGEtcmFuZ2U9XCI3ZFwiPjdkPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic3RhdHMtcmFuZ2UtYnRuXCIgZGF0YS1yYW5nZT1cIjMwZFwiPjMwZDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInN0YXRzLXJhbmdlLWJ0blwiIGRhdGEtcmFuZ2U9XCIxeVwiPjF5PC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwic3RhdHMtaGlzdG9yeS1jb250YWluZXItYXJlYVwiIGNsYXNzPVwic2Nyb2xsLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHVEODNEXHVEQ0NBPC9zcGFuPlxuICAgICAgICAgICAgQ2hvb3NlIGEgY29udGFpbmVyIGFuZCB0aW1lIHJhbmdlIHRvIHZpZXcgaGlzdG9yeS5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBUYWI6IEFsZXJ0IENvbmZpZ3VyYXRpb24gLS0+XG4gICAgICA8ZGl2IGlkPVwic3RhdHMtYWxlcnRzXCIgY2xhc3M9XCJwYW5lbC1zZWN0aW9uXCI+XG4gICAgICAgIDxkaXYgaWQ9XCJzdGF0cy1hbGVydHMtY29udGFpbmVyXCIgY2xhc3M9XCJzY3JvbGwtY29udGFpbmVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdUQ4M0RcdUREMTQ8L3NwYW4+XG4gICAgICAgICAgICBMb2FkaW5nIGFsZXJ0IGNvbmZpZ3VyYXRpb25zLi4uXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gQXV0by1yZWZyZXNoIHRvZ2dsZSAoYm90dG9tIGJhcikgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtYm90dG9tLWJhclwiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC1sYWJlbFwiIHN0eWxlPVwiZm9udC1zaXplOiAwLjg1cmVtO1wiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cInN0YXRzLWF1dG8tcmVmcmVzaFwiIGNoZWNrZWQgLz5cbiAgICAgICAgICBBdXRvLXJlZnJlc2ggZXZlcnkgNXNcbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGJ1dHRvbiBpZD1cInN0YXRzLXJlZnJlc2gtYnRuXCIgY2xhc3M9XCJidG4tc21cIj5cdUQ4M0RcdUREMDQgUmVmcmVzaCBOb3c8L2J1dHRvbj5cbiAgICAgICAgPHNwYW4gaWQ9XCJzdGF0cy1sYXN0LXVwZGF0ZVwiIGNsYXNzPVwidGV4dC1hdXRvLXJpZ2h0XCI+PC9zcGFuPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gQ2xvc2UgQnV0dG9uIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9ucyBtb2RhbC1mb290ZXItYmFyXCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJzdGF0cy1jYW5jZWxcIj5DbG9zZTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PmApO1xuXG4gIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0YXRzLW1vZGFsJyk7XG4gIGNvbnN0IG9wZW5CdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udGFpbmVyLXN0YXRzLWJ0bicpO1xuICBjb25zdCBjYW5jZWxCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RhdHMtY2FuY2VsJyk7XG4gIGNvbnN0IHJlZnJlc2hCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RhdHMtcmVmcmVzaC1idG4nKTtcbiAgY29uc3QgYXV0b1JlZnJlc2hDaGVja2JveCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGF0cy1hdXRvLXJlZnJlc2gnKTtcbiAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0YXRzLWNvbnRhaW5lcicpO1xuICBjb25zdCBhZ2dyZWdhdGVkQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0YXRzLWFnZ3JlZ2F0ZWQtY29udGFpbmVyJyk7XG4gIGNvbnN0IGFsZXJ0c0NvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGF0cy1hbGVydHMtY29udGFpbmVyJyk7XG4gIGNvbnN0IGxhc3RVcGRhdGVTcGFuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0YXRzLWxhc3QtdXBkYXRlJyk7XG5cbiAgbGV0IHJlZnJlc2hJbnRlcnZhbCA9IG51bGw7XG4gIGxldCBjYWNoZWRNb25pdG9yaW5nRGF0YSA9IG51bGw7XG5cbiAgZnVuY3Rpb24gZm9ybWF0Qnl0ZXMoYnl0ZXMpIHtcbiAgICBpZiAoYnl0ZXMgPT09IDAgfHwgIWJ5dGVzKSByZXR1cm4gJzAgQic7XG4gICAgY29uc3QgayA9IDEwMjQ7XG4gICAgY29uc3Qgc2l6ZXMgPSBbJ0InLCAnS0InLCAnTUInLCAnR0InXTtcbiAgICBjb25zdCBpID0gTWF0aC5mbG9vcihNYXRoLmxvZyhieXRlcykgLyBNYXRoLmxvZyhrKSk7XG4gICAgcmV0dXJuIHBhcnNlRmxvYXQoKGJ5dGVzIC8gTWF0aC5wb3coaywgaSkpLnRvRml4ZWQoMSkpICsgJyAnICsgc2l6ZXNbaV07XG4gIH1cblxuICBmdW5jdGlvbiBnZXRDcHVDb2xvcihwZXJjZW50KSB7XG4gICAgaWYgKHBlcmNlbnQgPCAzMCkgcmV0dXJuICcjMmVjYzcxJztcbiAgICBpZiAocGVyY2VudCA8IDcwKSByZXR1cm4gJyNmMzljMTInO1xuICAgIHJldHVybiAnI2U3NGMzYyc7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRNZW1Db2xvcihwZXJjZW50KSB7XG4gICAgaWYgKHBlcmNlbnQgPCA1MCkgcmV0dXJuICcjMmVjYzcxJztcbiAgICBpZiAocGVyY2VudCA8IDgwKSByZXR1cm4gJyNmMzljMTInO1xuICAgIHJldHVybiAnI2U3NGMzYyc7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBsb2FkU3RhdHMoKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFRyeSBuZXcgbW9uaXRvcmluZyBBUEkgZmlyc3QsIGZhbGwgYmFjayB0byBvbGRcbiAgICAgIGxldCBzdGF0cyA9IG51bGw7XG4gICAgICBsZXQgaXNOZXdBcGkgPSBmYWxzZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL21vbml0b3Jpbmcvc3RhdHMnKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgIGlmIChkYXRhLnN1Y2Nlc3MgJiYgZGF0YS5zdGF0cykgeyBzdGF0cyA9IGRhdGEuc3RhdHM7IGlzTmV3QXBpID0gdHJ1ZTsgY2FjaGVkTW9uaXRvcmluZ0RhdGEgPSBkYXRhLnN0YXRzOyB9XG4gICAgICB9IGNhdGNoIChfKSB7fVxuXG4gICAgICBpZiAoIWlzTmV3QXBpKSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvc3RhdHMvY29udGFpbmVycycpO1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICBpZiAoZGF0YS5zdWNjZXNzICYmIGRhdGEuc3RhdHMpIHtcbiAgICAgICAgICAvLyBDb252ZXJ0IGFycmF5IGZvcm1hdCB0byBvYmplY3QgZm9ybWF0XG4gICAgICAgICAgc3RhdHMgPSB7fTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHMgb2YgZGF0YS5zdGF0cykge1xuICAgICAgICAgICAgc3RhdHNbcy5uYW1lXSA9IHsgbmFtZTogcy5uYW1lLCBjdXJyZW50OiB7IGNwdTogcy5jcHUsIG1lbW9yeTogeyBwZXJjZW50OiBzLm1lbW9yeS5wZXJjZW50LCB1c2FnZTogcy5tZW1vcnkudXNlZCwgbGltaXQ6IHMubWVtb3J5LmxpbWl0LCB1c2FnZU1COiBNYXRoLnJvdW5kKHMubWVtb3J5LnVzZWQgLyAxMDQ4NTc2KSwgbGltaXRNQjogTWF0aC5yb3VuZChzLm1lbW9yeS5saW1pdCAvIDEwNDg1NzYpIH0sIG5ldHdvcms6IHsgcnhCeXRlczogcy5uZXR3b3JrLnJ4LCB0eEJ5dGVzOiBzLm5ldHdvcmsudHgsIHJ4TUI6IChzLm5ldHdvcmsucnggLyAxMDQ4NTc2KS50b0ZpeGVkKDEpLCB0eE1COiAocy5uZXR3b3JrLnR4IC8gMTA0ODU3NikudG9GaXhlZCgxKSB9LCBkaXNrOiB7IHJlYWRNQjogMCwgd3JpdGVNQjogMCB9IH0sIHN0YXR1czogcy5zdGF0dXMgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FjaGVkTW9uaXRvcmluZ0RhdGEgPSBzdGF0cztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIXN0YXRzIHx8IE9iamVjdC5rZXlzKHN0YXRzKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiA0MHB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPk5vIHJ1bm5pbmcgY29udGFpbmVycyBmb3VuZDwvZGl2Pic7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGV0IGh0bWwgPSAnPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogOHB4O1wiPic7XG5cbiAgICAgIGZvciAoY29uc3QgW2lkLCBpbmZvXSBvZiBPYmplY3QuZW50cmllcyhzdGF0cykpIHtcbiAgICAgICAgY29uc3QgY3VyID0gaW5mby5jdXJyZW50IHx8IGluZm87XG4gICAgICAgIGNvbnN0IGNwdSA9IGN1ci5jcHU/LnBlcmNlbnQgfHwgMDtcbiAgICAgICAgY29uc3QgbWVtID0gY3VyLm1lbW9yeT8ucGVyY2VudCB8fCAwO1xuICAgICAgICBjb25zdCBjcHVDb2xvciA9IGdldENwdUNvbG9yKGNwdSk7XG4gICAgICAgIGNvbnN0IG1lbUNvbG9yID0gZ2V0TWVtQ29sb3IobWVtKTtcbiAgICAgICAgY29uc3QgbWVtVXNlZCA9IGN1ci5tZW1vcnk/LnVzYWdlIHx8IGN1ci5tZW1vcnk/LnVzZWQgfHwgMDtcbiAgICAgICAgY29uc3QgbWVtTGltaXQgPSBjdXIubWVtb3J5Py5saW1pdCB8fCAwO1xuICAgICAgICBjb25zdCBuZXRSeCA9IGN1ci5uZXR3b3JrPy5yeEJ5dGVzIHx8IGN1ci5uZXR3b3JrPy5yeCB8fCAwO1xuICAgICAgICBjb25zdCBuZXRUeCA9IGN1ci5uZXR3b3JrPy50eEJ5dGVzIHx8IGN1ci5uZXR3b3JrPy50eCB8fCAwO1xuICAgICAgICBjb25zdCBhZ2cgPSBpbmZvLmFnZ3JlZ2F0ZWQ7XG5cbiAgICAgICAgaHRtbCArPSBgXG4gICAgICAgICAgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDEycHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGJvcmRlci1yYWRpdXM6IDhweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDEycHg7IG1hcmdpbi1ib3R0b206IDEwcHg7XCI+XG4gICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC13ZWlnaHQ6IDYwMDsgZmxleDogMTtcIj4ke2luZm8ubmFtZSB8fCBpZH08L3NwYW4+XG4gICAgICAgICAgICAgICR7YWdnID8gYDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAwLjY1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBwYWRkaW5nOiAycHggNnB4OyBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tYWNjZW50KSAxMCUsIHRyYW5zcGFyZW50KTsgYm9yZGVyLXJhZGl1czogNHB4O1wiPmF2ZyAke2FnZy5jcHU/LmF2Zz8udG9GaXhlZCgwKSB8fCAwfSUgY3B1PC9zcGFuPmAgOiAnJ31cbiAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IGJhY2tncm91bmQ6IHZhcigtLWJhc2UpOyBwYWRkaW5nOiAycHggOHB4OyBib3JkZXItcmFkaXVzOiA0cHg7XCI+JHtpbmZvLnN0YXR1cyB8fCAncnVubmluZyd9PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoMywgMWZyKTsgZ2FwOiAxMnB4O1wiPlxuICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuN3JlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLWJvdHRvbTogNHB4O1wiPkNQVTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDhweDtcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmbGV4OiAxOyBoZWlnaHQ6IDZweDsgYmFja2dyb3VuZDogdmFyKC0tYmFzZSk7IGJvcmRlci1yYWRpdXM6IDNweDsgb3ZlcmZsb3c6IGhpZGRlbjtcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImhlaWdodDogMTAwJTsgd2lkdGg6ICR7TWF0aC5taW4oY3B1LCAxMDApfSU7IGJhY2tncm91bmQ6ICR7Y3B1Q29sb3J9OyBib3JkZXItcmFkaXVzOiAzcHg7IHRyYW5zaXRpb246IHdpZHRoIDAuM3M7XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGZvbnQtd2VpZ2h0OiA1MDA7IGNvbG9yOiAke2NwdUNvbG9yfTsgbWluLXdpZHRoOiA0NXB4OyB0ZXh0LWFsaWduOiByaWdodDtcIj4ke2NwdS50b0ZpeGVkKDEpfSU8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuN3JlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLWJvdHRvbTogNHB4O1wiPk1lbW9yeTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDhweDtcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmbGV4OiAxOyBoZWlnaHQ6IDZweDsgYmFja2dyb3VuZDogdmFyKC0tYmFzZSk7IGJvcmRlci1yYWRpdXM6IDNweDsgb3ZlcmZsb3c6IGhpZGRlbjtcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImhlaWdodDogMTAwJTsgd2lkdGg6ICR7TWF0aC5taW4obWVtLCAxMDApfSU7IGJhY2tncm91bmQ6ICR7bWVtQ29sb3J9OyBib3JkZXItcmFkaXVzOiAzcHg7IHRyYW5zaXRpb246IHdpZHRoIDAuM3M7XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGZvbnQtd2VpZ2h0OiA1MDA7IGNvbG9yOiAke21lbUNvbG9yfTsgbWluLXdpZHRoOiA0NXB4OyB0ZXh0LWFsaWduOiByaWdodDtcIj4ke21lbS50b0ZpeGVkKDEpfSU8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC42NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLXRvcDogMnB4O1wiPiR7Zm9ybWF0Qnl0ZXMobWVtVXNlZCl9IC8gJHtmb3JtYXRCeXRlcyhtZW1MaW1pdCl9PC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuN3JlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLWJvdHRvbTogNHB4O1wiPk5ldHdvcms8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07XCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiAjMzQ5OGRiO1wiPlx1MjE5MyAke2Zvcm1hdEJ5dGVzKG5ldFJ4KX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbjogMCA0cHg7XCI+Lzwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6ICNlNzRjM2M7XCI+XHUyMTkxICR7Zm9ybWF0Qnl0ZXMobmV0VHgpfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5gO1xuICAgICAgfVxuICAgICAgaHRtbCArPSAnPC9kaXY+JztcbiAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBodG1sO1xuICAgICAgbGFzdFVwZGF0ZVNwYW4udGV4dENvbnRlbnQgPSAnVXBkYXRlZDogJyArIG5ldyBEYXRlKCkudG9Mb2NhbGVUaW1lU3RyaW5nKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IGA8ZGl2IHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiA0MHB4OyBjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5cdTI3NEMgRmFpbGVkIHRvIGxvYWQgc3RhdHM6ICR7ZXNjYXBlSHRtbChlLm1lc3NhZ2UpfTwvZGl2PmA7XG4gICAgfVxuICB9XG5cbiAgLy8gPT09IDI0aCBBZ2dyZWdhdGVkIFRhYiA9PT1cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZEFnZ3JlZ2F0ZWQoKSB7XG4gICAgaWYgKCFhZ2dyZWdhdGVkQ29udGFpbmVyKSByZXR1cm47XG4gICAgY29uc3QgZGF0YSA9IGNhY2hlZE1vbml0b3JpbmdEYXRhO1xuICAgIGlmICghZGF0YSB8fCBPYmplY3Qua2V5cyhkYXRhKS5sZW5ndGggPT09IDApIHtcbiAgICAgIGFnZ3JlZ2F0ZWRDb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1RDgzRFx1RENDODwvc3Bhbj5ObyBtb25pdG9yaW5nIGRhdGEgYXZhaWxhYmxlLiBPcGVuIHRoZSBMaXZlIFN0YXRzIHRhYiBmaXJzdC48L2Rpdj4nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgaHRtbCA9ICc8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgZ2FwOiAxMnB4O1wiPic7XG4gICAgZm9yIChjb25zdCBbaWQsIGluZm9dIG9mIE9iamVjdC5lbnRyaWVzKGRhdGEpKSB7XG4gICAgICBjb25zdCBhZ2cgPSBpbmZvLmFnZ3JlZ2F0ZWQ7XG4gICAgICBpZiAoIWFnZykgY29udGludWU7XG4gICAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwicGFkZGluZzogMTJweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTsgYm9yZGVyLXJhZGl1czogOHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6IDYwMDsgbWFyZ2luLWJvdHRvbTogMTBweDtcIj4ke2luZm8ubmFtZSB8fCBpZH08L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDQsIDFmcik7IGdhcDogOHB4O1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGF0LW1pbmktY2FyZFwiPjxzcGFuIGNsYXNzPVwic3RhdC12YWxcIj4ke2FnZy5jcHU/LmF2Zz8udG9GaXhlZCgxKSB8fCAwfSU8L3NwYW4+PHNwYW4gY2xhc3M9XCJzdGF0LWxibFwiPkF2ZyBDUFU8L3NwYW4+PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInN0YXQtbWluaS1jYXJkXCI+PHNwYW4gY2xhc3M9XCJzdGF0LXZhbFwiPiR7YWdnLmNwdT8ubWF4Py50b0ZpeGVkKDEpIHx8IDB9JTwvc3Bhbj48c3BhbiBjbGFzcz1cInN0YXQtbGJsXCI+TWF4IENQVTwvc3Bhbj48L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RhdC1taW5pLWNhcmRcIj48c3BhbiBjbGFzcz1cInN0YXQtdmFsXCI+JHthZ2cubWVtb3J5Py5hdmc/LnRvRml4ZWQoMSkgfHwgMH0lPC9zcGFuPjxzcGFuIGNsYXNzPVwic3RhdC1sYmxcIj5BdmcgTWVtPC9zcGFuPjwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGF0LW1pbmktY2FyZFwiPjxzcGFuIGNsYXNzPVwic3RhdC12YWxcIj4ke2FnZy5tZW1vcnk/Lm1heD8udG9GaXhlZCgxKSB8fCAwfSU8L3NwYW4+PHNwYW4gY2xhc3M9XCJzdGF0LWxibFwiPk1heCBNZW08L3NwYW4+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICAke2FnZy5kYXRhUG9pbnRzID8gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuN3JlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLXRvcDogNnB4O1wiPiR7YWdnLmRhdGFQb2ludHN9IGRhdGEgcG9pbnRzIG92ZXIgJHthZ2cudGltZVJhbmdlIHx8IDI0fWg8L2Rpdj5gIDogJyd9XG4gICAgICA8L2Rpdj5gO1xuICAgIH1cbiAgICBodG1sICs9ICc8L2Rpdj4nO1xuICAgIGFnZ3JlZ2F0ZWRDb250YWluZXIuaW5uZXJIVE1MID0gaHRtbDtcbiAgfVxuXG4gIC8vID09PSBBbGVydHMgVGFiID09PVxuICBhc3luYyBmdW5jdGlvbiBsb2FkQWxlcnRzKCkge1xuICAgIGlmICghYWxlcnRzQ29udGFpbmVyKSByZXR1cm47XG4gICAgYWxlcnRzQ29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+IExvYWRpbmcgYWxlcnRzLi4uPC9kaXY+JztcblxuICAgIGNvbnN0IGRhdGEgPSBjYWNoZWRNb25pdG9yaW5nRGF0YTtcbiAgICBpZiAoIWRhdGEgfHwgT2JqZWN0LmtleXMoZGF0YSkubGVuZ3RoID09PSAwKSB7XG4gICAgICBhbGVydHNDb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1RDgzRFx1REQxNDwvc3Bhbj5ObyBjb250YWluZXJzIGZvdW5kLiBPcGVuIHRoZSBMaXZlIFN0YXRzIHRhYiBmaXJzdC48L2Rpdj4nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENoZWNrIHByZW1pdW0gc3RhdHVzIGZvciBjb25maWcgc2VjdGlvbiB2aXNpYmlsaXR5XG4gICAgbGV0IGlzUHJlbWl1bSA9IGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvbGljZW5zZS9mZWF0dXJlL3Jlc291cmNlLWFsZXJ0cycpO1xuICAgICAgY29uc3QgbGQgPSBhd2FpdCByZXNwLmpzb24oKTtcbiAgICAgIGlzUHJlbWl1bSA9IGxkLmF2YWlsYWJsZTtcbiAgICB9IGNhdGNoIChfKSB7IGlzUHJlbWl1bSA9IGZhbHNlOyB9XG5cbiAgICAvLyBGZXRjaCBhbGVydCBoaXN0b3J5XG4gICAgbGV0IGFsZXJ0SGlzdG9yeSA9IFtdO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBociA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL21vbml0b3JpbmcvYWxlcnRzP2xpbWl0PTUwJyk7XG4gICAgICBjb25zdCBoZCA9IGF3YWl0IGhyLmpzb24oKTtcbiAgICAgIGlmIChoZC5zdWNjZXNzKSBhbGVydEhpc3RvcnkgPSBoZC5oaXN0b3J5IHx8IFtdO1xuICAgIH0gY2F0Y2ggKF8pIHt9XG5cbiAgICAvLyBGZXRjaCBhbGwgYWxlcnQgY29uZmlnc1xuICAgIGxldCBhbGxDb25maWdzID0ge307XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNyID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvbW9uaXRvcmluZy9hbGVydHMvY29uZmlnJyk7XG4gICAgICBjb25zdCBjZCA9IGF3YWl0IGNyLmpzb24oKTtcbiAgICAgIGlmIChjZC5zdWNjZXNzKSBhbGxDb25maWdzID0gY2QuY29uZmlncyB8fCB7fTtcbiAgICB9IGNhdGNoIChfKSB7fVxuXG4gICAgY29uc3QgY29udGFpbmVycyA9IE9iamVjdC5lbnRyaWVzKGRhdGEpO1xuICAgIGNvbnN0IGNvbnRhaW5lclJvd3MgPSBjb250YWluZXJzLm1hcCgoW2lkLCBpbmZvXSkgPT4ge1xuICAgICAgY29uc3QgY2ZnID0gYWxsQ29uZmlnc1tpZF0gfHwgeyBjcHVUaHJlc2hvbGQ6IDgwLCBtZW1vcnlUaHJlc2hvbGQ6IDkwLCBkaXNrSU9UaHJlc2hvbGQ6IDUwLCBhdXRvUmVzdGFydDogZmFsc2UsIGVuYWJsZWQ6IGZhbHNlIH07XG4gICAgICByZXR1cm4gYFxuICAgICAgICA8dHIgZGF0YS1jb250YWluZXI9XCIke2lkfVwiPlxuICAgICAgICAgIDx0ZCBzdHlsZT1cImZvbnQtd2VpZ2h0OiA2MDA7IHBhZGRpbmc6IDhweDtcIj4ke2luZm8ubmFtZSB8fCBpZH08L3RkPlxuICAgICAgICAgIDx0ZCBzdHlsZT1cInBhZGRpbmc6IDRweCA4cHg7XCI+PGlucHV0IHR5cGU9XCJudW1iZXJcIiBjbGFzcz1cImFsZXJ0LWNwdVwiIHZhbHVlPVwiJHtjZmcuY3B1VGhyZXNob2xkID8/IDgwfVwiIG1pbj1cIjBcIiBtYXg9XCIxMDBcIiBzdHlsZT1cIndpZHRoOiA2MHB4OyBmb250LXNpemU6IDAuOHJlbTsgcGFkZGluZzogMnB4IDRweDtcIiAke2lzUHJlbWl1bSA/ICcnIDogJ2Rpc2FibGVkJ30gLz48L3RkPlxuICAgICAgICAgIDx0ZCBzdHlsZT1cInBhZGRpbmc6IDRweCA4cHg7XCI+PGlucHV0IHR5cGU9XCJudW1iZXJcIiBjbGFzcz1cImFsZXJ0LW1lbVwiIHZhbHVlPVwiJHtjZmcubWVtb3J5VGhyZXNob2xkID8/IDkwfVwiIG1pbj1cIjBcIiBtYXg9XCIxMDBcIiBzdHlsZT1cIndpZHRoOiA2MHB4OyBmb250LXNpemU6IDAuOHJlbTsgcGFkZGluZzogMnB4IDRweDtcIiAke2lzUHJlbWl1bSA/ICcnIDogJ2Rpc2FibGVkJ30gLz48L3RkPlxuICAgICAgICAgIDx0ZCBzdHlsZT1cInBhZGRpbmc6IDRweCA4cHg7XCI+PGlucHV0IHR5cGU9XCJudW1iZXJcIiBjbGFzcz1cImFsZXJ0LWRpc2tcIiB2YWx1ZT1cIiR7Y2ZnLmRpc2tJT1RocmVzaG9sZCA/PyA1MH1cIiBtaW49XCIwXCIgbWF4PVwiMTAwMFwiIHN0eWxlPVwid2lkdGg6IDcwcHg7IGZvbnQtc2l6ZTogMC44cmVtOyBwYWRkaW5nOiAycHggNHB4O1wiICR7aXNQcmVtaXVtID8gJycgOiAnZGlzYWJsZWQnfSAvPjwvdGQ+XG4gICAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzogNHB4IDhweDtcIj48aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJhbGVydC1hdXRvcmVzdGFydFwiICR7Y2ZnLmF1dG9SZXN0YXJ0ID8gJ2NoZWNrZWQnIDogJyd9ICR7aXNQcmVtaXVtID8gJycgOiAnZGlzYWJsZWQnfSAvPjwvdGQ+XG4gICAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzogNHB4IDhweDtcIj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhbGVydC10ZXN0LWJ0biBidG4teHNcIiBkYXRhLWNvbnRhaW5lcj1cIiR7aWR9XCIgZGF0YS1uYW1lPVwiJHtpbmZvLm5hbWUgfHwgaWR9XCIgc3R5bGU9XCJwYWRkaW5nOiAycHggOHB4OyBmb250LXNpemU6IDAuNzVyZW07IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDRweDsgY3Vyc29yOiBwb2ludGVyO1wiPlRlc3Q8L2J1dHRvbj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L3RyPlxuICAgICAgYDtcbiAgICB9KS5qb2luKCcnKTtcblxuICAgIGNvbnN0IGhpc3RvcnlSb3dzID0gYWxlcnRIaXN0b3J5Lm1hcChlbnRyeSA9PiB7XG4gICAgICBjb25zdCB0aW1lID0gbmV3IERhdGUoZW50cnkudGltZXN0YW1wKS50b0xvY2FsZVN0cmluZygpO1xuICAgICAgY29uc3Qgbm90aWZpZWRNYXJrID0gZW50cnkubm90aWZpZWQgPyAnXHUyNzEzJyA6ICdcdTIwMTQnO1xuICAgICAgcmV0dXJuIGBcbiAgICAgICAgPHRyPlxuICAgICAgICAgIDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweCA4cHg7IGZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPiR7dGltZX08L3RkPlxuICAgICAgICAgIDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweCA4cHg7IGZvbnQtd2VpZ2h0OiA1MDA7XCI+JHtlbnRyeS5jb250YWluZXJOYW1lIHx8IGVudHJ5LmNvbnRhaW5lcklkfTwvdGQ+XG4gICAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4IDhweDsgdGV4dC10cmFuc2Zvcm06IGNhcGl0YWxpemU7XCI+JHtlbnRyeS5tZXRyaWMgfHwgZW50cnkudHlwZX08L3RkPlxuICAgICAgICAgIDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweCA4cHg7XCI+JHt0eXBlb2YgZW50cnkudmFsdWUgPT09ICdudW1iZXInID8gZW50cnkudmFsdWUudG9GaXhlZCgxKSA6IGVudHJ5LnZhbHVlfSR7ZW50cnkubWV0cmljID09PSAnZGlzaycgPyAnIE1CL3MnIDogJyUnfTwvdGQ+XG4gICAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4IDhweDsgdGV4dC1hbGlnbjogY2VudGVyO1wiPiR7bm90aWZpZWRNYXJrfTwvdGQ+XG4gICAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4IDhweDsgZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogJHtlbnRyeS5hdXRvUmVzdGFydFRyaWdnZXJlZCA/ICcjZjM5YzEyJyA6ICd2YXIoLS1tdXRlZCknfTtcIj4ke2VudHJ5LmF1dG9SZXN0YXJ0VHJpZ2dlcmVkID8gJ1x1MjFCQicgOiAnJ308L3RkPlxuICAgICAgICA8L3RyPlxuICAgICAgYDtcbiAgICB9KS5qb2luKCcnKTtcblxuICAgIGNvbnN0IGNvbmZpZ1NlY3Rpb24gPSBpc1ByZW1pdW0gPyBgXG4gICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMjBweDtcIj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsgbWFyZ2luLWJvdHRvbTogMTBweDtcIj5cbiAgICAgICAgICA8aDQgc3R5bGU9XCJtYXJnaW46IDA7IGZvbnQtc2l6ZTogMC45cmVtO1wiPlx1MjY5OVx1RkUwRiBBbGVydCBDb25maWd1cmF0aW9uPC9oND5cbiAgICAgICAgICA8YSBocmVmPVwiI1wiIGlkPVwiZ28tdG8tbm90aWZpY2F0aW9uc1wiIHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1hY2NlbnQpOyB0ZXh0LWRlY29yYXRpb246IG5vbmU7XCI+Q29uZmlndXJlIG5vdGlmaWNhdGlvbnMgXHUyMTkyPC9hPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cIm92ZXJmbG93LXg6IGF1dG87XCI+XG4gICAgICAgICAgPHRhYmxlIHN0eWxlPVwid2lkdGg6IDEwMCU7IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj5cbiAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgPHRyIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCI+XG4gICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwidGV4dC1hbGlnbjogbGVmdDsgcGFkZGluZzogNnB4IDhweDsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5Db250YWluZXI8L3RoPlxuICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cInRleHQtYWxpZ246IGxlZnQ7IHBhZGRpbmc6IDZweCA4cHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+Q1BVICU8L3RoPlxuICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cInRleHQtYWxpZ246IGxlZnQ7IHBhZGRpbmc6IDZweCA4cHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+TWVtICU8L3RoPlxuICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cInRleHQtYWxpZ246IGxlZnQ7IHBhZGRpbmc6IDZweCA4cHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+RGlzayBJL08gTUIvczwvdGg+XG4gICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiA2cHggOHB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPkF1dG8tUmVzdGFydDwvdGg+XG4gICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwicGFkZGluZzogNnB4IDhweDtcIj48L3RoPlxuICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICAgIDx0Ym9keT4ke2NvbnRhaW5lclJvd3N9PC90Ym9keT5cbiAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDEycHg7IGRpc3BsYXk6IGZsZXg7IGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XCI+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cInNhdmUtYWxsLWFsZXJ0c1wiIHN0eWxlPVwicGFkZGluZzogNnB4IDE2cHg7IGZvbnQtc2l6ZTogMC44NXJlbTsgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50KTsgY29sb3I6IHZhcigtLWJhc2UpOyBib3JkZXI6IG5vbmU7IGJvcmRlci1yYWRpdXM6IDRweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXdlaWdodDogNjAwO1wiPlNhdmUgQWxsPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgYCA6IGBcbiAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAyMHB4OyBwYWRkaW5nOiAxMnB4OyBiYWNrZ3JvdW5kOiByZ2JhKDI0MSwxOTYsMTUsMC4xKTsgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNDEsMTk2LDE1LDAuMyk7IGJvcmRlci1yYWRpdXM6IDhweDsgdGV4dC1hbGlnbjogY2VudGVyO1wiPlxuICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiAjZjFjNDBmOyBmb250LXdlaWdodDogNjAwOyBmb250LXNpemU6IDAuODVyZW07XCI+XHUyQjUwIFByZW1pdW0gRmVhdHVyZTwvc3Bhbj5cbiAgICAgICAgPHAgc3R5bGU9XCJtYXJnaW46IDZweCAwIDA7IGZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5VcGdyYWRlIHRvIGNvbmZpZ3VyZSByZXNvdXJjZSBhbGVydCB0aHJlc2hvbGRzIHBlciBjb250YWluZXIuPC9wPlxuICAgICAgICA8YnV0dG9uIGlkPVwidXBncmFkZS1mb3ItYWxlcnRzXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiA4cHg7IHBhZGRpbmc6IDRweCAxMnB4OyBmb250LXNpemU6IDAuNzVyZW07IGJhY2tncm91bmQ6ICNmMWM0MGY7IGNvbG9yOiAjMDAwOyBib3JkZXI6IG5vbmU7IGJvcmRlci1yYWRpdXM6IDRweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXdlaWdodDogNjAwO1wiPlVwZ3JhZGUgTm93PC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICBgO1xuXG4gICAgYWxlcnRzQ29udGFpbmVyLmlubmVySFRNTCA9IGBcbiAgICAgICR7Y29uZmlnU2VjdGlvbn1cbiAgICAgIDxkaXY+XG4gICAgICAgIDxoNCBzdHlsZT1cIm1hcmdpbjogMCAwIDEwcHg7IGZvbnQtc2l6ZTogMC45cmVtO1wiPlx1RDgzRFx1RENDQiBSZWNlbnQgQWxlcnRzPC9oND5cbiAgICAgICAgJHtoaXN0b3J5Um93cyA/IGBcbiAgICAgICAgICA8ZGl2IHN0eWxlPVwib3ZlcmZsb3cteDogYXV0bztcIj5cbiAgICAgICAgICAgIDx0YWJsZSBzdHlsZT1cIndpZHRoOiAxMDAlOyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyBmb250LXNpemU6IDAuOHJlbTtcIj5cbiAgICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICAgIDx0ciBzdHlsZT1cImJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPlxuICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwidGV4dC1hbGlnbjogbGVmdDsgcGFkZGluZzogNnB4IDhweDsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5UaW1lPC90aD5cbiAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cInRleHQtYWxpZ246IGxlZnQ7IHBhZGRpbmc6IDZweCA4cHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+Q29udGFpbmVyPC90aD5cbiAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cInRleHQtYWxpZ246IGxlZnQ7IHBhZGRpbmc6IDZweCA4cHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+TWV0cmljPC90aD5cbiAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cInRleHQtYWxpZ246IGxlZnQ7IHBhZGRpbmc6IDZweCA4cHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+VmFsdWU8L3RoPlxuICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiA2cHggOHB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPlx1MjcxMz88L3RoPlxuICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwicGFkZGluZzogNnB4IDhweDtcIj48L3RoPlxuICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgIDwvdGhlYWQ+XG4gICAgICAgICAgICAgIDx0Ym9keT4ke2hpc3RvcnlSb3dzfTwvdGJvZHk+XG4gICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICBgIDogJzxkaXYgc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpOyB0ZXh0LWFsaWduOiBjZW50ZXI7IHBhZGRpbmc6IDIwcHg7XCI+Tm8gYWxlcnRzIHJlY29yZGVkIHlldC48L2Rpdj4nfVxuICAgICAgPC9kaXY+XG4gICAgYDtcblxuICAgIC8vIFdpcmUgdXAgc2F2ZS1hbGwgYnV0dG9uXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NhdmUtYWxsLWFsZXJ0cycpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGNvbmZpZ3MgPSB7fTtcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNzdGF0cy1hbGVydHMtY29udGFpbmVyIHRyW2RhdGEtY29udGFpbmVyXScpLmZvckVhY2gocm93ID0+IHtcbiAgICAgICAgY29uc3QgY0lkID0gcm93LmRhdGFzZXQuY29udGFpbmVyO1xuICAgICAgICBjb25maWdzW2NJZF0gPSB7XG4gICAgICAgICAgY3B1VGhyZXNob2xkOiBwYXJzZUludChyb3cucXVlcnlTZWxlY3RvcignLmFsZXJ0LWNwdScpPy52YWx1ZSkgfHwgODAsXG4gICAgICAgICAgbWVtb3J5VGhyZXNob2xkOiBwYXJzZUludChyb3cucXVlcnlTZWxlY3RvcignLmFsZXJ0LW1lbScpPy52YWx1ZSkgfHwgOTAsXG4gICAgICAgICAgZGlza0lPVGhyZXNob2xkOiBwYXJzZUludChyb3cucXVlcnlTZWxlY3RvcignLmFsZXJ0LWRpc2snKT8udmFsdWUpIHx8IDUwLFxuICAgICAgICAgIGF1dG9SZXN0YXJ0OiAhIXJvdy5xdWVyeVNlbGVjdG9yKCcuYWxlcnQtYXV0b3Jlc3RhcnQnKT8uY2hlY2tlZCxcbiAgICAgICAgICBlbmFibGVkOiB0cnVlXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL21vbml0b3JpbmcvYWxlcnRzL2NvbmZpZycsIHtcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGNvbmZpZ3MgfSlcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGQgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICBjb25zdCBidG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2F2ZS1hbGwtYWxlcnRzJyk7XG4gICAgICAgIGJ0bi50ZXh0Q29udGVudCA9IGQuc3VjY2VzcyA/ICdcdTI3MDUgU2F2ZWQnIDogJ1x1Mjc0QyBGYWlsZWQnO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgYnRuLnRleHRDb250ZW50ID0gJ1NhdmUgQWxsJzsgfSwgMjAwMCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzYXZlLWFsbC1hbGVydHMnKTtcbiAgICAgICAgYnRuLnRleHRDb250ZW50ID0gJ1x1Mjc0QyBFcnJvcic7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyBidG4udGV4dENvbnRlbnQgPSAnU2F2ZSBBbGwnOyB9LCAyMDAwKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFdpcmUgdXAgbm90aWZpY2F0aW9uIHNldHRpbmdzIGxpbmtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ28tdG8tbm90aWZpY2F0aW9ucycpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBtb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gICAgICBzdG9wQXV0b1JlZnJlc2goKTtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYW5hZ2Utbm90aWZpY2F0aW9ucycpPy5jbGljaygpO1xuICAgIH0pO1xuXG4gICAgLy8gV2lyZSB1cCB0ZXN0IGJ1dHRvbnNcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuYWxlcnQtdGVzdC1idG4nKS5mb3JFYWNoKGJ0biA9PiB7XG4gICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG9yaWcgPSBidG4udGV4dENvbnRlbnQ7XG4gICAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICcuLi4nO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHNlY3VyZUZldGNoKGAvYXBpL3YxL21vbml0b3JpbmcvYWxlcnRzLyR7YnRuLmRhdGFzZXQuY29udGFpbmVyfS90ZXN0YCwgeyBtZXRob2Q6ICdQT1NUJyB9KTtcbiAgICAgICAgICBidG4udGV4dENvbnRlbnQgPSAnXHUyNzA1JztcbiAgICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdUZXN0IGFsZXJ0IHNlbnQgZm9yICcgKyBidG4uZGF0YXNldC5uYW1lLCAnc3VjY2VzcycsIDMwMDApO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgYnRuLnRleHRDb250ZW50ID0gJ1x1Mjc0Qyc7XG4gICAgICAgIH1cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IGJ0bi50ZXh0Q29udGVudCA9IG9yaWc7IH0sIDIwMDApO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBXaXJlIHVwIHVwZ3JhZGUgYnV0dG9uXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VwZ3JhZGUtZm9yLWFsZXJ0cycpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIG1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgICAgIHN0b3BBdXRvUmVmcmVzaCgpO1xuICAgICAgaWYgKHR5cGVvZiBvcGVuTGljZW5zZU1vZGFsID09PSAnZnVuY3Rpb24nKSBvcGVuTGljZW5zZU1vZGFsKCk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBzdGFydEF1dG9SZWZyZXNoKCkge1xuICAgIGlmIChyZWZyZXNoSW50ZXJ2YWwpIGNsZWFySW50ZXJ2YWwocmVmcmVzaEludGVydmFsKTtcbiAgICBpZiAoYXV0b1JlZnJlc2hDaGVja2JveD8uY2hlY2tlZCkge1xuICAgICAgcmVmcmVzaEludGVydmFsID0gc2V0SW50ZXJ2YWwobG9hZFN0YXRzLCBEQy5QT0xMLlNUQVRTKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzdG9wQXV0b1JlZnJlc2goKSB7XG4gICAgaWYgKHJlZnJlc2hJbnRlcnZhbCkge1xuICAgICAgY2xlYXJJbnRlcnZhbChyZWZyZXNoSW50ZXJ2YWwpO1xuICAgICAgcmVmcmVzaEludGVydmFsID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvLyBPcGVuIG1vZGFsXG4gIG9wZW5CdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIG1vZGFsLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgICBsb2FkU3RhdHMoKTtcbiAgICBzdGFydEF1dG9SZWZyZXNoKCk7XG4gIH0pO1xuXG4gIC8vIENsb3NlIG1vZGFsXG4gIGNhbmNlbEJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgIHN0b3BBdXRvUmVmcmVzaCgpO1xuICB9KTtcblxuICBtb2RhbD8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgIGlmIChlLnRhcmdldCA9PT0gbW9kYWwpIHtcbiAgICAgIG1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgICAgIHN0b3BBdXRvUmVmcmVzaCgpO1xuICAgIH1cbiAgfSk7XG5cbiAgcmVmcmVzaEJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBsb2FkU3RhdHMpO1xuXG4gIGF1dG9SZWZyZXNoQ2hlY2tib3g/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHtcbiAgICBpZiAoYXV0b1JlZnJlc2hDaGVja2JveC5jaGVja2VkKSBzdGFydEF1dG9SZWZyZXNoKCk7XG4gICAgZWxzZSBzdG9wQXV0b1JlZnJlc2goKTtcbiAgfSk7XG5cbiAgLy8gTGF6eS1sb2FkIHRhYnNcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtcGFuZWw9XCJzdGF0cy1hZ2dyZWdhdGVkXCJdJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbG9hZEFnZ3JlZ2F0ZWQpO1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1wYW5lbD1cInN0YXRzLWFsZXJ0c1wiXScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGxvYWRBbGVydHMpO1xuXG4gIC8vID09PSBIaXN0b3J5IFRhYiA9PT1cbiAgY29uc3QgaGlzdG9yeUNvbnRhaW5lclNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGF0cy1oaXN0b3J5LWNvbnRhaW5lcicpO1xuICBjb25zdCBoaXN0b3J5QXJlYSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGF0cy1oaXN0b3J5LWNvbnRhaW5lci1hcmVhJyk7XG4gIGNvbnN0IHJhbmdlQnV0dG9ucyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zdGF0cy1yYW5nZS1idG4nKTtcblxuICBsZXQgY3VycmVudFJhbmdlID0gJzFoJztcblxuICBmdW5jdGlvbiByYW5nZVRvTXMocmFuZ2UpIHtcbiAgICBzd2l0Y2ggKHJhbmdlKSB7XG4gICAgICBjYXNlICcxaCc6ICByZXR1cm4gNjAgKiA2MCAqIDEwMDA7XG4gICAgICBjYXNlICcyNGgnOiByZXR1cm4gMjQgKiA2MCAqIDYwICogMTAwMDtcbiAgICAgIGNhc2UgJzdkJzogIHJldHVybiA3ICogMjQgKiA2MCAqIDYwICogMTAwMDtcbiAgICAgIGNhc2UgJzMwZCc6IHJldHVybiAzMCAqIDI0ICogNjAgKiA2MCAqIDEwMDA7XG4gICAgICBjYXNlICcxeSc6ICByZXR1cm4gMzY1ICogMjQgKiA2MCAqIDYwICogMTAwMDtcbiAgICAgIGRlZmF1bHQ6ICAgIHJldHVybiA2MCAqIDYwICogMTAwMDtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB0aWVyTGFiZWwodGllcikge1xuICAgIGlmICh0aWVyID09PSAncmF3JykgcmV0dXJuICdsaXZlICgxMHMgc2FtcGxlcyknO1xuICAgIGlmICh0aWVyID09PSAnaG91cmx5JykgcmV0dXJuICdob3VybHkgYXZlcmFnZSc7XG4gICAgaWYgKHRpZXIgPT09ICdkYWlseScpIHJldHVybiAnZGFpbHkgYXZlcmFnZSc7XG4gICAgcmV0dXJuIHRpZXI7XG4gIH1cblxuICAvLyBTaW1wbGUgU1ZHIHNwYXJrbGluZSBcdTIwMTQgbm8gZXh0ZXJuYWwgbGliXG4gIGZ1bmN0aW9uIHJlbmRlclNwYXJrbGluZShzYW1wbGVzLCBhY2Nlc3NvciwgY29sb3IsIGxhYmVsLCB1bml0KSB7XG4gICAgaWYgKCFzYW1wbGVzIHx8IHNhbXBsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gYDxkaXYgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiB2YXIoLS1tdXRlZCk7IHBhZGRpbmc6IDIwcHg7XCI+Tm8gZGF0YSBmb3IgJHtlc2NhcGVIdG1sKGxhYmVsKX08L2Rpdj5gO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZXMgPSBzYW1wbGVzLm1hcChhY2Nlc3NvcikuZmlsdGVyKHYgPT4gdiAhPSBudWxsKTtcbiAgICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGA8ZGl2IHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBwYWRkaW5nOiAyMHB4O1wiPk5vIGRhdGEgZm9yICR7ZXNjYXBlSHRtbChsYWJlbCl9PC9kaXY+YDtcbiAgICB9XG4gICAgY29uc3QgbWF4ID0gTWF0aC5tYXgoLi4udmFsdWVzLCAxKTtcbiAgICBjb25zdCBtaW4gPSBNYXRoLm1pbiguLi52YWx1ZXMsIDApO1xuICAgIGNvbnN0IHJhbmdlID0gbWF4IC0gbWluIHx8IDE7XG4gICAgY29uc3QgdyA9IDYwMCwgaCA9IDgwLCBwYWQgPSA0O1xuICAgIGNvbnN0IHN0ZXBYID0gKHcgLSBwYWQgKiAyKSAvIE1hdGgubWF4KHZhbHVlcy5sZW5ndGggLSAxLCAxKTtcbiAgICBjb25zdCBwb2ludHMgPSB2YWx1ZXMubWFwKCh2LCBpKSA9PiB7XG4gICAgICBjb25zdCB4ID0gcGFkICsgaSAqIHN0ZXBYO1xuICAgICAgY29uc3QgeSA9IGggLSBwYWQgLSAoKHYgLSBtaW4pIC8gcmFuZ2UpICogKGggLSBwYWQgKiAyKTtcbiAgICAgIHJldHVybiBgJHt4LnRvRml4ZWQoMSl9LCR7eS50b0ZpeGVkKDEpfWA7XG4gICAgfSkuam9pbignICcpO1xuICAgIGNvbnN0IGxhc3QgPSB2YWx1ZXNbdmFsdWVzLmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IGF2ZyA9IHZhbHVlcy5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKSAvIHZhbHVlcy5sZW5ndGg7XG4gICAgcmV0dXJuIGBcbiAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAxNHB4O1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGJhc2VsaW5lOyBnYXA6IDEycHg7IG1hcmdpbi1ib3R0b206IDRweDtcIj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtd2VpZ2h0OiA2MDA7IGZvbnQtc2l6ZTogMC45cmVtO1wiPiR7ZXNjYXBlSHRtbChsYWJlbCl9PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPmxhc3QgJHtsYXN0LnRvRml4ZWQoMSl9JHt1bml0fSBcdTAwQjcgYXZnICR7YXZnLnRvRml4ZWQoMSl9JHt1bml0fSBcdTAwQjcgbWF4ICR7bWF4LnRvRml4ZWQoMSl9JHt1bml0fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxzdmcgdmlld0JveD1cIjAgMCAke3d9ICR7aH1cIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPVwibm9uZVwiIHN0eWxlPVwid2lkdGg6IDEwMCU7IGhlaWdodDogJHtofXB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iYXNlKTsgYm9yZGVyLXJhZGl1czogNHB4O1wiPlxuICAgICAgICAgIDxwb2x5bGluZSBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiR7Y29sb3J9XCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgcG9pbnRzPVwiJHtwb2ludHN9XCIgLz5cbiAgICAgICAgPC9zdmc+XG4gICAgICA8L2Rpdj5cbiAgICBgO1xuICB9XG5cbiAgZnVuY3Rpb24gcG9wdWxhdGVIaXN0b3J5Q29udGFpbmVyU2VsZWN0KCkge1xuICAgIGlmICghaGlzdG9yeUNvbnRhaW5lclNlbGVjdCkgcmV0dXJuO1xuICAgIGNvbnN0IGRhdGEgPSBjYWNoZWRNb25pdG9yaW5nRGF0YSB8fCB7fTtcbiAgICBjb25zdCBwcmV2aW91cyA9IGhpc3RvcnlDb250YWluZXJTZWxlY3QudmFsdWU7XG4gICAgY29uc3QgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKGRhdGEpO1xuICAgIGlmIChlbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaGlzdG9yeUNvbnRhaW5lclNlbGVjdC5pbm5lckhUTUwgPSAnPG9wdGlvbiB2YWx1ZT1cIlwiPk5vIGNvbnRhaW5lcnM8L29wdGlvbj4nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBoaXN0b3J5Q29udGFpbmVyU2VsZWN0LmlubmVySFRNTCA9IGVudHJpZXNcbiAgICAgIC5tYXAoKFtpZCwgaW5mb10pID0+IGA8b3B0aW9uIHZhbHVlPVwiJHtlc2NhcGVIdG1sKGlkKX1cIj4ke2VzY2FwZUh0bWwoaW5mby5uYW1lIHx8IGlkKX08L29wdGlvbj5gKVxuICAgICAgLmpvaW4oJycpO1xuICAgIGlmIChwcmV2aW91cyAmJiBkYXRhW3ByZXZpb3VzXSkgaGlzdG9yeUNvbnRhaW5lclNlbGVjdC52YWx1ZSA9IHByZXZpb3VzO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZEhpc3RvcnkoKSB7XG4gICAgaWYgKCFoaXN0b3J5QXJlYSB8fCAhaGlzdG9yeUNvbnRhaW5lclNlbGVjdCkgcmV0dXJuO1xuICAgIGNvbnN0IGNvbnRhaW5lcklkID0gaGlzdG9yeUNvbnRhaW5lclNlbGVjdC52YWx1ZTtcbiAgICBpZiAoIWNvbnRhaW5lcklkKSB7XG4gICAgICBoaXN0b3J5QXJlYS5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHVEODNEXHVEQ0NBPC9zcGFuPk5vIGNvbnRhaW5lciBzZWxlY3RlZC48L2Rpdj4nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBlbmRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBlbmRUaW1lIC0gcmFuZ2VUb01zKGN1cnJlbnRSYW5nZSk7XG4gICAgaGlzdG9yeUFyZWEuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiYnJhbmQtc3Bpbm5lclwiPjwvc3Bhbj4gTG9hZGluZyBoaXN0b3J5Li4uPC9kaXY+JztcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgL2FwaS92MS9tb25pdG9yaW5nL2hpc3RvcnkvJHtlbmNvZGVVUklDb21wb25lbnQoY29udGFpbmVySWQpfT9zdGFydFRpbWU9JHtzdGFydFRpbWV9JmVuZFRpbWU9JHtlbmRUaW1lfWApO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoIWRhdGEuc3VjY2VzcykgdGhyb3cgbmV3IEVycm9yKGRhdGEuZXJyb3IgfHwgJ0ZhaWxlZCB0byBsb2FkIGhpc3RvcnknKTtcblxuICAgICAgY29uc3Qgc2FtcGxlcyA9IGRhdGEuc2FtcGxlcyB8fCBbXTtcbiAgICAgIGNvbnN0IHRpZXIgPSBkYXRhLnRpZXIgfHwgJ3Jhdyc7XG5cbiAgICAgIGlmIChzYW1wbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBoaXN0b3J5QXJlYS5pbm5lckhUTUwgPSBgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHVEODNEXHVEQ0NBPC9zcGFuPk5vIGRhdGEgZm9yIHRoZSBsYXN0ICR7Y3VycmVudFJhbmdlfS4gVGllcjogJHt0aWVyTGFiZWwodGllcil9LjwvZGl2PmA7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gRGlmZmVyZW50IHNoYXBlIGJldHdlZW4gcmF3IHZzIHJvbGxlZC11cCBzYW1wbGVzXG4gICAgICBjb25zdCBpc1JhdyA9IHRpZXIgPT09ICdyYXcnO1xuICAgICAgY29uc3QgY3B1QWNjZXNzb3IgPSBpc1JhdyA/IChzKSA9PiBzLmNwdT8ucGVyY2VudCA6IChzKSA9PiBzLmNwdT8uYXZnO1xuICAgICAgY29uc3QgbWVtQWNjZXNzb3IgPSBpc1JhdyA/IChzKSA9PiBzLm1lbW9yeT8ucGVyY2VudCA6IChzKSA9PiBzLm1lbW9yeT8uYXZnUGVyY2VudDtcbiAgICAgIGNvbnN0IG5ldFJ4QWNjZXNzb3IgPSBpc1JhdyA/IChzKSA9PiAocy5uZXR3b3JrPy5yeE1CIHx8IDApIDogKHMpID0+IChzLm5ldHdvcms/LnJ4TUIgfHwgMCk7XG4gICAgICBjb25zdCBuZXRUeEFjY2Vzc29yID0gaXNSYXcgPyAocykgPT4gKHMubmV0d29yaz8udHhNQiB8fCAwKSA6IChzKSA9PiAocy5uZXR3b3JrPy50eE1CIHx8IDApO1xuXG4gICAgICBsZXQgaHRtbCA9IGBcbiAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLWJvdHRvbTogOHB4O1wiPlxuICAgICAgICAgICR7c2FtcGxlcy5sZW5ndGh9IHNhbXBsZXMgXHUwMEI3ICR7ZXNjYXBlSHRtbCh0aWVyTGFiZWwodGllcikpfSBcdTAwQjcgJHtuZXcgRGF0ZShzdGFydFRpbWUpLnRvTG9jYWxlU3RyaW5nKCl9IFx1MjE5MiAke25ldyBEYXRlKGVuZFRpbWUpLnRvTG9jYWxlU3RyaW5nKCl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgYDtcbiAgICAgIGh0bWwgKz0gcmVuZGVyU3BhcmtsaW5lKHNhbXBsZXMsIGNwdUFjY2Vzc29yLCAnIzJlY2M3MScsICdDUFUnLCAnJScpO1xuICAgICAgaHRtbCArPSByZW5kZXJTcGFya2xpbmUoc2FtcGxlcywgbWVtQWNjZXNzb3IsICcjMzQ5OGRiJywgJ01lbW9yeScsICclJyk7XG4gICAgICBodG1sICs9IHJlbmRlclNwYXJrbGluZShzYW1wbGVzLCBuZXRSeEFjY2Vzc29yLCAnIzliNTliNicsICdOZXR3b3JrIFJYJywgJyBNQicpO1xuICAgICAgaHRtbCArPSByZW5kZXJTcGFya2xpbmUoc2FtcGxlcywgbmV0VHhBY2Nlc3NvciwgJyNlNjdlMjInLCAnTmV0d29yayBUWCcsICcgTUInKTtcblxuICAgICAgaGlzdG9yeUFyZWEuaW5uZXJIVE1MID0gaHRtbDtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBoaXN0b3J5QXJlYS5pbm5lckhUTUwgPSBgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHUyNkEwXHVGRTBGPC9zcGFuPkZhaWxlZCB0byBsb2FkIGhpc3Rvcnk6ICR7ZXNjYXBlSHRtbChlLm1lc3NhZ2UpfTwvZGl2PmA7XG4gICAgfVxuICB9XG5cbiAgcmFuZ2VCdXR0b25zLmZvckVhY2goYnRuID0+IHtcbiAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICByYW5nZUJ1dHRvbnMuZm9yRWFjaChiID0+IGIuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJykpO1xuICAgICAgYnRuLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICAgICAgY3VycmVudFJhbmdlID0gYnRuLmRhdGFzZXQucmFuZ2U7XG4gICAgICBsb2FkSGlzdG9yeSgpO1xuICAgIH0pO1xuICB9KTtcblxuICBoaXN0b3J5Q29udGFpbmVyU2VsZWN0Py5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBsb2FkSGlzdG9yeSk7XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtcGFuZWw9XCJzdGF0cy1oaXN0b3J5XCJdJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIHBvcHVsYXRlSGlzdG9yeUNvbnRhaW5lclNlbGVjdCgpO1xuICAgIGxvYWRIaXN0b3J5KCk7XG4gIH0pO1xufSkoKTtcbjtcbi8vID09PT09PT09PT0gSEVBTFRIIENIRUNLIERBU0hCT0FSRCA9PT09PT09PT09XG4oZnVuY3Rpb24oKSB7XG4gIC8vIEluamVjdCBtb2RhbCBIVE1MXG4gIGluamVjdE1vZGFsKCdoZWFsdGgtbW9kYWwnLCBgPGRpdiBpZD1cImhlYWx0aC1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogODAwcHg7IG1heC13aWR0aDogMTAwMHB4O1wiPlxuICAgICAgPGgzPlx1RDgzQ1x1REZFNSBIZWFsdGggQ2hlY2sgRGFzaGJvYXJkPC9oMz5cbiAgICAgIDxwIGNsYXNzPVwibW9kYWwtc3VidGl0bGVcIj5cbiAgICAgICAgU2VydmljZSB1cHRpbWUgdHJhY2tpbmcsIFNMQSBtb25pdG9yaW5nLCBhbmQgaW5jaWRlbnQgbWFuYWdlbWVudC5cbiAgICAgIDwvcD5cblxuICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLXRhYnNcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInBhbmVsLXRhYiBhY3RpdmVcIiBkYXRhLXBhbmVsPVwiaGVhbHRoLXN0YXR1c1wiPlN0YXR1czwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwicGFuZWwtdGFiXCIgZGF0YS1wYW5lbD1cImhlYWx0aC1pbmNpZGVudHNcIj5JbmNpZGVudHM8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInBhbmVsLXRhYlwiIGRhdGEtcGFuZWw9XCJoZWFsdGgtY29uZmlnXCI+Q29uZmlndXJlPC9idXR0b24+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBUYWI6IFN0YXR1cyAtLT5cbiAgICAgIDxkaXYgaWQ9XCJoZWFsdGgtc3RhdHVzXCIgY2xhc3M9XCJwYW5lbC1zZWN0aW9uIGFjdGl2ZVwiPlxuICAgICAgICA8ZGl2IGlkPVwiaGVhbHRoLXN0YXR1cy1jb250YWluZXJcIiBjbGFzcz1cInNjcm9sbC1jb250YWluZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+IExvYWRpbmcgaGVhbHRoIHN0YXR1cy4uLjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFRhYjogSW5jaWRlbnRzIC0tPlxuICAgICAgPGRpdiBpZD1cImhlYWx0aC1pbmNpZGVudHNcIiBjbGFzcz1cInBhbmVsLXNlY3Rpb25cIj5cbiAgICAgICAgPGRpdiBpZD1cImhlYWx0aC1pbmNpZGVudHMtY29udGFpbmVyXCIgY2xhc3M9XCJzY3JvbGwtY29udGFpbmVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHVEODNEXHVERUE4PC9zcGFuPiBMb2FkaW5nIGluY2lkZW50cy4uLjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFRhYjogQ29uZmlndXJlIC0tPlxuICAgICAgPGRpdiBpZD1cImhlYWx0aC1jb25maWdcIiBjbGFzcz1cInBhbmVsLXNlY3Rpb25cIj5cbiAgICAgICAgPGRpdiBpZD1cImhlYWx0aC1jb25maWctY29udGFpbmVyXCIgY2xhc3M9XCJzY3JvbGwtY29udGFpbmVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHUyNjk5XHVGRTBGPC9zcGFuPiBMb2FkaW5nIGNvbmZpZ3VyYXRpb24uLi48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBHbG9iYWwgU2V0dGluZ3M6IHJldGVudGlvbiwgcG9sbGluZyBpbnRlcnZhbHMsIG1heCBlbnRyaWVzLCBkaXNrLXVzYWdlIHRocmVzaG9sZCAtLT5cbiAgICAgICAgPGRpdiBpZD1cImhlYWx0aC1nbG9iYWwtc2V0dGluZ3NcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDE2cHg7IHBhZGRpbmc6IDE2cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cyk7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7XCI+XG4gICAgICAgICAgPGg0IHN0eWxlPVwibWFyZ2luOiAwIDAgNHB4O1wiPlx1RDgzQ1x1REYwRCBHbG9iYWwgU2V0dGluZ3M8L2g0PlxuICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC1tdXRlZC1zbVwiIHN0eWxlPVwibWFyZ2luOiAwIDAgMTJweDtcIj5BcHBsaWVzIHRvIGFsbCBoZWFsdGggY2hlY2tzLiBTZXR0aW5ncyBhcmUgc3RvcmVkIGxvY2FsbHkgaW4gdGhpcyBicm93c2VyLjwvcD5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyOyBnYXA6IDEycHg7XCI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJ0ZXh0LW11dGVkLXNtXCI+SGVhbHRoIENoZWNrIFBvbGxpbmcgSW50ZXJ2YWwgKHNlY29uZHMpPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cImhlYWx0aC1zZXR0aW5nLWludGVydmFsXCIgdmFsdWU9XCI2MFwiIG1pbj1cIjVcIiBtYXg9XCIzNjAwXCIgY2xhc3M9XCJmb3JtLWlucHV0XCIgLz5cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC43MnJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLXRvcDogMnB4O1wiPkhvdyBvZnRlbiBlYWNoIHNlcnZpY2UncyBoZWFsdGggZW5kcG9pbnQgaXMgY2hlY2tlZC48L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwidGV4dC1tdXRlZC1zbVwiPlN0YXRzIFBvbGxpbmcgSW50ZXJ2YWwgKHNlY29uZHMpPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cImhlYWx0aC1zZXR0aW5nLXN0YXRzLWludGVydmFsXCIgdmFsdWU9XCIzMFwiIG1pbj1cIjVcIiBtYXg9XCIzNjAwXCIgY2xhc3M9XCJmb3JtLWlucHV0XCIgLz5cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC43MnJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLXRvcDogMnB4O1wiPkhvdyBvZnRlbiBjb250YWluZXIgc3RhdGlzdGljcyAoQ1BVL21lbW9yeSkgYXJlIHNhbXBsZWQuPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInRleHQtbXV0ZWQtc21cIj5NYXggRW50cmllcyBQZXIgU2VydmljZTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJoZWFsdGgtc2V0dGluZy1tYXgtZW50cmllc1wiIHZhbHVlPVwiNTAwXCIgbWluPVwiMTBcIiBtYXg9XCIxMDAwMDBcIiBjbGFzcz1cImZvcm0taW5wdXRcIiAvPlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjcycmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tdG9wOiAycHg7XCI+Q2FwIG9uIHN0b3JlZCBoaXN0b3J5IHJlY29yZHMgcGVyIHNlcnZpY2UuPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInRleHQtbXV0ZWQtc21cIj5EYXRhIFJldGVudGlvbiAoZGF5cyk8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiaGVhbHRoLXNldHRpbmctcmV0ZW50aW9uXCIgdmFsdWU9XCIzMFwiIG1pbj1cIjFcIiBtYXg9XCIzNjUwXCIgY2xhc3M9XCJmb3JtLWlucHV0XCIgLz5cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC43MnJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLXRvcDogMnB4O1wiPkhlYWx0aCBoaXN0b3J5IG9sZGVyIHRoYW4gdGhpcyBpcyBwcnVuZWQuPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInRleHQtbXV0ZWQtc21cIj5EaXNrLVVzYWdlIFdhcm5pbmcgKCUpPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cImhlYWx0aC1zZXR0aW5nLWRpc2stdGhyZXNob2xkXCIgdmFsdWU9XCI4MFwiIG1pbj1cIjUwXCIgbWF4PVwiOTlcIiBjbGFzcz1cImZvcm0taW5wdXRcIiAvPlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjcycmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tdG9wOiAycHg7XCI+V2FybiB3aGVuIGRpc2sgdXNhZ2UgZXhjZWVkcyB0aGlzIGxldmVsLjwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDEycHg7IGRpc3BsYXk6IGZsZXg7IGdhcDogOHB4OyBhbGlnbi1pdGVtczogY2VudGVyO1wiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImhlYWx0aC1nbG9iYWwtc2F2ZVwiIGNsYXNzPVwiYnRuLWFjY2VudC1zb2xpZFwiPlNhdmUgR2xvYmFsIFNldHRpbmdzPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwiaGVhbHRoLWdsb2JhbC1yZXNldFwiIGNsYXNzPVwiYnRuLXNtXCI+UmVzZXQgdG8gRGVmYXVsdHM8L2J1dHRvbj5cbiAgICAgICAgICAgIDxzcGFuIGlkPVwiaGVhbHRoLWdsb2JhbC1zdGF0dXNcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPjwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBBZGQvRWRpdCBIZWFsdGggQ2hlY2sgRm9ybSAtLT5cbiAgICAgICAgPGRpdiBpZD1cImhlYWx0aC1jb25maWctZm9ybVwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgbWFyZ2luLXRvcDogMTZweDsgcGFkZGluZzogMTZweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzKTsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTtcIj5cbiAgICAgICAgICA8aDQgaWQ9XCJoZWFsdGgtZm9ybS10aXRsZVwiIHN0eWxlPVwibWFyZ2luOiAwIDAgMTJweDtcIj5BZGQgSGVhbHRoIENoZWNrPC9oND5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyOyBnYXA6IDEycHg7XCI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJ0ZXh0LW11dGVkLXNtXCI+U2VydmljZSBJRDwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiaGVhbHRoLWZvcm0taWRcIiBwbGFjZWhvbGRlcj1cImUuZy4gcGxleFwiIGNsYXNzPVwiZm9ybS1pbnB1dFwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInRleHQtbXV0ZWQtc21cIj5EaXNwbGF5IE5hbWU8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImhlYWx0aC1mb3JtLW5hbWVcIiBwbGFjZWhvbGRlcj1cImUuZy4gUGxleCBNZWRpYSBTZXJ2ZXJcIiBjbGFzcz1cImZvcm0taW5wdXRcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZ3JpZC1jb2x1bW46IHNwYW4gMjtcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwidGV4dC1tdXRlZC1zbVwiPlVSTDwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiaGVhbHRoLWZvcm0tdXJsXCIgcGxhY2Vob2xkZXI9XCJodHRwczovL3BsZXguaG9tZVwiIGNsYXNzPVwiZm9ybS1pbnB1dFwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInRleHQtbXV0ZWQtc21cIj5UaW1lb3V0IChtcyk8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiaGVhbHRoLWZvcm0tdGltZW91dFwiIHZhbHVlPVwiMTAwMDBcIiBjbGFzcz1cImZvcm0taW5wdXRcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJ0ZXh0LW11dGVkLXNtXCI+RXhwZWN0ZWQgU3RhdHVzIENvZGVzPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJoZWFsdGgtZm9ybS1jb2Rlc1wiIHZhbHVlPVwiMjAwXCIgcGxhY2Vob2xkZXI9XCIyMDAsIDMwMSwgMzAyXCIgY2xhc3M9XCJmb3JtLWlucHV0XCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwidGV4dC1tdXRlZC1zbVwiPlNMQSBUYXJnZXQgKCUpPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cImhlYWx0aC1mb3JtLXNsYVwiIHZhbHVlPVwiOTkuOVwiIHN0ZXA9XCIwLjFcIiBjbGFzcz1cImZvcm0taW5wdXRcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJ0ZXh0LW11dGVkLXNtXCI+U2xvdyBSZXNwb25zZSBUaHJlc2hvbGQgKG1zKTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJoZWFsdGgtZm9ybS1zbG93XCIgdmFsdWU9XCI1MDAwXCIgY2xhc3M9XCJmb3JtLWlucHV0XCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAxMnB4OyBkaXNwbGF5OiBmbGV4OyBnYXA6IDhweDsganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcIj5cbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJoZWFsdGgtZm9ybS1jYW5jZWxcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJoZWFsdGgtZm9ybS1zYXZlXCIgY2xhc3M9XCJidG4tYWNjZW50LXNvbGlkXCI+U2F2ZTwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMTJweDtcIj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiaGVhbHRoLWFkZC1idG5cIiBjbGFzcz1cImJ0bi1hY2NlbnQtc29saWRcIj4rIEFkZCBIZWFsdGggQ2hlY2s8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWJvdHRvbS1iYXJcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImhlYWx0aC1yZWZyZXNoLWJ0blwiIGNsYXNzPVwiYnRuLXNtXCI+XHVEODNEXHVERDA0IFJlZnJlc2g8L2J1dHRvbj5cbiAgICAgICAgPHNwYW4gaWQ9XCJoZWFsdGgtbGFzdC11cGRhdGVcIiBjbGFzcz1cInRleHQtYXV0by1yaWdodFwiPjwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zIG1vZGFsLWZvb3Rlci1iYXJcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImhlYWx0aC1jYW5jZWxcIj5DbG9zZTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PmApO1xuXG4gIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1tb2RhbCcpO1xuICBjb25zdCBvcGVuQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1jaGVjay1idG4nKTtcbiAgY29uc3QgY2FuY2VsQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1jYW5jZWwnKTtcbiAgY29uc3QgcmVmcmVzaEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtcmVmcmVzaC1idG4nKTtcbiAgY29uc3Qgc3RhdHVzQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1zdGF0dXMtY29udGFpbmVyJyk7XG4gIGNvbnN0IGluY2lkZW50c0NvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtaW5jaWRlbnRzLWNvbnRhaW5lcicpO1xuICBjb25zdCBjb25maWdDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWNvbmZpZy1jb250YWluZXInKTtcbiAgY29uc3QgbGFzdFVwZGF0ZVNwYW4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWxhc3QtdXBkYXRlJyk7XG4gIGNvbnN0IGFkZEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtYWRkLWJ0bicpO1xuICBjb25zdCBmb3JtRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWNvbmZpZy1mb3JtJyk7XG4gIGNvbnN0IGZvcm1UaXRsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtZm9ybS10aXRsZScpO1xuICBjb25zdCBmb3JtQ2FuY2VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1mb3JtLWNhbmNlbCcpO1xuICBjb25zdCBmb3JtU2F2ZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtZm9ybS1zYXZlJyk7XG5cbiAgLy8gLS0tLSBHbG9iYWwgaGVhbHRoIHNldHRpbmdzIChyZXRlbnRpb24sIHBvbGxpbmcgaW50ZXJ2YWxzLCBtYXggZW50cmllcywgZGlzayB0aHJlc2hvbGQpIC0tLS1cbiAgY29uc3QgSEVBTFRIX1NFVFRJTkdTX0tFWSA9ICdkYXNoY2FkZHktaGVhbHRoLXNldHRpbmdzJztcbiAgY29uc3QgSEVBTFRIX0RFRkFVTFRTID0geyByZXRlbnRpb25EYXlzOiAzMCwgcG9sbGluZ0ludGVydmFsOiA2MCwgc3RhdHNQb2xsaW5nSW50ZXJ2YWw6IDMwLCBtYXhFbnRyaWVzUGVyU2VydmljZTogNTAwLCBkaXNrVXNhZ2VUaHJlc2hvbGQ6IDgwIH07XG4gIGNvbnN0IGdsb2JhbFNhdmVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWdsb2JhbC1zYXZlJyk7XG4gIGNvbnN0IGdsb2JhbFJlc2V0QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1nbG9iYWwtcmVzZXQnKTtcbiAgY29uc3QgZ2xvYmFsU3RhdHVzU3BhbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtZ2xvYmFsLXN0YXR1cycpO1xuICBjb25zdCByZXRlbnRpb25JbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtc2V0dGluZy1yZXRlbnRpb24nKTtcbiAgY29uc3QgaW50ZXJ2YWxJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtc2V0dGluZy1pbnRlcnZhbCcpO1xuICBjb25zdCBzdGF0c0ludGVydmFsSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLXNldHRpbmctc3RhdHMtaW50ZXJ2YWwnKTtcbiAgY29uc3QgbWF4RW50cmllc0lucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1zZXR0aW5nLW1heC1lbnRyaWVzJyk7XG4gIGNvbnN0IGRpc2tUaHJlc2hvbGRJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtc2V0dGluZy1kaXNrLXRocmVzaG9sZCcpO1xuXG4gIGZ1bmN0aW9uIGxvYWRIZWFsdGhTZXR0aW5ncygpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmF3ID0gc2FmZUdldChIRUFMVEhfU0VUVElOR1NfS0VZKTtcbiAgICAgIGNvbnN0IHNhdmVkID0gcmF3ID8gSlNPTi5wYXJzZShyYXcpIDoge307XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgSEVBTFRIX0RFRkFVTFRTLCBzYXZlZCk7XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIEhFQUxUSF9ERUZBVUxUUyk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gYXBwbHlIZWFsdGhTZXR0aW5nc1RvVUkoKSB7XG4gICAgY29uc3QgcyA9IGxvYWRIZWFsdGhTZXR0aW5ncygpO1xuICAgIGlmIChyZXRlbnRpb25JbnB1dCkgcmV0ZW50aW9uSW5wdXQudmFsdWUgPSBzLnJldGVudGlvbkRheXM7XG4gICAgaWYgKGludGVydmFsSW5wdXQpIGludGVydmFsSW5wdXQudmFsdWUgPSBzLnBvbGxpbmdJbnRlcnZhbDtcbiAgICBpZiAoc3RhdHNJbnRlcnZhbElucHV0KSBzdGF0c0ludGVydmFsSW5wdXQudmFsdWUgPSBzLnN0YXRzUG9sbGluZ0ludGVydmFsO1xuICAgIGlmIChtYXhFbnRyaWVzSW5wdXQpIG1heEVudHJpZXNJbnB1dC52YWx1ZSA9IHMubWF4RW50cmllc1BlclNlcnZpY2U7XG4gICAgaWYgKGRpc2tUaHJlc2hvbGRJbnB1dCkgZGlza1RocmVzaG9sZElucHV0LnZhbHVlID0gcy5kaXNrVXNhZ2VUaHJlc2hvbGQ7XG4gIH1cblxuICBmdW5jdGlvbiBzYXZlSGVhbHRoU2V0dGluZ3MoKSB7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSB7XG4gICAgICByZXRlbnRpb25EYXlzOiBNYXRoLm1heCgxLCBNYXRoLm1pbigzNjUwLCBwYXJzZUludChyZXRlbnRpb25JbnB1dD8udmFsdWUpIHx8IEhFQUxUSF9ERUZBVUxUUy5yZXRlbnRpb25EYXlzKSksXG4gICAgICBwb2xsaW5nSW50ZXJ2YWw6IE1hdGgubWF4KDUsIE1hdGgubWluKDM2MDAsIHBhcnNlSW50KGludGVydmFsSW5wdXQ/LnZhbHVlKSB8fCBIRUFMVEhfREVGQVVMVFMucG9sbGluZ0ludGVydmFsKSksXG4gICAgICBzdGF0c1BvbGxpbmdJbnRlcnZhbDogTWF0aC5tYXgoNSwgTWF0aC5taW4oMzYwMCwgcGFyc2VJbnQoc3RhdHNJbnRlcnZhbElucHV0Py52YWx1ZSkgfHwgSEVBTFRIX0RFRkFVTFRTLnN0YXRzUG9sbGluZ0ludGVydmFsKSksXG4gICAgICBtYXhFbnRyaWVzUGVyU2VydmljZTogTWF0aC5tYXgoMTAsIE1hdGgubWluKDEwMDAwMCwgcGFyc2VJbnQobWF4RW50cmllc0lucHV0Py52YWx1ZSkgfHwgSEVBTFRIX0RFRkFVTFRTLm1heEVudHJpZXNQZXJTZXJ2aWNlKSksXG4gICAgICBkaXNrVXNhZ2VUaHJlc2hvbGQ6IE1hdGgubWF4KDUwLCBNYXRoLm1pbig5OSwgcGFyc2VJbnQoZGlza1RocmVzaG9sZElucHV0Py52YWx1ZSkgfHwgSEVBTFRIX0RFRkFVTFRTLmRpc2tVc2FnZVRocmVzaG9sZCkpXG4gICAgfTtcbiAgICB0cnkge1xuICAgICAgc2FmZVNldChIRUFMVEhfU0VUVElOR1NfS0VZLCBKU09OLnN0cmluZ2lmeShzZXR0aW5ncykpO1xuICAgICAgYXBwbHlIZWFsdGhTZXR0aW5nc1RvVUkoKTtcbiAgICAgIGlmIChnbG9iYWxTdGF0dXNTcGFuKSB7XG4gICAgICAgIGdsb2JhbFN0YXR1c1NwYW4udGV4dENvbnRlbnQgPSAnU2F2ZWQgXHUyNzEzJztcbiAgICAgICAgZ2xvYmFsU3RhdHVzU3Bhbi5zdHlsZS5jb2xvciA9ICd2YXIoLS1vay1mZyknO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgaWYgKGdsb2JhbFN0YXR1c1NwYW4pIGdsb2JhbFN0YXR1c1NwYW4udGV4dENvbnRlbnQgPSAnJzsgfSwgMjUwMCk7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHNob3dOb3RpZmljYXRpb24gPT09ICdmdW5jdGlvbicpIHNob3dOb3RpZmljYXRpb24oJ0dsb2JhbCBoZWFsdGggc2V0dGluZ3Mgc2F2ZWQnLCAnc3VjY2VzcycpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChnbG9iYWxTdGF0dXNTcGFuKSB7IGdsb2JhbFN0YXR1c1NwYW4udGV4dENvbnRlbnQgPSAnU2F2ZSBmYWlsZWQnOyBnbG9iYWxTdGF0dXNTcGFuLnN0eWxlLmNvbG9yID0gJ3ZhcigtLWJhZC1mZyknOyB9XG4gICAgICBpZiAodHlwZW9mIHNob3dOb3RpZmljYXRpb24gPT09ICdmdW5jdGlvbicpIHNob3dOb3RpZmljYXRpb24oJ0ZhaWxlZCB0byBzYXZlIHNldHRpbmdzOiAnICsgZS5tZXNzYWdlLCAnZXJyb3InKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZXNldEhlYWx0aFNldHRpbmdzKCkge1xuICAgIHRyeSB7XG4gICAgICBzYWZlU2V0KEhFQUxUSF9TRVRUSU5HU19LRVksIEpTT04uc3RyaW5naWZ5KEhFQUxUSF9ERUZBVUxUUykpO1xuICAgIH0gY2F0Y2ggKF8pIHsgLyogaWdub3JlICovIH1cbiAgICBhcHBseUhlYWx0aFNldHRpbmdzVG9VSSgpO1xuICAgIGlmIChnbG9iYWxTdGF0dXNTcGFuKSB7XG4gICAgICBnbG9iYWxTdGF0dXNTcGFuLnRleHRDb250ZW50ID0gJ1Jlc2V0IHRvIGRlZmF1bHRzIFx1MjcxMyc7XG4gICAgICBnbG9iYWxTdGF0dXNTcGFuLnN0eWxlLmNvbG9yID0gJ3ZhcigtLW9rLWZnKSc7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHsgaWYgKGdsb2JhbFN0YXR1c1NwYW4pIGdsb2JhbFN0YXR1c1NwYW4udGV4dENvbnRlbnQgPSAnJzsgfSwgMjUwMCk7XG4gICAgfVxuICB9XG5cbiAgYXBwbHlIZWFsdGhTZXR0aW5nc1RvVUkoKTtcbiAgZ2xvYmFsU2F2ZUJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBzYXZlSGVhbHRoU2V0dGluZ3MpO1xuICBnbG9iYWxSZXNldEJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCByZXNldEhlYWx0aFNldHRpbmdzKTtcbiAgLy8gLS0tLSBFbmQgZ2xvYmFsIGhlYWx0aCBzZXR0aW5ncyAtLS0tXG5cbiAgbGV0IGVkaXRpbmdJZCA9IG51bGw7XG5cbiAgZnVuY3Rpb24gdXB0aW1lQ29sb3IocGN0KSB7XG4gICAgaWYgKHBjdCA+PSA5OS45KSByZXR1cm4gJ3ZhcigtLW9rLWZnKSc7XG4gICAgaWYgKHBjdCA+PSA5NSkgcmV0dXJuICcjZjM5YzEyJztcbiAgICByZXR1cm4gJ3ZhcigtLWJhZC1mZyknO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V2ZXJpdHlCYWRnZShzZXYpIHtcbiAgICBjb25zdCBjb2xvcnMgPSB7IGNyaXRpY2FsOiAndmFyKC0tYmFkLWZnKScsIGhpZ2g6ICcjZmY2YjZiJywgbWVkaXVtOiAnI2YzOWMxMicsIGxvdzogJ3ZhcigtLW11dGVkKScgfTtcbiAgICByZXR1cm4gYDxzcGFuIHN0eWxlPVwicGFkZGluZzogMnB4IDhweDsgYm9yZGVyLXJhZGl1czogNHB4OyBmb250LXNpemU6IDAuNzVyZW07IGJhY2tncm91bmQ6ICR7Y29sb3JzW3Nldl0gfHwgJ3ZhcigtLW11dGVkKSd9MjA7IGNvbG9yOiAke2NvbG9yc1tzZXZdIHx8ICd2YXIoLS1tdXRlZCknfTtcIj4ke3Nldn08L3NwYW4+YDtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRTdGF0dXMoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2hlYWx0aC1jaGVja3Mvc3RhdHVzJyk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmICghZGF0YS5zdWNjZXNzIHx8ICFkYXRhLnN0YXR1cyB8fCBPYmplY3Qua2V5cyhkYXRhLnN0YXR1cykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHN0YXR1c0NvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHVEODNDXHVERkU1PC9zcGFuPk5vIGhlYWx0aCBjaGVja3MgY29uZmlndXJlZC4gR28gdG8gdGhlIENvbmZpZ3VyZSB0YWIgdG8gYWRkIHNlcnZpY2VzLjwvZGl2Pic7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNlcnZpY2VzID0gT2JqZWN0LnZhbHVlcyhkYXRhLnN0YXR1cyk7XG4gICAgICBsZXQgaHRtbCA9ICc8dGFibGUgc3R5bGU9XCJ3aWR0aDogMTAwJTsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgZm9udC1zaXplOiAwLjg1cmVtO1wiPic7XG4gICAgICBodG1sICs9ICc8dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgY29sb3I6IHZhcigtLW11dGVkKTsgdGV4dC1hbGlnbjogbGVmdDtcIj4nO1xuICAgICAgaHRtbCArPSAnPHRoIHN0eWxlPVwicGFkZGluZzogOHB4O1wiPlNlcnZpY2U8L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDhweDtcIj5TdGF0dXM8L3RoPic7XG4gICAgICBodG1sICs9ICc8dGggc3R5bGU9XCJwYWRkaW5nOiA4cHg7XCI+VXB0aW1lIDI0aDwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogOHB4O1wiPlVwdGltZSA3ZDwvdGg+JztcbiAgICAgIGh0bWwgKz0gJzx0aCBzdHlsZT1cInBhZGRpbmc6IDhweDtcIj5BdmcgUmVzcG9uc2U8L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDhweDtcIj5MYXN0IENoZWNrPC90aD48L3RyPic7XG4gICAgICBmb3IgKGNvbnN0IHMgb2Ygc2VydmljZXMpIHtcbiAgICAgICAgY29uc3QgaXNVcCA9IHMuc3RhdHVzID09PSAndXAnO1xuICAgICAgICBjb25zdCBkb3RDb2xvciA9IGlzVXAgPyAndmFyKC0tZG90LW9rKScgOiAndmFyKC0tZG90LWJhZCknO1xuICAgICAgICBjb25zdCB1MjQgPSBzLnVwdGltZT8uWycyNGgnXSA/PyAnLSc7XG4gICAgICAgIGNvbnN0IHU3ZCA9IHMudXB0aW1lPy5bJzdkJ10gPz8gJy0nO1xuICAgICAgICBjb25zdCBhdmdSdCA9IHMuYXZnUmVzcG9uc2VUaW1lICE9IG51bGwgPyBNYXRoLnJvdW5kKHMuYXZnUmVzcG9uc2VUaW1lKSArICdtcycgOiAnLSc7XG4gICAgICAgIGNvbnN0IGxhc3RDaGVjayA9IHMudGltZXN0YW1wID8gdGltZUFnbyhzLnRpbWVzdGFtcCkgOiAnLSc7XG4gICAgICAgIGh0bWwgKz0gYDx0ciBzdHlsZT1cImJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBjdXJzb3I6IHBvaW50ZXI7XCIgZGF0YS1oZWFsdGgtaWQ9XCIke2VzY2FwZUh0bWwocy5zZXJ2aWNlSWQpfVwiPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDhweDsgZm9udC13ZWlnaHQ6IDUwMDtcIj4ke2VzY2FwZUh0bWwocy5uYW1lIHx8IHMuc2VydmljZUlkKX08L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDhweDtcIj48c3BhbiBzdHlsZT1cImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2lkdGg6IDhweDsgaGVpZ2h0OiA4cHg7IGJvcmRlci1yYWRpdXM6IDUwJTsgYmFja2dyb3VuZDogJHtkb3RDb2xvcn07IG1hcmdpbi1yaWdodDogNnB4O1wiPjwvc3Bhbj4ke2lzVXAgPyAnVXAnIDogJ0Rvd24nfTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogOHB4OyBjb2xvcjogJHt0eXBlb2YgdTI0ID09PSAnbnVtYmVyJyA/IHVwdGltZUNvbG9yKHUyNCkgOiAndmFyKC0tbXV0ZWQpJ307XCI+JHt0eXBlb2YgdTI0ID09PSAnbnVtYmVyJyA/IHUyNC50b0ZpeGVkKDEpICsgJyUnIDogdTI0fTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogOHB4OyBjb2xvcjogJHt0eXBlb2YgdTdkID09PSAnbnVtYmVyJyA/IHVwdGltZUNvbG9yKHU3ZCkgOiAndmFyKC0tbXV0ZWQpJ307XCI+JHt0eXBlb2YgdTdkID09PSAnbnVtYmVyJyA/IHU3ZC50b0ZpeGVkKDEpICsgJyUnIDogdTdkfTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogOHB4O1wiPiR7YXZnUnR9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA4cHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+JHtsYXN0Q2hlY2t9PC90ZD5gO1xuICAgICAgICBodG1sICs9ICc8L3RyPic7XG4gICAgICAgIGh0bWwgKz0gYDx0ciBpZD1cImhlYWx0aC1kZXRhaWwtJHtlc2NhcGVIdG1sKHMuc2VydmljZUlkKX1cIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+PHRkIGNvbHNwYW49XCI2XCIgc3R5bGU9XCJwYWRkaW5nOiAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPjxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiYnJhbmQtc3Bpbm5lclwiPjwvc3Bhbj4gTG9hZGluZyBkZXRhaWxzLi4uPC9kaXY+PC90ZD48L3RyPmA7XG4gICAgICB9XG4gICAgICBodG1sICs9ICc8L3RhYmxlPic7XG4gICAgICBzdGF0dXNDb250YWluZXIuaW5uZXJIVE1MID0gaHRtbDtcbiAgICAgIGxhc3RVcGRhdGVTcGFuLnRleHRDb250ZW50ID0gJ1VwZGF0ZWQgJyArIG5ldyBEYXRlKCkudG9Mb2NhbGVUaW1lU3RyaW5nKCk7XG5cbiAgICAgIC8vIFJvdyBjbGljayB0byBleHBhbmQgZGV0YWlsc1xuICAgICAgc3RhdHVzQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJ3RyW2RhdGEtaGVhbHRoLWlkXScpLmZvckVhY2gocm93ID0+IHtcbiAgICAgICAgcm93LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGlkID0gcm93LmRhdGFzZXQuaGVhbHRoSWQ7XG4gICAgICAgICAgY29uc3QgZGV0YWlsUm93ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1kZXRhaWwtJyArIGlkKTtcbiAgICAgICAgICBpZiAoIWRldGFpbFJvdykgcmV0dXJuO1xuICAgICAgICAgIGlmIChkZXRhaWxSb3cuc3R5bGUuZGlzcGxheSAhPT0gJ25vbmUnKSB7XG4gICAgICAgICAgICBkZXRhaWxSb3cuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGV0YWlsUm93LnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgciA9IGF3YWl0IGZldGNoKGAvYXBpL3YxL2hlYWx0aC1jaGVja3MvJHtpZH0vc3RhdHM/aG91cnM9MjRgKTtcbiAgICAgICAgICAgIGNvbnN0IGQgPSBhd2FpdCByLmpzb24oKTtcbiAgICAgICAgICAgIGlmIChkLnN1Y2Nlc3MgJiYgZC5zdGF0cykge1xuICAgICAgICAgICAgICBjb25zdCBzdCA9IGQuc3RhdHM7XG4gICAgICAgICAgICAgIGNvbnN0IHJ0ID0gc3QucmVzcG9uc2VUaW1lIHx8IHt9O1xuICAgICAgICAgICAgICBkZXRhaWxSb3cucXVlcnlTZWxlY3RvcigndGQnKS5pbm5lckhUTUwgPSBgXG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDQsIDFmcik7IGdhcDogMTJweDsgZm9udC1zaXplOiAwLjgycmVtO1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdj48c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+VG90YWwgQ2hlY2tzPC9zcGFuPjxicj48c3Ryb25nPiR7c3QudG90YWxDaGVja3MgfHwgMH08L3N0cm9uZz48L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXY+PHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPlVwdGltZTwvc3Bhbj48YnI+PHN0cm9uZyBzdHlsZT1cImNvbG9yOiAke3VwdGltZUNvbG9yKHN0LnVwdGltZSB8fCAwKX07XCI+JHsoc3QudXB0aW1lIHx8IDApLnRvRml4ZWQoMil9JTwvc3Ryb25nPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdj48c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+QXZnIFJlc3BvbnNlPC9zcGFuPjxicj48c3Ryb25nPiR7TWF0aC5yb3VuZChydC5hdmcgfHwgMCl9bXM8L3N0cm9uZz48L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXY+PHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPlA5NSAvIFA5OTwvc3Bhbj48YnI+PHN0cm9uZz4ke01hdGgucm91bmQocnQucDk1IHx8IDApfW1zIC8gJHtNYXRoLnJvdW5kKHJ0LnA5OSB8fCAwKX1tczwvc3Ryb25nPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdj48c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+TWluIFJlc3BvbnNlPC9zcGFuPjxicj48c3Ryb25nPiR7TWF0aC5yb3VuZChydC5taW4gfHwgMCl9bXM8L3N0cm9uZz48L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXY+PHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPk1heCBSZXNwb25zZTwvc3Bhbj48YnI+PHN0cm9uZz4ke01hdGgucm91bmQocnQubWF4IHx8IDApfW1zPC9zdHJvbmc+PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2PjxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj5VcCBDaGVja3M8L3NwYW4+PGJyPjxzdHJvbmcgc3R5bGU9XCJjb2xvcjogdmFyKC0tb2stZmcpO1wiPiR7c3QudXBDaGVja3MgfHwgMH08L3N0cm9uZz48L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXY+PHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPkRvd24gQ2hlY2tzPC9zcGFuPjxicj48c3Ryb25nIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+JHtzdC5kb3duQ2hlY2tzIHx8IDB9PC9zdHJvbmc+PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+YDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGRldGFpbFJvdy5xdWVyeVNlbGVjdG9yKCd0ZCcpLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj5ObyBkZXRhaWxlZCBzdGF0cyBhdmFpbGFibGUgZm9yIHRoaXMgcGVyaW9kLjwvZGl2Pic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgZGV0YWlsUm93LnF1ZXJ5U2VsZWN0b3IoJ3RkJykuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RmFpbGVkOiAke2VzY2FwZUh0bWwoZS5tZXNzYWdlKX08L2Rpdj5gO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzdGF0dXNDb250YWluZXIuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RmFpbGVkIHRvIGxvYWQgaGVhbHRoIHN0YXR1czogJHtlc2NhcGVIdG1sKGUubWVzc2FnZSl9PC9kaXY+YDtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBsb2FkSW5jaWRlbnRzKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBbb3BlblJlcywgaGlzdFJlc10gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIGZldGNoKCcvYXBpL3YxL2hlYWx0aC1jaGVja3MvaW5jaWRlbnRzJyksXG4gICAgICAgIGZldGNoKCcvYXBpL3YxL2hlYWx0aC1jaGVja3MvaW5jaWRlbnRzL2hpc3Rvcnk/bGltaXQ9NTAnKVxuICAgICAgXSk7XG4gICAgICBjb25zdCBvcGVuRGF0YSA9IGF3YWl0IG9wZW5SZXMuanNvbigpO1xuICAgICAgY29uc3QgaGlzdERhdGEgPSBhd2FpdCBoaXN0UmVzLmpzb24oKTtcbiAgICAgIGxldCBodG1sID0gJyc7XG5cbiAgICAgIC8vIE9wZW4gaW5jaWRlbnRzXG4gICAgICBjb25zdCBvcGVuID0gKG9wZW5EYXRhLnN1Y2Nlc3MgJiYgb3BlbkRhdGEuaW5jaWRlbnRzKSA/IG9wZW5EYXRhLmluY2lkZW50cyA6IFtdO1xuICAgICAgaWYgKG9wZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICBodG1sICs9ICc8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMTZweDtcIj48aDQgc3R5bGU9XCJjb2xvcjogdmFyKC0tYmFkLWZnKTsgbWFyZ2luOiAwIDAgOHB4O1wiPk9wZW4gSW5jaWRlbnRzICgnICsgb3Blbi5sZW5ndGggKyAnKTwvaDQ+JztcbiAgICAgICAgZm9yIChjb25zdCBpbmMgb2Ygb3Blbikge1xuICAgICAgICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAxMHB4IDEycHg7IG1hcmdpbi1ib3R0b206IDhweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYmFkLWZnKTMwOyBib3JkZXItcmFkaXVzOiA4cHg7IGJhY2tncm91bmQ6IHZhcigtLWJhZC1iZyk7XCI+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOyBhbGlnbi1pdGVtczogY2VudGVyO1wiPlxuICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtd2VpZ2h0OiA1MDA7XCI+JHtlc2NhcGVIdG1sKGluYy5zZXJ2aWNlSWQpfTwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4+JHtzZXZlcml0eUJhZGdlKGluYy5zZXZlcml0eSl9PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjgycmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tdG9wOiA0cHg7XCI+JHtlc2NhcGVIdG1sKGluYy5tZXNzYWdlKX08L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi10b3A6IDRweDtcIj5TdGFydGVkICR7dGltZUFnbyhpbmMuY3JlYXRlZEF0KX0gXHUwMEI3ICR7aW5jLm9jY3VycmVuY2VzIHx8IDF9IG9jY3VycmVuY2Uocyk8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5gO1xuICAgICAgICB9XG4gICAgICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBodG1sICs9ICc8ZGl2IHN0eWxlPVwicGFkZGluZzogMTJweDsgbWFyZ2luLWJvdHRvbTogMTZweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tb2stZmcpMzA7IGJvcmRlci1yYWRpdXM6IDhweDsgYmFja2dyb3VuZDogdmFyKC0tb2stYmcpOyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiB2YXIoLS1vay1mZyk7IGZvbnQtc2l6ZTogMC45cmVtO1wiPkFsbCBzZXJ2aWNlcyBvcGVyYXRpb25hbCBcdTIwMTQgbm8gb3BlbiBpbmNpZGVudHM8L2Rpdj4nO1xuICAgICAgfVxuXG4gICAgICAvLyBJbmNpZGVudCBoaXN0b3J5XG4gICAgICBjb25zdCBoaXN0b3J5ID0gKGhpc3REYXRhLnN1Y2Nlc3MgJiYgaGlzdERhdGEuaGlzdG9yeSkgPyBoaXN0RGF0YS5oaXN0b3J5IDogW107XG4gICAgICBpZiAoaGlzdG9yeS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGh0bWwgKz0gJzxoNCBzdHlsZT1cIm1hcmdpbjogMCAwIDhweDsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5JbmNpZGVudCBIaXN0b3J5PC9oND4nO1xuICAgICAgICBodG1sICs9ICc8dGFibGUgc3R5bGU9XCJ3aWR0aDogMTAwJTsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgZm9udC1zaXplOiAwLjgycmVtO1wiPic7XG4gICAgICAgIGh0bWwgKz0gJzx0ciBzdHlsZT1cImJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPjx0aCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5TZXJ2aWNlPC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+VHlwZTwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPlNldmVyaXR5PC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+U3RhdHVzPC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+RHVyYXRpb248L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5XaGVuPC90aD48L3RyPic7XG4gICAgICAgIGZvciAoY29uc3QgaW5jIG9mIGhpc3RvcnkpIHtcbiAgICAgICAgICBjb25zdCByZXNvbHZlZCA9IGluYy5zdGF0dXMgPT09ICdyZXNvbHZlZCc7XG4gICAgICAgICAgY29uc3QgZHVyID0gcmVzb2x2ZWQgJiYgaW5jLmR1cmF0aW9uID8gKGluYy5kdXJhdGlvbiA8IDYwMDAwID8gTWF0aC5yb3VuZChpbmMuZHVyYXRpb24gLyAxMDAwKSArICdzJyA6IE1hdGgucm91bmQoaW5jLmR1cmF0aW9uIC8gNjAwMDApICsgJ20nKSA6ICctJztcbiAgICAgICAgICBodG1sICs9IGA8dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5gO1xuICAgICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweDtcIj4ke2VzY2FwZUh0bWwoaW5jLnNlcnZpY2VJZCl9PC90ZD5gO1xuICAgICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweDtcIj4ke2VzY2FwZUh0bWwoaW5jLnR5cGUpfTwvdGQ+YDtcbiAgICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7XCI+JHtzZXZlcml0eUJhZGdlKGluYy5zZXZlcml0eSl9PC90ZD5gO1xuICAgICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweDtcIj48c3BhbiBzdHlsZT1cImNvbG9yOiAke3Jlc29sdmVkID8gJ3ZhcigtLW9rLWZnKScgOiAndmFyKC0tYmFkLWZnKSd9O1wiPiR7aW5jLnN0YXR1c308L3NwYW4+PC90ZD5gO1xuICAgICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweDtcIj4ke2R1cn08L3RkPmA7XG4gICAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPiR7dGltZUFnbyhpbmMuY3JlYXRlZEF0KX08L3RkPmA7XG4gICAgICAgICAgaHRtbCArPSAnPC90cj4nO1xuICAgICAgICB9XG4gICAgICAgIGh0bWwgKz0gJzwvdGFibGU+JztcbiAgICAgIH1cblxuICAgICAgaW5jaWRlbnRzQ29udGFpbmVyLmlubmVySFRNTCA9IGh0bWwgfHwgJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1RDgzRFx1REVBODwvc3Bhbj5ObyBpbmNpZGVudHMgcmVjb3JkZWQgeWV0LjwvZGl2Pic7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaW5jaWRlbnRzQ29udGFpbmVyLmlubmVySFRNTCA9IGA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPkZhaWxlZDogJHtlc2NhcGVIdG1sKGUubWVzc2FnZSl9PC9kaXY+YDtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBsb2FkQ29uZmlnKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9oZWFsdGgtY2hlY2tzL3N0YXR1cycpO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBjb25zdCBzZXJ2aWNlcyA9IGRhdGEuc3VjY2VzcyAmJiBkYXRhLnN0YXR1cyA/IE9iamVjdC52YWx1ZXMoZGF0YS5zdGF0dXMpIDogW107XG4gICAgICBpZiAoc2VydmljZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGNvbmZpZ0NvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHUyNjk5XHVGRTBGPC9zcGFuPk5vIGhlYWx0aCBjaGVja3MgY29uZmlndXJlZCB5ZXQuIENsaWNrIFwiQWRkIEhlYWx0aCBDaGVja1wiIGJlbG93LjwvZGl2Pic7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxldCBodG1sID0gJzx0YWJsZSBzdHlsZT1cIndpZHRoOiAxMDAlOyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyBmb250LXNpemU6IDAuODVyZW07XCI+JztcbiAgICAgIGh0bWwgKz0gJzx0ciBzdHlsZT1cImJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPjx0aCBzdHlsZT1cInBhZGRpbmc6IDhweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5TZXJ2aWNlPC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA4cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+U3RhdHVzPC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA4cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+U0xBIFRhcmdldDwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogOHB4OyB0ZXh0LWFsaWduOiByaWdodDtcIj5BY3Rpb25zPC90aD48L3RyPic7XG4gICAgICBmb3IgKGNvbnN0IHMgb2Ygc2VydmljZXMpIHtcbiAgICAgICAgY29uc3QgaXNVcCA9IHMuc3RhdHVzID09PSAndXAnO1xuICAgICAgICBodG1sICs9IGA8dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA4cHg7IGZvbnQtd2VpZ2h0OiA1MDA7XCI+JHtlc2NhcGVIdG1sKHMubmFtZSB8fCBzLnNlcnZpY2VJZCl9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA4cHg7IGNvbG9yOiAke2lzVXAgPyAndmFyKC0tb2stZmcpJyA6ICd2YXIoLS1iYWQtZmcpJ307XCI+JHtpc1VwID8gJ1VwJyA6ICdEb3duJ308L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDhweDtcIj4ke3Muc2xhPy50YXJnZXQgPyBzLnNsYS50YXJnZXQgKyAnJScgOiAnLSd9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA4cHg7IHRleHQtYWxpZ246IHJpZ2h0O1wiPmA7XG4gICAgICAgIGh0bWwgKz0gYDxidXR0b24gb25jbGljaz1cImRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdoZWFsdGgtZWRpdCcsIHtkZXRhaWw6JyR7ZXNjYXBlSHRtbChzLnNlcnZpY2VJZCl9J30pKVwiIHN0eWxlPVwicGFkZGluZzogNHB4IDEwcHg7IGZvbnQtc2l6ZTogMC43OHJlbTsgbWFyZ2luLXJpZ2h0OiA0cHg7XCI+RWRpdDwvYnV0dG9uPmA7XG4gICAgICAgIGh0bWwgKz0gYDxidXR0b24gb25jbGljaz1cImRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdoZWFsdGgtZGVsZXRlJywge2RldGFpbDonJHtlc2NhcGVIdG1sKHMuc2VydmljZUlkKX0nfSkpXCIgc3R5bGU9XCJwYWRkaW5nOiA0cHggMTBweDsgZm9udC1zaXplOiAwLjc4cmVtOyBjb2xvcjogdmFyKC0tYmFkLWZnKTsgYm9yZGVyLWNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPkRlbGV0ZTwvYnV0dG9uPmA7XG4gICAgICAgIGh0bWwgKz0gJzwvdGQ+PC90cj4nO1xuICAgICAgfVxuICAgICAgaHRtbCArPSAnPC90YWJsZT4nO1xuICAgICAgY29uZmlnQ29udGFpbmVyLmlubmVySFRNTCA9IGh0bWw7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uZmlnQ29udGFpbmVyLmlubmVySFRNTCA9IGA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPkZhaWxlZDogJHtlc2NhcGVIdG1sKGUubWVzc2FnZSl9PC9kaXY+YDtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzaG93Rm9ybShpZCwgbmFtZSwgdXJsLCB0aW1lb3V0LCBjb2Rlcywgc2xhLCBzbG93KSB7XG4gICAgZWRpdGluZ0lkID0gaWQgfHwgbnVsbDtcbiAgICBmb3JtVGl0bGUudGV4dENvbnRlbnQgPSBpZCA/ICdFZGl0IEhlYWx0aCBDaGVjaycgOiAnQWRkIEhlYWx0aCBDaGVjayc7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1mb3JtLWlkJykudmFsdWUgPSBpZCB8fCAnJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWZvcm0taWQnKS5kaXNhYmxlZCA9ICEhaWQ7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1mb3JtLW5hbWUnKS52YWx1ZSA9IG5hbWUgfHwgJyc7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1mb3JtLXVybCcpLnZhbHVlID0gdXJsIHx8ICcnO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtZm9ybS10aW1lb3V0JykudmFsdWUgPSB0aW1lb3V0IHx8IDEwMDAwO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtZm9ybS1jb2RlcycpLnZhbHVlID0gY29kZXMgfHwgJzIwMCc7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1mb3JtLXNsYScpLnZhbHVlID0gc2xhIHx8IDk5Ljk7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1mb3JtLXNsb3cnKS52YWx1ZSA9IHNsb3cgfHwgNTAwMDtcbiAgICBmb3JtRWwuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgIGFkZEJ0bi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICB9XG5cbiAgZnVuY3Rpb24gaGlkZUZvcm0oKSB7XG4gICAgZm9ybUVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgYWRkQnRuLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICBlZGl0aW5nSWQgPSBudWxsO1xuICB9XG5cbiAgYWRkQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHNob3dGb3JtKCcnLCAnJywgJycsIDEwMDAwLCAnMjAwJywgOTkuOSwgNTAwMCkpO1xuICBmb3JtQ2FuY2VsPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGhpZGVGb3JtKTtcblxuICBmb3JtU2F2ZT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgaWQgPSBlZGl0aW5nSWQgfHwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1mb3JtLWlkJykudmFsdWUudHJpbSgpO1xuICAgIGlmICghaWQpIHJldHVybiBzaG93Tm90aWZpY2F0aW9uKCdTZXJ2aWNlIElEIGlzIHJlcXVpcmVkJywgJ3dhcm5pbmcnKTtcbiAgICBjb25zdCB1cmwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWZvcm0tdXJsJykudmFsdWUudHJpbSgpO1xuICAgIGlmICghdXJsKSByZXR1cm4gc2hvd05vdGlmaWNhdGlvbignVVJMIGlzIHJlcXVpcmVkJywgJ3dhcm5pbmcnKTtcblxuICAgIGNvbnN0IGNvZGVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1mb3JtLWNvZGVzJykudmFsdWUuc3BsaXQoJywnKS5tYXAoYyA9PiBwYXJzZUludChjLnRyaW0oKSkpLmZpbHRlcihCb29sZWFuKTtcbiAgICBjb25zdCBib2R5ID0ge1xuICAgICAgbmFtZTogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1mb3JtLW5hbWUnKS52YWx1ZS50cmltKCkgfHwgaWQsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWZvcm0tdGltZW91dCcpLnZhbHVlKSB8fCAxMDAwMCxcbiAgICAgIGV4cGVjdGVkU3RhdHVzQ29kZXM6IGNvZGVzLmxlbmd0aCA/IGNvZGVzIDogWzIwMF0sXG4gICAgICBzbGE6IHsgdGFyZ2V0OiBwYXJzZUZsb2F0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtZm9ybS1zbGEnKS52YWx1ZSkgfHwgOTkuOSB9LFxuICAgICAgc2xvd1Jlc3BvbnNlVGhyZXNob2xkOiBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWZvcm0tc2xvdycpLnZhbHVlKSB8fCA1MDAwXG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICBmb3JtU2F2ZS50ZXh0Q29udGVudCA9ICdTYXZpbmcuLi4nO1xuICAgICAgZm9ybVNhdmUuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgc2VjdXJlRmV0Y2goYC9hcGkvdjEvaGVhbHRoLWNoZWNrcy8ke2VuY29kZVVSSUNvbXBvbmVudChpZCl9L2NvbmZpZ3VyZWAsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KVxuICAgICAgfSk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmICghZGF0YS5zdWNjZXNzKSB0aHJvdyBuZXcgRXJyb3IoZGF0YS5lcnJvciB8fCAnU2F2ZSBmYWlsZWQnKTtcbiAgICAgIGhpZGVGb3JtKCk7XG4gICAgICBsb2FkQ29uZmlnKCk7XG4gICAgICBsb2FkU3RhdHVzKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignRXJyb3I6ICcgKyBlLm1lc3NhZ2UsICdlcnJvcicpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBmb3JtU2F2ZS50ZXh0Q29udGVudCA9ICdTYXZlJztcbiAgICAgIGZvcm1TYXZlLmRpc2FibGVkID0gZmFsc2U7XG4gICAgfVxuICB9KTtcblxuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdoZWFsdGgtZWRpdCcsIGFzeW5jIChlKSA9PiB7XG4gICAgY29uc3QgaWQgPSBlLmRldGFpbDtcbiAgICAvLyBMb2FkIGV4aXN0aW5nIGNvbmZpZyB0byBwb3B1bGF0ZSBmb3JtIFx1MjAxNCB1c2UgY3VycmVudCBzdGF0dXMgZGF0YSBhcyBmYWxsYmFja1xuICAgIHNob3dGb3JtKGlkLCAnJywgJycsIDEwMDAwLCAnMjAwJywgOTkuOSwgNTAwMCk7XG4gIH0pO1xuXG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2hlYWx0aC1kZWxldGUnLCBhc3luYyAoZSkgPT4ge1xuICAgIGNvbnN0IGlkID0gZS5kZXRhaWw7XG4gICAgaWYgKCFjb25maXJtKGBEZWxldGUgaGVhbHRoIGNoZWNrIGZvciBcIiR7aWR9XCI/YCkpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgc2VjdXJlRmV0Y2goYC9hcGkvdjEvaGVhbHRoLWNoZWNrcy8ke2VuY29kZVVSSUNvbXBvbmVudChpZCl9L2NvbmZpZ3VyZWAsIHsgbWV0aG9kOiAnREVMRVRFJyB9KTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKCFkYXRhLnN1Y2Nlc3MpIHRocm93IG5ldyBFcnJvcihkYXRhLmVycm9yKTtcbiAgICAgIGxvYWRDb25maWcoKTtcbiAgICAgIGxvYWRTdGF0dXMoKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ0Vycm9yOiAnICsgZXJyLm1lc3NhZ2UsICdlcnJvcicpO1xuICAgIH1cbiAgfSk7XG5cbiAgb3BlbkJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgbW9kYWw/LmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgICBsb2FkU3RhdHVzKCk7XG4gIH0pO1xuICB3aXJlTW9kYWwobW9kYWwsIGNhbmNlbEJ0bik7XG4gIHJlZnJlc2hCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbG9hZFN0YXR1cyk7XG5cbiAgLy8gTGF6eS1sb2FkIHRhYnNcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtcGFuZWw9XCJoZWFsdGgtaW5jaWRlbnRzXCJdJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbG9hZEluY2lkZW50cyk7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXBhbmVsPVwiaGVhbHRoLWNvbmZpZ1wiXScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGxvYWRDb25maWcpO1xufSkoKTtcbjtcbi8vID09PT09PT09PT0gVVBEQVRFIE1BTkFHRU1FTlQgPT09PT09PT09PVxuKGZ1bmN0aW9uKCkge1xuICAvLyBJbmplY3QgbW9kYWwgSFRNTFxuICBpbmplY3RNb2RhbCgndXBkYXRlcy1tb2RhbCcsIGA8ZGl2IGlkPVwidXBkYXRlcy1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogNzUwcHg7IG1heC13aWR0aDogOTUwcHg7XCI+XG4gICAgICA8aDM+XHUyQjA2XHVGRTBGIFVwZGF0ZSBNYW5hZ2VtZW50PC9oMz5cbiAgICAgIDxwIGNsYXNzPVwibW9kYWwtc3VidGl0bGVcIj5cbiAgICAgICAgQ2hlY2sgZm9yIGNvbnRhaW5lciBpbWFnZSB1cGRhdGVzLCBhcHBseSB0aGVtLCBhbmQgbWFuYWdlIHJvbGxiYWNrcy5cbiAgICAgIDwvcD5cblxuICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLXRhYnNcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInBhbmVsLXRhYiBhY3RpdmVcIiBkYXRhLXBhbmVsPVwidXBkYXRlcy1hdmFpbGFibGVcIj5BdmFpbGFibGU8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInBhbmVsLXRhYlwiIGRhdGEtcGFuZWw9XCJ1cGRhdGVzLWhpc3RvcnlcIj5IaXN0b3J5PC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJwYW5lbC10YWJcIiBkYXRhLXBhbmVsPVwidXBkYXRlcy1hdXRvXCI+QXV0by1VcGRhdGU8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInBhbmVsLXRhYlwiIGRhdGEtcGFuZWw9XCJ1cGRhdGVzLWRhc2hjYWRkeVwiIGlkPVwidXBkYXRlcy1kYXNoY2FkZHktdGFiXCI+RGFzaENhZGR5PC9idXR0b24+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBUYWI6IEF2YWlsYWJsZSBVcGRhdGVzIC0tPlxuICAgICAgPGRpdiBpZD1cInVwZGF0ZXMtYXZhaWxhYmxlXCIgY2xhc3M9XCJwYW5lbC1zZWN0aW9uIGFjdGl2ZVwiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMTJweDsgZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7XCI+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cInVwZGF0ZXMtY2hlY2stYnRuXCIgY2xhc3M9XCJidG4tYWNjZW50LXNvbGlkXCI+XHVEODNEXHVERDBEIENoZWNrIGZvciBVcGRhdGVzPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cInVwZGF0ZXMtdXBkYXRlLWFsbC1idG5cIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IHBhZGRpbmc6IDZweCAxNHB4OyBmb250LXNpemU6IDAuODJyZW07IGJhY2tncm91bmQ6ICNmOTczMTY7IGNvbG9yOiAjZmZmOyBib3JkZXI6IDFweCBzb2xpZCAjZjk3MzE2OyBib3JkZXItcmFkaXVzOiA2cHg7IGN1cnNvcjogcG9pbnRlcjtcIj5cdTJCMDZcdUZFMEYgVXBkYXRlIEFsbDwvYnV0dG9uPlxuICAgICAgICAgIDxzcGFuIGlkPVwidXBkYXRlcy1jb3VudC1iYWRnZVwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgcGFkZGluZzogNHB4IDEwcHg7IGJvcmRlci1yYWRpdXM6IDEycHg7IGZvbnQtc2l6ZTogMC43OHJlbTsgZm9udC13ZWlnaHQ6IDYwMDsgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50KTsgY29sb3I6IHZhcigtLWJnKTtcIj48L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwidXBkYXRlcy1hdmFpbGFibGUtY29udGFpbmVyXCIgc3R5bGU9XCJtYXgtaGVpZ2h0OiA0NTBweDsgb3ZlcmZsb3cteTogYXV0bztcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdUQ4M0RcdURDRTY8L3NwYW4+IENsaWNrIFwiQ2hlY2sgZm9yIFVwZGF0ZXNcIiB0byBzY2FuIGNvbnRhaW5lcnMuPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gVGFiOiBIaXN0b3J5IC0tPlxuICAgICAgPGRpdiBpZD1cInVwZGF0ZXMtaGlzdG9yeVwiIGNsYXNzPVwicGFuZWwtc2VjdGlvblwiPlxuICAgICAgICA8ZGl2IGlkPVwidXBkYXRlcy1oaXN0b3J5LWNvbnRhaW5lclwiIGNsYXNzPVwic2Nyb2xsLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiYnJhbmQtc3Bpbm5lclwiPjwvc3Bhbj4gTG9hZGluZyB1cGRhdGUgaGlzdG9yeS4uLjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFRhYjogQXV0by1VcGRhdGUgLS0+XG4gICAgICA8ZGl2IGlkPVwidXBkYXRlcy1hdXRvXCIgY2xhc3M9XCJwYW5lbC1zZWN0aW9uXCI+XG4gICAgICAgIDxkaXYgaWQ9XCJ1cGRhdGVzLWF1dG8tY29udGFpbmVyXCIgY2xhc3M9XCJzY3JvbGwtY29udGFpbmVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHVEODNFXHVERDE2PC9zcGFuPiBMb2FkaW5nIGF1dG8tdXBkYXRlIGNvbmZpZ3VyYXRpb24uLi48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBUYWI6IERhc2hDYWRkeSBTZWxmLVVwZGF0ZSAtLT5cbiAgICAgIDxkaXYgaWQ9XCJ1cGRhdGVzLWRhc2hjYWRkeVwiIGNsYXNzPVwicGFuZWwtc2VjdGlvblwiPlxuICAgICAgICA8ZGl2IGlkPVwiZGFzaGNhZGR5LXZlcnNpb24taW5mb1wiIHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiAxNnB4OyBtYXJnaW4tYm90dG9tOiAxNnB4OyBwYWRkaW5nOiAxMnB4OyBib3JkZXItcmFkaXVzOiA4cHg7IGJhY2tncm91bmQ6IHZhcigtLWJnKTtcIj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleDogMTtcIj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDogNjAwOyBmb250LXNpemU6IDFyZW07XCI+RGFzaENhZGR5PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGlkPVwiZGFzaGNhZGR5LWN1cnJlbnQtdmVyc2lvblwiIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgZm9udC1zaXplOiAwLjg1cmVtO1wiPkxvYWRpbmcuLi48L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGlkPVwiZGFzaGNhZGR5LXVwZGF0ZS1iYWRnZVwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgcGFkZGluZzogNHB4IDEycHg7IGJvcmRlci1yYWRpdXM6IDEycHg7IGZvbnQtc2l6ZTogMC43OHJlbTsgZm9udC13ZWlnaHQ6IDYwMDsgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50KTsgY29sb3I6IHZhcigtLWJnKTtcIj5VcGRhdGUgYXZhaWxhYmxlPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwiZGFzaGNhZGR5LXVwZGF0ZS1kZXRhaWxzXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBtYXJnaW4tYm90dG9tOiAxNnB4OyBwYWRkaW5nOiAxMnB4OyBib3JkZXItcmFkaXVzOiA4cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCI+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsgYWxpZ24taXRlbXM6IGNlbnRlcjsgbWFyZ2luLWJvdHRvbTogOHB4O1wiPlxuICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXdlaWdodDogNjAwO1wiPk5ldyB2ZXJzaW9uOiA8c3BhbiBpZD1cImRhc2hjYWRkeS1uZXctdmVyc2lvblwiPjwvc3Bhbj48L3NwYW4+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwiZGFzaGNhZGR5LWFwcGx5LWJ0blwiIGNsYXNzPVwiYnRuLWFjY2VudC1zb2xpZFwiIHN0eWxlPVwicGFkZGluZzogNnB4IDE2cHg7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj5VcGRhdGUgTm93PC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBpZD1cImRhc2hjYWRkeS1jaGFuZ2Vsb2dcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXgtaGVpZ2h0OiAxMjBweDsgb3ZlcmZsb3cteTogYXV0bzsgd2hpdGUtc3BhY2U6IHByZS13cmFwOyBmb250LWZhbWlseTogdmFyKC0tZm9udC1tb25vKTsgbGluZS1oZWlnaHQ6IDEuNTtcIj48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJkYXNoY2FkZHktc3RhdHVzLWJhclwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgbWFyZ2luLWJvdHRvbTogMTZweDsgcGFkZGluZzogMTBweCAxMnB4OyBib3JkZXItcmFkaXVzOiA4cHg7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDEycHg7XCI+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImRhc2hjYWRkeS1jaGVjay1idG5cIiBzdHlsZT1cInBhZGRpbmc6IDZweCAxNHB4OyBmb250LXNpemU6IDAuODJyZW07XCI+Q2hlY2sgZm9yIFVwZGF0ZXM8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiZGFzaGNhZGR5LXJvbGxiYWNrLWJ0blwiIHN0eWxlPVwicGFkZGluZzogNnB4IDE0cHg7IGZvbnQtc2l6ZTogMC44MnJlbTsgbWFyZ2luLWxlZnQ6IDZweDtcIj5Sb2xsYmFjazwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cImRhc2hjYWRkeS1oaXN0b3J5LWNvbnRhaW5lclwiIHN0eWxlPVwibWF4LWhlaWdodDogMjUwcHg7IG92ZXJmbG93LXk6IGF1dG87XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHVEODNEXHVEQ0U2PC9zcGFuPk5vIHNlbGYtdXBkYXRlIGhpc3RvcnkuPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1ib3R0b20tYmFyXCI+XG4gICAgICAgIDxzcGFuIGlkPVwidXBkYXRlcy1sYXN0LWNoZWNrXCIgY2xhc3M9XCJ0ZXh0LWF1dG8tcmlnaHRcIj48L3NwYW4+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9ucyBtb2RhbC1mb290ZXItYmFyXCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJ1cGRhdGVzLWNhbmNlbFwiPkNsb3NlPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YCk7XG5cbiAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBkYXRlcy1tb2RhbCcpO1xuICBjb25zdCBvcGVuQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VwZGF0ZXMtYnRuJyk7XG4gIGNvbnN0IGNhbmNlbEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGRhdGVzLWNhbmNlbCcpO1xuICBjb25zdCBjaGVja0J0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGRhdGVzLWNoZWNrLWJ0bicpO1xuICBjb25zdCBhdmFpbGFibGVDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBkYXRlcy1hdmFpbGFibGUtY29udGFpbmVyJyk7XG4gIGNvbnN0IGhpc3RvcnlDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBkYXRlcy1oaXN0b3J5LWNvbnRhaW5lcicpO1xuICBjb25zdCBhdXRvQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VwZGF0ZXMtYXV0by1jb250YWluZXInKTtcbiAgY29uc3QgbGFzdENoZWNrU3BhbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGRhdGVzLWxhc3QtY2hlY2snKTtcblxuICBhc3luYyBmdW5jdGlvbiBsb2FkQXZhaWxhYmxlKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS91cGRhdGVzL2F2YWlsYWJsZScpO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoIWRhdGEuc3VjY2VzcykgdGhyb3cgbmV3IEVycm9yKGRhdGEuZXJyb3IpO1xuXG4gICAgICBjb25zdCB1cGRhdGVzID0gZGF0YS51cGRhdGVzIHx8IFtdO1xuICAgICAgaWYgKHVwZGF0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGF2YWlsYWJsZUNvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHUyNzA1PC9zcGFuPkFsbCBjb250YWluZXJzIGFyZSB1cCB0byBkYXRlLjwvZGl2Pic7XG4gICAgICAgIGxhc3RDaGVja1NwYW4udGV4dENvbnRlbnQgPSAnJztcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VwZGF0ZXMtdXBkYXRlLWFsbC1idG4nKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBkYXRlcy1jb3VudC1iYWRnZScpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIHdpbmRvdy5fcGVuZGluZ1VwZGF0ZXMgPSBbXTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsZXQgaHRtbCA9ICc8dGFibGUgc3R5bGU9XCJ3aWR0aDogMTAwJTsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgZm9udC1zaXplOiAwLjg1cmVtO1wiPic7XG4gICAgICBodG1sICs9ICc8dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj48dGggc3R5bGU9XCJwYWRkaW5nOiA4cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+Q29udGFpbmVyPC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA4cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+SW1hZ2U8L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDhweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5DdXJyZW50PC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA4cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+TGF0ZXN0PC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA4cHg7IHRleHQtYWxpZ246IHJpZ2h0O1wiPkFjdGlvbnM8L3RoPjwvdHI+JztcbiAgICAgIGZvciAoY29uc3QgdSBvZiB1cGRhdGVzKSB7XG4gICAgICAgIC8vIE1hdGNoIGFwcCBieSBjb250YWluZXJJZCBmaXJzdCwgdGhlbiBuYW1lXG4gICAgICAgIGNvbnN0IGFwcElkID0gKCgpID0+IHtcbiAgICAgICAgICBjb25zdCBhcHBzID0gd2luZG93LkFQUFMgfHwgW107XG4gICAgICAgICAgZm9yIChjb25zdCBhIG9mIGFwcHMpIHtcbiAgICAgICAgICAgIGlmIChhLmNvbnRhaW5lcklkID09PSB1LmNvbnRhaW5lcklkIHx8IGEubmFtZSA9PT0gdS5jb250YWluZXJOYW1lIHx8IGEuaWQgPT09IHUuY29udGFpbmVyTmFtZSkgcmV0dXJuIGEuaWQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB1LmNvbnRhaW5lck5hbWU7XG4gICAgICAgIH0pKCk7XG4gICAgICAgIGh0bWwgKz0gYDx0ciBkYXRhLWFwcC1pZD1cIiR7ZXNjYXBlSHRtbChhcHBJZCl9XCIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA4cHg7IGZvbnQtd2VpZ2h0OiA1MDA7XCI+JHtlc2NhcGVIdG1sKHUuY29udGFpbmVyTmFtZSl9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA4cHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+JHtlc2NhcGVIdG1sKHUuaW1hZ2VOYW1lKX08L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDhweDtcIj48Y29kZSBzdHlsZT1cImZvbnQtc2l6ZTogMC43OHJlbTsgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBwYWRkaW5nOiAycHggNnB4OyBib3JkZXItcmFkaXVzOiA0cHg7XCI+JHtlc2NhcGVIdG1sKHUuY3VycmVudERpZ2VzdCl9PC9jb2RlPjwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogOHB4O1wiPjxjb2RlIHN0eWxlPVwiZm9udC1zaXplOiAwLjc4cmVtOyBiYWNrZ3JvdW5kOiB2YXIoLS1vay1iZyk7IGNvbG9yOiB2YXIoLS1vay1mZyk7IHBhZGRpbmc6IDJweCA2cHg7IGJvcmRlci1yYWRpdXM6IDRweDtcIj4ke2VzY2FwZUh0bWwodS5sYXRlc3REaWdlc3QpfTwvY29kZT48L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDhweDsgdGV4dC1hbGlnbjogcmlnaHQ7XCI+YDtcbiAgICAgICAgaHRtbCArPSBgPGJ1dHRvbiBjbGFzcz1cInVwZGF0ZS1ub3ctYnRuXCIgZGF0YS1pZD1cIiR7ZXNjYXBlSHRtbCh1LmNvbnRhaW5lcklkKX1cIiBkYXRhLW5hbWU9XCIke2VzY2FwZUh0bWwodS5jb250YWluZXJOYW1lKX1cIiBzdHlsZT1cInBhZGRpbmc6IDRweCAxMHB4OyBmb250LXNpemU6IDAuNzhyZW07IGJhY2tncm91bmQ6IHZhcigtLWFjY2VudCk7IGNvbG9yOiB2YXIoLS1iZyk7IGJvcmRlci1jb2xvcjogdmFyKC0tYWNjZW50KTsgbWFyZ2luLXJpZ2h0OiA0cHg7XCI+VXBkYXRlPC9idXR0b24+YDtcbiAgICAgICAgaHRtbCArPSBgPGJ1dHRvbiBjbGFzcz1cInJvbGxiYWNrLWJ0blwiIGRhdGEtaWQ9XCIke2VzY2FwZUh0bWwodS5jb250YWluZXJJZCl9XCIgZGF0YS1uYW1lPVwiJHtlc2NhcGVIdG1sKHUuY29udGFpbmVyTmFtZSl9XCIgc3R5bGU9XCJwYWRkaW5nOiA0cHggMTBweDsgZm9udC1zaXplOiAwLjc4cmVtO1wiPlJvbGxiYWNrPC9idXR0b24+YDtcbiAgICAgICAgaHRtbCArPSAnPC90ZD48L3RyPic7XG4gICAgICB9XG4gICAgICBodG1sICs9ICc8L3RhYmxlPic7XG4gICAgICBhdmFpbGFibGVDb250YWluZXIuaW5uZXJIVE1MID0gaHRtbDtcbiAgICAgIGxhc3RDaGVja1NwYW4udGV4dENvbnRlbnQgPSB1cGRhdGVzLmxlbmd0aCArICcgdXBkYXRlKHMpIGF2YWlsYWJsZSc7XG5cbiAgICAgIC8vIFNob3cgY291bnQgYmFkZ2UgYW5kIFVwZGF0ZSBBbGwgYnV0dG9uXG4gICAgICBjb25zdCBjb3VudEJhZGdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VwZGF0ZXMtY291bnQtYmFkZ2UnKTtcbiAgICAgIGNvbnN0IHVwZGF0ZUFsbEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGRhdGVzLXVwZGF0ZS1hbGwtYnRuJyk7XG4gICAgICBpZiAoY291bnRCYWRnZSkge1xuICAgICAgICBjb3VudEJhZGdlLnRleHRDb250ZW50ID0gdXBkYXRlcy5sZW5ndGggKyAnIHBlbmRpbmcnO1xuICAgICAgICBjb3VudEJhZGdlLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgIH1cbiAgICAgIGlmICh1cGRhdGVBbGxCdG4gJiYgdXBkYXRlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHVwZGF0ZUFsbEJ0bi5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICB9XG5cbiAgICAgIC8vIFN0b3JlIHVwZGF0ZXMgZm9yIFVwZGF0ZSBBbGwgYnV0dG9uXG4gICAgICB3aW5kb3cuX3BlbmRpbmdVcGRhdGVzID0gdXBkYXRlcztcblxuICAgICAgLy8gV2lyZSB1cGRhdGUgYnV0dG9uc1xuICAgICAgYXZhaWxhYmxlQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJy51cGRhdGUtbm93LWJ0bicpLmZvckVhY2goYnRuID0+IHtcbiAgICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGlkID0gYnRuLmRhdGFzZXQuaWQ7XG4gICAgICAgICAgY29uc3QgbmFtZSA9IGJ0bi5kYXRhc2V0Lm5hbWU7XG4gICAgICAgICAgaWYgKCFjb25maXJtKGBVcGRhdGUgXCIke25hbWV9XCIgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uPyBUaGUgY29udGFpbmVyIHdpbGwgcmVzdGFydC5gKSkgcmV0dXJuO1xuICAgICAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICdVcGRhdGluZy4uLic7XG4gICAgICAgICAgYnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgciA9IGF3YWl0IHNlY3VyZUZldGNoKGAvYXBpL3YxL3VwZGF0ZXMvdXBkYXRlLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGlkKX1gLCB7XG4gICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBhdXRvUm9sbGJhY2s6IHRydWUgfSlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgZCA9IGF3YWl0IHIuanNvbigpO1xuICAgICAgICAgICAgaWYgKGQuc3VjY2Vzcykge1xuICAgICAgICAgICAgICBidG4udGV4dENvbnRlbnQgPSAnRG9uZSEnO1xuICAgICAgICAgICAgICBidG4uc3R5bGUuYmFja2dyb3VuZCA9ICd2YXIoLS1vay1mZyknO1xuICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IGxvYWRBdmFpbGFibGUoKSwgMjAwMCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZC5lcnJvciB8fCAnVXBkYXRlIGZhaWxlZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICdGYWlsZWQnO1xuICAgICAgICAgICAgYnRuLnN0eWxlLmNvbG9yID0gJ3ZhcigtLWJhZC1mZyknO1xuICAgICAgICAgICAgc2hvd05vdGlmaWNhdGlvbignVXBkYXRlIGVycm9yOiAnICsgZS5tZXNzYWdlLCAnZXJyb3InKTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyBidG4udGV4dENvbnRlbnQgPSAnVXBkYXRlJzsgYnRuLmRpc2FibGVkID0gZmFsc2U7IGJ0bi5zdHlsZS5jb2xvciA9ICcnOyBidG4uc3R5bGUuYmFja2dyb3VuZCA9ICcnOyB9LCAzMDAwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFdpcmUgcm9sbGJhY2sgYnV0dG9uc1xuICAgICAgYXZhaWxhYmxlQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJy5yb2xsYmFjay1idG4nKS5mb3JFYWNoKGJ0biA9PiB7XG4gICAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBpZCA9IGJ0bi5kYXRhc2V0LmlkO1xuICAgICAgICAgIGNvbnN0IG5hbWUgPSBidG4uZGF0YXNldC5uYW1lO1xuICAgICAgICAgIGlmICghY29uZmlybShgUm9sbGJhY2sgXCIke25hbWV9XCIgdG8gaXRzIHByZXZpb3VzIHZlcnNpb24/YCkpIHJldHVybjtcbiAgICAgICAgICBidG4udGV4dENvbnRlbnQgPSAnUm9sbGluZyBiYWNrLi4uJztcbiAgICAgICAgICBidG4uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByID0gYXdhaXQgc2VjdXJlRmV0Y2goYC9hcGkvdjEvdXBkYXRlcy9yb2xsYmFjay8ke2VuY29kZVVSSUNvbXBvbmVudChpZCl9YCwgeyBtZXRob2Q6ICdQT1NUJyB9KTtcbiAgICAgICAgICAgIGNvbnN0IGQgPSBhd2FpdCByLmpzb24oKTtcbiAgICAgICAgICAgIGlmIChkLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgYnRuLnRleHRDb250ZW50ID0gJ1JvbGxlZCBiYWNrISc7XG4gICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gbG9hZEF2YWlsYWJsZSgpLCAyMDAwKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihkLmVycm9yIHx8ICdSb2xsYmFjayBmYWlsZWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBidG4udGV4dENvbnRlbnQgPSAnRmFpbGVkJztcbiAgICAgICAgICAgIHNob3dOb3RpZmljYXRpb24oJ1JvbGxiYWNrIGVycm9yOiAnICsgZS5tZXNzYWdlLCAnZXJyb3InKTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyBidG4udGV4dENvbnRlbnQgPSAnUm9sbGJhY2snOyBidG4uZGlzYWJsZWQgPSBmYWxzZTsgfSwgMzAwMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGF2YWlsYWJsZUNvbnRhaW5lci5pbm5lckhUTUwgPSBgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCIgc3R5bGU9XCJjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5GYWlsZWQ6ICR7ZXNjYXBlSHRtbChlLm1lc3NhZ2UpfTwvZGl2PmA7XG4gICAgfVxuICB9XG5cbiAgLy8gVXBkYXRlIEFsbCBcdTIwMTQgc2VxdWVudGlhbGx5LCBza2lwIGZhaWx1cmVzXG4gIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUFsbENvbnRhaW5lcnMoKSB7XG4gICAgY29uc3QgdXBkYXRlcyA9IHdpbmRvdy5fcGVuZGluZ1VwZGF0ZXMgfHwgW107XG4gICAgaWYgKCF1cGRhdGVzLmxlbmd0aCkgcmV0dXJuO1xuICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGRhdGVzLXVwZGF0ZS1hbGwtYnRuJyk7XG4gICAgaWYgKCFjb25maXJtKGBVcGRhdGUgYWxsICR7dXBkYXRlcy5sZW5ndGh9IGNvbnRhaW5lcnM/IEVhY2ggd2lsbCByZXN0YXJ0LmApKSByZXR1cm47XG4gICAgYnRuLnRleHRDb250ZW50ID0gJ1x1MjNGMyBVcGRhdGluZy4uLic7XG4gICAgYnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgICBsZXQgc3VjY2VzcyA9IDAsIGZhaWxlZCA9IDA7XG4gICAgZm9yIChjb25zdCB1IG9mIHVwZGF0ZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHIgPSBhd2FpdCBzZWN1cmVGZXRjaChgL2FwaS92MS91cGRhdGVzL3VwZGF0ZS8ke2VuY29kZVVSSUNvbXBvbmVudCh1LmNvbnRhaW5lcklkKX1gLCB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBhdXRvUm9sbGJhY2s6IHRydWUgfSlcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGQgPSBhd2FpdCByLmpzb24oKTtcbiAgICAgICAgaWYgKGQuc3VjY2Vzcykgc3VjY2VzcysrO1xuICAgICAgICBlbHNlIGZhaWxlZCsrO1xuICAgICAgfSBjYXRjaCAoXykgeyBmYWlsZWQrKzsgfVxuICAgIH1cbiAgICBidG4udGV4dENvbnRlbnQgPSBgXHUyNzA1IERvbmVgO1xuICAgIHNob3dOb3RpZmljYXRpb24oYFVwZGF0ZSBhbGw6ICR7c3VjY2Vzc30gc3VjY2VlZGVkLCAke2ZhaWxlZH0gZmFpbGVkLmAsIHN1Y2Nlc3MgPiAwICYmIGZhaWxlZCA9PT0gMCA/ICdzdWNjZXNzJyA6ICdlcnJvcicpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgYnRuLnRleHRDb250ZW50ID0gJ1x1MkIwNlx1RkUwRiBVcGRhdGUgQWxsJztcbiAgICAgIGJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgbG9hZEF2YWlsYWJsZSgpO1xuICAgIH0sIDMwMDApO1xuICB9XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VwZGF0ZXMtdXBkYXRlLWFsbC1idG4nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB1cGRhdGVBbGxDb250YWluZXJzKTtcblxuICBhc3luYyBmdW5jdGlvbiBjaGVja0ZvclVwZGF0ZXMoKSB7XG4gICAgY2hlY2tCdG4udGV4dENvbnRlbnQgPSAnXHVEODNEXHVERDBEIENoZWNraW5nLi4uJztcbiAgICBjaGVja0J0bi5kaXNhYmxlZCA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL3VwZGF0ZXMvY2hlY2snLCB7IG1ldGhvZDogJ1BPU1QnIH0pO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoIWRhdGEuc3VjY2VzcykgdGhyb3cgbmV3IEVycm9yKGRhdGEuZXJyb3IpO1xuICAgICAgY2hlY2tCdG4udGV4dENvbnRlbnQgPSAnXHUyNzA1IERvbmUhJztcbiAgICAgIGF3YWl0IGxvYWRBdmFpbGFibGUoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjaGVja0J0bi50ZXh0Q29udGVudCA9ICdcdTI3NEMgRmFpbGVkJztcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ0NoZWNrIGVycm9yOiAnICsgZS5tZXNzYWdlLCAnZXJyb3InKTtcbiAgICB9XG4gICAgc2V0VGltZW91dCgoKSA9PiB7IGNoZWNrQnRuLnRleHRDb250ZW50ID0gJ1x1RDgzRFx1REQwRCBDaGVjayBmb3IgVXBkYXRlcyc7IGNoZWNrQnRuLmRpc2FibGVkID0gZmFsc2U7IH0sIDMwMDApO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZEhpc3RvcnkoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGhpc3RvcnlDb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiYnJhbmQtc3Bpbm5lclwiPjwvc3Bhbj4gTG9hZGluZy4uLjwvZGl2Pic7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS91cGRhdGVzL2hpc3Rvcnk/bGltaXQ9NTAnKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgY29uc3QgaGlzdG9yeSA9IGRhdGEuc3VjY2VzcyAmJiBkYXRhLmhpc3RvcnkgPyBkYXRhLmhpc3RvcnkgOiBbXTtcbiAgICAgIGlmIChoaXN0b3J5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBoaXN0b3J5Q29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdUQ4M0RcdURDQ0I8L3NwYW4+Tm8gdXBkYXRlIGhpc3RvcnkgeWV0LjwvZGl2Pic7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxldCBodG1sID0gJzx0YWJsZSBzdHlsZT1cIndpZHRoOiAxMDAlOyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyBmb250LXNpemU6IDAuODJyZW07XCI+JztcbiAgICAgIGh0bWwgKz0gJzx0ciBzdHlsZT1cImJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPjx0aCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5XaGVuPC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+Q29udGFpbmVyPC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+SW1hZ2U8L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5EdXJhdGlvbjwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPlN0YXR1czwvdGg+PC90cj4nO1xuICAgICAgZm9yIChjb25zdCBoIG9mIGhpc3RvcnkpIHtcbiAgICAgICAgY29uc3Qgb2sgPSBoLnN0YXR1cyA9PT0gJ3N1Y2Nlc3MnO1xuICAgICAgICBjb25zdCBkdXIgPSBoLmR1cmF0aW9uID8gKGguZHVyYXRpb24gPCAxMDAwID8gaC5kdXJhdGlvbiArICdtcycgOiBNYXRoLnJvdW5kKGguZHVyYXRpb24gLyAxMDAwKSArICdzJykgOiAnLSc7XG4gICAgICAgIGh0bWwgKz0gYDx0ciBzdHlsZT1cImJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweDsgY29sb3I6IHZhcigtLW11dGVkKTtcIj4ke3RpbWVBZ28oaC50aW1lc3RhbXApfTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4OyBmb250LXdlaWdodDogNTAwO1wiPiR7ZXNjYXBlSHRtbChoLmNvbnRhaW5lck5hbWUpfTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPiR7ZXNjYXBlSHRtbChoLmltYWdlTmFtZSl9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7XCI+JHtkdXJ9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7XCI+PHNwYW4gc3R5bGU9XCJjb2xvcjogJHtvayA/ICd2YXIoLS1vay1mZyknIDogJ3ZhcigtLWJhZC1mZyknfTtcIj4ke29rID8gJ1x1MjcxMyBzdWNjZXNzJyA6ICdcdTI3MTcgZmFpbGVkJ308L3NwYW4+PC90ZD5gO1xuICAgICAgICBodG1sICs9ICc8L3RyPic7XG4gICAgICAgIGlmICghb2sgJiYgaC5lcnJvcikge1xuICAgICAgICAgIGh0bWwgKz0gYDx0cj48dGQgY29sc3Bhbj1cIjVcIiBzdHlsZT1cInBhZGRpbmc6IDRweCA2cHggOHB4OyBmb250LXNpemU6IDAuNzhyZW07IGNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPiR7ZXNjYXBlSHRtbChoLmVycm9yKX08L3RkPjwvdHI+YDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaHRtbCArPSAnPC90YWJsZT4nO1xuICAgICAgaGlzdG9yeUNvbnRhaW5lci5pbm5lckhUTUwgPSBodG1sO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGhpc3RvcnlDb250YWluZXIuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RmFpbGVkOiAke2VzY2FwZUh0bWwoZS5tZXNzYWdlKX08L2Rpdj5gO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRBdXRvQ29uZmlnKCkge1xuICAgIHRyeSB7XG4gICAgICBhdXRvQ29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+IExvYWRpbmcuLi48L2Rpdj4nO1xuXG4gICAgICAvLyBGZXRjaCBjb250YWluZXJzIGFuZCBzYXZlZCBhdXRvLXVwZGF0ZSBjb25maWcgaW4gcGFyYWxsZWxcbiAgICAgIGNvbnN0IFtjb250YWluZXJzUmVzLCBjb25maWdSZXNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBmZXRjaCgnL2FwaS92MS9zdGF0cy9jb250YWluZXJzJyksXG4gICAgICAgIGZldGNoKCcvYXBpL3YxL3VwZGF0ZXMvYXV0by11cGRhdGUnKVxuICAgICAgXSk7XG4gICAgICBjb25zdCBjb250YWluZXJzRGF0YSA9IGF3YWl0IGNvbnRhaW5lcnNSZXMuanNvbigpO1xuICAgICAgY29uc3QgY29uZmlnRGF0YSA9IGF3YWl0IGNvbmZpZ1Jlcy5qc29uKCk7XG5cbiAgICAgIGNvbnN0IGNvbnRhaW5lcnMgPSBjb250YWluZXJzRGF0YS5zdWNjZXNzICYmIGNvbnRhaW5lcnNEYXRhLnN0YXRzID8gY29udGFpbmVyc0RhdGEuc3RhdHMgOiBbXTtcbiAgICAgIGNvbnN0IHNhdmVkQ29uZmlnID0gY29uZmlnRGF0YS5zdWNjZXNzICYmIGNvbmZpZ0RhdGEuY29uZmlnID8gY29uZmlnRGF0YS5jb25maWcgOiB7fTtcblxuICAgICAgaWYgKGNvbnRhaW5lcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGF1dG9Db250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1RDgzRVx1REQxNjwvc3Bhbj5ObyBydW5uaW5nIGNvbnRhaW5lcnMgZm91bmQuPC9kaXY+JztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsZXQgaHRtbCA9ICc8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMTJweDsgZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+QXV0by11cGRhdGVzIHJ1biBkdXJpbmcgbWFpbnRlbmFuY2Ugd2luZG93IChkZWZhdWx0IDJBTS00QU0pLiBEYWlseSA9IGV2ZXJ5IGRheSwgV2Vla2x5ID0gU3VuZGF5cywgTW9udGhseSA9IDFzdCBvZiBtb250aC48L2Rpdj4nO1xuICAgICAgaHRtbCArPSAnPHRhYmxlIHN0eWxlPVwid2lkdGg6IDEwMCU7IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj4nO1xuICAgICAgaHRtbCArPSAnPHRyIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+PHRoIHN0eWxlPVwicGFkZGluZzogOHB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPkNvbnRhaW5lcjwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogOHB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPlNjaGVkdWxlPC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA4cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+V2luZG93PC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA4cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+Um9sbGJhY2s8L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDhweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5MYXN0IFJ1bjwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogOHB4OyB0ZXh0LWFsaWduOiByaWdodDtcIj5BY3Rpb25zPC90aD48L3RyPic7XG4gICAgICBmb3IgKGNvbnN0IGMgb2YgY29udGFpbmVycykge1xuICAgICAgICBjb25zdCBuYW1lID0gYy5uYW1lIHx8IGMuTmFtZXM/LlswXT8ucmVwbGFjZSgvXlxcLy8sICcnKSB8fCBjLklkPy5zdWJzdHJpbmcoMCwgMTIpO1xuICAgICAgICBjb25zdCBjaWQgPSBjLmNvbnRhaW5lcklkIHx8IGMuSWQ7XG4gICAgICAgIGNvbnN0IHNhdmVkID0gc2F2ZWRDb25maWdbY2lkXSB8fCB7fTtcbiAgICAgICAgY29uc3Qgc2NoZWR1bGVWYWwgPSBzYXZlZC5lbmFibGVkID8gKHNhdmVkLnNjaGVkdWxlIHx8ICd3ZWVrbHknKSA6ICcnO1xuICAgICAgICBjb25zdCByb2xsYmFja1ZhbCA9IHNhdmVkLmF1dG9Sb2xsYmFjayAhPT0gZmFsc2U7XG4gICAgICAgIGNvbnN0IHdpbmRvd1ZhbCA9IHNhdmVkLm1haW50ZW5hbmNlV2luZG93IHx8ICcnO1xuICAgICAgICBjb25zdCBsYXN0UnVuID0gc2F2ZWQubGFzdEF1dG9VcGRhdGUgPyB0aW1lQWdvKHNhdmVkLmxhc3RBdXRvVXBkYXRlKSA6ICdOZXZlcic7XG5cbiAgICAgICAgaHRtbCArPSBgPHRyIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCIgZGF0YS1jb250YWluZXItaWQ9XCIke2VzY2FwZUh0bWwoY2lkKX1cIj5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA4cHg7IGZvbnQtd2VpZ2h0OiA1MDA7XCI+JHtlc2NhcGVIdG1sKG5hbWUpfTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogOHB4O1wiPlxuICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJhdXRvLXNjaGVkdWxlXCIgZGF0YS1pZD1cIiR7ZXNjYXBlSHRtbChjaWQpfVwiIHN0eWxlPVwicGFkZGluZzogNHB4IDhweDsgYm9yZGVyLXJhZGl1czogNHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7IGZvbnQtc2l6ZTogMC44MnJlbTtcIj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIiR7IXNjaGVkdWxlVmFsID8gJyBzZWxlY3RlZCcgOiAnJ30+RGlzYWJsZWQ8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJkYWlseVwiJHtzY2hlZHVsZVZhbCA9PT0gJ2RhaWx5JyA/ICcgc2VsZWN0ZWQnIDogJyd9PkRhaWx5PC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwid2Vla2x5XCIke3NjaGVkdWxlVmFsID09PSAnd2Vla2x5JyA/ICcgc2VsZWN0ZWQnIDogJyd9PldlZWtseTwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIm1vbnRobHlcIiR7c2NoZWR1bGVWYWwgPT09ICdtb250aGx5JyA/ICcgc2VsZWN0ZWQnIDogJyd9Pk1vbnRobHk8L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD48L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDhweDtcIj48aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImF1dG8td2luZG93XCIgZGF0YS1pZD1cIiR7ZXNjYXBlSHRtbChjaWQpfVwiIHZhbHVlPVwiJHtlc2NhcGVIdG1sKHdpbmRvd1ZhbCl9XCIgcGxhY2Vob2xkZXI9XCIwMjowMC0wNDowMFwiIHN0eWxlPVwid2lkdGg6IDkwcHg7IHBhZGRpbmc6IDNweCA2cHg7IGZvbnQtc2l6ZTogMC43OHJlbTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7XCIgLz48L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDhweDtcIj48aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJhdXRvLXJvbGxiYWNrXCIgZGF0YS1pZD1cIiR7ZXNjYXBlSHRtbChjaWQpfVwiJHtyb2xsYmFja1ZhbCA/ICcgY2hlY2tlZCcgOiAnJ30gLz48L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDhweDsgZm9udC1zaXplOiAwLjc4cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPiR7bGFzdFJ1bn08L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDhweDsgdGV4dC1hbGlnbjogcmlnaHQ7XCI+PGJ1dHRvbiBjbGFzcz1cInNhdmUtYXV0by1idG5cIiBkYXRhLWlkPVwiJHtlc2NhcGVIdG1sKGNpZCl9XCIgZGF0YS1uYW1lPVwiJHtlc2NhcGVIdG1sKG5hbWUpfVwiIHN0eWxlPVwicGFkZGluZzogNHB4IDEwcHg7IGZvbnQtc2l6ZTogMC43OHJlbTtcIj5TYXZlPC9idXR0b24+PC90ZD5gO1xuICAgICAgICBodG1sICs9ICc8L3RyPic7XG4gICAgICB9XG4gICAgICBodG1sICs9ICc8L3RhYmxlPic7XG4gICAgICBhdXRvQ29udGFpbmVyLmlubmVySFRNTCA9IGh0bWw7XG5cbiAgICAgIC8vIFdpcmUgc2F2ZSBidXR0b25zXG4gICAgICBhdXRvQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJy5zYXZlLWF1dG8tYnRuJykuZm9yRWFjaChidG4gPT4ge1xuICAgICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgaWQgPSBidG4uZGF0YXNldC5pZDtcbiAgICAgICAgICBjb25zdCByb3cgPSBidG4uY2xvc2VzdCgndHInKTtcbiAgICAgICAgICBjb25zdCBzY2hlZHVsZSA9IHJvdy5xdWVyeVNlbGVjdG9yKCcuYXV0by1zY2hlZHVsZScpLnZhbHVlO1xuICAgICAgICAgIGNvbnN0IHJvbGxiYWNrID0gcm93LnF1ZXJ5U2VsZWN0b3IoJy5hdXRvLXJvbGxiYWNrJykuY2hlY2tlZDtcbiAgICAgICAgICBjb25zdCB3aW5kb3cgPSByb3cucXVlcnlTZWxlY3RvcignLmF1dG8td2luZG93JykudmFsdWUudHJpbSgpO1xuICAgICAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICdTYXZpbmcuLi4nO1xuICAgICAgICAgIGJ0bi5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHIgPSBhd2FpdCBzZWN1cmVGZXRjaChgL2FwaS92MS91cGRhdGVzL2F1dG8tdXBkYXRlLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGlkKX1gLCB7XG4gICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBlbmFibGVkOiAhIXNjaGVkdWxlLCBzY2hlZHVsZTogc2NoZWR1bGUgfHwgJ3dlZWtseScsIGF1dG9Sb2xsYmFjazogcm9sbGJhY2ssIG1haW50ZW5hbmNlV2luZG93OiB3aW5kb3cgfHwgdW5kZWZpbmVkIH0pXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IGQgPSBhd2FpdCByLmpzb24oKTtcbiAgICAgICAgICAgIGlmIChkLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgYnRuLnRleHRDb250ZW50ID0gJ1x1MjcxMyBTYXZlZCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZC5lcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgYnRuLnRleHRDb250ZW50ID0gJ1x1MjcxNyBFcnJvcic7XG4gICAgICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdTYXZlIGVycm9yOiAnICsgZS5tZXNzYWdlLCAnZXJyb3InKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IGJ0bi50ZXh0Q29udGVudCA9ICdTYXZlJzsgYnRuLmRpc2FibGVkID0gZmFsc2U7IH0sIDIwMDApO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGF1dG9Db250YWluZXIuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RmFpbGVkOiAke2VzY2FwZUh0bWwoZS5tZXNzYWdlKX08L2Rpdj5gO1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09IERBU0hDQUREWSBTRUxGLVVQREFURSA9PT09PVxuXG4gIGNvbnN0IGRjVmVyc2lvbkluZm8gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaGNhZGR5LWN1cnJlbnQtdmVyc2lvbicpO1xuICBjb25zdCBkY1VwZGF0ZUJhZGdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rhc2hjYWRkeS11cGRhdGUtYmFkZ2UnKTtcbiAgY29uc3QgZGNVcGRhdGVEZXRhaWxzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rhc2hjYWRkeS11cGRhdGUtZGV0YWlscycpO1xuICBjb25zdCBkY05ld1ZlcnNpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaGNhZGR5LW5ldy12ZXJzaW9uJyk7XG4gIGNvbnN0IGRjQ2hhbmdlbG9nID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rhc2hjYWRkeS1jaGFuZ2Vsb2cnKTtcbiAgY29uc3QgZGNBcHBseUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYXNoY2FkZHktYXBwbHktYnRuJyk7XG4gIGNvbnN0IGRjQ2hlY2tCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaGNhZGR5LWNoZWNrLWJ0bicpO1xuICBjb25zdCBkY1JvbGxiYWNrQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rhc2hjYWRkeS1yb2xsYmFjay1idG4nKTtcbiAgY29uc3QgZGNTdGF0dXNCYXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaGNhZGR5LXN0YXR1cy1iYXInKTtcbiAgY29uc3QgZGNIaXN0b3J5Q29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rhc2hjYWRkeS1oaXN0b3J5LWNvbnRhaW5lcicpO1xuXG4gIGxldCBkY0xhc3RDaGVjayA9IG51bGw7XG5cbiAgZnVuY3Rpb24gZGNTaG93U3RhdHVzKG1zZywgdHlwZSkge1xuICAgIGlmICghZGNTdGF0dXNCYXIpIHJldHVybjtcbiAgICBkY1N0YXR1c0Jhci5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICBkY1N0YXR1c0Jhci5zdHlsZS5iYWNrZ3JvdW5kID0gdHlwZSA9PT0gJ2Vycm9yJyA/ICd2YXIoLS1iYWQtYmcpJyA6IHR5cGUgPT09ICdzdWNjZXNzJyA/ICd2YXIoLS1vay1iZyknIDogJ3ZhcigtLWJnKSc7XG4gICAgZGNTdGF0dXNCYXIuc3R5bGUuY29sb3IgPSB0eXBlID09PSAnZXJyb3InID8gJ3ZhcigtLWJhZC1mZyknIDogdHlwZSA9PT0gJ3N1Y2Nlc3MnID8gJ3ZhcigtLW9rLWZnKScgOiAndmFyKC0tZmcpJztcbiAgICBkY1N0YXR1c0Jhci50ZXh0Q29udGVudCA9IG1zZztcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGRjTG9hZFZlcnNpb24oKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL3N5c3RlbS92ZXJzaW9uJyk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgY29uc3QgY29tbWl0ID0gZGF0YS5jb21taXQgJiYgZGF0YS5jb21taXQgIT09ICd1bmtub3duJyA/IGRhdGEuY29tbWl0IDogbnVsbDtcbiAgICAgICAgZGNWZXJzaW9uSW5mby50ZXh0Q29udGVudCA9ICd2JyArIGRhdGEudmVyc2lvbiArIChjb21taXQgPyAnICgnICsgY29tbWl0LnN1YnN0cmluZygwLCA3KSArICcpJyA6ICcnKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChfKSB7XG4gICAgICBkY1ZlcnNpb25JbmZvLnRleHRDb250ZW50ID0gJ1VuYWJsZSB0byBmZXRjaCB2ZXJzaW9uJztcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBkY0NoZWNrRm9yVXBkYXRlKHNpbGVudCkge1xuICAgIGlmICghc2lsZW50KSB7XG4gICAgICBkY0NoZWNrQnRuLnRleHRDb250ZW50ID0gJ0NoZWNraW5nLi4uJztcbiAgICAgIGRjQ2hlY2tCdG4uZGlzYWJsZWQgPSB0cnVlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvc3lzdGVtL3VwZGF0ZS1jaGVjaycpO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBkY0xhc3RDaGVjayA9IGRhdGE7XG5cbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MgJiYgZGF0YS5hdmFpbGFibGUgJiYgZGF0YS5yZW1vdGUpIHtcbiAgICAgICAgZGNVcGRhdGVCYWRnZS5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICAgIGRjVXBkYXRlRGV0YWlscy5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICAgIGRjTmV3VmVyc2lvbi50ZXh0Q29udGVudCA9ICd2JyArIGRhdGEucmVtb3RlLnZlcnNpb247XG4gICAgICAgIGRjQ2hhbmdlbG9nLnRleHRDb250ZW50ID0gZGF0YS5yZW1vdGUuY2hhbmdlbG9nIHx8ICdObyBjaGFuZ2Vsb2cgYXZhaWxhYmxlLic7XG5cbiAgICAgICAgLy8gQWRkIG5vdGlmaWNhdGlvbiBkb3QgdG8gdGhlIFVwZGF0ZXMgYnV0dG9uXG4gICAgICAgIGNvbnN0IHVwZGF0ZXNCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBkYXRlcy1idG4nKTtcbiAgICAgICAgaWYgKHVwZGF0ZXNCdG4gJiYgIXVwZGF0ZXNCdG4ucXVlcnlTZWxlY3RvcignLnVwZGF0ZS1kb3QnKSkge1xuICAgICAgICAgIGNvbnN0IGRvdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgICBkb3QuY2xhc3NOYW1lID0gJ3VwZGF0ZS1kb3QnO1xuICAgICAgICAgIGRvdC5zdHlsZS5jc3NUZXh0ID0gJ3Bvc2l0aW9uOmFic29sdXRlO3RvcDoycHg7cmlnaHQ6MnB4O3dpZHRoOjhweDtoZWlnaHQ6OHB4O2JvcmRlci1yYWRpdXM6NTAlO2JhY2tncm91bmQ6dmFyKC0tYWNjZW50KTsnO1xuICAgICAgICAgIHVwZGF0ZXNCdG4uc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xuICAgICAgICAgIHVwZGF0ZXNCdG4uYXBwZW5kQ2hpbGQoZG90KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBBbHNvIGFkZCBkb3QgdG8gdGhlIERhc2hDYWRkeSB0YWJcbiAgICAgICAgY29uc3QgZGNUYWIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBkYXRlcy1kYXNoY2FkZHktdGFiJyk7XG4gICAgICAgIGlmIChkY1RhYiAmJiAhZGNUYWIucXVlcnlTZWxlY3RvcignLnVwZGF0ZS1kb3QnKSkge1xuICAgICAgICAgIGNvbnN0IGRvdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgICBkb3QuY2xhc3NOYW1lID0gJ3VwZGF0ZS1kb3QnO1xuICAgICAgICAgIGRvdC5zdHlsZS5jc3NUZXh0ID0gJ2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjZweDtoZWlnaHQ6NnB4O2JvcmRlci1yYWRpdXM6NTAlO2JhY2tncm91bmQ6dmFyKC0tYWNjZW50KTttYXJnaW4tbGVmdDo0cHg7dmVydGljYWwtYWxpZ246bWlkZGxlOyc7XG4gICAgICAgICAgZGNUYWIuYXBwZW5kQ2hpbGQoZG90KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGNVcGRhdGVCYWRnZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICBkY1VwZGF0ZURldGFpbHMuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgYXdhaXQgZGNMb2FkVmVyc2lvbigpO1xuICAgICAgICBpZiAoIXNpbGVudCkgZGNTaG93U3RhdHVzKCdZb3UgYXJlIHJ1bm5pbmcgdGhlIGxhdGVzdCB2ZXJzaW9uLicsICdzdWNjZXNzJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICghc2lsZW50KSB7XG4gICAgICAgIGRjQ2hlY2tCdG4udGV4dENvbnRlbnQgPSAnQ2hlY2sgZm9yIFVwZGF0ZXMnO1xuICAgICAgICBkY0NoZWNrQnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKCFzaWxlbnQpIHtcbiAgICAgICAgZGNTaG93U3RhdHVzKCdGYWlsZWQgdG8gY2hlY2s6ICcgKyBlLm1lc3NhZ2UsICdlcnJvcicpO1xuICAgICAgICBkY0NoZWNrQnRuLnRleHRDb250ZW50ID0gJ0NoZWNrIGZvciBVcGRhdGVzJztcbiAgICAgICAgZGNDaGVja0J0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGRjQXBwbHlVcGRhdGUoKSB7XG4gICAgaWYgKCFjb25maXJtKCdBcHBseSBEYXNoQ2FkZHkgdXBkYXRlPyBUaGUgQVBJIGNvbnRhaW5lciB3aWxsIHJlc3RhcnQuJykpIHJldHVybiBmYWxzZTtcbiAgICBkY0FwcGx5QnRuLnRleHRDb250ZW50ID0gJ1VwZGF0aW5nLi4uJztcbiAgICBkY0FwcGx5QnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgICBkY1Nob3dTdGF0dXMoJ0Rvd25sb2FkaW5nIGFuZCBhcHBseWluZyB1cGRhdGUuLi4nLCAnaW5mbycpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9zeXN0ZW0vdXBkYXRlLWFwcGx5JywgeyBtZXRob2Q6ICdQT1NUJyB9KTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICBkY1Nob3dTdGF0dXMoJ1VwZGF0ZSBpbml0aWF0ZWQ6IHYnICsgKGRhdGEuZnJvbVZlcnNpb24gfHwgJz8nKSArICcgXHUyMTkyIHYnICsgKGRhdGEudG9WZXJzaW9uIHx8ICc/JykgKyAnLiBUaGUgY29udGFpbmVyIHdpbGwgcmVzdGFydCBzaG9ydGx5LicsICdzdWNjZXNzJyk7XG4gICAgICAgIGRjQXBwbHlCdG4udGV4dENvbnRlbnQgPSAnQXBwbGllZCEnO1xuICAgICAgICAvLyBSZW1vdmUgbm90aWZpY2F0aW9uIGRvdHNcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnVwZGF0ZS1kb3QnKS5mb3JFYWNoKGQgPT4gZC5yZW1vdmUoKSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGRhdGEuZXJyb3IgfHwgJ1VwZGF0ZSBmYWlsZWQnKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBkY1Nob3dTdGF0dXMoJ1VwZGF0ZSBmYWlsZWQ6ICcgKyBlLm1lc3NhZ2UsICdlcnJvcicpO1xuICAgICAgZGNBcHBseUJ0bi50ZXh0Q29udGVudCA9ICdVcGRhdGUgTm93JztcbiAgICAgIGRjQXBwbHlCdG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gZGNMb2FkSGlzdG9yeSgpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvc3lzdGVtL3VwZGF0ZS1oaXN0b3J5Jyk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGNvbnN0IGhpc3RvcnkgPSBkYXRhLnN1Y2Nlc3MgJiYgZGF0YS5oaXN0b3J5ID8gZGF0YS5oaXN0b3J5IDogW107XG4gICAgICBpZiAoaGlzdG9yeS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZGNIaXN0b3J5Q29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdUQ4M0RcdURDRTY8L3NwYW4+Tm8gc2VsZi11cGRhdGUgaGlzdG9yeS48L2Rpdj4nO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsZXQgaHRtbCA9ICc8dGFibGUgc3R5bGU9XCJ3aWR0aDogMTAwJTsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgZm9udC1zaXplOiAwLjgycmVtO1wiPic7XG4gICAgICBodG1sICs9ICc8dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj48dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+V2hlbjwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPlZlcnNpb248L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5Gcm9tPC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+U3RhdHVzPC90aD48L3RyPic7XG4gICAgICBmb3IgKGNvbnN0IGggb2YgaGlzdG9yeSkge1xuICAgICAgICBjb25zdCBzdCA9IGguc3RhdHVzID09PSAnc3VjY2VzcycgPyAnXHUyNzEzIHN1Y2Nlc3MnIDogaC5zdGF0dXMgPT09ICdwZW5kaW5nJyA/ICdcdTIzRjMgcGVuZGluZycgOiBoLnN0YXR1cyA9PT0gJ3BhcnRpYWwnID8gJ1x1MjZBMCBwYXJ0aWFsJyA6ICdcdTI3MTcgJyArIGguc3RhdHVzO1xuICAgICAgICBjb25zdCBzdENvbG9yID0gaC5zdGF0dXMgPT09ICdzdWNjZXNzJyA/ICd2YXIoLS1vay1mZyknIDogaC5zdGF0dXMgPT09ICdwZW5kaW5nJyA/ICd2YXIoLS1tdXRlZCknIDogJ3ZhcigtLWJhZC1mZyknO1xuICAgICAgICBodG1sICs9ICc8dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj4nO1xuICAgICAgICBodG1sICs9ICc8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+JyArIHRpbWVBZ28oaC50aW1lc3RhbXApICsgJzwvdGQ+JztcbiAgICAgICAgaHRtbCArPSAnPHRkIHN0eWxlPVwicGFkZGluZzogNnB4OyBmb250LXdlaWdodDogNTAwO1wiPnYnICsgZXNjYXBlSHRtbChoLnZlcnNpb24pICsgKGgucm9sbGJhY2sgPyAnIChyb2xsYmFjayknIDogJycpICsgJzwvdGQ+JztcbiAgICAgICAgaHRtbCArPSAnPHRkIHN0eWxlPVwicGFkZGluZzogNnB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPnYnICsgZXNjYXBlSHRtbChoLmZyb21WZXJzaW9uIHx8ICc/JykgKyAnPC90ZD4nO1xuICAgICAgICBodG1sICs9ICc8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7XCI+PHNwYW4gc3R5bGU9XCJjb2xvcjogJyArIHN0Q29sb3IgKyAnO1wiPicgKyBzdCArICc8L3NwYW4+PC90ZD4nO1xuICAgICAgICBodG1sICs9ICc8L3RyPic7XG4gICAgICAgIGlmIChoLmVycm9yKSB7XG4gICAgICAgICAgaHRtbCArPSAnPHRyPjx0ZCBjb2xzcGFuPVwiNFwiIHN0eWxlPVwicGFkZGluZzogNHB4IDZweCA4cHg7IGZvbnQtc2l6ZTogMC43OHJlbTsgY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+JyArIGVzY2FwZUh0bWwoaC5lcnJvcikgKyAnPC90ZD48L3RyPic7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGgubm90ZSkge1xuICAgICAgICAgIGh0bWwgKz0gJzx0cj48dGQgY29sc3Bhbj1cIjRcIiBzdHlsZT1cInBhZGRpbmc6IDRweCA2cHggOHB4OyBmb250LXNpemU6IDAuNzhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+JyArIGVzY2FwZUh0bWwoaC5ub3RlKSArICc8L3RkPjwvdHI+JztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaHRtbCArPSAnPC90YWJsZT4nO1xuICAgICAgZGNIaXN0b3J5Q29udGFpbmVyLmlubmVySFRNTCA9IGh0bWw7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZGNIaXN0b3J5Q29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPkZhaWxlZDogJyArIGVzY2FwZUh0bWwoZS5tZXNzYWdlKSArICc8L2Rpdj4nO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGRjU2hvd1JvbGxiYWNrKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9zeXN0ZW0vcm9sbGJhY2stdmVyc2lvbnMnKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgY29uc3QgdmVyc2lvbnMgPSBkYXRhLnN1Y2Nlc3MgJiYgZGF0YS52ZXJzaW9ucyA/IGRhdGEudmVyc2lvbnMgOiBbXTtcbiAgICAgIGlmICh2ZXJzaW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbignTm8gcm9sbGJhY2sgdmVyc2lvbnMgYXZhaWxhYmxlLicsICdpbmZvJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHZlcnNpb24gPSBwcm9tcHQoJ0F2YWlsYWJsZSByb2xsYmFjayB2ZXJzaW9uczpcXG4nICsgdmVyc2lvbnMuam9pbignXFxuJykgKyAnXFxuXFxuRW50ZXIgdmVyc2lvbiB0byByb2xsYmFjayB0bzonKTtcbiAgICAgIGlmICghdmVyc2lvbikgcmV0dXJuO1xuICAgICAgaWYgKCF2ZXJzaW9ucy5pbmNsdWRlcyh2ZXJzaW9uKSkge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdJbnZhbGlkIHZlcnNpb246ICcgKyB2ZXJzaW9uLCAnZXJyb3InKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKCFjb25maXJtKCdSb2xsYmFjayBEYXNoQ2FkZHkgdG8gdicgKyB2ZXJzaW9uICsgJz8gVGhlIGNvbnRhaW5lciB3aWxsIHJlc3RhcnQuJykpIHJldHVybjtcbiAgICAgIGRjU2hvd1N0YXR1cygnUm9sbGluZyBiYWNrIHRvIHYnICsgdmVyc2lvbiArICcuLi4nLCAnaW5mbycpO1xuICAgICAgY29uc3QgciA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL3N5c3RlbS9yb2xsYmFjaycsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHZlcnNpb24gfSlcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZCA9IGF3YWl0IHIuanNvbigpO1xuICAgICAgaWYgKGQuc3VjY2Vzcykge1xuICAgICAgICBkY1Nob3dTdGF0dXMoJ1JvbGxiYWNrIHRvIHYnICsgdmVyc2lvbiArICcgaW5pdGlhdGVkLiBDb250YWluZXIgd2lsbCByZXN0YXJ0LicsICdzdWNjZXNzJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZC5lcnJvciB8fCAnUm9sbGJhY2sgZmFpbGVkJyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZGNTaG93U3RhdHVzKCdSb2xsYmFjayBmYWlsZWQ6ICcgKyBlLm1lc3NhZ2UsICdlcnJvcicpO1xuICAgIH1cbiAgfVxuXG4gIGRjQ2hlY2tCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gZGNDaGVja0ZvclVwZGF0ZShmYWxzZSkpO1xuICBkY0FwcGx5QnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IGRjQXBwbHlVcGRhdGUoKS5jYXRjaCgoKSA9PiB7fSkpO1xuICBkY1JvbGxiYWNrQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGRjU2hvd1JvbGxiYWNrKTtcblxuICBjaGVja0J0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjaGVja0ZvclVwZGF0ZXMpO1xuICBvcGVuQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBtb2RhbD8uY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICAgIGxvYWRBdmFpbGFibGUoKTtcbiAgfSk7XG4gIHdpcmVNb2RhbChtb2RhbCwgY2FuY2VsQnRuKTtcblxuICAvLyBPcGVuIFVwZGF0ZSBNYW5hZ2VtZW50IG1vZGFsLCBvcHRpb25hbGx5IHNjcm9sbGVkIHRvIGEgc3BlY2lmaWMgYXBwXG4gIHdpbmRvdy5vcGVuVXBkYXRlTW9kYWwgPSBmdW5jdGlvbihhcHBJZCkge1xuICAgIG1vZGFsPy5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG4gICAgbG9hZEF2YWlsYWJsZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgaWYgKCFhcHBJZCkgcmV0dXJuO1xuICAgICAgLy8gU2Nyb2xsIHRvIGFuZCBoaWdobGlnaHQgdGhlIG1hdGNoaW5nIHJvd1xuICAgICAgY29uc3Qgcm93ID0gYXZhaWxhYmxlQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWFwcC1pZD1cIiR7YXBwSWR9XCJdYCk7XG4gICAgICBpZiAocm93KSB7XG4gICAgICAgIHJvdy5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnc21vb3RoJywgYmxvY2s6ICdjZW50ZXInIH0pO1xuICAgICAgICByb3cuc3R5bGUuYmFja2dyb3VuZCA9ICdyZ2JhKDI0OSwxMTUsMjIsMC4xNSknO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgcm93LnN0eWxlLmJhY2tncm91bmQgPSAnJzsgfSwgMzAwMCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgLy8gTGF6eS1sb2FkIHRhYnNcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtcGFuZWw9XCJ1cGRhdGVzLWhpc3RvcnlcIl0nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBsb2FkSGlzdG9yeSk7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXBhbmVsPVwidXBkYXRlcy1hdXRvXCJdJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbG9hZEF1dG9Db25maWcpO1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1wYW5lbD1cInVwZGF0ZXMtZGFzaGNhZGR5XCJdJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGRjTG9hZFZlcnNpb24oKTtcbiAgICBkY0xvYWRIaXN0b3J5KCk7XG4gICAgaWYgKCFkY0xhc3RDaGVjaykgZGNDaGVja0ZvclVwZGF0ZSh0cnVlKTtcbiAgfSk7XG5cbiAgd2luZG93LmRjQXBwbHlVcGRhdGUgPSBkY0FwcGx5VXBkYXRlO1xuICB3aW5kb3cuZGNDaGVja0ZvclVwZGF0ZSA9IGRjQ2hlY2tGb3JVcGRhdGU7XG5cbiAgLy8gTm9uLWJsb2NraW5nIGNoZWNrIG9uIHBhZ2UgbG9hZCBcdTIwMTQganVzdCBhZGRzIG5vdGlmaWNhdGlvbiBkb3QgaWYgdXBkYXRlIGF2YWlsYWJsZVxuICBzZXRUaW1lb3V0KCgpID0+IGRjQ2hlY2tGb3JVcGRhdGUodHJ1ZSksIDUwMDApO1xufSkoKTtcbjtcbi8vID09PT09PT09PT0gRE9DS0VSIFJFU09VUkNFUyAoVm9sdW1lcywgTmV0d29ya3MsIERpc2sgVXNhZ2UpID09PT09PT09PT1cbihmdW5jdGlvbigpIHtcbiAgaW5qZWN0TW9kYWwoJ2RvY2tlci1yZXNvdXJjZXMtbW9kYWwnLCBgPGRpdiBpZD1cImRvY2tlci1yZXNvdXJjZXMtbW9kYWxcIiBjbGFzcz1cIndlYXRoZXItbW9kYWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1jb250ZW50XCIgc3R5bGU9XCJtaW4td2lkdGg6IDc1MHB4OyBtYXgtd2lkdGg6IDk1MHB4O1wiPlxuICAgICAgPGgzPlx1RDgzRFx1REMzMyBEb2NrZXIgUmVzb3VyY2VzPC9oMz5cbiAgICAgIDxwIGNsYXNzPVwibW9kYWwtc3VidGl0bGVcIj5NYW5hZ2Ugdm9sdW1lcywgbmV0d29ya3MsIGFuZCB2aWV3IGRpc2sgdXNhZ2UuPC9wPlxuXG4gICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtdGFic1wiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwicGFuZWwtdGFiIGFjdGl2ZVwiIGRhdGEtcGFuZWw9XCJkci12b2x1bWVzXCI+Vm9sdW1lczwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwicGFuZWwtdGFiXCIgZGF0YS1wYW5lbD1cImRyLW5ldHdvcmtzXCI+TmV0d29ya3M8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInBhbmVsLXRhYlwiIGRhdGEtcGFuZWw9XCJkci1kaXNrXCI+RGlzayBVc2FnZTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gVm9sdW1lcyAtLT5cbiAgICAgIDxkaXYgaWQ9XCJkci12b2x1bWVzXCIgY2xhc3M9XCJwYW5lbC1zZWN0aW9uIGFjdGl2ZVwiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IG1hcmdpbi1ib3R0b206IDEycHg7XCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJkci12b2wtbmFtZVwiIHBsYWNlaG9sZGVyPVwiVm9sdW1lIG5hbWVcIiBzdHlsZT1cImZsZXg6IDE7IHBhZGRpbmc6IDZweCAxMHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgY29sb3I6IHZhcigtLWZnKTtcIiAvPlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJkci12b2wtY3JlYXRlXCIgY2xhc3M9XCJidG4tYWNjZW50LXNvbGlkXCIgc3R5bGU9XCJwYWRkaW5nOiA2cHggMTRweDsgZm9udC1zaXplOiAwLjgycmVtO1wiPkNyZWF0ZTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cImRyLXZvbC1saXN0XCIgY2xhc3M9XCJzY3JvbGwtY29udGFpbmVyXCIgc3R5bGU9XCJtYXgtaGVpZ2h0OiA0MDBweDtcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+IExvYWRpbmcuLi48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBOZXR3b3JrcyAtLT5cbiAgICAgIDxkaXYgaWQ9XCJkci1uZXR3b3Jrc1wiIGNsYXNzPVwicGFuZWwtc2VjdGlvblwiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IG1hcmdpbi1ib3R0b206IDEycHg7XCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJkci1uZXQtbmFtZVwiIHBsYWNlaG9sZGVyPVwiTmV0d29yayBuYW1lXCIgc3R5bGU9XCJmbGV4OiAxOyBwYWRkaW5nOiA2cHggMTBweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7XCIgLz5cbiAgICAgICAgICA8c2VsZWN0IGlkPVwiZHItbmV0LWRyaXZlclwiIHN0eWxlPVwicGFkZGluZzogNnB4IDEwcHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDZweDsgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBjb2xvcjogdmFyKC0tZmcpO1wiPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImJyaWRnZVwiPmJyaWRnZTwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIm92ZXJsYXlcIj5vdmVybGF5PC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiaG9zdFwiPmhvc3Q8L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiZHItbmV0LWNyZWF0ZVwiIGNsYXNzPVwiYnRuLWFjY2VudC1zb2xpZFwiIHN0eWxlPVwicGFkZGluZzogNnB4IDE0cHg7IGZvbnQtc2l6ZTogMC44MnJlbTtcIj5DcmVhdGU8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJkci1uZXQtbGlzdFwiIGNsYXNzPVwic2Nyb2xsLWNvbnRhaW5lclwiIHN0eWxlPVwibWF4LWhlaWdodDogNDAwcHg7XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJicmFuZC1zcGlubmVyXCI+PC9zcGFuPiBMb2FkaW5nLi4uPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gRGlzayBVc2FnZSAtLT5cbiAgICAgIDxkaXYgaWQ9XCJkci1kaXNrXCIgY2xhc3M9XCJwYW5lbC1zZWN0aW9uXCI+XG4gICAgICAgIDxkaXYgaWQ9XCJkci1kaXNrLWNvbnRlbnRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+IExvYWRpbmcuLi48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9ucyBtb2RhbC1mb290ZXItYmFyXCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJkci1jbG9zZVwiPkNsb3NlPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YCk7XG5cbiAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9ja2VyLXJlc291cmNlcy1tb2RhbCcpO1xuICBjb25zdCBvcGVuQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY2tlci1yZXNvdXJjZXMtYnRuJyk7XG4gIGNvbnN0IGNsb3NlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RyLWNsb3NlJyk7XG5cbiAgZnVuY3Rpb24gZm10Qnl0ZXMoYnl0ZXMpIHtcbiAgICBpZiAoIWJ5dGVzIHx8IGJ5dGVzID09PSAwKSByZXR1cm4gJzAgQic7XG4gICAgY29uc3QgdW5pdHMgPSBbJ0InLCAnS0InLCAnTUInLCAnR0InLCAnVEInXTtcbiAgICBjb25zdCBpID0gTWF0aC5mbG9vcihNYXRoLmxvZyhNYXRoLmFicyhieXRlcykpIC8gTWF0aC5sb2coMTAyNCkpO1xuICAgIHJldHVybiAoYnl0ZXMgLyBNYXRoLnBvdygxMDI0LCBpKSkudG9GaXhlZCgxKSArICcgJyArIHVuaXRzW2ldO1xuICB9XG5cbiAgLy8gPT09PT0gVk9MVU1FUyA9PT09PVxuICBhc3luYyBmdW5jdGlvbiBsb2FkVm9sdW1lcygpIHtcbiAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHItdm9sLWxpc3QnKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGdldEpTT04oJy9hcGkvdjEvZG9ja2VyL3ZvbHVtZXMnKTtcbiAgICAgIGNvbnN0IHZvbHMgPSBkYXRhLnZvbHVtZXMgfHwgW107XG4gICAgICBpZiAodm9scy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdUQ4M0RcdURDRTY8L3NwYW4+Tm8gdm9sdW1lcyBmb3VuZC48L2Rpdj4nO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsZXQgaHRtbCA9ICc8dGFibGUgc3R5bGU9XCJ3aWR0aDogMTAwJTsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgZm9udC1zaXplOiAwLjgycmVtO1wiPic7XG4gICAgICBodG1sICs9ICc8dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj48dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+TmFtZTwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogNnB4O1wiPkRyaXZlcjwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogNnB4O1wiPlNjb3BlPC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IHJpZ2h0O1wiPkFjdGlvbnM8L3RoPjwvdHI+JztcbiAgICAgIGZvciAoY29uc3QgdiBvZiB2b2xzKSB7XG4gICAgICAgIGNvbnN0IGlzU3lzdGVtID0gdi5uYW1lID09PSAnYnVpbGRraXQnIHx8IHYubmFtZS5sZW5ndGggPT09IDY0O1xuICAgICAgICBodG1sICs9IGA8dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7IGZvbnQtd2VpZ2h0OiA1MDA7IG1heC13aWR0aDogMzAwcHg7IG92ZXJmbG93OiBoaWRkZW47IHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOyB3aGl0ZS1zcGFjZTogbm93cmFwO1wiIHRpdGxlPVwiJHtlc2NhcGVIdG1sKHYubmFtZSl9XCI+JHtlc2NhcGVIdG1sKHYubmFtZS5sZW5ndGggPiA0MCA/IHYubmFtZS5zdWJzdHJpbmcoMCwgMzcpICsgJy4uLicgOiB2Lm5hbWUpfTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+JHtlc2NhcGVIdG1sKHYuZHJpdmVyKX08L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPiR7ZXNjYXBlSHRtbCh2LnNjb3BlKX08L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogcmlnaHQ7XCI+YDtcbiAgICAgICAgaWYgKCFpc1N5c3RlbSkge1xuICAgICAgICAgIGh0bWwgKz0gYDxidXR0b24gY2xhc3M9XCJkci12b2wtZGVsXCIgZGF0YS1uYW1lPVwiJHtlc2NhcGVIdG1sKHYubmFtZSl9XCIgc3R5bGU9XCJwYWRkaW5nOiAzcHggOHB4OyBmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPkRlbGV0ZTwvYnV0dG9uPmA7XG4gICAgICAgIH1cbiAgICAgICAgaHRtbCArPSBgPC90ZD48L3RyPmA7XG4gICAgICB9XG4gICAgICBodG1sICs9ICc8L3RhYmxlPic7XG4gICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gaHRtbDtcblxuICAgICAgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJy5kci12b2wtZGVsJykuZm9yRWFjaChidG4gPT4ge1xuICAgICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgaWYgKCFjb25maXJtKGBEZWxldGUgdm9sdW1lIFwiJHtidG4uZGF0YXNldC5uYW1lfVwiPyBEYXRhIHdpbGwgYmUgbG9zdC5gKSkgcmV0dXJuO1xuICAgICAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICcuLi4nO1xuICAgICAgICAgIGJ0bi5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGRlbGV0ZUFQSShgL2FwaS92MS9kb2NrZXIvdm9sdW1lcy8ke2VuY29kZVVSSUNvbXBvbmVudChidG4uZGF0YXNldC5uYW1lKX0/Zm9yY2U9dHJ1ZWApO1xuICAgICAgICAgICAgbG9hZFZvbHVtZXMoKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdEZWxldGUgZmFpbGVkOiAnICsgZS5tZXNzYWdlLCAnZXJyb3InKTtcbiAgICAgICAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICdEZWxldGUnO1xuICAgICAgICAgICAgYnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCIgc3R5bGU9XCJjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5GYWlsZWQ6ICR7ZXNjYXBlSHRtbChlLm1lc3NhZ2UpfTwvZGl2PmA7XG4gICAgfVxuICB9XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RyLXZvbC1jcmVhdGUnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbmFtZUlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RyLXZvbC1uYW1lJyk7XG4gICAgY29uc3QgbmFtZSA9IG5hbWVJbnB1dC52YWx1ZS50cmltKCk7XG4gICAgaWYgKCFuYW1lKSB7IHNob3dOb3RpZmljYXRpb24oJ0VudGVyIGEgdm9sdW1lIG5hbWUnLCAnd2FybmluZycpOyByZXR1cm47IH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgcG9zdEpTT04oJy9hcGkvdjEvZG9ja2VyL3ZvbHVtZXMnLCB7IG5hbWUgfSk7XG4gICAgICBuYW1lSW5wdXQudmFsdWUgPSAnJztcbiAgICAgIHNob3dOb3RpZmljYXRpb24oYFZvbHVtZSBcIiR7bmFtZX1cIiBjcmVhdGVkYCwgJ3N1Y2Nlc3MnKTtcbiAgICAgIGxvYWRWb2x1bWVzKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignQ3JlYXRlIGZhaWxlZDogJyArIGUubWVzc2FnZSwgJ2Vycm9yJyk7XG4gICAgfVxuICB9KTtcblxuICAvLyA9PT09PSBORVRXT1JLUyA9PT09PVxuICBhc3luYyBmdW5jdGlvbiBsb2FkTmV0d29ya3MoKSB7XG4gICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RyLW5ldC1saXN0Jyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBnZXRKU09OKCcvYXBpL3YxL2RvY2tlci9uZXR3b3JrcycpO1xuICAgICAgY29uc3QgbmV0cyA9IGRhdGEubmV0d29ya3MgfHwgW107XG4gICAgICBpZiAobmV0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdUQ4M0NcdURGMTA8L3NwYW4+Tm8gbmV0d29ya3MgZm91bmQuPC9kaXY+JztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbGV0IGh0bWwgPSAnPHRhYmxlIHN0eWxlPVwid2lkdGg6IDEwMCU7IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IGZvbnQtc2l6ZTogMC44MnJlbTtcIj4nO1xuICAgICAgaHRtbCArPSAnPHRyIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+PHRoIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPk5hbWU8L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDZweDtcIj5Ecml2ZXI8L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDZweDtcIj5TY29wZTwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogNnB4O1wiPkNvbnRhaW5lcnM8L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogcmlnaHQ7XCI+QWN0aW9uczwvdGg+PC90cj4nO1xuICAgICAgZm9yIChjb25zdCBuIG9mIG5ldHMpIHtcbiAgICAgICAgY29uc3QgaXNTeXN0ZW0gPSBbJ2JyaWRnZScsICdob3N0JywgJ25vbmUnXS5pbmNsdWRlcyhuLm5hbWUpO1xuICAgICAgICBodG1sICs9IGA8dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7IGZvbnQtd2VpZ2h0OiA1MDA7XCI+JHtlc2NhcGVIdG1sKG4ubmFtZSl9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6IHZhcigtLW11dGVkKTtcIj4ke2VzY2FwZUh0bWwobi5kcml2ZXIpfTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+JHtlc2NhcGVIdG1sKG4uc2NvcGUpfTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7XCI+JHtuLmNvbnRhaW5lcnN9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IHJpZ2h0O1wiPmA7XG4gICAgICAgIGlmICghaXNTeXN0ZW0pIHtcbiAgICAgICAgICBodG1sICs9IGA8YnV0dG9uIGNsYXNzPVwiZHItbmV0LWRlbFwiIGRhdGEtaWQ9XCIke2VzY2FwZUh0bWwobi5pZCl9XCIgZGF0YS1uYW1lPVwiJHtlc2NhcGVIdG1sKG4ubmFtZSl9XCIgc3R5bGU9XCJwYWRkaW5nOiAzcHggOHB4OyBmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPkRlbGV0ZTwvYnV0dG9uPmA7XG4gICAgICAgIH1cbiAgICAgICAgaHRtbCArPSBgPC90ZD48L3RyPmA7XG4gICAgICB9XG4gICAgICBodG1sICs9ICc8L3RhYmxlPic7XG4gICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gaHRtbDtcblxuICAgICAgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJy5kci1uZXQtZGVsJykuZm9yRWFjaChidG4gPT4ge1xuICAgICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgaWYgKCFjb25maXJtKGBEZWxldGUgbmV0d29yayBcIiR7YnRuLmRhdGFzZXQubmFtZX1cIj9gKSkgcmV0dXJuO1xuICAgICAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICcuLi4nO1xuICAgICAgICAgIGJ0bi5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGRlbGV0ZUFQSShgL2FwaS92MS9kb2NrZXIvbmV0d29ya3MvJHtlbmNvZGVVUklDb21wb25lbnQoYnRuLmRhdGFzZXQuaWQpfWApO1xuICAgICAgICAgICAgbG9hZE5ldHdvcmtzKCk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc2hvd05vdGlmaWNhdGlvbignRGVsZXRlIGZhaWxlZDogJyArIGUubWVzc2FnZSwgJ2Vycm9yJyk7XG4gICAgICAgICAgICBidG4udGV4dENvbnRlbnQgPSAnRGVsZXRlJztcbiAgICAgICAgICAgIGJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RmFpbGVkOiAke2VzY2FwZUh0bWwoZS5tZXNzYWdlKX08L2Rpdj5gO1xuICAgIH1cbiAgfVxuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkci1uZXQtY3JlYXRlJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG5hbWVJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkci1uZXQtbmFtZScpO1xuICAgIGNvbnN0IGRyaXZlclNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkci1uZXQtZHJpdmVyJyk7XG4gICAgY29uc3QgbmFtZSA9IG5hbWVJbnB1dC52YWx1ZS50cmltKCk7XG4gICAgaWYgKCFuYW1lKSB7IHNob3dOb3RpZmljYXRpb24oJ0VudGVyIGEgbmV0d29yayBuYW1lJywgJ3dhcm5pbmcnKTsgcmV0dXJuOyB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHBvc3RKU09OKCcvYXBpL3YxL2RvY2tlci9uZXR3b3JrcycsIHsgbmFtZSwgZHJpdmVyOiBkcml2ZXJTZWxlY3QudmFsdWUgfSk7XG4gICAgICBuYW1lSW5wdXQudmFsdWUgPSAnJztcbiAgICAgIHNob3dOb3RpZmljYXRpb24oYE5ldHdvcmsgXCIke25hbWV9XCIgY3JlYXRlZGAsICdzdWNjZXNzJyk7XG4gICAgICBsb2FkTmV0d29ya3MoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdDcmVhdGUgZmFpbGVkOiAnICsgZS5tZXNzYWdlLCAnZXJyb3InKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vID09PT09IERJU0sgVVNBR0UgPT09PT1cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZERpc2tVc2FnZSgpIHtcbiAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHItZGlzay1jb250ZW50Jyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBnZXRKU09OKCcvYXBpL3YxL2RvY2tlci9kaXNrLXVzYWdlJyk7XG4gICAgICBjb25zdCBzZWN0aW9ucyA9IFtcbiAgICAgICAgeyBsYWJlbDogJ0ltYWdlcycsIGljb246ICdcdUQ4M0RcdURDQzAnLCBjb3VudDogZGF0YS5pbWFnZXMuY291bnQsIHNpemU6IGRhdGEuaW1hZ2VzLnNpemUsIHJlY2xhaW1hYmxlOiBkYXRhLmltYWdlcy5yZWNsYWltYWJsZSB9LFxuICAgICAgICB7IGxhYmVsOiAnQ29udGFpbmVycycsIGljb246ICdcdUQ4M0RcdURDRTYnLCBjb3VudDogZGF0YS5jb250YWluZXJzLmNvdW50LCBzaXplOiBkYXRhLmNvbnRhaW5lcnMuc2l6ZSwgZXh0cmE6IGAke2RhdGEuY29udGFpbmVycy5ydW5uaW5nfSBydW5uaW5nYCB9LFxuICAgICAgICB7IGxhYmVsOiAnVm9sdW1lcycsIGljb246ICdcdUQ4M0RcdURDQkUnLCBjb3VudDogZGF0YS52b2x1bWVzLmNvdW50LCBzaXplOiBkYXRhLnZvbHVtZXMuc2l6ZSwgcmVjbGFpbWFibGU6IGRhdGEudm9sdW1lcy5yZWNsYWltYWJsZSB9LFxuICAgICAgICB7IGxhYmVsOiAnQnVpbGQgQ2FjaGUnLCBpY29uOiAnXHVEODNEXHVERDI3JywgY291bnQ6IGRhdGEuYnVpbGRDYWNoZS5jb3VudCwgc2l6ZTogZGF0YS5idWlsZENhY2hlLnNpemUsIHJlY2xhaW1hYmxlOiBkYXRhLmJ1aWxkQ2FjaGUucmVjbGFpbWFibGUgfSxcbiAgICAgIF07XG5cbiAgICAgIGxldCBodG1sID0gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDEuMXJlbTsgZm9udC13ZWlnaHQ6IDYwMDsgbWFyZ2luLWJvdHRvbTogMTZweDtcIj5Ub3RhbDogJHtmbXRCeXRlcyhkYXRhLnRvdGFsU2l6ZSl9PC9kaXY+YDtcbiAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnI7IGdhcDogMTJweDtcIj4nO1xuICAgICAgZm9yIChjb25zdCBzIG9mIHNlY3Rpb25zKSB7XG4gICAgICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAxNHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGJvcmRlci1yYWRpdXM6IDhweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5gO1xuICAgICAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6IDYwMDsgbWFyZ2luLWJvdHRvbTogNnB4O1wiPiR7cy5pY29ufSAke3MubGFiZWx9IDxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgZm9udC13ZWlnaHQ6IDQwMDsgZm9udC1zaXplOiAwLjgycmVtO1wiPigke3MuY291bnR9KTwvc3Bhbj48L2Rpdj5gO1xuICAgICAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAxLjFyZW07IGZvbnQtd2VpZ2h0OiA2MDA7IGNvbG9yOiB2YXIoLS1hY2NlbnQpO1wiPiR7Zm10Qnl0ZXMocy5zaXplKX08L2Rpdj5gO1xuICAgICAgICBpZiAocy5yZWNsYWltYWJsZSA+IDApIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNzhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+UmVjbGFpbWFibGU6ICR7Zm10Qnl0ZXMocy5yZWNsYWltYWJsZSl9PC9kaXY+YDtcbiAgICAgICAgaWYgKHMuZXh0cmEpIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNzhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+JHtzLmV4dHJhfTwvZGl2PmA7XG4gICAgICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gICAgICB9XG4gICAgICBodG1sICs9ICc8L2Rpdj4nO1xuICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IGh0bWw7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IGA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPkZhaWxlZDogJHtlc2NhcGVIdG1sKGUubWVzc2FnZSl9PC9kaXY+YDtcbiAgICB9XG4gIH1cblxuICAvLyBNb2RhbCBldmVudHNcbiAgb3BlbkJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgbW9kYWw/LmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgICBsb2FkVm9sdW1lcygpO1xuICB9KTtcbiAgd2lyZU1vZGFsKG1vZGFsLCBjbG9zZUJ0bik7XG5cbiAgLy8gTGF6eS1sb2FkIHRhYnNcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtcGFuZWw9XCJkci1uZXR3b3Jrc1wiXScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGxvYWROZXR3b3Jrcyk7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXBhbmVsPVwiZHItZGlza1wiXScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGxvYWREaXNrVXNhZ2UpO1xufSkoKTtcbjtcbi8vID09PT09PT09PT0gRE9DS0VSIENPTVBPU0UgSU1QT1JUID09PT09PT09PT1cbihmdW5jdGlvbigpIHtcbiAgaW5qZWN0TW9kYWwoJ2NvbXBvc2UtaW1wb3J0LW1vZGFsJywgYDxkaXYgaWQ9XCJjb21wb3NlLWltcG9ydC1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogNjUwcHg7IG1heC13aWR0aDogODAwcHg7XCI+XG4gICAgICA8aDM+XHVEODNEXHVEQ0U2IEltcG9ydCBEb2NrZXIgQ29tcG9zZTwvaDM+XG4gICAgICA8cCBjbGFzcz1cIm1vZGFsLXN1YnRpdGxlXCI+UGFzdGUgYSBkb2NrZXItY29tcG9zZS55bWwgdG8gaW1wb3J0IGFuZCBkZXBsb3kgc2VydmljZXMuPC9wPlxuXG4gICAgICA8IS0tIFN0ZXAgMTogUGFzdGUgWUFNTCAtLT5cbiAgICAgIDxkaXYgaWQ9XCJjb21wb3NlLXN0ZXAtcGFzdGVcIj5cbiAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDEycHg7XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbC1hY2NlbnQtc21cIj5TdGFjayBOYW1lPC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImNvbXBvc2Utc3RhY2stbmFtZVwiIHBsYWNlaG9sZGVyPVwibXktc3RhY2tcIiB2YWx1ZT1cIlwiIHN0eWxlPVwid2lkdGg6IDEwMCU7IHBhZGRpbmc6IDhweCAxMHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgY29sb3I6IHZhcigtLWZnKTtcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDEycHg7XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbC1hY2NlbnQtc21cIj5kb2NrZXItY29tcG9zZS55bWw8L2xhYmVsPlxuICAgICAgICAgIDx0ZXh0YXJlYSBpZD1cImNvbXBvc2UteWFtbFwiIHJvd3M9XCIxNFwiIHBsYWNlaG9sZGVyPVwidmVyc2lvbjogJzMnJiMxMDtzZXJ2aWNlczomIzEwOyAgd2ViOiYjMTA7ICAgIGltYWdlOiBuZ2lueDpsYXRlc3QmIzEwOyAgICBwb3J0czomIzEwOyAgICAgIC0gJzgwODA6ODAnXCIgc3R5bGU9XCJ3aWR0aDogMTAwJTsgcGFkZGluZzogMTBweDsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgZm9udC1zaXplOiAwLjgycmVtOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgcmVzaXplOiB2ZXJ0aWNhbDtcIj48L3RleHRhcmVhPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiA2cHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgc3R5bGU9XCJkaXNwbGF5OiBpbmxpbmUtZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA2cHg7IGN1cnNvcjogcG9pbnRlcjsgZm9udC1zaXplOiAwLjgycmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImZpbGVcIiBpZD1cImNvbXBvc2UtZmlsZS11cGxvYWRcIiBhY2NlcHQ9XCIueW1sLC55YW1sXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiIC8+XG4gICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwidGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XCI+b3IgdXBsb2FkIGEgZmlsZTwvc3Bhbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zIG1vZGFsLWZvb3Rlci1iYXJcIj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiY29tcG9zZS1wYXJzZS1idG5cIiBjbGFzcz1cImJ0bi1hY2NlbnQtc29saWRcIiBzdHlsZT1cInBhZGRpbmc6IDhweCAyMHB4O1wiPlBhcnNlICYgUHJldmlldzwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJjb21wb3NlLWNhbmNlbFwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFN0ZXAgMjogUHJldmlldyAtLT5cbiAgICAgIDxkaXYgaWQ9XCJjb21wb3NlLXN0ZXAtcHJldmlld1wiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj5cbiAgICAgICAgPGRpdiBpZD1cImNvbXBvc2UtcHJldmlldy1jb250ZW50XCI+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWJ1dHRvbnMgbW9kYWwtZm9vdGVyLWJhclwiIHN0eWxlPVwibWFyZ2luLXRvcDogMTZweDtcIj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiY29tcG9zZS1kZXBsb3ktYnRuXCIgY2xhc3M9XCJidG4tYWNjZW50LXNvbGlkXCIgc3R5bGU9XCJwYWRkaW5nOiA4cHggMjBweDtcIj5EZXBsb3kgQWxsPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImNvbXBvc2UtYmFjay1idG5cIj5CYWNrPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gU3RlcCAzOiBQcm9ncmVzcyAtLT5cbiAgICAgIDxkaXYgaWQ9XCJjb21wb3NlLXN0ZXAtcHJvZ3Jlc3NcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+XG4gICAgICAgIDxkaXYgaWQ9XCJjb21wb3NlLXByb2dyZXNzLWNvbnRlbnRcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5gKTtcblxuICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb21wb3NlLWltcG9ydC1tb2RhbCcpO1xuICBjb25zdCBvcGVuQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbXBvc2UtaW1wb3J0LWJ0bicpO1xuICBjb25zdCBjYW5jZWxCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29tcG9zZS1jYW5jZWwnKTtcblxuICB3aXJlTW9kYWwobW9kYWwsIGNhbmNlbEJ0bik7XG5cbiAgbGV0IHBhcnNlZERhdGEgPSBudWxsO1xuXG4gIGZ1bmN0aW9uIHNob3dTdGVwKHN0ZXApIHtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29tcG9zZS1zdGVwLXBhc3RlJykuc3R5bGUuZGlzcGxheSA9IHN0ZXAgPT09ICdwYXN0ZScgPyAnJyA6ICdub25lJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29tcG9zZS1zdGVwLXByZXZpZXcnKS5zdHlsZS5kaXNwbGF5ID0gc3RlcCA9PT0gJ3ByZXZpZXcnID8gJycgOiAnbm9uZSc7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbXBvc2Utc3RlcC1wcm9ncmVzcycpLnN0eWxlLmRpc3BsYXkgPSBzdGVwID09PSAncHJvZ3Jlc3MnID8gJycgOiAnbm9uZSc7XG4gIH1cblxuICBvcGVuQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBzaG93U3RlcCgncGFzdGUnKTtcbiAgICBwYXJzZWREYXRhID0gbnVsbDtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29tcG9zZS15YW1sJykudmFsdWUgPSAnJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29tcG9zZS1zdGFjay1uYW1lJykudmFsdWUgPSAnJztcbiAgICBtb2RhbD8uY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICB9KTtcblxuICAvLyBGaWxlIHVwbG9hZFxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29tcG9zZS1maWxlLXVwbG9hZCcpPy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoZSkgPT4ge1xuICAgIGNvbnN0IGZpbGUgPSBlLnRhcmdldC5maWxlc1swXTtcbiAgICBpZiAoIWZpbGUpIHJldHVybjtcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiB7IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb21wb3NlLXlhbWwnKS52YWx1ZSA9IHJlYWRlci5yZXN1bHQ7IH07XG4gICAgcmVhZGVyLnJlYWRBc1RleHQoZmlsZSk7XG4gIH0pO1xuXG4gIC8vIFBhcnNlXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb21wb3NlLXBhcnNlLWJ0bicpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB5YW1sU3RyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbXBvc2UteWFtbCcpLnZhbHVlLnRyaW0oKTtcbiAgICBjb25zdCBzdGFja05hbWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29tcG9zZS1zdGFjay1uYW1lJykudmFsdWUudHJpbSgpIHx8ICdzdGFjayc7XG4gICAgaWYgKCF5YW1sU3RyKSB7IHNob3dOb3RpZmljYXRpb24oJ1Bhc3RlIGEgZG9ja2VyLWNvbXBvc2UueW1sJywgJ3dhcm5pbmcnKTsgcmV0dXJuOyB9XG5cbiAgICBjb25zdCBidG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29tcG9zZS1wYXJzZS1idG4nKTtcbiAgICBjb25zdCBvcmlnVGV4dCA9IGJ0bi50ZXh0Q29udGVudDtcbiAgICBidG4udGV4dENvbnRlbnQgPSAnUGFyc2luZy4uLic7XG4gICAgYnRuLmRpc2FibGVkID0gdHJ1ZTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcG9zdEpTT04oJy9hcGkvdjEvYXBwcy9pbXBvcnQtY29tcG9zZScsIHsgeWFtbDogeWFtbFN0ciwgc3RhY2tOYW1lIH0pO1xuICAgICAgcGFyc2VkRGF0YSA9IGRhdGE7XG4gICAgICBwYXJzZWREYXRhLnN0YWNrTmFtZSA9IHN0YWNrTmFtZTtcbiAgICAgIHJlbmRlclByZXZpZXcoZGF0YSk7XG4gICAgICBzaG93U3RlcCgncHJldmlldycpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ1BhcnNlIGZhaWxlZDogJyArIGUubWVzc2FnZSwgJ2Vycm9yJyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGJ0bi50ZXh0Q29udGVudCA9IG9yaWdUZXh0O1xuICAgICAgYnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgfVxuICB9KTtcblxuICBmdW5jdGlvbiByZW5kZXJQcmV2aWV3KGRhdGEpIHtcbiAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29tcG9zZS1wcmV2aWV3LWNvbnRlbnQnKTtcbiAgICBsZXQgaHRtbCA9ICcnO1xuXG4gICAgaWYgKGRhdGEubmV0d29ya3MgJiYgZGF0YS5uZXR3b3Jrcy5sZW5ndGggPiAwKSB7XG4gICAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMTJweDsgZm9udC1zaXplOiAwLjgycmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPk5ldHdvcmtzOiAke2RhdGEubmV0d29ya3MubWFwKG4gPT4gYDxjb2RlPiR7ZXNjYXBlSHRtbChuKX08L2NvZGU+YCkuam9pbignLCAnKX08L2Rpdj5gO1xuICAgIH1cbiAgICBpZiAoZGF0YS52b2x1bWVzICYmIGRhdGEudm9sdW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMTJweDsgZm9udC1zaXplOiAwLjgycmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPlZvbHVtZXM6ICR7ZGF0YS52b2x1bWVzLm1hcCh2ID0+IGA8Y29kZT4ke2VzY2FwZUh0bWwodil9PC9jb2RlPmApLmpvaW4oJywgJyl9PC9kaXY+YDtcbiAgICB9XG5cbiAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6IDYwMDsgbWFyZ2luLWJvdHRvbTogOHB4O1wiPiR7ZGF0YS5zZXJ2aWNlcy5sZW5ndGh9IHNlcnZpY2Uocyk8L2Rpdj5gO1xuICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9XCJzY3JvbGwtY29udGFpbmVyXCIgc3R5bGU9XCJtYXgtaGVpZ2h0OiAzNTBweDtcIj4nO1xuXG4gICAgZm9yIChjb25zdCBzdmMgb2YgZGF0YS5zZXJ2aWNlcykge1xuICAgICAgY29uc3QgYm9yZGVyQ29sb3IgPSBzdmMuc2tpcCA/ICd2YXIoLS1iYWQtZmcpJyA6ICd2YXIoLS1ib3JkZXIpJztcbiAgICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAxMHB4IDE0cHg7IGJvcmRlcjogMXB4IHNvbGlkICR7Ym9yZGVyQ29sb3J9OyBib3JkZXItcmFkaXVzOiA4cHg7IG1hcmdpbi1ib3R0b206IDhweDsgYmFja2dyb3VuZDogdmFyKC0tYmcpO1wiPmA7XG4gICAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6IDYwMDsgZm9udC1zaXplOiAwLjlyZW07XCI+JHtlc2NhcGVIdG1sKHN2Yy5uYW1lKX1gO1xuICAgICAgaWYgKHN2Yy5za2lwKSBodG1sICs9IGAgPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tYmFkLWZnKTsgZm9udC13ZWlnaHQ6IDQwMDsgZm9udC1zaXplOiAwLjc4cmVtO1wiPlx1MjAxNCBza2lwcGVkOiAke2VzY2FwZUh0bWwoc3ZjLnJlYXNvbil9PC9zcGFuPmA7XG4gICAgICBodG1sICs9IGA8L2Rpdj5gO1xuXG4gICAgICBpZiAoIXN2Yy5za2lwKSB7XG4gICAgICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLXRvcDogNHB4O1wiPkltYWdlOiA8Y29kZT4ke2VzY2FwZUh0bWwoc3ZjLmltYWdlKX08L2NvZGU+PC9kaXY+YDtcbiAgICAgICAgaWYgKHN2Yy5wb3J0cz8ubGVuZ3RoKSBodG1sICs9IGA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+UG9ydHM6ICR7c3ZjLnBvcnRzLm1hcChwID0+IGAke3AuaG9zdH06JHtwLmNvbnRhaW5lcn1gKS5qb2luKCcsICcpfTwvZGl2PmA7XG4gICAgICAgIGlmIChzdmMudm9sdW1lcz8ubGVuZ3RoKSBodG1sICs9IGA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+Vm9sdW1lczogJHtzdmMudm9sdW1lcy5sZW5ndGh9PC9kaXY+YDtcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHN2Yy5lbnZpcm9ubWVudCB8fCB7fSkubGVuZ3RoKSBodG1sICs9IGA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+RW52IHZhcnM6ICR7T2JqZWN0LmtleXMoc3ZjLmVudmlyb25tZW50KS5sZW5ndGh9PC9kaXY+YDtcbiAgICAgICAgaWYgKHN2Yy5lbnZGaWxlV2FybmluZykgaHRtbCArPSBgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC43OHJlbTsgY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+XHUyNkEwICR7ZXNjYXBlSHRtbChzdmMuZW52RmlsZVdhcm5pbmcpfTwvZGl2PmA7XG4gICAgICAgIGlmIChzdmMucmVzb3VyY2VzPy5jcHVzIHx8IHN2Yy5yZXNvdXJjZXM/Lm1lbW9yeSkge1xuICAgICAgICAgIGNvbnN0IHBhcnRzID0gW107XG4gICAgICAgICAgaWYgKHN2Yy5yZXNvdXJjZXMuY3B1cykgcGFydHMucHVzaChgQ1BVOiAke3N2Yy5yZXNvdXJjZXMuY3B1c31gKTtcbiAgICAgICAgICBpZiAoc3ZjLnJlc291cmNlcy5tZW1vcnkpIHBhcnRzLnB1c2goYE1lbTogJHtzdmMucmVzb3VyY2VzLm1lbW9yeX1NQmApO1xuICAgICAgICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5MaW1pdHM6ICR7cGFydHMuam9pbignLCAnKX08L2Rpdj5gO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gICAgfVxuICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gICAgY29udGFpbmVyLmlubmVySFRNTCA9IGh0bWw7XG4gIH1cblxuICAvLyBCYWNrIGJ1dHRvblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29tcG9zZS1iYWNrLWJ0bicpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHNob3dTdGVwKCdwYXN0ZScpKTtcblxuICAvLyBEZXBsb3lcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbXBvc2UtZGVwbG95LWJ0bicpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIXBhcnNlZERhdGEpIHJldHVybjtcblxuICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb21wb3NlLWRlcGxveS1idG4nKTtcbiAgICBidG4udGV4dENvbnRlbnQgPSAnRGVwbG95aW5nLi4uJztcbiAgICBidG4uZGlzYWJsZWQgPSB0cnVlO1xuICAgIHNob3dTdGVwKCdwcm9ncmVzcycpO1xuXG4gICAgY29uc3QgcHJvZ3Jlc3NFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb21wb3NlLXByb2dyZXNzLWNvbnRlbnQnKTtcbiAgICBwcm9ncmVzc0VsLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+IERlcGxveWluZyBzZXJ2aWNlcy4uLjwvZGl2Pic7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcG9zdEpTT04oJy9hcGkvdjEvYXBwcy9kZXBsb3ktY29tcG9zZScsIHtcbiAgICAgICAgc2VydmljZXM6IHBhcnNlZERhdGEuc2VydmljZXMsXG4gICAgICAgIG5ldHdvcmtzOiBwYXJzZWREYXRhLm5ldHdvcmtzLFxuICAgICAgICBzdGFja05hbWU6IHBhcnNlZERhdGEuc3RhY2tOYW1lXG4gICAgICB9KTtcblxuICAgICAgbGV0IGh0bWwgPSBgPGRpdiBzdHlsZT1cImZvbnQtd2VpZ2h0OiA2MDA7IG1hcmdpbi1ib3R0b206IDEycHg7XCI+U3RhY2sgXCIke2VzY2FwZUh0bWwocmVzdWx0LnN0YWNrTmFtZSl9XCIgXHUyMDE0IERlcGxveW1lbnQgQ29tcGxldGU8L2Rpdj5gO1xuICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz1cInNjcm9sbC1jb250YWluZXJcIiBzdHlsZT1cIm1heC1oZWlnaHQ6IDM1MHB4O1wiPic7XG5cbiAgICAgIGZvciAoY29uc3QgciBvZiByZXN1bHQucmVzdWx0cykge1xuICAgICAgICBjb25zdCBpY29uID0gci5zdGF0dXMgPT09ICdkZXBsb3llZCcgfHwgci5zdGF0dXMgPT09ICdjcmVhdGVkJyA/ICdcdTI3MDUnIDogci5zdGF0dXMgPT09ICdleGlzdHMnID8gJ1x1MjZBMScgOiByLnN0YXR1cyA9PT0gJ3NraXBwZWQnID8gJ1x1MjNFRCcgOiAnXHUyNzRDJztcbiAgICAgICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDhweCAxMnB4OyBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgZm9udC1zaXplOiAwLjg1cmVtO1wiPmA7XG4gICAgICAgIGh0bWwgKz0gYCR7aWNvbn0gPHN0cm9uZz4ke2VzY2FwZUh0bWwoci5uYW1lKX08L3N0cm9uZz4gKCR7ci50eXBlfSkgXHUyMDE0ICR7ZXNjYXBlSHRtbChyLnN0YXR1cyl9YDtcbiAgICAgICAgaWYgKHIuZXJyb3IpIGh0bWwgKz0gYCA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPiR7ZXNjYXBlSHRtbChyLmVycm9yKX08L3NwYW4+YDtcbiAgICAgICAgaWYgKHIuc3ViZG9tYWluKSBodG1sICs9IGAgXHUyMTkyIDxjb2RlPiR7ZXNjYXBlSHRtbChyLnN1YmRvbWFpbil9PC9jb2RlPmA7XG4gICAgICAgIGlmIChyLnJlYXNvbikgaHRtbCArPSBgIDxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj4oJHtlc2NhcGVIdG1sKHIucmVhc29uKX0pPC9zcGFuPmA7XG4gICAgICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gICAgICB9XG4gICAgICBodG1sICs9ICc8L2Rpdj4nO1xuICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9ucyBtb2RhbC1mb290ZXItYmFyXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAxNnB4O1wiPjxidXR0b24gaWQ9XCJjb21wb3NlLWRvbmUtYnRuXCI+RG9uZTwvYnV0dG9uPjwvZGl2Pic7XG5cbiAgICAgIHByb2dyZXNzRWwuaW5uZXJIVE1MID0gaHRtbDtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb21wb3NlLWRvbmUtYnRuJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICBtb2RhbD8uY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdy5sb2FkU2VydmljZXMgPT09ICdmdW5jdGlvbicpIHdpbmRvdy5sb2FkU2VydmljZXMoKS50aGVuKCgpID0+IHsgaWYgKHR5cGVvZiB3aW5kb3cuYnVpbGRHcmlkID09PSAnZnVuY3Rpb24nKSB3aW5kb3cuYnVpbGRHcmlkKCk7IH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHNob3dOb3RpZmljYXRpb24oYFN0YWNrIFwiJHtyZXN1bHQuc3RhY2tOYW1lfVwiIGRlcGxveWVkYCwgJ3N1Y2Nlc3MnKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBwcm9ncmVzc0VsLmlubmVySFRNTCA9IGA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPkRlcGxveW1lbnQgZmFpbGVkOiAke2VzY2FwZUh0bWwoZS5tZXNzYWdlKX08L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9ucyBtb2RhbC1mb290ZXItYmFyXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAxNnB4O1wiPjxidXR0b24gaWQ9XCJjb21wb3NlLXJldHJ5LWJ0blwiPkJhY2s8L2J1dHRvbj48L2Rpdj5gO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbXBvc2UtcmV0cnktYnRuJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gc2hvd1N0ZXAoJ3Bhc3RlJykpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBidG4udGV4dENvbnRlbnQgPSAnRGVwbG95IEFsbCc7XG4gICAgICBidG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICB9XG4gIH0pO1xufSkoKTtcbjtcbi8vID09PT09PT09PT0gQ09OVEFJTkVSIEVYRUMgLyBTSEVMTCAoV2ViU29ja2V0ICsgeHRlcm0uanMpID09PT09PT09PT1cbihmdW5jdGlvbigpIHtcbiAgaW5qZWN0TW9kYWwoJ2V4ZWMtbW9kYWwnLCBgPGRpdiBpZD1cImV4ZWMtbW9kYWxcIiBjbGFzcz1cIndlYXRoZXItbW9kYWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1jb250ZW50XCIgc3R5bGU9XCJtaW4td2lkdGg6IDcwMHB4OyBtYXgtd2lkdGg6IDkwMHB4OyBwYWRkaW5nLWJvdHRvbTogMDtcIj5cbiAgICAgIDxoMyBpZD1cImV4ZWMtdGl0bGVcIj5UZXJtaW5hbDwvaDM+XG4gICAgICA8ZGl2IGlkPVwiZXhlYy10ZXJtaW5hbFwiIHN0eWxlPVwiaGVpZ2h0OiA0MjBweDsgYm9yZGVyLXJhZGl1czogNnB4OyBvdmVyZmxvdzogaGlkZGVuOyBiYWNrZ3JvdW5kOiAjMWUxZTFlO1wiPjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9ucyBtb2RhbC1mb290ZXItYmFyXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiA4cHg7IHBhZGRpbmctYm90dG9tOiAxMnB4O1wiPlxuICAgICAgICA8YnV0dG9uIGlkPVwiZXhlYy1jbG9zZVwiPkNsb3NlPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YCk7XG5cbiAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhlYy1tb2RhbCcpO1xuICBjb25zdCB0ZXJtRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhlYy10ZXJtaW5hbCcpO1xuICBjb25zdCBjbG9zZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleGVjLWNsb3NlJyk7XG5cbiAgbGV0IHRlcm0gPSBudWxsO1xuICBsZXQgd3MgPSBudWxsO1xuICBsZXQgZml0QWRkb24gPSBudWxsO1xuXG4gIGZ1bmN0aW9uIGNsZWFudXAoKSB7XG4gICAgaWYgKHdzKSB7IHRyeSB7IHdzLmNsb3NlKCk7IH0gY2F0Y2ggKF8pIHt9IHdzID0gbnVsbDsgfVxuICAgIGlmICh0ZXJtKSB7IHRyeSB7IHRlcm0uZGlzcG9zZSgpOyB9IGNhdGNoIChfKSB7fSB0ZXJtID0gbnVsbDsgfVxuICAgIGZpdEFkZG9uID0gbnVsbDtcbiAgICB0ZXJtRWwuaW5uZXJIVE1MID0gJyc7XG4gIH1cblxuICBmdW5jdGlvbiBvcGVuRXhlYyhjb250YWluZXJJZCwgY29udGFpbmVyTmFtZSkge1xuICAgIGNsZWFudXAoKTtcblxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleGVjLXRpdGxlJykudGV4dENvbnRlbnQgPSBgVGVybWluYWwgXHUyMDE0ICR7Y29udGFpbmVyTmFtZSB8fCBjb250YWluZXJJZH1gO1xuICAgIG1vZGFsPy5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG5cbiAgICAvLyBFbnN1cmUgeHRlcm0gaXMgYXZhaWxhYmxlXG4gICAgaWYgKHR5cGVvZiBUZXJtaW5hbCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRlcm1FbC5pbm5lckhUTUwgPSAnPGRpdiBzdHlsZT1cImNvbG9yOiAjZjQ0OyBwYWRkaW5nOiAyMHB4OyBmb250LWZhbWlseTogbW9ub3NwYWNlO1wiPnh0ZXJtLmpzIG5vdCBsb2FkZWQ8L2Rpdj4nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRlcm0gPSBuZXcgVGVybWluYWwoe1xuICAgICAgY3Vyc29yQmxpbms6IHRydWUsXG4gICAgICBmb250U2l6ZTogMTQsXG4gICAgICBmb250RmFtaWx5OiBcIidDYXNjYWRpYSBDb2RlJywgJ0ZpcmEgQ29kZScsICdDb25zb2xhcycsIG1vbm9zcGFjZVwiLFxuICAgICAgdGhlbWU6IHtcbiAgICAgICAgYmFja2dyb3VuZDogJyMxZTFlMWUnLFxuICAgICAgICBmb3JlZ3JvdW5kOiAnI2Q0ZDRkNCcsXG4gICAgICAgIGN1cnNvcjogJyNhZWFmYWQnLFxuICAgICAgICBzZWxlY3Rpb25CYWNrZ3JvdW5kOiAnIzI2NGY3OCcsXG4gICAgICB9LFxuICAgICAgc2Nyb2xsYmFjazogNTAwMCxcbiAgICB9KTtcblxuICAgIC8vIEZpdCBhZGRvblxuICAgIGlmICh0eXBlb2YgRml0QWRkb24gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBmaXRBZGRvbiA9IG5ldyBGaXRBZGRvbi5GaXRBZGRvbigpO1xuICAgICAgdGVybS5sb2FkQWRkb24oZml0QWRkb24pO1xuICAgIH1cblxuICAgIHRlcm0ub3Blbih0ZXJtRWwpO1xuICAgIGlmIChmaXRBZGRvbikge1xuICAgICAgLy8gU21hbGwgZGVsYXkgZm9yIERPTSB0byBzZXR0bGVcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gZml0QWRkb24uZml0KCksIDUwKTtcbiAgICB9XG5cbiAgICAvLyBDb25uZWN0IFdlYlNvY2tldFxuICAgIGNvbnN0IHByb3RvY29sID0gbG9jYXRpb24ucHJvdG9jb2wgPT09ICdodHRwczonID8gJ3dzczonIDogJ3dzOic7XG4gICAgd3MgPSBuZXcgV2ViU29ja2V0KGAke3Byb3RvY29sfS8vJHtsb2NhdGlvbi5ob3N0fS93cy9leGVjLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGNvbnRhaW5lcklkKX1gKTtcbiAgICB3cy5iaW5hcnlUeXBlID0gJ2FycmF5YnVmZmVyJztcblxuICAgIHdzLm9ub3BlbiA9ICgpID0+IHtcbiAgICAgIHRlcm0ud3JpdGVsbignXFx4MWJbMzJtQ29ubmVjdGluZy4uLlxceDFiWzBtJyk7XG4gICAgICAvLyBTZW5kIGluaXRpYWwgcmVzaXplXG4gICAgICBpZiAoZml0QWRkb24pIHtcbiAgICAgICAgY29uc3QgZGltcyA9IGZpdEFkZG9uLnByb3Bvc2VEaW1lbnNpb25zKCk7XG4gICAgICAgIGlmIChkaW1zKSB7XG4gICAgICAgICAgd3Muc2VuZChKU09OLnN0cmluZ2lmeSh7IHR5cGU6ICdyZXNpemUnLCBjb2xzOiBkaW1zLmNvbHMsIHJvd3M6IGRpbXMucm93cyB9KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgd3Mub25tZXNzYWdlID0gKGUpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgZS5kYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IG1zZyA9IEpTT04ucGFyc2UoZS5kYXRhKTtcbiAgICAgICAgICBpZiAobXNnLnR5cGUgPT09ICdjb25uZWN0ZWQnKSB7XG4gICAgICAgICAgICB0ZXJtLndyaXRlbG4oYFxceDFiWzMybUNvbm5lY3RlZCAoJHttc2cuc2hlbGx9KVxceDFiWzBtXFxyXFxuYCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChtc2cudHlwZSA9PT0gJ2Vycm9yJykge1xuICAgICAgICAgICAgdGVybS53cml0ZWxuKGBcXHgxYlszMW1FcnJvcjogJHttc2cubWVzc2FnZX1cXHgxYlswbWApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobXNnLnR5cGUgPT09ICdleGl0Jykge1xuICAgICAgICAgICAgdGVybS53cml0ZWxuKCdcXHJcXG5cXHgxYlszM21TZXNzaW9uIGVuZGVkLlxceDFiWzBtJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChfKSB7fVxuICAgICAgICAvLyBQbGFpbiB0ZXh0XG4gICAgICAgIHRlcm0ud3JpdGUoZS5kYXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEJpbmFyeSBkYXRhXG4gICAgICAgIHRlcm0ud3JpdGUobmV3IFVpbnQ4QXJyYXkoZS5kYXRhKSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHdzLm9uY2xvc2UgPSAoKSA9PiB7XG4gICAgICBpZiAodGVybSkgdGVybS53cml0ZWxuKCdcXHJcXG5cXHgxYlszM21EaXNjb25uZWN0ZWQuXFx4MWJbMG0nKTtcbiAgICB9O1xuXG4gICAgd3Mub25lcnJvciA9ICgpID0+IHtcbiAgICAgIGlmICh0ZXJtKSB0ZXJtLndyaXRlbG4oJ1xcclxcblxceDFiWzMxbUNvbm5lY3Rpb24gZXJyb3IuXFx4MWJbMG0nKTtcbiAgICB9O1xuXG4gICAgLy8gVGVybWluYWwgaW5wdXQgXHUyMTkyIFdlYlNvY2tldFxuICAgIHRlcm0ub25EYXRhKChkYXRhKSA9PiB7XG4gICAgICBpZiAod3MgJiYgd3MucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0Lk9QRU4pIHtcbiAgICAgICAgd3Muc2VuZChkYXRhKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIEhhbmRsZSByZXNpemVcbiAgICB0ZXJtLm9uUmVzaXplKCh7IGNvbHMsIHJvd3MgfSkgPT4ge1xuICAgICAgaWYgKHdzICYmIHdzLnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5PUEVOKSB7XG4gICAgICAgIHdzLnNlbmQoSlNPTi5zdHJpbmdpZnkoeyB0eXBlOiAncmVzaXplJywgY29scywgcm93cyB9KSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBSZS1maXQgb24gd2luZG93IHJlc2l6ZVxuICAgIGNvbnN0IHJlc2l6ZUhhbmRsZXIgPSAoKSA9PiB7IGlmIChmaXRBZGRvbikgZml0QWRkb24uZml0KCk7IH07XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHJlc2l6ZUhhbmRsZXIpO1xuXG4gICAgLy8gU3RvcmUgaGFuZGxlciBmb3IgY2xlYW51cFxuICAgIG1vZGFsLl9yZXNpemVIYW5kbGVyID0gcmVzaXplSGFuZGxlcjtcbiAgfVxuXG4gIGNsb3NlQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBjbGVhbnVwKCk7XG4gICAgaWYgKG1vZGFsLl9yZXNpemVIYW5kbGVyKSB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgbW9kYWwuX3Jlc2l6ZUhhbmRsZXIpO1xuICAgIH1cbiAgICBtb2RhbD8uY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICB9KTtcblxuICAvLyBBbHNvIGNsb3NlIG9uIGJhY2tkcm9wIGNsaWNrXG4gIG1vZGFsPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgaWYgKGUudGFyZ2V0ID09PSBtb2RhbCkge1xuICAgICAgY2xlYW51cCgpO1xuICAgICAgaWYgKG1vZGFsLl9yZXNpemVIYW5kbGVyKSB7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCBtb2RhbC5fcmVzaXplSGFuZGxlcik7XG4gICAgICB9XG4gICAgICBtb2RhbD8uY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gRXhwb3J0XG4gIHdpbmRvdy5vcGVuRXhlY01vZGFsID0gb3BlbkV4ZWM7XG59KSgpO1xuO1xuLy8gPT09PT09PT09PSBBVURJVCBMT0cgVklFV0VSID09PT09PT09PT1cbi8vIERDLTA1MDogc3VyZmFjZSBhdXRoZW50aWNhdGVkIHVzZXIgaWRlbnRpdHkgKHVzZXJFbWFpbCAvIHVzZXJSb2xlIGZyb21cbi8vIGF1ZGl0TG9nZ2VyLmRldGFpbHMpLCBhZGQgb3V0Y29tZSBmaWx0ZXIsIHBhc3MgY29uZmlybT1DTEVBUiBib2R5IGZvclxuLy8gZGVzdHJ1Y3RpdmUgREVMRVRFLlxuKGZ1bmN0aW9uKCkge1xuICAvLyBJbmplY3QgbW9kYWwgSFRNTFxuICBpbmplY3RNb2RhbCgnYXVkaXQtbW9kYWwnLCBgPGRpdiBpZD1cImF1ZGl0LW1vZGFsXCIgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsXCI+XG4gICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtY29udGVudFwiIHN0eWxlPVwibWluLXdpZHRoOiA5NTBweDsgbWF4LXdpZHRoOiAxMTUwcHg7XCI+XG4gICAgICA8aDM+XHVEODNEXHVEQ0RDIEF1ZGl0IExvZzwvaDM+XG4gICAgICA8cCBjbGFzcz1cIm1vZGFsLXN1YnRpdGxlXCI+XG4gICAgICAgIFRyYWNrIGFsbCBhY3Rpb25zIHBlcmZvcm1lZCB0aHJvdWdoIHRoZSBBUEkuXG4gICAgICA8L3A+XG5cbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDEycHg7IG1hcmdpbi1ib3R0b206IDEycHg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGZsZXgtd3JhcDogd3JhcDtcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwidGV4dC1tdXRlZC1zbVwiPkNhdGVnb3J5OjwvbGFiZWw+XG4gICAgICAgIDxzZWxlY3QgaWQ9XCJhdWRpdC1maWx0ZXJcIiBzdHlsZT1cInBhZGRpbmc6IDZweCAxMHB4OyBib3JkZXItcmFkaXVzOiA2cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgZm9udC1zaXplOiAwLjg1cmVtO1wiPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj5BbGw8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwic2VydmljZVwiPlNlcnZpY2VzPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImNvbnRhaW5lclwiPkNvbnRhaW5lcnM8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiY2FkZHlcIj5DYWRkeTwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJkbnNcIj5ETlM8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiYmFja3VwXCI+QmFja3Vwczwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJjb25maWdcIj5Db25maWc8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiYXV0aFwiPkF1dGg8L29wdGlvbj5cbiAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cInRleHQtbXV0ZWQtc21cIj5SZXN1bHQ6PC9sYWJlbD5cbiAgICAgICAgPHNlbGVjdCBpZD1cImF1ZGl0LW91dGNvbWUtZmlsdGVyXCIgc3R5bGU9XCJwYWRkaW5nOiA2cHggMTBweDsgYm9yZGVyLXJhZGl1czogNnB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+QW55PC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInN1Y2Nlc3NcIj5cdTI3MTMgU3VjY2Vzczwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJmYWlsdXJlXCI+XHUyNzE3IEZhaWx1cmU8L29wdGlvbj5cbiAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cInRleHQtbXV0ZWQtc21cIiBzdHlsZT1cIm1hcmdpbi1sZWZ0OiA4cHg7XCI+U2luY2U6PC9sYWJlbD5cbiAgICAgICAgPGlucHV0IGlkPVwiYXVkaXQtc2luY2VcIiB0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIiBzdHlsZT1cInBhZGRpbmc6IDVweCA4cHg7IGJvcmRlci1yYWRpdXM6IDZweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBjb2xvcjogdmFyKC0tZmcpOyBmb250LXNpemU6IDAuODJyZW07XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cInRleHQtbXV0ZWQtc21cIj5VbnRpbDo8L2xhYmVsPlxuICAgICAgICA8aW5wdXQgaWQ9XCJhdWRpdC11bnRpbFwiIHR5cGU9XCJkYXRldGltZS1sb2NhbFwiIHN0eWxlPVwicGFkZGluZzogNXB4IDhweDsgYm9yZGVyLXJhZGl1czogNnB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7IGZvbnQtc2l6ZTogMC44MnJlbTtcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImF1ZGl0LXJlZnJlc2gtYnRuXCIgY2xhc3M9XCJidG4tc21cIj5cdUQ4M0RcdUREMDQgUmVmcmVzaDwvYnV0dG9uPlxuICAgICAgICA8c3BhbiBzdHlsZT1cImZsZXg6IDE7XCI+PC9zcGFuPlxuICAgICAgICA8YnV0dG9uIGlkPVwiYXVkaXQtY2xlYXItYnRuXCIgc3R5bGU9XCJwYWRkaW5nOiA2cHggMTJweDsgZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1iYWQtZmcpOyBib3JkZXItY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+XHVEODNEXHVEREQxXHVGRTBGIENsZWFyIExvZzwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgaWQ9XCJhdWRpdC1sb2ctY29udGFpbmVyXCIgY2xhc3M9XCJzY3JvbGwtY29udGFpbmVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiYnJhbmQtc3Bpbm5lclwiPjwvc3Bhbj4gTG9hZGluZyBhdWRpdCBsb2cuLi48L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMTJweDsgdGV4dC1hbGlnbjogY2VudGVyO1wiPlxuICAgICAgICA8YnV0dG9uIGlkPVwiYXVkaXQtbG9hZC1tb3JlXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBwYWRkaW5nOiA2cHggMTZweDsgZm9udC1zaXplOiAwLjhyZW07XCI+TG9hZCBNb3JlPC9idXR0b24+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9ucyBtb2RhbC1mb290ZXItYmFyXCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJhdWRpdC1jYW5jZWxcIj5DbG9zZTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PmApO1xuXG4gIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F1ZGl0LW1vZGFsJyk7XG4gIGNvbnN0IG9wZW5CdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXVkaXQtbG9nLWJ0bicpO1xuICBjb25zdCBjYW5jZWxCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXVkaXQtY2FuY2VsJyk7XG4gIGNvbnN0IHJlZnJlc2hCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXVkaXQtcmVmcmVzaC1idG4nKTtcbiAgY29uc3QgY2xlYXJCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXVkaXQtY2xlYXItYnRuJyk7XG4gIGNvbnN0IGZpbHRlclNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdWRpdC1maWx0ZXInKTtcbiAgY29uc3Qgb3V0Y29tZVNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdWRpdC1vdXRjb21lLWZpbHRlcicpO1xuICBjb25zdCBzaW5jZUlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F1ZGl0LXNpbmNlJyk7XG4gIGNvbnN0IHVudGlsSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXVkaXQtdW50aWwnKTtcbiAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F1ZGl0LWxvZy1jb250YWluZXInKTtcbiAgY29uc3QgbG9hZE1vcmVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXVkaXQtbG9hZC1tb3JlJyk7XG4gIGxldCBjdXJyZW50T2Zmc2V0ID0gMDtcbiAgbGV0IGluZmxpZ2h0ID0gbnVsbDsgLy8gQWJvcnRDb250cm9sbGVyIGZvciB0aGUgaW4tZmxpZ2h0IHJlcXVlc3RcbiAgbGV0IGZpbHRlck5vbmNlID0gMDsgLy8gaW5jcmVtZW50cyBvbiBldmVyeSBmcmVzaCAobm9uLWFwcGVuZCkgbG9hZDsgbGV0c1xuICAgICAgICAgICAgICAgICAgICAgICAvLyBhbiBpbi1mbGlnaHQgYXBwZW5kIGRldGVjdCB0aGUgZmlsdGVyIGhhcyBjaGFuZ2VkXG4gICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBza2lwIGl0cyBET00gc3BsaWNlLlxuICBjb25zdCBQQUdFX1NJWkUgPSA1MDtcblxuICAvLyBkYXRldGltZS1sb2NhbCBmaWVsZHMgY2Fycnkgbm8gdGltZXpvbmUgb2Zmc2V0IFx1MjAxNCBjb252ZXJ0IHRvIElTTyA4NjAxXG4gIC8vIHdpdGggdGhlIGxvY2FsIG9mZnNldCBzbyB0aGUgc2VydmVyIGNhbiBjb21wYXJlIGNvcnJlY3RseS5cbiAgZnVuY3Rpb24gdG9Jc28obG9jYWxEdFZhbHVlKSB7XG4gICAgaWYgKCFsb2NhbER0VmFsdWUpIHJldHVybiBudWxsO1xuICAgIC8vIEJyb3dzZXJzIGV4cG9zZSBkYXRldGltZS1sb2NhbCBhcyBuYWl2ZSBsb2NhbCB0aW1lLiBuZXcgRGF0ZSgpIG9uXG4gICAgLy8gdGhhdCBzdHJpbmcgcGFyc2VzIGl0IGFzIExPQ0FMLCBzbyB0b0lTT1N0cmluZygpIHlpZWxkcyB0aGUgVVRDXG4gICAgLy8gZXF1aXZhbGVudCB0aGUgc2VydmVyIGV4cGVjdHMuXG4gICAgY29uc3QgZCA9IG5ldyBEYXRlKGxvY2FsRHRWYWx1ZSk7XG4gICAgaWYgKGlzTmFOKGQuZ2V0VGltZSgpKSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIGQudG9JU09TdHJpbmcoKTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRBdWRpdChhcHBlbmQpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKCFhcHBlbmQpIHtcbiAgICAgICAgLy8gQ2FuY2VsIGFueSBwZW5kaW5nIHJlcXVlc3QgYW5kIGJ1bXAgdGhlIGZpbHRlciBub25jZSBzbyBhbnlcbiAgICAgICAgLy8gYXBwZW5kaW5nIGZldGNoIChzdGlsbCBpbiBmbGlnaHQpIGtub3dzIHRvIGRpc2NhcmQgaXRzIHJlc3BvbnNlLlxuICAgICAgICBpZiAoaW5mbGlnaHQpIGluZmxpZ2h0LmFib3J0KCk7XG4gICAgICAgIGluZmxpZ2h0ID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgICBjdXJyZW50T2Zmc2V0ID0gMDtcbiAgICAgICAgZmlsdGVyTm9uY2UrKztcbiAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+IExvYWRpbmcuLi48L2Rpdj4nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGluZmxpZ2h0KSBpbmZsaWdodC5hYm9ydCgpO1xuICAgICAgICBpbmZsaWdodCA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG15Tm9uY2UgPSBmaWx0ZXJOb25jZTtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgICAgIHBhcmFtcy5zZXQoJ2xpbWl0JywgU3RyaW5nKFBBR0VfU0laRSkpO1xuICAgICAgcGFyYW1zLnNldCgnb2Zmc2V0JywgU3RyaW5nKGN1cnJlbnRPZmZzZXQpKTtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IGZpbHRlclNlbGVjdC52YWx1ZTtcbiAgICAgIGNvbnN0IG91dGNvbWUgPSBvdXRjb21lU2VsZWN0LnZhbHVlO1xuICAgICAgY29uc3Qgc2luY2UgPSB0b0lzbyhzaW5jZUlucHV0LnZhbHVlKTtcbiAgICAgIGNvbnN0IHVudGlsID0gdG9Jc28odW50aWxJbnB1dC52YWx1ZSk7XG4gICAgICBpZiAoYWN0aW9uKSBwYXJhbXMuc2V0KCdhY3Rpb24nLCBhY3Rpb24pO1xuICAgICAgaWYgKG91dGNvbWUpIHBhcmFtcy5zZXQoJ291dGNvbWUnLCBvdXRjb21lKTtcbiAgICAgIGlmIChzaW5jZSkgcGFyYW1zLnNldCgnc2luY2UnLCBzaW5jZSk7XG4gICAgICBpZiAodW50aWwpIHBhcmFtcy5zZXQoJ3VudGlsJywgdW50aWwpO1xuXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9hdWRpdC1sb2dzPycgKyBwYXJhbXMudG9TdHJpbmcoKSwge1xuICAgICAgICBzaWduYWw6IGluZmxpZ2h0LnNpZ25hbCxcbiAgICAgIH0pO1xuICAgICAgLy8gU3VyZmFjZSA0MDEvNDAzLzUwMCBleHBsaWNpdGx5IFx1MjAxNCB0aGUgZGFzaGJvYXJkIHVzZWQgdG8gcmVuZGVyIGFueVxuICAgICAgLy8gbm9uLXN1Y2Nlc3MgcmVzcG9uc2UgYXMgXCJubyBhdWRpdCBsb2cgZW50cmllcyB5ZXQsXCIgd2hpY2ggaXNcbiAgICAgIC8vIG1pc2xlYWRpbmcgZm9yIGFuIGV4cGlyZWQgc2Vzc2lvbi5cbiAgICAgIGlmICghcmVzLm9rKSB7XG4gICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCIgc3R5bGU9XCJjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5GYWlsZWQ6IEhUVFAgJHtyZXMuc3RhdHVzfTwvZGl2PmA7XG4gICAgICAgIGxvYWRNb3JlQnRuLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKCFkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IGA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPkZhaWxlZDogJHtlc2NhcGVIdG1sKGRhdGEuZXJyb3IgfHwgJ3Vua25vd24nKX08L2Rpdj5gO1xuICAgICAgICBsb2FkTW9yZUJ0bi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBJZiBhIG5vbi1hcHBlbmQgbG9hZCBoYXBwZW5lZCBhZnRlciB0aGlzIGZldGNoIHdhcyBpc3N1ZWQsIHRoZVxuICAgICAgLy8gb3BlcmF0b3IgY2hhbmdlZCBmaWx0ZXJzOyBkaXNjYXJkIHRoZSBub3ctc3RhbGUgcmVzcG9uc2UuXG4gICAgICBpZiAoIWFwcGVuZCAmJiBteU5vbmNlICE9PSBmaWx0ZXJOb25jZSkgcmV0dXJuO1xuICAgICAgY29uc3QgZW50cmllcyA9IEFycmF5LmlzQXJyYXkoZGF0YS5lbnRyaWVzKSA/IGRhdGEuZW50cmllcyA6IFtdO1xuXG4gICAgICBpZiAoZW50cmllcy5sZW5ndGggPT09IDAgJiYgIWFwcGVuZCkge1xuICAgICAgICBjb25zdCByZWFzb24gPSBkYXRhLmZpbHRlcnMgJiYgKGRhdGEuZmlsdGVycy5hY3Rpb24gfHwgZGF0YS5maWx0ZXJzLm91dGNvbWUgfHwgZGF0YS5maWx0ZXJzLnNpbmNlIHx8IGRhdGEuZmlsdGVycy51bnRpbClcbiAgICAgICAgICA/ICdObyBlbnRyaWVzIG1hdGNoIHlvdXIgZmlsdGVycy4nXG4gICAgICAgICAgOiAnTm8gYXVkaXQgbG9nIGVudHJpZXMgeWV0LiBBY3Rpb25zIHdpbGwgYmUgbG9nZ2VkIGF1dG9tYXRpY2FsbHkuJztcbiAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IGA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdUQ4M0RcdURDREM8L3NwYW4+JHtlc2NhcGVIdG1sKHJlYXNvbil9PC9kaXY+YDtcbiAgICAgICAgbG9hZE1vcmVCdG4uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsZXQgaHRtbCA9ICcnO1xuICAgICAgaWYgKCFhcHBlbmQpIHtcbiAgICAgICAgaHRtbCA9ICc8dGFibGUgc3R5bGU9XCJ3aWR0aDogMTAwJTsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgZm9udC1zaXplOiAwLjgycmVtO1wiPic7XG4gICAgICAgIGh0bWwgKz0gJzx0ciBzdHlsZT1cImJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPic7XG4gICAgICAgIGh0bWwgKz0gJzx0aCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5XaGVuPC90aD4nO1xuICAgICAgICBodG1sICs9ICc8dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+QWN0b3I8L3RoPic7XG4gICAgICAgIGh0bWwgKz0gJzx0aCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5JUDwvdGg+JztcbiAgICAgICAgaHRtbCArPSAnPHRoIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPkFjdGlvbjwvdGg+JztcbiAgICAgICAgaHRtbCArPSAnPHRoIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPlJlc291cmNlPC90aD4nO1xuICAgICAgICBodG1sICs9ICc8dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+UmVzdWx0PC90aD4nO1xuICAgICAgICBodG1sICs9ICc8L3RyPic7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgZSBvZiBlbnRyaWVzKSB7XG4gICAgICAgIGNvbnN0IG9rID0gZS5vdXRjb21lID09PSAnc3VjY2Vzcyc7XG4gICAgICAgIGNvbnN0IGFjdG9yID0gYWN0b3JMYWJlbChlKTtcbiAgICAgICAgaHRtbCArPSBgPHRyIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGN1cnNvcjogcG9pbnRlcjtcIiBjbGFzcz1cImF1ZGl0LXJvd1wiPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweDsgY29sb3I6IHZhcigtLW11dGVkKTtcIiB0aXRsZT1cIiR7ZXNjYXBlSHRtbChlLnRpbWVzdGFtcCB8fCAnJyl9XCI+JHt0aW1lQWdvKGUudGltZXN0YW1wKX08L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweDsgZm9udC1zaXplOiAwLjc4cmVtO1wiPiR7YWN0b3J9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IGZvbnQtc2l6ZTogMC43OHJlbTtcIj4ke2VzY2FwZUh0bWwoZS5pcCB8fCAnLScpfTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4OyBmb250LXdlaWdodDogNTAwO1wiPiR7ZXNjYXBlSHRtbChlLmFjdGlvbiB8fCAnLScpfTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4O1wiPiR7ZXNjYXBlSHRtbChlLnJlc291cmNlIHx8ICctJyl9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7XCI+PHNwYW4gc3R5bGU9XCJjb2xvcjogJHtvayA/ICd2YXIoLS1vay1mZyknIDogJ3ZhcigtLWJhZC1mZyknfTtcIj4ke29rID8gJ1x1MjcxMycgOiAnXHUyNzE3J30gJHtlc2NhcGVIdG1sKGUub3V0Y29tZSB8fCAnJyl9PC9zcGFuPjwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSAnPC90cj4nO1xuICAgICAgICBpZiAoZS5kZXRhaWxzICYmIE9iamVjdC5rZXlzKGUuZGV0YWlscykubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGh0bWwgKz0gYDx0ciBjbGFzcz1cImF1ZGl0LWRldGFpbFwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj48dGQgY29sc3Bhbj1cIjZcIiBzdHlsZT1cInBhZGRpbmc6IDZweCA2cHggMTBweDsgZm9udC1zaXplOiAwLjc4cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPjxwcmUgc3R5bGU9XCJtYXJnaW46IDA7IHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTtcIj4ke2VzY2FwZUh0bWwoSlNPTi5zdHJpbmdpZnkoZS5kZXRhaWxzLCBudWxsLCAyKSl9PC9wcmU+PC90ZD48L3RyPmA7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFhcHBlbmQpIHtcbiAgICAgICAgaHRtbCArPSAnPC90YWJsZT4nO1xuICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gaHRtbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHRhYmxlID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ3RhYmxlJyk7XG4gICAgICAgIGlmICh0YWJsZSkgdGFibGUuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLCBodG1sKTtcbiAgICAgIH1cblxuICAgICAgY3VycmVudE9mZnNldCArPSBlbnRyaWVzLmxlbmd0aDtcbiAgICAgIC8vIGhhc01vcmUgaXMgcmVwb3J0ZWQgYnkgdGhlIHNlcnZlciAocG9zdC1maWx0ZXIgdG90YWwpLCBzbyB0aGVcbiAgICAgIC8vIExvYWQgTW9yZSBidXR0b24gc3RheXMgYWNjdXJhdGUgd2hlbiBmaWx0ZXJzIGNoYW5nZSBtaWQtc2Nyb2xsLlxuICAgICAgbG9hZE1vcmVCdG4uc3R5bGUuZGlzcGxheSA9IGRhdGEuaGFzTW9yZSA/ICcnIDogJ25vbmUnO1xuXG4gICAgICAvLyBUb2dnbGUgZGV0YWlsIHJvd3Mgb24gY2xpY2tcbiAgICAgIGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCcuYXVkaXQtcm93JykuZm9yRWFjaChyb3cgPT4ge1xuICAgICAgICBpZiAocm93LmRhdGFzZXQud2lyZWQpIHJldHVybjtcbiAgICAgICAgcm93LmRhdGFzZXQud2lyZWQgPSAndHJ1ZSc7XG4gICAgICAgIHJvdy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICBjb25zdCBkZXRhaWwgPSByb3cubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgICAgICAgIGlmIChkZXRhaWwgJiYgZGV0YWlsLmNsYXNzTGlzdC5jb250YWlucygnYXVkaXQtZGV0YWlsJykpIHtcbiAgICAgICAgICAgIGRldGFpbC5zdHlsZS5kaXNwbGF5ID0gZGV0YWlsLnN0eWxlLmRpc3BsYXkgPT09ICdub25lJyA/ICcnIDogJ25vbmUnO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBBYm9ydEVycm9yIGlzIGV4cGVjdGVkIHdoZW4gd2UgZGVsaWJlcmF0ZWx5IGNhbmNlbCBhbiBpbi1mbGlnaHRcbiAgICAgIC8vIHJlcXVlc3QgKGUuZy4gdGhlIG9wZXJhdG9yIGNoYW5nZWQgZmlsdGVycyBtaWQtZmV0Y2gpIFx1MjAxNCBkb24ndFxuICAgICAgLy8gZmxhc2ggYSBcIkZhaWxlZDogVGhlIHVzZXIgYWJvcnRlZCBhIHJlcXVlc3RcIiBtZXNzYWdlIG92ZXIgdGhlXG4gICAgICAvLyBsb2FkaW5nIHNwaW5uZXIuIFRoZSBuZXcgZmV0Y2ggaGFzIGFscmVhZHkga2lja2VkIG9mZi5cbiAgICAgIGlmIChlICYmIGUubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSByZXR1cm47XG4gICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RmFpbGVkOiAke2VzY2FwZUh0bWwoZS5tZXNzYWdlKX08L2Rpdj5gO1xuICAgIH1cbiAgfVxuXG4gIC8vIFJlbmRlciB0aGUgaHVtYW4tcmVhZGFibGUgYWN0b3I6IHByZWZlciB1c2VyRW1haWwsIGZhbGwgYmFjayB0b1xuICAvLyB1c2VySWQsIGZhbGwgYmFjayB0byBiYXJlIElQLiBJZiBubyB1c2VyIGF0dHJpYnV0aW9uLCBtYXJrIGFzXG4gIC8vIFwic3lzdGVtXCIgc28gdGhlIG9wZXJhdG9yIGtub3dzIHRoZSBlbnRyeSBjYW1lIGZyb20gYW4gdW5hdXRoZW50aWNhdGVkXG4gIC8vIG9yIHNlcnZpY2UgcGF0aCAoZS5nLiBjcm9uLWRyaXZlbiBiYWNrdXBzKS5cbiAgZnVuY3Rpb24gYWN0b3JMYWJlbChlbnRyeSkge1xuICAgIGNvbnN0IGQgPSBlbnRyeS5kZXRhaWxzIHx8IHt9O1xuICAgIGNvbnN0IGVtYWlsID0gZC51c2VyRW1haWw7XG4gICAgY29uc3QgaWQgPSBkLnVzZXJJZDtcbiAgICBjb25zdCByb2xlID0gZC51c2VyUm9sZTtcbiAgICBjb25zdCBwcm92aWRlciA9IGQudmlhUHJvdmlkZXI7XG4gICAgaWYgKGVtYWlsKSB7XG4gICAgICBjb25zdCB0YWcgPSByb2xlID8gYCA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IGZvbnQtc2l6ZTogMC43MnJlbTtcIj5bJHtlc2NhcGVIdG1sKHJvbGUpfSR7cHJvdmlkZXIgPyAnLycgKyBlc2NhcGVIdG1sKHByb3ZpZGVyKSA6ICcnfV08L3NwYW4+YCA6ICcnO1xuICAgICAgcmV0dXJuIGAke2VzY2FwZUh0bWwoZW1haWwpfSR7dGFnfWA7XG4gICAgfVxuICAgIGlmIChpZCkgcmV0dXJuIGA8c3BhbiBzdHlsZT1cImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+JHtlc2NhcGVIdG1sKGlkKX08L3NwYW4+YDtcbiAgICBpZiAoIWVudHJ5LmlwKSByZXR1cm4gJzxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj5zeXN0ZW08L3NwYW4+JztcbiAgICByZXR1cm4gJzxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj5hbm9uPC9zcGFuPic7XG4gIH1cblxuICBvcGVuQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBtb2RhbD8uY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICAgIGxvYWRBdWRpdChmYWxzZSk7XG4gIH0pO1xuICB3aXJlTW9kYWwobW9kYWwsIGNhbmNlbEJ0bik7XG4gIHJlZnJlc2hCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gbG9hZEF1ZGl0KGZhbHNlKSk7XG4gIGZpbHRlclNlbGVjdD8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4gbG9hZEF1ZGl0KGZhbHNlKSk7XG4gIG91dGNvbWVTZWxlY3Q/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IGxvYWRBdWRpdChmYWxzZSkpO1xuICAvLyBSZS1mZXRjaCBvbiBkYXRlIGNoYW5nZSBvbmx5IHdoZW4gYm90aCBmaWVsZHMgaGF2ZSBhIHZhbHVlIG9yIGJvdGggYXJlXG4gIC8vIGVtcHR5IFx1MjAxNCB0eXBpbmcgb25lIGNoYXJhY3RlciBzaG91bGRuJ3QgdHJpZ2dlciBhIGZldGNoIGZvciBldmVyeSBrZXlzdHJva2UuXG4gIGxldCBkYXRlRGVib3VuY2U7XG4gIFtzaW5jZUlucHV0LCB1bnRpbElucHV0XS5mb3JFYWNoKChlbCkgPT4ge1xuICAgIGVsPy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICBjbGVhclRpbWVvdXQoZGF0ZURlYm91bmNlKTtcbiAgICAgIGRhdGVEZWJvdW5jZSA9IHNldFRpbWVvdXQoKCkgPT4gbG9hZEF1ZGl0KGZhbHNlKSwgMjUwKTtcbiAgICB9KTtcbiAgfSk7XG4gIGxvYWRNb3JlQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IGxvYWRBdWRpdCh0cnVlKSk7XG5cbiAgY2xlYXJCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY29uZmlybSgnQ2xlYXIgdGhlIGVudGlyZSBhdWRpdCBsb2c/IFRoaXMgY2Fubm90IGJlIHVuZG9uZS4nKSkgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9hdWRpdC1sb2dzJywge1xuICAgICAgICBtZXRob2Q6ICdERUxFVEUnLFxuICAgICAgICBoZWFkZXJzOiB7ICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBjb25maXJtOiAnQ0xFQVInIH0pLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIGxvYWRBdWRpdChmYWxzZSk7XG4gICAgICBlbHNlIHNob3dOb3RpZmljYXRpb24oJ0Vycm9yOiAnICsgKGRhdGEuZXJyb3IgfHwgJ0NsZWFyIGZhaWxlZCcpLCAnZXJyb3InKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdFcnJvcjogJyArIGUubWVzc2FnZSwgJ2Vycm9yJyk7XG4gICAgfVxuICB9KTtcbn0pKCk7O1xuLy8gPT09PT09PT09PSBTRUNVUklUWSBDRU5URVIgPT09PT09PT09PVxuLy8gTXVsdGktc291cmNlIHNlY3VyaXR5IGV2ZW50IHZpZXdlciArIGhvc3QgcmVnaXN0cnkgVUkuXG4vL1xuLy8gU2hvd3MgbGl2ZSBldmVudHMgZnJvbSBhbnkgc291cmNlIChBUEkgYXVkaXQsIENhZGR5IGFjY2VzcyBsb2csIGZhaWwyYmFuLFxuLy8gc2hhcmVkX2JhbnMpIG9uIGFueSByZWdpc3RlcmVkIGhvc3QgKHRoaXMgRGFzaENhZGR5LCBmdXR1cmUgcmVtb3RlIGFnZW50cykuXG4vL1xuLy8gTGl2ZS10YWlsIHVzZXMgU1NFICgvYXBpL3YxL3NlY3VyaXR5L2V2ZW50cy9zdHJlYW0pLlxuKGZ1bmN0aW9uKCkge1xuICBpbmplY3RNb2RhbCgnc2VjdXJpdHktbW9kYWwnLCBgPGRpdiBpZD1cInNlY3VyaXR5LW1vZGFsXCIgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsXCI+XG4gICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtY29udGVudFwiIHN0eWxlPVwibWluLXdpZHRoOiA5ODBweDsgbWF4LXdpZHRoOiAxMjgwcHg7XCI+XG4gICAgICA8aDM+XHVEODNEXHVERUUxXHVGRTBGIFNlY3VyaXR5IENlbnRlcjwvaDM+XG4gICAgICA8cCBjbGFzcz1cIm1vZGFsLXN1YnRpdGxlXCI+XG4gICAgICAgIExpdmUgZXZlbnRzIGZyb20gQVBJLCBDYWRkeSwgZmFpbDJiYW4gJiBzaGFyZWRfYmFucy4gTGl2ZS10YWlsIHZpYSBTU0UuXG4gICAgICA8L3A+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJzZWMtdGFic1wiIHN0eWxlPVwiZGlzcGxheTpmbGV4O2dhcDo4cHg7bWFyZ2luLWJvdHRvbToxNHB4O2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJzZWMtdGFiIGFjdGl2ZVwiIGRhdGEtdGFiPVwib3ZlcnZpZXdcIj5PdmVydmlldzwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2VjLXRhYlwiIGRhdGEtdGFiPVwiZXZlbnRzXCI+RXZlbnRzPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJzZWMtdGFiXCIgZGF0YS10YWI9XCJob3N0c1wiPkhvc3RzPC9idXR0b24+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBPVkVSVklFVyBUQUIgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwic2VjLXBhbmVsXCIgZGF0YS1wYW5lbD1cIm92ZXJ2aWV3XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZWMtc3RhdHNcIiBpZD1cInNlYy1zdGF0c1wiIHN0eWxlPVwiZGlzcGxheTpncmlkO2dyaWQtdGVtcGxhdGUtY29sdW1uczpyZXBlYXQoYXV0by1maXQsbWlubWF4KDE4MHB4LDFmcikpO2dhcDoxMnB4O21hcmdpbi1ib3R0b206MThweDtcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VjLXN0YXRcIiBkYXRhLWtleT1cInRvdGFsXCI+XHUyMDE0IGV2ZW50czwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWMtc3RhdFwiIGRhdGEta2V5PVwid2FyblwiPlx1MjAxNCB3YXJuaW5nczwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWMtc3RhdFwiIGRhdGEta2V5PVwiZXJyb3JcIj5cdTIwMTQgZXJyb3JzPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNlYy1zdGF0XCIgZGF0YS1rZXk9XCJkZW5pZWRcIj5cdTIwMTQgZGVuaWVkPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNlYy1zdGF0XCIgZGF0YS1rZXk9XCJob3N0c1wiPlx1MjAxNCBob3N0czwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6Z3JpZDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6MWZyIDFmcjtnYXA6MTRweDtcIj5cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGg0IHN0eWxlPVwibWFyZ2luOjhweCAwIDZweDtcIj5Ub3AgQWN0b3JzICgyNGgpPC9oND5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJzZWMtdG9wLWFjdG9yc1wiIGNsYXNzPVwic2Nyb2xsLWNvbnRhaW5lclwiIHN0eWxlPVwibWF4LWhlaWdodDoyNDBweDtcIj5cdTIwMTQ8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGg0IHN0eWxlPVwibWFyZ2luOjhweCAwIDZweDtcIj5Ub3AgVGFyZ2V0cyAoMjRoKTwvaDQ+XG4gICAgICAgICAgICA8ZGl2IGlkPVwic2VjLXRvcC10YXJnZXRzXCIgY2xhc3M9XCJzY3JvbGwtY29udGFpbmVyXCIgc3R5bGU9XCJtYXgtaGVpZ2h0OjI0MHB4O1wiPlx1MjAxNDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEVWRU5UUyBUQUIgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwic2VjLXBhbmVsXCIgZGF0YS1wYW5lbD1cImV2ZW50c1wiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2dhcDo4cHg7bWFyZ2luLWJvdHRvbToxMnB4O2FsaWduLWl0ZW1zOmNlbnRlcjtmbGV4LXdyYXA6d3JhcDtcIj5cbiAgICAgICAgICA8c2VsZWN0IGlkPVwic2VjLWZpbHRlci1zb3VyY2VcIiBjbGFzcz1cInNlYy1maWx0ZXJcIj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj5BbGwgc291cmNlczwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImFwaVwiPkFQSTwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImNhZGR5XCI+Q2FkZHk8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJmYWlsMmJhblwiPmZhaWwyYmFuPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwic2hhcmVkLWJhbnNcIj5zaGFyZWRfYmFuczwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImFnZW50XCI+QWdlbnQ8L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8c2VsZWN0IGlkPVwic2VjLWZpbHRlci1zZXZlcml0eVwiIGNsYXNzPVwic2VjLWZpbHRlclwiPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPkFsbCBzZXZlcml0aWVzPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiY3JpdGljYWxcIj5jcml0aWNhbDwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImVycm9yXCI+ZXJyb3I8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ3YXJuXCI+d2Fybjwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIm5vdGljZVwiPm5vdGljZTwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImluZm9cIj5pbmZvPC9vcHRpb24+XG4gICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgPHNlbGVjdCBpZD1cInNlYy1maWx0ZXItaG9zdFwiIGNsYXNzPVwic2VjLWZpbHRlclwiPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPkFsbCBob3N0czwvb3B0aW9uPlxuICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgIDxpbnB1dCBpZD1cInNlYy1maWx0ZXItYWN0b3JcIiBjbGFzcz1cInNlYy1maWx0ZXJcIiBwbGFjZWhvbGRlcj1cImFjdG9yIChJUCBvciB1c2VyKVwiIHN0eWxlPVwicGFkZGluZzo2cHggMTBweDtcIj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwic2VjLXJlZnJlc2gtYnRuXCIgY2xhc3M9XCJidG4tc21cIj5cdUQ4M0RcdUREMDQgUmVmcmVzaDwvYnV0dG9uPlxuICAgICAgICAgIDxsYWJlbCBzdHlsZT1cIm1hcmdpbi1sZWZ0OmF1dG87ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6NnB4O1wiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwic2VjLWxpdmUtdGFpbFwiIGNoZWNrZWQ+XG4gICAgICAgICAgICA8c3Bhbj5MaXZlIHRhaWw8L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJzZWMtZXZlbnRzLWNvbnRhaW5lclwiIGNsYXNzPVwic2Nyb2xsLWNvbnRhaW5lclwiIHN0eWxlPVwibWF4LWhlaWdodDo0ODBweDtcIj5Mb2FkaW5nXHUyMDI2PC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBIT1NUUyBUQUIgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwic2VjLXBhbmVsXCIgZGF0YS1wYW5lbD1cImhvc3RzXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjhweDttYXJnaW4tYm90dG9tOjEycHg7XCI+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cInNlYy1ob3N0LXJlZ2lzdGVyLWJ0blwiIGNsYXNzPVwiYnRuLXNtXCI+XHUyNzk1IFJlZ2lzdGVyIEhvc3Q8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwic2VjLWhvc3RzLXJlZnJlc2hcIiBjbGFzcz1cImJ0bi1zbVwiPlx1RDgzRFx1REQwNCBSZWZyZXNoPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwic2VjLWhvc3RzLWNvbnRhaW5lclwiIGNsYXNzPVwic2Nyb2xsLWNvbnRhaW5lclwiIHN0eWxlPVwibWF4LWhlaWdodDo0ODBweDtcIj5Mb2FkaW5nXHUyMDI2PC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9ucyBtb2RhbC1mb290ZXItYmFyXCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJzZWMtY2FuY2VsXCI+Q2xvc2U8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5gKTtcblxuICAvLyA9PT09PT09PT09PT09IFNUQVRFID09PT09PT09PT09PT1cbiAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdXJpdHktbW9kYWwnKTtcbiAgY29uc3Qgb3BlbkJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN1cml0eS1jZW50ZXItYnRuJyk7XG4gIGNvbnN0IGNhbmNlbEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWMtY2FuY2VsJyk7XG4gIGNvbnN0IHRhYnMgPSBtb2RhbC5xdWVyeVNlbGVjdG9yQWxsKCcuc2VjLXRhYicpO1xuICBjb25zdCBwYW5lbHMgPSBtb2RhbC5xdWVyeVNlbGVjdG9yQWxsKCcuc2VjLXBhbmVsJyk7XG5cbiAgbGV0IGFsbEV2ZW50cyA9IFtdOyAvLyBuZXdlc3QgZmlyc3RcbiAgbGV0IGFsbEhvc3RzID0gW107XG4gIGxldCBzc2VTb3VyY2UgPSBudWxsO1xuXG4gIC8vID09PT09PT09PT09PT0gVEFCIFNXSVRDSElORyA9PT09PT09PT09PT09XG4gIHRhYnMuZm9yRWFjaCh0YWIgPT4ge1xuICAgIHRhYi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIHRhYnMuZm9yRWFjaCh0ID0+IHQuY2xhc3NMaXN0LnRvZ2dsZSgnYWN0aXZlJywgdCA9PT0gdGFiKSk7XG4gICAgICBwYW5lbHMuZm9yRWFjaChwID0+IHAuc3R5bGUuZGlzcGxheSA9IHAuZGF0YXNldC5wYW5lbCA9PT0gdGFiLmRhdGFzZXQudGFiID8gJycgOiAnbm9uZScpO1xuICAgICAgaWYgKHRhYi5kYXRhc2V0LnRhYiA9PT0gJ292ZXJ2aWV3JykgcmVmcmVzaE92ZXJ2aWV3KCk7XG4gICAgICBpZiAodGFiLmRhdGFzZXQudGFiID09PSAnZXZlbnRzJykgcmVmcmVzaEV2ZW50cygpO1xuICAgICAgaWYgKHRhYi5kYXRhc2V0LnRhYiA9PT0gJ2hvc3RzJykgcmVmcmVzaEhvc3RzKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT0gT1BFTi9DTE9TRSA9PT09PT09PT09PT09XG4gIGlmIChvcGVuQnRuKSB7XG4gICAgb3BlbkJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIG1vZGFsLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgICAgIHJlZnJlc2hPdmVydmlldygpO1xuICAgICAgc3RhcnRMaXZlVGFpbCgpO1xuICAgIH0pO1xuICB9XG4gIGNhbmNlbEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNsb3NlTW9kYWwpO1xuICBtb2RhbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGUgPT4geyBpZiAoZS50YXJnZXQgPT09IG1vZGFsKSBjbG9zZU1vZGFsKCk7IH0pO1xuICBmdW5jdGlvbiBjbG9zZU1vZGFsKCkge1xuICAgIG1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgICBzdG9wTGl2ZVRhaWwoKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT0gTElWRSBUQUlMIChTU0UpID09PT09PT09PT09PT1cbiAgZnVuY3Rpb24gc3RhcnRMaXZlVGFpbCgpIHtcbiAgICBzdG9wTGl2ZVRhaWwoKTtcbiAgICBpZiAoIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWMtbGl2ZS10YWlsJykuY2hlY2tlZCkgcmV0dXJuO1xuICAgIGlmICh0eXBlb2YgRXZlbnRTb3VyY2UgPT09ICd1bmRlZmluZWQnKSByZXR1cm47IC8vIGJyb3dzZXIgZG9lc24ndCBzdXBwb3J0XG4gICAgdHJ5IHtcbiAgICAgIHNzZVNvdXJjZSA9IG5ldyBFdmVudFNvdXJjZSgnL2FwaS92MS9zZWN1cml0eS9ldmVudHMvc3RyZWFtJyk7XG4gICAgICBzc2VTb3VyY2UuYWRkRXZlbnRMaXN0ZW5lcignaW5pdCcsIChlKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoZS5kYXRhKTtcbiAgICAgICAgICBhbGxFdmVudHMgPSBkYXRhLmV2ZW50cyB8fCBbXTtcbiAgICAgICAgICByZW5kZXJFdmVudHMoKTtcbiAgICAgICAgfSBjYXRjaCB7fVxuICAgICAgfSk7XG4gICAgICBzc2VTb3VyY2UuYWRkRXZlbnRMaXN0ZW5lcignc2VjdXJpdHknLCAoZSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGV2ID0gSlNPTi5wYXJzZShlLmRhdGEpO1xuICAgICAgICAgIGFsbEV2ZW50cy51bnNoaWZ0KGV2KTtcbiAgICAgICAgICBpZiAoYWxsRXZlbnRzLmxlbmd0aCA+IDUwMCkgYWxsRXZlbnRzLmxlbmd0aCA9IDUwMDtcbiAgICAgICAgICAvLyBBdXRvLXJlZnJlc2ggd2hpY2hldmVyIHBhbmVsIGlzIHNob3dpbmdcbiAgICAgICAgICBjb25zdCBhY3RpdmUgPSBtb2RhbC5xdWVyeVNlbGVjdG9yKCcuc2VjLXRhYi5hY3RpdmUnKT8uZGF0YXNldD8udGFiO1xuICAgICAgICAgIGlmIChhY3RpdmUgPT09ICdldmVudHMnKSByZW5kZXJFdmVudHMoKTtcbiAgICAgICAgICBlbHNlIGlmIChhY3RpdmUgPT09ICdvdmVydmlldycpIHJlZnJlc2hPdmVydmlldygpO1xuICAgICAgICB9IGNhdGNoIHt9XG4gICAgICB9KTtcbiAgICAgIHNzZVNvdXJjZS5vbmVycm9yID0gKCkgPT4geyAvKiBicm93c2VyIGF1dG8tcmVjb25uZWN0cyAqLyB9O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUud2FybignW3NlY3VyaXR5XSBTU0UgZmFpbGVkOicsIGUubWVzc2FnZSk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHN0b3BMaXZlVGFpbCgpIHtcbiAgICBpZiAoc3NlU291cmNlKSB7IHRyeSB7IHNzZVNvdXJjZS5jbG9zZSgpOyB9IGNhdGNoIHt9IHNzZVNvdXJjZSA9IG51bGw7IH1cbiAgfVxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjLWxpdmUtdGFpbCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHtcbiAgICBpZiAobW9kYWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdzaG93JykpIHN0YXJ0TGl2ZVRhaWwoKTtcbiAgfSk7XG5cbiAgLy8gPT09PT09PT09PT09PSBPVkVSVklFVyA9PT09PT09PT09PT09XG4gIGFzeW5jIGZ1bmN0aW9uIHJlZnJlc2hPdmVydmlldygpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2luY2UgPSBuZXcgRGF0ZShEYXRlLm5vdygpIC0gMjQqNjAqNjAqMTAwMCkudG9JU09TdHJpbmcoKTtcbiAgICAgIGNvbnN0IFtzdGF0c1JlcywgaG9zdHNSZXMsIGV2ZW50c1Jlc10gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIGZldGNoKGAvYXBpL3YxL3NlY3VyaXR5L2V2ZW50cy9zdGF0cz9zaW5jZT0ke2VuY29kZVVSSUNvbXBvbmVudChzaW5jZSl9YCksXG4gICAgICAgIGZldGNoKCcvYXBpL3YxL3NlY3VyaXR5L2hvc3RzJyksXG4gICAgICAgIGZldGNoKGAvYXBpL3YxL3NlY3VyaXR5L2V2ZW50cz9saW1pdD0xJnNpbmNlPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHNpbmNlKX1gKSxcbiAgICAgIF0pO1xuICAgICAgY29uc3Qgc3RhdHMgPSAoYXdhaXQgc3RhdHNSZXMuanNvbigpKS5kYXRhIHx8IHt9O1xuICAgICAgY29uc3QgaG9zdHMgPSAoYXdhaXQgaG9zdHNSZXMuanNvbigpKS5kYXRhPy5ob3N0cyB8fCBbXTtcbiAgICAgIGNvbnN0IGV2ZW50c0NvdW50ID0gKGF3YWl0IGV2ZW50c1Jlcy5qc29uKCkpLmRhdGE/LnRvdGFsIHx8IDA7XG5cbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNzZWMtc3RhdHMgW2RhdGEta2V5PVwidG90YWxcIl0nKS50ZXh0Q29udGVudCA9IGAke2V2ZW50c0NvdW50fSBldmVudHMgKDI0aClgO1xuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3NlYy1zdGF0cyBbZGF0YS1rZXk9XCJ3YXJuXCJdJykudGV4dENvbnRlbnQgPSBgJHtzdGF0cy5ieV9zZXZlcml0eT8ud2FybiB8fCAwfSB3YXJuaW5nc2A7XG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc2VjLXN0YXRzIFtkYXRhLWtleT1cImVycm9yXCJdJykudGV4dENvbnRlbnQgPSBgJHtzdGF0cy5ieV9zZXZlcml0eT8uZXJyb3IgfHwgMH0gZXJyb3JzYDtcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNzZWMtc3RhdHMgW2RhdGEta2V5PVwiZGVuaWVkXCJdJykudGV4dENvbnRlbnQgPSBgJHtzdGF0cy5ieV9vdXRjb21lPy5kZW5pZWQgfHwgMH0gZGVuaWVkYDtcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNzZWMtc3RhdHMgW2RhdGEta2V5PVwiaG9zdHNcIl0nKS50ZXh0Q29udGVudCA9IGAke2hvc3RzLmxlbmd0aH0gaG9zdHNgO1xuXG4gICAgICByZW5kZXJUb3BMaXN0KCdzZWMtdG9wLWFjdG9ycycsIHN0YXRzLnRvcF9hY3RvcnMgfHwgW10pO1xuICAgICAgcmVuZGVyVG9wTGlzdCgnc2VjLXRvcC10YXJnZXRzJywgc3RhdHMudG9wX3RhcmdldHMgfHwgW10pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUud2FybignW3NlY3VyaXR5XSByZWZyZXNoT3ZlcnZpZXcgZmFpbGVkOicsIGUubWVzc2FnZSk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHJlbmRlclRvcExpc3QoaWQsIGl0ZW1zKSB7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgaWYgKCFpdGVtcy5sZW5ndGgpIHsgZWwuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPk5vIGRhdGE8L2Rpdj4nOyByZXR1cm47IH1cbiAgICBlbC5pbm5lckhUTUwgPSAnPHRhYmxlIHN0eWxlPVwid2lkdGg6MTAwJTtmb250LXNpemU6MC44NXJlbTtcIj4nICtcbiAgICAgIGl0ZW1zLm1hcChpdCA9PiBgPHRyPjx0ZCBzdHlsZT1cInBhZGRpbmc6M3B4IDA7d29yZC1icmVhazpicmVhay1hbGw7XCI+JHtlc2NhcGVIdG1sKFN0cmluZyhpdC5rZXkpKX08L3RkPjx0ZCBzdHlsZT1cInRleHQtYWxpZ246cmlnaHQ7Y29sb3I6dmFyKC0tbXV0ZWQpO1wiPiR7aXQuY291bnR9PC90ZD48L3RyPmApLmpvaW4oJycpICtcbiAgICAgICc8L3RhYmxlPic7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09IEVWRU5UUyA9PT09PT09PT09PT09XG4gIGNvbnN0IGZpbHRlclNvdXJjZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWMtZmlsdGVyLXNvdXJjZScpO1xuICBjb25zdCBmaWx0ZXJTZXZlcml0eSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWMtZmlsdGVyLXNldmVyaXR5Jyk7XG4gIGNvbnN0IGZpbHRlckhvc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjLWZpbHRlci1ob3N0Jyk7XG4gIGNvbnN0IGZpbHRlckFjdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlYy1maWx0ZXItYWN0b3InKTtcbiAgY29uc3QgcmVmcmVzaEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWMtcmVmcmVzaC1idG4nKTtcblxuICBbZmlsdGVyU291cmNlLCBmaWx0ZXJTZXZlcml0eSwgZmlsdGVySG9zdF0uZm9yRWFjaChlbCA9PiBlbC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCByZWZyZXNoRXZlbnRzKSk7XG4gIGZpbHRlckFjdG9yLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgZGVib3VuY2UocmVmcmVzaEV2ZW50cywgMjUwKSk7XG4gIHJlZnJlc2hCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCByZWZyZXNoRXZlbnRzKTtcblxuICBhc3luYyBmdW5jdGlvbiByZWZyZXNoRXZlbnRzKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XG4gICAgICBwYXJhbXMuc2V0KCdsaW1pdCcsICcyMDAnKTtcbiAgICAgIGlmIChmaWx0ZXJTb3VyY2UudmFsdWUpICBwYXJhbXMuc2V0KCdzb3VyY2VfdHlwZScsIGZpbHRlclNvdXJjZS52YWx1ZSk7XG4gICAgICBpZiAoZmlsdGVyU2V2ZXJpdHkudmFsdWUpIHBhcmFtcy5zZXQoJ3NldmVyaXR5JywgZmlsdGVyU2V2ZXJpdHkudmFsdWUpO1xuICAgICAgaWYgKGZpbHRlckhvc3QudmFsdWUpICAgIHBhcmFtcy5zZXQoJ3NvdXJjZV9ob3N0JywgZmlsdGVySG9zdC52YWx1ZSk7XG4gICAgICBpZiAoZmlsdGVyQWN0b3IudmFsdWUpICAgcGFyYW1zLnNldCgnYWN0b3JfcHJlZml4JywgZmlsdGVyQWN0b3IudmFsdWUpO1xuXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgL2FwaS92MS9zZWN1cml0eS9ldmVudHM/JHtwYXJhbXN9YCk7XG4gICAgICBjb25zdCBkYXRhID0gKGF3YWl0IHJlcy5qc29uKCkpLmRhdGE7XG4gICAgICBhbGxFdmVudHMgPSBkYXRhLmV2ZW50cyB8fCBbXTtcbiAgICAgIHJlbmRlckV2ZW50cygpO1xuXG4gICAgICAvLyBSZWZyZXNoIGhvc3QgZHJvcGRvd24gaWYgd2UgZG9uJ3QgaGF2ZSBpdCB5ZXRcbiAgICAgIGlmICghZmlsdGVySG9zdC5vcHRpb25zLmxlbmd0aCB8fCBmaWx0ZXJIb3N0Lm9wdGlvbnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGF3YWl0IHJlZnJlc2hIb3N0RmlsdGVyKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlYy1ldmVudHMtY29udGFpbmVyJykuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPkxvYWQgZmFpbGVkOiAnK2VzY2FwZUh0bWwoZS5tZXNzYWdlKSsnPC9kaXY+JztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZW5kZXJFdmVudHMoKSB7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjLWV2ZW50cy1jb250YWluZXInKTtcbiAgICBpZiAoIWFsbEV2ZW50cy5sZW5ndGgpIHsgZWwuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPk5vIGV2ZW50czwvZGl2Pic7IHJldHVybjsgfVxuICAgIGVsLmlubmVySFRNTCA9IGFsbEV2ZW50cy5zbGljZSgwLCAyMDApLm1hcChyZW5kZXJFdmVudFJvdykuam9pbignJyk7XG4gIH1cblxuICBmdW5jdGlvbiByZW5kZXJFdmVudFJvdyhldikge1xuICAgIGNvbnN0IHNldiA9IGV2LnNldmVyaXR5IHx8ICdpbmZvJztcbiAgICBjb25zdCBzZXZDb2xvciA9IHtcbiAgICAgIGNyaXRpY2FsOiAnI2MwMzkyYicsIGVycm9yOiAnI2U3NGMzYycsIHdhcm46ICcjZjM5YzEyJyxcbiAgICAgIG5vdGljZTogJyMzNDk4ZGInLCBpbmZvOiAnIzdmOGM4ZCcsXG4gICAgfVtzZXZdIHx8ICcjN2Y4YzhkJztcbiAgICBjb25zdCB0aW1lID0gZXYudHMgPyBuZXcgRGF0ZShldi50cykudG9Mb2NhbGVUaW1lU3RyaW5nKCkgOiAnJztcbiAgICBjb25zdCBzb3VyY2UgPSBldi5zb3VyY2VfdHlwZSB8fCAnJztcbiAgICBjb25zdCBhY3RvciA9IGV2LmFjdG9yIHx8ICdcdTIwMTQnO1xuICAgIGNvbnN0IHRhcmdldCA9IGV2LnRhcmdldCB8fCAnJztcbiAgICBjb25zdCBhY3Rpb24gPSBldi5hY3Rpb24gfHwgJyc7XG4gICAgY29uc3Qgb3V0Y29tZSA9IGV2Lm91dGNvbWUgfHwgJyc7XG4gICAgcmV0dXJuIGA8ZGl2IGNsYXNzPVwic2VjLWV2ZW50LXJvd1wiIHN0eWxlPVwiZGlzcGxheTpncmlkO2dyaWQtdGVtcGxhdGUtY29sdW1uczo4NHB4IDgwcHggMWZyIDFmciAxMDBweCA5MHB4O2dhcDo4cHg7cGFkZGluZzo1cHggOHB4O2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHZhcigtLWJvcmRlcik7Zm9udC1zaXplOjAuODJyZW07YWxpZ24taXRlbXM6Y2VudGVyO1wiPlxuICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjoke3NldkNvbG9yfTtmb250LXdlaWdodDo2MDA7XCI+JHtlc2NhcGVIdG1sKHNldil9PC9zcGFuPlxuICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjp2YXIoLS1tdXRlZCk7Zm9udC1zaXplOjAuNzVyZW07XCI+JHtlc2NhcGVIdG1sKHNvdXJjZSl9PC9zcGFuPlxuICAgICAgPHNwYW4gdGl0bGU9XCIke2VzY2FwZUh0bWwoYWN0b3IpfVwiIHN0eWxlPVwib3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7d2hpdGUtc3BhY2U6bm93cmFwO1wiPiR7ZXNjYXBlSHRtbChhY3Rvcil9PC9zcGFuPlxuICAgICAgPHNwYW4gdGl0bGU9XCIke2VzY2FwZUh0bWwodGFyZ2V0KX1cIiBzdHlsZT1cIm92ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3doaXRlLXNwYWNlOm5vd3JhcDtcIj4ke2VzY2FwZUh0bWwoYWN0aW9uKX0gJHtlc2NhcGVIdG1sKHRhcmdldCl9PC9zcGFuPlxuICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjp2YXIoLS1tdXRlZCk7Zm9udC1zaXplOjAuNzVyZW07XCI+JHtlc2NhcGVIdG1sKG91dGNvbWUpfTwvc3Bhbj5cbiAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6dmFyKC0tbXV0ZWQpO2ZvbnQtc2l6ZTowLjc1cmVtO3RleHQtYWxpZ246cmlnaHQ7XCI+JHtlc2NhcGVIdG1sKHRpbWUpfTwvc3Bhbj5cbiAgICA8L2Rpdj5gO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gcmVmcmVzaEhvc3RGaWx0ZXIoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL3NlY3VyaXR5L2hvc3RzJyk7XG4gICAgICBjb25zdCBob3N0cyA9IChhd2FpdCByZXMuanNvbigpKS5kYXRhPy5ob3N0cyB8fCBbXTtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSBmaWx0ZXJIb3N0LnZhbHVlO1xuICAgICAgZmlsdGVySG9zdC5pbm5lckhUTUwgPSAnPG9wdGlvbiB2YWx1ZT1cIlwiPkFsbCBob3N0czwvb3B0aW9uPicgK1xuICAgICAgICBob3N0cy5tYXAoaCA9PiBgPG9wdGlvbiB2YWx1ZT1cIiR7ZXNjYXBlSHRtbChoLmlkKX1cIj4ke2VzY2FwZUh0bWwoaC5sYWJlbCB8fCBoLmlkKX08L29wdGlvbj5gKS5qb2luKCcnKTtcbiAgICAgIGlmIChjdXJyZW50KSBmaWx0ZXJIb3N0LnZhbHVlID0gY3VycmVudDtcbiAgICB9IGNhdGNoIHt9XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09IEhPU1RTID09PT09PT09PT09PT1cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlYy1ob3N0LXJlZ2lzdGVyLWJ0bicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgcmVnaXN0ZXJIb3N0UHJvbXB0KTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlYy1ob3N0cy1yZWZyZXNoJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCByZWZyZXNoSG9zdHMpO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIHJlZnJlc2hIb3N0cygpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvc2VjdXJpdHkvaG9zdHMnKTtcbiAgICAgIGNvbnN0IGhvc3RzID0gKGF3YWl0IHJlcy5qc29uKCkpLmRhdGE/Lmhvc3RzIHx8IFtdO1xuICAgICAgYWxsSG9zdHMgPSBob3N0cztcbiAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlYy1ob3N0cy1jb250YWluZXInKTtcbiAgICAgIGlmICghaG9zdHMubGVuZ3RoKSB7IGVsLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj5ObyBob3N0cyByZWdpc3RlcmVkLiBDbGljayBcdTI3OTUgUmVnaXN0ZXIgSG9zdCB0byBhZGQgb25lLjwvZGl2Pic7IHJldHVybjsgfVxuICAgICAgZWwuaW5uZXJIVE1MID0gaG9zdHMubWFwKGggPT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSAhaC5lbmFibGVkID8gJ1x1RDgzRFx1REQzNCBkaXNhYmxlZCdcbiAgICAgICAgICAgICAgICAgICAgIDogIWgubGFzdF9zZWVuX2F0ID8gJ1x1MjZBQSByZWdpc3RlcmVkJ1xuICAgICAgICAgICAgICAgICAgICAgOiAoRGF0ZS5ub3coKSAtIERhdGUucGFyc2UoaC5sYXN0X3NlZW5fYXQpID4gMzAqNjAqMTAwMCkgPyAnXHVEODNEXHVERkUxIHN0YWxlJ1xuICAgICAgICAgICAgICAgICAgICAgOiAnXHVEODNEXHVERkUyIG9ubGluZSc7XG4gICAgICAgIHJldHVybiBgPGRpdiBzdHlsZT1cInBhZGRpbmc6MTBweCAxMnB4O2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHZhcigtLWJvcmRlcik7ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2FsaWduLWl0ZW1zOmNlbnRlcjtcIj5cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPHN0cm9uZz4ke2VzY2FwZUh0bWwoaC5sYWJlbCB8fCBoLmlkKX08L3N0cm9uZz5cbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6dmFyKC0tbXV0ZWQpO21hcmdpbi1sZWZ0OjhweDtmb250LXNpemU6MC44cmVtO1wiPiR7ZXNjYXBlSHRtbChoLnR5cGUpfTwvc3Bhbj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJjb2xvcjp2YXIoLS1tdXRlZCk7Zm9udC1zaXplOjAuNzhyZW07bWFyZ2luLXRvcDoycHg7XCI+XG4gICAgICAgICAgICAgIGlkOiAke2VzY2FwZUh0bWwoaC5pZCl9IFx1MDBCN1xuICAgICAgICAgICAgICByZWdpc3RlcmVkICR7bmV3IERhdGUoaC5yZWdpc3RlcmVkX2F0KS50b0xvY2FsZURhdGVTdHJpbmcoKX0gXHUwMEI3XG4gICAgICAgICAgICAgIGxhc3Qgc2VlbiAke2gubGFzdF9zZWVuX2F0ID8gbmV3IERhdGUoaC5sYXN0X3NlZW5fYXQpLnRvTG9jYWxlU3RyaW5nKCkgOiAnbmV2ZXInfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjAuODVyZW07bWFyZ2luLXJpZ2h0OjEycHg7XCI+JHtzdGF0dXN9PC9zcGFuPlxuICAgICAgICAgICAgJHtoLmlkID09PSAnc2VsZicgPyAnJyA6IGA8YnV0dG9uIGNsYXNzPVwiYnRuLXNtIHNlYy1ob3N0LWRlbFwiIGRhdGEtaWQ9XCIke2VzY2FwZUh0bWwoaC5pZCl9XCIgc3R5bGU9XCJjb2xvcjp2YXIoLS1iYWQtZmcpO1wiPlJlbW92ZTwvYnV0dG9uPmB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PmA7XG4gICAgICB9KS5qb2luKCcnKTtcblxuICAgICAgZWwucXVlcnlTZWxlY3RvckFsbCgnLnNlYy1ob3N0LWRlbCcpLmZvckVhY2goYnRuID0+IHtcbiAgICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGlmICghY29uZmlybShgUmVtb3ZlIGhvc3QgJHtidG4uZGF0YXNldC5pZH0/IEV2ZW50cyBhbHJlYWR5IHJlY2VpdmVkIHdpbGwgcmVtYWluIGluIHRoZSBzdG9yZS5gKSkgcmV0dXJuO1xuICAgICAgICAgIGF3YWl0IGZldGNoKGAvYXBpL3YxL3NlY3VyaXR5L2hvc3RzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGJ0bi5kYXRhc2V0LmlkKX1gLCB7IG1ldGhvZDogJ0RFTEVURScgfSk7XG4gICAgICAgICAgcmVmcmVzaEhvc3RzKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlYy1ob3N0cy1jb250YWluZXInKS5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+TG9hZCBmYWlsZWQ6ICcrZXNjYXBlSHRtbChlLm1lc3NhZ2UpKyc8L2Rpdj4nO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHJlZ2lzdGVySG9zdFByb21wdCgpIHtcbiAgICBjb25zdCBpZCA9IHByb21wdCgnSG9zdCBpZCAobG93ZXJjYXNlLCBubyBzcGFjZXMpOicpO1xuICAgIGlmICghaWQpIHJldHVybjtcbiAgICBjb25zdCBsYWJlbCA9IHByb21wdCgnRGlzcGxheSBsYWJlbDonLCBpZCkgfHwgaWQ7XG4gICAgY29uc3QgdHlwZSAgPSBwcm9tcHQoJ1R5cGUgKFwiZGFzaGNhZGR5XCIsIFwic2VydmljZVwiLCBvciBcImFnZW50XCIpOicsICdhZ2VudCcpIHx8ICdhZ2VudCc7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL3NlY3VyaXR5L2hvc3RzJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgaWQsIGxhYmVsLCB0eXBlIH0pLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmICghcmVzLm9rKSB7IGFsZXJ0KCdGYWlsZWQ6ICcgKyAoZGF0YT8uZXJyb3I/Lm1lc3NhZ2UgfHwgcmVzLnN0YXR1c1RleHQpKTsgcmV0dXJuOyB9XG4gICAgICAvLyBTaG93IHRoZSBhcGlfa2V5IE9OQ0UgaW4gYSBkaWFsb2dcbiAgICAgIGFsZXJ0KGBcdTI3MDUgSG9zdCByZWdpc3RlcmVkIVxcblxcbmlkOiAke2RhdGEuZGF0YS5ob3N0LmlkfVxcbmxhYmVsOiAke2RhdGEuZGF0YS5ob3N0LmxhYmVsfVxcbnR5cGU6ICR7ZGF0YS5kYXRhLmhvc3QudHlwZX1cXG5cXG5cdUQ4M0RcdUREMTEgQVBJIEtFWSAoc2F2ZSB0aGlzIE5PVyBcdTIwMTQgd29uJ3QgYmUgc2hvd24gYWdhaW4pOlxcblxcbiR7ZGF0YS5kYXRhLmFwaV9rZXl9XFxuXFxuU2VuZCB0aGlzIGtleSBhczogQXV0aG9yaXphdGlvbjogQmVhcmVyIDxhcGlfa2V5PlxcblRvIGVuZHBvaW50OiBQT1NUIC9hcGkvdjEvc2VjdXJpdHkvZXZlbnRzL2luZ2VzdCBvciAvZXZlbnRzL2JhdGNoYCk7XG4gICAgICByZWZyZXNoSG9zdHMoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBhbGVydCgnRmFpbGVkOiAnICsgZS5tZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09IEhFTFBFUlMgPT09PT09PT09PT09PVxuICBmdW5jdGlvbiBlc2NhcGVIdG1sKHMpIHtcbiAgICByZXR1cm4gU3RyaW5nKHMpLnJlcGxhY2UoL1smPD5cIiddL2csIGMgPT4gKHsnJic6JyZhbXA7JywnPCc6JyZsdDsnLCc+JzonJmd0OycsJ1wiJzonJnF1b3Q7JyxcIidcIjonJiMzOTsnfVtjXSkpO1xuICB9XG4gIGZ1bmN0aW9uIGRlYm91bmNlKGZuLCBtcykge1xuICAgIGxldCB0OyByZXR1cm4gZnVuY3Rpb24oKSB7IGNsZWFyVGltZW91dCh0KTsgdCA9IHNldFRpbWVvdXQoKCkgPT4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKSwgbXMpOyB9O1xuICB9XG59KSgpOztcbi8vID09PT09PT09PT0gU0hJUERFQ0sgREVQTE9ZUyAoREMtMTMwKSA9PT09PT09PT09XG4vLyBTb3VyY2UgZGVwbG95cyBwYW5lbDogZHJpdmVzIHRoZSBzaGlwZGVjayBDTEkgdmlhIHRoZSBEYXNoQ2FkZHlcbi8vIC9hcGkvdjEvZGVwbG95cyBicmlkZ2UgcHJveHkuIE1vZGFsIGxpc3RzIGRlcGxveWFibGUgcmVwb3MgKyBkZXBsb3llZFxuLy8gc2VydmljZXMsIHNob3dzIHRoZSBqb3VybmFsLCBhbmQgcnVucyBkZXBsb3kvcm9sbGJhY2sgd2l0aCBsaXZlIG91dHB1dC5cbi8vXG4vLyBGb2xsb3dzIHRoZSBzZWN1cml0eS1jZW50ZXIuanMgbW9kYWwgcGF0dGVybiAoaW5qZWN0TW9kYWwgKyBidXR0b24gaW4gdGhlXG4vLyB0b3AgYmFyKSBhbmQgdGhlIHdlYXRoZXItbW9kYWwgdmlzdWFsIGxhbmd1YWdlLlxuXG4oZnVuY3Rpb24gKCkge1xuICBpbmplY3RNb2RhbCgnZGVwbG95cy1tb2RhbCcsIGA8ZGl2IGlkPVwiZGVwbG95cy1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogODYwcHg7IG1heC13aWR0aDogMTIwMHB4O1wiPlxuICAgICAgPGgzPlx1RDgzRFx1REU5QSBEZXBsb3lzPC9oMz5cbiAgICAgIDxwIGNsYXNzPVwibW9kYWwtc3VidGl0bGVcIj5cbiAgICAgICAgU291cmNlIGRlcGxveXMgdmlhIHNoaXBkZWNrOiBidWlsZCBcdTIxOTIgcGFja2FnZSBcdTIxOTIgc3lzdGVtZCByZWxlYXNlIFx1MjE5MiBDYWRkeSBnYXRlIFx1MjE5MiBETlMgXHUyMTkyIHZlcmlmeS5cbiAgICAgIDwvcD5cblxuICAgICAgPGRpdiBjbGFzcz1cInNlYy10YWJzXCIgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjhweDttYXJnaW4tYm90dG9tOjE0cHg7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRlcC10YWIgYWN0aXZlXCIgZGF0YS10YWI9XCJzZXJ2aWNlc1wiPlNlcnZpY2VzPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJkZXAtdGFiXCIgZGF0YS10YWI9XCJkZXBsb3lcIj5EZXBsb3k8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRlcC10YWJcIiBkYXRhLXRhYj1cImpvdXJuYWxcIj5Kb3VybmFsPC9idXR0b24+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBTRVJWSUNFUyBUQUIgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGVwLXBhbmVsXCIgZGF0YS1wYW5lbD1cInNlcnZpY2VzXCI+XG4gICAgICAgIDxkaXYgaWQ9XCJkZXAtc2VydmljZXNcIiBjbGFzcz1cInNjcm9sbC1jb250YWluZXJcIiBzdHlsZT1cIm1heC1oZWlnaHQ6MzIwcHg7XCI+TG9hZGluZ1x1MjAyNjwvZGl2PlxuICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDoxMHB4O2Rpc3BsYXk6ZmxleDtnYXA6OHB4O2FsaWduLWl0ZW1zOmNlbnRlcjtcIj5cbiAgICAgICAgICA8aW5wdXQgaWQ9XCJkZXAtc3RhdHVzLW5hbWVcIiBwbGFjZWhvbGRlcj1cInNlcnZpY2UgbmFtZVwiIHN0eWxlPVwid2lkdGg6MjIwcHg7XCIgLz5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuXCIgaWQ9XCJkZXAtc3RhdHVzLWJ0blwiPkNoZWNrIHN0YXR1czwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIERFUExPWSBUQUIgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGVwLXBhbmVsXCIgZGF0YS1wYW5lbD1cImRlcGxveVwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2dhcDo4cHg7YWxpZ24taXRlbXM6Y2VudGVyO21hcmdpbi1ib3R0b206MTBweDtcIj5cbiAgICAgICAgICA8c2VsZWN0IGlkPVwiZGVwLXJlcG8tc2VsZWN0XCIgc3R5bGU9XCJtaW4td2lkdGg6MjgwcHg7XCI+PG9wdGlvbj5Mb2FkaW5nXHUyMDI2PC9vcHRpb24+PC9zZWxlY3Q+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIGlkPVwiZGVwLWRlcGxveS1idG5cIj5EZXBsb3k8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxwIGNsYXNzPVwibW9kYWwtc3VidGl0bGVcIj5EZXBsb3lzIGFyZSBzZXJpYWxpemVkIGZsZWV0LXNpZGU7IGEgcnVuIHRha2VzIH4zMC02MHMuIE91dHB1dCBzdHJlYW1zIGJlbG93IHdoZW4gaXQgZmluaXNoZXMuPC9wPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gSk9VUk5BTCBUQUIgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGVwLXBhbmVsXCIgZGF0YS1wYW5lbD1cImpvdXJuYWxcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6OHB4O2FsaWduLWl0ZW1zOmNlbnRlcjttYXJnaW4tYm90dG9tOjEwcHg7XCI+XG4gICAgICAgICAgPGlucHV0IGlkPVwiZGVwLWpvdXJuYWwtbmFtZVwiIHBsYWNlaG9sZGVyPVwic2VydmljZSAoZW1wdHkgPSBhbGwpXCIgc3R5bGU9XCJ3aWR0aDoyMjBweDtcIiAvPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG5cIiBpZD1cImRlcC1qb3VybmFsLWJ0blwiPlJlZnJlc2g8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJkZXAtam91cm5hbFwiIGNsYXNzPVwic2Nyb2xsLWNvbnRhaW5lclwiIHN0eWxlPVwibWF4LWhlaWdodDozMjBweDtcIj5Mb2FkaW5nXHUyMDI2PC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBPVVRQVVQgLS0+XG4gICAgICA8cHJlIGlkPVwiZGVwLW91dHB1dFwiIGNsYXNzPVwic2Nyb2xsLWNvbnRhaW5lclwiIHN0eWxlPVwiZGlzcGxheTpub25lO21heC1oZWlnaHQ6MjYwcHg7bWFyZ2luLXRvcDoxMnB4O2JhY2tncm91bmQ6dmFyKC0tYmctMiwjMTExKTtwYWRkaW5nOjEwcHg7Ym9yZGVyLXJhZGl1czo4cHg7d2hpdGUtc3BhY2U6cHJlLXdyYXA7XCI+PC9wcmU+XG5cbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kO2dhcDo4cHg7bWFyZ2luLXRvcDoxNHB4O1wiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuXCIgaWQ9XCJkZXAtY2xvc2VcIj5DbG9zZTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PmApO1xuXG4gIGNvbnN0ICQgPSAoaWQpID0+IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgbGV0IG9wZW5CdG4gPSBudWxsO1xuICBsZXQgbG9hZGVkT25jZSA9IGZhbHNlO1xuXG4gIGZ1bmN0aW9uIGVzYyhzKSB7XG4gICAgcmV0dXJuIHdpbmRvdy5lc2NhcGVIdG1sID8gd2luZG93LmVzY2FwZUh0bWwoU3RyaW5nKHMpKSA6IFN0cmluZyhzKS5yZXBsYWNlKC9bJjw+XCInXS9nLCAoYykgPT4gKHsnJic6JyZhbXA7JywnPCc6JyZsdDsnLCc+JzonJmd0OycsJ1wiJzonJnF1b3Q7JyxcIidcIjonJiMzOTsnfVtjXSkpO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gYXBpKHBhdGgsIG9wdHMpIHtcbiAgICBjb25zdCByID0gYXdhaXQgZmV0Y2goJy9kYXNoY2FkZHktYXBpL2FwaS92MS9kZXBsb3lzJyArIHBhdGgsIE9iamVjdC5hc3NpZ24oeyBjcmVkZW50aWFsczogJ2luY2x1ZGUnIH0sIG9wdHMgfHwge30pKTtcbiAgICBsZXQgYm9keSA9IG51bGw7XG4gICAgdHJ5IHsgYm9keSA9IGF3YWl0IHIuanNvbigpOyB9IGNhdGNoIChlKSB7IGJvZHkgPSB7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ25vbi1KU09OIHJlc3BvbnNlJyB9OyB9XG4gICAgcmV0dXJuIHsgc3RhdHVzOiByLnN0YXR1cywgYm9keSB9O1xuICB9XG5cbiAgZnVuY3Rpb24gc2hvd091dHB1dCh0ZXh0KSB7XG4gICAgY29uc3QgZWwgPSAkKCdkZXAtb3V0cHV0Jyk7XG4gICAgZWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgZWwudGV4dENvbnRlbnQgPSB0ZXh0IHx8ICcobm8gb3V0cHV0KSc7XG4gICAgZWwuc2Nyb2xsVG9wID0gZWwuc2Nyb2xsSGVpZ2h0O1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZFNlcnZpY2VzKCkge1xuICAgIGNvbnN0IGVsID0gJCgnZGVwLXNlcnZpY2VzJyk7XG4gICAgY29uc3QgeyBib2R5IH0gPSBhd2FpdCBhcGkoJy9zZXJ2aWNlcycpO1xuICAgIGlmICghYm9keS5zdWNjZXNzKSB7XG4gICAgICBlbC5pbm5lckhUTUwgPSAnPGVtPicgKyBlc2MoYm9keS5lcnJvciB8fCAndW5hdmFpbGFibGUnKSArICc8L2VtPic7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJvd3MgPSBib2R5LnNlcnZpY2VzIHx8IFtdO1xuICAgIGlmICghcm93cy5sZW5ndGgpIHtcbiAgICAgIGVsLmlubmVySFRNTCA9ICc8ZW0+Tm8gc2hpcGRlY2sgZGVwbG95bWVudHMgb24gcmVjb3JkIHlldC48L2VtPic7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsLmlubmVySFRNTCA9ICc8dGFibGUgY2xhc3M9XCJ0YWJsZVwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIj48dGhlYWQ+PHRyPicgK1xuICAgICAgJzx0aD5TZXJ2aWNlPC90aD48dGg+TGFzdCBhY3Rpb248L3RoPjx0aD5XaGVuPC90aD48dGg+UmVsZWFzZTwvdGg+PHRoPjwvdGg+JyArXG4gICAgICAnPC90cj48L3RoZWFkPjx0Ym9keT4nICtcbiAgICAgIHJvd3MubWFwKChzKSA9PlxuICAgICAgICAnPHRyPicgK1xuICAgICAgICAnPHRkPjxzdHJvbmc+JyArIGVzYyhzLm5hbWUpICsgJzwvc3Ryb25nPjwvdGQ+JyArXG4gICAgICAgICc8dGQ+JyArIGVzYyhzLmxhc3RfYWN0aW9uKSArICc8L3RkPicgK1xuICAgICAgICAnPHRkPicgKyBlc2Mocy5sYXN0X3RpbWUpICsgJzwvdGQ+JyArXG4gICAgICAgICc8dGQ+JyArIGVzYyhzLmxhc3RfZXBvY2gpICsgJzwvdGQ+JyArXG4gICAgICAgICc8dGQ+PGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gZGVwLXJvbGxiYWNrXCIgZGF0YS1zZXJ2aWNlPVwiJyArIGVzYyhzLm5hbWUpICsgJ1wiPlJvbGxiYWNrPC9idXR0b24+ICcgK1xuICAgICAgICAnPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gZGVwLXN0YXR1c1wiIGRhdGEtc2VydmljZT1cIicgKyBlc2Mocy5uYW1lKSArICdcIj5TdGF0dXM8L2J1dHRvbj48L3RkPicgK1xuICAgICAgICAnPC90cj4nXG4gICAgICApLmpvaW4oJycpICsgJzwvdGJvZHk+PC90YWJsZT4nO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZFJlcG9zKCkge1xuICAgIGNvbnN0IHNlbCA9ICQoJ2RlcC1yZXBvLXNlbGVjdCcpO1xuICAgIGNvbnN0IHsgYm9keSB9ID0gYXdhaXQgYXBpKCcvcmVwb3MnKTtcbiAgICBpZiAoIWJvZHkuc3VjY2Vzcykge1xuICAgICAgc2VsLmlubmVySFRNTCA9ICc8b3B0aW9uPicgKyBlc2MoYm9keS5lcnJvciB8fCAndW5hdmFpbGFibGUnKSArICc8L29wdGlvbj4nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCByZXBvcyA9IGJvZHkucmVwb3MgfHwgW107XG4gICAgc2VsLmlubmVySFRNTCA9IHJlcG9zLmxlbmd0aFxuICAgICAgPyByZXBvcy5tYXAoKHIpID0+ICc8b3B0aW9uIHZhbHVlPVwiJyArIGVzYyhyLmRpcikgKyAnXCI+JyArIGVzYyhyLm5hbWUpICsgJzwvb3B0aW9uPicpLmpvaW4oJycpXG4gICAgICA6ICc8b3B0aW9uIHZhbHVlPVwiXCI+KG5vIHJlcG9zIHdpdGggYSBTaGlwZGVja2ZpbGUgZm91bmQpPC9vcHRpb24+JztcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRKb3VybmFsKHNlcnZpY2UpIHtcbiAgICBjb25zdCBlbCA9ICQoJ2RlcC1qb3VybmFsJyk7XG4gICAgY29uc3QgcXMgPSBzZXJ2aWNlID8gJz9zZXJ2aWNlPScgKyBlbmNvZGVVUklDb21wb25lbnQoc2VydmljZSkgOiAnJztcbiAgICBjb25zdCB7IGJvZHkgfSA9IGF3YWl0IGFwaSgnL2pvdXJuYWwnICsgcXMpO1xuICAgIGNvbnN0IHJvd3MgPSAoYm9keS5yb3dzIHx8IFtdKTtcbiAgICBpZiAoIXJvd3MubGVuZ3RoKSB7XG4gICAgICBlbC5pbm5lckhUTUwgPSAnPGVtPk5vIGpvdXJuYWwgcm93cy48L2VtPic7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsLmlubmVySFRNTCA9ICc8dGFibGUgY2xhc3M9XCJ0YWJsZVwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIj48dGhlYWQ+PHRyPicgK1xuICAgICAgJzx0aD5UaW1lPC90aD48dGg+U2VydmljZTwvdGg+PHRoPkFjdGlvbjwvdGg+PHRoPlJlbGVhc2U8L3RoPjx0aD5EdXJhdGlvbjwvdGg+JyArXG4gICAgICAnPC90cj48L3RoZWFkPjx0Ym9keT4nICtcbiAgICAgIHJvd3MubWFwKChyKSA9PlxuICAgICAgICAnPHRyPjx0ZD4nICsgZXNjKHIudGltZSkgKyAnPC90ZD48dGQ+JyArIGVzYyhyLnNlcnZpY2UpICsgJzwvdGQ+PHRkPicgKyBlc2Moci5hY3Rpb24pICtcbiAgICAgICAgJzwvdGQ+PHRkPicgKyBlc2Moci5lcG9jaCkgKyAnPC90ZD48dGQ+JyArIGVzYyhyLmR1cmF0aW9uIHx8ICdcdTIwMTQnKSArICc8L3RkPjwvdHI+J1xuICAgICAgKS5qb2luKCcnKSArICc8L3Rib2R5PjwvdGFibGU+JztcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldEJ1c3koYnVzeSwgYnRuLCBsYWJlbCkge1xuICAgIGlmICghYnRuKSByZXR1cm47XG4gICAgYnRuLmRpc2FibGVkID0gYnVzeTtcbiAgICBpZiAobGFiZWwpIGJ0bi50ZXh0Q29udGVudCA9IGJ1c3kgPyAnV29ya2luZ1x1MjAyNicgOiBsYWJlbDtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHJ1bkRlcGxveSgpIHtcbiAgICBjb25zdCBidG4gPSAkKCdkZXAtZGVwbG95LWJ0bicpO1xuICAgIGNvbnN0IGRpciA9ICQoJ2RlcC1yZXBvLXNlbGVjdCcpLnZhbHVlO1xuICAgIGlmICghZGlyKSByZXR1cm47XG4gICAgc2V0QnVzeSh0cnVlLCBidG4sICdEZXBsb3knKTtcbiAgICBzaG93T3V0cHV0KCdEZXBsb3lpbmcgJyArIGRpciArICdcXG5UaGlzIGNhbiB0YWtlIH4zMC02MHNcdTIwMjYnKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBib2R5IH0gPSBhd2FpdCBhcGkoJy9kZXBsb3knLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBkaXIgfSksXG4gICAgICB9KTtcbiAgICAgIHNob3dPdXRwdXQoKGJvZHkub3V0cHV0IHx8IGJvZHkuZXJyb3IgfHwgJycpICsgKGJvZHkuc3VjY2VzcyA/ICdcXG5cdTI3MDUgU1VDQ0VTUycgOiAnXFxuXHUyNzRDIEZBSUxFRCcpKTtcbiAgICAgIGxvYWRTZXJ2aWNlcygpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHNob3dPdXRwdXQoJ2RlcGxveSBlcnJvcjogJyArIGUubWVzc2FnZSk7XG4gICAgfVxuICAgIHNldEJ1c3koZmFsc2UsIGJ0biwgJ0RlcGxveScpO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gcnVuUm9sbGJhY2soc2VydmljZSwgYnRuKSB7XG4gICAgaWYgKCFjb25maXJtKCdSb2xsIGJhY2sgJyArIHNlcnZpY2UgKyAnIHRvIHRoZSBwcmV2aW91cyByZWxlYXNlPycpKSByZXR1cm47XG4gICAgc2V0QnVzeSh0cnVlLCBidG4sICdSb2xsYmFjaycpO1xuICAgIHNob3dPdXRwdXQoJ1JvbGxpbmcgYmFjayAnICsgc2VydmljZSArICdcdTIwMjYnKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBib2R5IH0gPSBhd2FpdCBhcGkoJy9yb2xsYmFjaycsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHNlcnZpY2UgfSksXG4gICAgICB9KTtcbiAgICAgIHNob3dPdXRwdXQoKGJvZHkub3V0cHV0IHx8IGJvZHkuZXJyb3IgfHwgJycpICsgKGJvZHkuc3VjY2VzcyA/ICdcXG5cdTI3MDUgUk9MTEVEIEJBQ0snIDogJ1xcblx1Mjc0QyBGQUlMRUQnKSk7XG4gICAgICBsb2FkU2VydmljZXMoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzaG93T3V0cHV0KCdyb2xsYmFjayBlcnJvcjogJyArIGUubWVzc2FnZSk7XG4gICAgfVxuICAgIHNldEJ1c3koZmFsc2UsIGJ0biwgJ1JvbGxiYWNrJyk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBydW5TdGF0dXMoc2VydmljZSwgYnRuKSB7XG4gICAgc2V0QnVzeSh0cnVlLCBidG4sICdTdGF0dXMnKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBib2R5IH0gPSBhd2FpdCBhcGkoJy9zdGF0dXM/c2VydmljZT0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHNlcnZpY2UpKTtcbiAgICAgIHNob3dPdXRwdXQoYm9keS5vdXRwdXQgfHwgYm9keS5lcnJvciB8fCAnKG5vIG91dHB1dCknKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzaG93T3V0cHV0KCdzdGF0dXMgZXJyb3I6ICcgKyBlLm1lc3NhZ2UpO1xuICAgIH1cbiAgICBzZXRCdXN5KGZhbHNlLCBidG4sICdTdGF0dXMnKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHdpcmUoKSB7XG4gICAgb3BlbkJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZXBsb3lzLWJ0bicpO1xuICAgIGlmICghb3BlbkJ0bikgcmV0dXJuO1xuXG4gICAgb3BlbkJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICAgICQoJ2RlcGxveXMtbW9kYWwnKS5jbGFzc0xpc3QuYWRkKCdvcGVuJyk7XG4gICAgICBpZiAoIWxvYWRlZE9uY2UpIHtcbiAgICAgICAgbG9hZGVkT25jZSA9IHRydWU7XG4gICAgICAgIGxvYWRTZXJ2aWNlcygpO1xuICAgICAgICBsb2FkUmVwb3MoKTtcbiAgICAgICAgbG9hZEpvdXJuYWwoJycpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgJCgnZGVwLWNsb3NlJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAkKCdkZXBsb3lzLW1vZGFsJykuY2xhc3NMaXN0LnJlbW92ZSgnb3BlbicpO1xuICAgIH0pO1xuXG4gICAgLy8gdGFiIHN3aXRjaGluZ1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kZXAtdGFiJykuZm9yRWFjaCgodGFiKSA9PiB7XG4gICAgICB0YWIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kZXAtdGFiJykuZm9yRWFjaCgodCkgPT4gdC5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKSk7XG4gICAgICAgIHRhYi5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI2RlcGxveXMtbW9kYWwgLmRlcC1wYW5lbCcpLmZvckVhY2goKHApID0+IHtcbiAgICAgICAgICBwLnN0eWxlLmRpc3BsYXkgPSBwLmRhdGFzZXQucGFuZWwgPT09IHRhYi5kYXRhc2V0LnRhYiA/ICdibG9jaycgOiAnbm9uZSc7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAkKCdkZXAtZGVwbG95LWJ0bicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgcnVuRGVwbG95KTtcblxuICAgICQoJ2RlcC1qb3VybmFsLWJ0bicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gbG9hZEpvdXJuYWwoJCgnZGVwLWpvdXJuYWwtbmFtZScpLnZhbHVlLnRyaW0oKSkpO1xuICAgICQoJ2RlcC1zdGF0dXMtYnRuJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCBuYW1lID0gJCgnZGVwLXN0YXR1cy1uYW1lJykudmFsdWUudHJpbSgpO1xuICAgICAgaWYgKG5hbWUpIHJ1blN0YXR1cyhuYW1lKTtcbiAgICB9KTtcblxuICAgIC8vIGR5bmFtaWMgYnV0dG9ucyAoc2VydmljZSB0YWJsZSlcbiAgICAkKCdkZXAtc2VydmljZXMnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICBjb25zdCByYiA9IGUudGFyZ2V0LmNsb3Nlc3QoJy5kZXAtcm9sbGJhY2snKTtcbiAgICAgIGlmIChyYikgcmV0dXJuIHJ1blJvbGxiYWNrKHJiLmRhdGFzZXQuc2VydmljZSwgcmIpO1xuICAgICAgY29uc3Qgc2IgPSBlLnRhcmdldC5jbG9zZXN0KCcuZGVwLXN0YXR1cycpO1xuICAgICAgaWYgKHNiKSByZXR1cm4gcnVuU3RhdHVzKHNiLmRhdGFzZXQuc2VydmljZSwgc2IpO1xuICAgIH0pO1xuICB9XG5cbiAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdsb2FkaW5nJykge1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCB3aXJlKTtcbiAgfSBlbHNlIHtcbiAgICB3aXJlKCk7XG4gIH1cbn0pKCk7XG47XG4vLyA9PT09PT09PT09IFdFQVRIRVIgV0lER0VUID09PT09PT09PT1cbihmdW5jdGlvbigpIHtcbiAgY29uc3QgZXJyb3JIYW5kbGVyID0gbmV3IEVycm9ySGFuZGxlcigpO1xuICAvLyBJbmplY3QgbW9kYWwgSFRNTFxuICBpbmplY3RNb2RhbCgnd2VhdGhlci1tb2RhbCcsIGA8ZGl2IGlkPVwid2VhdGhlci1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPjxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIj48aDM+V2VhdGhlciBTZXR0aW5nczwvaDM+XG4gICAgPGxhYmVsIGZvcj1cIndlYXRoZXItbG9jYXRpb24taW5wdXRcIj5Mb2NhdGlvbjo8L2xhYmVsPlxuICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwid2VhdGhlci1sb2NhdGlvbi1pbnB1dFwiIHBsYWNlaG9sZGVyPVwiQ2l0eSBuYW1lIG9yIFpJUCAoZS5nLiwgSGFtYnVyZywgOTAyMTApXCIgbWF4bGVuZ3RoPVwiMTAwXCI+XG4gICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC43OHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLXRvcDogNHB4O1wiPkVudGVyIGEgY2l0eSBuYW1lLCBwb3N0YWwgY29kZSwgb3IgJmxkcXVvO0NpdHksIENvdW50cnkmcmRxdW87PC9kaXY+XG4gICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDE0cHg7IHBhZGRpbmctdG9wOiAxMnB4OyBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5cbiAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6IGJsb2NrOyBtYXJnaW4tYm90dG9tOiA4cHg7IGZvbnQtd2VpZ2h0OiA2MDA7IGNvbG9yOiB2YXIoLS1mZyk7XCI+VW5pdHM8L2xhYmVsPlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogOHB4O1wiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJ3ZWF0aGVyLXVuaXQtb3B0aW9uXCI+PGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJ3ZWF0aGVyLXVuaXQtcmFkaW9cIiB2YWx1ZT1cImltcGVyaWFsXCI+PHNwYW4gY2xhc3M9XCJ3ZWF0aGVyLXVuaXQtY2FyZFwiPiZkZWc7RiAvIG1waDwvc3Bhbj48L2xhYmVsPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJ3ZWF0aGVyLXVuaXQtb3B0aW9uXCI+PGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJ3ZWF0aGVyLXVuaXQtcmFkaW9cIiB2YWx1ZT1cIm1ldHJpY1wiPjxzcGFuIGNsYXNzPVwid2VhdGhlci11bml0LWNhcmRcIj4mZGVnO0MgLyBrbS9oPC9zcGFuPjwvbGFiZWw+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zXCI+PGJ1dHRvbiBpZD1cIndlYXRoZXItY2FuY2VsXCI+Q2FuY2VsPC9idXR0b24+PGJ1dHRvbiBpZD1cIndlYXRoZXItc2F2ZVwiPlNhdmU8L2J1dHRvbj48L2Rpdj48L2Rpdj48L2Rpdj5gKTtcblxuICAvKiBXZWF0aGVyIFdpZGdldCBcdTIwMTQgcG93ZXJlZCBieSBPcGVuLU1ldGVvIChmcmVlLCBubyBBUEkga2V5KSAqL1xuICBjb25zdCBMT0NBVElPTl9LRVkgPSAnd2VhdGhlci1sb2NhdGlvbic7XG4gIGNvbnN0IExFR0FDWV9LRVkgPSAnd2VhdGhlci16aXAnO1xuICBjb25zdCBHRU9fQ0FDSEVfS0VZID0gJ3dlYXRoZXItZ2VvJztcbiAgY29uc3QgVU5JVF9LRVkgPSAnd2VhdGhlci11bml0JztcblxuICAvLyBNaWdyYXRlIGZyb20gb2xkIFpJUC1vbmx5IGtleVxuICBpZiAoIXNhZmVHZXQoTE9DQVRJT05fS0VZKSAmJiBzYWZlR2V0KExFR0FDWV9LRVkpKSB7XG4gICAgc2FmZVNldChMT0NBVElPTl9LRVksIHNhZmVHZXQoTEVHQUNZX0tFWSkpO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0VW5pdCgpIHtcbiAgICByZXR1cm4gc2FmZUdldChVTklUX0tFWSkgfHwgJ2ltcGVyaWFsJztcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFdlYXRoZXJFbGVtZW50cygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWNvbjogZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLndlYXRoZXItaWNvbicpLFxuICAgICAgdGVtcDogZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLndlYXRoZXItdGVtcCcpLFxuICAgICAgY29uZGl0aW9uOiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcud2VhdGhlci1jb25kaXRpb24nKSxcbiAgICAgIGxvY2F0aW9uOiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcud2VhdGhlci1sb2NhdGlvbicpLFxuICAgICAgd2luZDogZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLndlYXRoZXItd2luZCcpXG4gICAgfTtcbiAgfVxuXG4gIC8vIFdNTyBXZWF0aGVyIENvZGUgbWFwcGluZ1xuICBjb25zdCB3bW9EZXNjcmlwdGlvbnMgPSB7XG4gICAgMDogJ0NsZWFyIHNreScsIDE6ICdNYWlubHkgY2xlYXInLCAyOiAnUGFydGx5IGNsb3VkeScsIDM6ICdPdmVyY2FzdCcsXG4gICAgNDU6ICdGb2cnLCA0ODogJ1JpbWUgZm9nJyxcbiAgICA1MTogJ0xpZ2h0IGRyaXp6bGUnLCA1MzogJ0RyaXp6bGUnLCA1NTogJ0RlbnNlIGRyaXp6bGUnLFxuICAgIDU2OiAnRnJlZXppbmcgZHJpenpsZScsIDU3OiAnRGVuc2UgZnJlZXppbmcgZHJpenpsZScsXG4gICAgNjE6ICdMaWdodCByYWluJywgNjM6ICdNb2RlcmF0ZSByYWluJywgNjU6ICdIZWF2eSByYWluJyxcbiAgICA2NjogJ0xpZ2h0IGZyZWV6aW5nIHJhaW4nLCA2NzogJ0hlYXZ5IGZyZWV6aW5nIHJhaW4nLFxuICAgIDcxOiAnTGlnaHQgc25vdycsIDczOiAnTW9kZXJhdGUgc25vdycsIDc1OiAnSGVhdnkgc25vdycsIDc3OiAnU25vdyBncmFpbnMnLFxuICAgIDgwOiAnTGlnaHQgc2hvd2VycycsIDgxOiAnTW9kZXJhdGUgc2hvd2VycycsIDgyOiAnVmlvbGVudCBzaG93ZXJzJyxcbiAgICA4NTogJ0xpZ2h0IHNub3cgc2hvd2VycycsIDg2OiAnSGVhdnkgc25vdyBzaG93ZXJzJyxcbiAgICA5NTogJ1RodW5kZXJzdG9ybScsIDk2OiAnVGh1bmRlcnN0b3JtIHdpdGggaGFpbCcsIDk5OiAnU2V2ZXJlIHRodW5kZXJzdG9ybSdcbiAgfTtcblxuICBjb25zdCB3bW9JY29ucyA9IHtcbiAgICAwOiAnXHUyNjAwXHVGRTBGJywgMTogJ1x1RDgzQ1x1REYyNFx1RkUwRicsIDI6ICdcdTI2QzUnLCAzOiAnXHUyNjAxXHVGRTBGJyxcbiAgICA0NTogJ1x1RDgzQ1x1REYyQlx1RkUwRicsIDQ4OiAnXHVEODNDXHVERjJCXHVGRTBGJyxcbiAgICA1MTogJ1x1RDgzQ1x1REYyNlx1RkUwRicsIDUzOiAnXHVEODNDXHVERjI2XHVGRTBGJywgNTU6ICdcdUQ4M0NcdURGMjZcdUZFMEYnLFxuICAgIDU2OiAnXHVEODNDXHVERjI4XHVGRTBGJywgNTc6ICdcdUQ4M0NcdURGMjhcdUZFMEYnLFxuICAgIDYxOiAnXHVEODNDXHVERjI2XHVGRTBGJywgNjM6ICdcdUQ4M0NcdURGMjdcdUZFMEYnLCA2NTogJ1x1RDgzQ1x1REYyN1x1RkUwRicsXG4gICAgNjY6ICdcdUQ4M0NcdURGMjhcdUZFMEYnLCA2NzogJ1x1RDgzQ1x1REYyOFx1RkUwRicsXG4gICAgNzE6ICdcdUQ4M0NcdURGMjhcdUZFMEYnLCA3MzogJ1x1Mjc0NFx1RkUwRicsIDc1OiAnXHUyNzQ0XHVGRTBGJywgNzc6ICdcdTI3NDRcdUZFMEYnLFxuICAgIDgwOiAnXHVEODNDXHVERjI2XHVGRTBGJywgODE6ICdcdUQ4M0NcdURGMjdcdUZFMEYnLCA4MjogJ1x1RDgzQ1x1REYyN1x1RkUwRicsXG4gICAgODU6ICdcdUQ4M0NcdURGMjhcdUZFMEYnLCA4NjogJ1x1Mjc0NFx1RkUwRicsXG4gICAgOTU6ICdcdTI2QzhcdUZFMEYnLCA5NjogJ1x1MjZDOFx1RkUwRicsIDk5OiAnXHUyNkM4XHVGRTBGJ1xuICB9O1xuXG4gIC8vIFdpbmQgZGlyZWN0aW9uIGZyb20gZGVncmVlc1xuICBjb25zdCB3aW5kRGlycyA9IFsnTicsJ05ORScsJ05FJywnRU5FJywnRScsJ0VTRScsJ1NFJywnU1NFJywnUycsJ1NTVycsJ1NXJywnV1NXJywnVycsJ1dOVycsJ05XJywnTk5XJ107XG4gIGZ1bmN0aW9uIGRlZ1RvRGlyKGRlZykge1xuICAgIHJldHVybiB3aW5kRGlyc1tNYXRoLnJvdW5kKGRlZyAvIDIyLjUpICUgMTZdO1xuICB9XG5cbiAgLy8gR2VvY29kZSBsb2NhdGlvbiB2aWEgT3Blbi1NZXRlbywgd2l0aCBsb2NhbFN0b3JhZ2UgY2FjaGVcbiAgYXN5bmMgZnVuY3Rpb24gZ2VvY29kZUxvY2F0aW9uKHF1ZXJ5KSB7XG4gICAgY29uc3QgY2FjaGVkID0gc2FmZUdldChHRU9fQ0FDSEVfS0VZKTtcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBnZW8gPSBKU09OLnBhcnNlKGNhY2hlZCk7XG4gICAgICAgIGlmIChnZW8ucXVlcnkgPT09IHF1ZXJ5KSByZXR1cm4gZ2VvO1xuICAgICAgfSBjYXRjaCB7fVxuICAgIH1cbiAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2goYGh0dHBzOi8vZ2VvY29kaW5nLWFwaS5vcGVuLW1ldGVvLmNvbS92MS9zZWFyY2g/bmFtZT0ke2VuY29kZVVSSUNvbXBvbmVudChxdWVyeSl9JmNvdW50PTEmbGFuZ3VhZ2U9ZW4mZm9ybWF0PWpzb25gKTtcbiAgICBpZiAoIXJlc3Aub2spIHRocm93IG5ldyBFcnJvcignR2VvY29kaW5nIGZhaWxlZCcpO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwLmpzb24oKTtcbiAgICBpZiAoIWRhdGEucmVzdWx0cyB8fCAhZGF0YS5yZXN1bHRzLmxlbmd0aCkgdGhyb3cgbmV3IEVycm9yKCdMb2NhdGlvbiBub3QgZm91bmQnKTtcbiAgICBjb25zdCByID0gZGF0YS5yZXN1bHRzWzBdO1xuICAgIGNvbnN0IGdlbyA9IHtcbiAgICAgIHF1ZXJ5LFxuICAgICAgbGF0OiByLmxhdGl0dWRlLFxuICAgICAgbG9uOiByLmxvbmdpdHVkZSxcbiAgICAgIGNpdHk6IHIubmFtZSxcbiAgICAgIHN0YXRlOiByLmFkbWluMSB8fCAnJyxcbiAgICAgIGNvdW50cnk6IHIuY291bnRyeSB8fCAnJyxcbiAgICAgIGNvdW50cnlDb2RlOiByLmNvdW50cnlfY29kZSB8fCAnJ1xuICAgIH07XG4gICAgc2FmZVNldChHRU9fQ0FDSEVfS0VZLCBKU09OLnN0cmluZ2lmeShnZW8pKTtcbiAgICByZXR1cm4gZ2VvO1xuICB9XG5cbiAgZnVuY3Rpb24gZm9ybWF0TG9jYXRpb24oZ2VvKSB7XG4gICAgLy8gRm9yIFVTIGxvY2F0aW9ucyBzaG93IFwiQ2l0eSwgU3RhdGVcIiwgZm9yIG90aGVycyBzaG93IFwiQ2l0eSwgQ291bnRyeVwiXG4gICAgaWYgKGdlby5jb3VudHJ5Q29kZSA9PT0gJ1VTJyAmJiBnZW8uc3RhdGUpIHtcbiAgICAgIHJldHVybiBgJHtnZW8uY2l0eX0sICR7Z2VvLnN0YXRlfWA7XG4gICAgfVxuICAgIGlmIChnZW8uY291bnRyeSkge1xuICAgICAgcmV0dXJuIGAke2dlby5jaXR5fSwgJHtnZW8uY291bnRyeX1gO1xuICAgIH1cbiAgICByZXR1cm4gZ2VvLmNpdHk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBmZXRjaFdlYXRoZXIobG9jYXRpb24pIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZ2VvID0gYXdhaXQgZ2VvY29kZUxvY2F0aW9uKGxvY2F0aW9uKTtcbiAgICAgIGNvbnN0IHVuaXQgPSBnZXRVbml0KCk7XG4gICAgICBjb25zdCB0ZW1wVW5pdCA9IHVuaXQgPT09ICdtZXRyaWMnID8gJ2NlbHNpdXMnIDogJ2ZhaHJlbmhlaXQnO1xuICAgICAgY29uc3Qgd2luZFVuaXQgPSB1bml0ID09PSAnbWV0cmljJyA/ICdrbWgnIDogJ21waCc7XG4gICAgICBjb25zdCB1cmwgPSBgaHR0cHM6Ly9hcGkub3Blbi1tZXRlby5jb20vdjEvZm9yZWNhc3Q/bGF0aXR1ZGU9JHtnZW8ubGF0fSZsb25naXR1ZGU9JHtnZW8ubG9ufSZjdXJyZW50PXRlbXBlcmF0dXJlXzJtLHdlYXRoZXJfY29kZSx3aW5kX3NwZWVkXzEwbSx3aW5kX2RpcmVjdGlvbl8xMG0mdGVtcGVyYXR1cmVfdW5pdD0ke3RlbXBVbml0fSZ3aW5kX3NwZWVkX3VuaXQ9JHt3aW5kVW5pdH1gO1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKHVybCk7XG4gICAgICBpZiAoIXJlc3Aub2spIHRocm93IG5ldyBFcnJvcignV2VhdGhlciBmZXRjaCBmYWlsZWQnKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwLmpzb24oKTtcbiAgICAgIGNvbnN0IGMgPSBkYXRhLmN1cnJlbnQ7XG4gICAgICBjb25zdCBjb2RlID0gYy53ZWF0aGVyX2NvZGU7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0ZW1wOiBNYXRoLnJvdW5kKGMudGVtcGVyYXR1cmVfMm0pLFxuICAgICAgICBjb25kaXRpb246IHdtb0Rlc2NyaXB0aW9uc1tjb2RlXSB8fCAnVW5rbm93bicsXG4gICAgICAgIGljb246IHdtb0ljb25zW2NvZGVdIHx8ICdcdUQ4M0NcdURGMjRcdUZFMEYnLFxuICAgICAgICBsb2NhdGlvblN0cjogZm9ybWF0TG9jYXRpb24oZ2VvKSxcbiAgICAgICAgd2luZFNwZWVkOiBNYXRoLnJvdW5kKGMud2luZF9zcGVlZF8xMG0pLFxuICAgICAgICB3aW5kRGlyOiBkZWdUb0RpcihjLndpbmRfZGlyZWN0aW9uXzEwbSksXG4gICAgICAgIHVuaXRcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignV2VhdGhlciBmZXRjaCBmYWlsZWQ6JywgZXJyb3IpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlV2VhdGhlcigpIHtcbiAgICBjb25zdCB3ZWF0aGVyV2lkZ2V0ID0gZ2V0V2VhdGhlckVsZW1lbnRzKCk7XG4gICAgaWYgKCF3ZWF0aGVyV2lkZ2V0Lmljb24gfHwgIXdlYXRoZXJXaWRnZXQudGVtcCB8fCAhd2VhdGhlcldpZGdldC5jb25kaXRpb24gfHwgIXdlYXRoZXJXaWRnZXQubG9jYXRpb24gfHwgIXdlYXRoZXJXaWRnZXQud2luZCkge1xuICAgICAgY29uc29sZS53YXJuKCdXZWF0aGVyIHdpZGdldCBlbGVtZW50cyBub3QgZm91bmQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBsb2NhdGlvbiA9IHNhZmVHZXQoTE9DQVRJT05fS0VZKTtcbiAgICBpZiAoIWxvY2F0aW9uKSB7XG4gICAgICB3ZWF0aGVyV2lkZ2V0LmxvY2F0aW9uLnRleHRDb250ZW50ID0gJ1NldCBMb2NhdGlvbic7XG4gICAgICB3ZWF0aGVyV2lkZ2V0LnRlbXAudGV4dENvbnRlbnQgPSAnLS1cXHUwMEIwJztcbiAgICAgIHdlYXRoZXJXaWRnZXQuY29uZGl0aW9uLnRleHRDb250ZW50ID0gJ0NsaWNrIFxcdTI2OTlcXHVGRTBGIHRvIGNvbmZpZ3VyZSc7XG4gICAgICB3ZWF0aGVyV2lkZ2V0LndpbmQudGV4dENvbnRlbnQgPSAnLS0nO1xuICAgICAgd2VhdGhlcldpZGdldC5pY29uLmlubmVySFRNTCA9ICc8c3BhbiBjbGFzcz1cIndlYXRoZXItZW1vamlcIj5cXHVEODNDXFx1REYyNFxcdUZFMEY8L3NwYW4+JztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgd2VhdGhlciA9IGF3YWl0IGZldGNoV2VhdGhlcihsb2NhdGlvbik7XG4gICAgICBpZiAod2VhdGhlcikge1xuICAgICAgICBjb25zdCB0ZW1wU3VmZml4ID0gd2VhdGhlci51bml0ID09PSAnbWV0cmljJyA/ICdcXHUwMEIwQycgOiAnXFx1MDBCMEYnO1xuICAgICAgICBjb25zdCB3aW5kTGFiZWwgPSB3ZWF0aGVyLnVuaXQgPT09ICdtZXRyaWMnID8gJ2ttL2gnIDogJ21waCc7XG4gICAgICAgIHdlYXRoZXJXaWRnZXQubG9jYXRpb24udGV4dENvbnRlbnQgPSB3ZWF0aGVyLmxvY2F0aW9uU3RyO1xuICAgICAgICB3ZWF0aGVyV2lkZ2V0LnRlbXAudGV4dENvbnRlbnQgPSBgJHt3ZWF0aGVyLnRlbXB9JHt0ZW1wU3VmZml4fWA7XG4gICAgICAgIHdlYXRoZXJXaWRnZXQuY29uZGl0aW9uLnRleHRDb250ZW50ID0gd2VhdGhlci5jb25kaXRpb247XG4gICAgICAgIHdlYXRoZXJXaWRnZXQud2luZC50ZXh0Q29udGVudCA9IGBXaW5kOiAke3dlYXRoZXIud2luZFNwZWVkfSAke3dpbmRMYWJlbH0gJHt3ZWF0aGVyLndpbmREaXJ9YDtcbiAgICAgICAgd2VhdGhlcldpZGdldC5pY29uLmlubmVySFRNTCA9IGA8c3BhbiBjbGFzcz1cIndlYXRoZXItZW1vamlcIj4ke2VzY2FwZUh0bWwod2VhdGhlci5pY29uKX08L3NwYW4+YDtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgZXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdbV2VhdGhlcl0gVXBkYXRlIEVycm9yJywgZXJyb3IsIHsgZnVuY3Rpb246ICd1cGRhdGVXZWF0aGVyJyB9KTtcbiAgICAgIHdlYXRoZXJXaWRnZXQubG9jYXRpb24udGV4dENvbnRlbnQgPSAnV2VhdGhlciBFcnJvcic7XG4gICAgICB3ZWF0aGVyV2lkZ2V0LnRlbXAudGV4dENvbnRlbnQgPSAnRXJyb3InO1xuICAgICAgd2VhdGhlcldpZGdldC5jb25kaXRpb24udGV4dENvbnRlbnQgPSAnRmFpbGVkIHRvIGxvYWQnO1xuICAgICAgd2VhdGhlcldpZGdldC53aW5kLnRleHRDb250ZW50ID0gJy0tJztcbiAgICB9XG4gIH1cblxuICAvLyBXZWF0aGVyIHNldHRpbmdzIG1vZGFsXG4gIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3dlYXRoZXItbW9kYWwnKTtcbiAgY29uc3QgbG9jYXRpb25JbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd3ZWF0aGVyLWxvY2F0aW9uLWlucHV0Jyk7XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3dlYXRoZXItc2V0dGluZ3MnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgbG9jYXRpb25JbnB1dC52YWx1ZSA9IHNhZmVHZXQoTE9DQVRJT05fS0VZKSB8fCAnJztcbiAgICAvLyBTZXQgdW5pdCByYWRpb1xuICAgIGNvbnN0IHVuaXQgPSBnZXRVbml0KCk7XG4gICAgY29uc3QgcmFkaW8gPSBtb2RhbC5xdWVyeVNlbGVjdG9yKGBpbnB1dFtuYW1lPVwid2VhdGhlci11bml0LXJhZGlvXCJdW3ZhbHVlPVwiJHt1bml0fVwiXWApO1xuICAgIGlmIChyYWRpbykgcmFkaW8uY2hlY2tlZCA9IHRydWU7XG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICAgIGxvY2F0aW9uSW5wdXQuZm9jdXMoKTtcbiAgfSk7XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3dlYXRoZXItY2FuY2VsJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIG1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgfSk7XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3dlYXRoZXItc2F2ZScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBjb25zdCBsb2MgPSBsb2NhdGlvbklucHV0LnZhbHVlLnRyaW0oKTtcbiAgICBpZiAobG9jKSB7XG4gICAgICAvLyBDbGVhciBnZW8gY2FjaGUgd2hlbiBsb2NhdGlvbiBjaGFuZ2VzIHNvIGl0IHJlLWdlb2NvZGVzXG4gICAgICBjb25zdCBvbGRMb2MgPSBzYWZlR2V0KExPQ0FUSU9OX0tFWSk7XG4gICAgICBpZiAob2xkTG9jICE9PSBsb2MpIHNhZmVTZXQoR0VPX0NBQ0hFX0tFWSwgJycpO1xuICAgICAgc2FmZVNldChMT0NBVElPTl9LRVksIGxvYyk7XG4gICAgICAvLyBTYXZlIHVuaXQgcHJlZmVyZW5jZVxuICAgICAgY29uc3QgdW5pdFJhZGlvID0gbW9kYWwucXVlcnlTZWxlY3RvcignaW5wdXRbbmFtZT1cIndlYXRoZXItdW5pdC1yYWRpb1wiXTpjaGVja2VkJyk7XG4gICAgICBjb25zdCBuZXdVbml0ID0gdW5pdFJhZGlvID8gdW5pdFJhZGlvLnZhbHVlIDogJ2ltcGVyaWFsJztcbiAgICAgIGNvbnN0IG9sZFVuaXQgPSBnZXRVbml0KCk7XG4gICAgICBzYWZlU2V0KFVOSVRfS0VZLCBuZXdVbml0KTtcbiAgICAgIC8vIENsZWFyIGdlbyBjYWNoZSBpZiB1bml0IGNoYW5nZWQgKG5lZWQgZnJlc2ggd2VhdGhlciBkYXRhKVxuICAgICAgaWYgKG9sZFVuaXQgIT09IG5ld1VuaXQpIHNhZmVTZXQoR0VPX0NBQ0hFX0tFWSwgJycpO1xuICAgICAgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgICAgdXBkYXRlV2VhdGhlcigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdQbGVhc2UgZW50ZXIgYSBsb2NhdGlvbiAoZS5nLiwgSGFtYnVyZywgTG9uZG9uLCA5MDIxMCknLCAnd2FybmluZycpO1xuICAgIH1cbiAgfSk7XG5cbiAgd2lyZU1vZGFsKG1vZGFsKTtcblxuICAvLyBDbG9zZSBtb2RhbCBvbiBFc2NhcGUga2V5XG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4ge1xuICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScgJiYgbW9kYWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdzaG93JykpIHtcbiAgICAgIG1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIEluaXRpYWxpemUgd2VhdGhlclxuICB1cGRhdGVXZWF0aGVyKCk7XG4gIC8vIFVwZGF0ZSB3ZWF0aGVyIGV2ZXJ5IDEwIG1pbnV0ZXNcbiAgc2V0SW50ZXJ2YWwodXBkYXRlV2VhdGhlciwgREMuUE9MTC5XRUFUSEVSKTtcbn0pKCk7XG47XG4vLyA9PT09PT09PT09IERJR0lUQUwgQ0xPQ0sgV0lER0VUID09PT09PT09PT1cbihmdW5jdGlvbigpIHtcbiAgY29uc3Qgd2lkZ2V0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Nsb2NrLXdpZGdldCcpO1xuICBjb25zdCByZW5kZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2xvY2stcmVuZGVyJyk7XG4gIGlmICghd2lkZ2V0IHx8ICFyZW5kZXIpIHJldHVybjtcblxuICBjb25zdCBEQVlTID0gWydTdW5kYXknLCdNb25kYXknLCdUdWVzZGF5JywnV2VkbmVzZGF5JywnVGh1cnNkYXknLCdGcmlkYXknLCdTYXR1cmRheSddO1xuICBjb25zdCBNT05USFMgPSBbJ0phbnVhcnknLCdGZWJydWFyeScsJ01hcmNoJywnQXByaWwnLCdNYXknLCdKdW5lJywnSnVseScsJ0F1Z3VzdCcsJ1NlcHRlbWJlcicsJ09jdG9iZXInLCdOb3ZlbWJlcicsJ0RlY2VtYmVyJ107XG4gIGNvbnN0IFJPTUFOID0gWydYSUknLCdJJywnSUknLCdJSUknLCdJVicsJ1YnLCdWSScsJ1ZJSScsJ1ZJSUknLCdJWCcsJ1gnLCdYSSddO1xuXG4gIGxldCBjdXJyZW50U3R5bGUgPSBzYWZlR2V0KCdjbG9jay1zdHlsZScpIHx8ICdkZWZhdWx0JztcbiAgbGV0IGxhc3RDaGltZUhvdXIgPSAtMTtcbiAgbGV0IGNoaW1lUGxheWluZyA9IGZhbHNlO1xuICBsZXQgcHJldkZsaXBEaWdpdHMgPSAnJztcbiAgbGV0IGFjdGl2ZUxheW91dCA9ICcnO1xuICBsZXQgZGlnaXRhbFJlZnMgPSBudWxsO1xuICBsZXQgdGlja1RpbWVyID0gbnVsbDtcblxuICAvLyA9PT09PSBDSElNRVMgPT09PT1cbiAgZnVuY3Rpb24gcGxheUNoaW1lcyhjb3VudCkge1xuICAgIGlmIChjaGltZVBsYXlpbmcpIHJldHVybjtcbiAgICBpZiAoc2FmZUdldCgnY2xvY2stY2hpbWVzJykgIT09ICd0cnVlJykgcmV0dXJuO1xuICAgIGNoaW1lUGxheWluZyA9IHRydWU7XG4gICAgY29uc3Qgdm9sID0gcGFyc2VJbnQoc2FmZUdldCgnY2xvY2stY2hpbWUtdm9sdW1lJykgfHwgJzUwJywgMTApIC8gMTAwO1xuICAgIGxldCBpID0gMDtcbiAgICBmdW5jdGlvbiBzdHJpa2UoKSB7XG4gICAgICBpZiAoaSA+PSBjb3VudCkgeyBjaGltZVBsYXlpbmcgPSBmYWxzZTsgcmV0dXJuOyB9XG4gICAgICBjb25zdCBiZWxsID0gbmV3IEF1ZGlvKCcvYXNzZXRzL3NvdW5kcy9jaHVyY2gtYmVsbC5tcDMnKTtcbiAgICAgIGJlbGwudm9sdW1lID0gdm9sO1xuICAgICAgYmVsbC5wbGF5KCkuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgaSsrO1xuICAgICAgaWYgKGkgPCBjb3VudCkgc2V0VGltZW91dChzdHJpa2UsIDI1MDApO1xuICAgICAgZWxzZSBzZXRUaW1lb3V0KCgpID0+IHsgY2hpbWVQbGF5aW5nID0gZmFsc2U7IH0sIDI1MDApO1xuICAgIH1cbiAgICBzdHJpa2UoKTtcbiAgfVxuXG4gIC8vID09PT09IERBVEUgU1RSSU5HID09PT09XG4gIGZ1bmN0aW9uIGRhdGVTdHIobm93KSB7XG4gICAgcmV0dXJuIERBWVNbbm93LmdldERheSgpXSArICcsICcgKyBNT05USFNbbm93LmdldE1vbnRoKCldICsgJyAnICsgbm93LmdldERhdGUoKSArICcsICcgKyBub3cuZ2V0RnVsbFllYXIoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc2V0UmVuZGVyTGF5b3V0KCkge1xuICAgIGFjdGl2ZUxheW91dCA9ICcnO1xuICAgIGRpZ2l0YWxSZWZzID0gbnVsbDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGVuc3VyZURpZ2l0YWxMYXlvdXQoKSB7XG4gICAgaWYgKGFjdGl2ZUxheW91dCAhPT0gJ2RpZ2l0YWwnKSB7XG4gICAgICByZW5kZXIuaW5uZXJIVE1MID1cbiAgICAgICAgJzxkaXYgY2xhc3M9XCJjbG9jay10aW1lXCI+PHNwYW4gY2xhc3M9XCJjbG9jay1tYWluXCI+PC9zcGFuPjxzcGFuIGNsYXNzPVwiY2xvY2stc2Vjb25kc1wiPjwvc3Bhbj48c3BhbiBjbGFzcz1cImNsb2NrLWFtcG1cIj48L3NwYW4+PC9kaXY+JyArXG4gICAgICAgICc8ZGl2IGNsYXNzPVwiY2xvY2stZGF0ZVwiPjwvZGl2Pic7XG4gICAgICBkaWdpdGFsUmVmcyA9IHtcbiAgICAgICAgbWFpbjogcmVuZGVyLnF1ZXJ5U2VsZWN0b3IoJy5jbG9jay1tYWluJyksXG4gICAgICAgIHNlY29uZHM6IHJlbmRlci5xdWVyeVNlbGVjdG9yKCcuY2xvY2stc2Vjb25kcycpLFxuICAgICAgICBhbXBtOiByZW5kZXIucXVlcnlTZWxlY3RvcignLmNsb2NrLWFtcG0nKSxcbiAgICAgICAgZGF0ZTogcmVuZGVyLnF1ZXJ5U2VsZWN0b3IoJy5jbG9jay1kYXRlJylcbiAgICAgIH07XG4gICAgICBhY3RpdmVMYXlvdXQgPSAnZGlnaXRhbCc7XG4gICAgfVxuICAgIHJldHVybiBkaWdpdGFsUmVmcztcbiAgfVxuXG4gIC8vID09PT09IFNUWUxFIFJFTkRFUkVSUyA9PT09PVxuXG4gIGZ1bmN0aW9uIHJlbmRlckRlZmF1bHQobm93KSB7XG4gICAgY29uc3QgaDI0ID0gbm93LmdldEhvdXJzKCksIG0gPSBub3cuZ2V0TWludXRlcygpLCBzID0gbm93LmdldFNlY29uZHMoKTtcbiAgICBjb25zdCBhbXBtID0gaDI0ID49IDEyID8gJ1BNJyA6ICdBTSc7XG4gICAgY29uc3QgaCA9IGgyNCAlIDEyIHx8IDEyO1xuICAgIGNvbnN0IHJlZnMgPSBlbnN1cmVEaWdpdGFsTGF5b3V0KCk7XG4gICAgcmVmcy5tYWluLnRleHRDb250ZW50ID0gYCR7aH06JHtTdHJpbmcobSkucGFkU3RhcnQoMiwnMCcpfWA7XG4gICAgcmVmcy5zZWNvbmRzLnRleHRDb250ZW50ID0gYDoke1N0cmluZyhzKS5wYWRTdGFydCgyLCcwJyl9YDtcbiAgICByZWZzLmFtcG0udGV4dENvbnRlbnQgPSBhbXBtO1xuICAgIHJlZnMuZGF0ZS50ZXh0Q29udGVudCA9IGRhdGVTdHIobm93KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbmRlckxjZChub3csIGNscykge1xuICAgIGNvbnN0IGgyNCA9IG5vdy5nZXRIb3VycygpLCBtID0gbm93LmdldE1pbnV0ZXMoKSwgcyA9IG5vdy5nZXRTZWNvbmRzKCk7XG4gICAgY29uc3QgYW1wbSA9IGgyNCA+PSAxMiA/ICdQTScgOiAnQU0nO1xuICAgIGNvbnN0IGggPSBoMjQgJSAxMiB8fCAxMjtcbiAgICBjb25zdCByZWZzID0gZW5zdXJlRGlnaXRhbExheW91dCgpO1xuICAgIHJlZnMubWFpbi50ZXh0Q29udGVudCA9IGAke1N0cmluZyhoKS5wYWRTdGFydCgyLCcwJyl9OiR7U3RyaW5nKG0pLnBhZFN0YXJ0KDIsJzAnKX1gO1xuICAgIHJlZnMuc2Vjb25kcy50ZXh0Q29udGVudCA9IGA6JHtTdHJpbmcocykucGFkU3RhcnQoMiwnMCcpfWA7XG4gICAgcmVmcy5hbXBtLnRleHRDb250ZW50ID0gYW1wbTtcbiAgICByZWZzLmRhdGUudGV4dENvbnRlbnQgPSBkYXRlU3RyKG5vdyk7XG4gIH1cblxuICBmdW5jdGlvbiByZW5kZXJGbGlwKG5vdykge1xuICAgIGNvbnN0IGgyNCA9IG5vdy5nZXRIb3VycygpLCBtID0gbm93LmdldE1pbnV0ZXMoKSwgcyA9IG5vdy5nZXRTZWNvbmRzKCk7XG4gICAgY29uc3QgYW1wbSA9IGgyNCA+PSAxMiA/ICdQTScgOiAnQU0nO1xuICAgIGNvbnN0IGggPSBoMjQgJSAxMiB8fCAxMjtcbiAgICBjb25zdCBkaWdpdHMgPSBTdHJpbmcoaCkucGFkU3RhcnQoMiwnICcpICsgU3RyaW5nKG0pLnBhZFN0YXJ0KDIsJzAnKSArIFN0cmluZyhzKS5wYWRTdGFydCgyLCcwJyk7XG5cbiAgICBsZXQgaHRtbCA9ICc8ZGl2IGNsYXNzPVwiZmxpcC1jbG9jay1yb3dcIj4nO1xuICAgIC8vIEhvdXJzXG4gICAgaHRtbCArPSBmbGlwQ2FyZChkaWdpdHNbMF0sIDApO1xuICAgIGh0bWwgKz0gZmxpcENhcmQoZGlnaXRzWzFdLCAxKTtcbiAgICBodG1sICs9ICc8c3BhbiBjbGFzcz1cImZsaXAtY29sb25cIj46PC9zcGFuPic7XG4gICAgLy8gTWludXRlc1xuICAgIGh0bWwgKz0gZmxpcENhcmQoZGlnaXRzWzJdLCAyKTtcbiAgICBodG1sICs9IGZsaXBDYXJkKGRpZ2l0c1szXSwgMyk7XG4gICAgaHRtbCArPSAnPHNwYW4gY2xhc3M9XCJmbGlwLWNvbG9uXCI+Ojwvc3Bhbj4nO1xuICAgIC8vIFNlY29uZHNcbiAgICBodG1sICs9IGZsaXBDYXJkKGRpZ2l0c1s0XSwgNCk7XG4gICAgaHRtbCArPSBmbGlwQ2FyZChkaWdpdHNbNV0sIDUpO1xuICAgIGh0bWwgKz0gYDxzcGFuIGNsYXNzPVwiZmxpcC1hbXBtXCI+JHthbXBtfTwvc3Bhbj5gO1xuICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gICAgaHRtbCArPSBgPGRpdiBjbGFzcz1cImNsb2NrLWRhdGVcIj4ke2RhdGVTdHIobm93KX08L2Rpdj5gO1xuICAgIHJlbmRlci5pbm5lckhUTUwgPSBodG1sO1xuICAgIGFjdGl2ZUxheW91dCA9ICdmbGlwJztcblxuICAgIC8vIFRyaWdnZXIgZmxpcCBhbmltYXRpb24gb24gY2hhbmdlZCBkaWdpdHNcbiAgICBpZiAocHJldkZsaXBEaWdpdHMpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNjsgaSsrKSB7XG4gICAgICAgIGlmIChkaWdpdHNbaV0gIT09IHByZXZGbGlwRGlnaXRzW2ldKSB7XG4gICAgICAgICAgY29uc3QgY2FyZCA9IHJlbmRlci5xdWVyeVNlbGVjdG9yKGAuZmxpcC1jYXJkW2RhdGEtaWR4PVwiJHtpfVwiXWApO1xuICAgICAgICAgIGlmIChjYXJkKSBjYXJkLmNsYXNzTGlzdC5hZGQoJ2ZsaXBwaW5nJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcHJldkZsaXBEaWdpdHMgPSBkaWdpdHM7XG4gIH1cblxuICBmdW5jdGlvbiBmbGlwQ2FyZChkaWdpdCwgaWR4KSB7XG4gICAgY29uc3QgZCA9IGRpZ2l0ID09PSAnICcgPyAnJyA6IGRpZ2l0O1xuICAgIHJldHVybiBgPGRpdiBjbGFzcz1cImZsaXAtY2FyZFwiIGRhdGEtaWR4PVwiJHtpZHh9XCI+PGRpdiBjbGFzcz1cImZsaXAtdG9wXCI+JHtkfTwvZGl2PjxkaXYgY2xhc3M9XCJmbGlwLWJvdHRvbVwiPiR7ZH08L2Rpdj48L2Rpdj5gO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVuZGVyQmluYXJ5KG5vdykge1xuICAgIGNvbnN0IGgyNCA9IG5vdy5nZXRIb3VycygpLCBtID0gbm93LmdldE1pbnV0ZXMoKSwgcyA9IG5vdy5nZXRTZWNvbmRzKCk7XG4gICAgY29uc3QgaCA9IGgyNCAlIDEyIHx8IDEyO1xuICAgIGNvbnN0IGFtcG0gPSBoMjQgPj0gMTIgPyAnUE0nIDogJ0FNJztcbiAgICAvLyA2IGNvbHVtbnM6IEggdGVucywgSCBvbmVzLCBNIHRlbnMsIE0gb25lcywgUyB0ZW5zLCBTIG9uZXNcbiAgICBjb25zdCBjb2xzID0gW1xuICAgICAgTWF0aC5mbG9vcihoIC8gMTApLCBoICUgMTAsXG4gICAgICBNYXRoLmZsb29yKG0gLyAxMCksIG0gJSAxMCxcbiAgICAgIE1hdGguZmxvb3IocyAvIDEwKSwgcyAlIDEwXG4gICAgXTtcblxuICAgIGxldCBodG1sID0gJzxkaXYgY2xhc3M9XCJiaW5hcnktY2xvY2tcIj4nO1xuICAgIC8vIExhYmVsc1xuICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9XCJiaW5hcnktbGFiZWxzXCI+PHNwYW4+SDwvc3Bhbj48c3Bhbj5IPC9zcGFuPjxzcGFuPk08L3NwYW4+PHNwYW4+TTwvc3Bhbj48c3Bhbj5TPC9zcGFuPjxzcGFuPlM8L3NwYW4+PC9kaXY+JztcbiAgICAvLyA0IHJvd3MgZm9yIGJpdHMgOCw0LDIsMVxuICAgIGZvciAobGV0IGJpdCA9IDM7IGJpdCA+PSAwOyBiaXQtLSkge1xuICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz1cImJpbmFyeS1yb3dcIj4nO1xuICAgICAgZm9yIChsZXQgY29sID0gMDsgY29sIDwgNjsgY29sKyspIHtcbiAgICAgICAgY29uc3Qgb24gPSAoY29sc1tjb2xdID4+IGJpdCkgJiAxO1xuICAgICAgICBodG1sICs9IGA8ZGl2IGNsYXNzPVwiYmluYXJ5LWRvdCAke29uID8gJ29uJyA6ICcnfVwiPjwvZGl2PmA7XG4gICAgICB9XG4gICAgICBodG1sICs9ICc8L2Rpdj4nO1xuICAgIH1cbiAgICAvLyBWYWx1ZSByb3dcbiAgICBodG1sICs9ICc8ZGl2IGNsYXNzPVwiYmluYXJ5LXZhbHVlc1wiPic7XG4gICAgZm9yIChsZXQgY29sID0gMDsgY29sIDwgNjsgY29sKyspIHtcbiAgICAgIGh0bWwgKz0gYDxzcGFuPiR7Y29sc1tjb2xdfTwvc3Bhbj5gO1xuICAgIH1cbiAgICBodG1sICs9ICc8L2Rpdj4nO1xuICAgIGh0bWwgKz0gYDxkaXYgY2xhc3M9XCJiaW5hcnktYW1wbVwiPiR7YW1wbX08L2Rpdj5gO1xuICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gICAgaHRtbCArPSBgPGRpdiBjbGFzcz1cImNsb2NrLWRhdGVcIj4ke2RhdGVTdHIobm93KX08L2Rpdj5gO1xuICAgIHJlbmRlci5pbm5lckhUTUwgPSBodG1sO1xuICAgIGFjdGl2ZUxheW91dCA9ICdiaW5hcnknO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVuZGVyQW5hbG9nKG5vdywgdXNlUm9tYW4pIHtcbiAgICBjb25zdCBoID0gbm93LmdldEhvdXJzKCksIG0gPSBub3cuZ2V0TWludXRlcygpLCBzID0gbm93LmdldFNlY29uZHMoKTtcbiAgICBjb25zdCBzaXplID0gMTIwO1xuICAgIGNvbnN0IGN4ID0gc2l6ZSAvIDIsIGN5ID0gc2l6ZSAvIDI7XG5cbiAgICAvLyBBbmdsZXNcbiAgICBjb25zdCBzQW5nbGUgPSAocyAvIDYwKSAqIDM2MCAtIDkwO1xuICAgIGNvbnN0IG1BbmdsZSA9ICgobSArIHMgLyA2MCkgLyA2MCkgKiAzNjAgLSA5MDtcbiAgICBjb25zdCBoQW5nbGUgPSAoKChoICUgMTIpICsgbSAvIDYwKSAvIDEyKSAqIDM2MCAtIDkwO1xuXG4gICAgLy8gTnVtYmVyIGxhYmVsc1xuICAgIGxldCBsYWJlbHMgPSAnJztcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8PSAxMjsgaSsrKSB7XG4gICAgICBjb25zdCBhbmdsZSA9IChpIC8gMTIpICogMiAqIE1hdGguUEkgLSBNYXRoLlBJIC8gMjtcbiAgICAgIGNvbnN0IHIgPSA0NztcbiAgICAgIGNvbnN0IHggPSBjeCArIHIgKiBNYXRoLmNvcyhhbmdsZSk7XG4gICAgICBjb25zdCB5ID0gY3kgKyByICogTWF0aC5zaW4oYW5nbGUpO1xuICAgICAgY29uc3QgbGFiZWwgPSB1c2VSb21hbiA/IFJPTUFOW2kgJSAxMl0gOiBpO1xuICAgICAgY29uc3QgZnMgPSB1c2VSb21hbiA/ICc3JyA6ICc5JztcbiAgICAgIGxhYmVscyArPSBgPHRleHQgeD1cIiR7eH1cIiB5PVwiJHt5fVwiIHRleHQtYW5jaG9yPVwibWlkZGxlXCIgZG9taW5hbnQtYmFzZWxpbmU9XCJjZW50cmFsXCIgZmlsbD1cInZhcigtLWZnKVwiIGZvbnQtc2l6ZT1cIiR7ZnN9XCIgZm9udC13ZWlnaHQ9XCI2MDBcIiBmb250LWZhbWlseT1cIidTYW1pIEdyb3Rlc2snLHNhbnMtc2VyaWZcIj4ke2xhYmVsfTwvdGV4dD5gO1xuICAgIH1cblxuICAgIC8vIFRpY2sgbWFya3NcbiAgICBsZXQgdGlja3MgPSAnJztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDYwOyBpKyspIHtcbiAgICAgIGNvbnN0IGFuZ2xlID0gKGkgLyA2MCkgKiAyICogTWF0aC5QSSAtIE1hdGguUEkgLyAyO1xuICAgICAgY29uc3Qgb3V0ZXIgPSA1NjtcbiAgICAgIGNvbnN0IGlubmVyID0gaSAlIDUgPT09IDAgPyA1MiA6IDU0O1xuICAgICAgY29uc3QgeDEgPSBjeCArIGlubmVyICogTWF0aC5jb3MoYW5nbGUpO1xuICAgICAgY29uc3QgeTEgPSBjeSArIGlubmVyICogTWF0aC5zaW4oYW5nbGUpO1xuICAgICAgY29uc3QgeDIgPSBjeCArIG91dGVyICogTWF0aC5jb3MoYW5nbGUpO1xuICAgICAgY29uc3QgeTIgPSBjeSArIG91dGVyICogTWF0aC5zaW4oYW5nbGUpO1xuICAgICAgY29uc3QgdyA9IGkgJSA1ID09PSAwID8gMS41IDogMC41O1xuICAgICAgdGlja3MgKz0gYDxsaW5lIHgxPVwiJHt4MX1cIiB5MT1cIiR7eTF9XCIgeDI9XCIke3gyfVwiIHkyPVwiJHt5Mn1cIiBzdHJva2U9XCJ2YXIoLS1tdXRlZClcIiBzdHJva2Utd2lkdGg9XCIke3d9XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiLz5gO1xuICAgIH1cblxuICAgIGNvbnN0IHN2ZyA9IGA8c3ZnIGNsYXNzPVwiYW5hbG9nLWNsb2NrLXN2Z1wiIHZpZXdCb3g9XCIwIDAgJHtzaXplfSAke3NpemV9XCIgd2lkdGg9XCIke3NpemV9XCIgaGVpZ2h0PVwiJHtzaXplfVwiPlxuICAgICAgPGNpcmNsZSBjeD1cIiR7Y3h9XCIgY3k9XCIke2N5fVwiIHI9XCI1OFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwidmFyKC0tYm9yZGVyKVwiIHN0cm9rZS13aWR0aD1cIjJcIi8+XG4gICAgICAke3RpY2tzfVxuICAgICAgJHtsYWJlbHN9XG4gICAgICA8bGluZSB4MT1cIiR7Y3h9XCIgeTE9XCIke2N5fVwiIHgyPVwiJHtjeCArIDI4ICogTWF0aC5jb3MoaEFuZ2xlICogTWF0aC5QSSAvIDE4MCl9XCIgeTI9XCIke2N5ICsgMjggKiBNYXRoLnNpbihoQW5nbGUgKiBNYXRoLlBJIC8gMTgwKX1cIiBzdHJva2U9XCJ2YXIoLS1mZylcIiBzdHJva2Utd2lkdGg9XCIzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiLz5cbiAgICAgIDxsaW5lIHgxPVwiJHtjeH1cIiB5MT1cIiR7Y3l9XCIgeDI9XCIke2N4ICsgMzggKiBNYXRoLmNvcyhtQW5nbGUgKiBNYXRoLlBJIC8gMTgwKX1cIiB5Mj1cIiR7Y3kgKyAzOCAqIE1hdGguc2luKG1BbmdsZSAqIE1hdGguUEkgLyAxODApfVwiIHN0cm9rZT1cInZhcigtLWZnKVwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIvPlxuICAgICAgPGxpbmUgeDE9XCIke2N4fVwiIHkxPVwiJHtjeX1cIiB4Mj1cIiR7Y3ggKyA0MiAqIE1hdGguY29zKHNBbmdsZSAqIE1hdGguUEkgLyAxODApfVwiIHkyPVwiJHtjeSArIDQyICogTWF0aC5zaW4oc0FuZ2xlICogTWF0aC5QSSAvIDE4MCl9XCIgc3Ryb2tlPVwiI2U3NGMzY1wiIHN0cm9rZS13aWR0aD1cIjFcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIvPlxuICAgICAgPGNpcmNsZSBjeD1cIiR7Y3h9XCIgY3k9XCIke2N5fVwiIHI9XCIzXCIgZmlsbD1cInZhcigtLWZnKVwiLz5cbiAgICA8L3N2Zz5gO1xuXG4gICAgY29uc3QgYW1wbSA9IG5vdy5nZXRIb3VycygpID49IDEyID8gJ1BNJyA6ICdBTSc7XG4gICAgcmVuZGVyLmlubmVySFRNTCA9IGA8ZGl2IGNsYXNzPVwiYW5hbG9nLWNsb2NrLXdyYXBcIj4ke3N2Z308ZGl2IGNsYXNzPVwiYW5hbG9nLWluZm9cIj48c3BhbiBjbGFzcz1cImFuYWxvZy1kaWdpdGFsXCI+JHsobm93LmdldEhvdXJzKCkgJSAxMiB8fCAxMil9OiR7U3RyaW5nKG0pLnBhZFN0YXJ0KDIsJzAnKX0gJHthbXBtfTwvc3Bhbj48c3BhbiBjbGFzcz1cImFuYWxvZy1kYXRlLXNtXCI+JHtkYXRlU3RyKG5vdyl9PC9zcGFuPjwvZGl2PjwvZGl2PmA7XG4gICAgYWN0aXZlTGF5b3V0ID0gJ2FuYWxvZyc7XG4gIH1cblxuICAvLyA9PT09PSBNQUlOIFRJQ0sgPT09PT1cbiAgZnVuY3Rpb24gdGljaygpIHtcbiAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgIGNvbnN0IGggPSBub3cuZ2V0SG91cnMoKSAlIDEyIHx8IDEyO1xuICAgIGNvbnN0IG0gPSBub3cuZ2V0TWludXRlcygpO1xuICAgIGNvbnN0IHMgPSBub3cuZ2V0U2Vjb25kcygpO1xuXG4gICAgLy8gU2V0IHN0eWxlIGNsYXNzIG9uIHdpZGdldFxuICAgIGNvbnN0IG5leHRDbGFzc05hbWUgPSAnY2xvY2std2lkZ2V0JyArIChjdXJyZW50U3R5bGUgIT09ICdkZWZhdWx0JyA/ICcgJyArIGN1cnJlbnRTdHlsZSA6ICcnKTtcbiAgICBpZiAod2lkZ2V0LmNsYXNzTmFtZSAhPT0gbmV4dENsYXNzTmFtZSkge1xuICAgICAgd2lkZ2V0LmNsYXNzTmFtZSA9IG5leHRDbGFzc05hbWU7XG4gICAgfVxuXG4gICAgc3dpdGNoIChjdXJyZW50U3R5bGUpIHtcbiAgICAgIGNhc2UgJ2xjZCc6IHJlbmRlckxjZChub3cpOyBicmVhaztcbiAgICAgIGNhc2UgJ2xjZC1ibHVlJzogcmVuZGVyTGNkKG5vdyk7IGJyZWFrO1xuICAgICAgY2FzZSAnbGNkLWFtYmVyJzogcmVuZGVyTGNkKG5vdyk7IGJyZWFrO1xuICAgICAgY2FzZSAnbGNkLXJldHJvJzogcmVuZGVyTGNkKG5vdyk7IGJyZWFrO1xuICAgICAgY2FzZSAnbGNkLXRheGknOiByZW5kZXJMY2Qobm93KTsgYnJlYWs7XG4gICAgICBjYXNlICdmbGlwJzogcmVuZGVyRmxpcChub3cpOyBicmVhaztcbiAgICAgIGNhc2UgJ2JpbmFyeSc6IHJlbmRlckJpbmFyeShub3cpOyBicmVhaztcbiAgICAgIGNhc2UgJ2FuYWxvZyc6IHJlbmRlckFuYWxvZyhub3csIGZhbHNlKTsgYnJlYWs7XG4gICAgICBjYXNlICdyb21hbic6IHJlbmRlckFuYWxvZyhub3csIHRydWUpOyBicmVhaztcbiAgICAgIGRlZmF1bHQ6IHJlbmRlckRlZmF1bHQobm93KTtcbiAgICB9XG5cbiAgICAvLyBIb3VybHkgY2hpbWVzXG4gICAgaWYgKG0gPT09IDAgJiYgcyA9PT0gMCAmJiBoICE9PSBsYXN0Q2hpbWVIb3VyKSB7XG4gICAgICBsYXN0Q2hpbWVIb3VyID0gaDtcbiAgICAgIHBsYXlDaGltZXMoaCk7XG4gICAgfVxuICAgIGlmIChtICE9PSAwKSBsYXN0Q2hpbWVIb3VyID0gLTE7XG4gIH1cblxuICBmdW5jdGlvbiBzY2hlZHVsZU5leHRUaWNrKCkge1xuICAgIGNsZWFyVGltZW91dCh0aWNrVGltZXIpO1xuICAgIGNvbnN0IGludGVydmFsID0gZG9jdW1lbnQuaGlkZGVuID8gNjAwMDAgOiAxMDAwO1xuICAgIGNvbnN0IGRlbGF5ID0gaW50ZXJ2YWwgLSAoRGF0ZS5ub3coKSAlIGludGVydmFsKSArIDI1O1xuICAgIHRpY2tUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGljaygpO1xuICAgICAgc2NoZWR1bGVOZXh0VGljaygpO1xuICAgIH0sIGRlbGF5KTtcbiAgfVxuXG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCAoKSA9PiB7XG4gICAgcHJldkZsaXBEaWdpdHMgPSAnJztcbiAgICByZXNldFJlbmRlckxheW91dCgpO1xuICAgIHRpY2soKTtcbiAgICBzY2hlZHVsZU5leHRUaWNrKCk7XG4gIH0pO1xuXG4gIHRpY2soKTtcbiAgc2NoZWR1bGVOZXh0VGljaygpO1xuXG4gIC8vID09PT09IFNFVFRJTkdTIE1PREFMID09PT09XG4gIGNvbnN0IFNUWUxFUyA9IFtcbiAgICB7IGlkOiAnZGVmYXVsdCcsIGxhYmVsOiAnRGVmYXVsdCcsIGljb246ICdcdUQ4M0RcdURENTAnIH0sXG4gICAgeyBpZDogJ2xjZCcsIGxhYmVsOiAnTENEIEdyZWVuJywgaWNvbjogJ1x1RDgzRFx1REM5QScgfSxcbiAgICB7IGlkOiAnbGNkLWJsdWUnLCBsYWJlbDogJ0xDRCBCbHVlJywgaWNvbjogJ1x1RDgzRFx1REM5OScgfSxcbiAgICB7IGlkOiAnbGNkLWFtYmVyJywgbGFiZWw6ICdMQ0QgQW1iZXInLCBpY29uOiAnXHVEODNEXHVERkUwJyB9LFxuICAgIHsgaWQ6ICdsY2QtcmV0cm8nLCBsYWJlbDogJ0xDRCBSZXRybycsIGljb246ICdcdUQ4M0RcdURGRTknIH0sXG4gICAgeyBpZDogJ2xjZC10YXhpJywgbGFiZWw6ICdMQ0QgVGF4aScsIGljb246ICdcdUQ4M0RcdURGRTEnIH0sXG4gICAgeyBpZDogJ2ZsaXAnLCBsYWJlbDogJ0ZsaXAgQ2xvY2snLCBpY29uOiAnXHVEODNEXHVEQ0RGJyB9LFxuICAgIHsgaWQ6ICdiaW5hcnknLCBsYWJlbDogJ0JpbmFyeScsIGljb246ICdcdUQ4M0RcdURDQkInIH0sXG4gICAgeyBpZDogJ2FuYWxvZycsIGxhYmVsOiAnQW5hbG9nJywgaWNvbjogJ1x1MjNGMCcgfSxcbiAgICB7IGlkOiAncm9tYW4nLCBsYWJlbDogJ1JvbWFuJywgaWNvbjogJ1x1RDgzQ1x1REZEQlx1RkUwRicgfSxcbiAgXTtcblxuICBsZXQgc3R5bGVPcHRpb25zSHRtbCA9ICc8ZGl2IGNsYXNzPVwiY2xvY2stc3R5bGUtZ3JpZFwiPic7XG4gIFNUWUxFUy5mb3JFYWNoKHMgPT4ge1xuICAgIHN0eWxlT3B0aW9uc0h0bWwgKz0gYDxsYWJlbCBjbGFzcz1cImNsb2NrLXN0eWxlLW9wdGlvblwiPlxuICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJjbG9jay1zdHlsZS1yYWRpb1wiIHZhbHVlPVwiJHtzLmlkfVwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjbG9jay1zdHlsZS1jYXJkXCI+PHNwYW4gY2xhc3M9XCJjbG9jay1zdHlsZS1pY29uXCI+JHtzLmljb259PC9zcGFuPjxzcGFuIGNsYXNzPVwiY2xvY2stc3R5bGUtbGFiZWxcIj4ke3MubGFiZWx9PC9zcGFuPjwvc3Bhbj5cbiAgICA8L2xhYmVsPmA7XG4gIH0pO1xuICBzdHlsZU9wdGlvbnNIdG1sICs9ICc8L2Rpdj4nO1xuXG4gIGluamVjdE1vZGFsKCdjbG9jay1zZXR0aW5ncy1tb2RhbCcsIGA8ZGl2IGlkPVwiY2xvY2stc2V0dGluZ3MtbW9kYWxcIiBjbGFzcz1cIndlYXRoZXItbW9kYWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1jb250ZW50XCIgc3R5bGU9XCJtYXgtd2lkdGg6IDQyMHB4O1wiPlxuICAgICAgPGgzPkNsb2NrIFNldHRpbmdzPC9oMz5cbiAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAxNnB4O1wiPlxuICAgICAgICA8bGFiZWwgc3R5bGU9XCJkaXNwbGF5OiBibG9jazsgbWFyZ2luLWJvdHRvbTogOHB4OyBmb250LXdlaWdodDogNjAwOyBjb2xvcjogdmFyKC0tZmcpO1wiPlN0eWxlPC9sYWJlbD5cbiAgICAgICAgJHtzdHlsZU9wdGlvbnNIdG1sfVxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMTZweDsgcGFkZGluZy10b3A6IDEycHg7IGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPlxuICAgICAgICA8bGFiZWwgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDhweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXdlaWdodDogNjAwOyBjb2xvcjogdmFyKC0tZmcpO1wiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImNsb2NrLWNoaW1lcy10b2dnbGVcIj4gSG91cmx5IGNodXJjaCBiZWxsIGNoaW1lc1xuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjc4cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tdG9wOiA0cHg7IG1hcmdpbi1sZWZ0OiAyNHB4O1wiPlxuICAgICAgICAgIFN0cmlrZXMgdGhlIG51bWJlciBvZiB0aGUgaG91ciAoZS5nLiwgMyBiZWxscyBhdCAzOjAwKVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDE2cHg7XCIgaWQ9XCJjbG9jay12b2x1bWUtc2VjdGlvblwiPlxuICAgICAgICA8bGFiZWwgc3R5bGU9XCJkaXNwbGF5OiBibG9jazsgbWFyZ2luLWJvdHRvbTogNnB4OyBmb250LXdlaWdodDogNjAwOyBjb2xvcjogdmFyKC0tZmcpO1wiPlZvbHVtZTwvbGFiZWw+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDEwcHg7XCI+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6IDAuODVyZW07XCI+XHVEODNEXHVERDA4PC9zcGFuPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFuZ2VcIiBpZD1cImNsb2NrLWNoaW1lLXZvbHVtZVwiIG1pbj1cIjBcIiBtYXg9XCIxMDBcIiB2YWx1ZT1cIjUwXCIgc3R5bGU9XCJmbGV4OiAxOyBhY2NlbnQtY29sb3I6IHZhcigtLW9rLWZnKTtcIj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTogMC44NXJlbTtcIj5cdUQ4M0RcdUREMEE8L3NwYW4+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImNsb2NrLWNoaW1lLXRlc3RcIiBzdHlsZT1cInBhZGRpbmc6IDRweCAxMHB4OyBmb250LXNpemU6IDAuNzhyZW07IGJvcmRlci1yYWRpdXM6IDRweDsgY3Vyc29yOiBwb2ludGVyO1wiPlRlc3Q8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWJ1dHRvbnNcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImNsb2NrLXNldHRpbmdzLWNhbmNlbFwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwiY2xvY2stc2V0dGluZ3Mtc2F2ZVwiPlNhdmU8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5gKTtcblxuICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbG9jay1zZXR0aW5ncy1tb2RhbCcpO1xuICBjb25zdCBjaGltZXNUb2dnbGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2xvY2stY2hpbWVzLXRvZ2dsZScpO1xuICBjb25zdCB2b2x1bWVTbGlkZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2xvY2stY2hpbWUtdm9sdW1lJyk7XG4gIGNvbnN0IHZvbHVtZVNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2xvY2stdm9sdW1lLXNlY3Rpb24nKTtcblxuICBmdW5jdGlvbiBsb2FkU2V0dGluZ3MoKSB7XG4gICAgY29uc3Qgc3R5bGUgPSBzYWZlR2V0KCdjbG9jay1zdHlsZScpIHx8ICdkZWZhdWx0JztcbiAgICBjb25zdCByYWRpbyA9IG1vZGFsLnF1ZXJ5U2VsZWN0b3IoYGlucHV0W3ZhbHVlPVwiJHtzdHlsZX1cIl1gKTtcbiAgICBpZiAocmFkaW8pIHJhZGlvLmNoZWNrZWQgPSB0cnVlO1xuICAgIGNoaW1lc1RvZ2dsZS5jaGVja2VkID0gc2FmZUdldCgnY2xvY2stY2hpbWVzJykgPT09ICd0cnVlJztcbiAgICB2b2x1bWVTbGlkZXIudmFsdWUgPSBzYWZlR2V0KCdjbG9jay1jaGltZS12b2x1bWUnKSB8fCAnNTAnO1xuICAgIHZvbHVtZVNlY3Rpb24uc3R5bGUub3BhY2l0eSA9IGNoaW1lc1RvZ2dsZS5jaGVja2VkID8gJzEnIDogJzAuNCc7XG4gIH1cblxuICBjaGltZXNUb2dnbGU/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHtcbiAgICB2b2x1bWVTZWN0aW9uLnN0eWxlLm9wYWNpdHkgPSBjaGltZXNUb2dnbGUuY2hlY2tlZCA/ICcxJyA6ICcwLjQnO1xuICB9KTtcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2xvY2stc2V0dGluZ3MnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgbG9hZFNldHRpbmdzKCk7XG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICB9KTtcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2xvY2stY2hpbWUtdGVzdCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBjb25zdCB2b2wgPSBwYXJzZUludCh2b2x1bWVTbGlkZXIudmFsdWUsIDEwKSAvIDEwMDtcbiAgICBjb25zdCBiZWxsID0gbmV3IEF1ZGlvKCcvYXNzZXRzL3NvdW5kcy9jaHVyY2gtYmVsbC5tcDMnKTtcbiAgICBiZWxsLnZvbHVtZSA9IHZvbDtcbiAgICBiZWxsLnBsYXkoKS5jYXRjaCgoKSA9PiB7fSk7XG4gIH0pO1xuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbG9jay1zZXR0aW5ncy1zYXZlJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGNvbnN0IHJhZGlvID0gbW9kYWwucXVlcnlTZWxlY3RvcignaW5wdXRbbmFtZT1cImNsb2NrLXN0eWxlLXJhZGlvXCJdOmNoZWNrZWQnKTtcbiAgICBjb25zdCBzdHlsZSA9IHJhZGlvID8gcmFkaW8udmFsdWUgOiAnZGVmYXVsdCc7XG4gICAgc2FmZVNldCgnY2xvY2stc3R5bGUnLCBzdHlsZSk7XG4gICAgc2FmZVNldCgnY2xvY2stY2hpbWVzJywgU3RyaW5nKGNoaW1lc1RvZ2dsZS5jaGVja2VkKSk7XG4gICAgc2FmZVNldCgnY2xvY2stY2hpbWUtdm9sdW1lJywgdm9sdW1lU2xpZGVyLnZhbHVlKTtcbiAgICBjdXJyZW50U3R5bGUgPSBzdHlsZTtcbiAgICBwcmV2RmxpcERpZ2l0cyA9ICcnO1xuICAgIHJlc2V0UmVuZGVyTGF5b3V0KCk7XG4gICAgdGljaygpO1xuICAgIHNjaGVkdWxlTmV4dFRpY2soKTtcbiAgICBtb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gICAgc2hvd05vdGlmaWNhdGlvbignQ2xvY2sgc2V0dGluZ3Mgc2F2ZWQnLCAnc3VjY2VzcycsIDIwMDApO1xuICB9KTtcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2xvY2stc2V0dGluZ3MtY2FuY2VsJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIG1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgfSk7XG5cbiAgd2lyZU1vZGFsKG1vZGFsKTtcblxuICAvLyBMaXZlIHByZXZpZXcgd2hlbiBjbGlja2luZyBzdHlsZSBvcHRpb25zXG4gIG1vZGFsPy5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFtuYW1lPVwiY2xvY2stc3R5bGUtcmFkaW9cIl0nKS5mb3JFYWNoKHJhZGlvID0+IHtcbiAgICByYWRpby5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICBjdXJyZW50U3R5bGUgPSByYWRpby52YWx1ZTtcbiAgICAgIHByZXZGbGlwRGlnaXRzID0gJyc7XG4gICAgICByZXNldFJlbmRlckxheW91dCgpO1xuICAgICAgdGljaygpO1xuICAgIH0pO1xuICB9KTtcbn0pKCk7XG47XG4vLyA9PT09PT09PT09IENBUkQgSEVBTFRIICYgVVBEQVRFIEJBREdFUyA9PT09PT09PT09XG4oZnVuY3Rpb24oKSB7XG4gIC8vIEZldGNoIGhlYWx0aCBkYXRhIGFuZCB1cGRhdGUgY2FyZCBVSVxuICBhc3luYyBmdW5jdGlvbiByZWZyZXNoQ2FyZEhlYWx0aCgpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvaGVhbHRoLWNoZWNrcy9zdGF0dXMnKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKCFkYXRhLnN1Y2Nlc3MgfHwgIWRhdGEuc3RhdHVzKSByZXR1cm47XG5cbiAgICAgIGZvciAoY29uc3QgW3NlcnZpY2VJZCwgc3ZjXSBvZiBPYmplY3QuZW50cmllcyhkYXRhLnN0YXR1cykpIHtcbiAgICAgICAgY29uc3QgdXB0aW1lRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXB0aW1lLScgKyBzZXJ2aWNlSWQpO1xuICAgICAgICBjb25zdCBiYXJFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cHRpbWUtYmFyLScgKyBzZXJ2aWNlSWQpO1xuICAgICAgICBpZiAoIXVwdGltZUVsKSBjb250aW51ZTtcblxuICAgICAgICBjb25zdCB1cHRpbWUyNCA9IHN2Yy51cHRpbWU/LlsnMjRoJ107XG4gICAgICAgIGlmICh1cHRpbWUyNCAhPT0gdW5kZWZpbmVkICYmIHVwdGltZTI0ICE9PSBudWxsKSB7XG4gICAgICAgICAgY29uc3QgcGN0ID0gdXB0aW1lMjQudG9GaXhlZCgxKTtcbiAgICAgICAgICB1cHRpbWVFbC50ZXh0Q29udGVudCA9IGAke3BjdH0lIHVwdGltZWA7XG4gICAgICAgICAgLy8gQ29sb3IgY2xhc3NcbiAgICAgICAgICB1cHRpbWVFbC5jbGFzc05hbWUgPSAndXB0aW1lLWNoaXAnO1xuICAgICAgICAgIGlmICh1cHRpbWUyNCA+PSA5OS45KSB1cHRpbWVFbC5jbGFzc0xpc3QuYWRkKCdleGNlbGxlbnQnKTtcbiAgICAgICAgICBlbHNlIGlmICh1cHRpbWUyNCA+PSA5OSkgdXB0aW1lRWwuY2xhc3NMaXN0LmFkZCgnZ29vZCcpO1xuICAgICAgICAgIGVsc2UgaWYgKHVwdGltZTI0ID49IDk1KSB1cHRpbWVFbC5jbGFzc0xpc3QuYWRkKCdkZWdyYWRlZCcpO1xuICAgICAgICAgIGVsc2UgdXB0aW1lRWwuY2xhc3NMaXN0LmFkZCgncG9vcicpO1xuXG4gICAgICAgICAgaWYgKGJhckVsKSBiYXJFbC5zdHlsZS53aWR0aCA9IHBjdCArICclJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIC8qIEhlYWx0aCBjaGVjayBBUEkgdW5hdmFpbGFibGUgXHUyMDE0IHVwdGltZSBjaGlwcyBzdGF5IGhpZGRlbiAqL1xuICAgICAgY29uc29sZS53YXJuKCdbQ2FyZCBCYWRnZXNdIEhlYWx0aCBjaGVjayBBUEkgdW5hdmFpbGFibGUnKTtcbiAgICB9XG4gIH1cblxuICAvLyBUcmFjayBkaXNtaXNzZWQgdXBkYXRlcyAocGVyIHNlc3Npb24pXG4gIGxldCBkaXNtaXNzZWRVcGRhdGVzO1xuICB0cnkge1xuICAgIGRpc21pc3NlZFVwZGF0ZXMgPSBuZXcgU2V0KEpTT04ucGFyc2Uoc2FmZVNlc3Npb25HZXQoJ2Rpc21pc3NlZC11cGRhdGVzJykgfHwgJ1tdJykpO1xuICB9IGNhdGNoIChfKSB7XG4gICAgLyogU2Vzc2lvbiBzdG9yYWdlIHVuYXZhaWxhYmxlICovXG4gICAgZGlzbWlzc2VkVXBkYXRlcyA9IG5ldyBTZXQoKTtcbiAgfVxuXG4gIC8vIFRyYWNrIGdsb2JhbCB1cGRhdGUgc3RhdGUgZm9yIGNyb3NzLWNvbXBvbmVudCBhY2Nlc3NcbiAgbGV0IGtub3duVXBkYXRlcyA9IFtdO1xuXG4gIC8vIEZldGNoIHVwZGF0ZSBkYXRhIGFuZCBzaG93IGJhZGdlc1xuICBhc3luYyBmdW5jdGlvbiByZWZyZXNoQ2FyZFVwZGF0ZXMobm90aWZ5TmV3KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL3VwZGF0ZXMvYXZhaWxhYmxlJyk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmICghZGF0YS5zdWNjZXNzKSByZXR1cm47XG5cbiAgICAgIC8vIENsZWFyIGFsbCB1cGRhdGUgYmFkZ2VzIGZpcnN0XG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudXBkYXRlLWF2YWlsYWJsZS1iYWRnZScpLmZvckVhY2goZWwgPT4gZWwuY2xhc3NMaXN0LnJlbW92ZSgndmlzaWJsZScpKTtcblxuICAgICAgY29uc3QgdXBkYXRlcyA9IGRhdGEudXBkYXRlcyB8fCBbXTtcbiAgICAgIGtub3duVXBkYXRlcyA9IHVwZGF0ZXM7IC8vIHN0b3JlIGdsb2JhbGx5XG5cbiAgICAgIC8vIE5vdGlmeSBpZiBuZXcgdXBkYXRlcyBhcHBlYXJlZCAocGVyaW9kaWMgY2hlY2sgd2l0aCBub3RpZmljYXRpb24pXG4gICAgICBpZiAobm90aWZ5TmV3ICYmIHVwZGF0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBwcmV2ID0gd2luZG93Ll9sYXN0S25vd25VcGRhdGVDb3VudCB8fCAwO1xuICAgICAgICBpZiAocHJldiA+IDAgJiYgdXBkYXRlcy5sZW5ndGggPiBwcmV2KSB7XG4gICAgICAgICAgc2hvd05vdGlmaWNhdGlvbihgJHt1cGRhdGVzLmxlbmd0aH0gY29udGFpbmVyIHVwZGF0ZShzKSBhdmFpbGFibGUgXHUyMDE0IGNsaWNrIFVwZGF0ZSBNYW5hZ2VtZW50IHRvIHJldmlldy5gLCAnaW5mbycpO1xuICAgICAgICB9XG4gICAgICAgIHdpbmRvdy5fbGFzdEtub3duVXBkYXRlQ291bnQgPSB1cGRhdGVzLmxlbmd0aDtcbiAgICAgIH1cblxuICAgICAgaWYgKCF1cGRhdGVzLmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgICBmb3IgKGNvbnN0IHVwZCBvZiB1cGRhdGVzKSB7XG4gICAgICAgIC8vIFRyeSB0byBtYXRjaCBieSBjb250YWluZXIgbmFtZSB0byBzZXJ2aWNlIGlkXG4gICAgICAgIGNvbnN0IGFwcHMgPSB3aW5kb3cuQVBQUyB8fCBbXTtcbiAgICAgICAgZm9yIChjb25zdCBhcHAgb2YgYXBwcykge1xuICAgICAgICAgIGlmIChhcHAuY29udGFpbmVySWQgPT09IHVwZC5jb250YWluZXJJZCB8fCBhcHAuaWQgPT09IHVwZC5jb250YWluZXJOYW1lIHx8IGFwcC5uYW1lID09PSB1cGQuY29udGFpbmVyTmFtZSkge1xuICAgICAgICAgICAgLy8gU2tpcCBkaXNtaXNzZWQgdXBkYXRlc1xuICAgICAgICAgICAgaWYgKGRpc21pc3NlZFVwZGF0ZXMuaGFzKGFwcC5pZCkpIGJyZWFrO1xuICAgICAgICAgICAgY29uc3QgYmFkZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBkYXRlLWJhZGdlLScgKyBhcHAuaWQpO1xuICAgICAgICAgICAgY29uc3QgdXBkYXRlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VwZGF0ZS1idG4tJyArIGFwcC5pZCk7XG4gICAgICAgICAgICBpZiAoYmFkZ2UpIHtcbiAgICAgICAgICAgICAgYmFkZ2UuY2xhc3NMaXN0LmFkZCgndmlzaWJsZScpO1xuICAgICAgICAgICAgICBiYWRnZS50aXRsZSA9IGBVcGRhdGUgYXZhaWxhYmxlIFx1MjAxNCBjbGljayB0byBvcGVuIFVwZGF0ZSBNYW5hZ2VtZW50LmA7XG4gICAgICAgICAgICAgIGJhZGdlLnN0eWxlLmN1cnNvciA9ICdwb2ludGVyJztcbiAgICAgICAgICAgICAgYmFkZ2Uub25jbGljayA9IChlKSA9PiB7XG4gICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICAvLyBPcGVuIFVwZGF0ZSBNYW5hZ2VtZW50IG1vZGFsIGZvY3VzZWQgb24gdGhpcyBhcHBcbiAgICAgICAgICAgICAgICBpZiAod2luZG93Lm9wZW5VcGRhdGVNb2RhbCkgd2luZG93Lm9wZW5VcGRhdGVNb2RhbChhcHAuaWQpO1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSGlnaGxpZ2h0IHVwZGF0ZSBidXR0b24gaWYgdXBkYXRlIGlzIGF2YWlsYWJsZVxuICAgICAgICAgICAgaWYgKHVwZGF0ZUJ0bikge1xuICAgICAgICAgICAgICB1cGRhdGVCdG4uc3R5bGUuYmFja2dyb3VuZCA9ICcjZjk3MzE2JztcbiAgICAgICAgICAgICAgdXBkYXRlQnRuLnN0eWxlLmJvcmRlckNvbG9yID0gJyNmOTczMTYnO1xuICAgICAgICAgICAgICB1cGRhdGVCdG4uc3R5bGUuYm94U2hhZG93ID0gJzAgMCA2cHggI2Y5NzMxNjg4JztcbiAgICAgICAgICAgICAgdXBkYXRlQnRuLnRpdGxlID0gYFVwZGF0ZSBhdmFpbGFibGUgXHUyMDE0IGNsaWNrIHRvIG9wZW4gVXBkYXRlIE1hbmFnZW1lbnQuYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIC8qIFVwZGF0ZXMgQVBJIHVuYXZhaWxhYmxlIFx1MjAxNCBiYWRnZXMgc3RheSBoaWRkZW4gKi9cbiAgICAgIGNvbnNvbGUud2FybignW0NhcmQgQmFkZ2VzXSBVcGRhdGVzIEFQSSB1bmF2YWlsYWJsZScpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFJ1biBoZWFsdGggYW5kIHVwZGF0ZSBjaGVja3MgYWZ0ZXIgbWFpbiByZWZyZXNoLCBhbmQgcGVyaW9kaWNhbGx5XG4gIGZ1bmN0aW9uIHNjaGVkdWxlQ2FyZEVuaGFuY2VtZW50cygpIHtcbiAgICAvLyBJbml0aWFsIGxvYWQgKGRlbGF5ZWQgdG8gbm90IGNvbXBldGUgd2l0aCBtYWluIHByb2JlIGNoZWNrcylcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHJlZnJlc2hDYXJkSGVhbHRoKCk7XG4gICAgICByZWZyZXNoQ2FyZFVwZGF0ZXMoKTtcbiAgICB9LCA1MDAwKTtcblxuICAgIC8vIFBlcmlvZGljIHJlZnJlc2ggZXZlcnkgNjAgc2Vjb25kcyBcdTIwMTQgbm90aWZ5IG9uIG5ldyB1cGRhdGVzIGRldGVjdGVkXG4gICAgc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgcmVmcmVzaENhcmRIZWFsdGgoKTtcbiAgICAgIHJlZnJlc2hDYXJkVXBkYXRlcyh0cnVlKTsgLy8gdHJ1ZSA9IG5vdGlmeSBpZiBuZXcgdXBkYXRlcyBmb3VuZFxuICAgIH0sIDYwMDAwKTtcbiAgfVxuXG4gIC8vIEhvb2sgaW50byBtYWluIHJlZnJlc2ggY3ljbGVcbiAgY29uc3Qgb3JpZ1JlZnJlc2hBbGwgPSB3aW5kb3cucmVmcmVzaEFsbDtcbiAgaWYgKG9yaWdSZWZyZXNoQWxsKSB7XG4gICAgd2luZG93LnJlZnJlc2hBbGwgPSBhc3luYyBmdW5jdGlvbigpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IG9yaWdSZWZyZXNoQWxsKCk7XG4gICAgICAgIC8vIFJlZnJlc2ggaGVhbHRoIGRhdGEgYWZ0ZXIgbWFpbiBzdGF0dXMgY2hlY2tcbiAgICAgICAgc2V0VGltZW91dChyZWZyZXNoQ2FyZEhlYWx0aCwgMTAwMCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW0NhcmQgQmFkZ2VzXSBFcnJvciBpbiByZWZyZXNoQWxsIGhvb2s6JywgZS5tZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgc2NoZWR1bGVDYXJkRW5oYW5jZW1lbnRzKCk7XG59KSgpO1xuO1xuLy8gPT09PT09PT09PSBUSEVNRSBQSUNLRVIgKyBUSEVNRSBCVUlMREVSID09PT09PT09PT1cbihmdW5jdGlvbiAoKSB7XG4gIHZhciB0aGVtZUJlZm9yZUJ1aWxkZXIgPSBudWxsO1xuICB2YXIgZWRpdGluZ1NsdWcgPSBudWxsO1xuICB2YXIgYWR2YW5jZWRPdmVycmlkZXMgPSB7fTsgLy8gdHJhY2tzIHdoaWNoIGFkdmFuY2VkIGZpZWxkcyB1c2VyIG1hbnVhbGx5IGNoYW5nZWRcblxuICAvLyBEaXNwbGF5IG5hbWVzIGZvciBidWlsdC1pbiB0aGVtZXNcbiAgdmFyIFRIRU1FX0xBQkVMUyA9IHtcbiAgICBkYXJrOiAnRGFyaycsXG4gICAgbGlnaHQ6ICdMaWdodCcsXG4gICAgYmx1ZTogJ0JsdWUnLFxuICAgIGJsYWNrOiAnQmxhY2snLFxuICAgIG5vcmQ6ICdOb3JkJyxcbiAgICBkcmFjdWxhOiAnRHJhY3VsYScsXG4gICAgJ3NvbGFyaXplZC1kYXJrJzogJ1NvbGFyaXplZCBEYXJrJyxcbiAgICAnc29sYXJpemVkLWxpZ2h0JzogJ1NvbGFyaXplZCBMaWdodCcsXG4gICAgdGF4aTogJ1RheGknLFxuICAgIG9jZWFuOiAnT2NlYW4nLFxuICB9O1xuXG4gIC8vIENvbG9yIHBpY2tlciBmaWVsZCBkZWZpbml0aW9uczogW2Nzcy1wcm9wLCBsYWJlbCwgc2VjdGlvbl1cbiAgdmFyIEZJRUxEUyA9IFtcbiAgICBbJ2JnJywgICAgICAgICAgICAnQmFja2dyb3VuZCcsICAgICdiYXNlJ10sXG4gICAgWydjYXJkLWJhc2UnLCAgICAgJ0NhcmQnLCAgICAgICAgICAnYmFzZSddLFxuICAgIFsnZmcnLCAgICAgICAgICAgICdUZXh0JywgICAgICAgICAgJ2Jhc2UnXSxcbiAgICBbJ211dGVkJywgICAgICAgICAnTXV0ZWQgVGV4dCcsICAgICdiYXNlJ10sXG4gICAgWydib3JkZXInLCAgICAgICAgJ0JvcmRlcicsICAgICAgICAnYmFzZSddLFxuICAgIFsnYWNjZW50JywgICAgICAgICdBY2NlbnQnLCAgICAgICAgJ2FjY2VudCddLFxuICAgIFsnYWNjZW50LXN0cm9uZycsICdBY2NlbnQgU3Ryb25nJywgJ2FjY2VudCddLFxuICAgIFsnb2stYmcnLCAgICAgICAgICdPSyBCYWNrZ3JvdW5kJywgJ3N0YXR1cyddLFxuICAgIFsnb2stZmcnLCAgICAgICAgICdPSyBUZXh0JywgICAgICAgJ3N0YXR1cyddLFxuICAgIFsnYmFkLWJnJywgICAgICAgICdFcnJvciBCZycsICAgICAgJ3N0YXR1cyddLFxuICAgIFsnYmFkLWZnJywgICAgICAgICdFcnJvciBUZXh0JywgICAgJ3N0YXR1cyddLFxuICAgIFsnZG90LW9rJywgICAgICAgICdEb3QgT0snLCAgICAgICAgJ3N0YXR1cyddLFxuICAgIFsnZG90LWJhZCcsICAgICAgICdEb3QgRXJyb3InLCAgICAgJ3N0YXR1cyddLFxuICAgIFsndXB0aW1lJywgICAgICAgICdVcHRpbWUgQmFyJywgICAgJ3N0YXR1cyddLFxuICAgIFsnaG92ZXInLCAgICAgICAgICdIb3ZlcicsICAgICAgICAgJ2FkdmFuY2VkJ10sXG4gICAgWydjYXJkLWhvdmVyJywgICAgJ0NhcmQgSG92ZXInLCAgICAnYWR2YW5jZWQnXSxcbiAgICBbJ2Jhc2UnLCAgICAgICAgICAnVGFncy9CYWRnZXMnLCAgICdhZHZhbmNlZCddLFxuICAgIFsnZmctbXV0ZWQnLCAgICAgICdEaW0gVGV4dCcsICAgICAgJ2FkdmFuY2VkJ10sXG4gICAgWydzdWNjZXNzJywgICAgICAgJ1N1Y2Nlc3MnLCAgICAgICAnYWR2YW5jZWQnXSxcbiAgICBbJ2Vycm9yJywgICAgICAgICAnRXJyb3InLCAgICAgICAgICdhZHZhbmNlZCddLFxuICAgIFsnd2FybmluZycsICAgICAgICdXYXJuaW5nJywgICAgICAgJ2FkdmFuY2VkJ10sXG4gIF07XG5cbiAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFRoZW1lIEN5Y2xlIEJ1dHRvbiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuICB2YXIgdGhlbWVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGhlbWUnKTtcbiAgaWYgKCF0aGVtZUJ0bikgcmV0dXJuO1xuICB2YXIgdGhlbWVMYWJlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aGVtZS1sYWJlbCcpO1xuXG4gIGZ1bmN0aW9uIGdldExhYmVsRm9yKHQpIHtcbiAgICBpZiAoVEhFTUVfTEFCRUxTW3RdKSByZXR1cm4gVEhFTUVfTEFCRUxTW3RdO1xuICAgIHZhciB1c2VyVGhlbWVzID0gc2FmZUdldEpTT04od2luZG93LlVTRVJfVEhFTUVTX0tFWSwge30pO1xuICAgIGlmICh1c2VyVGhlbWVzW3RdKSByZXR1cm4gdXNlclRoZW1lc1t0XS5uYW1lIHx8IHQ7XG4gICAgcmV0dXJuIHQ7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVMYWJlbCgpIHtcbiAgICBpZiAodGhlbWVMYWJlbCkgdGhlbWVMYWJlbC50ZXh0Q29udGVudCA9IGdldExhYmVsRm9yKHdpbmRvdy5nZXRBY3RpdmVUaGVtZSgpKTtcbiAgfVxuXG4gIHRoZW1lQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgIHZhciBsaXN0ID0gd2luZG93LlRIRU1FUy5zbGljZSgpO1xuICAgIHZhciBjdXJyZW50ID0gd2luZG93LmdldEFjdGl2ZVRoZW1lKCk7XG4gICAgdmFyIGlkeCA9IGxpc3QuaW5kZXhPZihjdXJyZW50KTtcbiAgICB2YXIgbmV4dCA9IGxpc3RbKGlkeCArIDEpICUgbGlzdC5sZW5ndGhdO1xuICAgIHdpbmRvdy5hcHBseVRoZW1lKG5leHQpO1xuICAgIHVwZGF0ZUxhYmVsKCk7XG4gIH0pO1xuXG4gIHVwZGF0ZUxhYmVsKCk7XG5cbiAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFRoZW1lIEJ1aWxkZXIgTW9kYWwgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbiAgZnVuY3Rpb24gYnVpbGRGaWVsZHNIVE1MKCkge1xuICAgIHZhciBzZWN0aW9ucyA9IHsgYmFzZTogJ0Jhc2UgQ29sb3JzJywgYWNjZW50OiAnQWNjZW50Jywgc3RhdHVzOiAnU3RhdHVzJywgYWR2YW5jZWQ6ICdBZHZhbmNlZCAoYXV0by1kZXJpdmVkKScgfTtcbiAgICB2YXIgZ3JvdXBlZCA9IHt9O1xuICAgIEZJRUxEUy5mb3JFYWNoKGZ1bmN0aW9uIChmKSB7XG4gICAgICBpZiAoIWdyb3VwZWRbZlsyXV0pIGdyb3VwZWRbZlsyXV0gPSBbXTtcbiAgICAgIGdyb3VwZWRbZlsyXV0ucHVzaChmKTtcbiAgICB9KTtcblxuICAgIHZhciBodG1sID0gJyc7XG4gICAgT2JqZWN0LmtleXMoc2VjdGlvbnMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgaWYgKGtleSA9PT0gJ2FkdmFuY2VkJykge1xuICAgICAgICBodG1sICs9ICc8ZGl2IGlkPVwidGhlbWUtYnVpbGRlci1hZHZhbmNlZC10b2dnbGVcIiBjbGFzcz1cInRoZW1lLWJ1aWxkZXItYWR2YW5jZWQtdG9nZ2xlXCIgc3R5bGU9XCJtYXJnaW46MTJweCAwIDRweDtjdXJzb3I6cG9pbnRlcjtjb2xvcjp2YXIoLS1hY2NlbnQpO2ZvbnQtc2l6ZTouODVyZW07dXNlci1zZWxlY3Q6bm9uZTtcIj5TaG93IGFkdmFuY2VkIGNvbG9ycyAmIzk2NjA7PC9kaXY+JztcbiAgICAgICAgaHRtbCArPSAnPGRpdiBpZD1cInRoZW1lLWJ1aWxkZXItYWR2YW5jZWRcIiBjbGFzcz1cInRoZW1lLWJ1aWxkZXItc2VjdGlvblwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiPic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPVwidGhlbWUtYnVpbGRlci1zZWN0aW9uXCI+JztcbiAgICAgIH1cbiAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9XCJ0aGVtZS1idWlsZGVyLXNlY3Rpb24tdGl0bGVcIj4nICsgc2VjdGlvbnNba2V5XSArICc8L2Rpdj4nO1xuICAgICAgKGdyb3VwZWRba2V5XSB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbiAoZikge1xuICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPVwidGhlbWUtYnVpbGRlci1yb3dcIj4nICtcbiAgICAgICAgICAnPHNwYW4gY2xhc3M9XCJ0aGVtZS1idWlsZGVyLWxhYmVsXCI+JyArIGZbMV0gKyAnPC9zcGFuPicgK1xuICAgICAgICAgICc8aW5wdXQgdHlwZT1cImNvbG9yXCIgY2xhc3M9XCJ0aGVtZS1idWlsZGVyLWNvbG9yXCIgZGF0YS1wcm9wPVwiJyArIGZbMF0gKyAnXCInICsgKGtleSA9PT0gJ2FkdmFuY2VkJyA/ICcgZGF0YS1hZHZhbmNlZD1cIjFcIicgOiAnJykgKyAnIHZhbHVlPVwiIzAwMDAwMFwiIC8+JyArXG4gICAgICAgICAgJzxzcGFuIGNsYXNzPVwidGhlbWUtYnVpbGRlci1oZXhcIiBkYXRhLWhleD1cIicgKyBmWzBdICsgJ1wiPiMwMDAwMDA8L3NwYW4+JyArXG4gICAgICAgICAgJzwvZGl2Pic7XG4gICAgICB9KTtcbiAgICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gICAgfSk7XG4gICAgcmV0dXJuIGh0bWw7XG4gIH1cblxuICBmdW5jdGlvbiBidWlsZFN0YXJ0RnJvbU9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHdpbmRvdy5USEVNRVMubWFwKGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gJzxvcHRpb24gdmFsdWU9XCInICsgdCArICdcIj4nICsgZ2V0TGFiZWxGb3IodCkgKyAnPC9vcHRpb24+JztcbiAgICB9KS5qb2luKCcnKTtcbiAgfVxuXG4gIHZhciBtb2RhbEhUTUwgPSAnPGRpdiBpZD1cInRoZW1lLWJ1aWxkZXItbW9kYWxcIiBjbGFzcz1cIndlYXRoZXItbW9kYWxcIj4nICtcbiAgICAnPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtY29udGVudFwiIHN0eWxlPVwibWluLXdpZHRoOjQyMHB4O21heC13aWR0aDo1NjBweDtcIj4nICtcbiAgICAnPGgzPlRoZW1lIEJ1aWxkZXI8L2gzPicgK1xuXG4gICAgLy8gRWRpdCBleGlzdGluZyB1c2VyIHRoZW1lcyBkcm9wZG93blxuICAgICc8ZGl2IGlkPVwidGhlbWUtYnVpbGRlci1leGlzdGluZ1wiIHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNnB4O2Rpc3BsYXk6bm9uZTtcIj4nICtcbiAgICAnPGxhYmVsIHN0eWxlPVwiZm9udC1zaXplOi44NXJlbTtjb2xvcjp2YXIoLS1tdXRlZCk7bWFyZ2luLXJpZ2h0OjhweDtcIj5FZGl0OjwvbGFiZWw+JyArXG4gICAgJzxzZWxlY3QgaWQ9XCJ0aGVtZS1idWlsZGVyLWVkaXQtc2VsZWN0XCIgc3R5bGU9XCJwYWRkaW5nOjZweCAxMHB4O2JhY2tncm91bmQ6dmFyKC0tY2FyZC1iZyk7Y29sb3I6dmFyKC0tZmcpO2JvcmRlcjoxcHggc29saWQgdmFyKC0tYm9yZGVyKTtib3JkZXItcmFkaXVzOjZweDtmb250LXNpemU6Ljg1cmVtO21hcmdpbi1yaWdodDo4cHg7XCI+JyArXG4gICAgJzxvcHRpb24gdmFsdWU9XCJcIj5cdTIwMTQgTmV3IFRoZW1lIFx1MjAxNDwvb3B0aW9uPicgK1xuICAgICc8L3NlbGVjdD4nICtcbiAgICAnPGJ1dHRvbiBpZD1cInRoZW1lLWJ1aWxkZXItZGVsZXRlXCIgc3R5bGU9XCJwYWRkaW5nOjRweCAxMHB4O2JhY2tncm91bmQ6Y29sb3ItbWl4KGluIHNyZ2IsdmFyKC0tYmFkLWZnKSAxNSUsdHJhbnNwYXJlbnQpO2JvcmRlcjoxcHggc29saWQgdmFyKC0tYmFkLWZnKTtjb2xvcjp2YXIoLS1iYWQtZmcpO2JvcmRlci1yYWRpdXM6NnB4O2ZvbnQtc2l6ZTouOHJlbTtjdXJzb3I6cG9pbnRlcjtcIj5EZWxldGU8L2J1dHRvbj4nICtcbiAgICAnPC9kaXY+JyArXG5cbiAgICAnPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTZweDtcIj4nICtcbiAgICAnPGxhYmVsIHN0eWxlPVwiZm9udC1zaXplOi44NXJlbTtjb2xvcjp2YXIoLS1tdXRlZCk7bWFyZ2luLXJpZ2h0OjhweDtcIj5OYW1lOjwvbGFiZWw+JyArXG4gICAgJzxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwidGhlbWUtYnVpbGRlci1uYW1lXCIgbWF4bGVuZ3RoPVwiMjBcIiBwbGFjZWhvbGRlcj1cIk15IFRoZW1lXCIgJyArXG4gICAgJ3N0eWxlPVwicGFkZGluZzo2cHggMTBweDtiYWNrZ3JvdW5kOnZhcigtLWNhcmQtYmcpO2NvbG9yOnZhcigtLWZnKTtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWJvcmRlcik7Ym9yZGVyLXJhZGl1czo2cHg7Zm9udC1zaXplOi44NXJlbTt3aWR0aDoxNDBweDtcIiAvPicgK1xuICAgICc8L2Rpdj4nICtcblxuICAgICc8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNnB4O2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7XCI+JyArXG4gICAgJzxsYWJlbCBzdHlsZT1cImZvbnQtc2l6ZTouODVyZW07Y29sb3I6dmFyKC0tbXV0ZWQpO21hcmdpbi1yaWdodDo4cHg7Y3Vyc29yOnBvaW50ZXI7XCIgZm9yPVwidGhlbWUtYnVpbGRlci1saWdodGJnXCI+JyArXG4gICAgJzxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cInRoZW1lLWJ1aWxkZXItbGlnaHRiZ1wiIHN0eWxlPVwibWFyZ2luLXJpZ2h0OjZweDtjdXJzb3I6cG9pbnRlcjt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7XCIgLz4nICtcbiAgICAnTGlnaHQgYmFja2dyb3VuZCAodXNlIGRhcmsgbG9nbyk8L2xhYmVsPicgK1xuICAgICc8L2Rpdj4nICtcblxuICAgICc8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNnB4O1wiPicgK1xuICAgICc8bGFiZWwgc3R5bGU9XCJmb250LXNpemU6Ljg1cmVtO2NvbG9yOnZhcigtLW11dGVkKTttYXJnaW4tcmlnaHQ6OHB4O1wiPlN0YXJ0IGZyb206PC9sYWJlbD4nICtcbiAgICAnPHNlbGVjdCBpZD1cInRoZW1lLWJ1aWxkZXItc3RhcnRcIiBzdHlsZT1cInBhZGRpbmc6NnB4IDEwcHg7YmFja2dyb3VuZDp2YXIoLS1jYXJkLWJnKTtjb2xvcjp2YXIoLS1mZyk7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO2JvcmRlci1yYWRpdXM6NnB4O2ZvbnQtc2l6ZTouODVyZW07XCI+JyArXG4gICAgYnVpbGRTdGFydEZyb21PcHRpb25zKCkgK1xuICAgICc8L3NlbGVjdD4nICtcbiAgICAnPC9kaXY+JyArXG5cbiAgICAnPGRpdiBjbGFzcz1cInRoZW1lLWJ1aWxkZXItcHJldmlld1wiIGlkPVwidGhlbWUtYnVpbGRlci1wcmV2aWV3XCI+JyArXG4gICAgJzxkaXYgY2xhc3M9XCJ0aGVtZS1idWlsZGVyLWNhcmRcIiBpZD1cInRoZW1lLXByZXZpZXctY2FyZFwiPicgK1xuICAgICc8ZGl2IGNsYXNzPVwicHJldmlldy10aXRsZVwiPlNhbXBsZSBDYXJkPC9kaXY+JyArXG4gICAgJzxkaXYgY2xhc3M9XCJwcmV2aWV3LW11dGVkXCI+U2Vjb25kYXJ5IHRleHQgcHJldmlldzwvZGl2PicgK1xuICAgICc8ZGl2IGNsYXNzPVwicHJldmlldy1iYWRnZXNcIj4nICtcbiAgICAnPHNwYW4gY2xhc3M9XCJwcmV2aWV3LWJhZGdlXCIgaWQ9XCJwcmV2aWV3LWJhZGdlLW9rXCI+T048L3NwYW4+JyArXG4gICAgJzxzcGFuIGNsYXNzPVwicHJldmlldy1iYWRnZVwiIGlkPVwicHJldmlldy1iYWRnZS1iYWRcIj5PRkY8L3NwYW4+JyArXG4gICAgJzwvZGl2PicgK1xuICAgICc8ZGl2IGNsYXNzPVwicHJldmlldy1kb3RzXCI+JyArXG4gICAgJzxzcGFuPjxzcGFuIGNsYXNzPVwicHJldmlldy1kb3RcIiBpZD1cInByZXZpZXctZG90LW9rXCI+PC9zcGFuPiBPbmxpbmU8L3NwYW4+JyArXG4gICAgJzxzcGFuPjxzcGFuIGNsYXNzPVwicHJldmlldy1kb3RcIiBpZD1cInByZXZpZXctZG90LWJhZFwiPjwvc3Bhbj4gT2ZmbGluZTwvc3Bhbj4nICtcbiAgICAnPC9kaXY+JyArXG4gICAgJzxidXR0b24gY2xhc3M9XCJwcmV2aWV3LWJ0blwiIGlkPVwicHJldmlldy1hY2NlbnQtYnRuXCI+QWNjZW50IEJ1dHRvbjwvYnV0dG9uPicgK1xuICAgICc8L2Rpdj4nICtcbiAgICAnPC9kaXY+JyArXG5cbiAgICBidWlsZEZpZWxkc0hUTUwoKSArXG5cbiAgICAnPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9uc1wiPicgK1xuICAgICc8YnV0dG9uIGlkPVwidGhlbWUtYnVpbGRlci1jYW5jZWxcIj5DYW5jZWw8L2J1dHRvbj4nICtcbiAgICAnPGJ1dHRvbiBpZD1cInRoZW1lLWJ1aWxkZXItaW1wb3J0XCIgc3R5bGU9XCJtYXJnaW4tbGVmdDphdXRvO1wiIHRpdGxlPVwiSW1wb3J0IHRoZW1lIGZyb20gSlNPTiBmaWxlXCI+SW1wb3J0PC9idXR0b24+JyArXG4gICAgJzxidXR0b24gaWQ9XCJ0aGVtZS1idWlsZGVyLWV4cG9ydFwiIHRpdGxlPVwiRXhwb3J0IHRoZW1lIGFzIEpTT04gZmlsZVwiPkV4cG9ydDwvYnV0dG9uPicgK1xuICAgICc8YnV0dG9uIGlkPVwidGhlbWUtYnVpbGRlci1zYXZlXCIgY2xhc3M9XCJidG4tYWNjZW50XCI+U2F2ZSBUaGVtZTwvYnV0dG9uPicgK1xuICAgICc8L2Rpdj4nICtcbiAgICAnPC9kaXY+PC9kaXY+JztcblxuICBpbmplY3RNb2RhbCgndGhlbWUtYnVpbGRlci1tb2RhbCcsIG1vZGFsSFRNTCk7XG5cbiAgdmFyIG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RoZW1lLWJ1aWxkZXItbW9kYWwnKTtcbiAgdmFyIHN0YXJ0U2VsZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RoZW1lLWJ1aWxkZXItc3RhcnQnKTtcbiAgdmFyIG5hbWVJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aGVtZS1idWlsZGVyLW5hbWUnKTtcbiAgdmFyIGVkaXRTZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGhlbWUtYnVpbGRlci1lZGl0LXNlbGVjdCcpO1xuICB2YXIgZXhpc3RpbmdTZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RoZW1lLWJ1aWxkZXItZXhpc3RpbmcnKTtcbiAgdmFyIGxpZ2h0QmdDaGVjayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aGVtZS1idWlsZGVyLWxpZ2h0YmcnKTtcbiAgdmFyIHBpY2tlcnMgPSBtb2RhbC5xdWVyeVNlbGVjdG9yQWxsKCcudGhlbWUtYnVpbGRlci1jb2xvcicpO1xuICB2YXIgYWR2YW5jZWRTZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RoZW1lLWJ1aWxkZXItYWR2YW5jZWQnKTtcbiAgdmFyIGFkdmFuY2VkVG9nZ2xlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RoZW1lLWJ1aWxkZXItYWR2YW5jZWQtdG9nZ2xlJyk7XG4gIHZhciBleHBvcnRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGhlbWUtYnVpbGRlci1leHBvcnQnKTtcblxuICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgQWR2YW5jZWQgdG9nZ2xlIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG4gIHZhciBhZHZhbmNlZFZpc2libGUgPSBmYWxzZTtcbiAgYWR2YW5jZWRUb2dnbGUuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgYWR2YW5jZWRWaXNpYmxlID0gIWFkdmFuY2VkVmlzaWJsZTtcbiAgICBhZHZhbmNlZFNlY3Rpb24uc3R5bGUuZGlzcGxheSA9IGFkdmFuY2VkVmlzaWJsZSA/ICcnIDogJ25vbmUnO1xuICAgIGFkdmFuY2VkVG9nZ2xlLmlubmVySFRNTCA9IGFkdmFuY2VkVmlzaWJsZVxuICAgICAgPyAnSGlkZSBhZHZhbmNlZCBjb2xvcnMgJiM5NjUwOydcbiAgICAgIDogJ1Nob3cgYWR2YW5jZWQgY29sb3JzICYjOTY2MDsnO1xuICB9KTtcblxuICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgQ29sb3IgcGlja2VyIGhlbHBlcnMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbiAgZnVuY3Rpb24gZ2V0Q3VycmVudENvbG9ycygpIHtcbiAgICB2YXIgY29sb3JzID0ge307XG4gICAgcGlja2Vycy5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7XG4gICAgICBjb2xvcnNbcC5kYXRhc2V0LnByb3BdID0gcC52YWx1ZTtcbiAgICB9KTtcbiAgICBjb2xvcnNbJ2NhcmQtYmcnXSA9IGNvbG9yc1snY2FyZC1iYXNlJ107XG4gICAgcmV0dXJuIGNvbG9ycztcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEJhc2VDb2xvcnMoKSB7XG4gICAgdmFyIGNvbG9ycyA9IHt9O1xuICAgIHBpY2tlcnMuZm9yRWFjaChmdW5jdGlvbiAocCkge1xuICAgICAgaWYgKCFwLmRhdGFzZXQuYWR2YW5jZWQpIGNvbG9yc1twLmRhdGFzZXQucHJvcF0gPSBwLnZhbHVlO1xuICAgIH0pO1xuICAgIGNvbG9yc1snY2FyZC1iZyddID0gY29sb3JzWydjYXJkLWJhc2UnXTtcbiAgICBpZiAobGlnaHRCZ0NoZWNrLmNoZWNrZWQpIGNvbG9ycy5saWdodEJnID0gdHJ1ZTtcbiAgICByZXR1cm4gY29sb3JzO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlQWR2YW5jZWRGcm9tRGVyaXZlZCgpIHtcbiAgICB2YXIgYmFzZSA9IGdldEJhc2VDb2xvcnMoKTtcbiAgICB2YXIgZGVyaXZlZCA9IHdpbmRvdy5kZXJpdmVFeHRlbmRlZENvbG9ycyA/IHdpbmRvdy5kZXJpdmVFeHRlbmRlZENvbG9ycyhiYXNlKSA6IHt9O1xuICAgIHBpY2tlcnMuZm9yRWFjaChmdW5jdGlvbiAocCkge1xuICAgICAgaWYgKHAuZGF0YXNldC5hZHZhbmNlZCAmJiAhYWR2YW5jZWRPdmVycmlkZXNbcC5kYXRhc2V0LnByb3BdKSB7XG4gICAgICAgIHZhciB2YWwgPSBkZXJpdmVkW3AuZGF0YXNldC5wcm9wXSB8fCAnIzMzMzMzMyc7XG4gICAgICAgIHAudmFsdWUgPSB2YWw7XG4gICAgICAgIHZhciBoZXggPSBtb2RhbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1oZXg9XCInICsgcC5kYXRhc2V0LnByb3AgKyAnXCJdJyk7XG4gICAgICAgIGlmIChoZXgpIGhleC50ZXh0Q29udGVudCA9IHZhbC50b1VwcGVyQ2FzZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gbG9hZFRoZW1lSW50b1BpY2tlcnModGhlbWVOYW1lKSB7XG4gICAgdmFyIGNvbG9ycyA9IHdpbmRvdy5USEVNRV9DT0xPUlNbdGhlbWVOYW1lXTtcbiAgICBpZiAoIWNvbG9ycykgcmV0dXJuO1xuICAgIGFkdmFuY2VkT3ZlcnJpZGVzID0ge307XG4gICAgcGlja2Vycy5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7XG4gICAgICB2YXIgdmFsID0gY29sb3JzW3AuZGF0YXNldC5wcm9wXSB8fCAnIzAwMDAwMCc7XG4gICAgICBpZiAodmFsLnN0YXJ0c1dpdGgoJ3JnYmEnKSB8fCB2YWwuc3RhcnRzV2l0aCgnY29sb3ItbWl4JykpIHZhbCA9ICcjMzMzMzMzJztcbiAgICAgIHAudmFsdWUgPSB2YWw7XG4gICAgICB2YXIgaGV4ID0gbW9kYWwucXVlcnlTZWxlY3RvcignW2RhdGEtaGV4PVwiJyArIHAuZGF0YXNldC5wcm9wICsgJ1wiXScpO1xuICAgICAgaWYgKGhleCkgaGV4LnRleHRDb250ZW50ID0gdmFsLnRvVXBwZXJDYXNlKCk7XG4gICAgfSk7XG4gICAgbGlnaHRCZ0NoZWNrLmNoZWNrZWQgPSAhIWNvbG9ycy5saWdodEJnO1xuICAgIHVwZGF0ZVByZXZpZXcoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxvYWRVc2VyVGhlbWVJbnRvUGlja2VycyhzbHVnKSB7XG4gICAgdmFyIHVzZXJUaGVtZXMgPSBzYWZlR2V0SlNPTih3aW5kb3cuVVNFUl9USEVNRVNfS0VZLCB7fSk7XG4gICAgdmFyIHRoZW1lID0gdXNlclRoZW1lc1tzbHVnXTtcbiAgICBpZiAoIXRoZW1lKSByZXR1cm47XG4gICAgYWR2YW5jZWRPdmVycmlkZXMgPSB7fTtcbiAgICBwaWNrZXJzLmZvckVhY2goZnVuY3Rpb24gKHApIHtcbiAgICAgIHZhciB2YWwgPSB0aGVtZVtwLmRhdGFzZXQucHJvcF0gfHwgJyMwMDAwMDAnO1xuICAgICAgcC52YWx1ZSA9IHZhbDtcbiAgICAgIHZhciBoZXggPSBtb2RhbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1oZXg9XCInICsgcC5kYXRhc2V0LnByb3AgKyAnXCJdJyk7XG4gICAgICBpZiAoaGV4KSBoZXgudGV4dENvbnRlbnQgPSB2YWwudG9VcHBlckNhc2UoKTtcbiAgICAgIC8vIElmIHRoZW1lIGhhcyBleHBsaWNpdCBhZHZhbmNlZCB2YWx1ZXMsIG1hcmsgYXMgb3ZlcnJpZGRlblxuICAgICAgaWYgKHAuZGF0YXNldC5hZHZhbmNlZCAmJiB0aGVtZVtwLmRhdGFzZXQucHJvcF0pIHtcbiAgICAgICAgYWR2YW5jZWRPdmVycmlkZXNbcC5kYXRhc2V0LnByb3BdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBuYW1lSW5wdXQudmFsdWUgPSB0aGVtZS5uYW1lIHx8ICcnO1xuICAgIGxpZ2h0QmdDaGVjay5jaGVja2VkID0gISF0aGVtZS5saWdodEJnO1xuICAgIC8vIEZpbGwgYW55IG1pc3NpbmcgYWR2YW5jZWQgZmllbGRzIGZyb20gZGVyaXZhdGlvblxuICAgIHVwZGF0ZUFkdmFuY2VkRnJvbURlcml2ZWQoKTtcbiAgICB1cGRhdGVQcmV2aWV3KCk7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVQcmV2aWV3KCkge1xuICAgIHZhciBjID0gZ2V0Q3VycmVudENvbG9ycygpO1xuICAgIHZhciBwcmV2aWV3ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RoZW1lLWJ1aWxkZXItcHJldmlldycpO1xuICAgIHZhciBjYXJkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RoZW1lLXByZXZpZXctY2FyZCcpO1xuICAgIHZhciB0aXRsZSA9IGNhcmQucXVlcnlTZWxlY3RvcignLnByZXZpZXctdGl0bGUnKTtcbiAgICB2YXIgbXV0ZWQgPSBjYXJkLnF1ZXJ5U2VsZWN0b3IoJy5wcmV2aWV3LW11dGVkJyk7XG4gICAgdmFyIGJhZGdlT2sgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJldmlldy1iYWRnZS1vaycpO1xuICAgIHZhciBiYWRnZUJhZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcmV2aWV3LWJhZGdlLWJhZCcpO1xuICAgIHZhciBkb3RPayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcmV2aWV3LWRvdC1vaycpO1xuICAgIHZhciBkb3RCYWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJldmlldy1kb3QtYmFkJyk7XG4gICAgdmFyIGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcmV2aWV3LWFjY2VudC1idG4nKTtcbiAgICB2YXIgZG90cyA9IGNhcmQucXVlcnlTZWxlY3RvcignLnByZXZpZXctZG90cycpO1xuXG4gICAgcHJldmlldy5zdHlsZS5iYWNrZ3JvdW5kID0gY1snYmcnXTtcbiAgICBjYXJkLnN0eWxlLmJhY2tncm91bmQgPSBjWydjYXJkLWJhc2UnXTtcbiAgICBjYXJkLnN0eWxlLmJvcmRlckNvbG9yID0gY1snYm9yZGVyJ107XG4gICAgdGl0bGUuc3R5bGUuY29sb3IgPSBjWydmZyddO1xuICAgIG11dGVkLnN0eWxlLmNvbG9yID0gY1snbXV0ZWQnXTtcbiAgICBiYWRnZU9rLnN0eWxlLmJhY2tncm91bmQgPSBjWydvay1iZyddO1xuICAgIGJhZGdlT2suc3R5bGUuY29sb3IgPSBjWydvay1mZyddO1xuICAgIGJhZGdlQmFkLnN0eWxlLmJhY2tncm91bmQgPSBjWydiYWQtYmcnXTtcbiAgICBiYWRnZUJhZC5zdHlsZS5jb2xvciA9IGNbJ2JhZC1mZyddO1xuICAgIGRvdE9rLnN0eWxlLmJhY2tncm91bmQgPSBjWydkb3Qtb2snXTtcbiAgICBkb3RCYWQuc3R5bGUuYmFja2dyb3VuZCA9IGNbJ2RvdC1iYWQnXTtcbiAgICBkb3RzLnN0eWxlLmNvbG9yID0gY1snZmcnXTtcbiAgICBidG4uc3R5bGUuYmFja2dyb3VuZCA9IGNbJ2FjY2VudCddO1xuICAgIGJ0bi5zdHlsZS5jb2xvciA9IGNbJ2JnJ107XG4gIH1cblxuICBmdW5jdGlvbiBhcHBseUNvbG9yc0xpdmUoY29sb3JzKSB7XG4gICAgLy8gSW5jbHVkZSBkZXJpdmVkIGNvbG9ycyBmb3IgZnVsbCBsaXZlIHByZXZpZXdcbiAgICB2YXIgZGVyaXZlZCA9IHdpbmRvdy5kZXJpdmVFeHRlbmRlZENvbG9ycyA/IHdpbmRvdy5kZXJpdmVFeHRlbmRlZENvbG9ycyhjb2xvcnMpIDoge307XG4gICAgd2luZG93LlRIRU1FX1BST1BTLmZvckVhY2goZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgIHZhciB2YWwgPSBjb2xvcnNbcHJvcF0gfHwgZGVyaXZlZFtwcm9wXTtcbiAgICAgIGlmICh2YWwpIHtcbiAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KCctLScgKyBwcm9wLCB2YWwpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gV2lyZSB1cCBjb2xvciBwaWNrZXJzXG4gIHBpY2tlcnMuZm9yRWFjaChmdW5jdGlvbiAocCkge1xuICAgIHAuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgaGV4ID0gbW9kYWwucXVlcnlTZWxlY3RvcignW2RhdGEtaGV4PVwiJyArIHAuZGF0YXNldC5wcm9wICsgJ1wiXScpO1xuICAgICAgaWYgKGhleCkgaGV4LnRleHRDb250ZW50ID0gcC52YWx1ZS50b1VwcGVyQ2FzZSgpO1xuXG4gICAgICAvLyBUcmFjayBtYW51YWwgYWR2YW5jZWQgb3ZlcnJpZGVzXG4gICAgICBpZiAocC5kYXRhc2V0LmFkdmFuY2VkKSB7XG4gICAgICAgIGFkdmFuY2VkT3ZlcnJpZGVzW3AuZGF0YXNldC5wcm9wXSA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBCYXNlIGNvbG9yIGNoYW5nZWQgXHUyMDE0IHJlLWRlcml2ZSBhZHZhbmNlZCB2YWx1ZXMgKHVubGVzcyBvdmVycmlkZGVuKVxuICAgICAgICB1cGRhdGVBZHZhbmNlZEZyb21EZXJpdmVkKCk7XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZVByZXZpZXcoKTtcbiAgICAgIGFwcGx5Q29sb3JzTGl2ZShnZXRDdXJyZW50Q29sb3JzKCkpO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyBMaWdodC1iZyBjaGVja2JveCBzaG91bGQgcmUtZGVyaXZlIGFkdmFuY2VkIGNvbG9yc1xuICBsaWdodEJnQ2hlY2suYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZnVuY3Rpb24gKCkge1xuICAgIHVwZGF0ZUFkdmFuY2VkRnJvbURlcml2ZWQoKTtcbiAgICB1cGRhdGVQcmV2aWV3KCk7XG4gICAgYXBwbHlDb2xvcnNMaXZlKGdldEN1cnJlbnRDb2xvcnMoKSk7XG4gIH0pO1xuXG4gIHN0YXJ0U2VsZWN0LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGZ1bmN0aW9uICgpIHtcbiAgICBhZHZhbmNlZE92ZXJyaWRlcyA9IHt9O1xuICAgIGxvYWRUaGVtZUludG9QaWNrZXJzKHN0YXJ0U2VsZWN0LnZhbHVlKTtcbiAgICBhcHBseUNvbG9yc0xpdmUoZ2V0Q3VycmVudENvbG9ycygpKTtcbiAgfSk7XG5cbiAgLy8gUG9wdWxhdGUgYW5kIHJlZnJlc2ggdGhlIGVkaXQtZXhpc3RpbmcgZHJvcGRvd25cbiAgZnVuY3Rpb24gcmVmcmVzaEVkaXREcm9wZG93bigpIHtcbiAgICB2YXIgdXNlclRoZW1lcyA9IHNhZmVHZXRKU09OKHdpbmRvdy5VU0VSX1RIRU1FU19LRVksIHt9KTtcbiAgICB2YXIgc2x1Z3MgPSBPYmplY3Qua2V5cyh1c2VyVGhlbWVzKTtcbiAgICBlZGl0U2VsZWN0LmlubmVySFRNTCA9ICc8b3B0aW9uIHZhbHVlPVwiXCI+XHUyMDE0IE5ldyBUaGVtZSBcdTIwMTQ8L29wdGlvbj4nO1xuICAgIHNsdWdzLmZvckVhY2goZnVuY3Rpb24gKHNsdWcpIHtcbiAgICAgIHZhciBvcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24nKTtcbiAgICAgIG9wdC52YWx1ZSA9IHNsdWc7XG4gICAgICBvcHQudGV4dENvbnRlbnQgPSB1c2VyVGhlbWVzW3NsdWddLm5hbWUgfHwgc2x1ZztcbiAgICAgIGVkaXRTZWxlY3QuYXBwZW5kQ2hpbGQob3B0KTtcbiAgICB9KTtcbiAgICBleGlzdGluZ1NlY3Rpb24uc3R5bGUuZGlzcGxheSA9IHNsdWdzLmxlbmd0aCA/ICcnIDogJ25vbmUnO1xuICB9XG5cbiAgLy8gQWxzbyByZWZyZXNoIFwiU3RhcnQgZnJvbVwiIG9wdGlvbnNcbiAgZnVuY3Rpb24gcmVmcmVzaFN0YXJ0RnJvbSgpIHtcbiAgICBzdGFydFNlbGVjdC5pbm5lckhUTUwgPSBidWlsZFN0YXJ0RnJvbU9wdGlvbnMoKTtcbiAgfVxuXG4gIC8vIEVkaXQgZHJvcGRvd24gY2hhbmdlXG4gIGVkaXRTZWxlY3QuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZnVuY3Rpb24gKCkge1xuICAgIHZhciBzbHVnID0gdGhpcy52YWx1ZTtcbiAgICBpZiAoc2x1Zykge1xuICAgICAgZWRpdGluZ1NsdWcgPSBzbHVnO1xuICAgICAgbG9hZFVzZXJUaGVtZUludG9QaWNrZXJzKHNsdWcpO1xuICAgICAgYXBwbHlDb2xvcnNMaXZlKGdldEN1cnJlbnRDb2xvcnMoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVkaXRpbmdTbHVnID0gbnVsbDtcbiAgICAgIGFkdmFuY2VkT3ZlcnJpZGVzID0ge307XG4gICAgICBuYW1lSW5wdXQudmFsdWUgPSAnJztcbiAgICAgIHN0YXJ0U2VsZWN0LnZhbHVlID0gd2luZG93LmdldEFjdGl2ZVRoZW1lKCk7XG4gICAgICBsb2FkVGhlbWVJbnRvUGlja2VycyhzdGFydFNlbGVjdC52YWx1ZSk7XG4gICAgfVxuICAgIGV4cG9ydEJ0bi5zdHlsZS5kaXNwbGF5ID0gZWRpdGluZ1NsdWcgPyAnJyA6ICdub25lJztcbiAgfSk7XG5cbiAgZnVuY3Rpb24gb3BlbkJ1aWxkZXIoKSB7XG4gICAgdGhlbWVCZWZvcmVCdWlsZGVyID0gd2luZG93LmdldEFjdGl2ZVRoZW1lKCk7XG4gICAgZWRpdGluZ1NsdWcgPSBudWxsO1xuICAgIGFkdmFuY2VkT3ZlcnJpZGVzID0ge307XG5cbiAgICAvLyBSZXNldCBhZHZhbmNlZCBzZWN0aW9uIHRvIGNvbGxhcHNlZFxuICAgIGFkdmFuY2VkVmlzaWJsZSA9IGZhbHNlO1xuICAgIGFkdmFuY2VkU2VjdGlvbi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIGFkdmFuY2VkVG9nZ2xlLmlubmVySFRNTCA9ICdTaG93IGFkdmFuY2VkIGNvbG9ycyAmIzk2NjA7JztcblxuICAgIHJlZnJlc2hFZGl0RHJvcGRvd24oKTtcbiAgICByZWZyZXNoU3RhcnRGcm9tKCk7XG5cbiAgICB2YXIgdXNlclRoZW1lcyA9IHNhZmVHZXRKU09OKHdpbmRvdy5VU0VSX1RIRU1FU19LRVksIHt9KTtcbiAgICBpZiAodXNlclRoZW1lc1t0aGVtZUJlZm9yZUJ1aWxkZXJdKSB7XG4gICAgICAvLyBBY3RpdmUgdGhlbWUgaXMgYSB1c2VyIHRoZW1lIFx1MjAxNCBvcGVuIGl0IGZvciBlZGl0aW5nXG4gICAgICBlZGl0U2VsZWN0LnZhbHVlID0gdGhlbWVCZWZvcmVCdWlsZGVyO1xuICAgICAgZWRpdGluZ1NsdWcgPSB0aGVtZUJlZm9yZUJ1aWxkZXI7XG4gICAgICBsb2FkVXNlclRoZW1lSW50b1BpY2tlcnModGhlbWVCZWZvcmVCdWlsZGVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWRpdFNlbGVjdC52YWx1ZSA9ICcnO1xuICAgICAgbmFtZUlucHV0LnZhbHVlID0gJyc7XG4gICAgICBzdGFydFNlbGVjdC52YWx1ZSA9IHRoZW1lQmVmb3JlQnVpbGRlcjtcbiAgICAgIGxvYWRUaGVtZUludG9QaWNrZXJzKHRoZW1lQmVmb3JlQnVpbGRlcik7XG4gICAgfVxuXG4gICAgZXhwb3J0QnRuLnN0eWxlLmRpc3BsYXkgPSBlZGl0aW5nU2x1ZyA/ICcnIDogJ25vbmUnO1xuICAgIG1vZGFsLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgfVxuXG4gIHZhciBjdXN0b21pemVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGhlbWUtY3VzdG9taXplLWJ0bicpO1xuICBpZiAoY3VzdG9taXplQnRuKSB7XG4gICAgY3VzdG9taXplQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkgeyBvcGVuQnVpbGRlcigpOyB9KTtcbiAgfVxuXG4gIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBTYXZlIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aGVtZS1idWlsZGVyLXNhdmUnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgY29sb3JzID0gZ2V0Q3VycmVudENvbG9ycygpO1xuICAgIHZhciBuYW1lID0gbmFtZUlucHV0LnZhbHVlLnRyaW0oKTtcbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ1BsZWFzZSBlbnRlciBhIHRoZW1lIG5hbWUnLCAnd2FybmluZycsIDMwMDApO1xuICAgICAgbmFtZUlucHV0LmZvY3VzKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHVzZXJUaGVtZXMgPSBzYWZlR2V0SlNPTih3aW5kb3cuVVNFUl9USEVNRVNfS0VZLCB7fSk7XG4gICAgdmFyIHNsdWc7XG4gICAgdmFyIG9sZFNsdWcgPSBudWxsO1xuXG4gICAgaWYgKGVkaXRpbmdTbHVnKSB7XG4gICAgICBzbHVnID0gZWRpdGluZ1NsdWc7XG4gICAgICAvLyBJZiBuYW1lIGNoYW5nZWQsIHJlLXNsdWdpZnkgYW5kIHBvdGVudGlhbGx5IHJlbmFtZVxuICAgICAgdmFyIG5ld1NsdWcgPSB3aW5kb3cuc2x1Z2lmeVRoZW1lTmFtZShuYW1lLCBlZGl0aW5nU2x1Zyk7XG4gICAgICBpZiAobmV3U2x1ZyAhPT0gZWRpdGluZ1NsdWcpIHtcbiAgICAgICAgb2xkU2x1ZyA9IGVkaXRpbmdTbHVnO1xuICAgICAgICBkZWxldGUgdXNlclRoZW1lc1tlZGl0aW5nU2x1Z107XG4gICAgICAgIHZhciBpZHggPSB3aW5kb3cuVEhFTUVTLmluZGV4T2YoZWRpdGluZ1NsdWcpO1xuICAgICAgICBpZiAoaWR4ICE9PSAtMSkgd2luZG93LlRIRU1FUy5zcGxpY2UoaWR4LCAxKTtcbiAgICAgICAgZGVsZXRlIHdpbmRvdy5USEVNRV9DT0xPUlNbZWRpdGluZ1NsdWddO1xuICAgICAgICBzbHVnID0gbmV3U2x1ZztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc2x1ZyA9IHdpbmRvdy5zbHVnaWZ5VGhlbWVOYW1lKG5hbWUpO1xuICAgIH1cblxuICAgIC8vIEJ1aWxkIHRoZW1lIGRhdGEgd2l0aCBBTEwgY29sb3IgcHJvcGVydGllc1xuICAgIHZhciB0aGVtZURhdGEgPSB7IG5hbWU6IG5hbWUgfTtcbiAgICBpZiAobGlnaHRCZ0NoZWNrLmNoZWNrZWQpIHRoZW1lRGF0YS5saWdodEJnID0gdHJ1ZTtcbiAgICB3aW5kb3cuVEhFTUVfUFJPUFMuZm9yRWFjaChmdW5jdGlvbiAocCkge1xuICAgICAgaWYgKGNvbG9yc1twXSkgdGhlbWVEYXRhW3BdID0gY29sb3JzW3BdO1xuICAgIH0pO1xuXG4gICAgLy8gVXBkYXRlIGxvY2FsU3RvcmFnZSBjYWNoZSBpbW1lZGlhdGVseSBmb3IgaW5zdGFudCBVSVxuICAgIHVzZXJUaGVtZXNbc2x1Z10gPSB0aGVtZURhdGE7XG4gICAgc2FmZVNldCh3aW5kb3cuVVNFUl9USEVNRVNfS0VZLCBKU09OLnN0cmluZ2lmeSh1c2VyVGhlbWVzKSk7XG5cbiAgICAvLyBDbGVhciBpbmxpbmUgcHJldmlldyBwcm9wZXJ0aWVzXG4gICAgd2luZG93LmNsZWFyQ3VzdG9tUHJvcGVydGllcygpO1xuXG4gICAgLy8gUmUtaW5qZWN0IENTUyBhbmQgYXBwbHlcbiAgICB3aW5kb3cuaW5qZWN0VXNlclRoZW1lU3R5bGVzKCk7XG4gICAgd2luZG93LmFwcGx5VGhlbWUoc2x1Zyk7XG4gICAgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgIHVwZGF0ZUxhYmVsKCk7XG5cbiAgICAvLyBTYXZlIHRvIHNlcnZlciAoc291cmNlIG9mIHRydXRoKVxuICAgIHZhciBhcGlDb2xvcnMgPSB7fTtcbiAgICB3aW5kb3cuVEhFTUVfUFJPUFMuZm9yRWFjaChmdW5jdGlvbiAocCkgeyBpZiAoY29sb3JzW3BdKSBhcGlDb2xvcnNbcF0gPSBjb2xvcnNbcF07IH0pO1xuXG4gICAgLy8gSWYgc2x1ZyBjaGFuZ2VkLCBkZWxldGUgdGhlIG9sZCBvbmUgZnJvbSBzZXJ2ZXJcbiAgICBpZiAob2xkU2x1Zykge1xuICAgICAgc2VjdXJlRmV0Y2goJy9hcGkvdjEvdGhlbWVzLycgKyBvbGRTbHVnLCB7IG1ldGhvZDogJ0RFTEVURScgfSkuY2F0Y2goZnVuY3Rpb24gKCkge30pO1xuICAgIH1cblxuICAgIHNlY3VyZUZldGNoKCcvYXBpL3YxL3RoZW1lcy8nICsgc2x1Zywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgbmFtZTogbmFtZSwgY29sb3JzOiBhcGlDb2xvcnMsIGxpZ2h0Qmc6IGxpZ2h0QmdDaGVjay5jaGVja2VkIH0pXG4gICAgfSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKG5hbWUgKyAnIHRoZW1lIHNhdmVkJywgJ3N1Y2Nlc3MnLCAzMDAwKTtcbiAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKG5hbWUgKyAnIHRoZW1lIHNhdmVkIGxvY2FsbHkgKHNlcnZlciBzeW5jIGZhaWxlZCknLCAnd2FybmluZycsIDMwMDApO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgQ2FuY2VsIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aGVtZS1idWlsZGVyLWNhbmNlbCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgIG1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgICB3aW5kb3cuY2xlYXJDdXN0b21Qcm9wZXJ0aWVzKCk7XG4gICAgaWYgKHRoZW1lQmVmb3JlQnVpbGRlcikge1xuICAgICAgd2luZG93LmFwcGx5VGhlbWUodGhlbWVCZWZvcmVCdWlsZGVyKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBEZWxldGUgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RoZW1lLWJ1aWxkZXItZGVsZXRlJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFlZGl0aW5nU2x1ZykgcmV0dXJuO1xuXG4gICAgdmFyIHVzZXJUaGVtZXMgPSBzYWZlR2V0SlNPTih3aW5kb3cuVVNFUl9USEVNRVNfS0VZLCB7fSk7XG4gICAgdmFyIG5hbWUgPSB1c2VyVGhlbWVzW2VkaXRpbmdTbHVnXSA/IHVzZXJUaGVtZXNbZWRpdGluZ1NsdWddLm5hbWUgOiBlZGl0aW5nU2x1ZztcblxuICAgIGlmICghY29uZmlybSgnRGVsZXRlIFwiJyArIG5hbWUgKyAnXCIgdGhlbWU/JykpIHJldHVybjtcblxuICAgIHZhciBzbHVnVG9EZWxldGUgPSBlZGl0aW5nU2x1ZztcblxuICAgIC8vIFVwZGF0ZSBsb2NhbFN0b3JhZ2UgY2FjaGUgaW1tZWRpYXRlbHlcbiAgICBkZWxldGUgdXNlclRoZW1lc1tzbHVnVG9EZWxldGVdO1xuICAgIHNhZmVTZXQod2luZG93LlVTRVJfVEhFTUVTX0tFWSwgSlNPTi5zdHJpbmdpZnkodXNlclRoZW1lcykpO1xuXG4gICAgLy8gUmVtb3ZlIGZyb20gcnVudGltZVxuICAgIHZhciBpZHggPSB3aW5kb3cuVEhFTUVTLmluZGV4T2Yoc2x1Z1RvRGVsZXRlKTtcbiAgICBpZiAoaWR4ICE9PSAtMSkgd2luZG93LlRIRU1FUy5zcGxpY2UoaWR4LCAxKTtcbiAgICBkZWxldGUgd2luZG93LlRIRU1FX0NPTE9SU1tzbHVnVG9EZWxldGVdO1xuXG4gICAgd2luZG93LmNsZWFyQ3VzdG9tUHJvcGVydGllcygpO1xuICAgIHdpbmRvdy5pbmplY3RVc2VyVGhlbWVTdHlsZXMoKTtcblxuICAgIHZhciBmYWxsYmFjayA9IHRoZW1lQmVmb3JlQnVpbGRlciAmJiB0aGVtZUJlZm9yZUJ1aWxkZXIgIT09IHNsdWdUb0RlbGV0ZSA/IHRoZW1lQmVmb3JlQnVpbGRlciA6ICdkYXJrJztcbiAgICB3aW5kb3cuYXBwbHlUaGVtZShmYWxsYmFjayk7XG5cbiAgICBlZGl0aW5nU2x1ZyA9IG51bGw7XG4gICAgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgIHVwZGF0ZUxhYmVsKCk7XG5cbiAgICAvLyBEZWxldGUgZnJvbSBzZXJ2ZXJcbiAgICBzZWN1cmVGZXRjaCgnL2FwaS92MS90aGVtZXMvJyArIHNsdWdUb0RlbGV0ZSwgeyBtZXRob2Q6ICdERUxFVEUnIH0pLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbihuYW1lICsgJyB0aGVtZSBkZWxldGVkJywgJ3N1Y2Nlc3MnLCAzMDAwKTtcbiAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKG5hbWUgKyAnIHRoZW1lIGRlbGV0ZWQgbG9jYWxseSAoc2VydmVyIHN5bmMgZmFpbGVkKScsICd3YXJuaW5nJywgMzAwMCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBFeHBvcnQgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RoZW1lLWJ1aWxkZXItZXhwb3J0JykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFlZGl0aW5nU2x1Zykge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignU2F2ZSB0aGUgdGhlbWUgZmlyc3QsIHRoZW4gZXhwb3J0JywgJ3dhcm5pbmcnLCAzMDAwKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHVzZXJUaGVtZXMgPSBzYWZlR2V0SlNPTih3aW5kb3cuVVNFUl9USEVNRVNfS0VZLCB7fSk7XG4gICAgdmFyIHRoZW1lID0gdXNlclRoZW1lc1tlZGl0aW5nU2x1Z107XG4gICAgaWYgKCF0aGVtZSkgcmV0dXJuO1xuXG4gICAgdmFyIGV4cG9ydERhdGEgPSB7XG4gICAgICBfZGFzaGNhZGR5X3RoZW1lOiB0cnVlLFxuICAgICAgdmVyc2lvbjogJzEuMCcsXG4gICAgICBleHBvcnREYXRlOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICBzbHVnOiBlZGl0aW5nU2x1ZyxcbiAgICAgIG5hbWU6IHRoZW1lLm5hbWUsXG4gICAgICBsaWdodEJnOiB0aGVtZS5saWdodEJnIHx8IGZhbHNlLFxuICAgICAgY29sb3JzOiB7fVxuICAgIH07XG4gICAgd2luZG93LlRIRU1FX1BST1BTLmZvckVhY2goZnVuY3Rpb24gKHApIHtcbiAgICAgIGlmICh0aGVtZVtwXSkgZXhwb3J0RGF0YS5jb2xvcnNbcF0gPSB0aGVtZVtwXTtcbiAgICB9KTtcblxuICAgIHZhciBibG9iID0gbmV3IEJsb2IoW0pTT04uc3RyaW5naWZ5KGV4cG9ydERhdGEsIG51bGwsIDIpXSwgeyB0eXBlOiAnYXBwbGljYXRpb24vanNvbicgfSk7XG4gICAgdmFyIHVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgdmFyIGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgYS5ocmVmID0gdXJsO1xuICAgIGEuZG93bmxvYWQgPSBlZGl0aW5nU2x1ZyArICctdGhlbWUuanNvbic7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTtcbiAgICBhLmNsaWNrKCk7XG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChhKTtcbiAgICBVUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7XG4gICAgc2hvd05vdGlmaWNhdGlvbignVGhlbWUgZXhwb3J0ZWQgYXMgJyArIGVkaXRpbmdTbHVnICsgJy10aGVtZS5qc29uJywgJ3N1Y2Nlc3MnLCAzMDAwKTtcbiAgfSk7XG5cbiAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIEltcG9ydCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGhlbWUtYnVpbGRlci1pbXBvcnQnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICAgIGlucHV0LnR5cGUgPSAnZmlsZSc7XG4gICAgaW5wdXQuYWNjZXB0ID0gJy5qc29uJztcbiAgICBpbnB1dC5vbmNoYW5nZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgZmlsZSA9IGUudGFyZ2V0LmZpbGVzWzBdO1xuICAgICAgaWYgKCFmaWxlKSByZXR1cm47XG4gICAgICB2YXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgIHJlYWRlci5vbmxvYWQgPSBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB2YXIgZGF0YSA9IEpTT04ucGFyc2UoZXYudGFyZ2V0LnJlc3VsdCk7XG5cbiAgICAgICAgICAvLyBTdXBwb3J0IGJvdGggd3JhcHBlZCBmb3JtYXQgYW5kIHJhdyB0aGVtZSBmb3JtYXRcbiAgICAgICAgICB2YXIgdGhlbWVOYW1lLCB0aGVtZUNvbG9ycywgdGhlbWVMaWdodEJnO1xuICAgICAgICAgIGlmIChkYXRhLl9kYXNoY2FkZHlfdGhlbWUgJiYgZGF0YS5jb2xvcnMpIHtcbiAgICAgICAgICAgIC8vIFdyYXBwZWQgZXhwb3J0IGZvcm1hdFxuICAgICAgICAgICAgdGhlbWVOYW1lID0gZGF0YS5uYW1lIHx8ICdJbXBvcnRlZCc7XG4gICAgICAgICAgICB0aGVtZUNvbG9ycyA9IGRhdGEuY29sb3JzO1xuICAgICAgICAgICAgdGhlbWVMaWdodEJnID0gZGF0YS5saWdodEJnIHx8IGZhbHNlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YS5uYW1lICYmIChkYXRhLmJnIHx8IGRhdGFbJ2NhcmQtYmFzZSddKSkge1xuICAgICAgICAgICAgLy8gUmF3IHRoZW1lIEpTT04gKHNhbWUgZm9ybWF0IGFzIHNlcnZlciBmaWxlcylcbiAgICAgICAgICAgIHRoZW1lTmFtZSA9IGRhdGEubmFtZTtcbiAgICAgICAgICAgIHRoZW1lQ29sb3JzID0ge307XG4gICAgICAgICAgICB3aW5kb3cuVEhFTUVfUFJPUFMuZm9yRWFjaChmdW5jdGlvbiAocCkgeyBpZiAoZGF0YVtwXSkgdGhlbWVDb2xvcnNbcF0gPSBkYXRhW3BdOyB9KTtcbiAgICAgICAgICAgIHRoZW1lTGlnaHRCZyA9IGRhdGEubGlnaHRCZyB8fCBmYWxzZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgYSB2YWxpZCBEYXNoQ2FkZHkgdGhlbWUgZmlsZScpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIExvYWQgaW50byBidWlsZGVyXG4gICAgICAgICAgbmFtZUlucHV0LnZhbHVlID0gdGhlbWVOYW1lO1xuICAgICAgICAgIGxpZ2h0QmdDaGVjay5jaGVja2VkID0gISF0aGVtZUxpZ2h0Qmc7XG4gICAgICAgICAgZWRpdGluZ1NsdWcgPSBudWxsO1xuICAgICAgICAgIGVkaXRTZWxlY3QudmFsdWUgPSAnJztcbiAgICAgICAgICBhZHZhbmNlZE92ZXJyaWRlcyA9IHt9O1xuXG4gICAgICAgICAgLy8gQXBwbHkgY29sb3JzIHRvIHBpY2tlcnNcbiAgICAgICAgICBwaWNrZXJzLmZvckVhY2goZnVuY3Rpb24gKHApIHtcbiAgICAgICAgICAgIHZhciB2YWwgPSB0aGVtZUNvbG9yc1twLmRhdGFzZXQucHJvcF0gfHwgJyMwMDAwMDAnO1xuICAgICAgICAgICAgcC52YWx1ZSA9IHZhbDtcbiAgICAgICAgICAgIHZhciBoZXggPSBtb2RhbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1oZXg9XCInICsgcC5kYXRhc2V0LnByb3AgKyAnXCJdJyk7XG4gICAgICAgICAgICBpZiAoaGV4KSBoZXgudGV4dENvbnRlbnQgPSB2YWwudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgIGlmIChwLmRhdGFzZXQuYWR2YW5jZWQgJiYgdGhlbWVDb2xvcnNbcC5kYXRhc2V0LnByb3BdKSB7XG4gICAgICAgICAgICAgIGFkdmFuY2VkT3ZlcnJpZGVzW3AuZGF0YXNldC5wcm9wXSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBGaWxsIGFueSBtaXNzaW5nIGFkdmFuY2VkIGZpZWxkc1xuICAgICAgICAgIHVwZGF0ZUFkdmFuY2VkRnJvbURlcml2ZWQoKTtcbiAgICAgICAgICB1cGRhdGVQcmV2aWV3KCk7XG4gICAgICAgICAgYXBwbHlDb2xvcnNMaXZlKGdldEN1cnJlbnRDb2xvcnMoKSk7XG4gICAgICAgICAgZXhwb3J0QnRuLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgICAgc2hvd05vdGlmaWNhdGlvbignXCInICsgdGhlbWVOYW1lICsgJ1wiIGxvYWRlZCBpbnRvIGJ1aWxkZXIuIENsaWNrIFNhdmUgdG8ga2VlcCBpdC4nLCAnc3VjY2VzcycsIDUwMDApO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdJbXBvcnQgZmFpbGVkOiAnICsgZXJyLm1lc3NhZ2UsICdlcnJvcicsIDUwMDApO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgcmVhZGVyLnJlYWRBc1RleHQoZmlsZSk7XG4gICAgfTtcbiAgICBpbnB1dC5jbGljaygpO1xuICB9KTtcblxuICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgTW9kYWwgY2xvc2UgaGFuZGxpbmcgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbiAgd2lyZU1vZGFsKG1vZGFsKTtcblxuICBtb2RhbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7XG4gICAgaWYgKGUudGFyZ2V0ID09PSBtb2RhbCkge1xuICAgICAgd2luZG93LmNsZWFyQ3VzdG9tUHJvcGVydGllcygpO1xuICAgICAgaWYgKHRoZW1lQmVmb3JlQnVpbGRlcikgd2luZG93LmFwcGx5VGhlbWUodGhlbWVCZWZvcmVCdWlsZGVyKTtcbiAgICB9XG4gIH0pO1xufSkoKTtcbjtcbi8vIExpY2Vuc2UgTWFuYWdlbWVudCBVSVxuKGZ1bmN0aW9uKCkge1xuICAvLyBJbmplY3QgbGljZW5zZSBtb2RhbCBIVE1MXG4gIGluamVjdE1vZGFsKCdsaWNlbnNlLW1vZGFsJywgYDxkaXYgaWQ9XCJsaWNlbnNlLW1vZGFsXCIgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsXCI+XG4gICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtY29udGVudFwiIHN0eWxlPVwibWluLXdpZHRoOiA0MjBweDsgbWF4LXdpZHRoOiA1MjBweDtcIj5cbiAgICAgIDxoMz5EYXNoQ2FkZHkgTGljZW5zZTwvaDM+XG4gICAgICA8cCBzdHlsZT1cImZvbnQtc2l6ZTogMC44NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luOiAwIDAgMTZweDtcIj5cbiAgICAgICAgQWN0aXZhdGUgYSBsaWNlbnNlIGNvZGUgdG8gdW5sb2NrIHByZW1pdW0gZmVhdHVyZXMuXG4gICAgICA8L3A+XG5cbiAgICAgIDxkaXYgaWQ9XCJsaWNlbnNlLXN0YXR1cy1zZWN0aW9uXCIgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAxNnB4O1wiPlxuICAgICAgICA8ZGl2IGlkPVwibGljZW5zZS1iYWRnZVwiIHN0eWxlPVwiZGlzcGxheTogaW5saW5lLWZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogNnB4OyBwYWRkaW5nOiA2cHggMTRweDsgYm9yZGVyLXJhZGl1czogMjBweDsgZm9udC1zaXplOiAwLjg1cmVtOyBmb250LXdlaWdodDogNjAwOyBtYXJnaW4tYm90dG9tOiAxMnB4O1wiPlxuICAgICAgICAgIDxzcGFuIGlkPVwibGljZW5zZS1iYWRnZS1pY29uXCI+PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGlkPVwibGljZW5zZS1iYWRnZS10ZXh0XCI+PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cImxpY2Vuc2UtZGV0YWlsc1wiIHN0eWxlPVwiZm9udC1zaXplOiAwLjg1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBsaW5lLWhlaWdodDogMS42O1wiPjwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgaWQ9XCJsaWNlbnNlLWFjdGl2YXRlLXNlY3Rpb25cIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbC1ib2xkXCI+TGljZW5zZSBDb2RlOjwvbGFiZWw+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwibGljZW5zZS1jb2RlLWlucHV0XCIgcGxhY2Vob2xkZXI9XCJEQy1YWFhYWC1YWFhYWC1YWFhYWC1YWFhYWC1YWFhYWFwiXG4gICAgICAgICAgbWF4bGVuZ3RoPVwiMzVcIiBzcGVsbGNoZWNrPVwiZmFsc2VcIiBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7IHBhZGRpbmc6IDEwcHggMTJweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgZm9udC1zaXplOiAxcmVtOyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBsZXR0ZXItc3BhY2luZzogMXB4O1wiIC8+XG4gICAgICAgIDxwIGNsYXNzPVwidGlueS1oaW50XCI+RW50ZXIgeW91ciBsaWNlbnNlIGNvZGUgdG8gYWN0aXZhdGUgcHJlbWl1bSBmZWF0dXJlczwvcD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGlkPVwibGljZW5zZS1mZWF0dXJlc1wiIHN0eWxlPVwibWFyZ2luLXRvcDogMTZweDtcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbC1ib2xkXCIgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiA4cHg7IGRpc3BsYXk6IGJsb2NrO1wiPlByZW1pdW0gRmVhdHVyZXM6PC9sYWJlbD5cbiAgICAgICAgPGRpdiBpZD1cImxpY2Vuc2UtZmVhdHVyZS1saXN0XCIgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBnYXA6IDhweDtcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGlkPVwibGljZW5zZS1lcnJvclwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgbWFyZ2luLXRvcDogMTJweDsgcGFkZGluZzogMTBweDsgYm9yZGVyLXJhZGl1czogNHB4OyBiYWNrZ3JvdW5kOiByZ2JhKDIzMSw3Niw2MCwwLjE1KTsgY29sb3I6IHZhcigtLWJhZC1mZyk7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj48L2Rpdj5cbiAgICAgIDxkaXYgaWQ9XCJsaWNlbnNlLXN1Y2Nlc3NcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IG1hcmdpbi10b3A6IDEycHg7IHBhZGRpbmc6IDEwcHg7IGJvcmRlci1yYWRpdXM6IDRweDsgYmFja2dyb3VuZDogcmdiYSg0NiwyMDQsMTEzLDAuMTUpOyBjb2xvcjogdmFyKC0tb2stZmcpOyBmb250LXNpemU6IDAuODVyZW07XCI+PC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWJ1dHRvbnNcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDE2cHg7XCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJsaWNlbnNlLWNhbmNlbFwiPkNsb3NlPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gaWQ9XCJsaWNlbnNlLWRlYWN0aXZhdGVcIiBjbGFzcz1cImJ0bi1hY2NlbnRcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IGJhY2tncm91bmQ6IHZhcigtLWJhZC1iZyk7IGJvcmRlci1jb2xvcjogdmFyKC0tYmFkLWZnKTsgY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RGVhY3RpdmF0ZTwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwibGljZW5zZS1hY3RpdmF0ZVwiIGNsYXNzPVwiYnRuLWFjY2VudFwiPkFjdGl2YXRlPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YCk7XG5cbiAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGljZW5zZS1tb2RhbCcpO1xuICBjb25zdCBjb2RlSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGljZW5zZS1jb2RlLWlucHV0Jyk7XG4gIGNvbnN0IGFjdGl2YXRlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xpY2Vuc2UtYWN0aXZhdGUnKTtcbiAgY29uc3QgZGVhY3RpdmF0ZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsaWNlbnNlLWRlYWN0aXZhdGUnKTtcbiAgY29uc3QgZXJyb3JFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsaWNlbnNlLWVycm9yJyk7XG4gIGNvbnN0IHN1Y2Nlc3NFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsaWNlbnNlLXN1Y2Nlc3MnKTtcbiAgY29uc3QgYmFkZ2VJY29uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xpY2Vuc2UtYmFkZ2UtaWNvbicpO1xuICBjb25zdCBiYWRnZVRleHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGljZW5zZS1iYWRnZS10ZXh0Jyk7XG4gIGNvbnN0IGJhZGdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xpY2Vuc2UtYmFkZ2UnKTtcbiAgY29uc3QgZGV0YWlsc0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xpY2Vuc2UtZGV0YWlscycpO1xuICBjb25zdCBmZWF0dXJlTGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsaWNlbnNlLWZlYXR1cmUtbGlzdCcpO1xuICBjb25zdCBhY3RpdmF0ZVNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGljZW5zZS1hY3RpdmF0ZS1zZWN0aW9uJyk7XG5cbiAgbGV0IGN1cnJlbnRTdGF0dXMgPSBudWxsO1xuXG4gIGZ1bmN0aW9uIGhpZGVNZXNzYWdlcygpIHtcbiAgICBlcnJvckVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgc3VjY2Vzc0VsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIH1cblxuICBmdW5jdGlvbiBzaG93RXJyb3IobXNnKSB7XG4gICAgaGlkZU1lc3NhZ2VzKCk7XG4gICAgZXJyb3JFbC50ZXh0Q29udGVudCA9IG1zZztcbiAgICBlcnJvckVsLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICB9XG5cbiAgZnVuY3Rpb24gc2hvd1N1Y2Nlc3MobXNnKSB7XG4gICAgaGlkZU1lc3NhZ2VzKCk7XG4gICAgc3VjY2Vzc0VsLnRleHRDb250ZW50ID0gbXNnO1xuICAgIHN1Y2Nlc3NFbC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbmRlclN0YXR1cyhzdGF0dXMpIHtcbiAgICBjdXJyZW50U3RhdHVzID0gc3RhdHVzO1xuXG4gICAgaWYgKHN0YXR1cy5hY3RpdmUpIHtcbiAgICAgIGJhZGdlLnN0eWxlLmJhY2tncm91bmQgPSAncmdiYSg0NiwyMDQsMTEzLDAuMTUpJztcbiAgICAgIGJhZGdlLnN0eWxlLmNvbG9yID0gJ3ZhcigtLW9rLWZnKSc7XG4gICAgICBiYWRnZUljb24udGV4dENvbnRlbnQgPSAnXFx1MjYwNSc7XG4gICAgICBiYWRnZVRleHQudGV4dENvbnRlbnQgPSAnUHJlbWl1bSBBY3RpdmUnO1xuICAgICAgY29uc3QgZXhwaXJ5TGluZSA9IHN0YXR1cy5saWZldGltZVxuICAgICAgICA/ICc8ZGl2PkxpY2Vuc2U6IDxzdHJvbmc+TElGRVRJTUU8L3N0cm9uZz48L2Rpdj4nXG4gICAgICAgIDogYDxkaXY+RXhwaXJlczogPHN0cm9uZz4ke25ldyBEYXRlKHN0YXR1cy5leHBpcmVzQXQpLnRvTG9jYWxlRGF0ZVN0cmluZygpfTwvc3Ryb25nPiAoJHtzdGF0dXMuZGF5c1JlbWFpbmluZ30gZGF5cyByZW1haW5pbmcpPC9kaXY+YDtcbiAgICAgIGRldGFpbHNFbC5pbm5lckhUTUwgPSBgXG4gICAgICAgIDxkaXY+Q29kZTogPGNvZGUgc3R5bGU9XCJmb250LWZhbWlseTogbW9ub3NwYWNlO1wiPiR7c3RhdHVzLmNvZGUgfHwgJyoqKid9PC9jb2RlPjwvZGl2PlxuICAgICAgICAke2V4cGlyeUxpbmV9XG4gICAgICBgO1xuICAgICAgYWN0aXZhdGVTZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICBhY3RpdmF0ZUJ0bi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgZGVhY3RpdmF0ZUJ0bi5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJhZGdlLnN0eWxlLmJhY2tncm91bmQgPSAncmdiYSgxNDksMTY1LDE2NiwwLjE1KSc7XG4gICAgICBiYWRnZS5zdHlsZS5jb2xvciA9ICd2YXIoLS1tdXRlZCknO1xuICAgICAgYmFkZ2VJY29uLnRleHRDb250ZW50ID0gJ1xcdTI2MDYnO1xuICAgICAgYmFkZ2VUZXh0LnRleHRDb250ZW50ID0gc3RhdHVzLmV4cGlyZWQgPyAnTGljZW5zZSBFeHBpcmVkJyA6ICdGcmVlIFRpZXInO1xuICAgICAgZGV0YWlsc0VsLmlubmVySFRNTCA9IHN0YXR1cy5leHBpcmVkXG4gICAgICAgID8gJzxkaXY+WW91ciBsaWNlbnNlIGhhcyBleHBpcmVkLiBFbnRlciBhIG5ldyBjb2RlIHRvIHJlbmV3LjwvZGl2PidcbiAgICAgICAgOiAnPGRpdj5FbnRlciBhIGxpY2Vuc2UgY29kZSB0byB1bmxvY2sgcHJlbWl1bSBmZWF0dXJlcy48L2Rpdj4nO1xuICAgICAgYWN0aXZhdGVTZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgIGFjdGl2YXRlQnRuLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgIGRlYWN0aXZhdGVCdG4uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB9XG5cbiAgICAvLyBSZW5kZXIgZmVhdHVyZSBsaXN0XG4gICAgY29uc3QgZmVhdHVyZXMgPSBzdGF0dXMucHJlbWl1bUZlYXR1cmVzIHx8IHt9O1xuICAgIGNvbnN0IGFjdGl2ZUZlYXR1cmVzID0gbmV3IFNldChzdGF0dXMuZmVhdHVyZXMgfHwgW10pO1xuICAgIGZlYXR1cmVMaXN0LmlubmVySFRNTCA9IE9iamVjdC5lbnRyaWVzKGZlYXR1cmVzKS5tYXAoKFtrZXksIGluZm9dKSA9PiB7XG4gICAgICBjb25zdCBhY3RpdmUgPSBhY3RpdmVGZWF0dXJlcy5oYXMoa2V5KTtcbiAgICAgIHJldHVybiBgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogOHB4OyBwYWRkaW5nOiA4cHggMTJweDsgYm9yZGVyLXJhZGl1czogNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5cbiAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6IDEuMXJlbTtcIj4ke2FjdGl2ZSA/ICdcXHUyNzA1JyA6ICdcXHVEODNEXFx1REQxMid9PC9zcGFuPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDogNjAwOyBmb250LXNpemU6IDAuOXJlbTtcIj4ke2luZm8ubmFtZX08L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjc4cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPiR7aW5mby5kZXNjcmlwdGlvbn08L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5gO1xuICAgIH0pLmpvaW4oJycpO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZFN0YXR1cygpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2xpY2Vuc2Uvc3RhdHVzJyk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcC5qc29uKCk7XG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIHJlbmRlclN0YXR1cyhkYXRhLmxpY2Vuc2UpO1xuICAgICAgICB1cGRhdGVIZWFkZXJCYWRnZShkYXRhLmxpY2Vuc2UpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIGxvYWQgbGljZW5zZSBzdGF0dXM6JywgZS5tZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBhY3RpdmF0ZUxpY2Vuc2UoKSB7XG4gICAgY29uc3QgY29kZSA9IGNvZGVJbnB1dC52YWx1ZS50cmltKCk7XG4gICAgaWYgKCFjb2RlKSB7XG4gICAgICBzaG93RXJyb3IoJ1BsZWFzZSBlbnRlciBhIGxpY2Vuc2UgY29kZS4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBoaWRlTWVzc2FnZXMoKTtcbiAgICBhY3RpdmF0ZUJ0bi5kaXNhYmxlZCA9IHRydWU7XG4gICAgYWN0aXZhdGVCdG4udGV4dENvbnRlbnQgPSAnQWN0aXZhdGluZy4uLic7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2xpY2Vuc2UvYWN0aXZhdGUnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBjb2RlIH0pXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwLmpzb24oKTtcblxuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICBzaG93U3VjY2VzcyhkYXRhLm1lc3NhZ2UpO1xuICAgICAgICBjb2RlSW5wdXQudmFsdWUgPSAnJztcbiAgICAgICAgcmVuZGVyU3RhdHVzKGRhdGEubGljZW5zZSk7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oJ0xpY2Vuc2UgYWN0aXZhdGVkISBQcmVtaXVtIGZlYXR1cmVzIHVubG9ja2VkLicsICdzdWNjZXNzJywgNTAwMCk7XG4gICAgICAgIHVwZGF0ZUhlYWRlckJhZGdlKGRhdGEubGljZW5zZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaG93RXJyb3IoZGF0YS5lcnJvciB8fCAnQWN0aXZhdGlvbiBmYWlsZWQnKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzaG93RXJyb3IoJ05ldHdvcmsgZXJyb3I6ICcgKyBlLm1lc3NhZ2UpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhY3RpdmF0ZUJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgYWN0aXZhdGVCdG4udGV4dENvbnRlbnQgPSAnQWN0aXZhdGUnO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGRlYWN0aXZhdGVMaWNlbnNlKCkge1xuICAgIGlmICghY29uZmlybSgnRGVhY3RpdmF0ZSB5b3VyIGxpY2Vuc2U/IFlvdSBjYW4gcmV1c2UgdGhlIGNvZGUgb24gYW5vdGhlciBtYWNoaW5lLicpKSByZXR1cm47XG5cbiAgICBkZWFjdGl2YXRlQnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgICBkZWFjdGl2YXRlQnRuLnRleHRDb250ZW50ID0gJ0RlYWN0aXZhdGluZy4uLic7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2xpY2Vuc2UvZGVhY3RpdmF0ZScsIHsgbWV0aG9kOiAnUE9TVCcgfSk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcC5qc29uKCk7XG5cbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgc2hvd1N1Y2Nlc3MoZGF0YS5tZXNzYWdlKTtcbiAgICAgICAgYXdhaXQgbG9hZFN0YXR1cygpO1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdMaWNlbnNlIGRlYWN0aXZhdGVkLicsICdpbmZvJywgMzAwMCk7XG4gICAgICAgIHVwZGF0ZUhlYWRlckJhZGdlKHsgYWN0aXZlOiBmYWxzZSB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNob3dFcnJvcihkYXRhLmVycm9yIHx8ICdEZWFjdGl2YXRpb24gZmFpbGVkJyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2hvd0Vycm9yKCdOZXR3b3JrIGVycm9yOiAnICsgZS5tZXNzYWdlKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgZGVhY3RpdmF0ZUJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgZGVhY3RpdmF0ZUJ0bi50ZXh0Q29udGVudCA9ICdEZWFjdGl2YXRlJztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVIZWFkZXJCYWRnZShzdGF0dXMpIHtcbiAgICBjb25zdCB0b3BiYXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGljZW5zZS1zdGF0dXMtdG9wYmFyJyk7XG4gICAgY29uc3QgaWNvbkVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xpY2Vuc2UtdG9wYmFyLWljb24nKTtcbiAgICBjb25zdCB0ZXh0RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGljZW5zZS10b3BiYXItdGV4dCcpO1xuICAgIGNvbnN0IHRpbWVFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsaWNlbnNlLXRvcGJhci10aW1lJyk7XG4gICAgaWYgKCF0b3BiYXIpIHJldHVybjtcblxuICAgIHRvcGJhci5jbGFzc05hbWUgPSAnbGljZW5zZS1zdGF0dXMtdG9wYmFyICcgKyAoc3RhdHVzLmFjdGl2ZSA/ICdwcmVtaXVtJyA6ICdmcmVlJyk7XG5cbiAgICBpZiAoc3RhdHVzLmFjdGl2ZSkge1xuICAgICAgaWNvbkVsLnRleHRDb250ZW50ID0gJ1xcdTI2MDUnO1xuICAgICAgdGV4dEVsLnRleHRDb250ZW50ID0gJ1BSRU1JVU0nO1xuICAgICAgaWYgKHN0YXR1cy5saWZldGltZSkge1xuICAgICAgICB0aW1lRWwudGV4dENvbnRlbnQgPSAnXFx1MDBiNyBMSUZFVElNRSc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBkYXlzID0gc3RhdHVzLmRheXNSZW1haW5pbmc7XG4gICAgICAgIHRpbWVFbC50ZXh0Q29udGVudCA9IGRheXMgIT0gbnVsbCA/ICdcXHUwMGI3ICcgKyBkYXlzICsgJ2QgcmVtYWluaW5nJyA6ICcnO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpY29uRWwudGV4dENvbnRlbnQgPSAnXFx1MjYwNic7XG4gICAgICB0ZXh0RWwudGV4dENvbnRlbnQgPSBzdGF0dXMuZXhwaXJlZCA/ICdFWFBJUkVEJyA6ICdGUkVFIFRJRVInO1xuICAgICAgdGltZUVsLnRleHRDb250ZW50ID0gJyc7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gb3BlbkxpY2Vuc2VNb2RhbCgpIHtcbiAgICBoaWRlTWVzc2FnZXMoKTtcbiAgICBsb2FkU3RhdHVzKCk7XG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICB9XG5cbiAgLy8gRm9ybWF0IGNvZGUgaW5wdXQgYXMgdXNlciB0eXBlcyAoYXV0by1hZGQgZGFzaGVzKVxuICBjb2RlSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBmdW5jdGlvbigpIHtcbiAgICBsZXQgdmFsID0gdGhpcy52YWx1ZS50b1VwcGVyQ2FzZSgpLnJlcGxhY2UoL1teQS1aMC05LV0vZywgJycpO1xuICAgIC8vIERvbid0IGF1dG8tZm9ybWF0IGlmIHVzZXIgaXMgZGVsZXRpbmdcbiAgICBpZiAodmFsLmxlbmd0aCA+IHRoaXMuX3ByZXZMZW5ndGgpIHtcbiAgICAgIHZhbCA9IHZhbC5yZXBsYWNlKC8tL2csICcnKTtcbiAgICAgIGlmICh2YWwubGVuZ3RoID4gMiAmJiAhdmFsLnN0YXJ0c1dpdGgoJ0RDJykpIHtcbiAgICAgICAgdmFsID0gJ0RDJyArIHZhbDtcbiAgICAgIH1cbiAgICAgIC8vIEFkZCBkYXNoZXMgYWZ0ZXIgREMgYW5kIGV2ZXJ5IDUgY2hhcnNcbiAgICAgIGlmICh2YWwuc3RhcnRzV2l0aCgnREMnKSAmJiB2YWwubGVuZ3RoID4gMikge1xuICAgICAgICBjb25zdCBwYXJ0cyA9IFsnREMnXTtcbiAgICAgICAgY29uc3QgcmVzdCA9IHZhbC5zdWJzdHJpbmcoMik7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzdC5sZW5ndGg7IGkgKz0gNSkge1xuICAgICAgICAgIHBhcnRzLnB1c2gocmVzdC5zdWJzdHJpbmcoaSwgaSArIDUpKTtcbiAgICAgICAgfVxuICAgICAgICB2YWwgPSBwYXJ0cy5qb2luKCctJyk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX3ByZXZMZW5ndGggPSB2YWwubGVuZ3RoO1xuICAgIHRoaXMudmFsdWUgPSB2YWw7XG4gIH0pO1xuXG4gIC8vIFdpcmUgdXAgZXZlbnRzXG4gIGFjdGl2YXRlQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYWN0aXZhdGVMaWNlbnNlKTtcbiAgZGVhY3RpdmF0ZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGRlYWN0aXZhdGVMaWNlbnNlKTtcbiAgY29kZUlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4ge1xuICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJykgYWN0aXZhdGVMaWNlbnNlKCk7XG4gIH0pO1xuICB3aXJlTW9kYWwobW9kYWwsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsaWNlbnNlLWNhbmNlbCcpKTtcbiAgY29uc3QgdG9wYmFyRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGljZW5zZS1zdGF0dXMtdG9wYmFyJyk7XG4gIGlmICh0b3BiYXJFbCkgdG9wYmFyRWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB3aW5kb3cub3BlbkxpY2Vuc2VNb2RhbCAmJiB3aW5kb3cub3BlbkxpY2Vuc2VNb2RhbCgpKTtcblxuICAvLyBFeHBvc2UgZm9yIG90aGVyIG1vZHVsZXMgdG8gb3BlblxuICB3aW5kb3cub3BlbkxpY2Vuc2VNb2RhbCA9IG9wZW5MaWNlbnNlTW9kYWw7XG5cbiAgLy8gRXhwb3NlIGZlYXR1cmUgY2hlY2sgZm9yIGZyb250ZW5kIGdhdGluZ1xuICB3aW5kb3cuY2hlY2tQcmVtaXVtRmVhdHVyZSA9IGFzeW5jIGZ1bmN0aW9uKGZlYXR1cmUpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKGAvYXBpL3YxL2xpY2Vuc2UvZmVhdHVyZS8ke2ZlYXR1cmV9YCk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcC5qc29uKCk7XG4gICAgICByZXR1cm4gZGF0YS5hdmFpbGFibGU7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9O1xuXG4gIC8vIExvYWQgc3RhdHVzIG9uIHBhZ2UgbG9hZFxuICBsb2FkU3RhdHVzKCkudGhlbihzdGF0dXMgPT4ge1xuICAgIGlmIChjdXJyZW50U3RhdHVzKSB1cGRhdGVIZWFkZXJCYWRnZShjdXJyZW50U3RhdHVzKTtcbiAgfSk7XG59KSgpO1xuO1xuLy8gU2hhcmUgTW9kYWwgXHUyMDE0IERDLTA1OFxuLy9cbi8vIEFkbWluIFVJIGZvciBEQy0wNTMgc2hhcmUgcm91dGVzLiBPcGVuZWQgZnJvbSB0aGUgXCJTaGFyZVwiIGJ1dHRvbiBvbiBlYWNoXG4vLyBzZXJ2aWNlIGNhcmQgKGFkZGVkIGluIGNvcmUvZ3JpZC5qcyBuZXh0IHRvIHRoZSBleGlzdGluZyBvcHRpb25zL2RlbGV0ZVxuLy8gYnV0dG9ucykuIFR3byB0YWJzOlxuLy8gICAtIFB1YmxpYyBsaW5rOiBwaWNrIGEgVFRMICgxaC8yNGgvN2QpLCBQT1NUIC9hcGkvdjEvc2hhcmUsIHJlbmRlciB0aGVcbi8vICAgICByZXR1cm5lZCB1cmxQYXRoIHdpdGggYSBjb3B5IGJ1dHRvbiArIHJldm9rZSBjb250cm9sLlxuLy8gICAtIFRhaWxzY2FsZSBpbnZpdGU6IGVudGVyIGFuIGVtYWlsLCBQT1NUIC9hcGkvdjEvc2hhcmUvdGFpbHNjYWxlLCByZW5kZXJcbi8vICAgICBkZWxpdmVyZWQgc3RhdHVzIChpbmJveCB2cyBkZXYtY29uc29sZSBmYWxsYmFjayB2cyBVUkwgZmFsbGJhY2spLlxuLy9cbi8vIE1vZGFsIGFsc28gbGlzdHMgb3V0c3RhbmRpbmcgc2hhcmVzIGZvciB0aGUgc2VsZWN0ZWQgc2VydmljZSAoR0VUIC9hcGkvdjEvc2hhcmUpXG4vLyB3aXRoIHJldm9rZSBidXR0b25zLiBUaGUgbGlzdCByZWZyZXNoZXMgYWZ0ZXIgZXZlcnkgaXNzdWUvcmV2b2tlLlxuLy9cbi8vIEJvdGggaXNzdWUgZW5kcG9pbnRzIGFyZSBQcm8tZ2F0ZWQgb24gdGhlIHNlcnZlciBcdTIwMTQgdGhlIG1vZGFsIHN1cmZhY2VzIGEgNDAyXG4vLyBhcyBhbiB1cGdyYWRlIHByb21wdCAoXCJTaGFyZSBpcyBhIFBybyBmZWF0dXJlLiBBY3RpdmF0ZSBhIGxpY2Vuc2UgdG8gdW5sb2NrLlwiKS5cbi8vIFRhaWxzY2FsZSBpbnZpdGVzIGFkZGl0aW9uYWxseSByZXF1aXJlIHRhaWxzY2FsZUNvb3JkIGNvbmZpZ3VyZWQgb24gdGhlIGhvc3Q7XG4vLyB0aGUgc2VydmVyIHJldHVybnMgNDAwIHdpdGggYSBjbGVhciBtZXNzYWdlIHdoZW4gbWlzc2luZy5cblxuKGZ1bmN0aW9uKCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgaWYgKHdpbmRvdy5fX2RjXzA1OF9zaGFyZV9tb2RhbF9sb2FkZWQpIHJldHVybjtcbiAgd2luZG93Ll9fZGNfMDU4X3NoYXJlX21vZGFsX2xvYWRlZCA9IHRydWU7XG5cbiAgY29uc3QgVFRMX09QVElPTlMgPSBbXG4gICAgeyBtczogNjAgKiA2MCAqIDEwMDAsIGxhYmVsOiAnMSBob3VyJyB9LFxuICAgIHsgbXM6IDI0ICogNjAgKiA2MCAqIDEwMDAsIGxhYmVsOiAnMjQgaG91cnMnIH0sXG4gICAgeyBtczogNyAqIDI0ICogNjAgKiA2MCAqIDEwMDAsIGxhYmVsOiAnNyBkYXlzJyB9LFxuICBdO1xuXG4gIGluamVjdE1vZGFsKCdzaGFyZS1tb2RhbCcsIGBcbiAgICA8ZGl2IGlkPVwic2hhcmUtbW9kYWxcIiBjbGFzcz1cIndlYXRoZXItbW9kYWxcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1sYWJlbGxlZGJ5PVwic2hhcmUtbW9kYWwtdGl0bGVcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogNDYwcHg7IG1heC13aWR0aDogNTgwcHg7XCI+XG4gICAgICAgIDxoMyBpZD1cInNoYXJlLW1vZGFsLXRpdGxlXCI+U2hhcmUgPHNwYW4gaWQ9XCJzaGFyZS1tb2RhbC1zZXJ2aWNlLW5hbWVcIj5cdTIwMjY8L3NwYW4+PC9oMz5cbiAgICAgICAgPHAgc3R5bGU9XCJmb250LXNpemU6IDAuODVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbjogMCAwIDE2cHg7XCI+XG4gICAgICAgICAgQ3JlYXRlIGEgcHVibGljIGxpbmsgb3IgVGFpbHNjYWxlIGludml0ZSBzbyBzb21lb25lIG91dHNpZGUgeW91ciBuZXR3b3JrIGNhbiBhY2Nlc3MgdGhpcyBzZXJ2aWNlLlxuICAgICAgICA8L3A+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNoYXJlLXRhYnNcIiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogNHB4OyBtYXJnaW4tYm90dG9tOiAxNnB4OyBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2hhcmUtdGFiIGFjdGl2ZVwiIGRhdGEtdGFiPVwicHVibGljXCIgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6IHRyYW5zcGFyZW50OyBib3JkZXI6IDA7IGJvcmRlci1ib3R0b206IDJweCBzb2xpZCB2YXIoLS1hY2NlbnQpOyBwYWRkaW5nOiA4cHggMTRweDsgY29sb3I6IHZhcigtLWZnKTsgZm9udC13ZWlnaHQ6IDYwMDsgY3Vyc29yOiBwb2ludGVyO1wiPlxuICAgICAgICAgICAgUHVibGljIGxpbmtcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2hhcmUtdGFiXCIgZGF0YS10YWI9XCJ0YWlsc2NhbGVcIiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7IGJvcmRlcjogMDsgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIHRyYW5zcGFyZW50OyBwYWRkaW5nOiA4cHggMTRweDsgY29sb3I6IHZhcigtLW11dGVkKTsgY3Vyc29yOiBwb2ludGVyO1wiPlxuICAgICAgICAgICAgVGFpbHNjYWxlIGludml0ZVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwic2hhcmUtdGFiLXBhbmVsXCIgZGF0YS1wYW5lbD1cInB1YmxpY1wiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwtYm9sZFwiIGZvcj1cInNoYXJlLXB1YmxpYy10dGxcIj5MaW5rIGR1cmF0aW9uOjwvbGFiZWw+XG4gICAgICAgICAgPHNlbGVjdCBpZD1cInNoYXJlLXB1YmxpYy10dGxcIiBzdHlsZT1cIndpZHRoOiAxMDAlOyBwYWRkaW5nOiA4cHggMTBweDsgbWFyZ2luOiA2cHggMCAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1pbnB1dC1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDRweDtcIj5cbiAgICAgICAgICAgICR7VFRMX09QVElPTlMubWFwKG8gPT4gYDxvcHRpb24gdmFsdWU9XCIke28ubXN9XCI+JHtvLmxhYmVsfTwvb3B0aW9uPmApLmpvaW4oJycpfVxuICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJzaGFyZS1wdWJsaWMtY3JlYXRlXCIgY2xhc3M9XCJidG4tYWNjZW50XCIgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBzdHlsZT1cIndpZHRoOiAxMDAlOyBwYWRkaW5nOiAxMHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1hY2NlbnQpOyBjb2xvcjogIzA0MTQxZjsgYm9yZGVyOiAwOyBib3JkZXItcmFkaXVzOiA0cHg7IGZvbnQtd2VpZ2h0OiA2MDA7IGN1cnNvcjogcG9pbnRlcjtcIj5cbiAgICAgICAgICAgIENyZWF0ZSBzaGFyZSBsaW5rXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzaGFyZS10YWItcGFuZWxcIiBkYXRhLXBhbmVsPVwidGFpbHNjYWxlXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwtYm9sZFwiIGZvcj1cInNoYXJlLXRzLWVtYWlsXCI+UmVjaXBpZW50IGVtYWlsOjwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0IGlkPVwic2hhcmUtdHMtZW1haWxcIiB0eXBlPVwiZW1haWxcIiBwbGFjZWhvbGRlcj1cImFsaWNlQGV4YW1wbGUuY29tXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7IHBhZGRpbmc6IDEwcHggMTJweDsgbWFyZ2luOiA2cHggMCAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNHB4OyBmb250LXNpemU6IDAuOTVyZW07XCIgLz5cbiAgICAgICAgICA8cCBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW46IDAgMCAxMnB4O1wiPlxuICAgICAgICAgICAgQSBzaW5nbGUtdXNlIFRhaWxzY2FsZSBwcmUtYXV0aCBrZXkgaXMgZ2VuZXJhdGVkIGFuZCBlbWFpbGVkLiBUaGUgZGV2aWNlIGpvaW5zIHlvdXIgdGFpbG5ldCBhbmQgaXMgcm91dGVkIHRvIHRoaXMgc2VydmljZSB2aWEgQ2FkZHkuXG4gICAgICAgICAgPC9wPlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJzaGFyZS10cy1jcmVhdGVcIiBjbGFzcz1cImJ0bi1hY2NlbnRcIiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7IHBhZGRpbmc6IDEwcHg7IGJhY2tncm91bmQ6IHZhcigtLWFjY2VudCk7IGNvbG9yOiAjMDQxNDFmOyBib3JkZXI6IDA7IGJvcmRlci1yYWRpdXM6IDRweDsgZm9udC13ZWlnaHQ6IDYwMDsgY3Vyc29yOiBwb2ludGVyO1wiPlxuICAgICAgICAgICAgQ3JlYXRlIFRhaWxzY2FsZSBpbnZpdGVcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBpZD1cInNoYXJlLWlzc3VlZFwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgbWFyZ2luLXRvcDogMTZweDsgcGFkZGluZzogMTJweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iZyk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDZweDtcIj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi1ib3R0b206IDZweDtcIj5TaGFyZSBsaW5rOjwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDZweDsgYWxpZ24taXRlbXM6IGNlbnRlcjtcIj5cbiAgICAgICAgICAgIDxpbnB1dCBpZD1cInNoYXJlLWlzc3VlZC11cmxcIiB0eXBlPVwidGV4dFwiIHJlYWRvbmx5XG4gICAgICAgICAgICAgIHN0eWxlPVwiZmxleDogMTsgcGFkZGluZzogOHB4IDEwcHg7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNHB4OyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBmb250LXNpemU6IDAuODVyZW07XCIgLz5cbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJzaGFyZS1pc3N1ZWQtY29weVwiIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBzdHlsZT1cInBhZGRpbmc6IDhweCAxNHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1hY2NlbnQpOyBjb2xvcjogIzA0MTQxZjsgYm9yZGVyOiAwOyBib3JkZXItcmFkaXVzOiA0cHg7IGZvbnQtd2VpZ2h0OiA2MDA7IGN1cnNvcjogcG9pbnRlcjtcIj5cbiAgICAgICAgICAgICAgQ29weVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBpZD1cInNoYXJlLWlzc3VlZC1tZXRhXCIgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLXRvcDogOHB4O1wiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGlkPVwic2hhcmUtZXJyb3JcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IG1hcmdpbi10b3A6IDEycHg7IHBhZGRpbmc6IDEwcHg7IGJvcmRlci1yYWRpdXM6IDRweDsgYmFja2dyb3VuZDogcmdiYSgyMzEsNzYsNjAsMC4xNSk7IGNvbG9yOiB2YXIoLS1iYWQtZmcpOyBmb250LXNpemU6IDAuODVyZW07XCI+PC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJzaGFyZS1zdWNjZXNzXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBtYXJnaW4tdG9wOiAxMnB4OyBwYWRkaW5nOiAxMHB4OyBib3JkZXItcmFkaXVzOiA0cHg7IGJhY2tncm91bmQ6IHJnYmEoNDYsMjA0LDExMywwLjE1KTsgY29sb3I6IHZhcigtLW9rLWZnKTsgZm9udC1zaXplOiAwLjg1cmVtO1wiPjwvZGl2PlxuXG4gICAgICAgIDxkaXYgaWQ9XCJzaGFyZS1vdXRzdGFuZGluZ1wiIHN0eWxlPVwibWFyZ2luLXRvcDogMTZweDtcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsLWJvbGRcIj5PdXRzdGFuZGluZyBzaGFyZXMgZm9yIHRoaXMgc2VydmljZTwvbGFiZWw+XG4gICAgICAgICAgPGRpdiBpZD1cInNoYXJlLW91dHN0YW5kaW5nLWxpc3RcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDZweDsgZm9udC1zaXplOiAwLjg1cmVtO1wiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAxOHB4O1wiPlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJzaGFyZS1jYW5jZWxcIiB0eXBlPVwiYnV0dG9uXCI+Q2xvc2U8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYCk7XG5cbiAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2hhcmUtbW9kYWwnKTtcbiAgY29uc3Qgc2VydmljZU5hbWVFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzaGFyZS1tb2RhbC1zZXJ2aWNlLW5hbWUnKTtcbiAgY29uc3QgaXNzdWVkRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2hhcmUtaXNzdWVkJyk7XG4gIGNvbnN0IGlzc3VlZFVybElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NoYXJlLWlzc3VlZC11cmwnKTtcbiAgY29uc3QgaXNzdWVkQ29weUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzaGFyZS1pc3N1ZWQtY29weScpO1xuICBjb25zdCBpc3N1ZWRNZXRhRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2hhcmUtaXNzdWVkLW1ldGEnKTtcbiAgY29uc3QgZXJyb3JFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzaGFyZS1lcnJvcicpO1xuICBjb25zdCBzdWNjZXNzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2hhcmUtc3VjY2VzcycpO1xuICBjb25zdCBvdXRzdGFuZGluZ0xpc3RFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzaGFyZS1vdXRzdGFuZGluZy1saXN0Jyk7XG4gIGNvbnN0IGNhbmNlbEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzaGFyZS1jYW5jZWwnKTtcbiAgY29uc3QgcHVibGljQ3JlYXRlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NoYXJlLXB1YmxpYy1jcmVhdGUnKTtcbiAgY29uc3QgdHNDcmVhdGVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2hhcmUtdHMtY3JlYXRlJyk7XG4gIGNvbnN0IHRzRW1haWxJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzaGFyZS10cy1lbWFpbCcpO1xuICBjb25zdCBwdWJsaWNUdGxTZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2hhcmUtcHVibGljLXR0bCcpO1xuXG4gIGxldCBjdXJyZW50U2VydmljZSA9IG51bGw7IC8vIHsgaWQsIG5hbWUgfVxuICBsZXQgYWN0aXZlVGFiID0gJ3B1YmxpYyc7XG5cbiAgZnVuY3Rpb24gaGlkZU1lc3NhZ2VzKCkge1xuICAgIGVycm9yRWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBzdWNjZXNzRWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBpc3N1ZWRFbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICB9XG5cbiAgZnVuY3Rpb24gc2hvd0Vycm9yKG1zZykge1xuICAgIHN1Y2Nlc3NFbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIGlzc3VlZEVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgZXJyb3JFbC50ZXh0Q29udGVudCA9IG1zZztcbiAgICBlcnJvckVsLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICB9XG5cbiAgZnVuY3Rpb24gc2hvd1N1Y2Nlc3MobXNnKSB7XG4gICAgZXJyb3JFbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIHN1Y2Nlc3NFbC50ZXh0Q29udGVudCA9IG1zZztcbiAgICBzdWNjZXNzRWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gIH1cblxuICBmdW5jdGlvbiBfb3JpZ2luRnJvbVBhZ2UoKSB7XG4gICAgLy8gQnVpbGQgdGhlIGFic29sdXRlIHNoYXJlIFVSTCBmcm9tIHRoZSBwYWdlJ3MgY3VycmVudCBvcmlnaW4gc28gdGhlXG4gICAgLy8gbGluayBpcyBjb3JyZWN0IHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgdXNlciBpcyBvbiBodHRwOi8vbG9jYWxob3N0XG4gICAgLy8gKGRldikgb3IgaHR0cHM6Ly9zdGF0dXMuc2FtaSAocHJvZCkuIFRoZSB1cmxQYXRoIHJldHVybmVkIGJ5IHRoZSBBUElcbiAgICAvLyBpcyBhIHBhdGgtb25seSBzdHJpbmcgc3RhcnRpbmcgd2l0aCAvc2hhcmUvLlxuICAgIHJldHVybiB3aW5kb3cubG9jYXRpb24ub3JpZ2luO1xuICB9XG5cbiAgZnVuY3Rpb24gX2Fic1VybCh1cmxQYXRoKSB7XG4gICAgaWYgKHVybFBhdGguc3RhcnRzV2l0aCgnaHR0cCcpKSByZXR1cm4gdXJsUGF0aDtcbiAgICByZXR1cm4gX29yaWdpbkZyb21QYWdlKCkgKyB1cmxQYXRoO1xuICB9XG5cbiAgZnVuY3Rpb24gX2Zvcm1hdEV4cGlyeShpc28pIHtcbiAgICBpZiAoIWlzbykgcmV0dXJuICcnO1xuICAgIGNvbnN0IGQgPSBuZXcgRGF0ZShpc28pO1xuICAgIGlmIChOdW1iZXIuaXNOYU4oZC5nZXRUaW1lKCkpKSByZXR1cm4gJyc7XG4gICAgcmV0dXJuIGQudG9Mb2NhbGVTdHJpbmcoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIF9mb3JtYXRSZW1haW5pbmcobXMpIHtcbiAgICBpZiAobXMgPD0gMCkgcmV0dXJuICdleHBpcmVkJztcbiAgICBjb25zdCBoID0gTWF0aC5mbG9vcihtcyAvIDM2MDAwMDApO1xuICAgIGlmIChoID49IDI0KSByZXR1cm4gYCR7TWF0aC5mbG9vcihoIC8gMjQpfWQgJHtoICUgMjR9aCBsZWZ0YDtcbiAgICBjb25zdCBtID0gTWF0aC5mbG9vcigobXMgJSAzNjAwMDAwKSAvIDYwMDAwKTtcbiAgICByZXR1cm4gYCR7aH1oICR7bX1tIGxlZnRgO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0QWN0aXZlVGFiKG5hbWUpIHtcbiAgICBhY3RpdmVUYWIgPSBuYW1lO1xuICAgIGhpZGVNZXNzYWdlcygpO1xuICAgIG1vZGFsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5zaGFyZS10YWInKS5mb3JFYWNoKGJ0biA9PiB7XG4gICAgICBjb25zdCBpc0FjdGl2ZSA9IGJ0bi5kYXRhc2V0LnRhYiA9PT0gbmFtZTtcbiAgICAgIGJ0bi5jbGFzc0xpc3QudG9nZ2xlKCdhY3RpdmUnLCBpc0FjdGl2ZSk7XG4gICAgICBidG4uc3R5bGUuYm9yZGVyQm90dG9tQ29sb3IgPSBpc0FjdGl2ZSA/ICd2YXIoLS1hY2NlbnQpJyA6ICd0cmFuc3BhcmVudCc7XG4gICAgICBidG4uc3R5bGUuY29sb3IgPSBpc0FjdGl2ZSA/ICd2YXIoLS1mZyknIDogJ3ZhcigtLW11dGVkKSc7XG4gICAgICBidG4uc3R5bGUuZm9udFdlaWdodCA9IGlzQWN0aXZlID8gJzYwMCcgOiAnNDAwJztcbiAgICB9KTtcbiAgICBtb2RhbC5xdWVyeVNlbGVjdG9yQWxsKCcuc2hhcmUtdGFiLXBhbmVsJykuZm9yRWFjaChwID0+IHtcbiAgICAgIHAuc3R5bGUuZGlzcGxheSA9IHAuZGF0YXNldC5wYW5lbCA9PT0gbmFtZSA/ICcnIDogJ25vbmUnO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZE91dHN0YW5kaW5nKCkge1xuICAgIG91dHN0YW5kaW5nTGlzdEVsLmlubmVySFRNTCA9ICc8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+TG9hZGluZ1x1MjAyNjwvc3Bhbj4nO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvc2hhcmUnLCB7IGNyZWRlbnRpYWxzOiAnc2FtZS1vcmlnaW4nIH0pO1xuICAgICAgaWYgKCFyZXNwLm9rKSB7XG4gICAgICAgIG91dHN0YW5kaW5nTGlzdEVsLmlubmVySFRNTCA9ICc8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+Tm8gc2hhcmVzIGxpc3RlZC48L3NwYW4+JztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgYm9keSA9IGF3YWl0IHJlc3AuanNvbigpO1xuICAgICAgY29uc3QgbGlzdCA9IChib2R5ICYmIGJvZHkuZGF0YSkgfHwgW107XG4gICAgICBjb25zdCBmaWx0ZXJlZCA9IGxpc3QuZmlsdGVyKHMgPT4gcy5zZXJ2aWNlSWQgPT09IGN1cnJlbnRTZXJ2aWNlLmlkKTtcbiAgICAgIGlmIChmaWx0ZXJlZC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgb3V0c3RhbmRpbmdMaXN0RWwuaW5uZXJIVE1MID0gJzxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj5ObyBvdXRzdGFuZGluZyBzaGFyZXMgZm9yIHRoaXMgc2VydmljZS48L3NwYW4+JztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgb3V0c3RhbmRpbmdMaXN0RWwuaW5uZXJIVE1MID0gZmlsdGVyZWQubWFwKHMgPT4ge1xuICAgICAgICBjb25zdCByZW1haW5pbmcgPSBzLmV4cGlyZXNBdCA/IF9mb3JtYXRSZW1haW5pbmcobmV3IERhdGUocy5leHBpcmVzQXQpLmdldFRpbWUoKSAtIERhdGUubm93KCkpIDogJyc7XG4gICAgICAgIHJldHVybiBgXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNoYXJlLXJvd1wiIGRhdGEtc2hhcmUtaWQ9XCIke2VzY2FwZUh0bWwocy5pZCl9XCJcbiAgICAgICAgICAgIHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA4cHg7IHBhZGRpbmc6IDZweCAwOyBib3JkZXItYm90dG9tOiAxcHggZGFzaGVkIHZhcigtLWJvcmRlcik7XCI+XG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cImZsZXg6IDE7XCI+XG4gICAgICAgICAgICAgIDxzdHJvbmc+JHtzLmtpbmQgPT09ICd0YWlsc2NhbGUnID8gJ1RhaWxzY2FsZScgOiAnUHVibGljJ308L3N0cm9uZz5cbiAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPiBcdTAwQjcgZXhwaXJlcyAke2VzY2FwZUh0bWwoX2Zvcm1hdEV4cGlyeShzLmV4cGlyZXNBdCkpfSAoJHtyZW1haW5pbmd9KTwvc3Bhbj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaGFyZS1yZXZva2VcIiBkYXRhLXNoYXJlLWlkPVwiJHtlc2NhcGVIdG1sKHMuaWQpfVwiIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBzdHlsZT1cInBhZGRpbmc6IDRweCAxMHB4OyBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsgY29sb3I6IHZhcigtLWJhZC1mZyk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJhZC1mZyk7IGJvcmRlci1yYWRpdXM6IDRweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXNpemU6IDAuOHJlbTtcIj5cbiAgICAgICAgICAgICAgUmV2b2tlXG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgYDtcbiAgICAgIH0pLmpvaW4oJycpO1xuICAgICAgb3V0c3RhbmRpbmdMaXN0RWwucXVlcnlTZWxlY3RvckFsbCgnLnNoYXJlLXJldm9rZScpLmZvckVhY2goYnRuID0+IHtcbiAgICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gcmV2b2tlU2hhcmUoYnRuLmRhdGFzZXQuc2hhcmVJZCkpO1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgb3V0c3RhbmRpbmdMaXN0RWwuaW5uZXJIVE1MID0gJzxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj5Db3VsZCBub3QgbG9hZCBvdXRzdGFuZGluZyBzaGFyZXMuPC9zcGFuPic7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gcmV2b2tlU2hhcmUoaWQpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKGAvYXBpL3YxL3NoYXJlLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGlkKX1gLCB7XG4gICAgICAgIG1ldGhvZDogJ0RFTEVURScsXG4gICAgICAgIGNyZWRlbnRpYWxzOiAnc2FtZS1vcmlnaW4nLFxuICAgICAgfSk7XG4gICAgICBpZiAoIXJlc3Aub2spIHtcbiAgICAgICAgY29uc3QgYm9keSA9IGF3YWl0IHJlc3AuanNvbigpLmNhdGNoKCgpID0+ICh7fSkpO1xuICAgICAgICBzaG93RXJyb3IoYm9keSAmJiBib2R5LmVycm9yIHx8IGBSZXZva2UgZmFpbGVkIChIVFRQICR7cmVzcC5zdGF0dXN9KS5gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgc2hvd1N1Y2Nlc3MoJ1NoYXJlIHJldm9rZWQuJyk7XG4gICAgICBsb2FkT3V0c3RhbmRpbmcoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzaG93RXJyb3IoJ05ldHdvcmsgZXJyb3Igd2hpbGUgcmV2b2tpbmcuJyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gaXNzdWVQdWJsaWMoKSB7XG4gICAgaWYgKCFjdXJyZW50U2VydmljZSkgcmV0dXJuO1xuICAgIGhpZGVNZXNzYWdlcygpO1xuICAgIHB1YmxpY0NyZWF0ZUJ0bi5kaXNhYmxlZCA9IHRydWU7XG4gICAgY29uc3Qgb3JpZ2luYWwgPSBwdWJsaWNDcmVhdGVCdG4udGV4dENvbnRlbnQ7XG4gICAgcHVibGljQ3JlYXRlQnRuLnRleHRDb250ZW50ID0gJ0NyZWF0aW5nXHUyMDI2JztcbiAgICB0cnkge1xuICAgICAgY29uc3QgdHRsTXMgPSBwYXJzZUludChwdWJsaWNUdGxTZWxlY3QudmFsdWUsIDEwKTtcbiAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9zaGFyZScsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGNyZWRlbnRpYWxzOiAnc2FtZS1vcmlnaW4nLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBzZXJ2aWNlSWQ6IGN1cnJlbnRTZXJ2aWNlLmlkLCB0dGxNcyB9KSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgYm9keSA9IGF3YWl0IHJlc3AuanNvbigpLmNhdGNoKCgpID0+ICh7fSkpO1xuICAgICAgaWYgKCFyZXNwLm9rIHx8ICFib2R5LnN1Y2Nlc3MpIHtcbiAgICAgICAgX3JlbmRlckFwaUVycm9yKHJlc3Auc3RhdHVzLCBib2R5KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgdXJsUGF0aCA9IGJvZHkuZGF0YS51cmxQYXRoO1xuICAgICAgaXNzdWVkVXJsSW5wdXQudmFsdWUgPSBfYWJzVXJsKHVybFBhdGgpO1xuICAgICAgaXNzdWVkTWV0YUVsLnRleHRDb250ZW50ID0gYFB1YmxpYyBsaW5rIFx1MDBCNyBleHBpcmVzICR7X2Zvcm1hdEV4cGlyeShib2R5LmRhdGEuZXhwaXJlc0F0KX1gO1xuICAgICAgaXNzdWVkRWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICBzaG93U3VjY2VzcygnU2hhcmUgbGluayBjcmVhdGVkLicpO1xuICAgICAgbG9hZE91dHN0YW5kaW5nKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2hvd0Vycm9yKCdOZXR3b3JrIGVycm9yIHdoaWxlIGNyZWF0aW5nIHNoYXJlLicpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBwdWJsaWNDcmVhdGVCdG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIHB1YmxpY0NyZWF0ZUJ0bi50ZXh0Q29udGVudCA9IG9yaWdpbmFsO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGlzc3VlVGFpbHNjYWxlKCkge1xuICAgIGlmICghY3VycmVudFNlcnZpY2UpIHJldHVybjtcbiAgICBjb25zdCBlbWFpbCA9ICh0c0VtYWlsSW5wdXQudmFsdWUgfHwgJycpLnRyaW0oKTtcbiAgICBpZiAoIWVtYWlsIHx8ICFlbWFpbC5pbmNsdWRlcygnQCcpKSB7XG4gICAgICBzaG93RXJyb3IoJ0EgdmFsaWQgcmVjaXBpZW50IGVtYWlsIGlzIHJlcXVpcmVkLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBoaWRlTWVzc2FnZXMoKTtcbiAgICB0c0NyZWF0ZUJ0bi5kaXNhYmxlZCA9IHRydWU7XG4gICAgY29uc3Qgb3JpZ2luYWwgPSB0c0NyZWF0ZUJ0bi50ZXh0Q29udGVudDtcbiAgICB0c0NyZWF0ZUJ0bi50ZXh0Q29udGVudCA9ICdDcmVhdGluZ1x1MjAyNic7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9zaGFyZS90YWlsc2NhbGUnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBjcmVkZW50aWFsczogJ3NhbWUtb3JpZ2luJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgc2VydmljZUlkOiBjdXJyZW50U2VydmljZS5pZCwgZW1haWwgfSksXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGJvZHkgPSBhd2FpdCByZXNwLmpzb24oKS5jYXRjaCgoKSA9PiAoe30pKTtcbiAgICAgIGlmICghcmVzcC5vayB8fCAhYm9keS5zdWNjZXNzKSB7XG4gICAgICAgIF9yZW5kZXJBcGlFcnJvcihyZXNwLnN0YXR1cywgYm9keSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIFRhaWxzY2FsZSBzaGFyZXMgc2hvdyB0aGUgcmF3IHVybFBhdGggKHdoaWNoIGlzIHRoZSBzaGFyZSBVUkwpIGlmXG4gICAgICAvLyBlbWFpbCBkZWxpdmVyeSBmYWlsZWQuIFRoZSBzaGFyZSBpdHNlbGYgaXMgb25lLXNob3Qgc28gdGhlIGFkbWluXG4gICAgICAvLyBjYW4gbWFudWFsbHkgcGFzdGUgdGhlIGxpbmsgaW50byBhIGNoYXQgaWYgU01UUCBmYWlsZWQuXG4gICAgICBjb25zdCBmYWxsYmFjayA9IGJvZHkuZGF0YSAmJiBib2R5LmRhdGEudXJsUGF0aDtcbiAgICAgIGlmIChmYWxsYmFjaykge1xuICAgICAgICBpc3N1ZWRVcmxJbnB1dC52YWx1ZSA9IF9hYnNVcmwoZmFsbGJhY2spO1xuICAgICAgICBpc3N1ZWRNZXRhRWwudGV4dENvbnRlbnQgPSBgVGFpbHNjYWxlIGludml0ZSBcdTAwQjcgZW1haWxlZCB0byAke2VtYWlsfSAob3IgdXNlIHRoaXMgVVJMIG1hbnVhbGx5IGlmIGRlbGl2ZXJ5IGZhaWxlZCkuYDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlzc3VlZFVybElucHV0LnZhbHVlID0gJyc7XG4gICAgICAgIGlzc3VlZE1ldGFFbC50ZXh0Q29udGVudCA9IGBUYWlsc2NhbGUgaW52aXRlIHNlbnQgdG8gJHtlbWFpbH0uYDtcbiAgICAgIH1cbiAgICAgIGlzc3VlZEVsLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgc2hvd1N1Y2Nlc3MoJ1RhaWxzY2FsZSBpbnZpdGUgY3JlYXRlZC4nKTtcbiAgICAgIHRzRW1haWxJbnB1dC52YWx1ZSA9ICcnO1xuICAgICAgbG9hZE91dHN0YW5kaW5nKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2hvd0Vycm9yKCdOZXR3b3JrIGVycm9yIHdoaWxlIGNyZWF0aW5nIFRhaWxzY2FsZSBpbnZpdGUuJyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRzQ3JlYXRlQnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICB0c0NyZWF0ZUJ0bi50ZXh0Q29udGVudCA9IG9yaWdpbmFsO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIF9yZW5kZXJBcGlFcnJvcihzdGF0dXMsIGJvZHkpIHtcbiAgICBjb25zdCBlcnIgPSAoYm9keSAmJiBib2R5LmVycm9yKSB8fCAnJztcbiAgICBpZiAoc3RhdHVzID09PSA0MDIpIHtcbiAgICAgIHNob3dFcnJvcignU2hhcmUgaXMgYSBQcm8gZmVhdHVyZS4gQWN0aXZhdGUgYSBsaWNlbnNlIHRvIHVubG9jay4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHN0YXR1cyA9PT0gNDAwICYmIC90YWlsc2NhbGUvaS50ZXN0KGVycikpIHtcbiAgICAgIHNob3dFcnJvcignVGFpbHNjYWxlIGlzIG5vdCBjb25maWd1cmVkIG9uIHRoaXMgaG9zdC4gU2V0IHVwIFRhaWxzY2FsZSBpbiB0aGUgZGFzaGJvYXJkIGZpcnN0LicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgIHNob3dFcnJvcignWW91IGRvIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gc2hhcmUgc2VydmljZXMuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgc2hvd0Vycm9yKCdTZXJ2aWNlIG5vdCBmb3VuZC4gSXQgbWF5IGhhdmUgYmVlbiBkZWxldGVkLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzaG93RXJyb3IoZXJyIHx8IGBSZXF1ZXN0IGZhaWxlZCAoSFRUUCAke3N0YXR1c30pLmApO1xuICB9XG5cbiAgZnVuY3Rpb24gb3BlblNoYXJlTW9kYWwoc2VydmljZSkge1xuICAgIGlmICghc2VydmljZSB8fCAhc2VydmljZS5pZCkgcmV0dXJuO1xuICAgIGN1cnJlbnRTZXJ2aWNlID0geyBpZDogc2VydmljZS5pZCwgbmFtZTogc2VydmljZS5uYW1lIHx8IHNlcnZpY2UuaWQgfTtcbiAgICBzZXJ2aWNlTmFtZUVsLnRleHRDb250ZW50ID0gY3VycmVudFNlcnZpY2UubmFtZTtcbiAgICBoaWRlTWVzc2FnZXMoKTtcbiAgICBzZXRBY3RpdmVUYWIoJ3B1YmxpYycpO1xuICAgIHRzRW1haWxJbnB1dC52YWx1ZSA9ICcnO1xuICAgIHB1YmxpY1R0bFNlbGVjdC52YWx1ZSA9IFN0cmluZyhUVExfT1BUSU9OU1sxXS5tcyk7IC8vIDI0aCBkZWZhdWx0XG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICAgIGxvYWRPdXRzdGFuZGluZygpO1xuICB9XG5cbiAgLy8gV2lyZSBldmVudHNcbiAgbW9kYWwucXVlcnlTZWxlY3RvckFsbCgnLnNoYXJlLXRhYicpLmZvckVhY2goYnRuID0+IHtcbiAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBzZXRBY3RpdmVUYWIoYnRuLmRhdGFzZXQudGFiKSk7XG4gIH0pO1xuICBwdWJsaWNDcmVhdGVCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBpc3N1ZVB1YmxpYyk7XG4gIHRzQ3JlYXRlQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaXNzdWVUYWlsc2NhbGUpO1xuICBjYW5jZWxCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBtb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93JykpO1xuICB3aXJlTW9kYWwobW9kYWwsIGNhbmNlbEJ0bik7XG5cbiAgLy8gQ29weS10by1jbGlwYm9hcmQgZm9yIHRoZSBpc3N1ZWQgc2hhcmUgVVJMXG4gIGlzc3VlZENvcHlCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdXJsID0gaXNzdWVkVXJsSW5wdXQudmFsdWU7XG4gICAgaWYgKCF1cmwpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgaWYgKG5hdmlnYXRvci5jbGlwYm9hcmQgJiYgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQpIHtcbiAgICAgICAgYXdhaXQgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQodXJsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEZhbGxiYWNrIGZvciBvbGRlciBicm93c2VycyAvIHVuc2FmZSBjb250ZXh0c1xuICAgICAgICBpc3N1ZWRVcmxJbnB1dC5zZWxlY3QoKTtcbiAgICAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9yaWdpbmFsID0gaXNzdWVkQ29weUJ0bi50ZXh0Q29udGVudDtcbiAgICAgIGlzc3VlZENvcHlCdG4udGV4dENvbnRlbnQgPSAnQ29waWVkISc7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHsgaXNzdWVkQ29weUJ0bi50ZXh0Q29udGVudCA9IG9yaWdpbmFsOyB9LCAxMjAwKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzaG93RXJyb3IoJ0NvdWxkIG5vdCBjb3B5IHRvIGNsaXBib2FyZC4gU2VsZWN0IHRoZSBVUkwgbWFudWFsbHkuJyk7XG4gICAgfVxuICB9KTtcblxuICAvLyBFeHBvc2UgZm9yIG90aGVyIG1vZHVsZXMgdG8gb3BlblxuICB3aW5kb3cub3BlblNoYXJlTW9kYWwgPSBvcGVuU2hhcmVNb2RhbDtcbn0pKCk7XG4iXSwKICAibWFwcGluZ3MiOiAiQ0FDQyxVQUFXLENBRVYsWUFBWSxhQUFjO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxTQTRGbkIsRUFFUCxNQUFNQSxFQUFZLFNBQVMsZUFBZSxZQUFZLEVBQ2hEQyxFQUFjLFNBQVMsZUFBZSxtQkFBbUIsRUFDekRDLEVBQWUsU0FBUyxlQUFlLG9CQUFvQixFQUMzREMsRUFBYSxTQUFTLGVBQWUsYUFBYSxFQUNsREMsRUFBbUIsU0FBUyxlQUFlLGdCQUFnQixFQUMzREMsRUFBYyxTQUFTLGVBQWUsbUJBQW1CLEVBQ3pEQyxFQUFlLFNBQVMsZUFBZSxvQkFBb0IsRUFDM0RDLEVBQWEsU0FBUyxlQUFlLGtCQUFrQixFQUN2REMsRUFBYyxTQUFTLGVBQWUsbUJBQW1C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QUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsU0FzTXpCLEVBRVAsTUFBTUMsRUFBVyxjQUdqQixJQUFJQyxFQUFlLEtBQ2ZDLEVBQWdCLEtBRXBCLE1BQU1DLEVBQVEsU0FBUyxlQUFlLG9C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QkFBaUIsUUFBUzZCLENBQVksQ0FDbEQsR0FBRyxHQUdGLFVBQVcsQ0FDVixNQUFNelcsRUFBZSxJQUFJLGFBRXpCLFlBQVksc0JBQXVCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtB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aUJBQWlCLFFBQVMsU0FBWSxDQUNsRCxNQUFNajBCLEVBQU1nMEIsRUFBZSxNQUMzQixHQUFLaDBCLEVBQ0wsR0FBSSxDQUNFLFVBQVUsV0FBYSxVQUFVLFVBQVUsVUFDN0MsTUFBTSxVQUFVLFVBQVUsVUFBVUEsQ0FBRyxHQUd2Q2cwQixFQUFlLE9BQU8sRUFDdEIsU0FBUyxZQUFZLE1BQU0sR0FFN0IsTUFBTXNCLEVBQVdyQixFQUFjLFlBQy9CQSxFQUFjLFlBQWMsVUFDNUIsV0FBVyxJQUFNLENBQUVBLEVBQWMsWUFBY3FCLENBQVUsRUFBRyxJQUFJLENBQ2xFLE1BQVksQ0FDVjVDLEVBQVUsdURBQXVELENBQ25FLENBQ0YsQ0FBQyxFQUdELE9BQU8sZUFBaUJnRCxDQUMxQixHQUFHIiwKICAibmFtZXMiOiBbImxvZ29Nb2RhbCIsICJwcmV2aWV3RGFyayIsICJwcmV2aWV3TGlnaHQiLCAibG9nb1N0YXR1cyIsICJzYW1lQm90aENoZWNrYm94IiwgImR1YWxVcGxvYWRzIiwgInNpbmdsZVVwbG9hZCIsICJ1cGxvYWREYXJrIiwgInVwbG9hZExpZ2h0IiwgInVwbG9hZFNpbmdsZSIsICJicmFuZExvZ29EYXJrIiwgImJyYW5kTG9nb0xpZ2h0IiwgInRvcFJvdyIsICJkYXNoYm9hcmRUaXRsZUlucHV0IiwgIkRFRkFVTFRfVElUTEUiLCAicGVuZGluZ0RhcmtEYXRhIiwgInBlbmRpbmdMaWdodERhdGEiLCAicGVuZGluZ1NpbmdsZURhdGEiLCAiY3VycmVudFBvc2l0aW9uIiwgImN1cnJlbnRUaXRsZSIsICJyZWFkRmlsZUFzRGF0YVVSTCIsICJmaWxlIiwgImNhbGxiYWNrIiwgInJlYWRlciIsICJlIiwgImRhdGEiLCAiYXBwbHlMb2dvUG9zaXRpb24iLCAicG9zIiwgImJ0biIsICJhcHBseURhc2hib2FyZFRpdGxlIiwgInRpdGxlIiwgImhlYWRlclRpdGxlIiwgImxvYWRDdXN0b21Mb2dvIiwgInJlc3BvbnNlIiwgImVycm9yIiwgImlzQ3VzdG9tIiwgIm5ld1RpdGxlIiwgInBheWxvYWQiLCAidCIsICJmYXZpY29uTGluayIsICJmYXZpY29uUHJldmlldyIsICJmYXZpY29uU3RhdHVzIiwgInBlbmRpbmdGYXZpY29uRGF0YSIsICJmYXZpY29uVXBsb2FkIiwgImxvYWRDdXN0b21GYXZpY29uIiwgImV2ZW50IiwgInNldHRpbmdzVHpTZWxlY3QiLCAiY3VycmVudFR6IiwgInJlcyIsICJ0eiIsICJjZmciLCAic2VsZWN0RWwiLCAic2VsZWN0ZWRUeiIsICJ0aW1lem9uZXMiLCAiZGV0ZWN0ZWQiLCAib3B0IiwgImN1cnJlbnRDb25maWdUeXBlIiwgInNlcnZlckNvbmZpZyIsICJjaGVja1NlcnZlckNvbmZpZyIsICJzZXR1cFR6U2VsZWN0IiwgInNob3dTdGVwIiwgInN0ZXBJZCIsICJzdGVwIiwgInRhcmdldFN0ZXAiLCAic2hvd1N1bW1hcnkiLCAic3VtbWFyeUNvbnRlbnQiLCAiaHRtbCIsICJ0bGQiLCAiY2FOYW1lIiwgImRuc0lQIiwgImRuc1BvcnQiLCAiaXAiLCAiZG9tYWluIiwgImVtYWlsIiwgInJvdXRpbmdNb2RlIiwgImV4YW1wbGVVcmxzIiwgInNhdmVDb25maWdUb1NlcnZlciIsICJjb25maWciLCAiZmluaXNoU2V0dXAiLCAic2VsZWN0ZWRQcm92aWRlciIsICJzYXZlZFRvU2VydmVyIiwgImNvbmZpZ05hbWUiLCAic2F2ZUxvY2F0aW9uIiwgInN0ZXAxTmV4dCIsICJzZWxlY3RlZCIsICJza2lwQnRuIiwgInRsZElucHV0IiwgInByZXZpZXcxIiwgInByZXZpZXcyIiwgImhvbWVsYWJCYWNrIiwgImhvbWVsYWJOZXh0IiwgInNpbXBsZUJhY2siLCAic2ltcGxlTmV4dCIsICJyYWRpbyIsICJub3RlIiwgInB1YmxpY0JhY2siLCAicHVibGljTmV4dCIsICJzdW1tYXJ5QmFjayIsICJzdW1tYXJ5TmV4dCIsICJkaXNrU2FmZXR5QmFjayIsICJmaW5pc2hCdG4iLCAiY29uZmlnU3RyIiwgImVycm9ySGFuZGxlciIsICJBUFBTX0tFWSIsICJhcGlUZW1wbGF0ZXMiLCAiYXBpQ2F0ZWdvcmllcyIsICJtb2RhbCIsICJncmlkIiwgImZldGNoQXBwVGVtcGxhdGVzIiwgImNoZWNrUG9ydEF2YWlsYWJpbGl0eSIsICJwb3J0IiwgImdldFN1Z2dlc3RlZFBvcnQiLCAiYmFzZVBvcnQiLCAiYnVpbGRBcHBTZWxlY3RvciIsICJieUNhdGVnb3J5IiwgImFwcElkIiwgInRlbXBsYXRlIiwgImNhdGVnb3J5IiwgImNhdGVnb3J5T3JkZXIiLCAiYXBwcyIsICJhIiwgImIiLCAiaGVhZGVyIiwgImNhdGVnb3J5SW5mbyIsICJhcHAiLCAib3B0aW9uIiwgImlzV2lkZ2V0IiwgIndpZGdldEVuYWJsZWQiLCAid2lkZ2V0QmFkZ2UiLCAiZGlmZmljdWx0eUJhZGdlIiwgInRvZ2dsZURhc2hib2FyZFdpZGdldCIsICJzaG93RGVwbG95Q29uZmlnIiwgIm9wdGlvbkVsIiwgImtleSIsICJuZXdTdGF0ZSIsICJzZWxlY3RvciIsICJlbCIsICJiYWRnZSIsICJhcHBUZW1wbGF0ZSIsICJkZXBsb3lNb2RhbCIsICJzdWJkb21haW5JbnB1dCIsICJ1cmxQcmV2aWV3IiwgImlwSW5wdXQiLCAicG9ydElucHV0IiwgInRhaWxzY2FsZUNoZWNrYm94IiwgInRhaWxzY2FsZVN0YXR1cyIsICJjaGVja1Jlc3VsdCIsICJjb250YWluZXIiLCAiZGVmYXVsdFN1YmRvbWFpbiIsICJzdWJwYXRoV2FybmluZyIsICJzdXBwb3J0IiwgImNmZ0Ruc1R5cGUiLCAiY2ZnU3NsVHlwZSIsICJkbnNSYWRpbyIsICJzc2xSYWRpbyIsICJkbnNTZWN0aW9uIiwgImFkdmFuY2VkRGV0YWlscyIsICJhZHZhbmNlZENvbnRlbnQiLCAiZG5zU2VjdGlvbkVsIiwgInNzbFNlY3Rpb25FbCIsICJtZWRpYVBhdGhTZWN0aW9uIiwgIm1lZGlhUGF0aElucHV0IiwgIm1lZGlhUGF0aERlc2NyaXB0aW9uIiwgImRldGVjdGVkTW91bnRzQ29udGFpbmVyIiwgImRldGVjdGVkTW91bnRzTGlzdCIsICJtb3VudHNSZXN1bHQiLCAiYXV0b1BhdGhzIiwgIm0iLCAibW91bnQiLCAiaXNTZWxlY3RlZCIsICJjdXJyZW50UGF0aHMiLCAicCIsICJpZHgiLCAicGxleENsYWltU2VjdGlvbiIsICJ2b2x1bWVTZWN0aW9uIiwgInZvbHVtZUxpc3QiLCAibWVkaWFDb250YWluZXJQYXRoIiwgIm5vbk1lZGlhVm9sdW1lcyIsICJ2IiwgInZvbCIsICJpIiwgImhvc3REZWZhdWx0IiwgImNvbnRhaW5lclBhdGgiLCAicm93IiwgImlucHV0IiwgImRlZmF1bHRQb3J0IiwgInBvcnRTdGF0dXMiLCAiY2hlY2tBbmRVcGRhdGVQb3J0U3RhdHVzIiwgInBvcnRUb0NoZWNrIiwgInJlc3VsdCIsICJzdWdnZXN0ZWRQb3J0IiwgInVzZUJ0biIsICJwb3J0Q2hlY2tUaW1lb3V0IiwgInVwZGF0ZVVybFByZXZpZXciLCAic3ViZG9tYWluIiwgImRuc1R5cGUiLCAic3NsVHlwZSIsICJ1cmwiLCAicHJvdG9jb2wiLCAiYWRkQXBwVG9HcmlkIiwgImRlcGxveUNvbmZpZyIsICJjdXN0b21BcHBzIiwgInVzaW5nRXhpc3RpbmciLCAiZXhpc3RpbmdBcHAiLCAiaW5kZXgiLCAicG9ydFRvVXNlIiwgInBvcnRDaGVjayIsICJhcGlEZXBsb3lDb25maWciLCAibmV3QXBwIiwgIm1lc3NhZ2UiLCAiY2hlY2tTU0xDZXJ0aWZpY2F0ZSIsICJpbnN0cnVjdGlvbnMiLCAiYXBwTmFtZSIsICJhdHRlbXB0cyIsICJtYXhBdHRlbXB0cyIsICJjaGVja0NlcnQiLCAibG9hZEN1c3RvbUFwcHMiLCAibWVkaWFQYXRoIiwgImN1c3RvbVZvbHVtZXMiLCAiZm9sZGVyQnJvd3Nlck1vZGFsIiwgImZvbGRlckJyb3dzZXJQYXRoIiwgImZvbGRlckJyb3dzZXJMaXN0IiwgImZvbGRlckJyb3dzZXJTZWxlY3RlZCIsICJmb2xkZXJCcm93c2VyU2VsZWN0ZWRMaXN0IiwgImN1cnJlbnRCcm93c2VyUGF0aCIsICJzZWxlY3RlZEZvbGRlcnMiLCAidGFyZ2V0TWVkaWFJbnB1dCIsICJtZWRpYUlucHV0IiwgInVwZGF0ZVNlbGVjdGVkRm9sZGVyc0Rpc3BsYXkiLCAibG9hZEZvbGRlckNvbnRlbnRzIiwgInBhdGgiLCAiaXRlbSIsICJpY29uIiwgInNlbGVjdGVkU3R5bGUiLCAicmVjaXBlVGVtcGxhdGVzIiwgInJlY2lwZUNhdGVnb3JpZXMiLCAiY3VycmVudFJlY2lwZSIsICJjdXJyZW50U3RlcCIsICJpc1ByZW1pdW0iLCAiY2FuY2VsQnRuIiwgInByZXZCdG4iLCAibmV4dEJ0biIsICJmZXRjaFJlY2lwZVRlbXBsYXRlcyIsICJyZXNwIiwgImNoZWNrUmVjaXBlUHJlbWl1bSIsICJyZWNpcGVzIiwgImdldFByZXZpZXdSZWNpcGVzIiwgInJlY2lwZUxpc3QiLCAicmVjaXBlIiwgImNvbXBvbmVudEJhZGdlIiwgImxvY2tPdmVybGF5IiwgIm9wZW5SZWNpcGVEZXBsb3lXaXphcmQiLCAiYXBwU2VsZWN0b3JNb2RhbCIsICJ1cGRhdGVTdGVwVUkiLCAicmVuZGVyU3RlcDEiLCAicGFuZWwiLCAibGlzdCIsICJjb21wb25lbnRzIiwgImNvbXAiLCAiaXNSZXF1aXJlZCIsICJpc0ludGVybmFsIiwgInJlbmRlclN0ZXAyIiwgInNoYXJlZFZvbHVtZXMiLCAicmVuZGVyU3RlcDMiLCAiY29udGVudCIsICJzZWxlY3RlZENvbXBvbmVudHMiLCAiZ2V0U2VsZWN0ZWRDb21wb25lbnRzIiwgInZvbHVtZUlucHV0cyIsICJ2b2x1bWVzIiwgInRhaWxzY2FsZSIsICJjIiwgImsiLCAiY2hlY2tib3hlcyIsICJzZWxlY3RlZElkcyIsICJjYiIsICJleGVjdXRlRGVwbG95IiwgInByb2dyZXNzTGlzdCIsICJyZXN1bHRFbCIsICJ1cGRhdGVQcm9ncmVzc0l0ZW0iLCAiZGVwbG95ZWQiLCAiZXJyIiwgInMiLCAiY29tcG9uZW50SWQiLCAic3RhdHVzIiwgInRleHQiLCAic3RhdHVzRWwiLCAiY2FyZHMiLCAiZ3JvdXBzIiwgImNhcmQiLCAicmVjaXBlSWQiLCAiZ3JvdXBDYXJkcyIsICJsYWJlbCIsICJhY3Rpb24iLCAiZW5kcG9pbnQiLCAibWV0aG9kIiwgInIiLCAic3R5bGUiLCAiYnV0dG9uIiwgIm9yaWdpbmFsVGV4dCIsICJ2aWV3QnRuIiwgInJlZnJlc2hCdG4iLCAiY2xlYXJCdG4iLCAiY2xvc2VCdG4iLCAibGV2ZWxTZWwiLCAiY29udGV4dFNlbCIsICJzZWFyY2hJbnB1dCIsICJzaW5jZUlucHV0IiwgInVudGlsSW5wdXQiLCAibG9hZE1vcmVCdG4iLCAidG90YWxTcGFuIiwgIlBBR0VfU0laRSIsICJjdXJyZW50T2Zmc2V0IiwgImluZmxpZ2h0IiwgImZpbHRlck5vbmNlIiwgImtub3duQ29udGV4dHMiLCAidG9Jc28iLCAibG9jYWxEdFZhbHVlIiwgImQiLCAicmVmcmVzaENvbnRleHRzIiwgImN1cnJlbnRWYWx1ZSIsICJidWlsZFF1ZXJ5IiwgInBhcmFtcyIsICJzaW5jZSIsICJ1bnRpbCIsICJzZWFyY2giLCAibG9hZExvZ3MiLCAiYXBwZW5kIiwgIm15Tm9uY2UiLCAibG9ncyIsICJyZWFzb24iLCAibG9nIiwgImxldmVsIiwgImxldmVsQ29sb3IiLCAidHMiLCAiY3R4IiwgIm1zZyIsICJ0YWJsZSIsICJkZXRhaWwiLCAiY2xlYXJMb2dzIiwgInNlYXJjaERlYm91bmNlIiwgIndpcmVGaWx0ZXJzIiwgImRhdGVEZWJvdW5jZSIsICJjb250YWluZXJTZWxlY3QiLCAibG9nQ29udGVudCIsICJsb2dTZWFyY2giLCAibG9nVGFpbCIsICJzdHJlYW1CdG4iLCAiZG93bmxvYWRCdG4iLCAiY2xlYXJTZWFyY2hCdG4iLCAiY2xvc2VCdG4yIiwgInN0cmVhbVN0YXR1cyIsICJzdHJlYW1JbmRpY2F0b3IiLCAic3RyZWFtVGV4dCIsICJsaW5lQ291bnQiLCAiZmlsdGVyQ291bnQiLCAiaW1hZ2VFbCIsICJjcmVhdGVkRWwiLCAiY3VycmVudENvbnRhaW5lcklkIiwgImN1cnJlbnRMb2dzIiwgImZpbHRlcmVkTG9ncyIsICJldmVudFNvdXJjZSIsICJpc1N0cmVhbWluZyIsICJzZWFyY2hUaW1lb3V0IiwgImZvcm1hdERhdGUiLCAiZGF0ZVN0ciIsICJlc2NhcGVIdG1sIiwgInN0ciIsICJkaXYiLCAiZm9ybWF0TG9nRW50cnkiLCAic3RyZWFtQ2xhc3MiLCAic3RyZWFtSWNvbiIsICJyZW5kZXJMb2dzIiwgInNlYXJjaFRlcm0iLCAibG9hZENvbnRhaW5lcnMiLCAiY29udGFpbmVycyIsICJjdXJyZW50VmFsIiwgImxvYWRDb250YWluZXJJbmZvIiwgImNvbnRhaW5lcklkIiwgInN0b3BTdHJlYW0iLCAidGFpbCIsICJzdGFydFN0cmVhbSIsICJlbnRyeSIsICJlbnRyeURpdiIsICJkb3dubG9hZExvZ3MiLCAiY29udGFpbmVyTmFtZSIsICJ0aW1lc3RhbXAiLCAiZmlsZW5hbWUiLCAic3RyZWFtIiwgImJsb2IiLCAiY2xvc2VNb2RhbCIsICJVTklUX1BSRVNFVFMiLCAidW5pdFNlbGVjdCIsICJ0YWlsSW5wdXQiLCAiY2xlYXJTZWFyY2giLCAib3ZlcmZsb3dIaW50IiwgInVuaXREaXNwbGF5IiwgInN0cmVhbVN0YXRlIiwgImF2YWlsYWJsZSIsICJsaW5lcyIsICJzdHJlYW1pbmciLCAic2VhcmNoVGltZXIiLCAic2V0QXZhaWxhYmxlIiwgImlzQXZhaWxhYmxlIiwgInByb2JlQXZhaWxhYmxlIiwgInJlbmRlckxpbmVzIiwgInRlcm0iLCAiZmlsdGVyZWQiLCAibCIsICJsaW5lIiwgImxvYWRUYWlsIiwgInVuaXQiLCAiZXYiLCAiY2xvc2UiLCAib3BlbkpvdXJuYWxkTW9kYWwiLCAib3BlbkJ0biIsICJkZXRhaWxzRGl2IiwgImNyZWF0ZUJ0biIsICJjcmVhdGVTdGF0dXMiLCAic2hvd0NvbnRhaW5lckRldGFpbHMiLCAiY3JlYXRlU25hcHNob3QiLCAibmFtZSIsICJsZWF2ZVJ1bm5pbmciLCAib3Blbk1vZGFsIiwgInRhYiIsICJjb25uZWN0QnRuIiwgInBoYXNlRGV0ZWN0IiwgInBoYXNlQ3JlZGVudGlhbHMiLCAicGhhc2VQcm9ncmVzcyIsICJwaGFzZVJlc3VsdHMiLCAiZGV0ZWN0UmVzdWx0cyIsICJjcmVkZW50aWFsSW5wdXRzIiwgInByb2dyZXNzU3RlcHMiLCAicmVzdWx0c0NvbnRlbnQiLCAicGxleExpYnJhcmllcyIsICJyZXRyeUJ0biIsICJkZXRlY3RlZERhdGEiLCAic2VydmljZUljb25zIiwgInNlcnZpY2VMYWJlbHMiLCAic2hvd1BoYXNlIiwgInBoYXNlIiwgInN0YXR1c0JhZGdlIiwgImNvbG9ycyIsICJzbWFydERldGVjdCIsICJzdmMiLCAiaW5mbyIsICJzb3VyY2UiLCAidmVyc2lvbiIsICJrZXlTYXZlZCIsICJidWlsZENyZWRlbnRpYWxJbnB1dHMiLCAic2VydmljZXMiLCAiYXJyU2VydmljZXMiLCAiaXNDb25uZWN0ZWQiLCAicGxleCIsICJwbGV4Q29ubmVjdGVkIiwgInNlZXJyIiwgInNlZXJyT2siLCAiY29uZmlndXJlZEh0bWwiLCAiY3MiLCAic2VydmljZSIsICJ1cmxJbnB1dCIsICJrZXlJbnB1dCIsICJzdGF0dXNTcGFuIiwgImFwaUtleSIsICJzbWFydENvbm5lY3QiLCAic3RlcHNIdG1sIiwgImRldGFpbENvbG9yIiwgInNob3dSZXN1bHRzIiwgImFsbEdvb2QiLCAiaGVhZGVyQ29sb3IiLCAiaGVhZGVySWNvbiIsICJoZWFkZXJUZXh0IiwgInN0IiwgImZldGNoUGxleExpYnJhcmllcyIsICJsaWIiLCAidHlwZUljb24iLCAic2F2ZUJ0biIsICJwcm92aWRlciIsICJjaGVja2JveCIsICJoZWFsdGhDaGVja0VuYWJsZWQiLCAiaGVhbHRoQ2hlY2tDb25maWciLCAibG9hZE5vdGlmaWNhdGlvbkNvbmZpZyIsICJlbWFpbFBhc3NFbCIsICJsb2FkTm90aWZpY2F0aW9uSGlzdG9yeSIsICJkYXRlIiwgInNhdmVOb3RpZmljYXRpb25Db25maWciLCAidGVzdFByb3ZpZGVyIiwgImxvYWROb3RpZmljYXRpb25TdGF0dXMiLCAibGFzdFNlbnRFbCIsICJwYW5lbElkIiwgInRhYkJhciIsICJtb2RhbENvbnRlbnQiLCAidGFyZ2V0IiwgIkJST1dTRVJfU1RBVEVfS0VZUyIsICJjb2xsZWN0QnJvd3NlclN0YXRlIiwgInN0YXRlIiwgInZhbCIsICJqIiwgInJlc3RvcmVCcm93c2VyU3RhdGUiLCAiYnJvd3NlclN0YXRlIiwgImNvdW50IiwgImlzTGVnYWN5Rm9ybWF0IiwgInJlc3RvcmVMZWdhY3lGb3JtYXQiLCAic2x1ZyIsICJleHBvcnRCdG4iLCAic2VsZWN0RmlsZUJ0biIsICJmaWxlSW5wdXQiLCAiZmlsZU5hbWVEaXYiLCAicHJldmlld0RpdiIsICJwcmV2aWV3Q29udGVudCIsICJyZXN0b3JlQnRuIiwgInJlc3VsdERpdiIsICJzY2hlZHVsZUNvbnRhaW5lciIsICJoaXN0b3J5Q29udGFpbmVyIiwgImRpc2tDb250YWluZXIiLCAicG9pbnRpbnRpbWVDb250YWluZXIiLCAic2VsZWN0ZWRCYWNrdXAiLCAic3RhdGVDb3VudCIsICJ0aGVtZUNvdW50IiwgImJhY2t1cCIsICJwcmV2aWV3IiwgInJlbG9hZENhZGR5IiwgImJyb3dzZXJDb3VudCIsICJsb2FkU2NoZWR1bGVzVGFiIiwgInNjaGVkdWxlcyIsICJzY2giLCAibmV4dFJ1blN0ciIsICJsYXN0UnVuU3RyIiwgInRvZ2dsZSIsICJ1cGRhdGVTY2hlZHVsZSIsICJzZWwiLCAiaW5wIiwgInJ1bkJhY2t1cE5vdyIsICJkZWxldGVTY2hlZHVsZSIsICJhZGROZXdTY2hlZHVsZSIsICJ1cGRhdGVzIiwgImludGVydmFsIiwgInJldGVudGlvbiIsICJhcHBJZElucHV0IiwgImxvYWREaXNrQmFja3VwcyIsICJmaWxlcyIsICJieUFwcCIsICJmIiwgImFwcElkcyIsICJhcHBGaWxlcyIsICJjb21wYXJlQmFja3VwRmlsZSIsICJyZXN0b3JlQmFja3VwRmlsZSIsICJsb2FkQmFja3VwSGlzdG9yeSIsICJiayIsICJzaXplTUIiLCAiYmFja3VwSWQiLCAibG9hZFBvaW50SW5UaW1lVGFiIiwgImxpY2Vuc2VSZXMiLCAibGljZW5zZURhdGEiLCAic2VydmljZXNSZXMiLCAic2VydmljZXNEYXRhIiwgImxvYWRQb2ludEluVGltZUJhY2t1cHMiLCAibGlzdEVsIiwgImRpZmYiLCAic3ZjQ2hhbmdlZCIsICJjZmdDaGFuZ2VkIiwgImF1dG9SZWZyZXNoQ2hlY2tib3giLCAiYWdncmVnYXRlZENvbnRhaW5lciIsICJhbGVydHNDb250YWluZXIiLCAibGFzdFVwZGF0ZVNwYW4iLCAicmVmcmVzaEludGVydmFsIiwgImNhY2hlZE1vbml0b3JpbmdEYXRhIiwgImZvcm1hdEJ5dGVzIiwgImJ5dGVzIiwgInNpemVzIiwgImdldENwdUNvbG9yIiwgInBlcmNlbnQiLCAiZ2V0TWVtQ29sb3IiLCAibG9hZFN0YXRzIiwgInN0YXRzIiwgImlzTmV3QXBpIiwgImlkIiwgImN1ciIsICJjcHUiLCAibWVtIiwgImNwdUNvbG9yIiwgIm1lbUNvbG9yIiwgIm1lbVVzZWQiLCAibWVtTGltaXQiLCAibmV0UngiLCAibmV0VHgiLCAiYWdnIiwgImxvYWRBZ2dyZWdhdGVkIiwgImxvYWRBbGVydHMiLCAiYWxlcnRIaXN0b3J5IiwgImhkIiwgImFsbENvbmZpZ3MiLCAiY2QiLCAiY29udGFpbmVyUm93cyIsICJoaXN0b3J5Um93cyIsICJ0aW1lIiwgIm5vdGlmaWVkTWFyayIsICJjb25maWdTZWN0aW9uIiwgImNvbmZpZ3MiLCAiY0lkIiwgInN0b3BBdXRvUmVmcmVzaCIsICJvcmlnIiwgInN0YXJ0QXV0b1JlZnJlc2giLCAiaGlzdG9yeUNvbnRhaW5lclNlbGVjdCIsICJoaXN0b3J5QXJlYSIsICJyYW5nZUJ1dHRvbnMiLCAiY3VycmVudFJhbmdlIiwgInJhbmdlVG9NcyIsICJyYW5nZSIsICJ0aWVyTGFiZWwiLCAidGllciIsICJyZW5kZXJTcGFya2xpbmUiLCAic2FtcGxlcyIsICJhY2Nlc3NvciIsICJjb2xvciIsICJ2YWx1ZXMiLCAibWF4IiwgIm1pbiIsICJ3IiwgImgiLCAicGFkIiwgInN0ZXBYIiwgInBvaW50cyIsICJ4IiwgInkiLCAibGFzdCIsICJhdmciLCAicG9wdWxhdGVIaXN0b3J5Q29udGFpbmVyU2VsZWN0IiwgInByZXZpb3VzIiwgImVudHJpZXMiLCAibG9hZEhpc3RvcnkiLCAiZW5kVGltZSIsICJzdGFydFRpbWUiLCAiaXNSYXciLCAiY3B1QWNjZXNzb3IiLCAibWVtQWNjZXNzb3IiLCAibmV0UnhBY2Nlc3NvciIsICJuZXRUeEFjY2Vzc29yIiwgInN0YXR1c0NvbnRhaW5lciIsICJpbmNpZGVudHNDb250YWluZXIiLCAiY29uZmlnQ29udGFpbmVyIiwgImFkZEJ0biIsICJmb3JtRWwiLCAiZm9ybVRpdGxlIiwgImZvcm1DYW5jZWwiLCAiZm9ybVNhdmUiLCAiSEVBTFRIX1NFVFRJTkdTX0tFWSIsICJIRUFMVEhfREVGQVVMVFMiLCAiZ2xvYmFsU2F2ZUJ0biIsICJnbG9iYWxSZXNldEJ0biIsICJnbG9iYWxTdGF0dXNTcGFuIiwgInJldGVudGlvbklucHV0IiwgImludGVydmFsSW5wdXQiLCAic3RhdHNJbnRlcnZhbElucHV0IiwgIm1heEVudHJpZXNJbnB1dCIsICJkaXNrVGhyZXNob2xkSW5wdXQiLCAibG9hZEhlYWx0aFNldHRpbmdzIiwgInJhdyIsICJzYXZlZCIsICJhcHBseUhlYWx0aFNldHRpbmdzVG9VSSIsICJzYXZlSGVhbHRoU2V0dGluZ3MiLCAic2V0dGluZ3MiLCAicmVzZXRIZWFsdGhTZXR0aW5ncyIsICJlZGl0aW5nSWQiLCAidXB0aW1lQ29sb3IiLCAicGN0IiwgInNldmVyaXR5QmFkZ2UiLCAic2V2IiwgImxvYWRTdGF0dXMiLCAiaXNVcCIsICJkb3RDb2xvciIsICJ1MjQiLCAidTdkIiwgImF2Z1J0IiwgImxhc3RDaGVjayIsICJkZXRhaWxSb3ciLCAicnQiLCAibG9hZEluY2lkZW50cyIsICJvcGVuUmVzIiwgImhpc3RSZXMiLCAib3BlbkRhdGEiLCAiaGlzdERhdGEiLCAib3BlbiIsICJpbmMiLCAiaGlzdG9yeSIsICJyZXNvbHZlZCIsICJkdXIiLCAibG9hZENvbmZpZyIsICJzaG93Rm9ybSIsICJ0aW1lb3V0IiwgImNvZGVzIiwgInNsYSIsICJzbG93IiwgImhpZGVGb3JtIiwgImJvZHkiLCAiY2hlY2tCdG4iLCAiYXZhaWxhYmxlQ29udGFpbmVyIiwgImF1dG9Db250YWluZXIiLCAibGFzdENoZWNrU3BhbiIsICJsb2FkQXZhaWxhYmxlIiwgInUiLCAiY291bnRCYWRnZSIsICJ1cGRhdGVBbGxCdG4iLCAidXBkYXRlQWxsQ29udGFpbmVycyIsICJzdWNjZXNzIiwgImZhaWxlZCIsICJjaGVja0ZvclVwZGF0ZXMiLCAib2siLCAibG9hZEF1dG9Db25maWciLCAiY29udGFpbmVyc1JlcyIsICJjb25maWdSZXMiLCAiY29udGFpbmVyc0RhdGEiLCAiY29uZmlnRGF0YSIsICJzYXZlZENvbmZpZyIsICJjaWQiLCAic2NoZWR1bGVWYWwiLCAicm9sbGJhY2tWYWwiLCAid2luZG93VmFsIiwgImxhc3RSdW4iLCAic2NoZWR1bGUiLCAicm9sbGJhY2siLCAid2luZG93IiwgImRjVmVyc2lvbkluZm8iLCAiZGNVcGRhdGVCYWRnZSIsICJkY1VwZGF0ZURldGFpbHMiLCAiZGNOZXdWZXJzaW9uIiwgImRjQ2hhbmdlbG9nIiwgImRjQXBwbHlCdG4iLCAiZGNDaGVja0J0biIsICJkY1JvbGxiYWNrQnRuIiwgImRjU3RhdHVzQmFyIiwgImRjSGlzdG9yeUNvbnRhaW5lciIsICJkY0xhc3RDaGVjayIsICJkY1Nob3dTdGF0dXMiLCAidHlwZSIsICJkY0xvYWRWZXJzaW9uIiwgImNvbW1pdCIsICJkY0NoZWNrRm9yVXBkYXRlIiwgInNpbGVudCIsICJ1cGRhdGVzQnRuIiwgImRvdCIsICJkY1RhYiIsICJkY0FwcGx5VXBkYXRlIiwgImRjTG9hZEhpc3RvcnkiLCAic3RDb2xvciIsICJkY1Nob3dSb2xsYmFjayIsICJ2ZXJzaW9ucyIsICJmbXRCeXRlcyIsICJ1bml0cyIsICJsb2FkVm9sdW1lcyIsICJ2b2xzIiwgImlzU3lzdGVtIiwgIm5hbWVJbnB1dCIsICJsb2FkTmV0d29ya3MiLCAibmV0cyIsICJuIiwgImRyaXZlclNlbGVjdCIsICJsb2FkRGlza1VzYWdlIiwgInNlY3Rpb25zIiwgInBhcnNlZERhdGEiLCAieWFtbFN0ciIsICJzdGFja05hbWUiLCAib3JpZ1RleHQiLCAicmVuZGVyUHJldmlldyIsICJib3JkZXJDb2xvciIsICJwYXJ0cyIsICJwcm9ncmVzc0VsIiwgInRlcm1FbCIsICJ3cyIsICJmaXRBZGRvbiIsICJjbGVhbnVwIiwgIm9wZW5FeGVjIiwgImRpbXMiLCAiY29scyIsICJyb3dzIiwgInJlc2l6ZUhhbmRsZXIiLCAiZmlsdGVyU2VsZWN0IiwgIm91dGNvbWVTZWxlY3QiLCAibG9hZEF1ZGl0IiwgIm91dGNvbWUiLCAiYWN0b3IiLCAiYWN0b3JMYWJlbCIsICJyb2xlIiwgInRhZyIsICJ0YWJzIiwgInBhbmVscyIsICJhbGxFdmVudHMiLCAiYWxsSG9zdHMiLCAic3NlU291cmNlIiwgInJlZnJlc2hPdmVydmlldyIsICJyZWZyZXNoRXZlbnRzIiwgInJlZnJlc2hIb3N0cyIsICJzdGFydExpdmVUYWlsIiwgInN0b3BMaXZlVGFpbCIsICJyZW5kZXJFdmVudHMiLCAiYWN0aXZlIiwgInN0YXRzUmVzIiwgImhvc3RzUmVzIiwgImV2ZW50c1JlcyIsICJob3N0cyIsICJldmVudHNDb3VudCIsICJyZW5kZXJUb3BMaXN0IiwgIml0ZW1zIiwgIml0IiwgImZpbHRlclNvdXJjZSIsICJmaWx0ZXJTZXZlcml0eSIsICJmaWx0ZXJIb3N0IiwgImZpbHRlckFjdG9yIiwgImRlYm91bmNlIiwgInJlZnJlc2hIb3N0RmlsdGVyIiwgInJlbmRlckV2ZW50Um93IiwgInNldkNvbG9yIiwgImN1cnJlbnQiLCAicmVnaXN0ZXJIb3N0UHJvbXB0IiwgImZuIiwgIm1zIiwgIiQiLCAibG9hZGVkT25jZSIsICJlc2MiLCAiYXBpIiwgIm9wdHMiLCAic2hvd091dHB1dCIsICJsb2FkU2VydmljZXMiLCAibG9hZFJlcG9zIiwgInJlcG9zIiwgImxvYWRKb3VybmFsIiwgInFzIiwgInNldEJ1c3kiLCAiYnVzeSIsICJydW5EZXBsb3kiLCAiZGlyIiwgInJ1blJvbGxiYWNrIiwgInJ1blN0YXR1cyIsICJ3aXJlIiwgInJiIiwgInNiIiwgIkxPQ0FUSU9OX0tFWSIsICJMRUdBQ1lfS0VZIiwgIkdFT19DQUNIRV9LRVkiLCAiVU5JVF9LRVkiLCAiZ2V0VW5pdCIsICJnZXRXZWF0aGVyRWxlbWVudHMiLCAid21vRGVzY3JpcHRpb25zIiwgIndtb0ljb25zIiwgIndpbmREaXJzIiwgImRlZ1RvRGlyIiwgImRlZyIsICJnZW9jb2RlTG9jYXRpb24iLCAicXVlcnkiLCAiY2FjaGVkIiwgImdlbyIsICJmb3JtYXRMb2NhdGlvbiIsICJmZXRjaFdlYXRoZXIiLCAibG9jYXRpb24iLCAidGVtcFVuaXQiLCAid2luZFVuaXQiLCAiY29kZSIsICJ1cGRhdGVXZWF0aGVyIiwgIndlYXRoZXJXaWRnZXQiLCAid2VhdGhlciIsICJ0ZW1wU3VmZml4IiwgIndpbmRMYWJlbCIsICJsb2NhdGlvbklucHV0IiwgImxvYyIsICJ1bml0UmFkaW8iLCAibmV3VW5pdCIsICJvbGRVbml0IiwgIndpZGdldCIsICJyZW5kZXIiLCAiREFZUyIsICJNT05USFMiLCAiUk9NQU4iLCAiY3VycmVudFN0eWxlIiwgImxhc3RDaGltZUhvdXIiLCAiY2hpbWVQbGF5aW5nIiwgInByZXZGbGlwRGlnaXRzIiwgImFjdGl2ZUxheW91dCIsICJkaWdpdGFsUmVmcyIsICJ0aWNrVGltZXIiLCAicGxheUNoaW1lcyIsICJzdHJpa2UiLCAiYmVsbCIsICJub3ciLCAicmVzZXRSZW5kZXJMYXlvdXQiLCAiZW5zdXJlRGlnaXRhbExheW91dCIsICJyZW5kZXJEZWZhdWx0IiwgImgyNCIsICJhbXBtIiwgInJlZnMiLCAicmVuZGVyTGNkIiwgImNscyIsICJyZW5kZXJGbGlwIiwgImRpZ2l0cyIsICJmbGlwQ2FyZCIsICJkaWdpdCIsICJyZW5kZXJCaW5hcnkiLCAiYml0IiwgImNvbCIsICJvbiIsICJyZW5kZXJBbmFsb2ciLCAidXNlUm9tYW4iLCAic2l6ZSIsICJjeCIsICJjeSIsICJzQW5nbGUiLCAibUFuZ2xlIiwgImhBbmdsZSIsICJsYWJlbHMiLCAiYW5nbGUiLCAidGlja3MiLCAib3V0ZXIiLCAiaW5uZXIiLCAieDEiLCAieTEiLCAieDIiLCAieTIiLCAic3ZnIiwgInRpY2siLCAibmV4dENsYXNzTmFtZSIsICJzY2hlZHVsZU5leHRUaWNrIiwgImRlbGF5IiwgIlNUWUxFUyIsICJzdHlsZU9wdGlvbnNIdG1sIiwgImNoaW1lc1RvZ2dsZSIsICJ2b2x1bWVTbGlkZXIiLCAibG9hZFNldHRpbmdzIiwgInJlZnJlc2hDYXJkSGVhbHRoIiwgInNlcnZpY2VJZCIsICJ1cHRpbWVFbCIsICJiYXJFbCIsICJ1cHRpbWUyNCIsICJkaXNtaXNzZWRVcGRhdGVzIiwgImtub3duVXBkYXRlcyIsICJyZWZyZXNoQ2FyZFVwZGF0ZXMiLCAibm90aWZ5TmV3IiwgInByZXYiLCAidXBkIiwgInVwZGF0ZUJ0biIsICJzY2hlZHVsZUNhcmRFbmhhbmNlbWVudHMiLCAib3JpZ1JlZnJlc2hBbGwiLCAidGhlbWVCZWZvcmVCdWlsZGVyIiwgImVkaXRpbmdTbHVnIiwgImFkdmFuY2VkT3ZlcnJpZGVzIiwgIlRIRU1FX0xBQkVMUyIsICJGSUVMRFMiLCAidGhlbWVCdG4iLCAidGhlbWVMYWJlbCIsICJnZXRMYWJlbEZvciIsICJ1c2VyVGhlbWVzIiwgInVwZGF0ZUxhYmVsIiwgIm5leHQiLCAiYnVpbGRGaWVsZHNIVE1MIiwgImdyb3VwZWQiLCAiYnVpbGRTdGFydEZyb21PcHRpb25zIiwgIm1vZGFsSFRNTCIsICJzdGFydFNlbGVjdCIsICJlZGl0U2VsZWN0IiwgImV4aXN0aW5nU2VjdGlvbiIsICJsaWdodEJnQ2hlY2siLCAicGlja2VycyIsICJhZHZhbmNlZFNlY3Rpb24iLCAiYWR2YW5jZWRUb2dnbGUiLCAiYWR2YW5jZWRWaXNpYmxlIiwgImdldEN1cnJlbnRDb2xvcnMiLCAiZ2V0QmFzZUNvbG9ycyIsICJ1cGRhdGVBZHZhbmNlZEZyb21EZXJpdmVkIiwgImJhc2UiLCAiZGVyaXZlZCIsICJoZXgiLCAibG9hZFRoZW1lSW50b1BpY2tlcnMiLCAidGhlbWVOYW1lIiwgInVwZGF0ZVByZXZpZXciLCAibG9hZFVzZXJUaGVtZUludG9QaWNrZXJzIiwgInRoZW1lIiwgIm11dGVkIiwgImJhZGdlT2siLCAiYmFkZ2VCYWQiLCAiZG90T2siLCAiZG90QmFkIiwgImRvdHMiLCAiYXBwbHlDb2xvcnNMaXZlIiwgInByb3AiLCAicmVmcmVzaEVkaXREcm9wZG93biIsICJzbHVncyIsICJyZWZyZXNoU3RhcnRGcm9tIiwgIm9wZW5CdWlsZGVyIiwgImN1c3RvbWl6ZUJ0biIsICJvbGRTbHVnIiwgIm5ld1NsdWciLCAidGhlbWVEYXRhIiwgImFwaUNvbG9ycyIsICJzbHVnVG9EZWxldGUiLCAiZmFsbGJhY2siLCAiZXhwb3J0RGF0YSIsICJ0aGVtZUNvbG9ycyIsICJ0aGVtZUxpZ2h0QmciLCAiY29kZUlucHV0IiwgImFjdGl2YXRlQnRuIiwgImRlYWN0aXZhdGVCdG4iLCAiZXJyb3JFbCIsICJzdWNjZXNzRWwiLCAiYmFkZ2VJY29uIiwgImJhZGdlVGV4dCIsICJkZXRhaWxzRWwiLCAiZmVhdHVyZUxpc3QiLCAiYWN0aXZhdGVTZWN0aW9uIiwgImN1cnJlbnRTdGF0dXMiLCAiaGlkZU1lc3NhZ2VzIiwgInNob3dFcnJvciIsICJzaG93U3VjY2VzcyIsICJyZW5kZXJTdGF0dXMiLCAiZXhwaXJ5TGluZSIsICJmZWF0dXJlcyIsICJhY3RpdmVGZWF0dXJlcyIsICJ1cGRhdGVIZWFkZXJCYWRnZSIsICJhY3RpdmF0ZUxpY2Vuc2UiLCAiZGVhY3RpdmF0ZUxpY2Vuc2UiLCAidG9wYmFyIiwgImljb25FbCIsICJ0ZXh0RWwiLCAidGltZUVsIiwgImRheXMiLCAib3BlbkxpY2Vuc2VNb2RhbCIsICJyZXN0IiwgInRvcGJhckVsIiwgImZlYXR1cmUiLCAiVFRMX09QVElPTlMiLCAibyIsICJzZXJ2aWNlTmFtZUVsIiwgImlzc3VlZEVsIiwgImlzc3VlZFVybElucHV0IiwgImlzc3VlZENvcHlCdG4iLCAiaXNzdWVkTWV0YUVsIiwgIm91dHN0YW5kaW5nTGlzdEVsIiwgInB1YmxpY0NyZWF0ZUJ0biIsICJ0c0NyZWF0ZUJ0biIsICJ0c0VtYWlsSW5wdXQiLCAicHVibGljVHRsU2VsZWN0IiwgImN1cnJlbnRTZXJ2aWNlIiwgImFjdGl2ZVRhYiIsICJfb3JpZ2luRnJvbVBhZ2UiLCAiX2Fic1VybCIsICJ1cmxQYXRoIiwgIl9mb3JtYXRFeHBpcnkiLCAiaXNvIiwgIl9mb3JtYXRSZW1haW5pbmciLCAic2V0QWN0aXZlVGFiIiwgImlzQWN0aXZlIiwgImxvYWRPdXRzdGFuZGluZyIsICJyZW1haW5pbmciLCAicmV2b2tlU2hhcmUiLCAiaXNzdWVQdWJsaWMiLCAib3JpZ2luYWwiLCAidHRsTXMiLCAiX3JlbmRlckFwaUVycm9yIiwgImlzc3VlVGFpbHNjYWxlIiwgIm9wZW5TaGFyZU1vZGFsIl0KfQo=