(function(){function v(){const i=safeGet("custom-services");if(i)try{JSON.parse(i).forEach(e=>{window.APPS.find(a=>a.id===e.id)||window.APPS.push(e)})}catch(n){console.warn("Failed to load custom services:",n)}}v();function k(){const i=document.querySelectorAll(".top .card");i.forEach((n,e)=>{n.style.transitionDelay=`${Math.min(e*60,300)}ms`}),requestAnimationFrame(()=>{i.forEach(n=>n.classList.add("loaded"))})}function u(){if(!("serviceWorker"in navigator)||!window.isSecureContext&&location.hostname!=="localhost"&&location.hostname!=="127.0.0.1")return;const i=()=>{navigator.serviceWorker.register("/sw.js",{updateViaCache:"none"}).catch(n=>{console.warn("[init] Service worker registration failed:",n)})};document.readyState==="complete"?i():window.addEventListener("load",i,{once:!0})}let h=!1;async function f(){if(h){console.warn("[init] initializeDashboard called again, skipping duplicate");return}if(h=!0,await window.loadServices(),await y(),window.buildGrid(),k(),window.refreshAll(),setInterval(()=>{window._dcAuthLost||window.refreshAll()},DC.POLL.DASHBOARD),typeof window.refreshCredsButtons=="function"&&window.refreshCredsButtons(),typeof window.refreshMonitoringWidgets=="function"&&window.refreshMonitoringWidgets(),typeof window._updateAuthCard=="function")try{const n=await(await fetch("/api/v1/totp/config",{cache:"no-store"})).json();n.success&&window._updateAuthCard(n.config.enabled&&n.config.isSetUp,n.config.sessionDuration)}catch{}if(window.__dashcaddySiteConfigLoaded)try{await window.__dashcaddySiteConfigLoaded}catch{}if(S(),C()&&b(),window.AdminPanel&&typeof window.AdminPanel.attachTrigger=="function")try{await window.AdminPanel.attachTrigger(document.body)}catch(i){console.warn("[init] AdminPanel attachTrigger failed:",i)}}function b(){if(document.querySelector('script[src="/dist/onboarding.js"]'))return;const i=document.createElement("script");if(i.src="/dist/onboarding.js",i.defer=!0,document.head.appendChild(i),!document.querySelector('link[href="/css/driver.min.css"]')){const n=document.createElement("link");n.rel="stylesheet",n.href="/css/driver.min.css",document.head.appendChild(n)}if(!document.querySelector('link[href="/css/onboarding.css"]')){const n=document.createElement("link");n.rel="stylesheet",n.href="/css/onboarding.css",document.head.appendChild(n)}}function C(){if(typeof SITE<"u"&&SITE.onboardingCompleted)return!1;try{const i=JSON.parse(localStorage.getItem("dashcaddy_onboarding"));return!i||!i.tourCompleted&&i.currentStep===0}catch{return!0}}function E(){const i=document.querySelectorAll(".tools-section");if(!i.length)return;let n={};try{n=JSON.parse(localStorage.getItem("toolbar-sections")||"{}")}catch{}i.forEach(e=>{const a=e.dataset.section,c=e.querySelector(".tools-section-header");c&&(n[a]&&(e.classList.add("open"),c.setAttribute("aria-expanded","true")),c.addEventListener("click",s=>{s.preventDefault();const l=e.classList.toggle("open");c.setAttribute("aria-expanded",l?"true":"false");const m={};document.querySelectorAll(".tools-section").forEach(t=>{m[t.dataset.section]=t.classList.contains("open")}),localStorage.setItem("toolbar-sections",JSON.stringify(m))}))})}E();function S(){if(document.getElementById("restart-tour-btn"))return;let i=typeof SITE<"u"&&SITE.onboardingCompleted;try{const a=JSON.parse(localStorage.getItem("dashcaddy_onboarding"));i=i||!!(a&&a.tourCompleted)}catch{}const n=i?document.querySelector('.tools-section[data-section="admin"] .tools-section-items'):document.querySelector(".tools-primary");if(!n)return;const e=document.createElement("button");e.id="restart-tour-btn",e.textContent=i?"Help Tour":"\u{1F393} Help Tour",e.title="Restart the onboarding tour",e.onclick=()=>{if(window.DashCaddyOnboarding)window.DashCaddyOnboarding.restartTour();else{b();const a=setInterval(()=>{window.DashCaddyOnboarding&&(clearInterval(a),window.DashCaddyOnboarding.restartTour())},100);setTimeout(()=>clearInterval(a),5e3)}},n.appendChild(e)}window.initializeDashboard=f,window.loadCustomServices=v,u();async function y(){try{const i=await fetch("/api/v1/templates",{cache:"no-store"});if(!i.ok)return;const n=await i.json();n&&n.categories&&(window.DC_CATEGORIES=n.categories,typeof DC<"u"&&(DC.CATEGORIES=n.categories),q())}catch(i){console.warn("[init] Failed to load template categories:",i)}}function q(){const i=window.DC_CATEGORIES||typeof DC<"u"&&DC.CATEGORIES;i&&document.querySelectorAll('select[data-role="service-category"]').forEach(n=>{const e=n.dataset.current||"",a=n.querySelector('option[value=""]');if(n.innerHTML="",a)n.appendChild(a);else{const c=document.createElement("option");c.value="",c.textContent="\u2014 Select category \u2014",n.appendChild(c)}Object.entries(i).forEach(([c,s])=>{const l=document.createElement("option");l.value=c,l.textContent=`${s.icon||""} ${c}`.trim(),c===e&&(l.selected=!0),n.appendChild(l)})})}window.populateCategorySelects=q,window.loadTemplateCategories=y,(async()=>{try{const n=await(await fetch("/api/v1/totp/config",{cache:"no-store"})).json();if(n.success&&n.config.enabled&&(await fetch("/api/v1/totp/check-session",{cache:"no-store"})).status===401){window._showTotpOverlay();return}}catch(i){console.warn("TOTP check failed, proceeding normally:",i)}f()})()})(),(function(){const v=document.createElement("style");v.textContent=`
.dc-monitor {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
gap: 12px;
margin-bottom: 16px;
padding: 12px 16px;
background: var(--card-base);
border: 1px solid var(--border);
border-radius: var(--radius);
}
.dc-monitor-card {
padding: 10px 12px;
background: var(--card-bg, rgba(255,255,255,0.04));
border-radius: 8px;
border: 1px solid var(--border);
}
.dc-monitor-label {
font-size: 0.7rem;
color: var(--muted);
text-transform: uppercase;
letter-spacing: 0.5px;
margin-bottom: 4px;
}
.dc-monitor-value {
font-size: 1.4rem;
font-weight: 600;
color: var(--fg);
}
.dc-monitor-sub {
font-size: 0.7rem;
color: var(--muted);
margin-top: 4px;
}
.dc-monitor-bar {
margin-top: 6px;
width: 100%;
height: 4px;
background: color-mix(in srgb, var(--muted) 20%, transparent);
border-radius: 2px;
overflow: hidden;
}
.dc-monitor-bar-fill {
height: 100%;
width: 0%;
background: var(--ok-fg, #27ae60);
transition: width 0.3s ease, background 0.3s ease;
}
.dc-monitor-bar-fill.warn { background: #f39c12; }
.dc-monitor-bar-fill.bad { background: #e74c3c; }
.dc-monitor-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 8px;
}
.dc-monitor-title {
font-size: 0.85rem;
font-weight: 500;
color: var(--muted);
display: flex;
align-items: center;
gap: 6px;
}
.dc-monitor-pill {
display: inline-flex;
align-items: center;
gap: 4px;
padding: 2px 8px;
border-radius: 999px;
font-size: 0.7rem;
font-weight: 500;
}
.dc-monitor-pill.ok { background: color-mix(in srgb, #27ae60 20%, transparent); color: #27ae60; }
.dc-monitor-pill.warn { background: color-mix(in srgb, #f39c12 20%, transparent); color: #f39c12; }
.dc-monitor-pill.bad { background: color-mix(in srgb, #e74c3c 20%, transparent); color: #e74c3c; }
.dc-monitor-refresh {
font-size: 0.7rem;
color: var(--muted);
opacity: 0.7;
}
`,document.head.appendChild(v);const k=document.getElementById("service-filter-bar");if(!k)return;const u=document.createElement("div");u.className="dc-monitor",u.id="dc-monitor-panel",u.innerHTML=`
Services
\u2014
loading\u2026
Containers Up
\u2014
loading\u2026
`,k.parentNode.insertBefore(u,k);function h(e,a){const c=document.getElementById(e);if(!c)return;const s=Math.max(0,Math.min(100,Number(a)||0));c.style.width=s+"%",c.classList.remove("warn","bad"),s>=85?c.classList.add("bad"):s>=65&&c.classList.add("warn")}function f(e){return e==null||isNaN(e)?"\u2014":Math.round(e*10)/10+"%"}function b(e){if(e==null||isNaN(e))return"\u2014";const a=["B","KB","MB","GB","TB"];let c=0;for(;e>=1024&&c{l.dataset.status==="on"&&a++});const c=document.getElementById("dc-monitor-services"),s=document.getElementById("dc-monitor-services-sub");c&&(c.textContent=`${a} / ${e}`),s&&(s.textContent=e===0?"no services yet":`${a} online \xB7 ${e-a} offline`)}function E(e){const a=document.getElementById("dc-monitor-health"),c=document.getElementById("dc-monitor-health-sub");if(!a)return;if(!e||e.summary==null){a.textContent="\u2014",c&&(c.textContent="no data");return}const s=e.summary,l=s.healthy??s.up??0,m=s.unhealthy??s.down??0,t=s.total??l+m;a.textContent=`${l}/${t}`,c&&(m===0?c.innerHTML='\u25CF all healthy':m<=2?c.innerHTML=`\u25CF ${m} degraded`:c.innerHTML=`\u25CF ${m} down`)}async function S(){try{const e=await fetch("/api/v1/monitoring/stats",{cache:"no-store"});if(!e.ok)return null;const a=await e.json();return a&&a.stats?a.stats:null}catch{return null}}async function y(){try{const e=await fetch("/api/v1/health-checks/status",{cache:"no-store"});return e.ok?await e.json():null}catch{return null}}function q(e){const a=document.getElementById("dc-monitor-containers"),c=document.getElementById("dc-monitor-containers-sub"),s=document.getElementById("dc-monitor-cpu"),l=document.getElementById("dc-monitor-mem");if(!e){a&&(a.textContent="\u2014"),s&&(s.textContent="\u2014"),l&&(l.textContent="\u2014");return}const m=Object.values(e);if(m.length===0){a&&(a.textContent="0"),c&&(c.textContent="no containers reporting"),s&&(s.textContent="0%"),l&&(l.textContent="0%"),h("dc-monitor-cpu-bar",0),h("dc-monitor-mem-bar",0);return}let t=0,o=0,r=0,p=0,d=0;m.forEach(g=>{if(g.cpu!=null){const x=Number(g.cpu);isNaN(x)||(t+=x>1?x:x*100,p++)}if(g.memory!=null){const x=Number(g.memory);isNaN(x)||(o+=x,r+=Number(g.memoryUsage||0),d++)}});const w=p?t/p:0,L=d?o/d:0;if(a&&(a.textContent=String(m.length)),c){const g=r?` \xB7 ${b(r)} RAM`:"";c.textContent=`running${g}`}s&&(s.textContent=f(w)),l&&(l.textContent=f(L)),h("dc-monitor-cpu-bar",w),h("dc-monitor-mem-bar",L)}let i=!1;async function n(){if(!i){i=!0;try{C();const[e,a]=await Promise.all([S(),y()]);q(e),E(a);const c=document.getElementById("dc-monitor-refresh-stamp");if(c){const s=new Date;c.textContent=`updated ${s.toLocaleTimeString()}`}}finally{i=!1}}}window.refreshMonitoringWidgets=n,setInterval(n,typeof DC<"u"&&DC.POLL&&DC.POLL.STATS||5e3),setTimeout(n,200)})(),(function(){"use strict";const v=(...t)=>{window.DASHCADDY_DEBUG&&console.log(...t)},k=["#app-selector-modal","#app-deploy-modal","#weather-modal","#token-management-modal","#service-edit-modal","#notifications-modal","#backup-modal","#stats-modal","#arr-setup-modal","#add-service-modal","#error-log-modal","#logs-modal","#dns-template-modal"];let u=null,h=null,f=null;function b(){try{C(),document.addEventListener("keydown",E),v("[Keyboard Shortcuts] Initialized"),v("[Keyboard Shortcuts] Press Ctrl+K to open quick search"),v("[Keyboard Shortcuts] Press Escape to close modals")}catch(t){console.warn("[Keyboard Shortcuts] Failed to initialize:",t.message)}}function C(){u=document.createElement("div"),u.id="quick-search-modal",u.className="quick-search-modal",u.innerHTML=`
`;const t=document.createElement("style");t.textContent=`
.quick-search-modal {
display: none;
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.7);
z-index: 100000;
justify-content: center;
align-items: flex-start;
padding-top: 15vh;
backdrop-filter: blur(4px);
}
.quick-search-modal.show {
display: flex;
}
.quick-search-content {
background: var(--card-base, #1a1a2e);
border: 1px solid var(--border, #333);
border-radius: 12px;
width: 90%;
max-width: 600px;
box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.5);
overflow: hidden;
}
.quick-search-input-wrapper {
display: flex;
align-items: center;
padding: 16px 20px;
border-bottom: 1px solid var(--border, #333);
gap: 12px;
}
.quick-search-icon {
font-size: 20px;
opacity: 0.6;
}
#quick-search-input {
flex: 1;
background: transparent;
border: none;
outline: none;
color: var(--fg, #fff);
font-size: 18px;
font-family: inherit;
}
#quick-search-input::placeholder {
color: var(--muted, #666);
}
.quick-search-shortcut {
background: var(--card-hover, #2a2a4e);
padding: 4px 8px;
border-radius: 4px;
font-size: 12px;
color: var(--muted, #666);
font-family: monospace;
}
.quick-search-results {
max-height: 400px;
overflow-y: auto;
}
.quick-search-category {
padding: 8px 20px;
font-size: 11px;
font-weight: 600;
text-transform: uppercase;
color: var(--muted, #666);
background: var(--card-hover, #2a2a4e);
letter-spacing: 0.5px;
}
.quick-search-item {
display: flex;
align-items: center;
padding: 12px 20px;
cursor: pointer;
transition: background 0.15s;
gap: 12px;
}
.quick-search-item:hover,
.quick-search-item.selected {
background: var(--accent, #3498db);
}
.quick-search-item-icon {
font-size: 24px;
width: 32px;
text-align: center;
}
.quick-search-item-content {
flex: 1;
}
.quick-search-item-title {
font-weight: 500;
color: var(--fg, #fff);
}
.quick-search-item-description {
font-size: 12px;
color: var(--muted, #aaa);
margin-top: 2px;
}
.quick-search-item-badge {
padding: 2px 8px;
border-radius: 4px;
font-size: 11px;
background: var(--card-hover, #2a2a4e);
color: var(--muted, #888);
}
.quick-search-empty {
padding: 40px 20px;
text-align: center;
color: var(--muted, #666);
}
.quick-search-footer {
display: flex;
justify-content: center;
gap: 24px;
padding: 12px 20px;
border-top: 1px solid var(--border, #333);
background: var(--card-hover, #2a2a4e);
font-size: 12px;
color: var(--muted, #666);
}
.quick-search-footer kbd {
background: var(--card-base, #1a1a2e);
padding: 2px 6px;
border-radius: 4px;
font-family: monospace;
margin-right: 4px;
}
`,document.head.appendChild(t),document.body.appendChild(u),h=document.getElementById("quick-search-input"),f=document.getElementById("quick-search-results"),h.addEventListener("input",e),h.addEventListener("keydown",l),u.addEventListener("click",o=>{o.target===u&&y()})}function E(t){try{if((t.ctrlKey||t.metaKey)&&t.key==="k"){t.preventDefault(),S();return}if(t.key==="Escape"){if(u&&u.classList.contains("show")){y();return}q()}}catch(o){console.warn("[Keyboard Shortcuts] Error handling keydown:",o.message)}}function S(){try{u.classList.add("show"),h.value="",h.focus(),i()}catch(t){console.warn("[Keyboard Shortcuts] Error opening quick search:",t.message)}}function y(){try{u.classList.remove("show"),h.value="",f.innerHTML=""}catch(t){console.warn("[Keyboard Shortcuts] Error closing quick search:",t.message)}}function q(){for(const t of k){const o=document.querySelector(t);if(o&&(o.classList.contains("show")||o.style.display==="flex"))return o.classList.remove("show"),o.style.display="none",!0}return!1}function i(){const t=`
Quick Actions
\u{1F504}
Refresh Dashboard
Refresh all service statuses
\u26A1
Reload Caddy
Reload Caddy configuration
\u2795
Add Service
Open service configuration modal
\u{1F4F1}
App Selector
Deploy new applications
Services
${n()}
`;f.innerHTML=t,s()}function n(){const t=document.querySelectorAll(".card[data-app], #cards .card");let o="";return t.forEach(r=>{const p=r.querySelector(".name")?.textContent||"Unknown",d=r.dataset.status||"unknown",w=r.dataset.app||"";p&&p!=="--"&&(o+=`
${d==="on"?"\u{1F7E2}":"\u{1F534}"}
${p}
Click to open service
${d.toUpperCase()}
`)}),o||'No services found
'}function e(t){try{const o=t.target.value.toLowerCase().trim();if(!o){i();return}const r=a(o);c(r)}catch(o){console.warn("[Keyboard Shortcuts] Error handling search input:",o.message)}}function a(t){const o={actions:[],services:[]};return[{id:"refresh",title:"Refresh Dashboard",icon:"\u{1F504}",keywords:"refresh reload update status"},{id:"reload-caddy",title:"Reload Caddy",icon:"\u26A1",keywords:"reload caddy proxy config"},{id:"add-service",title:"Add Service",icon:"\u2795",keywords:"add new service create"},{id:"app-selector",title:"App Selector",icon:"\u{1F4F1}",keywords:"app deploy install docker container"},{id:"backup",title:"Backup & Restore",icon:"\u{1F4BE}",keywords:"backup restore export import"},{id:"stats",title:"Container Stats",icon:"\u{1F4CA}",keywords:"stats resources cpu memory"},{id:"logs",title:"View Logs",icon:"\u{1F4CB}",keywords:"logs error debug"},{id:"tokens",title:"Manage Tokens",icon:"\u{1F511}",keywords:"tokens api keys credentials"},{id:"notifications",title:"Notifications",icon:"\u{1F514}",keywords:"alerts notifications discord telegram"},{id:"theme",title:"Change Theme",icon:"\u{1F3A8}",keywords:"theme dark light appearance"},{id:"tour",title:"Help Tour",icon:"\u{1F393}",keywords:"help tour guide onboarding"}].forEach(d=>{(d.title.toLowerCase().includes(t)||d.keywords.includes(t))&&o.actions.push(d)}),document.querySelectorAll(".card[data-app], #cards .card").forEach(d=>{const w=d.querySelector(".name")?.textContent||"",L=d.dataset.app||"",g=d.dataset.status||"unknown";(w.toLowerCase().includes(t)||L.toLowerCase().includes(t))&&o.services.push({id:L,title:w,status:g,icon:g==="on"?"\u{1F7E2}":"\u{1F534}"})}),o}function c(t){let o="";t.actions.length>0&&(o+='Actions
',t.actions.forEach(r=>{o+=`
`})),t.services.length>0&&(o+='Services
',t.services.forEach(r=>{o+=`
${r.icon}
${r.status.toUpperCase()}
`})),o||(o='No results found
'),f.innerHTML=o,s()}function s(){f.querySelectorAll(".quick-search-item").forEach((o,r)=>{o.addEventListener("click",()=>m(o)),r===0&&o.classList.add("selected")})}function l(t){try{const o=f.querySelectorAll(".quick-search-item"),r=f.querySelector(".quick-search-item.selected"),p=Array.from(o).indexOf(r);if(t.key==="ArrowDown"){t.preventDefault(),r&&r.classList.remove("selected");const d=(p+1)%o.length;o[d]?.classList.add("selected"),o[d]?.scrollIntoView({block:"nearest"})}else if(t.key==="ArrowUp"){t.preventDefault(),r&&r.classList.remove("selected");const d=p<=0?o.length-1:p-1;o[d]?.classList.add("selected"),o[d]?.scrollIntoView({block:"nearest"})}else t.key==="Enter"&&(t.preventDefault(),r&&m(r))}catch(o){console.warn("[Keyboard Shortcuts] Error handling search navigation:",o.message)}}function m(t){try{const o=t.dataset.action,r=t.dataset.service;switch(y(),o){case"refresh":document.getElementById("refresh")?.click();break;case"reload-caddy":document.getElementById("reload-caddy-top")?.click();break;case"add-service":document.getElementById("add-service")?.click();break;case"app-selector":document.getElementById("add-service-btn")?.click();break;case"backup":document.getElementById("backup-restore-btn")?.click();break;case"stats":document.getElementById("container-stats-btn")?.click();break;case"logs":document.getElementById("view-error-logs")?.click();break;case"tokens":document.getElementById("manage-tokens")?.click();break;case"notifications":document.getElementById("manage-notifications")?.click();break;case"theme":document.getElementById("theme")?.click();break;case"tour":document.getElementById("restart-tour-btn")?.click();break;case"open-service":if(r){const p=document.querySelector(`[data-app="${r}"] [id$="-open"], [data-app="${r}"] button:not(.restart-btn):not(.logs-btn):not(.settings-btn)`);if(p)p.click();else{const d=document.querySelector(`[data-app="${r}"]`);d&&d.click()}}break;default:v("[Keyboard Shortcuts] Unknown action:",o)}}catch(o){console.warn("[Keyboard Shortcuts] Error executing action:",o.message)}}document.readyState==="loading"?document.addEventListener("DOMContentLoaded",b):b(),window.DashCaddyKeyboardShortcuts={openQuickSearch:S,closeQuickSearch:y}})();
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLy8gPT09PT09PT09PSBEQVNIQk9BUkQgSU5JVElBTElaQVRJT04gPT09PT09PT09PVxuKGZ1bmN0aW9uICgpIHtcblxuICBmdW5jdGlvbiBsb2FkQ3VzdG9tU2VydmljZXMoKSB7XG4gICAgY29uc3QgY3VzdG9tU2VydmljZXMgPSBzYWZlR2V0KCdjdXN0b20tc2VydmljZXMnKTtcbiAgICBpZiAoY3VzdG9tU2VydmljZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHNlcnZpY2VzID0gSlNPTi5wYXJzZShjdXN0b21TZXJ2aWNlcyk7XG4gICAgICAgIC8vIE1lcmdlIHdpdGggZGVmYXVsdCBBUFBTLCBhdm9pZGluZyBkdXBsaWNhdGVzXG4gICAgICAgIHNlcnZpY2VzLmZvckVhY2goc2VydmljZSA9PiB7XG4gICAgICAgICAgaWYgKCF3aW5kb3cuQVBQUy5maW5kKGFwcCA9PiBhcHAuaWQgPT09IHNlcnZpY2UuaWQpKSB7XG4gICAgICAgICAgICB3aW5kb3cuQVBQUy5wdXNoKHNlcnZpY2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIGxvYWQgY3VzdG9tIHNlcnZpY2VzOicsIGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEluaXRpYWxpemUgY3VzdG9tIHNlcnZpY2VzIGltbWVkaWF0ZWx5IHNvIHdpbmRvdy5BUFBTIGlzIHBvcHVsYXRlZCBiZWZvcmUgYnVpbGRHcmlkIHJ1bnNcbiAgbG9hZEN1c3RvbVNlcnZpY2VzKCk7XG5cbiAgLy8gU3RhZ2dlcmVkIGFuaW1hdGlvbiBmb3IgdG9wIGNhcmRzIHRvb1xuICBmdW5jdGlvbiBhbmltYXRlVG9wQ2FyZHMoKSB7XG4gICAgY29uc3QgdG9wQ2FyZHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudG9wIC5jYXJkJyk7XG4gICAgdG9wQ2FyZHMuZm9yRWFjaCgoY2FyZCwgaW5kZXgpID0+IHtcbiAgICAgIGNhcmQuc3R5bGUudHJhbnNpdGlvbkRlbGF5ID0gYCR7TWF0aC5taW4oaW5kZXggKiA2MCwgMzAwKX1tc2A7XG4gICAgfSk7XG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIHRvcENhcmRzLmZvckVhY2goY2FyZCA9PiBjYXJkLmNsYXNzTGlzdC5hZGQoJ2xvYWRlZCcpKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlZ2lzdGVyU2VydmljZVdvcmtlcigpIHtcbiAgICBpZiAoISgnc2VydmljZVdvcmtlcicgaW4gbmF2aWdhdG9yKSkgcmV0dXJuO1xuICAgIGlmICghd2luZG93LmlzU2VjdXJlQ29udGV4dCAmJiBsb2NhdGlvbi5ob3N0bmFtZSAhPT0gJ2xvY2FsaG9zdCcgJiYgbG9jYXRpb24uaG9zdG5hbWUgIT09ICcxMjcuMC4wLjEnKSByZXR1cm47XG5cbiAgICBjb25zdCByZWdpc3RlciA9ICgpID0+IHtcbiAgICAgIG5hdmlnYXRvci5zZXJ2aWNlV29ya2VyLnJlZ2lzdGVyKCcvc3cuanMnLCB7IHVwZGF0ZVZpYUNhY2hlOiAnbm9uZScgfSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnNvbGUud2FybignW2luaXRdIFNlcnZpY2Ugd29ya2VyIHJlZ2lzdHJhdGlvbiBmYWlsZWQ6JywgZXJyb3IpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnY29tcGxldGUnKSB7XG4gICAgICByZWdpc3RlcigpO1xuICAgIH0gZWxzZSB7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIHJlZ2lzdGVyLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gSW5pdGlhbGl6ZSBkYXNoYm9hcmQgKGNhbGxlZCBhZnRlciBUT1RQIGdhdGUgY2hlY2sgb3IgZGlyZWN0bHkgaWYgVE9UUCBkaXNhYmxlZClcbiAgLy8gTk9URTogbG9hZFNlcnZpY2VzIGNvbWVzIGZyb20gd2luZG93LmxvYWRTZXJ2aWNlcyAoZXhwb3J0ZWQgYnkgZ3JpZC5qcylcbiAgbGV0IF9kYXNoYm9hcmRJbml0aWFsaXplZCA9IGZhbHNlO1xuICBhc3luYyBmdW5jdGlvbiBpbml0aWFsaXplRGFzaGJvYXJkKCkge1xuICAgIGlmIChfZGFzaGJvYXJkSW5pdGlhbGl6ZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybignW2luaXRdIGluaXRpYWxpemVEYXNoYm9hcmQgY2FsbGVkIGFnYWluLCBza2lwcGluZyBkdXBsaWNhdGUnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgX2Rhc2hib2FyZEluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICBhd2FpdCB3aW5kb3cubG9hZFNlcnZpY2VzKCk7XG4gICAgYXdhaXQgbG9hZFRlbXBsYXRlQ2F0ZWdvcmllcygpO1xuICAgIHdpbmRvdy5idWlsZEdyaWQoKTtcbiAgICBhbmltYXRlVG9wQ2FyZHMoKTtcbiAgICB3aW5kb3cucmVmcmVzaEFsbCgpO1xuICAgIHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIC8vIFN0b3AgcG9sbGluZyBpZiB0aGUgc2Vzc2lvbiBoYXMgYmVlbiBpbnZhbGlkYXRlZCAoZS5nLiBUT1RQIGdhdGVcbiAgICAgIC8vIG5vdyBhY3RpdmUsIG9yIHVzZXIgbG9nZ2VkIG91dCkuIEF2b2lkcyByZWxlbnRsZXNzIDQwMS80MDMgbm9pc2UuXG4gICAgICBpZiAod2luZG93Ll9kY0F1dGhMb3N0KSByZXR1cm47XG4gICAgICB3aW5kb3cucmVmcmVzaEFsbCgpO1xuICAgIH0sIERDLlBPTEwuREFTSEJPQVJEKTtcbiAgICBpZiAodHlwZW9mIHdpbmRvdy5yZWZyZXNoQ3JlZHNCdXR0b25zID09PSAnZnVuY3Rpb24nKSB3aW5kb3cucmVmcmVzaENyZWRzQnV0dG9ucygpO1xuICAgIGlmICh0eXBlb2Ygd2luZG93LnJlZnJlc2hNb25pdG9yaW5nV2lkZ2V0cyA9PT0gJ2Z1bmN0aW9uJykgd2luZG93LnJlZnJlc2hNb25pdG9yaW5nV2lkZ2V0cygpO1xuICAgIC8vIFVwZGF0ZSBhdXRoIGNhcmQgKG1heSBoYXZlIGFscmVhZHkgYmVlbiB1cGRhdGVkIGJ5IHRoZSBhdXRvLWxvYWQgSUlGRSBidXQgZW5zdXJlIGl0J3MgY29ycmVjdClcbiAgICBpZiAodHlwZW9mIHdpbmRvdy5fdXBkYXRlQXV0aENhcmQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHIgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS90b3RwL2NvbmZpZycsIHsgY2FjaGU6ICduby1zdG9yZScgfSk7XG4gICAgICAgIGNvbnN0IGQgPSBhd2FpdCByLmpzb24oKTtcbiAgICAgICAgaWYgKGQuc3VjY2Vzcykgd2luZG93Ll91cGRhdGVBdXRoQ2FyZChkLmNvbmZpZy5lbmFibGVkICYmIGQuY29uZmlnLmlzU2V0VXAsIGQuY29uZmlnLnNlc3Npb25EdXJhdGlvbik7XG4gICAgICB9IGNhdGNoIChlKSB7IC8qIGlnbm9yZSAqLyB9XG4gICAgfVxuICAgIGlmICh3aW5kb3cuX19kYXNoY2FkZHlTaXRlQ29uZmlnTG9hZGVkKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB3aW5kb3cuX19kYXNoY2FkZHlTaXRlQ29uZmlnTG9hZGVkO1xuICAgICAgfSBjYXRjaCAoXykgeyAvKiBpZ25vcmUgKi8gfVxuICAgIH1cbiAgICAvLyBMYXp5LWxvYWQgb25ib2FyZGluZyBvbmx5IG9uY2UgcGVyIGluc3RhbGwsIG90aGVyd2lzZSBqdXN0IGFkZCB0aGUgdG91ciBidXR0b25cbiAgICBhZGRUb3VyQnV0dG9uKCk7XG4gICAgaWYgKHNob3VsZExvYWRPbmJvYXJkaW5nKCkpIHtcbiAgICAgIGxvYWRPbmJvYXJkaW5nKCk7XG4gICAgfVxuXG4gICAgLy8gREMtMDQ4OiBpbmplY3QgdGhlIFwiQWRtaW5cIiB0cmlnZ2VyIGJ1dHRvbiBpbnRvIHRoZSB0b3AgYmFyLiBUaGVcbiAgICAvLyBidXR0b24gb25seSByZW5kZXJzIHdoZW4gL21lIHJldHVybnMgaXNBZG1pbj10cnVlOyB0aGUgbW9kdWxlXG4gICAgLy8gcmUtY2hlY2tzIGV2ZXJ5IDYwcyBzbyBhIHBlcm1pc3Npb24gZG93bmdyYWRlIHRha2VzIGVmZmVjdC5cbiAgICBpZiAod2luZG93LkFkbWluUGFuZWwgJiYgdHlwZW9mIHdpbmRvdy5BZG1pblBhbmVsLmF0dGFjaFRyaWdnZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHdpbmRvdy5BZG1pblBhbmVsLmF0dGFjaFRyaWdnZXIoZG9jdW1lbnQuYm9keSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW2luaXRdIEFkbWluUGFuZWwgYXR0YWNoVHJpZ2dlciBmYWlsZWQ6JywgZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gTGF6eS1sb2FkIG9uYm9hcmRpbmcgYnVuZGxlICg1MiBLQikgXHUyMDE0IG9ubHkgbG9hZGVkIHdoZW4gbmVlZGVkXG4gIGZ1bmN0aW9uIGxvYWRPbmJvYXJkaW5nKCkge1xuICAgIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdzY3JpcHRbc3JjPVwiL2Rpc3Qvb25ib2FyZGluZy5qc1wiXScpKSByZXR1cm47IC8vIGFscmVhZHkgbG9hZGluZy9sb2FkZWRcbiAgICBjb25zdCBzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgcy5zcmMgPSAnL2Rpc3Qvb25ib2FyZGluZy5qcyc7XG4gICAgcy5kZWZlciA9IHRydWU7XG4gICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzKTtcbiAgICAvLyBBbHNvIGxvYWQgb25ib2FyZGluZyBDU1MgaWYgbm90IGFscmVhZHkgcHJlc2VudFxuICAgIGlmICghZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbGlua1tocmVmPVwiL2Nzcy9kcml2ZXIubWluLmNzc1wiXScpKSB7XG4gICAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGluaycpO1xuICAgICAgbGluay5yZWwgPSAnc3R5bGVzaGVldCc7XG4gICAgICBsaW5rLmhyZWYgPSAnL2Nzcy9kcml2ZXIubWluLmNzcyc7XG4gICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGxpbmspO1xuICAgIH1cbiAgICBpZiAoIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2xpbmtbaHJlZj1cIi9jc3Mvb25ib2FyZGluZy5jc3NcIl0nKSkge1xuICAgICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTtcbiAgICAgIGxpbmsucmVsID0gJ3N0eWxlc2hlZXQnO1xuICAgICAgbGluay5ocmVmID0gJy9jc3Mvb25ib2FyZGluZy5jc3MnO1xuICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChsaW5rKTtcbiAgICB9XG4gIH1cblxuICAvLyBDaGVjayBpZiBvbmJvYXJkaW5nIHNob3VsZCBhdXRvLXN0YXJ0IChmaXJzdC10aW1lIHVzZXIpXG4gIGZ1bmN0aW9uIHNob3VsZExvYWRPbmJvYXJkaW5nKCkge1xuICAgIGlmICh0eXBlb2YgU0lURSAhPT0gJ3VuZGVmaW5lZCcgJiYgU0lURS5vbmJvYXJkaW5nQ29tcGxldGVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZGFzaGNhZGR5X29uYm9hcmRpbmcnKSk7XG4gICAgICByZXR1cm4gIWRhdGEgfHwgKCFkYXRhLnRvdXJDb21wbGV0ZWQgJiYgZGF0YS5jdXJyZW50U3RlcCA9PT0gMCk7XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgcmV0dXJuIHRydWU7IC8vIE5vIGRhdGEgbWVhbnMgZmlyc3QtdGltZSB1c2VyXG4gICAgfVxuICB9XG5cbiAgLy8gPT09PT0gQ29sbGFwc2libGUgdG9vbGJhciBzZWN0aW9ucyA9PT09PVxuICBmdW5jdGlvbiBpbml0VG9vbGJhclNlY3Rpb25zKCkge1xuICAgIGNvbnN0IHNlY3Rpb25zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnRvb2xzLXNlY3Rpb24nKTtcbiAgICBpZiAoIXNlY3Rpb25zLmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgLy8gUmVzdG9yZSBzYXZlZCBzdGF0ZSBmcm9tIGxvY2FsU3RvcmFnZVxuICAgIGxldCBzYXZlZCA9IHt9O1xuICAgIHRyeSB7IHNhdmVkID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndG9vbGJhci1zZWN0aW9ucycpIHx8ICd7fScpOyB9IGNhdGNoIChfKSB7fVxuXG4gICAgc2VjdGlvbnMuZm9yRWFjaChzZWN0aW9uID0+IHtcbiAgICAgIGNvbnN0IGtleSA9IHNlY3Rpb24uZGF0YXNldC5zZWN0aW9uO1xuICAgICAgY29uc3QgaGVhZGVyID0gc2VjdGlvbi5xdWVyeVNlbGVjdG9yKCcudG9vbHMtc2VjdGlvbi1oZWFkZXInKTtcbiAgICAgIGlmICghaGVhZGVyKSByZXR1cm47XG5cbiAgICAgIC8vIFJlc3RvcmUgc3RhdGUgKGRlZmF1bHQ6IGNvbGxhcHNlZClcbiAgICAgIGlmIChzYXZlZFtrZXldKSB7XG4gICAgICAgIHNlY3Rpb24uY2xhc3NMaXN0LmFkZCgnb3BlbicpO1xuICAgICAgICBoZWFkZXIuc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgJ3RydWUnKTtcbiAgICAgIH1cblxuICAgICAgaGVhZGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBjb25zdCBpc09wZW4gPSBzZWN0aW9uLmNsYXNzTGlzdC50b2dnbGUoJ29wZW4nKTtcbiAgICAgICAgaGVhZGVyLnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsIGlzT3BlbiA/ICd0cnVlJyA6ICdmYWxzZScpO1xuXG4gICAgICAgIC8vIFNhdmUgc3RhdGVcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB7fTtcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnRvb2xzLXNlY3Rpb24nKS5mb3JFYWNoKHMgPT4ge1xuICAgICAgICAgIHN0YXRlW3MuZGF0YXNldC5zZWN0aW9uXSA9IHMuY2xhc3NMaXN0LmNvbnRhaW5zKCdvcGVuJyk7XG4gICAgICAgIH0pO1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndG9vbGJhci1zZWN0aW9ucycsIEpTT04uc3RyaW5naWZ5KHN0YXRlKSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIEluaXRpYWxpemUgdG9vbGJhciBzZWN0aW9ucyBvbiBET00gcmVhZHlcbiAgaW5pdFRvb2xiYXJTZWN0aW9ucygpO1xuXG4gIC8vIEFkZCByZXN0YXJ0IHRvdXIgYnV0dG9uIChsb2FkcyBidW5kbGUgb24gY2xpY2sgaWYgbm90IGxvYWRlZClcbiAgLy8gVmlzaWJsZSBpbiBwcmltYXJ5IHRvb2xiYXIgdW50aWwgdG91ciBjb21wbGV0ZWQgb25jZSwgdGhlbiBtb3ZlcyB0byBBZG1pbiBzZWN0aW9uXG4gIGZ1bmN0aW9uIGFkZFRvdXJCdXR0b24oKSB7XG4gICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXN0YXJ0LXRvdXItYnRuJykpIHJldHVybjtcblxuICAgIGxldCB0b3VyRG9uZSA9IHR5cGVvZiBTSVRFICE9PSAndW5kZWZpbmVkJyAmJiBTSVRFLm9uYm9hcmRpbmdDb21wbGV0ZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdkYXNoY2FkZHlfb25ib2FyZGluZycpKTtcbiAgICAgIHRvdXJEb25lID0gdG91ckRvbmUgfHwgISEoZGF0YSAmJiBkYXRhLnRvdXJDb21wbGV0ZWQpO1xuICAgIH0gY2F0Y2ggKF8pIHt9XG5cbiAgICAvLyBCZWZvcmUgZmlyc3QgY29tcGxldGlvbjogc2hvdyBpbiBwcmltYXJ5IHRvb2xiYXIuIEFmdGVyOiB0dWNrIGludG8gQWRtaW4gc2VjdGlvbi5cbiAgICBjb25zdCB0YXJnZXQgPSB0b3VyRG9uZVxuICAgICAgPyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudG9vbHMtc2VjdGlvbltkYXRhLXNlY3Rpb249XCJhZG1pblwiXSAudG9vbHMtc2VjdGlvbi1pdGVtcycpXG4gICAgICA6IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy50b29scy1wcmltYXJ5Jyk7XG4gICAgaWYgKCF0YXJnZXQpIHJldHVybjtcblxuICAgIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgIGJ1dHRvbi5pZCA9ICdyZXN0YXJ0LXRvdXItYnRuJztcbiAgICBidXR0b24udGV4dENvbnRlbnQgPSB0b3VyRG9uZSA/ICdIZWxwIFRvdXInIDogJ1x1RDgzQ1x1REY5MyBIZWxwIFRvdXInO1xuICAgIGJ1dHRvbi50aXRsZSA9ICdSZXN0YXJ0IHRoZSBvbmJvYXJkaW5nIHRvdXInO1xuICAgIGJ1dHRvbi5vbmNsaWNrID0gKCkgPT4ge1xuICAgICAgaWYgKHdpbmRvdy5EYXNoQ2FkZHlPbmJvYXJkaW5nKSB7XG4gICAgICAgIHdpbmRvdy5EYXNoQ2FkZHlPbmJvYXJkaW5nLnJlc3RhcnRUb3VyKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2FkT25ib2FyZGluZygpO1xuICAgICAgICAvLyBXYWl0IGZvciBidW5kbGUgdG8gbG9hZCwgdGhlbiBzdGFydFxuICAgICAgICBjb25zdCBjaGVjayA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICBpZiAod2luZG93LkRhc2hDYWRkeU9uYm9hcmRpbmcpIHtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoY2hlY2spO1xuICAgICAgICAgICAgd2luZG93LkRhc2hDYWRkeU9uYm9hcmRpbmcucmVzdGFydFRvdXIoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIDEwMCk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gY2xlYXJJbnRlcnZhbChjaGVjayksIDUwMDApOyAvLyBnaXZlIHVwIGFmdGVyIDVzXG4gICAgICB9XG4gICAgfTtcbiAgICB0YXJnZXQuYXBwZW5kQ2hpbGQoYnV0dG9uKTtcbiAgfVxuXG4gIHdpbmRvdy5pbml0aWFsaXplRGFzaGJvYXJkID0gaW5pdGlhbGl6ZURhc2hib2FyZDtcbiAgd2luZG93LmxvYWRDdXN0b21TZXJ2aWNlcyA9IGxvYWRDdXN0b21TZXJ2aWNlcztcbiAgcmVnaXN0ZXJTZXJ2aWNlV29ya2VyKCk7XG5cbiAgLy8gPT09PT0gVEVNUExBVEUgQ0FURUdPUklFUyA9PT09PVxuICAvLyBDYWNoZWQgdGVtcGxhdGUgY2F0ZWdvcmllcyBmcm9tIC9hcGkvdjEvdGVtcGxhdGVzIGZvciB1c2UgYWNyb3NzIHRoZSBVSVxuICAvLyAoc2VydmljZSBjcmVhdGUvZWRpdCwgZmlsdGVyIGRyb3Bkb3duLCBjYXRlZ29yeSBiYWRnZXMsIGV0Yy4pXG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRUZW1wbGF0ZUNhdGVnb3JpZXMoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHIgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS90ZW1wbGF0ZXMnLCB7IGNhY2hlOiAnbm8tc3RvcmUnIH0pO1xuICAgICAgaWYgKCFyLm9rKSByZXR1cm47XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgci5qc29uKCk7XG4gICAgICBpZiAoZGF0YSAmJiBkYXRhLmNhdGVnb3JpZXMpIHtcbiAgICAgICAgd2luZG93LkRDX0NBVEVHT1JJRVMgPSBkYXRhLmNhdGVnb3JpZXM7XG4gICAgICAgIC8vIEFsc28gZXhwb3NlIHZpYSBnbG9iYWxzLmpzIGNvbnN0YW50IGZvciBjb252ZW5pZW5jZVxuICAgICAgICBpZiAodHlwZW9mIERDICE9PSAndW5kZWZpbmVkJykgREMuQ0FURUdPUklFUyA9IGRhdGEuY2F0ZWdvcmllcztcbiAgICAgICAgLy8gUG9wdWxhdGUgYW55IGNhdGVnb3J5IDxzZWxlY3Q+IHRoYXQncyBhbHJlYWR5IGluIHRoZSBET01cbiAgICAgICAgcG9wdWxhdGVDYXRlZ29yeVNlbGVjdHMoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tpbml0XSBGYWlsZWQgdG8gbG9hZCB0ZW1wbGF0ZSBjYXRlZ29yaWVzOicsIGUpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHBvcHVsYXRlQ2F0ZWdvcnlTZWxlY3RzKCkge1xuICAgIGNvbnN0IGNhdHMgPSB3aW5kb3cuRENfQ0FURUdPUklFUyB8fCAodHlwZW9mIERDICE9PSAndW5kZWZpbmVkJyAmJiBEQy5DQVRFR09SSUVTKTtcbiAgICBpZiAoIWNhdHMpIHJldHVybjtcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdzZWxlY3RbZGF0YS1yb2xlPVwic2VydmljZS1jYXRlZ29yeVwiXScpLmZvckVhY2goc2VsZWN0ID0+IHtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSBzZWxlY3QuZGF0YXNldC5jdXJyZW50IHx8ICcnO1xuICAgICAgLy8gQ2xlYXIgb3B0aW9ucyBidXQga2VlcCB0aGUgZmlyc3QgKHBsYWNlaG9sZGVyKVxuICAgICAgY29uc3QgcGxhY2Vob2xkZXIgPSBzZWxlY3QucXVlcnlTZWxlY3Rvcignb3B0aW9uW3ZhbHVlPVwiXCJdJyk7XG4gICAgICBzZWxlY3QuaW5uZXJIVE1MID0gJyc7XG4gICAgICBpZiAocGxhY2Vob2xkZXIpIHNlbGVjdC5hcHBlbmRDaGlsZChwbGFjZWhvbGRlcik7XG4gICAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgcGggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24nKTtcbiAgICAgICAgcGgudmFsdWUgPSAnJztcbiAgICAgICAgcGgudGV4dENvbnRlbnQgPSAnXHUyMDE0IFNlbGVjdCBjYXRlZ29yeSBcdTIwMTQnO1xuICAgICAgICBzZWxlY3QuYXBwZW5kQ2hpbGQocGgpO1xuICAgICAgfVxuICAgICAgT2JqZWN0LmVudHJpZXMoY2F0cykuZm9yRWFjaCgoW25hbWUsIGluZm9dKSA9PiB7XG4gICAgICAgIGNvbnN0IG9wdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpO1xuICAgICAgICBvcHQudmFsdWUgPSBuYW1lO1xuICAgICAgICBvcHQudGV4dENvbnRlbnQgPSBgJHtpbmZvLmljb24gfHwgJyd9ICR7bmFtZX1gLnRyaW0oKTtcbiAgICAgICAgaWYgKG5hbWUgPT09IGN1cnJlbnQpIG9wdC5zZWxlY3RlZCA9IHRydWU7XG4gICAgICAgIHNlbGVjdC5hcHBlbmRDaGlsZChvcHQpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBBbGxvdyBvdGhlciBtb2R1bGVzIHRvIHJlLXJ1biBwb3B1bGF0aW9uIGFmdGVyIHRoZXkgKHJlKWluamVjdCBzZWxlY3RzXG4gIHdpbmRvdy5wb3B1bGF0ZUNhdGVnb3J5U2VsZWN0cyA9IHBvcHVsYXRlQ2F0ZWdvcnlTZWxlY3RzO1xuICB3aW5kb3cubG9hZFRlbXBsYXRlQ2F0ZWdvcmllcyA9IGxvYWRUZW1wbGF0ZUNhdGVnb3JpZXM7XG5cbiAgLy8gVE9UUC1nYXRlZCBpbml0aWFsaXphdGlvblxuICAoYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0b3RwUmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvdG90cC9jb25maWcnLCB7IGNhY2hlOiAnbm8tc3RvcmUnIH0pO1xuICAgICAgY29uc3QgdG90cERhdGEgPSBhd2FpdCB0b3RwUmVzLmpzb24oKTtcblxuICAgICAgaWYgKHRvdHBEYXRhLnN1Y2Nlc3MgJiYgdG90cERhdGEuY29uZmlnLmVuYWJsZWQpIHtcbiAgICAgICAgLy8gVE9UUCBpcyBlbmFibGVkIC0gY2hlY2sgaWYgd2UgaGF2ZSBhIHZhbGlkIHNlc3Npb25cbiAgICAgICAgY29uc3QgdGVzdFJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL3RvdHAvY2hlY2stc2Vzc2lvbicsIHsgY2FjaGU6ICduby1zdG9yZScgfSk7XG4gICAgICAgIGlmICh0ZXN0UmVzLnN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgLy8gTmVlZCBUT1RQIHZlcmlmaWNhdGlvbiAtIHNob3cgb3ZlcmxheVxuICAgICAgICAgIHdpbmRvdy5fc2hvd1RvdHBPdmVybGF5KCk7XG4gICAgICAgICAgcmV0dXJuOyAvLyBpbml0aWFsaXplRGFzaGJvYXJkKCkgd2lsbCBiZSBjYWxsZWQgYWZ0ZXIgc3VjY2Vzc2Z1bCB2ZXJpZmljYXRpb25cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUud2FybignVE9UUCBjaGVjayBmYWlsZWQsIHByb2NlZWRpbmcgbm9ybWFsbHk6JywgZSk7XG4gICAgfVxuXG4gICAgLy8gVE9UUCBkaXNhYmxlZCBvciBzZXNzaW9uIHZhbGlkIC0gaW5pdGlhbGl6ZSBpbW1lZGlhdGVseVxuICAgIGluaXRpYWxpemVEYXNoYm9hcmQoKTtcbiAgfSkoKTtcblxufSkoKTtcbjtcbi8vID09PT09PT09PT0gTU9OSVRPUklORyBXSURHRVRTID09PT09PT09PT1cbi8vIEVtYmVkcyBhIGNvbXBhY3Qgc3lzdGVtLXJlc291cmNlICsgaGVhbHRoIHN1bW1hcnkgcGFuZWwgZGlyZWN0bHkgb24gdGhlXG4vLyBtYWluIGRhc2hib2FyZC4gUmVwbGFjZXMgdGhlIG5lZWQgZm9yIGEgc2VwYXJhdGUgbW9uaXRvcmluZy1kYXNoYm9hcmQuaHRtbFxuLy8gcGFnZSBcdTIwMTQgcXVpY2sgYXQtYS1nbGFuY2Ugc3RhdHMgd2hlcmUgeW91IGFscmVhZHkgYXJlLlxuKGZ1bmN0aW9uICgpIHtcblxuICAvLyAtLS0tLSBTdHlsZSBpbmplY3Rpb24gKHNjb3BlZCB0byAuZGMtbW9uaXRvciBzbyBpdCBkb2Vzbid0IGxlYWspIC0tLS0tXG4gIGNvbnN0IHN0eWxlRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICBzdHlsZUVsLnRleHRDb250ZW50ID0gYFxuICAgIC5kYy1tb25pdG9yIHtcbiAgICAgIGRpc3BsYXk6IGdyaWQ7XG4gICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdChhdXRvLWZpdCwgbWlubWF4KDIyMHB4LCAxZnIpKTtcbiAgICAgIGdhcDogMTJweDtcbiAgICAgIG1hcmdpbi1ib3R0b206IDE2cHg7XG4gICAgICBwYWRkaW5nOiAxMnB4IDE2cHg7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cyk7XG4gICAgfVxuICAgIC5kYy1tb25pdG9yLWNhcmQge1xuICAgICAgcGFkZGluZzogMTBweCAxMnB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iZywgcmdiYSgyNTUsMjU1LDI1NSwwLjA0KSk7XG4gICAgICBib3JkZXItcmFkaXVzOiA4cHg7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1xuICAgIH1cbiAgICAuZGMtbW9uaXRvci1sYWJlbCB7XG4gICAgICBmb250LXNpemU6IDAuN3JlbTtcbiAgICAgIGNvbG9yOiB2YXIoLS1tdXRlZCk7XG4gICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuNXB4O1xuICAgICAgbWFyZ2luLWJvdHRvbTogNHB4O1xuICAgIH1cbiAgICAuZGMtbW9uaXRvci12YWx1ZSB7XG4gICAgICBmb250LXNpemU6IDEuNHJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICBjb2xvcjogdmFyKC0tZmcpO1xuICAgIH1cbiAgICAuZGMtbW9uaXRvci1zdWIge1xuICAgICAgZm9udC1zaXplOiAwLjdyZW07XG4gICAgICBjb2xvcjogdmFyKC0tbXV0ZWQpO1xuICAgICAgbWFyZ2luLXRvcDogNHB4O1xuICAgIH1cbiAgICAuZGMtbW9uaXRvci1iYXIge1xuICAgICAgbWFyZ2luLXRvcDogNnB4O1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBoZWlnaHQ6IDRweDtcbiAgICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tdXRlZCkgMjAlLCB0cmFuc3BhcmVudCk7XG4gICAgICBib3JkZXItcmFkaXVzOiAycHg7XG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIH1cbiAgICAuZGMtbW9uaXRvci1iYXItZmlsbCB7XG4gICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICB3aWR0aDogMCU7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1vay1mZywgIzI3YWU2MCk7XG4gICAgICB0cmFuc2l0aW9uOiB3aWR0aCAwLjNzIGVhc2UsIGJhY2tncm91bmQgMC4zcyBlYXNlO1xuICAgIH1cbiAgICAuZGMtbW9uaXRvci1iYXItZmlsbC53YXJuIHsgYmFja2dyb3VuZDogI2YzOWMxMjsgfVxuICAgIC5kYy1tb25pdG9yLWJhci1maWxsLmJhZCAgeyBiYWNrZ3JvdW5kOiAjZTc0YzNjOyB9XG4gICAgLmRjLW1vbml0b3ItaGVhZGVyIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgICAgbWFyZ2luLWJvdHRvbTogOHB4O1xuICAgIH1cbiAgICAuZGMtbW9uaXRvci10aXRsZSB7XG4gICAgICBmb250LXNpemU6IDAuODVyZW07XG4gICAgICBmb250LXdlaWdodDogNTAwO1xuICAgICAgY29sb3I6IHZhcigtLW11dGVkKTtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA2cHg7XG4gICAgfVxuICAgIC5kYy1tb25pdG9yLXBpbGwge1xuICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA0cHg7XG4gICAgICBwYWRkaW5nOiAycHggOHB4O1xuICAgICAgYm9yZGVyLXJhZGl1czogOTk5cHg7XG4gICAgICBmb250LXNpemU6IDAuN3JlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG4gICAgfVxuICAgIC5kYy1tb25pdG9yLXBpbGwub2sgICB7IGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCAjMjdhZTYwIDIwJSwgdHJhbnNwYXJlbnQpOyBjb2xvcjogIzI3YWU2MDsgfVxuICAgIC5kYy1tb25pdG9yLXBpbGwud2FybiB7IGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCAjZjM5YzEyIDIwJSwgdHJhbnNwYXJlbnQpOyBjb2xvcjogI2YzOWMxMjsgfVxuICAgIC5kYy1tb25pdG9yLXBpbGwuYmFkICB7IGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCAjZTc0YzNjIDIwJSwgdHJhbnNwYXJlbnQpOyBjb2xvcjogI2U3NGMzYzsgfVxuICAgIC5kYy1tb25pdG9yLXJlZnJlc2gge1xuICAgICAgZm9udC1zaXplOiAwLjdyZW07XG4gICAgICBjb2xvcjogdmFyKC0tbXV0ZWQpO1xuICAgICAgb3BhY2l0eTogMC43O1xuICAgIH1cbiAgYDtcbiAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzdHlsZUVsKTtcblxuICAvLyAtLS0tLSBDb250YWluZXIgZWxlbWVudCAoaW5zZXJ0ZWQgYWJvdmUgc2VydmljZS1maWx0ZXItYmFyKSAtLS0tLVxuICBjb25zdCBmaWx0ZXJCYXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS1maWx0ZXItYmFyJyk7XG4gIGlmICghZmlsdGVyQmFyKSByZXR1cm47XG5cbiAgY29uc3QgcGFuZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgcGFuZWwuY2xhc3NOYW1lID0gJ2RjLW1vbml0b3InO1xuICBwYW5lbC5pZCA9ICdkYy1tb25pdG9yLXBhbmVsJztcbiAgcGFuZWwuaW5uZXJIVE1MID0gYFxuICAgIDxkaXYgY2xhc3M9XCJkYy1tb25pdG9yLWhlYWRlclwiIHN0eWxlPVwiZ3JpZC1jb2x1bW46IDEgLyAtMTtcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkYy1tb25pdG9yLXRpdGxlXCI+XHVEODNEXHVEQ0NBIFN5c3RlbSBPdmVydmlldzwvZGl2PlxuICAgICAgPHNwYW4gY2xhc3M9XCJkYy1tb25pdG9yLXJlZnJlc2hcIiBpZD1cImRjLW1vbml0b3ItcmVmcmVzaC1zdGFtcFwiPlx1MjAxNDwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZGMtbW9uaXRvci1jYXJkXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGMtbW9uaXRvci1sYWJlbFwiPlNlcnZpY2VzPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGMtbW9uaXRvci12YWx1ZVwiIGlkPVwiZGMtbW9uaXRvci1zZXJ2aWNlc1wiPlx1MjAxNDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImRjLW1vbml0b3Itc3ViXCIgaWQ9XCJkYy1tb25pdG9yLXNlcnZpY2VzLXN1YlwiPmxvYWRpbmdcdTIwMjY8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZGMtbW9uaXRvci1jYXJkXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGMtbW9uaXRvci1sYWJlbFwiPkNvbnRhaW5lcnMgVXA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkYy1tb25pdG9yLXZhbHVlXCIgaWQ9XCJkYy1tb25pdG9yLWNvbnRhaW5lcnNcIj5cdTIwMTQ8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkYy1tb25pdG9yLXN1YlwiIGlkPVwiZGMtbW9uaXRvci1jb250YWluZXJzLXN1YlwiPmxvYWRpbmdcdTIwMjY8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZGMtbW9uaXRvci1jYXJkXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGMtbW9uaXRvci1sYWJlbFwiPkF2ZyBDUFU8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkYy1tb25pdG9yLXZhbHVlXCIgaWQ9XCJkYy1tb25pdG9yLWNwdVwiPlx1MjAxNDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImRjLW1vbml0b3ItYmFyXCI+PGRpdiBjbGFzcz1cImRjLW1vbml0b3ItYmFyLWZpbGxcIiBpZD1cImRjLW1vbml0b3ItY3B1LWJhclwiPjwvZGl2PjwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJkYy1tb25pdG9yLWNhcmRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkYy1tb25pdG9yLWxhYmVsXCI+QXZnIE1lbW9yeTwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImRjLW1vbml0b3ItdmFsdWVcIiBpZD1cImRjLW1vbml0b3ItbWVtXCI+XHUyMDE0PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGMtbW9uaXRvci1iYXJcIj48ZGl2IGNsYXNzPVwiZGMtbW9uaXRvci1iYXItZmlsbFwiIGlkPVwiZGMtbW9uaXRvci1tZW0tYmFyXCI+PC9kaXY+PC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImRjLW1vbml0b3ItY2FyZFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImRjLW1vbml0b3ItbGFiZWxcIj5IZWFsdGg8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkYy1tb25pdG9yLXZhbHVlXCIgaWQ9XCJkYy1tb25pdG9yLWhlYWx0aFwiPlx1MjAxNDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImRjLW1vbml0b3Itc3ViXCIgaWQ9XCJkYy1tb25pdG9yLWhlYWx0aC1zdWJcIj5cdTIwMTQ8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYDtcbiAgLy8gSW5zZXJ0IEFCT1ZFIHRoZSBmaWx0ZXIgYmFyXG4gIGZpbHRlckJhci5wYXJlbnROb2RlLmluc2VydEJlZm9yZShwYW5lbCwgZmlsdGVyQmFyKTtcblxuICAvLyAtLS0tLSBIZWxwZXJzIC0tLS0tXG4gIGZ1bmN0aW9uIHNldEJhcihpZCwgcGN0KSB7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgIGNvbnN0IHAgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxMDAsIE51bWJlcihwY3QpIHx8IDApKTtcbiAgICBlbC5zdHlsZS53aWR0aCA9IHAgKyAnJSc7XG4gICAgZWwuY2xhc3NMaXN0LnJlbW92ZSgnd2FybicsICdiYWQnKTtcbiAgICBpZiAocCA+PSA4NSkgZWwuY2xhc3NMaXN0LmFkZCgnYmFkJyk7XG4gICAgZWxzZSBpZiAocCA+PSA2NSkgZWwuY2xhc3NMaXN0LmFkZCgnd2FybicpO1xuICB9XG5cbiAgZnVuY3Rpb24gZm10UGN0KHYpIHtcbiAgICBpZiAodiA9PSBudWxsIHx8IGlzTmFOKHYpKSByZXR1cm4gJ1x1MjAxNCc7XG4gICAgcmV0dXJuIChNYXRoLnJvdW5kKHYgKiAxMCkgLyAxMCkgKyAnJSc7XG4gIH1cblxuICBmdW5jdGlvbiBmbXRCeXRlcyhiKSB7XG4gICAgaWYgKGIgPT0gbnVsbCB8fCBpc05hTihiKSkgcmV0dXJuICdcdTIwMTQnO1xuICAgIGNvbnN0IHVuaXRzID0gWydCJywgJ0tCJywgJ01CJywgJ0dCJywgJ1RCJ107XG4gICAgbGV0IGkgPSAwO1xuICAgIHdoaWxlIChiID49IDEwMjQgJiYgaSA8IHVuaXRzLmxlbmd0aCAtIDEpIHsgYiAvPSAxMDI0OyBpKys7IH1cbiAgICByZXR1cm4gYi50b0ZpeGVkKDEpICsgJyAnICsgdW5pdHNbaV07XG4gIH1cblxuICBmdW5jdGlvbiBzZXRTZXJ2aWNlc0NhcmQoKSB7XG4gICAgY29uc3QgdG90YWwgPSAod2luZG93LkFQUFMgfHwgW10pLmxlbmd0aDtcbiAgICBsZXQgdXAgPSAwO1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNjYXJkcyAuY2FyZCcpLmZvckVhY2goYyA9PiB7XG4gICAgICBpZiAoYy5kYXRhc2V0LnN0YXR1cyA9PT0gJ29uJykgdXArKztcbiAgICB9KTtcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYy1tb25pdG9yLXNlcnZpY2VzJyk7XG4gICAgY29uc3Qgc3ViID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RjLW1vbml0b3Itc2VydmljZXMtc3ViJyk7XG4gICAgaWYgKGVsKSBlbC50ZXh0Q29udGVudCA9IGAke3VwfSAvICR7dG90YWx9YDtcbiAgICBpZiAoc3ViKSBzdWIudGV4dENvbnRlbnQgPSB0b3RhbCA9PT0gMCA/ICdubyBzZXJ2aWNlcyB5ZXQnIDogYCR7dXB9IG9ubGluZSBcdTAwQjcgJHt0b3RhbCAtIHVwfSBvZmZsaW5lYDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFwcGx5SGVhbHRoU3VtbWFyeShkYXRhKSB7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGMtbW9uaXRvci1oZWFsdGgnKTtcbiAgICBjb25zdCBzdWIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGMtbW9uaXRvci1oZWFsdGgtc3ViJyk7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgIGlmICghZGF0YSB8fCBkYXRhLnN1bW1hcnkgPT0gbnVsbCkge1xuICAgICAgZWwudGV4dENvbnRlbnQgPSAnXHUyMDE0JztcbiAgICAgIGlmIChzdWIpIHN1Yi50ZXh0Q29udGVudCA9ICdubyBkYXRhJztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcyA9IGRhdGEuc3VtbWFyeTtcbiAgICBjb25zdCBoZWFsdGh5ID0gcy5oZWFsdGh5ID8/IHMudXAgPz8gMDtcbiAgICBjb25zdCB1bmhlYWx0aHkgPSBzLnVuaGVhbHRoeSA/PyBzLmRvd24gPz8gMDtcbiAgICBjb25zdCB0b3RhbCA9IHMudG90YWwgPz8gKGhlYWx0aHkgKyB1bmhlYWx0aHkpO1xuICAgIGVsLnRleHRDb250ZW50ID0gYCR7aGVhbHRoeX0vJHt0b3RhbH1gO1xuICAgIGlmIChzdWIpIHtcbiAgICAgIGlmICh1bmhlYWx0aHkgPT09IDApIHtcbiAgICAgICAgc3ViLmlubmVySFRNTCA9ICc8c3BhbiBjbGFzcz1cImRjLW1vbml0b3ItcGlsbCBva1wiPlx1MjVDRiBhbGwgaGVhbHRoeTwvc3Bhbj4nO1xuICAgICAgfSBlbHNlIGlmICh1bmhlYWx0aHkgPD0gMikge1xuICAgICAgICBzdWIuaW5uZXJIVE1MID0gYDxzcGFuIGNsYXNzPVwiZGMtbW9uaXRvci1waWxsIHdhcm5cIj5cdTI1Q0YgJHt1bmhlYWx0aHl9IGRlZ3JhZGVkPC9zcGFuPmA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdWIuaW5uZXJIVE1MID0gYDxzcGFuIGNsYXNzPVwiZGMtbW9uaXRvci1waWxsIGJhZFwiPlx1MjVDRiAke3VuaGVhbHRoeX0gZG93bjwvc3Bhbj5gO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIC0tLS0tIERhdGEgZmV0Y2hlcyAtLS0tLVxuICBhc3luYyBmdW5jdGlvbiBmZXRjaFN0YXRzKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvbW9uaXRvcmluZy9zdGF0cycsIHsgY2FjaGU6ICduby1zdG9yZScgfSk7XG4gICAgICBpZiAoIXIub2spIHJldHVybiBudWxsO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHIuanNvbigpO1xuICAgICAgcmV0dXJuIChkYXRhICYmIGRhdGEuc3RhdHMpID8gZGF0YS5zdGF0cyA6IG51bGw7XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hIZWFsdGgoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHIgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9oZWFsdGgtY2hlY2tzL3N0YXR1cycsIHsgY2FjaGU6ICduby1zdG9yZScgfSk7XG4gICAgICBpZiAoIXIub2spIHJldHVybiBudWxsO1xuICAgICAgcmV0dXJuIGF3YWl0IHIuanNvbigpO1xuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGFwcGx5U3RhdHMoc3RhdHMpIHtcbiAgICBjb25zdCBjb250YWluZXJzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RjLW1vbml0b3ItY29udGFpbmVycycpO1xuICAgIGNvbnN0IGNvbnRhaW5lcnNTdWIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGMtbW9uaXRvci1jb250YWluZXJzLXN1YicpO1xuICAgIGNvbnN0IGNwdUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RjLW1vbml0b3ItY3B1Jyk7XG4gICAgY29uc3QgbWVtRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGMtbW9uaXRvci1tZW0nKTtcblxuICAgIGlmICghc3RhdHMpIHtcbiAgICAgIGlmIChjb250YWluZXJzKSBjb250YWluZXJzLnRleHRDb250ZW50ID0gJ1x1MjAxNCc7XG4gICAgICBpZiAoY3B1RWwpIGNwdUVsLnRleHRDb250ZW50ID0gJ1x1MjAxNCc7XG4gICAgICBpZiAobWVtRWwpIG1lbUVsLnRleHRDb250ZW50ID0gJ1x1MjAxNCc7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZW50cmllcyA9IE9iamVjdC52YWx1ZXMoc3RhdHMpO1xuICAgIGlmIChlbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaWYgKGNvbnRhaW5lcnMpIGNvbnRhaW5lcnMudGV4dENvbnRlbnQgPSAnMCc7XG4gICAgICBpZiAoY29udGFpbmVyc1N1YikgY29udGFpbmVyc1N1Yi50ZXh0Q29udGVudCA9ICdubyBjb250YWluZXJzIHJlcG9ydGluZyc7XG4gICAgICBpZiAoY3B1RWwpIGNwdUVsLnRleHRDb250ZW50ID0gJzAlJztcbiAgICAgIGlmIChtZW1FbCkgbWVtRWwudGV4dENvbnRlbnQgPSAnMCUnO1xuICAgICAgc2V0QmFyKCdkYy1tb25pdG9yLWNwdS1iYXInLCAwKTtcbiAgICAgIHNldEJhcignZGMtbW9uaXRvci1tZW0tYmFyJywgMCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGNwdVN1bSA9IDAsIG1lbVN1bSA9IDAsIG1lbUJ5dGVzID0gMCwgY3B1Q291bnQgPSAwLCBtZW1Db3VudCA9IDA7XG4gICAgZW50cmllcy5mb3JFYWNoKHMgPT4ge1xuICAgICAgLy8gQ1BVIG1heSBiZSBwZXJjZW50YWdlICgwLTEwMCkgb3IgZnJhY3Rpb24gKDAtMSkgXHUyMDE0IGhhbmRsZSBib3RoXG4gICAgICBpZiAocy5jcHUgIT0gbnVsbCkge1xuICAgICAgICBjb25zdCBjcHUgPSBOdW1iZXIocy5jcHUpO1xuICAgICAgICBpZiAoIWlzTmFOKGNwdSkpIHtcbiAgICAgICAgICBjcHVTdW0gKz0gY3B1ID4gMSA/IGNwdSA6IGNwdSAqIDEwMDtcbiAgICAgICAgICBjcHVDb3VudCsrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocy5tZW1vcnkgIT0gbnVsbCkge1xuICAgICAgICBjb25zdCBtZW0gPSBOdW1iZXIocy5tZW1vcnkpO1xuICAgICAgICBpZiAoIWlzTmFOKG1lbSkpIHtcbiAgICAgICAgICBtZW1TdW0gKz0gbWVtO1xuICAgICAgICAgIG1lbUJ5dGVzICs9IE51bWJlcihzLm1lbW9yeVVzYWdlIHx8IDApO1xuICAgICAgICAgIG1lbUNvdW50Kys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IGF2Z0NwdSA9IGNwdUNvdW50ID8gY3B1U3VtIC8gY3B1Q291bnQgOiAwO1xuICAgIGNvbnN0IGF2Z01lbSA9IG1lbUNvdW50ID8gbWVtU3VtIC8gbWVtQ291bnQgOiAwO1xuXG4gICAgaWYgKGNvbnRhaW5lcnMpIGNvbnRhaW5lcnMudGV4dENvbnRlbnQgPSBTdHJpbmcoZW50cmllcy5sZW5ndGgpO1xuICAgIGlmIChjb250YWluZXJzU3ViKSB7XG4gICAgICBjb25zdCBtZW1UeHQgPSBtZW1CeXRlcyA/IGAgXHUwMEI3ICR7Zm10Qnl0ZXMobWVtQnl0ZXMpfSBSQU1gIDogJyc7XG4gICAgICBjb250YWluZXJzU3ViLnRleHRDb250ZW50ID0gYHJ1bm5pbmcke21lbVR4dH1gO1xuICAgIH1cbiAgICBpZiAoY3B1RWwpIGNwdUVsLnRleHRDb250ZW50ID0gZm10UGN0KGF2Z0NwdSk7XG4gICAgaWYgKG1lbUVsKSBtZW1FbC50ZXh0Q29udGVudCA9IGZtdFBjdChhdmdNZW0pO1xuICAgIHNldEJhcignZGMtbW9uaXRvci1jcHUtYmFyJywgYXZnQ3B1KTtcbiAgICBzZXRCYXIoJ2RjLW1vbml0b3ItbWVtLWJhcicsIGF2Z01lbSk7XG4gIH1cblxuICAvLyAtLS0tLSBQdWJsaWMgcmVmcmVzaCBmdW5jdGlvbiAtLS0tLVxuICBsZXQgaW5GbGlnaHQgPSBmYWxzZTtcbiAgYXN5bmMgZnVuY3Rpb24gcmVmcmVzaCgpIHtcbiAgICBpZiAoaW5GbGlnaHQpIHJldHVybjtcbiAgICBpbkZsaWdodCA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIHNldFNlcnZpY2VzQ2FyZCgpO1xuICAgICAgY29uc3QgW3N0YXRzLCBoZWFsdGhdID0gYXdhaXQgUHJvbWlzZS5hbGwoW2ZldGNoU3RhdHMoKSwgZmV0Y2hIZWFsdGgoKV0pO1xuICAgICAgYXBwbHlTdGF0cyhzdGF0cyk7XG4gICAgICBhcHBseUhlYWx0aFN1bW1hcnkoaGVhbHRoKTtcbiAgICAgIGNvbnN0IHN0YW1wID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RjLW1vbml0b3ItcmVmcmVzaC1zdGFtcCcpO1xuICAgICAgaWYgKHN0YW1wKSB7XG4gICAgICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgICAgIHN0YW1wLnRleHRDb250ZW50ID0gYHVwZGF0ZWQgJHtub3cudG9Mb2NhbGVUaW1lU3RyaW5nKCl9YDtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgaW5GbGlnaHQgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvLyBFeHBvc2UgZm9yIGluaXQuanMgdG8gY2FsbCBvbmNlIGFuZCByZS1jYWxsIGFmdGVyIGVhY2ggcmVmcmVzaEFsbCBjeWNsZVxuICB3aW5kb3cucmVmcmVzaE1vbml0b3JpbmdXaWRnZXRzID0gcmVmcmVzaDtcblxuICAvLyBBdXRvLXJlZnJlc2ggb24gdGhlIFNUQVRTIGludGVydmFsIChzZXBhcmF0ZSBmcm9tIGZ1bGwgREFTSEJPQVJEIHJlZnJlc2gpXG4gIHNldEludGVydmFsKHJlZnJlc2gsICh0eXBlb2YgREMgIT09ICd1bmRlZmluZWQnICYmIERDLlBPTEwgJiYgREMuUE9MTC5TVEFUUykgfHwgNTAwMCk7XG5cbiAgLy8gUmVmcmVzaCBvbmNlIG9uIGZpcnN0IHNjcmlwdCBsb2FkIChpbml0LmpzIGFsc28gY2FsbHMgdGhpczsgZG91YmxlLWNhbGwgaXMgaGFybWxlc3MpXG4gIHNldFRpbWVvdXQocmVmcmVzaCwgMjAwKTtcblxufSkoKTtcbjtcbi8qKlxuICogRGFzaENhZGR5IEtleWJvYXJkIFNob3J0Y3V0cyBTeXN0ZW1cbiAqIFByb3ZpZGVzIGdsb2JhbCBrZXlib2FyZCBzaG9ydGN1dHMgZm9yIGltcHJvdmVkIG5hdmlnYXRpb25cbiAqL1xuXG4oZnVuY3Rpb24oKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICBjb25zdCBkZWJ1ZyA9ICguLi5hcmdzKSA9PiB7XG4gICAgaWYgKHdpbmRvdy5EQVNIQ0FERFlfREVCVUcpIHsgY29uc29sZS5sb2coLi4uYXJncyk7IH1cbiAgfTtcblxuICAvLyBBbGwgbW9kYWwgc2VsZWN0b3JzIHRoYXQgY2FuIGJlIGNsb3NlZCB3aXRoIEVzY2FwZVxuICBjb25zdCBNT0RBTF9TRUxFQ1RPUlMgPSBbXG4gICAgJyNhcHAtc2VsZWN0b3ItbW9kYWwnLFxuICAgICcjYXBwLWRlcGxveS1tb2RhbCcsXG4gICAgJyN3ZWF0aGVyLW1vZGFsJyxcbiAgICAnI3Rva2VuLW1hbmFnZW1lbnQtbW9kYWwnLFxuICAgICcjc2VydmljZS1lZGl0LW1vZGFsJyxcbiAgICAnI25vdGlmaWNhdGlvbnMtbW9kYWwnLFxuICAgICcjYmFja3VwLW1vZGFsJyxcbiAgICAnI3N0YXRzLW1vZGFsJyxcbiAgICAnI2Fyci1zZXR1cC1tb2RhbCcsXG4gICAgJyNhZGQtc2VydmljZS1tb2RhbCcsXG4gICAgJyNlcnJvci1sb2ctbW9kYWwnLFxuICAgICcjbG9ncy1tb2RhbCcsXG4gICAgJyNkbnMtdGVtcGxhdGUtbW9kYWwnXG4gIF07XG5cbiAgLy8gUXVpY2sgc2VhcmNoIHN0YXRlXG4gIGxldCBxdWlja1NlYXJjaE1vZGFsID0gbnVsbDtcbiAgbGV0IHF1aWNrU2VhcmNoSW5wdXQgPSBudWxsO1xuICBsZXQgcXVpY2tTZWFyY2hSZXN1bHRzID0gbnVsbDtcblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSB0aGUga2V5Ym9hcmQgc2hvcnRjdXRzIHN5c3RlbVxuICAgKi9cbiAgZnVuY3Rpb24gaW5pdCgpIHtcbiAgICB0cnkge1xuICAgICAgLy8gQ3JlYXRlIHF1aWNrIHNlYXJjaCBtb2RhbFxuICAgICAgY3JlYXRlUXVpY2tTZWFyY2hNb2RhbCgpO1xuXG4gICAgICAvLyBBZGQgZ2xvYmFsIGtleWJvYXJkIGxpc3RlbmVyXG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgaGFuZGxlS2V5RG93bik7XG5cbiAgICAgIGRlYnVnKCdbS2V5Ym9hcmQgU2hvcnRjdXRzXSBJbml0aWFsaXplZCcpO1xuICAgICAgZGVidWcoJ1tLZXlib2FyZCBTaG9ydGN1dHNdIFByZXNzIEN0cmwrSyB0byBvcGVuIHF1aWNrIHNlYXJjaCcpO1xuICAgICAgZGVidWcoJ1tLZXlib2FyZCBTaG9ydGN1dHNdIFByZXNzIEVzY2FwZSB0byBjbG9zZSBtb2RhbHMnKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tLZXlib2FyZCBTaG9ydGN1dHNdIEZhaWxlZCB0byBpbml0aWFsaXplOicsIGUubWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGUgcXVpY2sgc2VhcmNoIG1vZGFsXG4gICAqL1xuICBmdW5jdGlvbiBjcmVhdGVRdWlja1NlYXJjaE1vZGFsKCkge1xuICAgIHF1aWNrU2VhcmNoTW9kYWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBxdWlja1NlYXJjaE1vZGFsLmlkID0gJ3F1aWNrLXNlYXJjaC1tb2RhbCc7XG4gICAgcXVpY2tTZWFyY2hNb2RhbC5jbGFzc05hbWUgPSAncXVpY2stc2VhcmNoLW1vZGFsJztcbiAgICBxdWlja1NlYXJjaE1vZGFsLmlubmVySFRNTCA9IGBcbiAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtY29udGVudFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWlucHV0LXdyYXBwZXJcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pY29uXCI+XHVEODNEXHVERDBEPC9zcGFuPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwicXVpY2stc2VhcmNoLWlucHV0XCIgcGxhY2Vob2xkZXI9XCJTZWFyY2ggc2VydmljZXMsIGFwcHMsIG9yIGFjdGlvbnMuLi5cIiBhdXRvY29tcGxldGU9XCJvZmZcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInF1aWNrLXNlYXJjaC1zaG9ydGN1dFwiPkVTQzwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJxdWljay1zZWFyY2gtcmVzdWx0c1wiIGNsYXNzPVwicXVpY2stc2VhcmNoLXJlc3VsdHNcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1mb290ZXJcIj5cbiAgICAgICAgICA8c3Bhbj48a2JkPlx1MjE5MVx1MjE5Mzwva2JkPiBOYXZpZ2F0ZTwvc3Bhbj5cbiAgICAgICAgICA8c3Bhbj48a2JkPkVudGVyPC9rYmQ+IFNlbGVjdDwvc3Bhbj5cbiAgICAgICAgICA8c3Bhbj48a2JkPkVzYzwva2JkPiBDbG9zZTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICBgO1xuXG4gICAgLy8gQWRkIHN0eWxlc1xuICAgIGNvbnN0IHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICBzdHlsZS50ZXh0Q29udGVudCA9IGBcbiAgICAgIC5xdWljay1zZWFyY2gtbW9kYWwge1xuICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgICAgICBwb3NpdGlvbjogZml4ZWQ7XG4gICAgICAgIHRvcDogMDtcbiAgICAgICAgbGVmdDogMDtcbiAgICAgICAgcmlnaHQ6IDA7XG4gICAgICAgIGJvdHRvbTogMDtcbiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjcpO1xuICAgICAgICB6LWluZGV4OiAxMDAwMDA7XG4gICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbiAgICAgICAgcGFkZGluZy10b3A6IDE1dmg7XG4gICAgICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cig0cHgpO1xuICAgICAgfVxuXG4gICAgICAucXVpY2stc2VhcmNoLW1vZGFsLnNob3cge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgfVxuXG4gICAgICAucXVpY2stc2VhcmNoLWNvbnRlbnQge1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UsICMxYTFhMmUpO1xuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIsICMzMzMpO1xuICAgICAgICBib3JkZXItcmFkaXVzOiAxMnB4O1xuICAgICAgICB3aWR0aDogOTAlO1xuICAgICAgICBtYXgtd2lkdGg6IDYwMHB4O1xuICAgICAgICBib3gtc2hhZG93OiAwIDI1cHggNTBweCAtMTJweCByZ2JhKDAsIDAsIDAsIDAuNSk7XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICB9XG5cbiAgICAgIC5xdWljay1zZWFyY2gtaW5wdXQtd3JhcHBlciB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIHBhZGRpbmc6IDE2cHggMjBweDtcbiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlciwgIzMzMyk7XG4gICAgICAgIGdhcDogMTJweDtcbiAgICAgIH1cblxuICAgICAgLnF1aWNrLXNlYXJjaC1pY29uIHtcbiAgICAgICAgZm9udC1zaXplOiAyMHB4O1xuICAgICAgICBvcGFjaXR5OiAwLjY7XG4gICAgICB9XG5cbiAgICAgICNxdWljay1zZWFyY2gtaW5wdXQge1xuICAgICAgICBmbGV4OiAxO1xuICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgICBvdXRsaW5lOiBub25lO1xuICAgICAgICBjb2xvcjogdmFyKC0tZmcsICNmZmYpO1xuICAgICAgICBmb250LXNpemU6IDE4cHg7XG4gICAgICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0O1xuICAgICAgfVxuXG4gICAgICAjcXVpY2stc2VhcmNoLWlucHV0OjpwbGFjZWhvbGRlciB7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1tdXRlZCwgIzY2Nik7XG4gICAgICB9XG5cbiAgICAgIC5xdWljay1zZWFyY2gtc2hvcnRjdXQge1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWhvdmVyLCAjMmEyYTRlKTtcbiAgICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgICAgICBmb250LXNpemU6IDEycHg7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1tdXRlZCwgIzY2Nik7XG4gICAgICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7XG4gICAgICB9XG5cbiAgICAgIC5xdWljay1zZWFyY2gtcmVzdWx0cyB7XG4gICAgICAgIG1heC1oZWlnaHQ6IDQwMHB4O1xuICAgICAgICBvdmVyZmxvdy15OiBhdXRvO1xuICAgICAgfVxuXG4gICAgICAucXVpY2stc2VhcmNoLWNhdGVnb3J5IHtcbiAgICAgICAgcGFkZGluZzogOHB4IDIwcHg7XG4gICAgICAgIGZvbnQtc2l6ZTogMTFweDtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgICAgICAgY29sb3I6IHZhcigtLW11dGVkLCAjNjY2KTtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1ob3ZlciwgIzJhMmE0ZSk7XG4gICAgICAgIGxldHRlci1zcGFjaW5nOiAwLjVweDtcbiAgICAgIH1cblxuICAgICAgLnF1aWNrLXNlYXJjaC1pdGVtIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgcGFkZGluZzogMTJweCAyMHB4O1xuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xNXM7XG4gICAgICAgIGdhcDogMTJweDtcbiAgICAgIH1cblxuICAgICAgLnF1aWNrLXNlYXJjaC1pdGVtOmhvdmVyLFxuICAgICAgLnF1aWNrLXNlYXJjaC1pdGVtLnNlbGVjdGVkIHtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50LCAjMzQ5OGRiKTtcbiAgICAgIH1cblxuICAgICAgLnF1aWNrLXNlYXJjaC1pdGVtLWljb24ge1xuICAgICAgICBmb250LXNpemU6IDI0cHg7XG4gICAgICAgIHdpZHRoOiAzMnB4O1xuICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICB9XG5cbiAgICAgIC5xdWljay1zZWFyY2gtaXRlbS1jb250ZW50IHtcbiAgICAgICAgZmxleDogMTtcbiAgICAgIH1cblxuICAgICAgLnF1aWNrLXNlYXJjaC1pdGVtLXRpdGxlIHtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICAgICAgY29sb3I6IHZhcigtLWZnLCAjZmZmKTtcbiAgICAgIH1cblxuICAgICAgLnF1aWNrLXNlYXJjaC1pdGVtLWRlc2NyaXB0aW9uIHtcbiAgICAgICAgZm9udC1zaXplOiAxMnB4O1xuICAgICAgICBjb2xvcjogdmFyKC0tbXV0ZWQsICNhYWEpO1xuICAgICAgICBtYXJnaW4tdG9wOiAycHg7XG4gICAgICB9XG5cbiAgICAgIC5xdWljay1zZWFyY2gtaXRlbS1iYWRnZSB7XG4gICAgICAgIHBhZGRpbmc6IDJweCA4cHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgICAgZm9udC1zaXplOiAxMXB4O1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWhvdmVyLCAjMmEyYTRlKTtcbiAgICAgICAgY29sb3I6IHZhcigtLW11dGVkLCAjODg4KTtcbiAgICAgIH1cblxuICAgICAgLnF1aWNrLXNlYXJjaC1lbXB0eSB7XG4gICAgICAgIHBhZGRpbmc6IDQwcHggMjBweDtcbiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgICBjb2xvcjogdmFyKC0tbXV0ZWQsICM2NjYpO1xuICAgICAgfVxuXG4gICAgICAucXVpY2stc2VhcmNoLWZvb3RlciB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgICBnYXA6IDI0cHg7XG4gICAgICAgIHBhZGRpbmc6IDEycHggMjBweDtcbiAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLWJvcmRlciwgIzMzMyk7XG4gICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWNhcmQtaG92ZXIsICMyYTJhNGUpO1xuICAgICAgICBmb250LXNpemU6IDEycHg7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1tdXRlZCwgIzY2Nik7XG4gICAgICB9XG5cbiAgICAgIC5xdWljay1zZWFyY2gtZm9vdGVyIGtiZCB7XG4gICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSwgIzFhMWEyZSk7XG4gICAgICAgIHBhZGRpbmc6IDJweCA2cHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTtcbiAgICAgICAgbWFyZ2luLXJpZ2h0OiA0cHg7XG4gICAgICB9XG4gICAgYDtcblxuICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQocXVpY2tTZWFyY2hNb2RhbCk7XG5cbiAgICBxdWlja1NlYXJjaElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3F1aWNrLXNlYXJjaC1pbnB1dCcpO1xuICAgIHF1aWNrU2VhcmNoUmVzdWx0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdxdWljay1zZWFyY2gtcmVzdWx0cycpO1xuXG4gICAgLy8gSW5wdXQgaGFuZGxpbmdcbiAgICBxdWlja1NlYXJjaElucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgaGFuZGxlU2VhcmNoSW5wdXQpO1xuICAgIHF1aWNrU2VhcmNoSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGhhbmRsZVNlYXJjaEtleURvd24pO1xuXG4gICAgLy8gQ2xvc2Ugb24gYmFja2Ryb3AgY2xpY2tcbiAgICBxdWlja1NlYXJjaE1vZGFsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgIGlmIChlLnRhcmdldCA9PT0gcXVpY2tTZWFyY2hNb2RhbCkge1xuICAgICAgICBjbG9zZVF1aWNrU2VhcmNoKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGdsb2JhbCBrZXlkb3duIGV2ZW50c1xuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlS2V5RG93bihlKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEN0cmwrSyBvciBDbWQrSyB0byBvcGVuIHF1aWNrIHNlYXJjaFxuICAgICAgaWYgKChlLmN0cmxLZXkgfHwgZS5tZXRhS2V5KSAmJiBlLmtleSA9PT0gJ2snKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgb3BlblF1aWNrU2VhcmNoKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gRXNjYXBlIHRvIGNsb3NlIG1vZGFsc1xuICAgICAgaWYgKGUua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgICAvLyBGaXJzdCBjaGVjayBpZiBxdWljayBzZWFyY2ggaXMgb3BlblxuICAgICAgICBpZiAocXVpY2tTZWFyY2hNb2RhbCAmJiBxdWlja1NlYXJjaE1vZGFsLmNsYXNzTGlzdC5jb250YWlucygnc2hvdycpKSB7XG4gICAgICAgICAgY2xvc2VRdWlja1NlYXJjaCgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZW4gY2xvc2UgYW55IG90aGVyIG9wZW4gbW9kYWxcbiAgICAgICAgY2xvc2VUb3BNb2RhbCgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUyKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tLZXlib2FyZCBTaG9ydGN1dHNdIEVycm9yIGhhbmRsaW5nIGtleWRvd246JywgZTIubWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE9wZW4gcXVpY2sgc2VhcmNoIG1vZGFsXG4gICAqL1xuICBmdW5jdGlvbiBvcGVuUXVpY2tTZWFyY2goKSB7XG4gICAgdHJ5IHtcbiAgICAgIHF1aWNrU2VhcmNoTW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICAgICAgcXVpY2tTZWFyY2hJbnB1dC52YWx1ZSA9ICcnO1xuICAgICAgcXVpY2tTZWFyY2hJbnB1dC5mb2N1cygpO1xuICAgICAgc2hvd0RlZmF1bHRSZXN1bHRzKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS53YXJuKCdbS2V5Ym9hcmQgU2hvcnRjdXRzXSBFcnJvciBvcGVuaW5nIHF1aWNrIHNlYXJjaDonLCBlLm1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZSBxdWljayBzZWFyY2ggbW9kYWxcbiAgICovXG4gIGZ1bmN0aW9uIGNsb3NlUXVpY2tTZWFyY2goKSB7XG4gICAgdHJ5IHtcbiAgICAgIHF1aWNrU2VhcmNoTW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgICAgcXVpY2tTZWFyY2hJbnB1dC52YWx1ZSA9ICcnO1xuICAgICAgcXVpY2tTZWFyY2hSZXN1bHRzLmlubmVySFRNTCA9ICcnO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUud2FybignW0tleWJvYXJkIFNob3J0Y3V0c10gRXJyb3IgY2xvc2luZyBxdWljayBzZWFyY2g6JywgZS5tZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgdGhlIHRvcG1vc3Qgb3BlbiBtb2RhbFxuICAgKi9cbiAgZnVuY3Rpb24gY2xvc2VUb3BNb2RhbCgpIHtcbiAgICBmb3IgKGNvbnN0IHNlbGVjdG9yIG9mIE1PREFMX1NFTEVDVE9SUykge1xuICAgICAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICAgIGlmIChtb2RhbCAmJiAobW9kYWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdzaG93JykgfHwgbW9kYWwuc3R5bGUuZGlzcGxheSA9PT0gJ2ZsZXgnKSkge1xuICAgICAgICBtb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gICAgICAgIG1vZGFsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogU2hvdyBkZWZhdWx0L3N1Z2dlc3RlZCByZXN1bHRzXG4gICAqL1xuICBmdW5jdGlvbiBzaG93RGVmYXVsdFJlc3VsdHMoKSB7XG4gICAgY29uc3QgaHRtbCA9IGBcbiAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtY2F0ZWdvcnlcIj5RdWljayBBY3Rpb25zPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW1cIiBkYXRhLWFjdGlvbj1cInJlZnJlc2hcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbS1pY29uXCI+XHVEODNEXHVERDA0PC9zcGFuPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0tY29udGVudFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbS10aXRsZVwiPlJlZnJlc2ggRGFzaGJvYXJkPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLWRlc2NyaXB0aW9uXCI+UmVmcmVzaCBhbGwgc2VydmljZSBzdGF0dXNlczwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtXCIgZGF0YS1hY3Rpb249XCJyZWxvYWQtY2FkZHlcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbS1pY29uXCI+XHUyNkExPC9zcGFuPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0tY29udGVudFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbS10aXRsZVwiPlJlbG9hZCBDYWRkeTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbS1kZXNjcmlwdGlvblwiPlJlbG9hZCBDYWRkeSBjb25maWd1cmF0aW9uPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW1cIiBkYXRhLWFjdGlvbj1cImFkZC1zZXJ2aWNlXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0taWNvblwiPlx1Mjc5NTwvc3Bhbj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLWNvbnRlbnRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0tdGl0bGVcIj5BZGQgU2VydmljZTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbS1kZXNjcmlwdGlvblwiPk9wZW4gc2VydmljZSBjb25maWd1cmF0aW9uIG1vZGFsPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW1cIiBkYXRhLWFjdGlvbj1cImFwcC1zZWxlY3RvclwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLWljb25cIj5cdUQ4M0RcdURDRjE8L3NwYW4+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbS1jb250ZW50XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLXRpdGxlXCI+QXBwIFNlbGVjdG9yPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLWRlc2NyaXB0aW9uXCI+RGVwbG95IG5ldyBhcHBsaWNhdGlvbnM8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1jYXRlZ29yeVwiPlNlcnZpY2VzPC9kaXY+XG4gICAgICAke2dldFNlcnZpY2VJdGVtcygpfVxuICAgIGA7XG5cbiAgICBxdWlja1NlYXJjaFJlc3VsdHMuaW5uZXJIVE1MID0gaHRtbDtcbiAgICBhdHRhY2hSZXN1bHRMaXN0ZW5lcnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc2VydmljZSBpdGVtcyBmcm9tIHRoZSBkYXNoYm9hcmRcbiAgICovXG4gIGZ1bmN0aW9uIGdldFNlcnZpY2VJdGVtcygpIHtcbiAgICBjb25zdCBjYXJkcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5jYXJkW2RhdGEtYXBwXSwgI2NhcmRzIC5jYXJkJyk7XG4gICAgbGV0IGh0bWwgPSAnJztcblxuICAgIGNhcmRzLmZvckVhY2goY2FyZCA9PiB7XG4gICAgICBjb25zdCBuYW1lID0gY2FyZC5xdWVyeVNlbGVjdG9yKCcubmFtZScpPy50ZXh0Q29udGVudCB8fCAnVW5rbm93bic7XG4gICAgICBjb25zdCBzdGF0dXMgPSBjYXJkLmRhdGFzZXQuc3RhdHVzIHx8ICd1bmtub3duJztcbiAgICAgIGNvbnN0IGFwcCA9IGNhcmQuZGF0YXNldC5hcHAgfHwgJyc7XG5cbiAgICAgIGlmIChuYW1lICYmIG5hbWUgIT09ICctLScpIHtcbiAgICAgICAgaHRtbCArPSBgXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtXCIgZGF0YS1hY3Rpb249XCJvcGVuLXNlcnZpY2VcIiBkYXRhLXNlcnZpY2U9XCIke2FwcH1cIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0taWNvblwiPiR7c3RhdHVzID09PSAnb24nID8gJ1x1RDgzRFx1REZFMicgOiAnXHVEODNEXHVERDM0J308L3NwYW4+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0tY29udGVudFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0tdGl0bGVcIj4ke25hbWV9PC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbS1kZXNjcmlwdGlvblwiPkNsaWNrIHRvIG9wZW4gc2VydmljZTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLWJhZGdlXCI+JHtzdGF0dXMudG9VcHBlckNhc2UoKX08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIGA7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gaHRtbCB8fCAnPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1lbXB0eVwiPk5vIHNlcnZpY2VzIGZvdW5kPC9kaXY+JztcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgc2VhcmNoIGlucHV0XG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVTZWFyY2hJbnB1dChlKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHF1ZXJ5ID0gZS50YXJnZXQudmFsdWUudG9Mb3dlckNhc2UoKS50cmltKCk7XG5cbiAgICAgIGlmICghcXVlcnkpIHtcbiAgICAgICAgc2hvd0RlZmF1bHRSZXN1bHRzKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gU2VhcmNoIHRocm91Z2ggc2VydmljZXMgYW5kIGFjdGlvbnNcbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBzZWFyY2hBbGwocXVlcnkpO1xuICAgICAgZGlzcGxheVNlYXJjaFJlc3VsdHMocmVzdWx0cyk7XG4gICAgfSBjYXRjaCAoZTIpIHtcbiAgICAgIGNvbnNvbGUud2FybignW0tleWJvYXJkIFNob3J0Y3V0c10gRXJyb3IgaGFuZGxpbmcgc2VhcmNoIGlucHV0OicsIGUyLm1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZWFyY2ggYWxsIGl0ZW1zXG4gICAqL1xuICBmdW5jdGlvbiBzZWFyY2hBbGwocXVlcnkpIHtcbiAgICBjb25zdCByZXN1bHRzID0ge1xuICAgICAgYWN0aW9uczogW10sXG4gICAgICBzZXJ2aWNlczogW11cbiAgICB9O1xuXG4gICAgLy8gU2VhcmNoIGFjdGlvbnNcbiAgICBjb25zdCBhY3Rpb25zID0gW1xuICAgICAgeyBpZDogJ3JlZnJlc2gnLCB0aXRsZTogJ1JlZnJlc2ggRGFzaGJvYXJkJywgaWNvbjogJ1x1RDgzRFx1REQwNCcsIGtleXdvcmRzOiAncmVmcmVzaCByZWxvYWQgdXBkYXRlIHN0YXR1cycgfSxcbiAgICAgIHsgaWQ6ICdyZWxvYWQtY2FkZHknLCB0aXRsZTogJ1JlbG9hZCBDYWRkeScsIGljb246ICdcdTI2QTEnLCBrZXl3b3JkczogJ3JlbG9hZCBjYWRkeSBwcm94eSBjb25maWcnIH0sXG4gICAgICB7IGlkOiAnYWRkLXNlcnZpY2UnLCB0aXRsZTogJ0FkZCBTZXJ2aWNlJywgaWNvbjogJ1x1Mjc5NScsIGtleXdvcmRzOiAnYWRkIG5ldyBzZXJ2aWNlIGNyZWF0ZScgfSxcbiAgICAgIHsgaWQ6ICdhcHAtc2VsZWN0b3InLCB0aXRsZTogJ0FwcCBTZWxlY3RvcicsIGljb246ICdcdUQ4M0RcdURDRjEnLCBrZXl3b3JkczogJ2FwcCBkZXBsb3kgaW5zdGFsbCBkb2NrZXIgY29udGFpbmVyJyB9LFxuICAgICAgeyBpZDogJ2JhY2t1cCcsIHRpdGxlOiAnQmFja3VwICYgUmVzdG9yZScsIGljb246ICdcdUQ4M0RcdURDQkUnLCBrZXl3b3JkczogJ2JhY2t1cCByZXN0b3JlIGV4cG9ydCBpbXBvcnQnIH0sXG4gICAgICB7IGlkOiAnc3RhdHMnLCB0aXRsZTogJ0NvbnRhaW5lciBTdGF0cycsIGljb246ICdcdUQ4M0RcdURDQ0EnLCBrZXl3b3JkczogJ3N0YXRzIHJlc291cmNlcyBjcHUgbWVtb3J5JyB9LFxuICAgICAgeyBpZDogJ2xvZ3MnLCB0aXRsZTogJ1ZpZXcgTG9ncycsIGljb246ICdcdUQ4M0RcdURDQ0InLCBrZXl3b3JkczogJ2xvZ3MgZXJyb3IgZGVidWcnIH0sXG4gICAgICB7IGlkOiAndG9rZW5zJywgdGl0bGU6ICdNYW5hZ2UgVG9rZW5zJywgaWNvbjogJ1x1RDgzRFx1REQxMScsIGtleXdvcmRzOiAndG9rZW5zIGFwaSBrZXlzIGNyZWRlbnRpYWxzJyB9LFxuICAgICAgeyBpZDogJ25vdGlmaWNhdGlvbnMnLCB0aXRsZTogJ05vdGlmaWNhdGlvbnMnLCBpY29uOiAnXHVEODNEXHVERDE0Jywga2V5d29yZHM6ICdhbGVydHMgbm90aWZpY2F0aW9ucyBkaXNjb3JkIHRlbGVncmFtJyB9LFxuICAgICAgeyBpZDogJ3RoZW1lJywgdGl0bGU6ICdDaGFuZ2UgVGhlbWUnLCBpY29uOiAnXHVEODNDXHVERkE4Jywga2V5d29yZHM6ICd0aGVtZSBkYXJrIGxpZ2h0IGFwcGVhcmFuY2UnIH0sXG4gICAgICB7IGlkOiAndG91cicsIHRpdGxlOiAnSGVscCBUb3VyJywgaWNvbjogJ1x1RDgzQ1x1REY5MycsIGtleXdvcmRzOiAnaGVscCB0b3VyIGd1aWRlIG9uYm9hcmRpbmcnIH1cbiAgICBdO1xuXG4gICAgYWN0aW9ucy5mb3JFYWNoKGFjdGlvbiA9PiB7XG4gICAgICBpZiAoYWN0aW9uLnRpdGxlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocXVlcnkpIHx8IGFjdGlvbi5rZXl3b3Jkcy5pbmNsdWRlcyhxdWVyeSkpIHtcbiAgICAgICAgcmVzdWx0cy5hY3Rpb25zLnB1c2goYWN0aW9uKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFNlYXJjaCBzZXJ2aWNlc1xuICAgIGNvbnN0IGNhcmRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmNhcmRbZGF0YS1hcHBdLCAjY2FyZHMgLmNhcmQnKTtcbiAgICBjYXJkcy5mb3JFYWNoKGNhcmQgPT4ge1xuICAgICAgY29uc3QgbmFtZSA9IGNhcmQucXVlcnlTZWxlY3RvcignLm5hbWUnKT8udGV4dENvbnRlbnQgfHwgJyc7XG4gICAgICBjb25zdCBhcHAgPSBjYXJkLmRhdGFzZXQuYXBwIHx8ICcnO1xuICAgICAgY29uc3Qgc3RhdHVzID0gY2FyZC5kYXRhc2V0LnN0YXR1cyB8fCAndW5rbm93bic7XG5cbiAgICAgIGlmIChuYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocXVlcnkpIHx8IGFwcC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSkge1xuICAgICAgICByZXN1bHRzLnNlcnZpY2VzLnB1c2goe1xuICAgICAgICAgIGlkOiBhcHAsXG4gICAgICAgICAgdGl0bGU6IG5hbWUsXG4gICAgICAgICAgc3RhdHVzOiBzdGF0dXMsXG4gICAgICAgICAgaWNvbjogc3RhdHVzID09PSAnb24nID8gJ1x1RDgzRFx1REZFMicgOiAnXHVEODNEXHVERDM0J1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BsYXkgc2VhcmNoIHJlc3VsdHNcbiAgICovXG4gIGZ1bmN0aW9uIGRpc3BsYXlTZWFyY2hSZXN1bHRzKHJlc3VsdHMpIHtcbiAgICBsZXQgaHRtbCA9ICcnO1xuXG4gICAgaWYgKHJlc3VsdHMuYWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWNhdGVnb3J5XCI+QWN0aW9uczwvZGl2Pic7XG4gICAgICByZXN1bHRzLmFjdGlvbnMuZm9yRWFjaChhY3Rpb24gPT4ge1xuICAgICAgICBodG1sICs9IGBcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW1cIiBkYXRhLWFjdGlvbj1cIiR7YWN0aW9uLmlkfVwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbS1pY29uXCI+JHthY3Rpb24uaWNvbn08L3NwYW4+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0tY29udGVudFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0tdGl0bGVcIj4ke2FjdGlvbi50aXRsZX08L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICBgO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdHMuc2VydmljZXMubGVuZ3RoID4gMCkge1xuICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1jYXRlZ29yeVwiPlNlcnZpY2VzPC9kaXY+JztcbiAgICAgIHJlc3VsdHMuc2VydmljZXMuZm9yRWFjaChzZXJ2aWNlID0+IHtcbiAgICAgICAgaHRtbCArPSBgXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtXCIgZGF0YS1hY3Rpb249XCJvcGVuLXNlcnZpY2VcIiBkYXRhLXNlcnZpY2U9XCIke3NlcnZpY2UuaWR9XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLWljb25cIj4ke3NlcnZpY2UuaWNvbn08L3NwYW4+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0tY29udGVudFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0tdGl0bGVcIj4ke3NlcnZpY2UudGl0bGV9PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0tYmFkZ2VcIj4ke3NlcnZpY2Uuc3RhdHVzLnRvVXBwZXJDYXNlKCl9PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICBgO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCFodG1sKSB7XG4gICAgICBodG1sID0gJzxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtZW1wdHlcIj5ObyByZXN1bHRzIGZvdW5kPC9kaXY+JztcbiAgICB9XG5cbiAgICBxdWlja1NlYXJjaFJlc3VsdHMuaW5uZXJIVE1MID0gaHRtbDtcbiAgICBhdHRhY2hSZXN1bHRMaXN0ZW5lcnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRhY2ggY2xpY2sgbGlzdGVuZXJzIHRvIHJlc3VsdCBpdGVtc1xuICAgKi9cbiAgZnVuY3Rpb24gYXR0YWNoUmVzdWx0TGlzdGVuZXJzKCkge1xuICAgIGNvbnN0IGl0ZW1zID0gcXVpY2tTZWFyY2hSZXN1bHRzLnF1ZXJ5U2VsZWN0b3JBbGwoJy5xdWljay1zZWFyY2gtaXRlbScpO1xuICAgIGl0ZW1zLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gZXhlY3V0ZUFjdGlvbihpdGVtKSk7XG5cbiAgICAgIC8vIFNlbGVjdCBmaXJzdCBpdGVtIGJ5IGRlZmF1bHRcbiAgICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgICBpdGVtLmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGtleWJvYXJkIG5hdmlnYXRpb24gaW4gc2VhcmNoXG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVTZWFyY2hLZXlEb3duKGUpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgaXRlbXMgPSBxdWlja1NlYXJjaFJlc3VsdHMucXVlcnlTZWxlY3RvckFsbCgnLnF1aWNrLXNlYXJjaC1pdGVtJyk7XG4gICAgICBjb25zdCBzZWxlY3RlZCA9IHF1aWNrU2VhcmNoUmVzdWx0cy5xdWVyeVNlbGVjdG9yKCcucXVpY2stc2VhcmNoLWl0ZW0uc2VsZWN0ZWQnKTtcbiAgICAgIGNvbnN0IHNlbGVjdGVkSW5kZXggPSBBcnJheS5mcm9tKGl0ZW1zKS5pbmRleE9mKHNlbGVjdGVkKTtcblxuICAgICAgaWYgKGUua2V5ID09PSAnQXJyb3dEb3duJykge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGlmIChzZWxlY3RlZCkgc2VsZWN0ZWQuY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0ZWQnKTtcbiAgICAgICAgY29uc3QgbmV4dEluZGV4ID0gKHNlbGVjdGVkSW5kZXggKyAxKSAlIGl0ZW1zLmxlbmd0aDtcbiAgICAgICAgaXRlbXNbbmV4dEluZGV4XT8uY2xhc3NMaXN0LmFkZCgnc2VsZWN0ZWQnKTtcbiAgICAgICAgaXRlbXNbbmV4dEluZGV4XT8uc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ25lYXJlc3QnIH0pO1xuICAgICAgfSBlbHNlIGlmIChlLmtleSA9PT0gJ0Fycm93VXAnKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgaWYgKHNlbGVjdGVkKSBzZWxlY3RlZC5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3RlZCcpO1xuICAgICAgICBjb25zdCBwcmV2SW5kZXggPSBzZWxlY3RlZEluZGV4IDw9IDAgPyBpdGVtcy5sZW5ndGggLSAxIDogc2VsZWN0ZWRJbmRleCAtIDE7XG4gICAgICAgIGl0ZW1zW3ByZXZJbmRleF0/LmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkJyk7XG4gICAgICAgIGl0ZW1zW3ByZXZJbmRleF0/LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICduZWFyZXN0JyB9KTtcbiAgICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09ICdFbnRlcicpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAoc2VsZWN0ZWQpIHtcbiAgICAgICAgICBleGVjdXRlQWN0aW9uKHNlbGVjdGVkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUyKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tLZXlib2FyZCBTaG9ydGN1dHNdIEVycm9yIGhhbmRsaW5nIHNlYXJjaCBuYXZpZ2F0aW9uOicsIGUyLm1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGFuIGFjdGlvbiBmcm9tIHF1aWNrIHNlYXJjaFxuICAgKi9cbiAgZnVuY3Rpb24gZXhlY3V0ZUFjdGlvbihpdGVtKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IGl0ZW0uZGF0YXNldC5hY3Rpb247XG4gICAgICBjb25zdCBzZXJ2aWNlID0gaXRlbS5kYXRhc2V0LnNlcnZpY2U7XG5cbiAgICAgIGNsb3NlUXVpY2tTZWFyY2goKTtcblxuICAgICAgc3dpdGNoIChhY3Rpb24pIHtcbiAgICAgICAgY2FzZSAncmVmcmVzaCc6XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlZnJlc2gnKT8uY2xpY2soKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncmVsb2FkLWNhZGR5JzpcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVsb2FkLWNhZGR5LXRvcCcpPy5jbGljaygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdhZGQtc2VydmljZSc6XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkZC1zZXJ2aWNlJyk/LmNsaWNrKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2FwcC1zZWxlY3Rvcic6XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkZC1zZXJ2aWNlLWJ0bicpPy5jbGljaygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdiYWNrdXAnOlxuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYWNrdXAtcmVzdG9yZS1idG4nKT8uY2xpY2soKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnc3RhdHMnOlxuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb250YWluZXItc3RhdHMtYnRuJyk/LmNsaWNrKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2xvZ3MnOlxuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2aWV3LWVycm9yLWxvZ3MnKT8uY2xpY2soKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndG9rZW5zJzpcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFuYWdlLXRva2VucycpPy5jbGljaygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdub3RpZmljYXRpb25zJzpcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFuYWdlLW5vdGlmaWNhdGlvbnMnKT8uY2xpY2soKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndGhlbWUnOlxuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aGVtZScpPy5jbGljaygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd0b3VyJzpcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzdGFydC10b3VyLWJ0bicpPy5jbGljaygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdvcGVuLXNlcnZpY2UnOlxuICAgICAgICAgIGlmIChzZXJ2aWNlKSB7XG4gICAgICAgICAgICBjb25zdCBvcGVuQnRuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgW2RhdGEtYXBwPVwiJHtzZXJ2aWNlfVwiXSBbaWQkPVwiLW9wZW5cIl0sIFtkYXRhLWFwcD1cIiR7c2VydmljZX1cIl0gYnV0dG9uOm5vdCgucmVzdGFydC1idG4pOm5vdCgubG9ncy1idG4pOm5vdCguc2V0dGluZ3MtYnRuKWApO1xuICAgICAgICAgICAgaWYgKG9wZW5CdG4pIHtcbiAgICAgICAgICAgICAgb3BlbkJ0bi5jbGljaygpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gVHJ5IHRvIGZpbmQgdGhlIGNhcmQgYW5kIGNsaWNrIGl0XG4gICAgICAgICAgICAgIGNvbnN0IGNhcmQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1hcHA9XCIke3NlcnZpY2V9XCJdYCk7XG4gICAgICAgICAgICAgIGlmIChjYXJkKSBjYXJkLmNsaWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGRlYnVnKCdbS2V5Ym9hcmQgU2hvcnRjdXRzXSBVbmtub3duIGFjdGlvbjonLCBhY3Rpb24pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUud2FybignW0tleWJvYXJkIFNob3J0Y3V0c10gRXJyb3IgZXhlY3V0aW5nIGFjdGlvbjonLCBlLm1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEluaXRpYWxpemUgd2hlbiBET00gaXMgcmVhZHlcbiAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdsb2FkaW5nJykge1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBpbml0KTtcbiAgfSBlbHNlIHtcbiAgICBpbml0KCk7XG4gIH1cblxuICAvLyBFeHBvc2UgdG8gZ2xvYmFsIHNjb3BlXG4gIHdpbmRvdy5EYXNoQ2FkZHlLZXlib2FyZFNob3J0Y3V0cyA9IHtcbiAgICBvcGVuUXVpY2tTZWFyY2gsXG4gICAgY2xvc2VRdWlja1NlYXJjaFxuICB9O1xuXG59KSgpO1xuIl0sCiAgIm1hcHBpbmdzIjogIkNBQ0MsVUFBWSxDQUVYLFNBQVNBLEdBQXFCLENBQzVCLE1BQU1DLEVBQWlCLFFBQVEsaUJBQWlCLEVBQ2hELEdBQUlBLEVBQ0YsR0FBSSxDQUNlLEtBQUssTUFBTUEsQ0FBYyxFQUVqQyxRQUFRQyxHQUFXLENBQ3JCLE9BQU8sS0FBSyxLQUFLQyxHQUFPQSxFQUFJLEtBQU9ELEVBQVEsRUFBRSxHQUNoRCxPQUFPLEtBQUssS0FBS0EsQ0FBTyxDQUU1QixDQUFDLENBQ0gsT0FBU0UsRUFBRyxDQUNWLFFBQVEsS0FBSyxrQ0FBbUNBLENBQUMsQ0FDbkQsQ0FFSixDQUdBSixFQUFtQixFQUduQixTQUFTSyxHQUFrQixDQUN6QixNQUFNQyxFQUFXLFNBQVMsaUJBQWlCLFlBQVksRUFDdkRBLEVBQVMsUUFBUSxDQUFDQyxFQUFNQyxJQUFVLENBQ2hDRCxFQUFLLE1BQU0sZ0JBQWtCLEdBQUcsS0FBSyxJQUFJQyxFQUFRLEdBQUksR0FBRyxDQUFDLElBQzNELENBQUMsRUFDRCxzQkFBc0IsSUFBTSxDQUMxQkYsRUFBUyxRQUFRQyxHQUFRQSxFQUFLLFVBQVUsSUFBSSxRQUFRLENBQUMsQ0FDdkQsQ0FBQyxDQUNILENBRUEsU0FBU0UsR0FBd0IsQ0FFL0IsR0FESSxFQUFFLGtCQUFtQixZQUNyQixDQUFDLE9BQU8saUJBQW1CLFNBQVMsV0FBYSxhQUFlLFNBQVMsV0FBYSxZQUFh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c3RvbVNlcnZpY2VzIiwgImN1c3RvbVNlcnZpY2VzIiwgInNlcnZpY2UiLCAiYXBwIiwgImUiLCAiYW5pbWF0ZVRvcENhcmRzIiwgInRvcENhcmRzIiwgImNhcmQiLCAiaW5kZXgiLCAicmVnaXN0ZXJTZXJ2aWNlV29ya2VyIiwgInJlZ2lzdGVyIiwgImVycm9yIiwgIl9kYXNoYm9hcmRJbml0aWFsaXplZCIsICJpbml0aWFsaXplRGFzaGJvYXJkIiwgImxvYWRUZW1wbGF0ZUNhdGVnb3JpZXMiLCAiZCIsICJhZGRUb3VyQnV0dG9uIiwgInNob3VsZExvYWRPbmJvYXJkaW5nIiwgImxvYWRPbmJvYXJkaW5nIiwgInMiLCAibGluayIsICJkYXRhIiwgImluaXRUb29sYmFyU2VjdGlvbnMiLCAic2VjdGlvbnMiLCAic2F2ZWQiLCAic2VjdGlvbiIsICJrZXkiLCAiaGVhZGVyIiwgImlzT3BlbiIsICJzdGF0ZSIsICJ0b3VyRG9uZSIsICJ0YXJnZXQiLCAiYnV0dG9uIiwgImNoZWNrIiwgInIiLCAicG9wdWxhdGVDYXRlZ29yeVNlbGVjdHMiLCAiY2F0cyIsICJzZWxlY3QiLCAiY3VycmVudCIsICJwbGFjZWhvbGRlciIsICJwaCIsICJuYW1lIiwgImluZm8iLCAib3B0IiwgInRvdHBEYXRhIiwgInN0eWxlRWwiLCAiZmlsdGVyQmFyIiwgInBhbmVsIiwgInNldEJhciIsICJpZCIsICJwY3QiLCAiZWwiLCAicCIsICJmbXRQY3QiLCAidiIsICJmbXRCeXRlcyIsICJiIiwgInVuaXRzIiwgImkiLCAic2V0U2VydmljZXNDYXJkIiwgInRvdGFsIiwgInVwIiwgImMiLCAic3ViIiwgImFwcGx5SGVhbHRoU3VtbWFyeSIsICJoZWFsdGh5IiwgInVuaGVhbHRoeSIsICJmZXRjaFN0YXRzIiwgImZldGNoSGVhbHRoIiwgImFwcGx5U3RhdHMiLCAic3RhdHMiLCAiY29udGFpbmVycyIsICJjb250YWluZXJzU3ViIiwgImNwdUVsIiwgIm1lbUVsIiwgImVudHJpZXMiLCAiY3B1U3VtIiwgIm1lbVN1bSIsICJtZW1CeXRlcyIsICJjcHVDb3VudCIsICJtZW1Db3VudCIsICJjcHUiLCAibWVtIiwgImF2Z0NwdSIsICJhdmdNZW0iLCAibWVtVHh0IiwgImluRmxpZ2h0IiwgInJlZnJlc2giLCAiaGVhbHRoIiwgInN0YW1wIiwgIm5vdyIsICJkZWJ1ZyIsICJhcmdzIiwgIk1PREFMX1NFTEVDVE9SUyIsICJxdWlja1NlYXJjaE1vZGFsIiwgInF1aWNrU2VhcmNoSW5wdXQiLCAicXVpY2tTZWFyY2hSZXN1bHRzIiwgImluaXQiLCAiY3JlYXRlUXVpY2tTZWFyY2hNb2RhbCIsICJoYW5kbGVLZXlEb3duIiwgInN0eWxlIiwgImhhbmRsZVNlYXJjaElucHV0IiwgImhhbmRsZVNlYXJjaEtleURvd24iLCAiY2xvc2VRdWlja1NlYXJjaCIsICJvcGVuUXVpY2tTZWFyY2giLCAiY2xvc2VUb3BNb2RhbCIsICJlMiIsICJzaG93RGVmYXVsdFJlc3VsdHMiLCAic2VsZWN0b3IiLCAibW9kYWwiLCAiaHRtbCIsICJnZXRTZXJ2aWNlSXRlbXMiLCAiYXR0YWNoUmVzdWx0TGlzdGVuZXJzIiwgImNhcmRzIiwgInN0YXR1cyIsICJxdWVyeSIsICJyZXN1bHRzIiwgInNlYXJjaEFsbCIsICJkaXNwbGF5U2VhcmNoUmVzdWx0cyIsICJhY3Rpb24iLCAiaXRlbSIsICJleGVjdXRlQWN0aW9uIiwgIml0ZW1zIiwgInNlbGVjdGVkIiwgInNlbGVjdGVkSW5kZXgiLCAibmV4dEluZGV4IiwgInByZXZJbmRleCIsICJvcGVuQnRuIl0KfQo=