User:Eejit43/scripts/script-updater.js

Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
// <pre>
// Note: This script was compiled and minified from TypeScript. For a more readable version, see https://github.com/Eejit43/wikipedia-scripts/blob/main/scripts/script-updater.ts

"use strict";(()=>{var g=new mw.Api;async function y(d){return(await g.get({action:"query",formatversion:"2",prop:"revisions",rvprop:"content",rvslots:"main",titles:d})).query.pages[0].revisions?.[0].slots.main.content.trim()}mw.loader.using(["mediawiki.util","oojs-ui-core","oojs-ui-widgets","oojs-ui-windows"],()=>{if(mw.config.get("wgUserName")!=="Eejit43"||mw.config.get("wgPageName")!=="User:Eejit43")return;let d=document.querySelector(".mw-editsection").cloneNode(!0),m=document.createElement("a");m.href="#",m.style.fontWeight="bold",m.textContent="Sync from GitHub",m.addEventListener("click",p=>{p.preventDefault();let e=new OO.ui.WindowManager;document.body.append(e.$element[0]);let s=new l;e.addWindows([s]),s.open()}),d.querySelector("a").replaceWith(m),document.querySelector("h2#My_user_scripts + .mw-editsection").after(d);class l extends OO.ui.ProcessDialog{REPO_OWNER="Eejit43";REPO_NAME="wikipedia-scripts";SCRIPT_MESSAGE=" (via [[User:Eejit43/scripts/script-updater.js|script]])";content;scriptsMultiselect;actionsMultiselect;latestCommitHash;scripts;scriptDataUpdaters={"article-cleaner":w,"redirect-helper":O};constructor(){super({size:"medium"}),l.static.name="ScriptUpdaterDialog",l.static.title="script-updater",l.static.actions=[{action:"cancel",label:"Close",flags:["safe","close"]},{action:"save",label:"Run",flags:["primary","progressive"]}]}getSetupProcess=()=>l.super.prototype.getSetupProcess.call(this).next(()=>this.wrapAsyncMethod(this.loadScriptData).then(e=>{if(e){let i=new OO.ui.MessageWidget({type:"error",label:e});this.content=new OO.ui.PanelLayout({padded:!0,expanded:!1}),this.content.$element.append(i.$element),this.$body.append(this.content.$element),this.getActions().setAbilities({save:!1});return}this.content=new OO.ui.PanelLayout({padded:!0,expanded:!1}),this.scriptsMultiselect=new OO.ui.CheckboxMultiselectWidget({items:this.scripts.map(i=>new OO.ui.CheckboxMultioptionWidget({data:i.name,label:i.name}))}),this.scriptsMultiselect.$element[0].style.columnCount="2";let s=new OO.ui.FieldLayout(this.scriptsMultiselect,{label:new OO.ui.HtmlSnippet("<b>Scripts to update:</b>"),align:"top"});this.actionsMultiselect=new OO.ui.CheckboxMultiselectWidget({items:[{id:"documentation",name:"Update script documentation"},{id:"script",name:"Update script code"},{id:"talk",name:"Create talk redirect",selectedDefault:!1}].map(({id:i,name:r,selectedDefault:a})=>new OO.ui.CheckboxMultioptionWidget({data:i,label:r,selected:a??!0}))});let n=new OO.ui.FieldLayout(this.actionsMultiselect,{label:new OO.ui.HtmlSnippet("<b>Actions to take (if applicable):</b>"),align:"top"}),u=new OO.ui.ButtonGroupWidget({items:Object.entries(this.scriptDataUpdaters).map(([i,r])=>{let a=new OO.ui.ButtonWidget({label:i,flags:["progressive"]});return a.on("click",async()=>{mw.notify(`Fetching ${i} data...`,{tag:"update-script-data-notification"});let o=await r();mw.notify(`Successfully fetched ${i} data, opening diff...`,{type:"success",tag:"update-script-data-notification"}),await new Promise(c=>setTimeout(c,500)),this.openDiff(`User:Eejit43/scripts/${i}.json`,o)}),a})}),t=new OO.ui.FieldLayout(u,{label:new OO.ui.HtmlSnippet("<b>Script data updaters:</b>"),align:"top"});this.content.$element.append(s.$element),this.content.$element.append(n.$element),this.content.$element.append(t.$element),this.$body.append(this.content.$element)}));getActionProcess=e=>e==="cancel"?new OO.ui.Process(()=>{this.close()}):e==="save"?new OO.ui.Process(()=>{let s=this.scriptsMultiselect.findSelectedItemsData().map(n=>this.scripts.find(u=>u.name===n));this.close(),(async()=>(mw.notify("Syncing scripts...",{tag:"sync-scripts-notification"}),await Promise.all(s.map(n=>this.handleScript(n))),await this.editOrCreate("User:Eejit43/scripts-info",[this.mapScripts(this.scripts.filter(n=>!n.personal&&!n.fork)),"","=== Forks ===",this.mapScripts(this.scripts.filter(n=>n.fork)),"","=== Personal scripts ===",this.mapScripts(this.scripts.filter(n=>n.personal))].join(`
`),"Syncing script list from GitHub"),mw.notify(`Synced ${s.length} script${s.length===1?"":"s"} from GitHub!`,{type:"success",tag:"sync-scripts-notification"})))()}):l.super.prototype.getActionProcess.call(this,e);getTeardownProcess=()=>l.super.prototype.getTeardownProcess.call(this).next(()=>{this.$body.empty()});wrapAsyncMethod(e){let s=$.Deferred();return e().then(n=>s.resolve(n)),s.promise()}loadScriptData=async()=>{let e=await fetch(`https://api.github.com/repos/${this.REPO_OWNER}/${this.REPO_NAME}/commits`);if(!e.ok)return`Failed to fetch latest commit hash from GitHub: ${e.statusText} (${e.status})`;this.latestCommitHash=(await e.json())[0].sha;let s=await fetch(`https://raw.githubusercontent.com/${this.REPO_OWNER}/${this.REPO_NAME}/${this.latestCommitHash}/scripts.json`);if(!s.ok)return`Failed to fetch script data from GitHub: ${s.statusText} (${s.status})`;let n=await s.json();this.scripts=Object.entries(n).map(([u,t])=>({name:u,...t}))};async handleScript(e){let s=this.actionsMultiselect.findSelectedItemsData(),n=`User:Eejit43/scripts/${e.name}`,u=`User talk:Eejit43/scripts/${e.name}`,t=`${n}.js`,i=["{{User:Eejit43/script-documentation",e.image===!1?`| image             = ${e.image}`:null,e["in-development"]?`| in-development    = ${e["in-development"]}`:null,e["use-instead"]?`| use-instead       = ${e["use-instead"].includes("User:")?e["use-instead"]:`[[User:Eejit43/scripts/${e["use-instead"]}|${e["use-instead"]}]]`}`:null,e["image-caption"]?`| image-caption     = ${e["image-caption"]}`:null,e["other-authors"]?`| other-authors     = ${e["other-authors"].map(a=>`[[User:${a}|${a}]]`).join(", ")}`:null,`| description-short = ${e["short-description"]}`,`| description       = ${e.description}`,e.usage?`| usage             = ${e.usage}`:null,e.configuration?`| configuration     = ${e.configuration}`:null,e.changelog?`| changelog         = 
${Object.entries(e.changelog).map(([a,o])=>`* '''{{start date and age|${a}}}:'''${Array.isArray(o)?`
${o.map(c=>`** ${c}`).join(`
`)}`:` ${o}`}`).join(`
`)}`:null,`| skin-support      = {{User:Eejit43/script-documentation/skin-support|${Object.entries(e["skin-support"]).map(([a,o])=>`${a}=${o}`).join("|")}}}`,e["source-multiple"]?`| source-multiple   = ${e["source-multiple"]}`:null,e["global-support"]?`| global-support    = ${e["global-support"]}`:null,`| released          = {{start date and age|${e.released}}}`,`| updated           = {{start date and age|${e.updated}}}`,"}}"].filter(Boolean),r=null;if(s.includes("script")){let a=await fetch(`https://raw.githubusercontent.com/${this.REPO_OWNER}/${this.REPO_NAME}/${this.latestCommitHash}/dist/${e.name}.js`);if(a.ok)r=await a.text();else return mw.notify(`Failed to fetch "${e.name}.js" from GitHub: ${a.statusText} (${a.status})`,{type:"error",tag:"sync-scripts-notification"})}e.personal||(s.includes("documentation")&&await this.editOrCreate(n,i.join(`
`),"Syncing script documentation from GitHub"),s.includes("talk")&&await this.editOrCreate(u,"#REDIRECT [[User talk:Eejit43]]","Redirecting script documentation talk page to main user talk page")),r&&await this.editOrCreate(t,r,"Syncing script from GitHub")}mapScripts(e){return e.map(s=>`* [[User:Eejit43/scripts/${s.name}${s.personal?".js":""}|${s.name}]] - ${s["short-description"]||s.description}${s["in-development"]?' (<span style="color: #bd2828">in development</span>)':""}${s["use-instead"]?' (<span style="color: #bd2828">deprecated</span>)':""}`).join(`
`)}async editOrCreate(e,s,n){n+=this.SCRIPT_MESSAGE,await g.edit(e,()=>({text:s,summary:n,watchlist:"watch"})).catch(async(u,t)=>{if(u==="nocreate-missing")await g.create(e,{summary:n,watchlist:"watch"},s).catch((i,r)=>{mw.notify(`Error creating ${e}: ${r?.error?.info??"Unknown error"} (${i})`,{type:"error"})});else{mw.notify(`Error editing or creating ${e}: ${t?.error?.info??"Unknown error"} (${u})`,{type:"error"});return}})}openDiff(e,s){let n={wpTextbox1:s,wpSummary:`Updating data${this.SCRIPT_MESSAGE}`,wpDiff:"1",wpWatchthis:"1",wpUltimateParam:"1"},u=new URL(`${mw.config.get("wgScriptPath")}/index.php`,window.location.origin);u.searchParams.set("title",e),u.searchParams.set("action","submit");let t=document.createElement("form");t.action=u.toString(),t.method="POST",t.target="_blank";for(let[i,r]of Object.entries(n)){let a=document.createElement("input");a.type="hidden",a.name=i,a.value=r,t.append(a)}document.body.append(t),t.submit(),t.remove()}}Object.assign(l.prototype,OO.ui.ProcessDialog.prototype)});async function w(){let m=(await y("Wikipedia:AutoWikiBrowser/Template redirects")??"").matchAll(/\* {{tl\|.+/g).toArray().map(l=>{let p=l[0].matchAll(/{{tl\|(.+?)}}/g).toArray();return{from:p.slice(0,-1).map(e=>e[1]),to:p.at(-1)[1]}});return JSON.stringify(m)}function h(d,m){let l=[];for(let p=0;p<d.length;p+=m){let e=d.slice(p,p+m);l.push(e)}return l}async function b(d){let m=0,l=[],p={continue:{}};for(;"continue"in p&&m<10;)p=await g.get({...d,...p.continue}),l.push(p),m++;return l}async function O(){let d=await g.get({action:"query",list:"categorymembers",cmtitle:"Category:Redirect templates",cmlimit:"max",formatversion:"2"}),m=await g.get({action:"query",list:"categorymembers",cmtitle:"Category:Template redirects with possibilities",cmlimit:"max",formatversion:"2"}),l=d.query.categorymembers.filter(t=>t.title.startsWith("Template:R ")&&t.title!=="Template:R template index").map(t=>({name:t.title.split(":")[1],redirect:!1})),p=m.query.categorymembers.filter(t=>t.title.startsWith("Template:R ")&&t.title!=="Template:R with possibilities").map(t=>({name:t.title.split(":")[1],redirect:!0})),e=[...l,...p].sort((t,i)=>t.name.startsWith("R comics")||t.name.startsWith("R ME")?1:i.name.startsWith("R comics")||i.name.startsWith("R ME")?-1:t.name.localeCompare(i.name)),s=Object.fromEntries(e.map(t=>[t.name,{redirect:t.redirect,parameters:{},aliases:[]}]));await Promise.all(h(e,50).map(async t=>{let i=await g.get({action:"templatedata",titles:t.map(r=>`Template:${r.name}`),formatversion:"2"});for(let r of Object.values(i.pages)){let a=Object.fromEntries(Object.entries(r.params).map(([o,c])=>[o,{aliases:c.aliases,label:c.label?.en??null,description:c.description?.en??null,type:c.type,required:c.required,suggested:c.suggested,default:c.default?.en??null,example:c.example?.en??null}]));s[r.title.split(":")[1]].parameters=a}})),await Promise.all(h(l,50).map(async t=>{let r=(await b({action:"query",titles:t.map(a=>`Template:${a.name}`),prop:"redirects",rdnamespace:10,rdlimit:"max",formatversion:"2"})).flatMap(a=>a.query.pages);for(let a of r){let o=a.redirects?.map(c=>c.title.split(":")[1]).filter(c=>!p.some(f=>f.name===c)).sort((c,f)=>c.localeCompare(f))??[];s[a.title.split(":")[1]].aliases.push(...o)}}));let n=[];await Promise.all(h(p,50).map(async t=>{let i=await g.get({action:"query",titles:t.map(r=>`Template:${r.name}`),prop:"linkshere",lhnamespace:10,lhlimit:"max",formatversion:"2"});for(let r of i.query.pages){let a=r.linkshere?.filter(o=>o.redirect).map(o=>o.title.split(":")[1]).filter(o=>!o.endsWith("/doc")&&!o.endsWith("/sandbox")).sort((o,c)=>o.localeCompare(c))??[];n.push(...a),s[r.title.split(":")[1]].aliases=a}}));let u=Object.entries(s).map(([t,i])=>{let r={...i.redirect?{redirect:!0}:{},parameters:i.parameters,aliases:i.aliases.sort((a,o)=>a.localeCompare(o))};return[t,r]});for(let t of n)for(let[,i]of u)!i.redirect&&i.aliases.includes(t)&&(i.aliases=i.aliases.filter(r=>r!==t));return JSON.stringify(Object.fromEntries(u))}})();

// </pre>
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vdXRpbGl0eS50cyIsICIuLi9zY3JpcHRzL3NjcmlwdC11cGRhdGVyLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgdHlwZSB7IEFwaVF1ZXJ5QWxsTWVzc2FnZXNQYXJhbXMsIEFwaVF1ZXJ5UmV2aXNpb25zUGFyYW1zIH0gZnJvbSAndHlwZXMtbWVkaWF3aWtpLWFwaSc7XG5pbXBvcnQgdHlwZSB7IEFsbE1lc3NhZ2VzUmVzdWx0LCBQYWdlUmV2aXNpb25zUmVzdWx0IH0gZnJvbSAnLi9nbG9iYWwtdHlwZXMnO1xuXG5leHBvcnQgY29uc3QgYXBpID0gbmV3IG13LkFwaSgpO1xuXG4vKipcbiAqIEZldGNoZXMgdGhlIGNvbnRlbnQgb2YgYSBnaXZlbiBwYWdlLlxuICogQHBhcmFtIHRpdGxlIFRoZSB0aXRsZSB0byBmZXRjaC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFBhZ2VDb250ZW50KHRpdGxlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gKFxuICAgICAgICAoYXdhaXQgYXBpLmdldCh7XG4gICAgICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICBwcm9wOiAncmV2aXNpb25zJyxcbiAgICAgICAgICAgIHJ2cHJvcDogJ2NvbnRlbnQnLFxuICAgICAgICAgICAgcnZzbG90czogJ21haW4nLFxuICAgICAgICAgICAgdGl0bGVzOiB0aXRsZSxcbiAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlSZXZpc2lvbnNQYXJhbXMpKSBhcyBQYWdlUmV2aXNpb25zUmVzdWx0XG4gICAgKS5xdWVyeS5wYWdlc1swXS5yZXZpc2lvbnM/LlswXS5zbG90cy5tYWluLmNvbnRlbnQudHJpbSgpO1xufVxuXG4vKipcbiAqIEdldHMgYSBzeXN0ZW0gbWVzc2FnZS5cbiAqIEBwYXJhbSBtZXNzYWdlTmFtZSBUaGUgbmFtZSBvZiB0aGUgc3lzdGVtIG1lc3NhZ2UuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRTeXN0ZW1NZXNzYWdlKG1lc3NhZ2VOYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gKFxuICAgICAgICAoYXdhaXQgYXBpLmdldCh7XG4gICAgICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgICAgICBtZXRhOiAnYWxsbWVzc2FnZXMnLFxuICAgICAgICAgICAgYW1tZXNzYWdlczogbWVzc2FnZU5hbWUsXG4gICAgICAgICAgICBhbWxhbmc6IG13LmNvbmZpZy5nZXQoJ3dnQ29udGVudExhbmd1YWdlJyksXG4gICAgICAgIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5QWxsTWVzc2FnZXNQYXJhbXMpKSBhcyBBbGxNZXNzYWdlc1Jlc3VsdFxuICAgICkucXVlcnk/LmFsbG1lc3NhZ2VzWzBdLmNvbnRlbnQ7XG59XG5cbi8qKlxuICogSW50ZXJwb2xhdGVzIGEgc3lzdGVtIG1lc3NhZ2Ugd2l0aCB2YWx1ZXMuXG4gKiBAcGFyYW0gbWVzc2FnZSBUaGUgc3lzdGVtIG1lc3NhZ2UgdG8gaW50ZXJwb2xhdGUuXG4gKiBAcGFyYW0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gaW50ZXJwb2xhdGUgaW50byB0aGUgbWVzc2FnZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludGVycG9sYXRlU3lzdGVtTWVzc2FnZShtZXNzYWdlOiBzdHJpbmcsIHZhbHVlczogc3RyaW5nW10pIHtcbiAgICBsZXQgcmVzdWx0ID0gbWVzc2FnZTtcblxuICAgIGZvciAoY29uc3QgW2luZGV4LCB2YWx1ZV0gb2YgdmFsdWVzLmVudHJpZXMoKSkgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2VBbGwoYCQke2luZGV4ICsgMX1gLCB2YWx1ZSk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuIiwgImltcG9ydCB0eXBlIHtcbiAgICBDYXRlZ29yeU1lbWJlcnNSZXN1bHQsXG4gICAgTGlua3NIZXJlUmVzdWx0LFxuICAgIE1lZGlhV2lraURhdGFFcnJvcixcbiAgICBRdWVyeUNvbnRpbnVhdGlvbixcbiAgICBSZWRpcmVjdHNSZXN1bHQsXG4gICAgVGVtcGxhdGVEYXRhUmVzdWx0LFxufSBmcm9tICdAL2dsb2JhbC10eXBlcyc7XG5pbXBvcnQgeyBhcGksIGdldFBhZ2VDb250ZW50IH0gZnJvbSAnQC91dGlsaXR5JztcbmltcG9ydCB0eXBlIHtcbiAgICBBcGlRdWVyeUJhY2tsaW5rc3Byb3BQYXJhbXMsXG4gICAgQXBpUXVlcnlDYXRlZ29yeU1lbWJlcnNQYXJhbXMsXG4gICAgQXBpUXVlcnlQYXJhbXMsXG4gICAgVGVtcGxhdGVEYXRhQXBpVGVtcGxhdGVEYXRhUGFyYW1zLFxufSBmcm9tICd0eXBlcy1tZWRpYXdpa2ktYXBpJztcbmltcG9ydCB0eXBlIHsgQXBpUmVzcG9uc2UgfSBmcm9tICd0eXBlcy1tZWRpYXdpa2kvbXcvQXBpJztcblxuaW50ZXJmYWNlIFNjcmlwdCB7XG4gICAgJ25hbWUnOiBzdHJpbmc7XG4gICAgJ2luLWRldmVsb3BtZW50Jz86IGJvb2xlYW47XG4gICAgJ3VzZS1pbnN0ZWFkJz86IHN0cmluZztcbiAgICAnaW1hZ2UnPzogZmFsc2U7XG4gICAgJ2ltYWdlLWNhcHRpb24nPzogc3RyaW5nO1xuICAgICdzaG9ydC1kZXNjcmlwdGlvbic6IHN0cmluZztcbiAgICAnZGVzY3JpcHRpb24nOiBzdHJpbmc7XG4gICAgJ3VzYWdlJz86IHN0cmluZztcbiAgICAnY29uZmlndXJhdGlvbic/OiBzdHJpbmc7XG4gICAgJ2NoYW5nZWxvZyc/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBzdHJpbmdbXT47XG4gICAgJ290aGVyLWF1dGhvcnMnPzogc3RyaW5nW107XG4gICAgJ2ZvcmsnPzogdHJ1ZTtcbiAgICAncGVyc29uYWwnPzogdHJ1ZTtcbiAgICAnc2tpbi1zdXBwb3J0JzogUmVjb3JkPHN0cmluZywgYm9vbGVhbj47XG4gICAgJ3NvdXJjZS1tdWx0aXBsZSc/OiB0cnVlO1xuICAgICdnbG9iYWwtc3VwcG9ydCc/OiB0cnVlO1xuICAgICdyZWxlYXNlZCc6IHN0cmluZztcbiAgICAndXBkYXRlZCc6IHN0cmluZztcbn1cblxubXcubG9hZGVyLnVzaW5nKFsnbWVkaWF3aWtpLnV0aWwnLCAnb29qcy11aS1jb3JlJywgJ29vanMtdWktd2lkZ2V0cycsICdvb2pzLXVpLXdpbmRvd3MnXSwgKCkgPT4ge1xuICAgIGlmIChtdy5jb25maWcuZ2V0KCd3Z1VzZXJOYW1lJykgIT09ICdFZWppdDQzJyB8fCBtdy5jb25maWcuZ2V0KCd3Z1BhZ2VOYW1lJykgIT09ICdVc2VyOkVlaml0NDMnKSByZXR1cm47XG5cbiAgICBjb25zdCBmdWxsTGlua0VsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcubXctZWRpdHNlY3Rpb24nKSEuY2xvbmVOb2RlKHRydWUpIGFzIEhUTUxTcGFuRWxlbWVudDtcblxuICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgbGluay5ocmVmID0gJyMnO1xuICAgIGxpbmsuc3R5bGUuZm9udFdlaWdodCA9ICdib2xkJztcbiAgICBsaW5rLnRleHRDb250ZW50ID0gJ1N5bmMgZnJvbSBHaXRIdWInO1xuICAgIGxpbmsuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXZlbnQpID0+IHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBjb25zdCB3aW5kb3dNYW5hZ2VyID0gbmV3IE9PLnVpLldpbmRvd01hbmFnZXIoKTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmQod2luZG93TWFuYWdlci4kZWxlbWVudFswXSk7XG5cbiAgICAgICAgY29uc3Qgc2NyaXB0VXBkYXRlckRpYWxvZyA9IG5ldyBTY3JpcHRVcGRhdGVyRGlhbG9nKCk7XG4gICAgICAgIHdpbmRvd01hbmFnZXIuYWRkV2luZG93cyhbc2NyaXB0VXBkYXRlckRpYWxvZ10pO1xuXG4gICAgICAgIHNjcmlwdFVwZGF0ZXJEaWFsb2cub3BlbigpO1xuICAgIH0pO1xuXG4gICAgZnVsbExpbmtFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2EnKSEucmVwbGFjZVdpdGgobGluayk7XG5cbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdoMiNNeV91c2VyX3NjcmlwdHMgKyAubXctZWRpdHNlY3Rpb24nKSEuYWZ0ZXIoZnVsbExpbmtFbGVtZW50KTtcblxuICAgIC8qKlxuICAgICAqIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaXMgYSBkaWFsb2cgdGhhdCBtYW5hZ2VzIHVwZGF0aW5nIHNjcmlwdHMuXG4gICAgICovXG4gICAgY2xhc3MgU2NyaXB0VXBkYXRlckRpYWxvZyBleHRlbmRzIE9PLnVpLlByb2Nlc3NEaWFsb2cge1xuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFJFUE9fT1dORVIgPSAnRWVqaXQ0Myc7XG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgUkVQT19OQU1FID0gJ3dpa2lwZWRpYS1zY3JpcHRzJztcblxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFNDUklQVF9NRVNTQUdFID0gJyAodmlhIFtbVXNlcjpFZWppdDQzL3NjcmlwdHMvc2NyaXB0LXVwZGF0ZXIuanN8c2NyaXB0XV0pJztcblxuICAgICAgICBwcml2YXRlIGNvbnRlbnQhOiBPTy51aS5QYW5lbExheW91dDtcbiAgICAgICAgcHJpdmF0ZSBzY3JpcHRzTXVsdGlzZWxlY3QhOiBPTy51aS5DaGVja2JveE11bHRpc2VsZWN0V2lkZ2V0O1xuICAgICAgICBwcml2YXRlIGFjdGlvbnNNdWx0aXNlbGVjdCE6IE9PLnVpLkNoZWNrYm94TXVsdGlzZWxlY3RXaWRnZXQ7XG5cbiAgICAgICAgcHJpdmF0ZSBsYXRlc3RDb21taXRIYXNoITogc3RyaW5nO1xuICAgICAgICBwcml2YXRlIHNjcmlwdHMhOiBTY3JpcHRbXTtcblxuICAgICAgICBwcml2YXRlIHNjcmlwdERhdGFVcGRhdGVycyA9IHtcbiAgICAgICAgICAgICdhcnRpY2xlLWNsZWFuZXInOiBnZXRBcnRpY2xlQ2xlYW5lckRhdGEsXG4gICAgICAgICAgICAncmVkaXJlY3QtaGVscGVyJzogZ2V0UmVkaXJlY3RIZWxwZXJEYXRhLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgICAgc3VwZXIoeyBzaXplOiAnbWVkaXVtJyB9KTtcblxuICAgICAgICAgICAgU2NyaXB0VXBkYXRlckRpYWxvZy5zdGF0aWMubmFtZSA9ICdTY3JpcHRVcGRhdGVyRGlhbG9nJztcbiAgICAgICAgICAgIFNjcmlwdFVwZGF0ZXJEaWFsb2cuc3RhdGljLnRpdGxlID0gJ3NjcmlwdC11cGRhdGVyJztcbiAgICAgICAgICAgIFNjcmlwdFVwZGF0ZXJEaWFsb2cuc3RhdGljLmFjdGlvbnMgPSBbXG4gICAgICAgICAgICAgICAgeyBhY3Rpb246ICdjYW5jZWwnLCBsYWJlbDogJ0Nsb3NlJywgZmxhZ3M6IFsnc2FmZScsICdjbG9zZSddIH0sXG4gICAgICAgICAgICAgICAgeyBhY3Rpb246ICdzYXZlJywgbGFiZWw6ICdSdW4nLCBmbGFnczogWydwcmltYXJ5JywgJ3Byb2dyZXNzaXZlJ10gfSxcbiAgICAgICAgICAgIF07XG4gICAgICAgIH1cblxuICAgICAgICBnZXRTZXR1cFByb2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gU2NyaXB0VXBkYXRlckRpYWxvZy5zdXBlci5wcm90b3R5cGUuZ2V0U2V0dXBQcm9jZXNzLmNhbGwodGhpcykubmV4dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMud3JhcEFzeW5jTWV0aG9kKHRoaXMubG9hZFNjcmlwdERhdGEpLnRoZW4oKGVycm9yPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZUVsZW1lbnQgPSBuZXcgT08udWkuTWVzc2FnZVdpZGdldCh7IHR5cGU6ICdlcnJvcicsIGxhYmVsOiBlcnJvciB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZW50ID0gbmV3IE9PLnVpLlBhbmVsTGF5b3V0KHsgcGFkZGVkOiB0cnVlLCBleHBhbmRlZDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnQuJGVsZW1lbnQuYXBwZW5kKG1lc3NhZ2VFbGVtZW50LiRlbGVtZW50KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMgYXMgdW5rbm93biBhcyB7ICRib2R5OiBKUXVlcnkgfSkuJGJvZHkuYXBwZW5kKHRoaXMuY29udGVudC4kZWxlbWVudCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0QWN0aW9ucygpLnNldEFiaWxpdGllcyh7IHNhdmU6IGZhbHNlIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnQgPSBuZXcgT08udWkuUGFuZWxMYXlvdXQoeyBwYWRkZWQ6IHRydWUsIGV4cGFuZGVkOiBmYWxzZSB9KTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcmlwdHNNdWx0aXNlbGVjdCA9IG5ldyBPTy51aS5DaGVja2JveE11bHRpc2VsZWN0V2lkZ2V0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zOiB0aGlzLnNjcmlwdHMubWFwKChzY3JpcHQpID0+IG5ldyBPTy51aS5DaGVja2JveE11bHRpb3B0aW9uV2lkZ2V0KHsgZGF0YTogc2NyaXB0Lm5hbWUsIGxhYmVsOiBzY3JpcHQubmFtZSB9KSksXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcmlwdHNNdWx0aXNlbGVjdC4kZWxlbWVudFswXS5zdHlsZS5jb2x1bW5Db3VudCA9ICcyJztcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzY3JpcHRzTXVsdGlzZWxlY3RMYXlvdXQgPSBuZXcgT08udWkuRmllbGRMYXlvdXQodGhpcy5zY3JpcHRzTXVsdGlzZWxlY3QsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBuZXcgT08udWkuSHRtbFNuaXBwZXQoJzxiPlNjcmlwdHMgdG8gdXBkYXRlOjwvYj4nKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduOiAndG9wJyxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3Rpb25zTXVsdGlzZWxlY3QgPSBuZXcgT08udWkuQ2hlY2tib3hNdWx0aXNlbGVjdFdpZGdldCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgaWQ6ICdkb2N1bWVudGF0aW9uJywgbmFtZTogJ1VwZGF0ZSBzY3JpcHQgZG9jdW1lbnRhdGlvbicgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGlkOiAnc2NyaXB0JywgbmFtZTogJ1VwZGF0ZSBzY3JpcHQgY29kZScgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGlkOiAndGFsaycsIG5hbWU6ICdDcmVhdGUgdGFsayByZWRpcmVjdCcsIHNlbGVjdGVkRGVmYXVsdDogZmFsc2UgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIF0ubWFwKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7IGlkLCBuYW1lLCBzZWxlY3RlZERlZmF1bHQgfSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9PLnVpLkNoZWNrYm94TXVsdGlvcHRpb25XaWRnZXQoeyBkYXRhOiBpZCwgbGFiZWw6IG5hbWUsIHNlbGVjdGVkOiBzZWxlY3RlZERlZmF1bHQgPz8gdHJ1ZSB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFjdGlvbnNNdWx0aXNlbGVjdExheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dCh0aGlzLmFjdGlvbnNNdWx0aXNlbGVjdCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IG5ldyBPTy51aS5IdG1sU25pcHBldCgnPGI+QWN0aW9ucyB0byB0YWtlIChpZiBhcHBsaWNhYmxlKTo8L2I+JyksXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGlnbjogJ3RvcCcsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJ1dHRvbkdyb3VwID0gbmV3IE9PLnVpLkJ1dHRvbkdyb3VwV2lkZ2V0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zOiBPYmplY3QuZW50cmllcyh0aGlzLnNjcmlwdERhdGFVcGRhdGVycykubWFwKChbbmFtZSwgdXBkYXRlcl0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBidXR0b24gPSBuZXcgT08udWkuQnV0dG9uV2lkZ2V0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzOiBbJ3Byb2dyZXNzaXZlJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uLm9uKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXcubm90aWZ5KGBGZXRjaGluZyAke25hbWV9IGRhdGEuLi5gLCB7IHRhZzogJ3VwZGF0ZS1zY3JpcHQtZGF0YS1ub3RpZmljYXRpb24nIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB1cGRhdGVyKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXcubm90aWZ5KGBTdWNjZXNzZnVsbHkgZmV0Y2hlZCAke25hbWV9IGRhdGEsIG9wZW5pbmcgZGlmZi4uLmAsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdzdWNjZXNzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZzogJ3VwZGF0ZS1zY3JpcHQtZGF0YS1ub3RpZmljYXRpb24nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCA1MDApKTsgLy8gQWxsb3cgdGhlIG5vdGlmaWNhdGlvbiB0byBiZSBzaG93blxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3BlbkRpZmYoYFVzZXI6RWVqaXQ0My9zY3JpcHRzLyR7bmFtZX0uanNvbmAsIGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1dHRvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzY3JpcHREYXRhVXBkYXRlcnNNdWx0aXNlbGVjdExheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dChidXR0b25Hcm91cCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IG5ldyBPTy51aS5IdG1sU25pcHBldCgnPGI+U2NyaXB0IGRhdGEgdXBkYXRlcnM6PC9iPicpLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ246ICd0b3AnLFxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnQuJGVsZW1lbnQuYXBwZW5kKHNjcmlwdHNNdWx0aXNlbGVjdExheW91dC4kZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGVudC4kZWxlbWVudC5hcHBlbmQoYWN0aW9uc011bHRpc2VsZWN0TGF5b3V0LiRlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZW50LiRlbGVtZW50LmFwcGVuZChzY3JpcHREYXRhVXBkYXRlcnNNdWx0aXNlbGVjdExheW91dC4kZWxlbWVudCk7XG5cbiAgICAgICAgICAgICAgICAgICAgKHRoaXMgYXMgdW5rbm93biBhcyB7ICRib2R5OiBKUXVlcnkgfSkuJGJvZHkuYXBwZW5kKHRoaXMuY29udGVudC4kZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBnZXRBY3Rpb25Qcm9jZXNzID0gKGFjdGlvbjogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBpZiAoYWN0aW9uID09PSAnY2FuY2VsJylcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE9PLnVpLlByb2Nlc3MoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBlbHNlIGlmIChhY3Rpb24gPT09ICdzYXZlJylcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE9PLnVpLlByb2Nlc3MoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZFNjcmlwdHMgPSAodGhpcy5zY3JpcHRzTXVsdGlzZWxlY3QuZmluZFNlbGVjdGVkSXRlbXNEYXRhKCkgYXMgc3RyaW5nW10pLm1hcChcbiAgICAgICAgICAgICAgICAgICAgICAgIChzY3JpcHROYW1lKSA9PiB0aGlzLnNjcmlwdHMuZmluZCgoc2NyaXB0KSA9PiBzY3JpcHQubmFtZSA9PT0gc2NyaXB0TmFtZSkhLFxuICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcblxuICAgICAgICAgICAgICAgICAgICB2b2lkIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtdy5ub3RpZnkoJ1N5bmNpbmcgc2NyaXB0cy4uLicsIHsgdGFnOiAnc3luYy1zY3JpcHRzLW5vdGlmaWNhdGlvbicgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHNlbGVjdGVkU2NyaXB0cy5tYXAoKHNjcmlwdCkgPT4gdGhpcy5oYW5kbGVTY3JpcHQoc2NyaXB0KSkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmVkaXRPckNyZWF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVXNlcjpFZWppdDQzL3NjcmlwdHMtaW5mbycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcFNjcmlwdHModGhpcy5zY3JpcHRzLmZpbHRlcigoc2NyaXB0KSA9PiAhc2NyaXB0LnBlcnNvbmFsICYmICFzY3JpcHQuZm9yaykpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJz09PSBGb3JrcyA9PT0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcFNjcmlwdHModGhpcy5zY3JpcHRzLmZpbHRlcigoc2NyaXB0KSA9PiBzY3JpcHQuZm9yaykpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJz09PSBQZXJzb25hbCBzY3JpcHRzID09PScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFwU2NyaXB0cyh0aGlzLnNjcmlwdHMuZmlsdGVyKChzY3JpcHQpID0+IHNjcmlwdC5wZXJzb25hbCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0uam9pbignXFxuJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1N5bmNpbmcgc2NyaXB0IGxpc3QgZnJvbSBHaXRIdWInLFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgbXcubm90aWZ5KGBTeW5jZWQgJHtzZWxlY3RlZFNjcmlwdHMubGVuZ3RofSBzY3JpcHQke3NlbGVjdGVkU2NyaXB0cy5sZW5ndGggPT09IDEgPyAnJyA6ICdzJ30gZnJvbSBHaXRIdWIhYCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdzdWNjZXNzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWc6ICdzeW5jLXNjcmlwdHMtbm90aWZpY2F0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZWxzZSByZXR1cm4gU2NyaXB0VXBkYXRlckRpYWxvZy5zdXBlci5wcm90b3R5cGUuZ2V0QWN0aW9uUHJvY2Vzcy5jYWxsKHRoaXMsIGFjdGlvbik7XG4gICAgICAgIH07XG5cbiAgICAgICAgZ2V0VGVhcmRvd25Qcm9jZXNzID0gKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIFNjcmlwdFVwZGF0ZXJEaWFsb2cuc3VwZXIucHJvdG90eXBlLmdldFRlYXJkb3duUHJvY2Vzcy5jYWxsKHRoaXMpLm5leHQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICh0aGlzIGFzIHVua25vd24gYXMgeyAkYm9keTogSlF1ZXJ5IH0pLiRib2R5LmVtcHR5KCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogV3JhcHMgYW4gYXN5bmMgbWV0aG9kIGludG8gYSBqUXVlcnkgRGVmZXJyZWQgb2JqZWN0LlxuICAgICAgICAgKiBAcGFyYW0gbWV0aG9kIFRoZSBtZXRob2QgdG8gd3JhcC5cbiAgICAgICAgICovXG4gICAgICAgIHByaXZhdGUgd3JhcEFzeW5jTWV0aG9kKG1ldGhvZDogKCkgPT4gUHJvbWlzZTx1bmtub3duPikge1xuICAgICAgICAgICAgY29uc3QgZGVmZXJyZWQgPSAkLkRlZmVycmVkKCk7XG5cbiAgICAgICAgICAgIHZvaWQgbWV0aG9kKCkudGhlbigocmVzdWx0KSA9PiBkZWZlcnJlZC5yZXNvbHZlKHJlc3VsdCkpO1xuXG4gICAgICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIExvYWRzIGRhdGEgZm9yIGFsbCBzY3JpcHRzLlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSBsb2FkU2NyaXB0RGF0YSA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxhdGVzdENvbW1pdEhhc2hSZXNwb25zZSA9IGF3YWl0IGZldGNoKGBodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zLyR7dGhpcy5SRVBPX09XTkVSfS8ke3RoaXMuUkVQT19OQU1FfS9jb21taXRzYCk7XG4gICAgICAgICAgICBpZiAoIWxhdGVzdENvbW1pdEhhc2hSZXNwb25zZS5vaylcbiAgICAgICAgICAgICAgICByZXR1cm4gYEZhaWxlZCB0byBmZXRjaCBsYXRlc3QgY29tbWl0IGhhc2ggZnJvbSBHaXRIdWI6ICR7bGF0ZXN0Q29tbWl0SGFzaFJlc3BvbnNlLnN0YXR1c1RleHR9ICgke2xhdGVzdENvbW1pdEhhc2hSZXNwb25zZS5zdGF0dXN9KWA7XG5cbiAgICAgICAgICAgIHRoaXMubGF0ZXN0Q29tbWl0SGFzaCA9ICgoYXdhaXQgbGF0ZXN0Q29tbWl0SGFzaFJlc3BvbnNlLmpzb24oKSkgYXMgeyBzaGE6IHN0cmluZyB9W10pWzBdLnNoYTtcblxuICAgICAgICAgICAgY29uc3Qgc2NyaXB0RGF0YVJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXG4gICAgICAgICAgICAgICAgYGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS8ke3RoaXMuUkVQT19PV05FUn0vJHt0aGlzLlJFUE9fTkFNRX0vJHt0aGlzLmxhdGVzdENvbW1pdEhhc2h9L3NjcmlwdHMuanNvbmAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKCFzY3JpcHREYXRhUmVzcG9uc2Uub2spXG4gICAgICAgICAgICAgICAgcmV0dXJuIGBGYWlsZWQgdG8gZmV0Y2ggc2NyaXB0IGRhdGEgZnJvbSBHaXRIdWI6ICR7c2NyaXB0RGF0YVJlc3BvbnNlLnN0YXR1c1RleHR9ICgke3NjcmlwdERhdGFSZXNwb25zZS5zdGF0dXN9KWA7XG5cbiAgICAgICAgICAgIGNvbnN0IHNjcmlwdERhdGEgPSAoYXdhaXQgc2NyaXB0RGF0YVJlc3BvbnNlLmpzb24oKSkgYXMgUmVjb3JkPHN0cmluZywgT21pdDxTY3JpcHQsICduYW1lJz4+O1xuXG4gICAgICAgICAgICB0aGlzLnNjcmlwdHMgPSBPYmplY3QuZW50cmllcyhzY3JpcHREYXRhKS5tYXAoKFtzY3JpcHROYW1lLCBzY3JpcHRdKSA9PiAoeyBuYW1lOiBzY3JpcHROYW1lLCAuLi5zY3JpcHQgfSkpO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBIYW5kbGVzIGFuZCBlZGl0cy9jcmVhdGVzIHBhZ2VzIGZvciBhIGdpdmVuIHNjcmlwdC5cbiAgICAgICAgICogQHBhcmFtIHNjcmlwdCBUaGUgc2NyaXB0IHRvIGhhbmRsZS5cbiAgICAgICAgICovXG4gICAgICAgIHByaXZhdGUgYXN5bmMgaGFuZGxlU2NyaXB0KHNjcmlwdDogU2NyaXB0KSB7XG4gICAgICAgICAgICBjb25zdCBhY3Rpb25zVG9UYWtlID0gdGhpcy5hY3Rpb25zTXVsdGlzZWxlY3QuZmluZFNlbGVjdGVkSXRlbXNEYXRhKCkgYXMgKCdkb2N1bWVudGF0aW9uJyB8ICdzY3JpcHQnIHwgJ3RhbGsnKVtdO1xuXG4gICAgICAgICAgICBjb25zdCBzdWJwYWdlTmFtZSA9IGBVc2VyOkVlaml0NDMvc2NyaXB0cy8ke3NjcmlwdC5uYW1lfWA7XG4gICAgICAgICAgICBjb25zdCBzdWJwYWdlVGFsa05hbWUgPSBgVXNlciB0YWxrOkVlaml0NDMvc2NyaXB0cy8ke3NjcmlwdC5uYW1lfWA7XG4gICAgICAgICAgICBjb25zdCBzY3JpcHROYW1lID0gYCR7c3VicGFnZU5hbWV9LmpzYDtcblxuICAgICAgICAgICAgY29uc3QgZnVsbFN1YnBhZ2VJbmZvID0gW1xuICAgICAgICAgICAgICAgICd7e1VzZXI6RWVqaXQ0My9zY3JpcHQtZG9jdW1lbnRhdGlvbicsXG4gICAgICAgICAgICAgICAgc2NyaXB0LmltYWdlID09PSBmYWxzZSA/IGB8IGltYWdlICAgICAgICAgICAgID0gJHtzY3JpcHQuaW1hZ2V9YCA6IG51bGwsXG4gICAgICAgICAgICAgICAgc2NyaXB0Wydpbi1kZXZlbG9wbWVudCddID8gYHwgaW4tZGV2ZWxvcG1lbnQgICAgPSAke3NjcmlwdFsnaW4tZGV2ZWxvcG1lbnQnXX1gIDogbnVsbCxcbiAgICAgICAgICAgICAgICBzY3JpcHRbJ3VzZS1pbnN0ZWFkJ11cbiAgICAgICAgICAgICAgICAgICAgPyBgfCB1c2UtaW5zdGVhZCAgICAgICA9ICR7c2NyaXB0Wyd1c2UtaW5zdGVhZCddLmluY2x1ZGVzKCdVc2VyOicpID8gc2NyaXB0Wyd1c2UtaW5zdGVhZCddIDogYFtbVXNlcjpFZWppdDQzL3NjcmlwdHMvJHtzY3JpcHRbJ3VzZS1pbnN0ZWFkJ119fCR7c2NyaXB0Wyd1c2UtaW5zdGVhZCddfV1dYH1gXG4gICAgICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICAgICAgICBzY3JpcHRbJ2ltYWdlLWNhcHRpb24nXSA/IGB8IGltYWdlLWNhcHRpb24gICAgID0gJHtzY3JpcHRbJ2ltYWdlLWNhcHRpb24nXX1gIDogbnVsbCxcbiAgICAgICAgICAgICAgICBzY3JpcHRbJ290aGVyLWF1dGhvcnMnXVxuICAgICAgICAgICAgICAgICAgICA/IGB8IG90aGVyLWF1dGhvcnMgICAgID0gJHtzY3JpcHRbJ290aGVyLWF1dGhvcnMnXS5tYXAoKGF1dGhvcikgPT4gYFtbVXNlcjoke2F1dGhvcn18JHthdXRob3J9XV1gKS5qb2luKCcsICcpfWBcbiAgICAgICAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgICAgICAgIGB8IGRlc2NyaXB0aW9uLXNob3J0ID0gJHtzY3JpcHRbJ3Nob3J0LWRlc2NyaXB0aW9uJ119YCxcbiAgICAgICAgICAgICAgICBgfCBkZXNjcmlwdGlvbiAgICAgICA9ICR7c2NyaXB0LmRlc2NyaXB0aW9ufWAsXG4gICAgICAgICAgICAgICAgc2NyaXB0LnVzYWdlID8gYHwgdXNhZ2UgICAgICAgICAgICAgPSAke3NjcmlwdC51c2FnZX1gIDogbnVsbCxcbiAgICAgICAgICAgICAgICBzY3JpcHQuY29uZmlndXJhdGlvbiA/IGB8IGNvbmZpZ3VyYXRpb24gICAgID0gJHtzY3JpcHQuY29uZmlndXJhdGlvbn1gIDogbnVsbCxcbiAgICAgICAgICAgICAgICBzY3JpcHQuY2hhbmdlbG9nXG4gICAgICAgICAgICAgICAgICAgID8gYHwgY2hhbmdlbG9nICAgICAgICAgPSBcXG4ke09iamVjdC5lbnRyaWVzKHNjcmlwdC5jaGFuZ2Vsb2cpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoW2RhdGUsIGRlc2NyaXB0aW9uXSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgKiAnJyd7e3N0YXJ0IGRhdGUgYW5kIGFnZXwke2RhdGV9fX06JycnJHtBcnJheS5pc0FycmF5KGRlc2NyaXB0aW9uKSA/IGBcXG4ke2Rlc2NyaXB0aW9uLm1hcCgobGluZSkgPT4gYCoqICR7bGluZX1gKS5qb2luKCdcXG4nKX1gIDogYCAke2Rlc2NyaXB0aW9ufWB9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAuam9pbignXFxuJyl9YFxuICAgICAgICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgICAgICAgYHwgc2tpbi1zdXBwb3J0ICAgICAgPSB7e1VzZXI6RWVqaXQ0My9zY3JpcHQtZG9jdW1lbnRhdGlvbi9za2luLXN1cHBvcnR8JHtPYmplY3QuZW50cmllcyhzY3JpcHRbJ3NraW4tc3VwcG9ydCddKVxuICAgICAgICAgICAgICAgICAgICAubWFwKChbc2tpbiwgc3RhdHVzXSkgPT4gYCR7c2tpbn09JHtzdGF0dXN9YClcbiAgICAgICAgICAgICAgICAgICAgLmpvaW4oJ3wnKX19fWAsXG4gICAgICAgICAgICAgICAgc2NyaXB0Wydzb3VyY2UtbXVsdGlwbGUnXSA/IGB8IHNvdXJjZS1tdWx0aXBsZSAgID0gJHtzY3JpcHRbJ3NvdXJjZS1tdWx0aXBsZSddfWAgOiBudWxsLFxuICAgICAgICAgICAgICAgIHNjcmlwdFsnZ2xvYmFsLXN1cHBvcnQnXSA/IGB8IGdsb2JhbC1zdXBwb3J0ICAgID0gJHtzY3JpcHRbJ2dsb2JhbC1zdXBwb3J0J119YCA6IG51bGwsXG4gICAgICAgICAgICAgICAgYHwgcmVsZWFzZWQgICAgICAgICAgPSB7e3N0YXJ0IGRhdGUgYW5kIGFnZXwke3NjcmlwdC5yZWxlYXNlZH19fWAsXG4gICAgICAgICAgICAgICAgYHwgdXBkYXRlZCAgICAgICAgICAgPSB7e3N0YXJ0IGRhdGUgYW5kIGFnZXwke3NjcmlwdC51cGRhdGVkfX19YCxcbiAgICAgICAgICAgICAgICAnfX0nLFxuICAgICAgICAgICAgXS5maWx0ZXIoQm9vbGVhbik7XG5cbiAgICAgICAgICAgIGxldCBzY3JpcHRDb250ZW50ID0gbnVsbDtcblxuICAgICAgICAgICAgaWYgKGFjdGlvbnNUb1Rha2UuaW5jbHVkZXMoJ3NjcmlwdCcpKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2NyaXB0Q29udGVudFJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXG4gICAgICAgICAgICAgICAgICAgIGBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vJHt0aGlzLlJFUE9fT1dORVJ9LyR7dGhpcy5SRVBPX05BTUV9LyR7dGhpcy5sYXRlc3RDb21taXRIYXNofS9kaXN0LyR7c2NyaXB0Lm5hbWV9LmpzYCxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmIChzY3JpcHRDb250ZW50UmVzcG9uc2Uub2spIHNjcmlwdENvbnRlbnQgPSBhd2FpdCBzY3JpcHRDb250ZW50UmVzcG9uc2UudGV4dCgpO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG13Lm5vdGlmeShcbiAgICAgICAgICAgICAgICAgICAgICAgIGBGYWlsZWQgdG8gZmV0Y2ggXCIke3NjcmlwdC5uYW1lfS5qc1wiIGZyb20gR2l0SHViOiAke3NjcmlwdENvbnRlbnRSZXNwb25zZS5zdGF0dXNUZXh0fSAoJHtzY3JpcHRDb250ZW50UmVzcG9uc2Uuc3RhdHVzfSlgLFxuICAgICAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAnZXJyb3InLCB0YWc6ICdzeW5jLXNjcmlwdHMtbm90aWZpY2F0aW9uJyB9LFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXNjcmlwdC5wZXJzb25hbCkge1xuICAgICAgICAgICAgICAgIGlmIChhY3Rpb25zVG9UYWtlLmluY2x1ZGVzKCdkb2N1bWVudGF0aW9uJykpXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZWRpdE9yQ3JlYXRlKHN1YnBhZ2VOYW1lLCBmdWxsU3VicGFnZUluZm8uam9pbignXFxuJyksICdTeW5jaW5nIHNjcmlwdCBkb2N1bWVudGF0aW9uIGZyb20gR2l0SHViJyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoYWN0aW9uc1RvVGFrZS5pbmNsdWRlcygndGFsaycpKVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmVkaXRPckNyZWF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1YnBhZ2VUYWxrTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICcjUkVESVJFQ1QgW1tVc2VyIHRhbGs6RWVqaXQ0M11dJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdSZWRpcmVjdGluZyBzY3JpcHQgZG9jdW1lbnRhdGlvbiB0YWxrIHBhZ2UgdG8gbWFpbiB1c2VyIHRhbGsgcGFnZScsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzY3JpcHRDb250ZW50KSBhd2FpdCB0aGlzLmVkaXRPckNyZWF0ZShzY3JpcHROYW1lLCBzY3JpcHRDb250ZW50LCAnU3luY2luZyBzY3JpcHQgZnJvbSBHaXRIdWInKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBNYXBzIHNjcmlwdHMgdG8gYSBidWxsZXRlZCBsaXN0LlxuICAgICAgICAgKiBAcGFyYW0gc2NyaXB0cyBUaGUgc2NyaXB0cyB0byBtYXAuXG4gICAgICAgICAqIEByZXR1cm5zIFRoZSBtYXBwZWQgc2NyaXB0cy5cbiAgICAgICAgICovXG4gICAgICAgIHByaXZhdGUgbWFwU2NyaXB0cyhzY3JpcHRzOiBTY3JpcHRbXSkge1xuICAgICAgICAgICAgcmV0dXJuIHNjcmlwdHNcbiAgICAgICAgICAgICAgICAubWFwKFxuICAgICAgICAgICAgICAgICAgICAoc2NyaXB0KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgYCogW1tVc2VyOkVlaml0NDMvc2NyaXB0cy8ke3NjcmlwdC5uYW1lfSR7c2NyaXB0LnBlcnNvbmFsID8gJy5qcycgOiAnJ318JHtzY3JpcHQubmFtZX1dXSAtICR7c2NyaXB0WydzaG9ydC1kZXNjcmlwdGlvbiddIHx8IHNjcmlwdC5kZXNjcmlwdGlvbn0ke1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdFsnaW4tZGV2ZWxvcG1lbnQnXSA/ICcgKDxzcGFuIHN0eWxlPVwiY29sb3I6ICNiZDI4MjhcIj5pbiBkZXZlbG9wbWVudDwvc3Bhbj4pJyA6ICcnXG4gICAgICAgICAgICAgICAgICAgICAgICB9JHtzY3JpcHRbJ3VzZS1pbnN0ZWFkJ10gPyAnICg8c3BhbiBzdHlsZT1cImNvbG9yOiAjYmQyODI4XCI+ZGVwcmVjYXRlZDwvc3Bhbj4pJyA6ICcnfWAsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5qb2luKCdcXG4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFZGl0cyBhIHBhZ2UsIG9yIGNyZWF0ZXMgaXQgaWYgaXQgZG9lc24ndCBleGlzdC5cbiAgICAgICAgICogQHBhcmFtIHRpdGxlIFRoZSB0aXRsZSBvZiB0aGUgcGFnZSB0byBlZGl0LlxuICAgICAgICAgKiBAcGFyYW0gdGV4dCBUaGUgcGFnZSBjb250ZW50IHRvIHNldC5cbiAgICAgICAgICogQHBhcmFtIHN1bW1hcnkgVGhlIGVkaXQgc3VtbWFyeSAod2lsbCBhcHBlbmQgc2NyaXB0IG5vdGljZSkuXG4gICAgICAgICAqL1xuICAgICAgICBwcml2YXRlIGFzeW5jIGVkaXRPckNyZWF0ZSh0aXRsZTogc3RyaW5nLCB0ZXh0OiBzdHJpbmcsIHN1bW1hcnk6IHN0cmluZykge1xuICAgICAgICAgICAgc3VtbWFyeSArPSB0aGlzLlNDUklQVF9NRVNTQUdFO1xuXG4gICAgICAgICAgICBhd2FpdCBhcGlcbiAgICAgICAgICAgICAgICAuZWRpdCh0aXRsZSwgKCkgPT4gKHsgdGV4dCwgc3VtbWFyeSwgd2F0Y2hsaXN0OiAnd2F0Y2gnIH0pKVxuICAgICAgICAgICAgICAgIC5jYXRjaChhc3luYyAoZXJyb3JDb2RlLCBlcnJvckluZm8pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yQ29kZSA9PT0gJ25vY3JlYXRlLW1pc3NpbmcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgYXBpLmNyZWF0ZSh0aXRsZSwgeyBzdW1tYXJ5LCB3YXRjaGxpc3Q6ICd3YXRjaCcgfSwgdGV4dCkuY2F0Y2goKGVycm9yQ29kZSwgZXJyb3JJbmZvKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbXcubm90aWZ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgRXJyb3IgY3JlYXRpbmcgJHt0aXRsZX06ICR7KGVycm9ySW5mbyBhcyBNZWRpYVdpa2lEYXRhRXJyb3IpPy5lcnJvcj8uaW5mbyA/PyAnVW5rbm93biBlcnJvcid9ICgke2Vycm9yQ29kZX0pYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAnZXJyb3InIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtdy5ub3RpZnkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEVycm9yIGVkaXRpbmcgb3IgY3JlYXRpbmcgJHt0aXRsZX06ICR7KGVycm9ySW5mbyBhcyBNZWRpYVdpa2lEYXRhRXJyb3IpPy5lcnJvcj8uaW5mbyA/PyAnVW5rbm93biBlcnJvcid9ICgke2Vycm9yQ29kZX0pYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHR5cGU6ICdlcnJvcicgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBPcGVucyBhIGRpZmYgZm9yIHRoZSBnaXZlbiBwYWdlIHRpdGxlIGFuZCBjb250ZW50LlxuICAgICAgICAgKiBAcGFyYW0gcGFnZVRpdGxlIFRoZSB0aXRsZSBvZiB0aGUgcGFnZSB0byBvcGVuIGEgZGlmZiBmb3IuXG4gICAgICAgICAqIEBwYXJhbSBjb250ZW50IFRoZSBjb250ZW50IHRvIHNldCBmb3IgdGhlIHBhZ2UuXG4gICAgICAgICAqL1xuICAgICAgICBwcml2YXRlIG9wZW5EaWZmKHBhZ2VUaXRsZTogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpIHtcbiAgICAgICAgICAgIGNvbnN0IGZvcm1EYXRhID0ge1xuICAgICAgICAgICAgICAgIHdwVGV4dGJveDE6IGNvbnRlbnQsXG4gICAgICAgICAgICAgICAgd3BTdW1tYXJ5OiBgVXBkYXRpbmcgZGF0YSR7dGhpcy5TQ1JJUFRfTUVTU0FHRX1gLFxuICAgICAgICAgICAgICAgIHdwRGlmZjogJzEnLCAvLyBBbnkgdHJ1dGh5IHZhbHVlIG1ha2VzIHRoaXMgd29ya1xuICAgICAgICAgICAgICAgIHdwV2F0Y2h0aGlzOiAnMScsXG4gICAgICAgICAgICAgICAgd3BVbHRpbWF0ZVBhcmFtOiAnMScsIC8vIE1hcmtzIHRoZSBlbmQgb2YgZm9ybSBkYXRhXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBjb25zdCBmb3JtVXJsID0gbmV3IFVSTChgJHttdy5jb25maWcuZ2V0KCd3Z1NjcmlwdFBhdGgnKX0vaW5kZXgucGhwYCwgd2luZG93LmxvY2F0aW9uLm9yaWdpbik7XG4gICAgICAgICAgICBmb3JtVXJsLnNlYXJjaFBhcmFtcy5zZXQoJ3RpdGxlJywgcGFnZVRpdGxlKTtcbiAgICAgICAgICAgIGZvcm1Vcmwuc2VhcmNoUGFyYW1zLnNldCgnYWN0aW9uJywgJ3N1Ym1pdCcpO1xuXG4gICAgICAgICAgICBjb25zdCBmb3JtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZm9ybScpO1xuICAgICAgICAgICAgZm9ybS5hY3Rpb24gPSBmb3JtVXJsLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBmb3JtLm1ldGhvZCA9ICdQT1NUJztcbiAgICAgICAgICAgIGZvcm0udGFyZ2V0ID0gJ19ibGFuayc7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGZvcm1EYXRhKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhpZGRlbkZpZWxkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICAgICAgICAgICAgICBoaWRkZW5GaWVsZC50eXBlID0gJ2hpZGRlbic7XG4gICAgICAgICAgICAgICAgaGlkZGVuRmllbGQubmFtZSA9IGtleTtcbiAgICAgICAgICAgICAgICBoaWRkZW5GaWVsZC52YWx1ZSA9IHZhbHVlO1xuXG4gICAgICAgICAgICAgICAgZm9ybS5hcHBlbmQoaGlkZGVuRmllbGQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZChmb3JtKTtcbiAgICAgICAgICAgIGZvcm0uc3VibWl0KCk7XG4gICAgICAgICAgICBmb3JtLnJlbW92ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgT2JqZWN0LmFzc2lnbihTY3JpcHRVcGRhdGVyRGlhbG9nLnByb3RvdHlwZSwgT08udWkuUHJvY2Vzc0RpYWxvZy5wcm90b3R5cGUpO1xufSk7XG5cbi8qKlxuICogR2V0cyB0aGUgc2NyaXB0IGRhdGEgZm9yIGFydGljbGUtY2xlYW5lci5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0QXJ0aWNsZUNsZWFuZXJEYXRhKCkge1xuICAgIGNvbnN0IGNvbnRlbnQgPSAoYXdhaXQgZ2V0UGFnZUNvbnRlbnQoJ1dpa2lwZWRpYTpBdXRvV2lraUJyb3dzZXIvVGVtcGxhdGUgcmVkaXJlY3RzJykpID8/ICcnO1xuXG4gICAgY29uc3QgcmVwbGFjZW1lbnRzID0gY29udGVudFxuICAgICAgICAubWF0Y2hBbGwoL1xcKiB7e3RsXFx8LisvZylcbiAgICAgICAgLnRvQXJyYXkoKVxuICAgICAgICAubWFwKChsaW5lKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZXMgPSBsaW5lWzBdLm1hdGNoQWxsKC97e3RsXFx8KC4rPyl9fS9nKS50b0FycmF5KCk7XG5cbiAgICAgICAgICAgIHJldHVybiB7IGZyb206IHRlbXBsYXRlcy5zbGljZSgwLCAtMSkubWFwKCh0ZW1wbGF0ZSkgPT4gdGVtcGxhdGVbMV0pLCB0bzogdGVtcGxhdGVzLmF0KC0xKSFbMV0gfTtcbiAgICAgICAgfSk7XG5cbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocmVwbGFjZW1lbnRzKTtcbn1cblxuLyoqXG4gKiBDaHVua3MgYW4gYXJyYXkgaW50byBzbWFsbGVyIGFycmF5cyBvZiBhIHNwZWNpZmllZCBzaXplLlxuICogQHBhcmFtIGFycmF5IFRoZSBhcnJheSB0byBjaHVuay5cbiAqIEBwYXJhbSBjaHVua1NpemUgVGhlIHNpemUgb2YgZWFjaCBjaHVuay5cbiAqL1xuZnVuY3Rpb24gY2h1bmtBcnJheTxUPihhcnJheTogVFtdLCBjaHVua1NpemU6IG51bWJlcik6IFRbXVtdIHtcbiAgICBjb25zdCBjaHVua2VkID0gW107XG5cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgYXJyYXkubGVuZ3RoOyBpbmRleCArPSBjaHVua1NpemUpIHtcbiAgICAgICAgY29uc3QgY2h1bmsgPSBhcnJheS5zbGljZShpbmRleCwgaW5kZXggKyBjaHVua1NpemUpO1xuXG4gICAgICAgIGNodW5rZWQucHVzaChjaHVuayk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNodW5rZWQ7XG59XG5cbi8qKlxuICogR2V0cyBhIGNvbnRpbnVlZCBxdWVyeSByZXN1bHQgZnJvbSB0aGUgQVBJLCByZXR1cm5pbmcgYW4gYXJyYXkgb2YgcmVzdWx0cy5cbiAqIEBwYXJhbSBxdWVyeSBUaGUgcXVlcnkgcGFyYW1ldGVycyB0byB1c2UgZm9yIHRoZSBBUEkgcmVxdWVzdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0Q29udGludWVkUXVlcnkocXVlcnk6IEFwaVF1ZXJ5UGFyYW1zKTogUHJvbWlzZTxBcGlSZXNwb25zZVtdPiB7XG4gICAgbGV0IGl0ZXJhdGlvbiA9IDA7XG5cbiAgICBjb25zdCByZXR1cm5WYWx1ZSA9IFtdO1xuXG4gICAgbGV0IHJlc3BvbnNlID0geyBjb250aW51ZToge30gfSBhcyBBcGlSZXNwb25zZSAmIFF1ZXJ5Q29udGludWF0aW9uO1xuXG4gICAgd2hpbGUgKCdjb250aW51ZScgaW4gcmVzcG9uc2UgJiYgaXRlcmF0aW9uIDwgMTApIHtcbiAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCBhcGkuZ2V0KHsgLi4ucXVlcnksIC4uLnJlc3BvbnNlLmNvbnRpbnVlIH0gYXMgQXBpUXVlcnlQYXJhbXMpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWF3YWl0LWluLWxvb3BcblxuICAgICAgICByZXR1cm5WYWx1ZS5wdXNoKHJlc3BvbnNlKTtcblxuICAgICAgICBpdGVyYXRpb24rKztcbiAgICB9XG5cbiAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgc2NyaXB0IGRhdGEgZm9yIHJlZGlyZWN0LWhlbHBlci5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0UmVkaXJlY3RIZWxwZXJEYXRhKCkge1xuICAgIGNvbnN0IGFsbFJlZGlyZWN0VGVtcGxhdGVzID0gKGF3YWl0IGFwaS5nZXQoe1xuICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgIGxpc3Q6ICdjYXRlZ29yeW1lbWJlcnMnLFxuICAgICAgICBjbXRpdGxlOiAnQ2F0ZWdvcnk6UmVkaXJlY3QgdGVtcGxhdGVzJyxcbiAgICAgICAgY21saW1pdDogJ21heCcsXG4gICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICB9IHNhdGlzZmllcyBBcGlRdWVyeUNhdGVnb3J5TWVtYmVyc1BhcmFtcykpIGFzIENhdGVnb3J5TWVtYmVyc1Jlc3VsdDtcbiAgICBjb25zdCBhbGxQb3NzaWJsZVJlZGlyZWN0VGVtcGxhdGVzID0gKGF3YWl0IGFwaS5nZXQoe1xuICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgIGxpc3Q6ICdjYXRlZ29yeW1lbWJlcnMnLFxuICAgICAgICBjbXRpdGxlOiAnQ2F0ZWdvcnk6VGVtcGxhdGUgcmVkaXJlY3RzIHdpdGggcG9zc2liaWxpdGllcycsXG4gICAgICAgIGNtbGltaXQ6ICdtYXgnLFxuICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlDYXRlZ29yeU1lbWJlcnNQYXJhbXMpKSBhcyBDYXRlZ29yeU1lbWJlcnNSZXN1bHQ7XG5cbiAgICBjb25zdCByZWRpcmVjdFRlbXBsYXRlcyA9IGFsbFJlZGlyZWN0VGVtcGxhdGVzLnF1ZXJ5LmNhdGVnb3J5bWVtYmVyc1xuICAgICAgICAuZmlsdGVyKChwYWdlKSA9PiBwYWdlLnRpdGxlLnN0YXJ0c1dpdGgoJ1RlbXBsYXRlOlIgJykgJiYgcGFnZS50aXRsZSAhPT0gJ1RlbXBsYXRlOlIgdGVtcGxhdGUgaW5kZXgnKVxuICAgICAgICAubWFwKChwYWdlKSA9PiAoeyBuYW1lOiBwYWdlLnRpdGxlLnNwbGl0KCc6JylbMV0sIHJlZGlyZWN0OiBmYWxzZSB9KSk7XG4gICAgY29uc3QgcG9zc2libGVSZWRpcmVjdFRlbXBsYXRlcyA9IGFsbFBvc3NpYmxlUmVkaXJlY3RUZW1wbGF0ZXMucXVlcnkuY2F0ZWdvcnltZW1iZXJzXG4gICAgICAgIC5maWx0ZXIoKHBhZ2UpID0+IHBhZ2UudGl0bGUuc3RhcnRzV2l0aCgnVGVtcGxhdGU6UiAnKSAmJiBwYWdlLnRpdGxlICE9PSAnVGVtcGxhdGU6UiB3aXRoIHBvc3NpYmlsaXRpZXMnKVxuICAgICAgICAubWFwKChwYWdlKSA9PiAoeyBuYW1lOiBwYWdlLnRpdGxlLnNwbGl0KCc6JylbMV0sIHJlZGlyZWN0OiB0cnVlIH0pKTtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL25vLWFycmF5LXNvcnRcbiAgICBjb25zdCBhbGxUZW1wbGF0ZXMgPSBbLi4ucmVkaXJlY3RUZW1wbGF0ZXMsIC4uLnBvc3NpYmxlUmVkaXJlY3RUZW1wbGF0ZXNdLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgLy8gRm9yY2UgY29taWNzIGFuZCBNaWRkbGUgRWFydGggdGVtcGxhdGVzIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3RcbiAgICAgICAgaWYgKGEubmFtZS5zdGFydHNXaXRoKCdSIGNvbWljcycpIHx8IGEubmFtZS5zdGFydHNXaXRoKCdSIE1FJykpIHJldHVybiAxO1xuICAgICAgICBlbHNlIGlmIChiLm5hbWUuc3RhcnRzV2l0aCgnUiBjb21pY3MnKSB8fCBiLm5hbWUuc3RhcnRzV2l0aCgnUiBNRScpKSByZXR1cm4gLTE7XG4gICAgICAgIGVsc2UgcmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBmaW5hbERhdGEgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgIGFsbFRlbXBsYXRlcy5tYXAoKHBhZ2UpID0+IFtwYWdlLm5hbWUsIHsgcmVkaXJlY3Q6IHBhZ2UucmVkaXJlY3QsIHBhcmFtZXRlcnM6IHt9LCBhbGlhc2VzOiBbXSBhcyBzdHJpbmdbXSB9XSksXG4gICAgKTtcblxuICAgIC8vIEZldGNoIHRoZSBUZW1wbGF0ZURhdGEgZm9yIGFsbCB0ZW1wbGF0ZXNcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgY2h1bmtBcnJheShhbGxUZW1wbGF0ZXMsIDUwKS5tYXAoYXN5bmMgKGNodW5rKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZURhdGFRdWVyeVJlc3VsdCA9IChhd2FpdCBhcGkuZ2V0KHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICd0ZW1wbGF0ZWRhdGEnLFxuICAgICAgICAgICAgICAgIHRpdGxlczogY2h1bmsubWFwKChwYWdlKSA9PiBgVGVtcGxhdGU6JHtwYWdlLm5hbWV9YCksXG4gICAgICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgfSBzYXRpc2ZpZXMgVGVtcGxhdGVEYXRhQXBpVGVtcGxhdGVEYXRhUGFyYW1zKSkgYXMgVGVtcGxhdGVEYXRhUmVzdWx0O1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHBhZ2Ugb2YgT2JqZWN0LnZhbHVlcyh0ZW1wbGF0ZURhdGFRdWVyeVJlc3VsdC5wYWdlcykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmb3JtYXR0ZWRQYXJhbWV0ZXJzID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyhwYWdlLnBhcmFtcykubWFwKChbbmFtZSwgZGF0YV0pID0+IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXNlczogZGF0YS5hbGlhc2VzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBkYXRhLmxhYmVsPy5lbiA/PyBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBkYXRhLmRlc2NyaXB0aW9uPy5lbiA/PyBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGRhdGEudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogZGF0YS5yZXF1aXJlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWdnZXN0ZWQ6IGRhdGEuc3VnZ2VzdGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGRhdGEuZGVmYXVsdD8uZW4gPz8gbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGFtcGxlOiBkYXRhLmV4YW1wbGU/LmVuID8/IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBdKSxcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgZmluYWxEYXRhW3BhZ2UudGl0bGUuc3BsaXQoJzonKVsxXV0ucGFyYW1ldGVycyA9IGZvcm1hdHRlZFBhcmFtZXRlcnM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICk7XG5cbiAgICAvLyBGaW5kIGFsaWFzZXMgb2YgcmVkaXJlY3QgdGVtcGxhdGVzXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIGNodW5rQXJyYXkocmVkaXJlY3RUZW1wbGF0ZXMsIDUwKS5tYXAoYXN5bmMgKGNodW5rKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhbGxSZWRpcmVjdHNRdWVyeVJlc3VsdCA9IChhd2FpdCBnZXRDb250aW51ZWRRdWVyeSh7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgICAgIHRpdGxlczogY2h1bmsubWFwKChwYWdlKSA9PiBgVGVtcGxhdGU6JHtwYWdlLm5hbWV9YCksXG4gICAgICAgICAgICAgICAgcHJvcDogJ3JlZGlyZWN0cycsXG4gICAgICAgICAgICAgICAgcmRuYW1lc3BhY2U6IDEwLFxuICAgICAgICAgICAgICAgIHJkbGltaXQ6ICdtYXgnLFxuICAgICAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5QmFja2xpbmtzcHJvcFBhcmFtcykpIGFzIFJlZGlyZWN0c1Jlc3VsdFtdO1xuXG4gICAgICAgICAgICBjb25zdCByZWRpcmVjdHNRdWVyeVJlc3VsdFBhZ2VzID0gYWxsUmVkaXJlY3RzUXVlcnlSZXN1bHQuZmxhdE1hcCgocmVzdWx0KSA9PiByZXN1bHQucXVlcnkucGFnZXMpO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHBhZ2Ugb2YgcmVkaXJlY3RzUXVlcnlSZXN1bHRQYWdlcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hcHBlZFJlZGlyZWN0cyA9XG4gICAgICAgICAgICAgICAgICAgIHBhZ2UucmVkaXJlY3RzXG4gICAgICAgICAgICAgICAgICAgICAgICA/Lm1hcCgocmVkaXJlY3QpID0+IHJlZGlyZWN0LnRpdGxlLnNwbGl0KCc6JylbMV0pXG4gICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChyZWRpcmVjdCkgPT4gIXBvc3NpYmxlUmVkaXJlY3RUZW1wbGF0ZXMuc29tZSgodGVtcGxhdGUpID0+IHRlbXBsYXRlLm5hbWUgPT09IHJlZGlyZWN0KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpID8/IFtdOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHVuaWNvcm4vbm8tYXJyYXktc29ydFxuXG4gICAgICAgICAgICAgICAgZmluYWxEYXRhW3BhZ2UudGl0bGUuc3BsaXQoJzonKVsxXV0uYWxpYXNlcy5wdXNoKC4uLm1hcHBlZFJlZGlyZWN0cyk7IC8vIERhdGEgbWlnaHQgZXhpc3QgZnJvbSBwcmV2aW91cyBxdWVyaWVzLCBzbyB1cGRhdGUgaW5zdGVhZCBvZiBvdmVyd3JpdGluZ1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICApO1xuXG4gICAgLy8gRmluZCBhbGlhc2VzIG9mIHBvc3NpYmxlIHJlZGlyZWN0IHRlbXBsYXRlc1xuICAgIGNvbnN0IGFsbEFsaWFzZXNPZlBvc3NpYmxlVGVtcGxhdGVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIGNodW5rQXJyYXkocG9zc2libGVSZWRpcmVjdFRlbXBsYXRlcywgNTApLm1hcChhc3luYyAoY2h1bmspID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxpbmtzUXVlcnlSZXN1bHQgPSAoYXdhaXQgYXBpLmdldCh7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgICAgIHRpdGxlczogY2h1bmsubWFwKChwYWdlKSA9PiBgVGVtcGxhdGU6JHtwYWdlLm5hbWV9YCksXG4gICAgICAgICAgICAgICAgcHJvcDogJ2xpbmtzaGVyZScsXG4gICAgICAgICAgICAgICAgbGhuYW1lc3BhY2U6IDEwLFxuICAgICAgICAgICAgICAgIGxobGltaXQ6ICdtYXgnLFxuICAgICAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5QmFja2xpbmtzcHJvcFBhcmFtcykpIGFzIExpbmtzSGVyZVJlc3VsdDtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBwYWdlIG9mIGxpbmtzUXVlcnlSZXN1bHQucXVlcnkucGFnZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXBwZWRSZWRpcmVjdHMgPVxuICAgICAgICAgICAgICAgICAgICBwYWdlLmxpbmtzaGVyZVxuICAgICAgICAgICAgICAgICAgICAgICAgPy5maWx0ZXIoKHBhZ2UpID0+IHBhZ2UucmVkaXJlY3QpXG4gICAgICAgICAgICAgICAgICAgICAgICAubWFwKChwYWdlKSA9PiBwYWdlLnRpdGxlLnNwbGl0KCc6JylbMV0pXG4gICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChwYWdlKSA9PiAhcGFnZS5lbmRzV2l0aCgnL2RvYycpICYmICFwYWdlLmVuZHNXaXRoKCcvc2FuZGJveCcpKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSkgPz8gW107IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgdW5pY29ybi9uby1hcnJheS1zb3J0XG5cbiAgICAgICAgICAgICAgICBhbGxBbGlhc2VzT2ZQb3NzaWJsZVRlbXBsYXRlcy5wdXNoKC4uLm1hcHBlZFJlZGlyZWN0cyk7XG5cbiAgICAgICAgICAgICAgICBmaW5hbERhdGFbcGFnZS50aXRsZS5zcGxpdCgnOicpWzFdXS5hbGlhc2VzID0gbWFwcGVkUmVkaXJlY3RzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICApO1xuXG4gICAgY29uc3QgbWFwcGVkRmluYWxEYXRhID0gT2JqZWN0LmVudHJpZXMoZmluYWxEYXRhKS5tYXAoKFtuYW1lLCB0ZW1wbGF0ZURhdGFdKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbmFsVGVtcGxhdGVEYXRhID0ge1xuICAgICAgICAgICAgLi4uKHRlbXBsYXRlRGF0YS5yZWRpcmVjdCA/IHsgcmVkaXJlY3Q6IHRydWUgfSA6IHt9KSxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IHRlbXBsYXRlRGF0YS5wYXJhbWV0ZXJzLFxuICAgICAgICAgICAgYWxpYXNlczogdGVtcGxhdGVEYXRhLmFsaWFzZXMuc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKSwgLy8gZXNsaW50LWRpc2FibGUtbGluZSB1bmljb3JuL25vLWFycmF5LXNvcnRcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gW25hbWUsIGZpbmFsVGVtcGxhdGVEYXRhXSBhcyBjb25zdDtcbiAgICB9KTtcblxuICAgIGZvciAoY29uc3QgcG9zc2libGVUZW1wbGF0ZUFsaWFzIG9mIGFsbEFsaWFzZXNPZlBvc3NpYmxlVGVtcGxhdGVzKVxuICAgICAgICBmb3IgKGNvbnN0IFssIGRhdGFdIG9mIG1hcHBlZEZpbmFsRGF0YSlcbiAgICAgICAgICAgIGlmICghZGF0YS5yZWRpcmVjdCAmJiBkYXRhLmFsaWFzZXMuaW5jbHVkZXMocG9zc2libGVUZW1wbGF0ZUFsaWFzKSlcbiAgICAgICAgICAgICAgICBkYXRhLmFsaWFzZXMgPSBkYXRhLmFsaWFzZXMuZmlsdGVyKChhbGlhcykgPT4gYWxpYXMgIT09IHBvc3NpYmxlVGVtcGxhdGVBbGlhcyk7XG5cbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoT2JqZWN0LmZyb21FbnRyaWVzKG1hcHBlZEZpbmFsRGF0YSkpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7O21CQUdPLElBQU1BLEVBQU0sSUFBSSxHQUFHLElBTTFCLGVBQXNCQyxFQUFlQyxFQUFlLENBQ2hELE9BQ0ssTUFBTUYsRUFBSSxJQUFJLENBQ1gsT0FBUSxRQUNSLGNBQWUsSUFDZixLQUFNLFlBQ04sT0FBUSxVQUNSLFFBQVMsT0FDVCxPQUFRRSxDQUNaLENBQW1DLEdBQ3JDLE1BQU0sTUFBTSxDQUFDLEVBQUUsWUFBWSxD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QUFDLENBQUMsR0FBSyxDQUFDLEVBRWhETyxFQUE4QixLQUFLLEdBQUdGLENBQWUsRUFFckRKLEVBQVVMLEVBQUssTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxRQUFVUyxDQUNsRCxDQUNKLENBQUMsQ0FDTCxFQUVBLElBQU1JLEVBQWtCLE9BQU8sUUFBUVIsQ0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDcEUsRUFBTTZFLENBQVksSUFBTSxDQUM1RSxJQUFNQyxFQUFvQixDQUN0QixHQUFJRCxFQUFhLFNBQVcsQ0FBRSxTQUFVLEVBQUssRUFBSSxDQUFDLEVBQ2xELFdBQVlBLEVBQWEsV0FDekIsUUFBU0EsRUFBYSxRQUFRLEtBQUssQ0FBQyxFQUFHVixJQUFNLEVBQUUsY0FBY0EsQ0FBQyxDQUFDLENBQ25FLEVBRUEsTUFBTyxDQUFDbkUsRUFBTThFLENBQWlCLENBQ25DLENBQUMsRUFFRCxRQUFXQyxLQUF5QkwsRUFDaEMsT0FBVyxDQUFDLENBQUVwRSxDQUFJLElBQUtzRSxFQUNmLENBQUN0RSxFQUFLLFVBQVlBLEVBQUssUUFBUSxTQUFTeUUsQ0FBcUIsSUFDN0R6RSxFQUFLLFFBQVVBLEVBQUssUUFBUSxPQUFRMEUsR0FBVUEsSUFBVUQsQ0FBcUIsR0FFekYsT0FBTyxLQUFLLFVBQVUsT0FBTyxZQUFZSCxDQUFlLENBQUMsQ0FDN0QiLAogICJuYW1lcyI6IFsiYXBpIiwgImdldFBhZ2VDb250ZW50IiwgInRpdGxlIiwgImZ1bGxMaW5rRWxlbWVudCIsICJsaW5rIiwgImV2ZW50IiwgIndpbmRvd01hbmFnZXIiLCAic2NyaXB0VXBkYXRlckRpYWxvZyIsICJTY3JpcHRVcGRhdGVyRGlhbG9nIiwgImdldEFydGljbGVDbGVhbmVyRGF0YSIsICJnZXRSZWRpcmVjdEhlbHBlckRhdGEiLCAiZXJyb3IiLCAibWVzc2FnZUVsZW1lbnQiLCAic2NyaXB0IiwgInNjcmlwdHNNdWx0aXNlbGVjdExheW91dCIsICJpZCIsICJuYW1lIiwgInNlbGVjdGVkRGVmYXVsdCIsICJhY3Rpb25zTXVsdGlzZWxlY3RMYXlvdXQiLCAiYnV0dG9uR3JvdXAiLCAidXBkYXRlciIsICJidXR0b24iLCAiZGF0YSIsICJyZXNvbHZlIiwgInNjcmlwdERhdGFVcGRhdGVyc011bHRpc2VsZWN0TGF5b3V0IiwgImFjdGlvbiIsICJzZWxlY3RlZFNjcmlwdHMiLCAic2NyaXB0TmFtZSIsICJtZXRob2QiLCAiZGVmZXJyZWQiLCAicmVzdWx0IiwgImxhdGVzdENvbW1pdEhhc2hSZXNwb25zZSIsICJzY3JpcHREYXRhUmVzcG9uc2UiLCAic2NyaXB0RGF0YSIsICJhY3Rpb25zVG9UYWtlIiwgInN1YnBhZ2VOYW1lIiwgInN1YnBhZ2VUYWxrTmFtZSIsICJmdWxsU3VicGFnZUluZm8iLCAiYXV0aG9yIiwgImRhdGUiLCAiZGVzY3JpcHRpb24iLCAibGluZSIsICJza2luIiwgInN0YXR1cyIsICJzY3JpcHRDb250ZW50IiwgInNjcmlwdENvbnRlbnRSZXNwb25zZSIsICJzY3JpcHRzIiwgInRpdGxlIiwgInRleHQiLCAic3VtbWFyeSIsICJhcGkiLCAiZXJyb3JDb2RlIiwgImVycm9ySW5mbyIsICJwYWdlVGl0bGUiLCAiY29udGVudCIsICJmb3JtRGF0YSIsICJmb3JtVXJsIiwgImZvcm0iLCAia2V5IiwgInZhbHVlIiwgImhpZGRlbkZpZWxkIiwgInJlcGxhY2VtZW50cyIsICJnZXRQYWdlQ29udGVudCIsICJ0ZW1wbGF0ZXMiLCAidGVtcGxhdGUiLCAiY2h1bmtBcnJheSIsICJhcnJheSIsICJjaHVua1NpemUiLCAiY2h1bmtlZCIsICJpbmRleCIsICJjaHVuayIsICJnZXRDb250aW51ZWRRdWVyeSIsICJxdWVyeSIsICJpdGVyYXRpb24iLCAicmV0dXJuVmFsdWUiLCAicmVzcG9uc2UiLCAiYWxsUmVkaXJlY3RUZW1wbGF0ZXMiLCAiYWxsUG9zc2libGVSZWRpcmVjdFRlbXBsYXRlcyIsICJyZWRpcmVjdFRlbXBsYXRlcyIsICJwYWdlIiwgInBvc3NpYmxlUmVkaXJlY3RUZW1wbGF0ZXMiLCAiYWxsVGVtcGxhdGVzIiwgImEiLCAiYiIsICJmaW5hbERhdGEiLCAidGVtcGxhdGVEYXRhUXVlcnlSZXN1bHQiLCAiZm9ybWF0dGVkUGFyYW1ldGVycyIsICJyZWRpcmVjdHNRdWVyeVJlc3VsdFBhZ2VzIiwgIm1hcHBlZFJlZGlyZWN0cyIsICJyZWRpcmVjdCIsICJhbGxBbGlhc2VzT2ZQb3NzaWJsZVRlbXBsYXRlcyIsICJsaW5rc1F1ZXJ5UmVzdWx0IiwgIm1hcHBlZEZpbmFsRGF0YSIsICJ0ZW1wbGF0ZURhdGEiLCAiZmluYWxUZW1wbGF0ZURhdGEiLCAicG9zc2libGVUZW1wbGF0ZUFsaWFzIiwgImFsaWFzIl0KfQo=