Jump to content

User:Eejit43/scripts/redirect-helper.js

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by Eejit43 (talk | contribs) at 00:59, 20 March 2024 (Syncing script from GitHub (via script)). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.
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.
// <nowiki>
// Note: This script was compiled and minified from TypeScript. For a more readable version, see https://github.com/Eejit43/wikipedia-scripts/blob/main/scripts/redirect-helper.ts

"use strict";mw.loader.using(["mediawiki.util","oojs-ui-core","oojs-ui-widgets","oojs-ui-windows","oojs-ui.styles.icons-content","oojs-ui.styles.icons-editing-core","oojs-ui.styles.icons-accessibility"],()=>{class T extends OO.ui.TextInputWidget{constructor(e,i){super(e);this.api=new mw.Api;this.getLookupRequest=()=>{const e=this.getValue(),i=$.Deferred();if(!e)i.resolve([]);else if(e.includes("#")){const n=e.split("#")[0];this.api.get({action:"parse",page:n,prop:"sections",redirects:!0}).catch(()=>null).then(t=>{if(t){const s=t.parse.sections.filter(a=>a.line.toLowerCase().replaceAll(/<\/?i>/g,"").startsWith(e.split("#")[1].toLowerCase()));i.resolve(s.map(a=>({data:`${t.parse.title}#${a.line.replaceAll(/<\/?i>/g,"")}`,label:`${t.parse.title}#${a.line.replaceAll(/<\/?i>/g,"")}`})))}else i.resolve([])})}else{const n=mw.Title.newFromText(e);this.api.get({action:"query",formatversion:"2",gaplimit:20,gapnamespace:n?.getNamespaceId()??0,gapprefix:n?.getMainText()??e,generator:"allpages",prop:["info","pageprops"]}).catch(()=>null).then(t=>{t?i.resolve(t.query?.pages?t.query.pages.filter(s=>s.title!==this.pageTitleParsed.toString()).map(s=>({data:s.title,label:new OO.ui.HtmlSnippet(`${s.title}${s.pageprops&&"disambiguation"in s.pageprops?" <i>(disambiguation)</i>":""}${"redirect"in s?" <i>(redirect)</i>":""}`)})):[]):i.resolve([])})}return i.promise({abort(){}})};this.getLookupCacheDataFromResponse=e=>e??[];this.getLookupMenuOptionsFromData=e=>e.map(({data:i,label:n})=>new OO.ui.MenuOptionWidget({data:i,label:n}));OO.ui.mixin.LookupElement.call(this,e),this.pageTitleParsed=i}}Object.assign(T.prototype,OO.ui.mixin.LookupElement.prototype);class O extends OO.ui.TextInputWidget{constructor(e){super(e);this.api=new mw.Api;this.getLookupRequest=()=>{const e=this.getValue(),i=$.Deferred();e||i.resolve([]);const n=mw.Title.newFromText(e);return this.api.get({action:"query",formatversion:"2",gaplimit:20,gapnamespace:14,gapprefix:n?.getMainText()??e,generator:"allpages",prop:"categories"}).catch(()=>null).then(t=>{if(t?.query?.pages){const s=t.query.pages.filter(a=>!(a.categories&&a.categories.some(o=>o.title==="Category:Wikipedia soft redirected categories"))).map(a=>{const o=a.title.split(":")[1];return{data:o,label:o}});this.emit("showing-values",s),i.resolve(s)}else i.resolve([])}),i.promise({abort(){}})};this.getLookupCacheDataFromResponse=e=>e??[];this.getLookupMenuOptionsFromData=e=>e.map(({data:i,label:n})=>new OO.ui.MenuOptionWidget({data:i,label:n}));OO.ui.mixin.LookupElement.call(this,e)}}Object.assign(O.prototype,OO.ui.mixin.LookupElement.prototype);class d extends OO.ui.ProcessDialog{constructor(e,i){super(e);this.api=new mw.Api;this.getSetupProcess=()=>d.super.prototype.getSetupProcess.call(this).next(()=>this.api.post({action:"parse",formatversion:"2",contentmodel:"wikitext",prop:["text","categorieshtml"],title:this.pageTitleParsed.getPrefixedDb(),text:`{{Redirect category shell|${this.getData().map(e=>`{{${e}}}`).join("")}}}`}).then(e=>{const i=e.parse.text,n=e.parse.categorieshtml,t=new OO.ui.PanelLayout({padded:!0,expanded:!1});t.$element.append(i,n),this.$body.append(t.$element)}));this.getActionProcess=e=>e?new OO.ui.Process(()=>{this.getManager().closeWindow(this)}):d.super.prototype.getActionProcess.call(this,e);this.getTeardownProcess=()=>d.super.prototype.getTeardownProcess.call(this).next(()=>{this.$body.empty()});this.pageTitleParsed=i,d.static.name="TemplatePreviewDialog",d.static.title="Redirect categorization templates preview",d.static.actions=[{action:"cancel",label:"Close",flags:["safe","close"]}]}}Object.assign(d.prototype,OO.ui.ProcessDialog.prototype);class m extends OO.ui.ProcessDialog{constructor(e){super(e);this.api=new mw.Api;this.getSetupProcess=()=>m.super.prototype.getSetupProcess.call(this).next(()=>{const[e,i]=this.getData();return this.api.post({action:"compare",formatversion:"2",prop:["diff"],fromslots:"main","fromtext-main":e,"fromcontentmodel-main":"wikitext",toslots:"main","totext-main":i,"tocontentmodel-main":"wikitext"}).then(n=>{const t=n.compare.body,s=new OO.ui.MessageWidget({type:"warning",label:"No changes to make!"}),a=new OO.ui.PanelLayout({padded:!0,expanded:!1});a.$element.append(t?`
<table class="diff diff-editfont-monospace">
    <colgroup>
        <col class="diff-marker">
        <col class="diff-content">
        <col class="diff-marker">
        <col class="diff-content">
    </colgroup>
    <tbody>
        ${t}
    </tbody>
</table>`:s.$element[0]),this.$body.append(a.$element)})});this.getActionProcess=e=>e?new OO.ui.Process(()=>{this.getManager().closeWindow(this)}):m.super.prototype.getActionProcess.call(this,e);this.getTeardownProcess=()=>m.super.prototype.getTeardownProcess.call(this).next(()=>{this.$body.empty()});m.static.name="ShowChangesDialog",m.static.title="Changes to be made",m.static.actions=[{action:"cancel",label:"Close",flags:["safe","close"]}]}}Object.assign(m.prototype,OO.ui.ProcessDialog.prototype);class v{constructor(){this.api=new mw.Api}async run(){if(this.passesPreChecks()){if(this.redirectTemplates=await this.fetchRedirectTemplates(),this.contentText=document.querySelector("#mw-content-text"),!this.contentText)return mw.notify("redirect-helper: Failed to find content text element!",{type:"error"});if(this.pageTitle=mw.config.get("wgPageName"),this.pageTitleParsed=mw.Title.newFromText(this.pageTitle),!this.pageTitleParsed)return mw.notify("redirect-helper: Failed to parse page title!",{type:"error"});await this.checkPageAndLoad()}}passesPreChecks(){return[mw.config.get("wgNamespaceNumber")>=0,mw.config.get("wgIsProbablyEditable"),mw.config.get("wgIsArticle"),mw.config.get("wgAction")==="view",mw.config.get("wgRevisionId")===mw.config.get("wgCurRevisionId"),!mw.config.get("wgDiffOldId")].every(Boolean)}async fetchRedirectTemplates(){return JSON.parse((await this.api.get({action:"query",formatversion:"2",prop:"revisions",rvprop:"content",rvslots:"main",titles:"User:Eejit43/scripts/redirect-helper.json"})).query.pages?.[0]?.revisions?.[0]?.slots?.main?.content||"{}")}async checkPageAndLoad(){const r=await this.api.get({action:"query",formatversion:"2",prop:"info",titles:this.pageTitle}),e={redirectTemplates:this.redirectTemplates,contentText:this.contentText,pageTitle:this.pageTitle,pageTitleParsed:this.pageTitleParsed};if(r.query.pages[0].missing){mw.util.addCSS(`
#create-redirect-button {
    margin-bottom: 20px;
}`);const i=new OO.ui.ButtonWidget({id:"create-redirect-button",label:"Create redirect",icon:"articleRedirect",flags:["progressive"]});i.on("click",()=>{i.$element[0].remove(),new w(e,!1).load()}),this.contentText.prepend(i.$element[0])}else if(r.query.pages[0].redirect)new w(e,!0).load();else{const i=mw.util.addPortletLink(mw.config.get("skin")==="minerva"?"p-tb":"p-cactions","#","Redirect page","redirect-helper");i.addEventListener("click",n=>{n.preventDefault(),new w(e,!1).load(),window.scrollTo({top:0,behavior:"smooth"}),i.remove()})}}}class w{constructor({redirectTemplates:r,contentText:e,pageTitle:i,pageTitleParsed:n},t){this.api=new mw.Api;this.redirectRegex=/^#redirect:?\s*\[\[\s*:?([^[\]{|}]+?)\s*(?:\|[^[\]{|}]+?)?]]\s*/i;this.scriptAdvert=" (via [[User:Eejit43/scripts/redirect-helper|redirect-helper]])";this.needsCheck=!0;this.templateEditorsInfo=[];this.pageContent="";this.redirectTemplates=r,this.contentText=e,this.pageTitle=i,this.pageTitleParsed=n,this.exists=t}async load(){mw.util.addCSS(`
#create-redirect-button {
    margin-bottom: 20px;
}

#redirect-helper-box {
    background-color: whitesmoke;
    width: 700px;
    max-width: calc(100% - 50px);
    margin-left: auto;
    margin-right: auto;
    margin-bottom: 25px !important;
}

.redirect-input-layout label {
    font-weight: bold;
}

.redirect-helper-template-parameters-container, .redirect-helper-template-parameters-container details {
    background-color: #e2e2e2;
    border-radius: 5px;
    margin-block: 10px;
    padding: 5px;
}

.redirect-helper-template-parameters-container summary {
    cursor: pointer;
    font-weight: bold;
}

.redirect-helper-template-parameters-container details {
    background-color: #d1cece;
    margin-block: 5px;
}

.redirect-helper-template-parameters-contained #redirect-helper-no-templates-message {
    padding: 5px;
}

#redirect-helper-summary-layout {
    padding-top: 10px;
    margin-top: 15px;
    border-top: 1px solid gray;
}

#redirect-helper-submit-layout {
    margin-top: 10px;
}

#redirect-helper-submit-layout > * {
    margin-bottom: 0;
}

.redirect-helper-warning {
    margin-top: 8px;
}`),mw.loader.addLinkTag("https://www.mediawiki.org/w/load.php?modules=mediawiki.diff.styles&only=styles"),this.editorBox=new OO.ui.PanelLayout({id:"redirect-helper-box",padded:!0,expanded:!1,framed:!0}),this.pageTitleParsed.isTalkPage()&&(await this.api.get({action:"query",formatversion:"2",prop:"info",titles:this.pageTitleParsed.getSubjectPage().getPrefixedText()})).query.pages[0].redirect&&await this.loadSyncWithMainButton(),this.loadInputElements(),await this.loadSubmitElements(),this.editorBox.$element[0].append(...[this.syncWithMainButton?.$element?.[0],this.redirectInputLayout.$element[0],this.tagSelectLayout.$element[0],this.templateParametersEditor,this.defaultSortInputLayout.$element[0],this.categorySelectLayout.$element[0],this.summaryInputLayout.$element[0],this.submitLayout.$element[0]].filter(Boolean)),this.contentText.prepend(this.editorBox.$element[0]),this.exists&&this.loadExistingData()}async loadSyncWithMainButton(){const r=await this.getPageContent(this.pageTitleParsed.getSubjectPage().getPrefixedText());this.syncWithMainButton=new OO.ui.ButtonWidget({label:"Sync with main page",icon:"link",flags:["progressive"]}),this.syncWithMainButton.on("click",()=>{const e=this.redirectRegex.exec(r)?.[1];if(!e)return mw.notify("Failed to parse main page content!",{type:"error"});this.redirectInput.setValue(mw.Title.newFromText(e)?.getTalkPage()?.toString()??""),["R from move",...this.redirectTemplates["R from move"].aliases].some(n=>new RegExp(`{{\\s*[${n[0].toLowerCase()}${n[0]}]${n.slice(1)}\\s*(\\||}})`).test(r))&&this.tagSelect.setValue(["R from move"])})}loadInputElements(){this.redirectInput=new T({placeholder:"Target page name",required:!0},this.pageTitleParsed),this.redirectInput.on("change",()=>{let t=this.redirectInput.getValue();t=t.replace(new RegExp(`^(https?:)?/{2}?${mw.config.get("wgServer").replace(/^\/{2}/,"")}/wiki/`),""),t=t.replace(/^:/,""),t.length>0?(this.redirectInput.setValue(t[0].toUpperCase()+t.slice(1).replaceAll("_"," ")),this.defaultSortSuggestButton.setDisabled(!1),this.submitButton.setDisabled(!1),this.showChangesButton.setDisabled(!1)):(this.defaultSortSuggestButton.setDisabled(!0),this.submitButton.setDisabled(!0),this.showChangesButton.setDisabled(!0)),this.updateSummary(),this.submitButton.setLabel("Submit"),this.needsCheck=!0}),this.redirectInputLayout=new OO.ui.FieldLayout(this.redirectInput,{label:"Redirect target:",classes:["redirect-input-layout"],align:"top"}),this.tagSelect=new OO.ui.MenuTagMultiselectWidget({allowArbitrary:!1,allowReordering:!1,options:Object.keys(this.redirectTemplates).map(t=>({data:t,label:t}))}),this.tagSelect.getMenu().filterMode="substring",this.tagSelect.on("change",()=>{const t=this.tagSelect.getValue().sort((a,o)=>a.toLowerCase().localeCompare(o.toLowerCase()));this.tagSelect.getValue().join(";")!==t.join(";")&&this.tagSelect.setValue(t),this.updateSummary(),this.submitButton.setLabel("Submit"),this.needsCheck=!0,this.tagSelect.getValue().length>0?this.previewButton.setDisabled(!1):this.previewButton.setDisabled(!0);for(const a of this.templateEditorsInfo)a.details.style.display="none";let s=0;for(const a of this.tagSelect.getValue()){const o=this.templateEditorsInfo.find(c=>c.name===a);o&&(o.details.style.display="block",s++)}n.style.display=s>0?"none":"block"});const r=new OO.ui.WindowManager;document.body.append(r.$element[0]);const e=new d({size:"large"},this.pageTitleParsed);r.addWindows([e]),this.previewButton=new OO.ui.ButtonWidget({icon:"eye",label:"Preview",disabled:!0}),this.previewButton.on("click",()=>{e.setData(this.tagSelect.getValue()),e.open()}),this.tagSelectLayout=new OO.ui.ActionFieldLayout(this.tagSelect,this.previewButton,{label:"Redirect categorization templates:",classes:["redirect-input-layout"],align:"top"}),this.templateParametersEditor=document.createElement("details"),this.templateParametersEditor.classList.add("redirect-helper-template-parameters-container");const i=document.createElement("summary");i.textContent="Template parameters",this.templateParametersEditor.append(i);for(const[t,s]of Object.entries(this.redirectTemplates)){const a=Object.entries(s.parameters);if(a.length===0)continue;const o=document.createElement("details");o.style.display="none";const c=document.createElement("summary");c.textContent=t,o.append(c);const u={name:t,details:o,parameters:[]};for(const[g,l]of a){const p=new OO.ui.TextInputWidget({placeholder:l.default?.toString(),required:l.required});p.on("change",()=>{this.updateSummary(),this.submitButton.setLabel("Submit"),this.needsCheck=!0});const h=new OO.ui.FieldLayout(p,{label:new OO.ui.HtmlSnippet(`${g}${!l.label||g.toLowerCase()===l.label?.toLowerCase()?"":` (${l.label})`}${l.description?` (${l.description})`:""} (type: ${l.type}) ${l.suggested?" (suggested)":""}${l.example?` (example: "${l.example}")`:""}`),align:"inline"});o.append(h.$element[0]),u.parameters.push({name:g,aliases:l.aliases,editor:p})}this.templateParametersEditor.append(o),this.templateEditorsInfo.push(u)}const n=document.createElement("div");n.id="redirect-helper-no-templates-message",n.textContent="No templates with parameters to display!",n.style.display=this.exists?"none":"block",this.templateParametersEditor.append(n),this.defaultSortInput=new OO.ui.TextInputWidget,this.defaultSortInput.on("change",()=>{const t=this.defaultSortInput.getValue();t.length>0&&this.defaultSortInput.setValue(t.replaceAll("_"," ")),this.updateSummary(),this.submitButton.setLabel("Submit"),this.needsCheck=!0}),this.defaultSortSuggestButton=new OO.ui.ButtonWidget({icon:"robot",label:"Suggest",disabled:!0}),this.defaultSortSuggestButton.on("click",()=>{let t=this.pageTitleParsed.getMainText().replace(/ \(.*\)$/,"");if(this.tagSelect.getValue().includes("R from person")){if(!t.includes(" "))return;let s="";if(/ (?:[JS]r.?|[IVX]+)$/.test(t)&&(s=t.slice(t.lastIndexOf(" ")),t=t.slice(0,t.lastIndexOf(" ")),!t.includes(" ")))return t+s;const a=t.slice(t.lastIndexOf(" ")+1).replace(/,$/,"").replace(/O'/,"O"),o=t.slice(0,t.lastIndexOf(" "));this.defaultSortInput.setValue(a+", "+o+s)}else{let s=t.replaceAll("Mr.","Mister").replaceAll("&","And");for(const a of["An","A","The"])if(s.startsWith(a+" ")){s=s.slice(a.length+1)+", "+a;break}s===t?mw.notify("redirect-helper wasn't able to determine a sort key different from the current page title!",{type:"warn"}):this.defaultSortInput.setValue(s)}}),this.defaultSortInputLayout=new OO.ui.ActionFieldLayout(this.defaultSortInput,this.defaultSortSuggestButton,{label:new OO.ui.HtmlSnippet(`Default sort key (DEFAULTSORT) (see <a href="${mw.util.getUrl("Wikipedia:Categorization#Sort keys")}" target="_blank">guideline</a>):`),classes:["redirect-input-layout"],align:"top"}),this.categorySelectInput=new O({placeholder:"Add categories here"}),this.categorySelectInput.on("change",()=>{let t=this.categorySelectInput.getValue();t=t.replace(new RegExp(`^(https?:)?/{2}?${mw.config.get("wgServer").replace(/^\/{2}/,"")}/wiki/`),""),t=t.replace(/^Category:/,""),t.length>0&&this.categorySelectInput.setValue(t[0].toUpperCase()+t.slice(1).replaceAll("_"," "))}),this.categorySelectInput.on("showing-values",t=>{for(const s of t)this.categorySelect.addAllowedValue(s.data)}),this.categorySelect=new OO.ui.TagMultiselectWidget({allowReordering:!1,inputPosition:"outline",inputWidget:this.categorySelectInput}),this.categorySelect.on("change",()=>{const t=this.categorySelect.getValue().sort((s,a)=>s.toLowerCase().localeCompare(a.toLowerCase()));this.categorySelect.getValue().join(";")!==t.join(";")&&this.categorySelect.setValue(t),this.updateSummary(),this.submitButton.setLabel("Submit"),this.needsCheck=!0}),this.categorySelectLayout=new OO.ui.FieldLayout(this.categorySelect,{label:"Categories:",classes:["redirect-input-layout"],align:"top"}),this.summaryInput=new OO.ui.ComboBoxInputWidget({options:[{data:"Resolve double redirect"},{data:"Resolve self redirect"},{data:"Remove incorrect rcats"}]}),this.summaryInputLayout=new OO.ui.FieldLayout(this.summaryInput,{id:"redirect-helper-summary-layout",label:"Summary:",classes:["redirect-input-layout"],align:"top"})}async loadSubmitElements(){this.submitButton=new OO.ui.ButtonWidget({label:"Submit",disabled:!0,flags:["progressive"]}),this.submitButton.on("click",()=>this.handleSubmitButtonClick()),this.exists&&(this.pageContent=await this.getPageContent(this.pageTitle));const r=new OO.ui.WindowManager;document.body.append(r.$element[0]);const e=new m({size:"large"});r.addWindows([e]),this.showChangesButton=new OO.ui.ButtonWidget({label:"Show changes",disabled:!0}),this.showChangesButton.on("click",()=>{e.setData([this.pageContent,this.createOutput(this.redirectInput.getValue(),this.tagSelect.getValue(),this.oldStrayText,this.defaultSortInput.getValue(),this.categorySelect.getValue())]),e.open()}),this.pageTitleParsed.isTalkPage()||(this.talkData=await this.api.get({action:"query",formatversion:"2",prop:"info",titles:this.pageTitleParsed.getTalkPage().getPrefixedText()}),this.syncTalkCheckbox=new OO.ui.CheckboxInputWidget({selected:!!this.talkData.query.pages[0].redirect}),this.syncTalkCheckboxLayout=new OO.ui.Widget({content:[new OO.ui.FieldLayout(this.syncTalkCheckbox,{label:"Sync talk page",align:"inline"})]})),await this.checkShouldPromptPatrol()&&(this.patrolCheckbox=new OO.ui.CheckboxInputWidget({selected:!0}),this.patrolCheckboxLayout=new OO.ui.Widget({content:[new OO.ui.FieldLayout(this.patrolCheckbox,{label:"Mark as patrolled",align:"inline"})]})),this.submitLayout=new OO.ui.HorizontalLayout({id:"redirect-helper-submit-layout",items:[this.submitButton,this.showChangesButton,this.syncTalkCheckboxLayout,this.patrolCheckboxLayout].filter(Boolean)})}async checkShouldPromptPatrol(){const r=document.querySelector("#mwe-pt-mark .mwe-pt-tool-icon");if(r?.click(),r?.click(),mw.config.get("wgNamespaceNumber")!==0)return!1;if(document.querySelector(".patrollink"))return!0;if(document.querySelector("#mwe-pt-mark-as-reviewed-button"))return!0;if(document.querySelector("#mwe-pt-mark-as-unreviewed-button"))return!1;{if(!mw.config.get("wgArticleId")||!(await this.api.get({action:"query",meta:"userinfo",uiprop:"rights"})).query.userinfo.rights.includes("patrol"))return!1;const i=await this.api.get({action:"pagetriagelist",page_id:mw.config.get("wgArticleId")});return i.pagetriagelist.pages[0]?.user_name===mw.config.get("wgUserName")||i.pagetriagelist.result!=="success"||i.pagetriagelist.pages.length===0?!1:!Number.parseInt(i.pagetriagelist.pages[0]?.patrol_status)}}updateSummary(){const r=this.redirectInput.getValue().trim();if(!r)this.summaryInput.$tabIndexed[0].placeholder="";else if(this.exists){const e=r!==this.oldRedirectTarget?.replaceAll("_"," "),i=this.tagSelect.getValue().some(o=>!this.oldRedirectTags.includes(o))||this.oldRedirectTags.some(o=>!this.tagSelect.getValue().includes(o)),n=this.oldRedirectTagData?this.tagSelect.getValue().some(o=>this.templateEditorsInfo.find(c=>c.name===o)?.parameters.some(c=>{const u=this.oldRedirectTagData[o]?.find(g=>g[0]===c.name)?.[1];return u?u!==c.editor.getValue().trim():!1})):!1,t=this.defaultSortInput.getValue().trim()!==this.oldDefaultSort.replaceAll("_"," "),s=this.categorySelect.getValue().some(o=>!this.oldCategories.includes(o))||this.oldCategories.some(o=>!this.categorySelect.getValue().includes(o)),a=[];e&&a.push(`retarget to [[${r}]]`),i&&a.push("change categorization templates"),n&&a.push("change categorization template arguments"),t&&a.push("change default sort key"),s&&a.push("change categories"),a.length===0&&a.push("perform redirect cleanup"),a[0]=a[0][0].toUpperCase()+a[0].slice(1),a.length>1&&(a[a.length-1]=`and ${a.at(-1)}`),this.summaryInput.$tabIndexed[0].placeholder=a.join(a.length>2?", ":" ")}else this.summaryInput.$tabIndexed[0].placeholder=`Create redirect to [[${r}]]`}loadExistingData(){this.oldRedirectTarget=this.redirectRegex.exec(this.pageContent)?.[1],this.oldRedirectTags=Object.entries(this.redirectTemplates).map(([e,i])=>[e,...i.aliases].some(n=>new RegExp(`{{\\s*[${n[0].toLowerCase()}${n[0]}]${n.slice(1)}\\s*(\\||}})`).test(this.pageContent))?e:null).filter(Boolean).sort((e,i)=>e.toLowerCase().localeCompare(i.toLowerCase()));const r=Object.entries(this.redirectTemplates).flatMap(([e,i])=>[e,...i.aliases]).map(e=>new RegExp(`{{\\s*[${e[0].toLowerCase()}${e[0]}]${e.slice(1)}\\s*(\\||}})`).test(this.pageContent)?e:null).filter(Boolean);this.oldRedirectTagData=Object.fromEntries(r.map(e=>{const i=new RegExp(`{{\\s*[${e[0].toLowerCase()}${e[0]}]${e.slice(1)}\\|?(.*?)\\s*}}`).exec(this.pageContent),n=Object.entries(this.redirectTemplates).find(([a,o])=>[a,...o.aliases].includes(e))?.[0];if(!i?.[1])return null;const s=i[1].split("|").map((a,o)=>{if(!a.includes("="))return[(o+1).toString(),a.trim()];const[c,u]=a.split("=");return[c.trim(),u.trim()]});return[n,s]}).filter(Boolean)),this.oldDefaultSort=this.pageContent.match(/{{DEFAULTSORT:.*?}}/g)?.at(-1)?.slice(14,-2)?.trim()??"",this.oldCategories=this.pageContent.match(/\[\[[Cc]ategory:.+?]]/g)?.map(e=>e.slice(11,-2))??[],this.oldStrayText=[this.pageContent.match(/{{short description\|.*?}}/i)?.[0],this.pageContent.match(/{{DISPLAYTITLE:.*?}}/)?.[0],this.pageContent.match(/{{italic title\|?.*?}}/i)?.[0],this.pageContent.match(/{{title language\|.*?}}/)?.[0]].filter(Boolean).join(`
`),this.oldRedirectTarget?this.redirectInput.setValue(this.oldRedirectTarget.replaceAll("_"," ")):mw.notify("Could not find redirect target!",{type:"error"}),this.tagSelect.setValue(this.oldRedirectTags);for(const[e,i]of Object.entries(this.oldRedirectTagData)){const n=this.templateEditorsInfo.find(t=>t.name===e);if(n)for(const[t,s]of i){const a=n.parameters.find(o=>[o.name,...o.aliases].includes(t));a&&a.editor.setValue(s)}}this.oldDefaultSort&&this.defaultSortInput.setValue(this.oldDefaultSort);for(const e of this.oldCategories)this.categorySelect.addAllowedValue(e);this.categorySelect.setValue(this.oldCategories.map(e=>({data:e,label:e}))),this.updateSummary()}async validateSubmission(){const r=[],e=this.redirectInput.getValue().trim(),i=this.tagSelect.getValue();/^\s*[^[\]{|}]+\s*$/.test(e)||r.push({title:e,message:"is not a valid page title!"});try{this.parsedDestination=mw.Title.newFromText(e)}catch{r.length===0&&r.push({title:e,message:"is not a valid page title!"})}!this.parsedDestination&&r.length===0&&r.push({title:e,message:"is not a valid page title!"}),this.parsedDestination?.toString()===this.pageTitleParsed.toString()&&r.push({message:"cannot redirect to itself!"});const n=await this.api.get({action:"query",formatversion:"2",prop:["pageprops","categories"],titles:e}).catch(l=>(l==="missingtitle"?r.push({title:e,message:"does not exist!"}):r.push({title:e,message:`was not able to be fetched from the API (${l})!`}),null)),t=await this.api.get({action:"parse",page:e,prop:"sections",redirects:!0});if(t.parse.redirects?.[0]){const l=t.parse.redirects[0].to+(t.parse.redirects[0].tofragment?`#${t.parse.redirects[0].tofragment}`:"");r.push({title:e,message:`is a redirect to <a href="${mw.util.getUrl(l)}" target="_blank">${l}</a>. Retarget to that page instead, as double redirects aren't allowed.`})}if(e.split("#").length>1)if(t.parse.sections.find(p=>p.line.replaceAll(/<\/?i>/g,"")===e.split("#")[1]))i.includes("R to anchor")&&r.push({message:"is tagged as a redirect to an anchor, but it is actually a redirect to a section!"}),i.includes("R to section")||r.push({message:"is a redirect to a section, but it is not tagged with <code>{{R to section}}</code>!"});else{const p=(await this.api.get({action:"query",formatversion:"2",prop:"revisions",rvprop:"content",rvslots:"main",titles:this.parsedDestination.toString()})).query.pages[0].revisions[0].slots.main.content;[...p.match(/(?<={{\s*?[Aa](?:nchors?|nchor for redirect|nker|NCHOR|nc)\s*?\|).+?(?=}})/g)?.map(f=>f.split("|").map(y=>y.trim()))?.flat()??[],...p.match(/(?<={{\s*?(?:[Vv](?:isible anchors?|isanc|Anch|anchor|isibleanchor|a)|[Aa](?:nchord|chored|nchor\+)|[Tt]ext anchor)\s*?\|).+?(?=(?<!!|=)}})/g)?.map(f=>f.split("|").map(y=>y.trim()).filter(y=>!/^text\s*?=/.test(y)))?.flat()??[],...p.match(/(?<=id=)"?.+?(?="|>|\|)/g)?.map(f=>f.trim())??[]].includes(e.split("#")[1])?(i.includes("R to section")&&r.push({message:"is tagged as a redirect to a section, but it is actually a redirect to an anchor!"}),i.includes("R to anchor")||r.push({message:"is a redirect to an anchor, but it is not tagged with <code>{{R from anchor}}</code>!"})):r.push({message:`is a redirect to <a href="${mw.util.getUrl(e)}" target="_blank">${e}</a>, but that section or anchor does not exist!`})}e.split("#").length===1&&(i.includes("R to section")||i.includes("R to anchor"))&&r.push({message:"is not a redirect to a section/anchor, but it is tagged with <code>{{R from section}}</code> or <code>{{R from anchor}}</code>!"});const s=!!(n.query.pages[0].pageprops&&"disambiguation"in n.query.pages[0].pageprops),a=!!(n.query.pages[0].categories&&n.query.pages[0].categories.some(l=>l.title==="Category:Surnames")),o=["R to disambiguation page","R from incomplete disambiguation"],c=["R from ambiguous sort name","R from ambiguous term"],u=o.some(l=>i.includes(l)),g=c.some(l=>i.includes(l));s&&!u&&!g&&r.push({message:"is a redirect to a disambiguation page, but it is not tagged with a disambiguation categorization template!"}),n.query.pages[0].pageprops&&!s&&(u&&r.push({message:"is not a redirect to a disambiguation page, but it is tagged with a disambiguation categorization template!"}),a&&!g&&r.push({message:"is a redirect to a surname list, but it is not tagged with a correct disambiguation categorization template!"})),s&&i.includes("R to disambiguation page")&&!this.pageTitleParsed.getMainText().endsWith(" (disambiguation)")&&r.push({message:'is tagged with <code>{{R to disambiguation page}}</code>, but this title does not end with " (disambiguation)". Use <code>{{R from ambiguous term}}</code> or a similar categorization template instead!'});for(const l of["R semi-protected","R extended-protected","R template-protected","R fully protected"])i.includes(l)&&r.push({message:`is tagged with unnecessarily tagged with <code>{{${l}}}</code> which will be duplicated by the redirect category shell!`});return mw.config.get("wgWikibaseItemId")&&!i.includes("R with Wikidata item")&&r.push({message:"is linked to a Wikidata item but it isn't tagged with <code>{{R with Wikidata item}}</code>!"}),i.includes("R with Wikidata item")&&!mw.config.get("wgWikibaseItemId")&&r.push({message:"is tagged with <code>{{R with Wikidata item}}</code> but it is not actually linked to a Wikidata item!"}),this.syncTalkCheckbox?.isSelected()&&!this.talkData.query.pages[0].missing&&!this.talkData.query.pages[0].redirect&&r.push({title:this.pageTitleParsed.getTalkPage().getPrefixedText(),message:"exists, but is not a redirect!"}),r}async handleSubmitButtonClick(){const r=[this.redirectInput,this.tagSelect,...this.templateEditorsInfo.flatMap(s=>s.parameters.map(a=>a.editor)),this.previewButton,this.defaultSortInput,this.defaultSortSuggestButton,this.categorySelect,this.summaryInput,this.submitButton,this.syncTalkCheckbox,this.patrolCheckbox].filter(Boolean);for(const s of r)s.setDisabled(!0);this.submitButton.setLabel("Checking target validity...");let e=[];if(this.needsCheck?e=await this.validateSubmission():this.parsedDestination=mw.Title.newFromText(this.redirectInput.getValue()),e.length>0){for(const s of document.querySelectorAll(".redirect-helper-warning"))s.remove();for(const{title:s,message:a}of e){const o=new OO.ui.HtmlSnippet(`${s?`<a href="${mw.util.getUrl(s)}" target="_blank">${s}</a>`:"This page"} ${a} Click again without making changes to submit anyway.`),c=new OO.ui.MessageWidget({type:"error",classes:["redirect-helper-warning"],inline:!0,label:o});this.editorBox.$element[0].append(c.$element[0])}for(const s of r)s.setDisabled(!1);this.tagSelect.getValue().length>0&&this.previewButton.setDisabled(!1),this.submitButton.setLabel("Submit anyway"),this.needsCheck=!1;return}this.submitButton.setLabel(`${this.exists?"Editing":"Creating"} redirect...`);const i=this.createOutput(this.redirectInput.getValue(),this.tagSelect.getValue(),this.oldStrayText,this.defaultSortInput.getValue(),this.categorySelect.getValue()),n=(this.summaryInput.getValue()||this.summaryInput.$tabIndexed[0].placeholder)+this.scriptAdvert;if(await this.editOrCreate(this.pageTitle,i,n)){if(mw.notify(`Redirect ${this.exists?"edited":"created"} successfully!`,{type:"success"}),this.syncTalkCheckbox?.isSelected()){this.submitButton.setLabel("Editing talk page...");const s=this.tagSelect.getValue().includes("R from move"),a=this.createOutput(this.parsedDestination.getTalkPage().getPrefixedText(),s?["R from move"]:[],void 0,void 0,[]);if(!await this.editOrCreate(this.pageTitleParsed.getTalkPage().getPrefixedText(),a,"Syncing redirect from main page"+this.scriptAdvert))return;mw.notify("Talk page synced successfully!",{type:"success"})}if(this.patrolCheckbox?.isSelected()){this.submitButton.setLabel("Patrolling redirect...");const s=document.querySelector(".patrollink a"),a=document.querySelector("#mwe-pt-mark-as-reviewed-button");s?await this.api.postWithToken("patrol",{action:"patrol",rcid:new URL(s.href).searchParams.get("rcid")}).catch((c,u)=>(mw.notify(`Error patrolling ${this.pageTitle} via API: ${u?.error.info??"Unknown error"} (${c})`,{type:"error"}),null))&&mw.notify("Redirect patrolled successfully!",{type:"success"}):a?(a.click(),mw.notify("Redirect patrolled successfully!",{type:"success"})):mw.notify("Page curation toolbar not found, redirect cannot be patrolled!",{type:"error"})}this.submitButton.setLabel("Complete, reloading..."),window.location.href=mw.util.getUrl(this.pageTitle,{redirect:"no"})}}createOutput(r,e,i,n,t){const s=mw.Title.newFromText(r),a=s?`${s.getNamespaceId()===14?":":""}${s.getPrefixedText()}${s.getFragment()?`#${s.getFragment()}`:""}`:r.trim();this.pageTitleParsed.getMainText().toLocaleLowerCase().normalize("NFD").replaceAll(/[\u0300-\u036F]/g,"")===n?.toLowerCase().normalize("NFD").replaceAll(/[\u0300-\u036F]/g,"")&&(n=void 0);const o=e.map(c=>{const u=this.templateEditorsInfo.find(l=>l.name===c);if(!u)return`{{${c}}}`;const g=u.parameters.map((l,p)=>{const h=l.editor.getValue().trim();return h?`|${l.name===(p+1).toString()?"":`${l.name}=`}${h}`:null}).filter(Boolean).join("");return`{{${c}${g}}}`});return[`#REDIRECT [[${a}]]
`,e.length>0?`{{Redirect category shell|
${o.join(`
`)}
}}
`:null,i?i+`
`:null,n?`{{DEFAULTSORT:${n.trim()}}}`:null,t.length>0?t.map(c=>`[[Category:${c}]]`).join(`
`):null].filter(Boolean).join(`
`)}async getPageContent(r){return(await this.api.get({action:"query",formatversion:"2",prop:"revisions",rvprop:"content",rvslots:"main",titles:r})).query.pages[0].revisions[0].slots.main.content.trim()}async editOrCreate(r,e,i){return await this.api.edit(r,()=>({text:e,summary:i})).catch((n,t)=>n==="nocreate-missing"?this.api.create(r,{summary:i},e).catch((s,a)=>{mw.notify(`Error creating ${r}: ${a?.error.info??"Unknown error"} (${s})`,{type:"error"})}):(mw.notify(`Error editing or creating ${r}: ${t?.error.info??"Unknown error"} (${n})`,{type:"error"}),null))}}new v().run()});

// </nowiki>
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc2NyaXB0cy9yZWRpcmVjdC1oZWxwZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7XG4gICAgQXBpQ29tcGFyZVBhZ2VzUGFyYW1zLFxuICAgIEFwaVBhcnNlUGFyYW1zLFxuICAgIEFwaVF1ZXJ5SW5mb1BhcmFtcyxcbiAgICBBcGlRdWVyeVBhZ2VQcm9wc1BhcmFtcyxcbiAgICBBcGlRdWVyeVJldmlzaW9uc1BhcmFtcyxcbiAgICBBcGlRdWVyeVVzZXJJbmZvUGFyYW1zLFxuICAgIFBhZ2VUcmlhZ2VBcGlQYWdlVHJpYWdlTGlzdFBhcmFtcyxcbn0gZnJvbSAndHlwZXMtbWVkaWF3aWtpL2FwaV9wYXJhbXMnO1xuaW1wb3J0IHtcbiAgICBBcGlRdWVyeUFsbFBhZ2VzR2VuZXJhdG9yUGFyYW1zLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHVuaWNvcm4vcHJldmVudC1hYmJyZXZpYXRpb25zXG4gICAgQ2F0ZWdvcmllc1Jlc3VsdCxcbiAgICBNZWRpYVdpa2lEYXRhRXJyb3IsXG4gICAgUGFnZUluZm9SZXN1bHQsXG4gICAgUGFnZVBhcnNlUmVzdWx0LFxuICAgIFBhZ2VSZXZpc2lvbnNSZXN1bHQsXG4gICAgUGFnZVRyaWFnZUxpc3RSZXNwb25zZSxcbiAgICBQYWdlcHJvcHNSZXN1bHQsXG4gICAgVXNlclBlcm1pc3Npb25zUmVzcG9uc2UsXG59IGZyb20gJy4uL2dsb2JhbC10eXBlcyc7XG5cbnR5cGUgUmVkaXJlY3RUZW1wbGF0ZVBhcmFtZXRlcnMgPSBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIHtcbiAgICAgICAgYWxpYXNlczogc3RyaW5nW107XG4gICAgICAgIGxhYmVsOiBzdHJpbmcgfCBudWxsO1xuICAgICAgICBkZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAgICAgdHlwZTogc3RyaW5nO1xuICAgICAgICByZXF1aXJlZDogYm9vbGVhbjtcbiAgICAgICAgc3VnZ2VzdGVkOiBib29sZWFuO1xuICAgICAgICBkZWZhdWx0OiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbDtcbiAgICAgICAgZXhhbXBsZTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGw7XG4gICAgfVxuPjtcblxudHlwZSBSZWRpcmVjdFRlbXBsYXRlRGF0YSA9IFJlY29yZDxzdHJpbmcsIHsgcGFyYW1ldGVyczogUmVkaXJlY3RUZW1wbGF0ZVBhcmFtZXRlcnM7IGFsaWFzZXM6IHN0cmluZ1tdIH0+O1xuXG5pbnRlcmZhY2UgVGVtcGxhdGVFZGl0b3JFbGVtZW50SW5mbyB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGRldGFpbHM6IEhUTUxEZXRhaWxzRWxlbWVudDtcbiAgICBwYXJhbWV0ZXJzOiB7IG5hbWU6IHN0cmluZzsgYWxpYXNlczogc3RyaW5nW107IGVkaXRvcjogT08udWkuVGV4dElucHV0V2lkZ2V0IH1bXTtcbn1cblxuaW50ZXJmYWNlIExvb2t1cEVsZW1lbnRDb25maWcgZXh0ZW5kcyBPTy51aS5UZXh0SW5wdXRXaWRnZXQuQ29uZmlnT3B0aW9ucywgT08udWkubWl4aW4uTG9va3VwRWxlbWVudC5Db25maWdPcHRpb25zIHt9XG5cbm13LmxvYWRlci51c2luZyhcbiAgICBbJ21lZGlhd2lraS51dGlsJywgJ29vanMtdWktY29yZScsICdvb2pzLXVpLXdpZGdldHMnLCAnb29qcy11aS13aW5kb3dzJywgJ29vanMtdWkuc3R5bGVzLmljb25zLWNvbnRlbnQnLCAnb29qcy11aS5zdHlsZXMuaWNvbnMtZWRpdGluZy1jb3JlJywgJ29vanMtdWkuc3R5bGVzLmljb25zLWFjY2Vzc2liaWxpdHknXSxcbiAgICAoKSA9PiB7XG4gICAgICAgIC8vIFNldHVwIFJlZGlyZWN0SW5wdXRXaWRnZXRcblxuICAgICAgICAvKipcbiAgICAgICAgICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBhIHRpdGxlIGxvb2t1cCBlbGVtZW50LlxuICAgICAgICAgKi9cbiAgICAgICAgY2xhc3MgUmVkaXJlY3RJbnB1dFdpZGdldCBleHRlbmRzIE9PLnVpLlRleHRJbnB1dFdpZGdldCB7XG4gICAgICAgICAgICAvLyBVdGlsaXR5IHZhcmlhYmxlc1xuICAgICAgICAgICAgcHJpdmF0ZSBhcGkgPSBuZXcgbXcuQXBpKCk7XG5cbiAgICAgICAgICAgIC8vIEFzc2lnbmVkIGluIGNvbnN0cnVjdG9yXG4gICAgICAgICAgICBwcml2YXRlIHBhZ2VUaXRsZVBhcnNlZDogbXcuVGl0bGU7XG5cbiAgICAgICAgICAgIGNvbnN0cnVjdG9yKGNvbmZpZzogTG9va3VwRWxlbWVudENvbmZpZywgcGFnZVRpdGxlUGFyc2VkOiBtdy5UaXRsZSkge1xuICAgICAgICAgICAgICAgIHN1cGVyKGNvbmZpZyk7XG4gICAgICAgICAgICAgICAgT08udWkubWl4aW4uTG9va3VwRWxlbWVudC5jYWxsKHRoaXMgYXMgdW5rbm93biBhcyBPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50LCBjb25maWcpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5wYWdlVGl0bGVQYXJzZWQgPSBwYWdlVGl0bGVQYXJzZWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGdldExvb2t1cFJlcXVlc3QgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVmZXJyZWQgPSAkLkRlZmVycmVkKCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKSBkZWZlcnJlZC5yZXNvbHZlKFtdKTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh2YWx1ZS5pbmNsdWRlcygnIycpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRpdGxlID0gdmFsdWUuc3BsaXQoJyMnKVswXTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFwaVxuICAgICAgICAgICAgICAgICAgICAgICAgLmdldCh7IGFjdGlvbjogJ3BhcnNlJywgcGFnZTogdGl0bGUsIHByb3A6ICdzZWN0aW9ucycsIHJlZGlyZWN0czogdHJ1ZSB9IHNhdGlzZmllcyBBcGlQYXJzZVBhcmFtcylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaCgoKSA9PiBudWxsKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKHJlc3VsdDogUGFnZVBhcnNlUmVzdWx0IHwgbnVsbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF0Y2hlZFNlY3Rpb25zID0gcmVzdWx0LnBhcnNlLnNlY3Rpb25zLmZpbHRlcigoc2VjdGlvbikgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb24ubGluZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2VBbGwoLzxcXC8/aT4vZywgJycpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0YXJ0c1dpdGgodmFsdWUuc3BsaXQoJyMnKVsxXS50b0xvd2VyQ2FzZSgpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZWRTZWN0aW9ucy5tYXAoKHNlY3Rpb24pID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogYCR7cmVzdWx0LnBhcnNlLnRpdGxlfSMke3NlY3Rpb24ubGluZS5yZXBsYWNlQWxsKC88XFwvP2k+L2csICcnKX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBgJHtyZXN1bHQucGFyc2UudGl0bGV9IyR7c2VjdGlvbi5saW5lLnJlcGxhY2VBbGwoLzxcXC8/aT4vZywgJycpfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGRlZmVycmVkLnJlc29sdmUoW10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkVGl0bGUgPSBtdy5UaXRsZS5uZXdGcm9tVGV4dCh2YWx1ZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcGlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2FwbGltaXQ6IDIwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhcG5hbWVzcGFjZTogcGFyc2VkVGl0bGU/LmdldE5hbWVzcGFjZUlkKCkgPz8gMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYXBwcmVmaXg6IHBhcnNlZFRpdGxlPy5nZXRNYWluVGV4dCgpID8/IHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRvcjogJ2FsbHBhZ2VzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wOiBbJ2luZm8nLCAncGFnZXByb3BzJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeUFsbFBhZ2VzR2VuZXJhdG9yUGFyYW1zKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmNhdGNoKCgpID0+IG51bGwpXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbigocmVzdWx0OiB7IHF1ZXJ5OiB7IHBhZ2VzOiB7IHRpdGxlOiBzdHJpbmc7IHBhZ2Vwcm9wczogeyBkaXNhbWJpZ3VhdGlvbj86IHN0cmluZyB9OyByZWRpcmVjdD86IHN0cmluZyB9W10gfSB9IHwgbnVsbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucXVlcnk/LnBhZ2VzIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyByZXN1bHQucXVlcnkucGFnZXMgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChwYWdlKSA9PiBwYWdlLnRpdGxlICE9PSB0aGlzLnBhZ2VUaXRsZVBhcnNlZC50b1N0cmluZygpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKHBhZ2UpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHBhZ2UudGl0bGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBuZXcgT08udWkuSHRtbFNuaXBwZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgJHtwYWdlLnRpdGxlfSR7cGFnZS5wYWdlcHJvcHMgJiYgJ2Rpc2FtYmlndWF0aW9uJyBpbiBwYWdlLnBhZ2Vwcm9wcyA/ICcgPGk+KGRpc2FtYmlndWF0aW9uKTwvaT4nIDogJyd9JHsncmVkaXJlY3QnIGluIHBhZ2UgPyAnIDxpPihyZWRpcmVjdCk8L2k+JyA6ICcnfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGRlZmVycmVkLnJlc29sdmUoW10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2UoeyBhYm9ydCgpIHt9IH0pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgZ2V0TG9va3VwQ2FjaGVEYXRhRnJvbVJlc3BvbnNlID0gPFQ+KHJlc3BvbnNlOiBUW10gfCBudWxsIHwgdW5kZWZpbmVkKSA9PiByZXNwb25zZSA/PyBbXTtcblxuICAgICAgICAgICAgZ2V0TG9va3VwTWVudU9wdGlvbnNGcm9tRGF0YSA9IChkYXRhOiB7IGRhdGE6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W10pID0+IGRhdGEubWFwKCh7IGRhdGEsIGxhYmVsIH0pID0+IG5ldyBPTy51aS5NZW51T3B0aW9uV2lkZ2V0KHsgZGF0YSwgbGFiZWwgfSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgT2JqZWN0LmFzc2lnbihSZWRpcmVjdElucHV0V2lkZ2V0LnByb3RvdHlwZSwgT08udWkubWl4aW4uTG9va3VwRWxlbWVudC5wcm90b3R5cGUpO1xuXG4gICAgICAgIC8vIFNldHVwIENhdGVnb3J5SW5wdXRXaWRnZXRcblxuICAgICAgICAvKipcbiAgICAgICAgICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBhIGNhdGVnb3J5IGxvb2t1cCBlbGVtZW50LlxuICAgICAgICAgKi9cbiAgICAgICAgY2xhc3MgQ2F0ZWdvcnlJbnB1dFdpZGdldCBleHRlbmRzIE9PLnVpLlRleHRJbnB1dFdpZGdldCB7XG4gICAgICAgICAgICAvLyBVdGlsaXR5IHZhcmlhYmxlc1xuICAgICAgICAgICAgcHJpdmF0ZSBhcGkgPSBuZXcgbXcuQXBpKCk7XG5cbiAgICAgICAgICAgIGNvbnN0cnVjdG9yKGNvbmZpZzogTG9va3VwRWxlbWVudENvbmZpZykge1xuICAgICAgICAgICAgICAgIHN1cGVyKGNvbmZpZyk7XG4gICAgICAgICAgICAgICAgT08udWkubWl4aW4uTG9va3VwRWxlbWVudC5jYWxsKHRoaXMgYXMgdW5rbm93biBhcyBPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50LCBjb25maWcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBnZXRMb29rdXBSZXF1ZXN0ID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlZmVycmVkID0gJC5EZWZlcnJlZCgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkgZGVmZXJyZWQucmVzb2x2ZShbXSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWRUaXRsZSA9IG13LlRpdGxlLm5ld0Zyb21UZXh0KHZhbHVlKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuYXBpXG4gICAgICAgICAgICAgICAgICAgIC5nZXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2FwbGltaXQ6IDIwLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2FwbmFtZXNwYWNlOiAxNCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdhcHByZWZpeDogcGFyc2VkVGl0bGU/LmdldE1haW5UZXh0KCkgPz8gdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0b3I6ICdhbGxwYWdlcycsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wOiAnY2F0ZWdvcmllcycsXG4gICAgICAgICAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5QWxsUGFnZXNHZW5lcmF0b3JQYXJhbXMpXG4gICAgICAgICAgICAgICAgICAgIC5jYXRjaCgoKSA9PiBudWxsKVxuICAgICAgICAgICAgICAgICAgICAudGhlbigocmVzdWx0OiB7IHF1ZXJ5OiB7IHBhZ2VzOiB7IHRpdGxlOiBzdHJpbmc7IGNhdGVnb3JpZXM/OiB7IHRpdGxlOiBzdHJpbmcgfVtdIH1bXSB9IH0gfCBudWxsKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Py5xdWVyeT8ucGFnZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYWdlcyA9IHJlc3VsdC5xdWVyeS5wYWdlcyAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChwYWdlKSA9PiAhKHBhZ2UuY2F0ZWdvcmllcyAmJiBwYWdlLmNhdGVnb3JpZXMuc29tZSgoY2F0ZWdvcnkpID0+IGNhdGVnb3J5LnRpdGxlID09PSAnQ2F0ZWdvcnk6V2lraXBlZGlhIHNvZnQgcmVkaXJlY3RlZCBjYXRlZ29yaWVzJykpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKChwYWdlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0aXRsZVdpdGhvdXROYW1lc3BhY2UgPSBwYWdlLnRpdGxlLnNwbGl0KCc6JylbMV07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHRpdGxlV2l0aG91dE5hbWVzcGFjZSwgbGFiZWw6IHRpdGxlV2l0aG91dE5hbWVzcGFjZSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnc2hvd2luZy12YWx1ZXMnLCBwYWdlcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHBhZ2VzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBkZWZlcnJlZC5yZXNvbHZlKFtdKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZSh7IGFib3J0KCkge30gfSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBnZXRMb29rdXBDYWNoZURhdGFGcm9tUmVzcG9uc2UgPSA8VD4ocmVzcG9uc2U6IFRbXSB8IG51bGwgfCB1bmRlZmluZWQpID0+IHJlc3BvbnNlID8/IFtdO1xuXG4gICAgICAgICAgICBnZXRMb29rdXBNZW51T3B0aW9uc0Zyb21EYXRhID0gKGRhdGE6IHsgZGF0YTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXSkgPT4gZGF0YS5tYXAoKHsgZGF0YSwgbGFiZWwgfSkgPT4gbmV3IE9PLnVpLk1lbnVPcHRpb25XaWRnZXQoeyBkYXRhLCBsYWJlbCB9KSk7XG4gICAgICAgIH1cblxuICAgICAgICBPYmplY3QuYXNzaWduKENhdGVnb3J5SW5wdXRXaWRnZXQucHJvdG90eXBlLCBPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50LnByb3RvdHlwZSk7XG5cbiAgICAgICAgLy8gU2V0dXAgVGVtcGxhdGVQcmV2aWV3RGlhbG9nXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaXMgYSBkaWFsb2cgdXNlZCBmb3IgcHJldmlld2luZyB0ZW1wbGF0ZXMuXG4gICAgICAgICAqL1xuICAgICAgICBjbGFzcyBUZW1wbGF0ZVByZXZpZXdEaWFsb2cgZXh0ZW5kcyBPTy51aS5Qcm9jZXNzRGlhbG9nIHtcbiAgICAgICAgICAgIC8vIFV0aWxpdHkgdmFyaWFibGVzXG4gICAgICAgICAgICBwcml2YXRlIGFwaSA9IG5ldyBtdy5BcGkoKTtcblxuICAgICAgICAgICAgLy8gQXNzaWduZWQgaW4gY29uc3RydWN0b3JcbiAgICAgICAgICAgIHByaXZhdGUgcGFnZVRpdGxlUGFyc2VkOiBtdy5UaXRsZTtcblxuICAgICAgICAgICAgY29uc3RydWN0b3IoY29uZmlnOiBPTy51aS5Qcm9jZXNzRGlhbG9nLkNvbmZpZ09wdGlvbnMsIHBhZ2VUaXRsZVBhcnNlZDogbXcuVGl0bGUpIHtcbiAgICAgICAgICAgICAgICBzdXBlcihjb25maWcpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5wYWdlVGl0bGVQYXJzZWQgPSBwYWdlVGl0bGVQYXJzZWQ7XG5cbiAgICAgICAgICAgICAgICBUZW1wbGF0ZVByZXZpZXdEaWFsb2cuc3RhdGljLm5hbWUgPSAnVGVtcGxhdGVQcmV2aWV3RGlhbG9nJztcbiAgICAgICAgICAgICAgICBUZW1wbGF0ZVByZXZpZXdEaWFsb2cuc3RhdGljLnRpdGxlID0gJ1JlZGlyZWN0IGNhdGVnb3JpemF0aW9uIHRlbXBsYXRlcyBwcmV2aWV3JztcbiAgICAgICAgICAgICAgICBUZW1wbGF0ZVByZXZpZXdEaWFsb2cuc3RhdGljLmFjdGlvbnMgPSBbeyBhY3Rpb246ICdjYW5jZWwnLCBsYWJlbDogJ0Nsb3NlJywgZmxhZ3M6IFsnc2FmZScsICdjbG9zZSddIH1dO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBnZXRTZXR1cFByb2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFRlbXBsYXRlUHJldmlld0RpYWxvZy5zdXBlci5wcm90b3R5cGUuZ2V0U2V0dXBQcm9jZXNzLmNhbGwodGhpcykubmV4dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFwaVxuICAgICAgICAgICAgICAgICAgICAgICAgLnBvc3Qoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ3BhcnNlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudG1vZGVsOiAnd2lraXRleHQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3A6IFsndGV4dCcsICdjYXRlZ29yaWVzaHRtbCddLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0aGlzLnBhZ2VUaXRsZVBhcnNlZC5nZXRQcmVmaXhlZERiKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogYHt7UmVkaXJlY3QgY2F0ZWdvcnkgc2hlbGx8JHsodGhpcy5nZXREYXRhKCkgYXMgc3RyaW5nW10pLm1hcCgodGFnKSA9PiBge3ske3RhZ319fWApLmpvaW4oJycpfX19YCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFwaVBhcnNlUGFyYW1zKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhZ3NDb250ZW50ID0gKHJlc3VsdCBhcyB7IHBhcnNlOiB7IHRleHQ6IHN0cmluZyB9IH0pLnBhcnNlLnRleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2F0ZWdvcmllc0NvbnRlbnQgPSAocmVzdWx0IGFzIHsgcGFyc2U6IHsgY2F0ZWdvcmllc2h0bWw6IHN0cmluZyB9IH0pLnBhcnNlLmNhdGVnb3JpZXNodG1sO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFuZWxMYXlvdXQgPSBuZXcgT08udWkuUGFuZWxMYXlvdXQoeyBwYWRkZWQ6IHRydWUsIGV4cGFuZGVkOiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbExheW91dC4kZWxlbWVudC5hcHBlbmQodGFnc0NvbnRlbnQsIGNhdGVnb3JpZXNDb250ZW50KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGFzIHVua25vd24gYXMgeyAkYm9keTogSlF1ZXJ5IH0pLiRib2R5LmFwcGVuZChwYW5lbExheW91dC4kZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGdldEFjdGlvblByb2Nlc3MgPSAoYWN0aW9uOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWN0aW9uXG4gICAgICAgICAgICAgICAgICAgID8gbmV3IE9PLnVpLlByb2Nlc3MoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldE1hbmFnZXIoKS5jbG9zZVdpbmRvdyh0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICA6IFRlbXBsYXRlUHJldmlld0RpYWxvZy5zdXBlci5wcm90b3R5cGUuZ2V0QWN0aW9uUHJvY2Vzcy5jYWxsKHRoaXMsIGFjdGlvbik7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBnZXRUZWFyZG93blByb2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFRlbXBsYXRlUHJldmlld0RpYWxvZy5zdXBlci5wcm90b3R5cGUuZ2V0VGVhcmRvd25Qcm9jZXNzLmNhbGwodGhpcykubmV4dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICh0aGlzIGFzIHVua25vd24gYXMgeyAkYm9keTogSlF1ZXJ5IH0pLiRib2R5LmVtcHR5KCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgT2JqZWN0LmFzc2lnbihUZW1wbGF0ZVByZXZpZXdEaWFsb2cucHJvdG90eXBlLCBPTy51aS5Qcm9jZXNzRGlhbG9nLnByb3RvdHlwZSk7XG5cbiAgICAgICAgLy8gU2V0dXAgVGVtcGxhdGVQcmV2aWV3RGlhbG9nXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaXMgYSBkaWFsb2cgdXNlZCBmb3Igc2hvd2luZyBjaGFuZ2VzIHRvIGJlIG1hZGUuXG4gICAgICAgICAqL1xuICAgICAgICBjbGFzcyBTaG93Q2hhbmdlc0RpYWxvZyBleHRlbmRzIE9PLnVpLlByb2Nlc3NEaWFsb2cge1xuICAgICAgICAgICAgLy8gVXRpbGl0eSB2YXJpYWJsZXNcbiAgICAgICAgICAgIHByaXZhdGUgYXBpID0gbmV3IG13LkFwaSgpO1xuXG4gICAgICAgICAgICBjb25zdHJ1Y3Rvcihjb25maWc6IE9PLnVpLlByb2Nlc3NEaWFsb2cuQ29uZmlnT3B0aW9ucykge1xuICAgICAgICAgICAgICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICAgICAgICAgICAgICBTaG93Q2hhbmdlc0RpYWxvZy5zdGF0aWMubmFtZSA9ICdTaG93Q2hhbmdlc0RpYWxvZyc7XG4gICAgICAgICAgICAgICAgU2hvd0NoYW5nZXNEaWFsb2cuc3RhdGljLnRpdGxlID0gJ0NoYW5nZXMgdG8gYmUgbWFkZSc7XG4gICAgICAgICAgICAgICAgU2hvd0NoYW5nZXNEaWFsb2cuc3RhdGljLmFjdGlvbnMgPSBbeyBhY3Rpb246ICdjYW5jZWwnLCBsYWJlbDogJ0Nsb3NlJywgZmxhZ3M6IFsnc2FmZScsICdjbG9zZSddIH1dO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBnZXRTZXR1cFByb2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFNob3dDaGFuZ2VzRGlhbG9nLnN1cGVyLnByb3RvdHlwZS5nZXRTZXR1cFByb2Nlc3MuY2FsbCh0aGlzKS5uZXh0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgW29sZFRleHQsIG5ld1RleHRdID0gdGhpcy5nZXREYXRhKCkgYXMgc3RyaW5nW107XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXBpXG4gICAgICAgICAgICAgICAgICAgICAgICAucG9zdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAnY29tcGFyZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3A6IFsnZGlmZiddLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21zbG90czogJ21haW4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmcm9tdGV4dC1tYWluJzogb2xkVGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZnJvbWNvbnRlbnRtb2RlbC1tYWluJzogJ3dpa2l0ZXh0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3Nsb3RzOiAnbWFpbicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RvdGV4dC1tYWluJzogbmV3VGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndG9jb250ZW50bW9kZWwtbWFpbic6ICd3aWtpdGV4dCcsXG4gICAgICAgICAgICAgICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlDb21wYXJlUGFnZXNQYXJhbXMgJiB7ICdmcm9tdGV4dC1tYWluJzogc3RyaW5nOyAnZnJvbWNvbnRlbnRtb2RlbC1tYWluJzogc3RyaW5nOyAndG90ZXh0LW1haW4nOiBzdHJpbmc7ICd0b2NvbnRlbnRtb2RlbC1tYWluJzogc3RyaW5nIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcGFyaXNvbiA9IChyZXN1bHQgYXMgeyBjb21wYXJlOiB7IGJvZHk6IHN0cmluZyB9IH0pLmNvbXBhcmUuYm9keTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vQ2hhbmdlc0VsZW1lbnQgPSBuZXcgT08udWkuTWVzc2FnZVdpZGdldCh7IHR5cGU6ICd3YXJuaW5nJywgbGFiZWw6ICdObyBjaGFuZ2VzIHRvIG1ha2UhJyB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhbmVsTGF5b3V0ID0gbmV3IE9PLnVpLlBhbmVsTGF5b3V0KHsgcGFkZGVkOiB0cnVlLCBleHBhbmRlZDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWxMYXlvdXQuJGVsZW1lbnQuYXBwZW5kKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJpc29uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGBcbjx0YWJsZSBjbGFzcz1cImRpZmYgZGlmZi1lZGl0Zm9udC1tb25vc3BhY2VcIj5cbiAgICA8Y29sZ3JvdXA+XG4gICAgICAgIDxjb2wgY2xhc3M9XCJkaWZmLW1hcmtlclwiPlxuICAgICAgICA8Y29sIGNsYXNzPVwiZGlmZi1jb250ZW50XCI+XG4gICAgICAgIDxjb2wgY2xhc3M9XCJkaWZmLW1hcmtlclwiPlxuICAgICAgICA8Y29sIGNsYXNzPVwiZGlmZi1jb250ZW50XCI+XG4gICAgPC9jb2xncm91cD5cbiAgICA8dGJvZHk+XG4gICAgICAgICR7Y29tcGFyaXNvbn1cbiAgICA8L3Rib2R5PlxuPC90YWJsZT5gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG5vQ2hhbmdlc0VsZW1lbnQuJGVsZW1lbnRbMF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGFzIHVua25vd24gYXMgeyAkYm9keTogSlF1ZXJ5IH0pLiRib2R5LmFwcGVuZChwYW5lbExheW91dC4kZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGdldEFjdGlvblByb2Nlc3MgPSAoYWN0aW9uOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWN0aW9uXG4gICAgICAgICAgICAgICAgICAgID8gbmV3IE9PLnVpLlByb2Nlc3MoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldE1hbmFnZXIoKS5jbG9zZVdpbmRvdyh0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICA6IFNob3dDaGFuZ2VzRGlhbG9nLnN1cGVyLnByb3RvdHlwZS5nZXRBY3Rpb25Qcm9jZXNzLmNhbGwodGhpcywgYWN0aW9uKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGdldFRlYXJkb3duUHJvY2VzcyA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gU2hvd0NoYW5nZXNEaWFsb2cuc3VwZXIucHJvdG90eXBlLmdldFRlYXJkb3duUHJvY2Vzcy5jYWxsKHRoaXMpLm5leHQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAodGhpcyBhcyB1bmtub3duIGFzIHsgJGJvZHk6IEpRdWVyeSB9KS4kYm9keS5lbXB0eSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIE9iamVjdC5hc3NpZ24oU2hvd0NoYW5nZXNEaWFsb2cucHJvdG90eXBlLCBPTy51aS5Qcm9jZXNzRGlhbG9nLnByb3RvdHlwZSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaGFuZGxlcyB0aGUgZW50aXJlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIHJlZGlyZWN0LWhlbHBlciBzY3JpcHQuXG4gICAgICAgICAqL1xuICAgICAgICBjbGFzcyBSZWRpcmVjdEhlbHBlciB7XG4gICAgICAgICAgICAvLyBVdGlsaXR5IHZhcmlhYmxlc1xuICAgICAgICAgICAgcHJpdmF0ZSBhcGkgPSBuZXcgbXcuQXBpKCk7XG5cbiAgICAgICAgICAgIC8vIEFzc2lnbmVkIGluIGNvbnN0cnVjdG9yXG4gICAgICAgICAgICBwcml2YXRlIHJlZGlyZWN0VGVtcGxhdGVzITogUmVkaXJlY3RUZW1wbGF0ZURhdGE7XG4gICAgICAgICAgICBwcml2YXRlIGNvbnRlbnRUZXh0ITogSFRNTERpdkVsZW1lbnQ7XG4gICAgICAgICAgICBwcml2YXRlIHBhZ2VUaXRsZSE6IHN0cmluZztcbiAgICAgICAgICAgIHByaXZhdGUgcGFnZVRpdGxlUGFyc2VkITogbXcuVGl0bGU7XG5cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogUnVucyB0aGUgcmVkaXJlY3QgaGVscGVyLlxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBhc3luYyBydW4oKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnBhc3Nlc1ByZUNoZWNrcygpKSByZXR1cm47XG5cbiAgICAgICAgICAgICAgICB0aGlzLnJlZGlyZWN0VGVtcGxhdGVzID0gYXdhaXQgdGhpcy5mZXRjaFJlZGlyZWN0VGVtcGxhdGVzKCk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRUZXh0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI213LWNvbnRlbnQtdGV4dCcpIGFzIEhUTUxEaXZFbGVtZW50O1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5jb250ZW50VGV4dCkgcmV0dXJuIG13Lm5vdGlmeSgncmVkaXJlY3QtaGVscGVyOiBGYWlsZWQgdG8gZmluZCBjb250ZW50IHRleHQgZWxlbWVudCEnLCB7IHR5cGU6ICdlcnJvcicgfSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2VUaXRsZSA9IG13LmNvbmZpZy5nZXQoJ3dnUGFnZU5hbWUnKTtcblxuICAgICAgICAgICAgICAgIHRoaXMucGFnZVRpdGxlUGFyc2VkID0gbXcuVGl0bGUubmV3RnJvbVRleHQodGhpcy5wYWdlVGl0bGUpITtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMucGFnZVRpdGxlUGFyc2VkKSByZXR1cm4gbXcubm90aWZ5KCdyZWRpcmVjdC1oZWxwZXI6IEZhaWxlZCB0byBwYXJzZSBwYWdlIHRpdGxlIScsIHsgdHlwZTogJ2Vycm9yJyB9KTtcblxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY2hlY2tQYWdlQW5kTG9hZCgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIENoZWNrcyBpZiB0aGUgcGFnZSBwYXNzZXMgcHJlIGNoZWNrcy5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgcHJpdmF0ZSBwYXNzZXNQcmVDaGVja3MoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29uZGl0aW9ucyA9IFtcbiAgICAgICAgICAgICAgICAgICAgbXcuY29uZmlnLmdldCgnd2dOYW1lc3BhY2VOdW1iZXInKSA+PSAwLCAvLyBJcyBub3QgdmlydHVhbCBuYW1lc3BhY2VcbiAgICAgICAgICAgICAgICAgICAgbXcuY29uZmlnLmdldCgnd2dJc1Byb2JhYmx5RWRpdGFibGUnKSwgLy8gUGFnZSBpcyBlZGl0YWJsZVxuICAgICAgICAgICAgICAgICAgICBtdy5jb25maWcuZ2V0KCd3Z0lzQXJ0aWNsZScpLCAvLyBWaWV3aW5nIHRoZSBjb250ZW50IG9mIGEgcGFnZVxuICAgICAgICAgICAgICAgICAgICBtdy5jb25maWcuZ2V0KCd3Z0FjdGlvbicpID09PSAndmlldycsIC8vIFZpZXdpbmcgdGhlIHBhZ2UgKG5vdCBlZGl0aW5nKVxuICAgICAgICAgICAgICAgICAgICBtdy5jb25maWcuZ2V0KCd3Z1JldmlzaW9uSWQnKSA9PT0gbXcuY29uZmlnLmdldCgnd2dDdXJSZXZpc2lvbklkJyksIC8vIFZpZXdpbmcgdGhlIGN1cnJlbnQgcmV2aXNpb25cbiAgICAgICAgICAgICAgICAgICAgIW13LmNvbmZpZy5nZXQoJ3dnRGlmZk9sZElkJyksIC8vIE5vdCB2aWV3aW5nIGEgZGlmZlxuICAgICAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gY29uZGl0aW9ucy5ldmVyeShCb29sZWFuKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBGZXRjaGVzIHRoZSByZWRpcmVjdCB0ZW1wbGF0ZXMuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHByaXZhdGUgYXN5bmMgZmV0Y2hSZWRpcmVjdFRlbXBsYXRlcygpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShcbiAgICAgICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICAgICAgKGF3YWl0IHRoaXMuYXBpLmdldCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wOiAncmV2aXNpb25zJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydnByb3A6ICdjb250ZW50JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydnNsb3RzOiAnbWFpbicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGVzOiAnVXNlcjpFZWppdDQzL3NjcmlwdHMvcmVkaXJlY3QtaGVscGVyLmpzb24nLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlSZXZpc2lvbnNQYXJhbXMpKSBhcyBQYWdlUmV2aXNpb25zUmVzdWx0XG4gICAgICAgICAgICAgICAgICAgICkucXVlcnkucGFnZXM/LlswXT8ucmV2aXNpb25zPy5bMF0/LnNsb3RzPy5tYWluPy5jb250ZW50IHx8ICd7fScsXG4gICAgICAgICAgICAgICAgKSBhcyBSZWRpcmVjdFRlbXBsYXRlRGF0YTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBDaGVja3MgYSBwYWdlJ3Mgc3RhdHVzIGFuZCBsb2FkcyB0aGUgaGVscGVyIGFwcHJvcHJpYXRlbHkuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHByaXZhdGUgYXN5bmMgY2hlY2tQYWdlQW5kTG9hZCgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYWdlSW5mbyA9IChhd2FpdCB0aGlzLmFwaS5nZXQoeyBhY3Rpb246ICdxdWVyeScsIGZvcm1hdHZlcnNpb246ICcyJywgcHJvcDogJ2luZm8nLCB0aXRsZXM6IHRoaXMucGFnZVRpdGxlIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5SW5mb1BhcmFtcykpIGFzIFBhZ2VJbmZvUmVzdWx0O1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZGlhbG9nSW5mbyA9IHsgcmVkaXJlY3RUZW1wbGF0ZXM6IHRoaXMucmVkaXJlY3RUZW1wbGF0ZXMsIGNvbnRlbnRUZXh0OiB0aGlzLmNvbnRlbnRUZXh0LCBwYWdlVGl0bGU6IHRoaXMucGFnZVRpdGxlLCBwYWdlVGl0bGVQYXJzZWQ6IHRoaXMucGFnZVRpdGxlUGFyc2VkIH07XG5cbiAgICAgICAgICAgICAgICBpZiAocGFnZUluZm8ucXVlcnkucGFnZXNbMF0ubWlzc2luZykge1xuICAgICAgICAgICAgICAgICAgICBtdy51dGlsLmFkZENTUyhgXG4jY3JlYXRlLXJlZGlyZWN0LWJ1dHRvbiB7XG4gICAgbWFyZ2luLWJvdHRvbTogMjBweDtcbn1gKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBidXR0b24gPSBuZXcgT08udWkuQnV0dG9uV2lkZ2V0KHsgaWQ6ICdjcmVhdGUtcmVkaXJlY3QtYnV0dG9uJywgbGFiZWw6ICdDcmVhdGUgcmVkaXJlY3QnLCBpY29uOiAnYXJ0aWNsZVJlZGlyZWN0JywgZmxhZ3M6IFsncHJvZ3Jlc3NpdmUnXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uLm9uKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbi4kZWxlbWVudFswXS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSZWRpcmVjdEhlbHBlckRpYWxvZyhkaWFsb2dJbmZvLCBmYWxzZSkubG9hZCgpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRUZXh0LnByZXBlbmQoYnV0dG9uLiRlbGVtZW50WzBdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhZ2VJbmZvLnF1ZXJ5LnBhZ2VzWzBdLnJlZGlyZWN0KSBuZXcgUmVkaXJlY3RIZWxwZXJEaWFsb2coZGlhbG9nSW5mbywgdHJ1ZSkubG9hZCgpO1xuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwb3J0bGV0TGluayA9IG13LnV0aWwuYWRkUG9ydGxldExpbmsobXcuY29uZmlnLmdldCgnc2tpbicpID09PSAnbWluZXJ2YScgPyAncC10YicgOiAncC1jYWN0aW9ucycsICcjJywgJ1JlZGlyZWN0IHBhZ2UnLCAncmVkaXJlY3QtaGVscGVyJykhO1xuICAgICAgICAgICAgICAgICAgICBwb3J0bGV0TGluay5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJlZGlyZWN0SGVscGVyRGlhbG9nKGRpYWxvZ0luZm8sIGZhbHNlKS5sb2FkKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zY3JvbGxUbyh7IHRvcDogMCwgYmVoYXZpb3I6ICdzbW9vdGgnIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3J0bGV0TGluay5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaGFuZGxlcyB0aGUgZGlhbG9nIHBvcnRpb24gb2YgcmVkaXJlY3QtaGVscGVyIHNjcmlwdC5cbiAgICAgICAgICovXG4gICAgICAgIGNsYXNzIFJlZGlyZWN0SGVscGVyRGlhbG9nIHtcbiAgICAgICAgICAgIC8vIFV0aWxpdHkgdmFyaWFibGVzXG4gICAgICAgICAgICBwcml2YXRlIGFwaSA9IG5ldyBtdy5BcGkoKTtcbiAgICAgICAgICAgIHByaXZhdGUgcmVkaXJlY3RSZWdleCA9IC9eI3JlZGlyZWN0Oj9cXHMqXFxbXFxbXFxzKjo/KFteW1xcXXt8fV0rPylcXHMqKD86XFx8W15bXFxde3x9XSs/KT9dXVxccyovaTtcbiAgICAgICAgICAgIHByaXZhdGUgc2NyaXB0QWR2ZXJ0ID0gJyAodmlhIFtbVXNlcjpFZWppdDQzL3NjcmlwdHMvcmVkaXJlY3QtaGVscGVyfHJlZGlyZWN0LWhlbHBlcl1dKSc7XG5cbiAgICAgICAgICAgIC8vIEFzc2lnbmVkIGluIGNvbnN0cnVjdG9yXG4gICAgICAgICAgICBwcml2YXRlIHJlZGlyZWN0VGVtcGxhdGVzOiBSZWRpcmVjdFRlbXBsYXRlRGF0YTtcbiAgICAgICAgICAgIHByaXZhdGUgY29udGVudFRleHQ6IEhUTUxEaXZFbGVtZW50O1xuICAgICAgICAgICAgcHJpdmF0ZSBwYWdlVGl0bGU6IHN0cmluZztcbiAgICAgICAgICAgIHByaXZhdGUgcGFnZVRpdGxlUGFyc2VkOiBtdy5UaXRsZTtcblxuICAgICAgICAgICAgcHJpdmF0ZSBleGlzdHM6IGJvb2xlYW47XG5cbiAgICAgICAgICAgIC8vIFVzZWQgZHVyaW5nIHJ1bigpXG4gICAgICAgICAgICBwcml2YXRlIG5lZWRzQ2hlY2sgPSB0cnVlO1xuXG4gICAgICAgICAgICBwcml2YXRlIGVkaXRvckJveCE6IE9PLnVpLlBhbmVsTGF5b3V0O1xuICAgICAgICAgICAgcHJpdmF0ZSBzeW5jV2l0aE1haW5CdXR0b24/OiBPTy51aS5CdXR0b25XaWRnZXQ7XG4gICAgICAgICAgICBwcml2YXRlIHJlZGlyZWN0SW5wdXQhOiBSZWRpcmVjdElucHV0V2lkZ2V0O1xuICAgICAgICAgICAgcHJpdmF0ZSByZWRpcmVjdElucHV0TGF5b3V0ITogT08udWkuRmllbGRMYXlvdXQ7XG4gICAgICAgICAgICBwcml2YXRlIHRhZ1NlbGVjdCE6IE9PLnVpLk1lbnVUYWdNdWx0aXNlbGVjdFdpZGdldDtcbiAgICAgICAgICAgIHByaXZhdGUgdGFnU2VsZWN0TGF5b3V0ITogT08udWkuQWN0aW9uRmllbGRMYXlvdXQ7XG4gICAgICAgICAgICBwcml2YXRlIHRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvciE6IEhUTUxEZXRhaWxzRWxlbWVudDtcbiAgICAgICAgICAgIHByaXZhdGUgdGVtcGxhdGVFZGl0b3JzSW5mbzogVGVtcGxhdGVFZGl0b3JFbGVtZW50SW5mb1tdID0gW107XG4gICAgICAgICAgICBwcml2YXRlIGNhdGVnb3J5U2VsZWN0ITogT08udWkuVGFnTXVsdGlzZWxlY3RXaWRnZXQ7XG4gICAgICAgICAgICBwcml2YXRlIGNhdGVnb3J5U2VsZWN0SW5wdXQhOiBDYXRlZ29yeUlucHV0V2lkZ2V0O1xuICAgICAgICAgICAgcHJpdmF0ZSBjYXRlZ29yeVNlbGVjdExheW91dCE6IE9PLnVpLkZpZWxkTGF5b3V0O1xuICAgICAgICAgICAgcHJpdmF0ZSBkZWZhdWx0U29ydElucHV0ITogT08udWkuVGV4dElucHV0V2lkZ2V0O1xuICAgICAgICAgICAgcHJpdmF0ZSBkZWZhdWx0U29ydFN1Z2dlc3RCdXR0b24hOiBPTy51aS5CdXR0b25XaWRnZXQ7XG4gICAgICAgICAgICBwcml2YXRlIGRlZmF1bHRTb3J0SW5wdXRMYXlvdXQhOiBPTy51aS5BY3Rpb25GaWVsZExheW91dDtcbiAgICAgICAgICAgIHByaXZhdGUgc3VtbWFyeUlucHV0ITogT08udWkuQ29tYm9Cb3hJbnB1dFdpZGdldDtcbiAgICAgICAgICAgIHByaXZhdGUgc3VtbWFyeUlucHV0TGF5b3V0ITogT08udWkuRmllbGRMYXlvdXQ7XG4gICAgICAgICAgICBwcml2YXRlIHN1Ym1pdEJ1dHRvbiE6IE9PLnVpLkJ1dHRvbldpZGdldDtcbiAgICAgICAgICAgIHByaXZhdGUgc2hvd0NoYW5nZXNCdXR0b24hOiBPTy51aS5CdXR0b25XaWRnZXQ7XG4gICAgICAgICAgICBwcml2YXRlIHByZXZpZXdCdXR0b24hOiBPTy51aS5CdXR0b25XaWRnZXQ7XG4gICAgICAgICAgICBwcml2YXRlIHN5bmNUYWxrQ2hlY2tib3g/OiBPTy51aS5DaGVja2JveElucHV0V2lkZ2V0O1xuICAgICAgICAgICAgcHJpdmF0ZSBzeW5jVGFsa0NoZWNrYm94TGF5b3V0PzogT08udWkuV2lkZ2V0O1xuICAgICAgICAgICAgcHJpdmF0ZSBwYXRyb2xDaGVja2JveD86IE9PLnVpLkNoZWNrYm94SW5wdXRXaWRnZXQ7XG4gICAgICAgICAgICBwcml2YXRlIHBhdHJvbENoZWNrYm94TGF5b3V0PzogT08udWkuV2lkZ2V0O1xuICAgICAgICAgICAgcHJpdmF0ZSBzdWJtaXRMYXlvdXQhOiBPTy51aS5Ib3Jpem9udGFsTGF5b3V0O1xuXG4gICAgICAgICAgICBwcml2YXRlIHRhbGtEYXRhPzogUGFnZUluZm9SZXN1bHQ7XG5cbiAgICAgICAgICAgIHByaXZhdGUgcGFnZUNvbnRlbnQgPSAnJztcblxuICAgICAgICAgICAgcHJpdmF0ZSBvbGRSZWRpcmVjdFRhcmdldD86IHN0cmluZztcbiAgICAgICAgICAgIHByaXZhdGUgb2xkUmVkaXJlY3RUYWdzPzogc3RyaW5nW107XG4gICAgICAgICAgICBwcml2YXRlIG9sZFJlZGlyZWN0VGFnRGF0YT86IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdW10+O1xuICAgICAgICAgICAgcHJpdmF0ZSBvbGREZWZhdWx0U29ydD86IHN0cmluZztcbiAgICAgICAgICAgIHByaXZhdGUgb2xkQ2F0ZWdvcmllcz86IHN0cmluZ1tdO1xuICAgICAgICAgICAgcHJpdmF0ZSBvbGRTdHJheVRleHQ/OiBzdHJpbmc7XG5cbiAgICAgICAgICAgIHByaXZhdGUgcGFyc2VkRGVzdGluYXRpb24hOiBtdy5UaXRsZSB8IG51bGw7XG5cbiAgICAgICAgICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICAgICAgICAgIHsgcmVkaXJlY3RUZW1wbGF0ZXMsIGNvbnRlbnRUZXh0LCBwYWdlVGl0bGUsIHBhZ2VUaXRsZVBhcnNlZCB9OiB7IHJlZGlyZWN0VGVtcGxhdGVzOiBSZWRpcmVjdFRlbXBsYXRlRGF0YTsgY29udGVudFRleHQ6IEhUTUxEaXZFbGVtZW50OyBwYWdlVGl0bGU6IHN0cmluZzsgcGFnZVRpdGxlUGFyc2VkOiBtdy5UaXRsZSB9LFxuICAgICAgICAgICAgICAgIGV4aXN0czogYm9vbGVhbixcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVkaXJlY3RUZW1wbGF0ZXMgPSByZWRpcmVjdFRlbXBsYXRlcztcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRUZXh0ID0gY29udGVudFRleHQ7XG4gICAgICAgICAgICAgICAgdGhpcy5wYWdlVGl0bGUgPSBwYWdlVGl0bGU7XG4gICAgICAgICAgICAgICAgdGhpcy5wYWdlVGl0bGVQYXJzZWQgPSBwYWdlVGl0bGVQYXJzZWQ7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmV4aXN0cyA9IGV4aXN0cztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBMb2FkcyB0aGUgcmVkaXJlY3QtaGVscGVyIGRpYWxvZyBpbnRvIHRoZSBwYWdlLlxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBhc3luYyBsb2FkKCkge1xuICAgICAgICAgICAgICAgIG13LnV0aWwuYWRkQ1NTKGBcbiNjcmVhdGUtcmVkaXJlY3QtYnV0dG9uIHtcbiAgICBtYXJnaW4tYm90dG9tOiAyMHB4O1xufVxuXG4jcmVkaXJlY3QtaGVscGVyLWJveCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGVzbW9rZTtcbiAgICB3aWR0aDogNzAwcHg7XG4gICAgbWF4LXdpZHRoOiBjYWxjKDEwMCUgLSA1MHB4KTtcbiAgICBtYXJnaW4tbGVmdDogYXV0bztcbiAgICBtYXJnaW4tcmlnaHQ6IGF1dG87XG4gICAgbWFyZ2luLWJvdHRvbTogMjVweCAhaW1wb3J0YW50O1xufVxuXG4ucmVkaXJlY3QtaW5wdXQtbGF5b3V0IGxhYmVsIHtcbiAgICBmb250LXdlaWdodDogYm9sZDtcbn1cblxuLnJlZGlyZWN0LWhlbHBlci10ZW1wbGF0ZS1wYXJhbWV0ZXJzLWNvbnRhaW5lciwgLnJlZGlyZWN0LWhlbHBlci10ZW1wbGF0ZS1wYXJhbWV0ZXJzLWNvbnRhaW5lciBkZXRhaWxzIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTJlMmUyO1xuICAgIGJvcmRlci1yYWRpdXM6IDVweDtcbiAgICBtYXJnaW4tYmxvY2s6IDEwcHg7XG4gICAgcGFkZGluZzogNXB4O1xufVxuXG4ucmVkaXJlY3QtaGVscGVyLXRlbXBsYXRlLXBhcmFtZXRlcnMtY29udGFpbmVyIHN1bW1hcnkge1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBmb250LXdlaWdodDogYm9sZDtcbn1cblxuLnJlZGlyZWN0LWhlbHBlci10ZW1wbGF0ZS1wYXJhbWV0ZXJzLWNvbnRhaW5lciBkZXRhaWxzIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZDFjZWNlO1xuICAgIG1hcmdpbi1ibG9jazogNXB4O1xufVxuXG4ucmVkaXJlY3QtaGVscGVyLXRlbXBsYXRlLXBhcmFtZXRlcnMtY29udGFpbmVkICNyZWRpcmVjdC1oZWxwZXItbm8tdGVtcGxhdGVzLW1lc3NhZ2Uge1xuICAgIHBhZGRpbmc6IDVweDtcbn1cblxuI3JlZGlyZWN0LWhlbHBlci1zdW1tYXJ5LWxheW91dCB7XG4gICAgcGFkZGluZy10b3A6IDEwcHg7XG4gICAgbWFyZ2luLXRvcDogMTVweDtcbiAgICBib3JkZXItdG9wOiAxcHggc29saWQgZ3JheTtcbn1cblxuI3JlZGlyZWN0LWhlbHBlci1zdWJtaXQtbGF5b3V0IHtcbiAgICBtYXJnaW4tdG9wOiAxMHB4O1xufVxuXG4jcmVkaXJlY3QtaGVscGVyLXN1Ym1pdC1sYXlvdXQgPiAqIHtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xufVxuXG4ucmVkaXJlY3QtaGVscGVyLXdhcm5pbmcge1xuICAgIG1hcmdpbi10b3A6IDhweDtcbn1gKTtcblxuICAgICAgICAgICAgICAgIG13LmxvYWRlci5hZGRMaW5rVGFnKCdodHRwczovL3d3dy5tZWRpYXdpa2kub3JnL3cvbG9hZC5waHA/bW9kdWxlcz1tZWRpYXdpa2kuZGlmZi5zdHlsZXMmb25seT1zdHlsZXMnKTtcblxuICAgICAgICAgICAgICAgIC8qIExvYWQgZWxlbWVudHMgKi9cbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvckJveCA9IG5ldyBPTy51aS5QYW5lbExheW91dCh7IGlkOiAncmVkaXJlY3QtaGVscGVyLWJveCcsIHBhZGRlZDogdHJ1ZSwgZXhwYW5kZWQ6IGZhbHNlLCBmcmFtZWQ6IHRydWUgfSk7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wYWdlVGl0bGVQYXJzZWQuaXNUYWxrUGFnZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1haW5QYWdlRGF0YSA9IChhd2FpdCB0aGlzLmFwaS5nZXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcDogJ2luZm8nLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGVzOiB0aGlzLnBhZ2VUaXRsZVBhcnNlZC5nZXRTdWJqZWN0UGFnZSgpIS5nZXRQcmVmaXhlZFRleHQoKSxcbiAgICAgICAgICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlJbmZvUGFyYW1zKSkgYXMgUGFnZUluZm9SZXN1bHQ7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG1haW5QYWdlRGF0YS5xdWVyeS5wYWdlc1swXS5yZWRpcmVjdCkgYXdhaXQgdGhpcy5sb2FkU3luY1dpdGhNYWluQnV0dG9uKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkSW5wdXRFbGVtZW50cygpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubG9hZFN1Ym1pdEVsZW1lbnRzKCk7XG5cbiAgICAgICAgICAgICAgICAvKiBBZGQgZWxlbWVudHMgdG8gc2NyZWVuIGFuZCBsb2FkIGRhdGEgKGlmIGFwcGxpY2FibGUpICovXG4gICAgICAgICAgICAgICAgdGhpcy5lZGl0b3JCb3guJGVsZW1lbnRbMF0uYXBwZW5kKFxuICAgICAgICAgICAgICAgICAgICAuLi4oW1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zeW5jV2l0aE1haW5CdXR0b24/LiRlbGVtZW50Py5bMF0sXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZGlyZWN0SW5wdXRMYXlvdXQuJGVsZW1lbnRbMF0sXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRhZ1NlbGVjdExheW91dC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0U29ydElucHV0TGF5b3V0LiRlbGVtZW50WzBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXRlZ29yeVNlbGVjdExheW91dC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3VtbWFyeUlucHV0TGF5b3V0LiRlbGVtZW50WzBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdWJtaXRMYXlvdXQuJGVsZW1lbnRbMF0sXG4gICAgICAgICAgICAgICAgICAgIF0uZmlsdGVyKEJvb2xlYW4pIGFzIEhUTUxFbGVtZW50W10pLFxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRUZXh0LnByZXBlbmQodGhpcy5lZGl0b3JCb3guJGVsZW1lbnRbMF0pO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZXhpc3RzKSB0aGlzLmxvYWRFeGlzdGluZ0RhdGEoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBMb2FkcyB0aGUgXCJTeW5jIHdpdGggbWFpbiBwYWdlXCIgYnV0dG9uXCIgb24gdGFsayBwYWdlcy5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgcHJpdmF0ZSBhc3luYyBsb2FkU3luY1dpdGhNYWluQnV0dG9uKCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1haW5QYWdlQ29udGVudCA9IGF3YWl0IHRoaXMuZ2V0UGFnZUNvbnRlbnQodGhpcy5wYWdlVGl0bGVQYXJzZWQuZ2V0U3ViamVjdFBhZ2UoKSEuZ2V0UHJlZml4ZWRUZXh0KCkpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5zeW5jV2l0aE1haW5CdXR0b24gPSBuZXcgT08udWkuQnV0dG9uV2lkZ2V0KHsgbGFiZWw6ICdTeW5jIHdpdGggbWFpbiBwYWdlJywgaWNvbjogJ2xpbmsnLCBmbGFnczogWydwcm9ncmVzc2l2ZSddIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuc3luY1dpdGhNYWluQnV0dG9uLm9uKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5yZWRpcmVjdFJlZ2V4LmV4ZWMobWFpblBhZ2VDb250ZW50KT8uWzFdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRhcmdldCkgcmV0dXJuIG13Lm5vdGlmeSgnRmFpbGVkIHRvIHBhcnNlIG1haW4gcGFnZSBjb250ZW50IScsIHsgdHlwZTogJ2Vycm9yJyB9KTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZGlyZWN0SW5wdXQuc2V0VmFsdWUobXcuVGl0bGUubmV3RnJvbVRleHQodGFyZ2V0KT8uZ2V0VGFsa1BhZ2UoKT8udG9TdHJpbmcoKSA/PyAnJyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZyb21Nb3ZlID0gWydSIGZyb20gbW92ZScsIC4uLnRoaXMucmVkaXJlY3RUZW1wbGF0ZXNbJ1IgZnJvbSBtb3ZlJ10uYWxpYXNlc10uc29tZSgodGFnT3JSZWRpcmVjdCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSZWdFeHAoYHt7XFxcXHMqWyR7dGFnT3JSZWRpcmVjdFswXS50b0xvd2VyQ2FzZSgpfSR7dGFnT3JSZWRpcmVjdFswXX1dJHt0YWdPclJlZGlyZWN0LnNsaWNlKDEpfVxcXFxzKihcXFxcfHx9fSlgKS50ZXN0KG1haW5QYWdlQ29udGVudCksXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmcm9tTW92ZSkgdGhpcy50YWdTZWxlY3Quc2V0VmFsdWUoWydSIGZyb20gbW92ZSddKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBMb2FkcyB0aGUgaW5wdXQgZWxlbWVudHMuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHByaXZhdGUgbG9hZElucHV0RWxlbWVudHMoKSB7XG4gICAgICAgICAgICAgICAgLyogUmVkaXJlY3QgdGFyZ2V0IGlucHV0ICovXG4gICAgICAgICAgICAgICAgdGhpcy5yZWRpcmVjdElucHV0ID0gbmV3IFJlZGlyZWN0SW5wdXRXaWRnZXQoeyBwbGFjZWhvbGRlcjogJ1RhcmdldCBwYWdlIG5hbWUnLCByZXF1aXJlZDogdHJ1ZSB9LCB0aGlzLnBhZ2VUaXRsZVBhcnNlZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWRpcmVjdElucHV0Lm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IHRoaXMucmVkaXJlY3RJbnB1dC5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UobmV3IFJlZ0V4cChgXihodHRwcz86KT8vezJ9PyR7bXcuY29uZmlnLmdldCgnd2dTZXJ2ZXInKS5yZXBsYWNlKC9eXFwvezJ9LywgJycpfS93aWtpL2ApLCAnJyk7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvXjovLCAnJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVkaXJlY3RJbnB1dC5zZXRWYWx1ZSh2YWx1ZVswXS50b1VwcGVyQ2FzZSgpICsgdmFsdWUuc2xpY2UoMSkucmVwbGFjZUFsbCgnXycsICcgJykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0U29ydFN1Z2dlc3RCdXR0b24uc2V0RGlzYWJsZWQoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24uc2V0RGlzYWJsZWQoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93Q2hhbmdlc0J1dHRvbi5zZXREaXNhYmxlZChmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRTb3J0U3VnZ2VzdEJ1dHRvbi5zZXREaXNhYmxlZCh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldERpc2FibGVkKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93Q2hhbmdlc0J1dHRvbi5zZXREaXNhYmxlZCh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU3VtbWFyeSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5zZXRMYWJlbCgnU3VibWl0Jyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmVlZHNDaGVjayA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnJlZGlyZWN0SW5wdXRMYXlvdXQgPSBuZXcgT08udWkuRmllbGRMYXlvdXQodGhpcy5yZWRpcmVjdElucHV0LCB7IGxhYmVsOiAnUmVkaXJlY3QgdGFyZ2V0OicsIGNsYXNzZXM6IFsncmVkaXJlY3QtaW5wdXQtbGF5b3V0J10sIGFsaWduOiAndG9wJyB9KTtcblxuICAgICAgICAgICAgICAgIC8qIFJlZGlyZWN0IGNhdGVnb3JpemF0aW9uIHRlbXBsYXRlIHNlbGVjdGlvbiAqL1xuICAgICAgICAgICAgICAgIHRoaXMudGFnU2VsZWN0ID0gbmV3IE9PLnVpLk1lbnVUYWdNdWx0aXNlbGVjdFdpZGdldCh7XG4gICAgICAgICAgICAgICAgICAgIGFsbG93QXJiaXRyYXJ5OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dSZW9yZGVyaW5nOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogT2JqZWN0LmtleXModGhpcy5yZWRpcmVjdFRlbXBsYXRlcykubWFwKCh0YWcpID0+ICh7IGRhdGE6IHRhZywgbGFiZWw6IHRhZyB9KSksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgKHRoaXMudGFnU2VsZWN0LmdldE1lbnUoKSBhcyBPTy51aS5NZW51U2VsZWN0V2lkZ2V0LkNvbmZpZ09wdGlvbnMpLmZpbHRlck1vZGUgPSAnc3Vic3RyaW5nJztcbiAgICAgICAgICAgICAgICB0aGlzLnRhZ1NlbGVjdC5vbignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzb3J0ZWRUYWdzID0gKHRoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10pLnNvcnQoKGEsIGIpID0+IGEudG9Mb3dlckNhc2UoKS5sb2NhbGVDb21wYXJlKGIudG9Mb3dlckNhc2UoKSkpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICgodGhpcy50YWdTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXSkuam9pbignOycpICE9PSBzb3J0ZWRUYWdzLmpvaW4oJzsnKSkgdGhpcy50YWdTZWxlY3Quc2V0VmFsdWUoc29ydGVkVGFncyk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTdW1tYXJ5KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldExhYmVsKCdTdWJtaXQnKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZWVkc0NoZWNrID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50YWdTZWxlY3QuZ2V0VmFsdWUoKS5sZW5ndGggPiAwKSB0aGlzLnByZXZpZXdCdXR0b24uc2V0RGlzYWJsZWQoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIHRoaXMucHJldmlld0J1dHRvbi5zZXREaXNhYmxlZCh0cnVlKTtcblxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGVkaXRvckluZm8gb2YgdGhpcy50ZW1wbGF0ZUVkaXRvcnNJbmZvKSBlZGl0b3JJbmZvLmRldGFpbHMuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICAgICAgICAgICAgICAgICAgICBsZXQgc2hvd25UZW1wbGF0ZUVkaXRvcnMgPSAwO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHRhZyBvZiB0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZGl0b3JJbmZvID0gdGhpcy50ZW1wbGF0ZUVkaXRvcnNJbmZvLmZpbmQoKGVkaXRvckluZm8pID0+IGVkaXRvckluZm8ubmFtZSA9PT0gdGFnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVkaXRvckluZm8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGl0b3JJbmZvLmRldGFpbHMuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd25UZW1wbGF0ZUVkaXRvcnMrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIG5vVGVtcGxhdGVzTWVzc2FnZS5zdHlsZS5kaXNwbGF5ID0gc2hvd25UZW1wbGF0ZUVkaXRvcnMgPiAwID8gJ25vbmUnIDogJ2Jsb2NrJztcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIC8qIFJlZGlyZWN0IGNhdGVnb3JpemF0aW9uIHRlbXBsYXRlIHByZXZpZXcgYnV0dG9uICovXG4gICAgICAgICAgICAgICAgY29uc3Qgd2luZG93TWFuYWdlciA9IG5ldyBPTy51aS5XaW5kb3dNYW5hZ2VyKCk7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmQod2luZG93TWFuYWdlci4kZWxlbWVudFswXSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZVByZXZpZXdEaWFsb2cgPSBuZXcgVGVtcGxhdGVQcmV2aWV3RGlhbG9nKHsgc2l6ZTogJ2xhcmdlJyB9LCB0aGlzLnBhZ2VUaXRsZVBhcnNlZCk7XG4gICAgICAgICAgICAgICAgd2luZG93TWFuYWdlci5hZGRXaW5kb3dzKFt0ZW1wbGF0ZVByZXZpZXdEaWFsb2ddKTtcblxuICAgICAgICAgICAgICAgIHRoaXMucHJldmlld0J1dHRvbiA9IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoeyBpY29uOiAnZXllJywgbGFiZWw6ICdQcmV2aWV3JywgZGlzYWJsZWQ6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5wcmV2aWV3QnV0dG9uLm9uKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVQcmV2aWV3RGlhbG9nLnNldERhdGEodGhpcy50YWdTZWxlY3QuZ2V0VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlUHJldmlld0RpYWxvZy5vcGVuKCk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnRhZ1NlbGVjdExheW91dCA9IG5ldyBPTy51aS5BY3Rpb25GaWVsZExheW91dCh0aGlzLnRhZ1NlbGVjdCwgdGhpcy5wcmV2aWV3QnV0dG9uLCB7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnUmVkaXJlY3QgY2F0ZWdvcml6YXRpb24gdGVtcGxhdGVzOicsXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzZXM6IFsncmVkaXJlY3QtaW5wdXQtbGF5b3V0J10sXG4gICAgICAgICAgICAgICAgICAgIGFsaWduOiAndG9wJyxcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIC8qIFJlZGlyZWN0IGNhdGVnb3JpemF0aW9uIHRlbXBsYXRlIHBhcmFtZXRlcnMgKi9cbiAgICAgICAgICAgICAgICB0aGlzLnRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RldGFpbHMnKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvci5jbGFzc0xpc3QuYWRkKCdyZWRpcmVjdC1oZWxwZXItdGVtcGxhdGUtcGFyYW1ldGVycy1jb250YWluZXInKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHN1bW1hcnlFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3VtbWFyeScpO1xuICAgICAgICAgICAgICAgIHN1bW1hcnlFbGVtZW50LnRleHRDb250ZW50ID0gJ1RlbXBsYXRlIHBhcmFtZXRlcnMnO1xuICAgICAgICAgICAgICAgIHRoaXMudGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yLmFwcGVuZChzdW1tYXJ5RWxlbWVudCk7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFt0ZW1wbGF0ZU5hbWUsIHRlbXBsYXRlRGF0YV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5yZWRpcmVjdFRlbXBsYXRlcykpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyYW1ldGVycyA9IE9iamVjdC5lbnRyaWVzKHRlbXBsYXRlRGF0YS5wYXJhbWV0ZXJzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtZXRlcnMubGVuZ3RoID09PSAwKSBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXRhaWxzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGV0YWlscycpO1xuICAgICAgICAgICAgICAgICAgICBkZXRhaWxzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3VtbWFyeSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N1bW1hcnknKTtcbiAgICAgICAgICAgICAgICAgICAgc3VtbWFyeS50ZXh0Q29udGVudCA9IHRlbXBsYXRlTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgZGV0YWlscy5hcHBlbmQoc3VtbWFyeSk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudERhdGE6IFRlbXBsYXRlRWRpdG9yRWxlbWVudEluZm8gPSB7IG5hbWU6IHRlbXBsYXRlTmFtZSwgZGV0YWlscywgcGFyYW1ldGVyczogW10gfTtcblxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtwYXJhbWV0ZXJOYW1lLCBwYXJhbWV0ZXJEYXRhXSBvZiBwYXJhbWV0ZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnB1dCA9IG5ldyBPTy51aS5UZXh0SW5wdXRXaWRnZXQoeyBwbGFjZWhvbGRlcjogcGFyYW1ldGVyRGF0YS5kZWZhdWx0Py50b1N0cmluZygpLCByZXF1aXJlZDogcGFyYW1ldGVyRGF0YS5yZXF1aXJlZCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0Lm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTdW1tYXJ5KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24uc2V0TGFiZWwoJ1N1Ym1pdCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmVlZHNDaGVjayA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5wdXRMYXlvdXQgPSBuZXcgT08udWkuRmllbGRMYXlvdXQoaW5wdXQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogbmV3IE9PLnVpLkh0bWxTbmlwcGV0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgJHtwYXJhbWV0ZXJOYW1lfSR7IXBhcmFtZXRlckRhdGEubGFiZWwgfHwgcGFyYW1ldGVyTmFtZS50b0xvd2VyQ2FzZSgpID09PSBwYXJhbWV0ZXJEYXRhLmxhYmVsPy50b0xvd2VyQ2FzZSgpID8gJycgOiBgICgke3BhcmFtZXRlckRhdGEubGFiZWx9KWB9JHtwYXJhbWV0ZXJEYXRhLmRlc2NyaXB0aW9uID8gYCAoJHtwYXJhbWV0ZXJEYXRhLmRlc2NyaXB0aW9ufSlgIDogJyd9ICh0eXBlOiAke3BhcmFtZXRlckRhdGEudHlwZX0pICR7cGFyYW1ldGVyRGF0YS5zdWdnZXN0ZWQgPyAnIChzdWdnZXN0ZWQpJyA6ICcnfSR7cGFyYW1ldGVyRGF0YS5leGFtcGxlID8gYCAoZXhhbXBsZTogXCIke3BhcmFtZXRlckRhdGEuZXhhbXBsZX1cIilgIDogJyd9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduOiAnaW5saW5lJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlscy5hcHBlbmQoaW5wdXRMYXlvdXQuJGVsZW1lbnRbMF0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50RGF0YS5wYXJhbWV0ZXJzLnB1c2goeyBuYW1lOiBwYXJhbWV0ZXJOYW1lLCBhbGlhc2VzOiBwYXJhbWV0ZXJEYXRhLmFsaWFzZXMsIGVkaXRvcjogaW5wdXQgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvci5hcHBlbmQoZGV0YWlscyk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZUVkaXRvcnNJbmZvLnB1c2goZWxlbWVudERhdGEpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IG5vVGVtcGxhdGVzTWVzc2FnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgICAgIG5vVGVtcGxhdGVzTWVzc2FnZS5pZCA9ICdyZWRpcmVjdC1oZWxwZXItbm8tdGVtcGxhdGVzLW1lc3NhZ2UnO1xuICAgICAgICAgICAgICAgIG5vVGVtcGxhdGVzTWVzc2FnZS50ZXh0Q29udGVudCA9ICdObyB0ZW1wbGF0ZXMgd2l0aCBwYXJhbWV0ZXJzIHRvIGRpc3BsYXkhJztcbiAgICAgICAgICAgICAgICBub1RlbXBsYXRlc01lc3NhZ2Uuc3R5bGUuZGlzcGxheSA9IHRoaXMuZXhpc3RzID8gJ25vbmUnIDogJ2Jsb2NrJztcblxuICAgICAgICAgICAgICAgIHRoaXMudGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yLmFwcGVuZChub1RlbXBsYXRlc01lc3NhZ2UpO1xuXG4gICAgICAgICAgICAgICAgLyogREVGQVVMVFNPUlQgaW5wdXQgKi9cbiAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRTb3J0SW5wdXQgPSBuZXcgT08udWkuVGV4dElucHV0V2lkZ2V0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0U29ydElucHV0Lm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kZWZhdWx0U29ydElucHV0LmdldFZhbHVlKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA+IDApIHRoaXMuZGVmYXVsdFNvcnRJbnB1dC5zZXRWYWx1ZSh2YWx1ZS5yZXBsYWNlQWxsKCdfJywgJyAnKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTdW1tYXJ5KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldExhYmVsKCdTdWJtaXQnKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZWVkc0NoZWNrID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNvcnRTdWdnZXN0QnV0dG9uID0gbmV3IE9PLnVpLkJ1dHRvbldpZGdldCh7IGljb246ICdyb2JvdCcsIGxhYmVsOiAnU3VnZ2VzdCcsIGRpc2FibGVkOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNvcnRTdWdnZXN0QnV0dG9uLm9uKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5hbWUgPSB0aGlzLnBhZ2VUaXRsZVBhcnNlZC5nZXRNYWluVGV4dCgpLnJlcGxhY2UoLyBcXCguKlxcKSQvLCAnJyk7IC8vIFJlbW92ZSBkaXNhbWJpZ3VhdGlvblxuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpLmluY2x1ZGVzKCdSIGZyb20gcGVyc29uJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhhbmRsaW5nIGlzIG1vZGlmaWVkIGZyb20gZXZhZDM3J3MgXCJSYXRlclwiXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbmFtZS5pbmNsdWRlcygnICcpKSByZXR1cm47XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBnZW5lcmF0aW9uYWxTdWZmaXggPSAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgvICg/OltKU11yLj98W0lWWF0rKSQvLnRlc3QobmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uYWxTdWZmaXggPSBuYW1lLnNsaWNlKG5hbWUubGFzdEluZGV4T2YoJyAnKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUuc2xpY2UoMCwgbmFtZS5sYXN0SW5kZXhPZignICcpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW5hbWUuaW5jbHVkZXMoJyAnKSkgcmV0dXJuIG5hbWUgKyBnZW5lcmF0aW9uYWxTdWZmaXg7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhc3ROYW1lID0gbmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zbGljZShuYW1lLmxhc3RJbmRleE9mKCcgJykgKyAxKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8sJC8sICcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9PJy8sICdPJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvdGhlck5hbWVzID0gbmFtZS5zbGljZSgwLCBuYW1lLmxhc3RJbmRleE9mKCcgJykpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRTb3J0SW5wdXQuc2V0VmFsdWUobGFzdE5hbWUgKyAnLCAnICsgb3RoZXJOYW1lcyArIGdlbmVyYXRpb25hbFN1ZmZpeCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV3TmFtZSA9IG5hbWUucmVwbGFjZUFsbCgnTXIuJywgJ01pc3RlcicpLnJlcGxhY2VBbGwoJyYnLCAnQW5kJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbGVhZGluZ0FydGljbGUgb2YgWydBbicsICdBJywgJ1RoZSddKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdOYW1lLnN0YXJ0c1dpdGgobGVhZGluZ0FydGljbGUgKyAnICcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld05hbWUgPSBuZXdOYW1lLnNsaWNlKGxlYWRpbmdBcnRpY2xlLmxlbmd0aCArIDEpICsgJywgJyArIGxlYWRpbmdBcnRpY2xlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdOYW1lID09PSBuYW1lKSBtdy5ub3RpZnkoXCJyZWRpcmVjdC1oZWxwZXIgd2Fzbid0IGFibGUgdG8gZGV0ZXJtaW5lIGEgc29ydCBrZXkgZGlmZmVyZW50IGZyb20gdGhlIGN1cnJlbnQgcGFnZSB0aXRsZSFcIiwgeyB0eXBlOiAnd2FybicgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHRoaXMuZGVmYXVsdFNvcnRJbnB1dC5zZXRWYWx1ZShuZXdOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0U29ydElucHV0TGF5b3V0ID0gbmV3IE9PLnVpLkFjdGlvbkZpZWxkTGF5b3V0KHRoaXMuZGVmYXVsdFNvcnRJbnB1dCwgdGhpcy5kZWZhdWx0U29ydFN1Z2dlc3RCdXR0b24sIHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IG5ldyBPTy51aS5IdG1sU25pcHBldChgRGVmYXVsdCBzb3J0IGtleSAoREVGQVVMVFNPUlQpIChzZWUgPGEgaHJlZj1cIiR7bXcudXRpbC5nZXRVcmwoJ1dpa2lwZWRpYTpDYXRlZ29yaXphdGlvbiNTb3J0IGtleXMnKX1cIiB0YXJnZXQ9XCJfYmxhbmtcIj5ndWlkZWxpbmU8L2E+KTpgKSxcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NlczogWydyZWRpcmVjdC1pbnB1dC1sYXlvdXQnXSxcbiAgICAgICAgICAgICAgICAgICAgYWxpZ246ICd0b3AnLFxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgLyogQ2F0ZWdvcmllcyBzZWxlY3Rpb24gKi9cbiAgICAgICAgICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0SW5wdXQgPSBuZXcgQ2F0ZWdvcnlJbnB1dFdpZGdldCh7IHBsYWNlaG9sZGVyOiAnQWRkIGNhdGVnb3JpZXMgaGVyZScgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jYXRlZ29yeVNlbGVjdElucHV0Lm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IHRoaXMuY2F0ZWdvcnlTZWxlY3RJbnB1dC5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UobmV3IFJlZ0V4cChgXihodHRwcz86KT8vezJ9PyR7bXcuY29uZmlnLmdldCgnd2dTZXJ2ZXInKS5yZXBsYWNlKC9eXFwvezJ9LywgJycpfS93aWtpL2ApLCAnJyk7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvXkNhdGVnb3J5Oi8sICcnKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID4gMCkgdGhpcy5jYXRlZ29yeVNlbGVjdElucHV0LnNldFZhbHVlKHZhbHVlWzBdLnRvVXBwZXJDYXNlKCkgKyB2YWx1ZS5zbGljZSgxKS5yZXBsYWNlQWxsKCdfJywgJyAnKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jYXRlZ29yeVNlbGVjdElucHV0Lm9uKCdzaG93aW5nLXZhbHVlcycsIChwYWdlczogeyBkYXRhOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfVtdKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcGFnZSBvZiBwYWdlcykgdGhpcy5jYXRlZ29yeVNlbGVjdC5hZGRBbGxvd2VkVmFsdWUocGFnZS5kYXRhKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0ID0gbmV3IE9PLnVpLlRhZ011bHRpc2VsZWN0V2lkZ2V0KHsgYWxsb3dSZW9yZGVyaW5nOiBmYWxzZSwgaW5wdXRQb3NpdGlvbjogJ291dGxpbmUnLCBpbnB1dFdpZGdldDogdGhpcy5jYXRlZ29yeVNlbGVjdElucHV0IH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3Qub24oJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc29ydGVkVGFncyA9ICh0aGlzLmNhdGVnb3J5U2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10pLnNvcnQoKGEsIGIpID0+IGEudG9Mb3dlckNhc2UoKS5sb2NhbGVDb21wYXJlKGIudG9Mb3dlckNhc2UoKSkpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICgodGhpcy5jYXRlZ29yeVNlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdKS5qb2luKCc7JykgIT09IHNvcnRlZFRhZ3Muam9pbignOycpKSB0aGlzLmNhdGVnb3J5U2VsZWN0LnNldFZhbHVlKHNvcnRlZFRhZ3MpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU3VtbWFyeSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5zZXRMYWJlbCgnU3VibWl0Jyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmVlZHNDaGVjayA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0TGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KHRoaXMuY2F0ZWdvcnlTZWxlY3QsIHsgbGFiZWw6ICdDYXRlZ29yaWVzOicsIGNsYXNzZXM6IFsncmVkaXJlY3QtaW5wdXQtbGF5b3V0J10sIGFsaWduOiAndG9wJyB9KTtcblxuICAgICAgICAgICAgICAgIC8qIFN1bW1hcnkgaW5wdXQgKi9cbiAgICAgICAgICAgICAgICB0aGlzLnN1bW1hcnlJbnB1dCA9IG5ldyBPTy51aS5Db21ib0JveElucHV0V2lkZ2V0KHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgeyBkYXRhOiAnUmVzb2x2ZSBkb3VibGUgcmVkaXJlY3QnIH0sIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICB7IGRhdGE6ICdSZXNvbHZlIHNlbGYgcmVkaXJlY3QnIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7IGRhdGE6ICdSZW1vdmUgaW5jb3JyZWN0IHJjYXRzJyB9LFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5zdW1tYXJ5SW5wdXRMYXlvdXQgPSBuZXcgT08udWkuRmllbGRMYXlvdXQodGhpcy5zdW1tYXJ5SW5wdXQsIHsgaWQ6ICdyZWRpcmVjdC1oZWxwZXItc3VtbWFyeS1sYXlvdXQnLCBsYWJlbDogJ1N1bW1hcnk6JywgY2xhc3NlczogWydyZWRpcmVjdC1pbnB1dC1sYXlvdXQnXSwgYWxpZ246ICd0b3AnIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIExvYWRzIHRoZSBlbGVtZW50cyBpbiB0aGUgc3VibWl0IGJ1dHRvbiByb3cuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHByaXZhdGUgYXN5bmMgbG9hZFN1Ym1pdEVsZW1lbnRzKCkge1xuICAgICAgICAgICAgICAgIC8qIFNldHVwIHN1Ym1pdCBidXR0b24gKi9cbiAgICAgICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbiA9IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoeyBsYWJlbDogJ1N1Ym1pdCcsIGRpc2FibGVkOiB0cnVlLCBmbGFnczogWydwcm9ncmVzc2l2ZSddIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLm9uKCdjbGljaycsICgpID0+IHRoaXMuaGFuZGxlU3VibWl0QnV0dG9uQ2xpY2soKSk7XG5cbiAgICAgICAgICAgICAgICAvKiBTZXR1cCBzaG93IGNoYW5nZXMgYnV0dG9uICovXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZXhpc3RzKSB0aGlzLnBhZ2VDb250ZW50ID0gYXdhaXQgdGhpcy5nZXRQYWdlQ29udGVudCh0aGlzLnBhZ2VUaXRsZSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCB3aW5kb3dNYW5hZ2VyID0gbmV3IE9PLnVpLldpbmRvd01hbmFnZXIoKTtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZCh3aW5kb3dNYW5hZ2VyLiRlbGVtZW50WzBdKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHNob3dDaGFuZ2VzRGlhbG9nID0gbmV3IFNob3dDaGFuZ2VzRGlhbG9nKHsgc2l6ZTogJ2xhcmdlJyB9KTtcbiAgICAgICAgICAgICAgICB3aW5kb3dNYW5hZ2VyLmFkZFdpbmRvd3MoW3Nob3dDaGFuZ2VzRGlhbG9nXSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnNob3dDaGFuZ2VzQnV0dG9uID0gbmV3IE9PLnVpLkJ1dHRvbldpZGdldCh7IGxhYmVsOiAnU2hvdyBjaGFuZ2VzJywgZGlzYWJsZWQ6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93Q2hhbmdlc0J1dHRvbi5vbignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHNob3dDaGFuZ2VzRGlhbG9nLnNldERhdGEoW1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYWdlQ29udGVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlT3V0cHV0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVkaXJlY3RJbnB1dC5nZXRWYWx1ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbGRTdHJheVRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0U29ydElucHV0LmdldFZhbHVlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXRlZ29yeVNlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdLFxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgICAgIHNob3dDaGFuZ2VzRGlhbG9nLm9wZW4oKTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIC8qIFNldHVwIHN5bmMgdGFsayBjaGVja2JveCAqL1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5wYWdlVGl0bGVQYXJzZWQuaXNUYWxrUGFnZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGFsa0RhdGEgPSAoYXdhaXQgdGhpcy5hcGkuZ2V0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3A6ICdpbmZvJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlczogdGhpcy5wYWdlVGl0bGVQYXJzZWQuZ2V0VGFsa1BhZ2UoKSEuZ2V0UHJlZml4ZWRUZXh0KCksXG4gICAgICAgICAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5SW5mb1BhcmFtcykpIGFzIFBhZ2VJbmZvUmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN5bmNUYWxrQ2hlY2tib3ggPSBuZXcgT08udWkuQ2hlY2tib3hJbnB1dFdpZGdldCh7IHNlbGVjdGVkOiAhIXRoaXMudGFsa0RhdGEucXVlcnkucGFnZXNbMF0ucmVkaXJlY3QgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zeW5jVGFsa0NoZWNrYm94TGF5b3V0ID0gbmV3IE9PLnVpLldpZGdldCh7IGNvbnRlbnQ6IFtuZXcgT08udWkuRmllbGRMYXlvdXQodGhpcy5zeW5jVGFsa0NoZWNrYm94LCB7IGxhYmVsOiAnU3luYyB0YWxrIHBhZ2UnLCBhbGlnbjogJ2lubGluZScgfSldIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8qIFNldHVwIHBhdHJvbCBjaGVja2JveCAqL1xuICAgICAgICAgICAgICAgIGlmIChhd2FpdCB0aGlzLmNoZWNrU2hvdWxkUHJvbXB0UGF0cm9sKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXRyb2xDaGVja2JveCA9IG5ldyBPTy51aS5DaGVja2JveElucHV0V2lkZ2V0KHsgc2VsZWN0ZWQ6IHRydWUgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXRyb2xDaGVja2JveExheW91dCA9IG5ldyBPTy51aS5XaWRnZXQoeyBjb250ZW50OiBbbmV3IE9PLnVpLkZpZWxkTGF5b3V0KHRoaXMucGF0cm9sQ2hlY2tib3gsIHsgbGFiZWw6ICdNYXJrIGFzIHBhdHJvbGxlZCcsIGFsaWduOiAnaW5saW5lJyB9KV0gfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLyogU2V0dXAgbGF5b3V0ICovXG4gICAgICAgICAgICAgICAgdGhpcy5zdWJtaXRMYXlvdXQgPSBuZXcgT08udWkuSG9yaXpvbnRhbExheW91dCh7XG4gICAgICAgICAgICAgICAgICAgIGlkOiAncmVkaXJlY3QtaGVscGVyLXN1Ym1pdC1sYXlvdXQnLFxuICAgICAgICAgICAgICAgICAgICBpdGVtczogW3RoaXMuc3VibWl0QnV0dG9uLCB0aGlzLnNob3dDaGFuZ2VzQnV0dG9uLCB0aGlzLnN5bmNUYWxrQ2hlY2tib3hMYXlvdXQsIHRoaXMucGF0cm9sQ2hlY2tib3hMYXlvdXRdLmZpbHRlcihCb29sZWFuKSBhcyBPTy51aS5XaWRnZXRbXSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSB1c2VyIHNob3VsZCBiZSBwcm9tcHRlZCB0byBwYXRyb2wgdGhlIHBhZ2UuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHByaXZhdGUgYXN5bmMgY2hlY2tTaG91bGRQcm9tcHRQYXRyb2woKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFnZVRyaWFnZU1hcmtCdXR0b24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbXdlLXB0LW1hcmsgLm13ZS1wdC10b29sLWljb24nKSBhcyBIVE1MSW1hZ2VFbGVtZW50IHwgbnVsbDtcbiAgICAgICAgICAgICAgICBwYWdlVHJpYWdlTWFya0J1dHRvbj8uY2xpY2soKTtcbiAgICAgICAgICAgICAgICBwYWdlVHJpYWdlTWFya0J1dHRvbj8uY2xpY2soKTtcblxuICAgICAgICAgICAgICAgIGlmIChtdy5jb25maWcuZ2V0KCd3Z05hbWVzcGFjZU51bWJlcicpICE9PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnBhdHJvbGxpbmsnKSkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI213ZS1wdC1tYXJrLWFzLXJldmlld2VkLWJ1dHRvbicpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbXdlLXB0LW1hcmstYXMtdW5yZXZpZXdlZC1idXR0b24nKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW13LmNvbmZpZy5nZXQoJ3dnQXJ0aWNsZUlkJykpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdXNlclBlcm1pc3Npb25zID0gKGF3YWl0IHRoaXMuYXBpLmdldCh7IGFjdGlvbjogJ3F1ZXJ5JywgbWV0YTogJ3VzZXJpbmZvJywgdWlwcm9wOiAncmlnaHRzJyB9IHNhdGlzZmllcyBBcGlRdWVyeVVzZXJJbmZvUGFyYW1zKSkgYXMgVXNlclBlcm1pc3Npb25zUmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdXNlclBlcm1pc3Npb25zLnF1ZXJ5LnVzZXJpbmZvLnJpZ2h0cy5pbmNsdWRlcygncGF0cm9sJykpIHJldHVybiBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXRyb2xSZXNwb25zZSA9IChhd2FpdCB0aGlzLmFwaS5nZXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAncGFnZXRyaWFnZWxpc3QnLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZV9pZDogbXcuY29uZmlnLmdldCgnd2dBcnRpY2xlSWQnKSwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbiAgICAgICAgICAgICAgICAgICAgfSBzYXRpc2ZpZXMgUGFnZVRyaWFnZUFwaVBhZ2VUcmlhZ2VMaXN0UGFyYW1zKSkgYXMgUGFnZVRyaWFnZUxpc3RSZXNwb25zZTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocGF0cm9sUmVzcG9uc2UucGFnZXRyaWFnZWxpc3QucGFnZXNbMF0/LnVzZXJfbmFtZSA9PT0gbXcuY29uZmlnLmdldCgnd2dVc2VyTmFtZScpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBhdHJvbFJlc3BvbnNlLnBhZ2V0cmlhZ2VsaXN0LnJlc3VsdCAhPT0gJ3N1Y2Nlc3MnIHx8IHBhdHJvbFJlc3BvbnNlLnBhZ2V0cmlhZ2VsaXN0LnBhZ2VzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIHJldHVybiAhTnVtYmVyLnBhcnNlSW50KHBhdHJvbFJlc3BvbnNlLnBhZ2V0cmlhZ2VsaXN0LnBhZ2VzWzBdPy5wYXRyb2xfc3RhdHVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogVXBkYXRlcyB0aGUgc3VtbWFyeSBpbnB1dCBwbGFjZWhvbGRlci5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgcHJpdmF0ZSB1cGRhdGVTdW1tYXJ5KCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlZGlyZWN0VmFsdWUgPSB0aGlzLnJlZGlyZWN0SW5wdXQuZ2V0VmFsdWUoKS50cmltKCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIXJlZGlyZWN0VmFsdWUpICh0aGlzLnN1bW1hcnlJbnB1dC4kdGFiSW5kZXhlZFswXSBhcyBIVE1MSW5wdXRFbGVtZW50KS5wbGFjZWhvbGRlciA9ICcnO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuZXhpc3RzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldENoYW5nZWQgPSByZWRpcmVjdFZhbHVlICE9PSB0aGlzLm9sZFJlZGlyZWN0VGFyZ2V0Py5yZXBsYWNlQWxsKCdfJywgJyAnKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFnc0NoYW5nZWQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50YWdTZWxlY3QuZ2V0VmFsdWUoKS5zb21lKCh0YWcpID0+ICF0aGlzLm9sZFJlZGlyZWN0VGFncyEuaW5jbHVkZXModGFnIGFzIHN0cmluZykpIHx8IHRoaXMub2xkUmVkaXJlY3RUYWdzIS5zb21lKCh0YWcpID0+ICF0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpLmluY2x1ZGVzKHRhZykpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YWdBcmd1bWVudHNDaGFuZ2VkID0gdGhpcy5vbGRSZWRpcmVjdFRhZ0RhdGFcbiAgICAgICAgICAgICAgICAgICAgICAgID8gdGhpcy50YWdTZWxlY3QuZ2V0VmFsdWUoKS5zb21lKCh0YWcpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRlbXBsYXRlRWRpdG9yc0luZm9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmluZCgodGVtcGxhdGUpID0+IHRlbXBsYXRlLm5hbWUgPT09IHRhZylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/LnBhcmFtZXRlcnMuc29tZSgocGFyYW1ldGVyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvdW5kT2xkQXJndW1lbnQgPSB0aGlzLm9sZFJlZGlyZWN0VGFnRGF0YSFbdGFnIGFzIHN0cmluZ10/LmZpbmQoKGFyZ3VtZW50KSA9PiBhcmd1bWVudFswXSA9PT0gcGFyYW1ldGVyLm5hbWUpPy5bMV07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kT2xkQXJndW1lbnQgPyBmb3VuZE9sZEFyZ3VtZW50ICE9PSBwYXJhbWV0ZXIuZWRpdG9yLmdldFZhbHVlKCkudHJpbSgpIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRTb3J0Q2hhbmdlZCA9IHRoaXMuZGVmYXVsdFNvcnRJbnB1dC5nZXRWYWx1ZSgpLnRyaW0oKSAhPT0gdGhpcy5vbGREZWZhdWx0U29ydCEucmVwbGFjZUFsbCgnXycsICcgJyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhdGVnb3JpZXNDaGFuZ2VkID1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3QuZ2V0VmFsdWUoKS5zb21lKChjYXRlZ29yeSkgPT4gIXRoaXMub2xkQ2F0ZWdvcmllcyEuaW5jbHVkZXMoY2F0ZWdvcnkgYXMgc3RyaW5nKSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub2xkQ2F0ZWdvcmllcyEuc29tZSgoY2F0ZWdvcnkpID0+ICF0aGlzLmNhdGVnb3J5U2VsZWN0LmdldFZhbHVlKCkuaW5jbHVkZXMoY2F0ZWdvcnkpKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFuZ2VzID0gW107XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldENoYW5nZWQpIGNoYW5nZXMucHVzaChgcmV0YXJnZXQgdG8gW1ske3JlZGlyZWN0VmFsdWV9XV1gKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZ3NDaGFuZ2VkKSBjaGFuZ2VzLnB1c2goJ2NoYW5nZSBjYXRlZ29yaXphdGlvbiB0ZW1wbGF0ZXMnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZ0FyZ3VtZW50c0NoYW5nZWQpIGNoYW5nZXMucHVzaCgnY2hhbmdlIGNhdGVnb3JpemF0aW9uIHRlbXBsYXRlIGFyZ3VtZW50cycpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGVmYXVsdFNvcnRDaGFuZ2VkKSBjaGFuZ2VzLnB1c2goJ2NoYW5nZSBkZWZhdWx0IHNvcnQga2V5Jyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjYXRlZ29yaWVzQ2hhbmdlZCkgY2hhbmdlcy5wdXNoKCdjaGFuZ2UgY2F0ZWdvcmllcycpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGFuZ2VzLmxlbmd0aCA9PT0gMCkgY2hhbmdlcy5wdXNoKCdwZXJmb3JtIHJlZGlyZWN0IGNsZWFudXAnKTtcblxuICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzWzBdID0gY2hhbmdlc1swXVswXS50b1VwcGVyQ2FzZSgpICsgY2hhbmdlc1swXS5zbGljZSgxKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5nZXMubGVuZ3RoID4gMSkgY2hhbmdlc1tjaGFuZ2VzLmxlbmd0aCAtIDFdID0gYGFuZCAke2NoYW5nZXMuYXQoLTEpfWA7XG5cbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuc3VtbWFyeUlucHV0LiR0YWJJbmRleGVkWzBdIGFzIEhUTUxJbnB1dEVsZW1lbnQpLnBsYWNlaG9sZGVyID0gY2hhbmdlcy5qb2luKGNoYW5nZXMubGVuZ3RoID4gMiA/ICcsICcgOiAnICcpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSAodGhpcy5zdW1tYXJ5SW5wdXQuJHRhYkluZGV4ZWRbMF0gYXMgSFRNTElucHV0RWxlbWVudCkucGxhY2Vob2xkZXIgPSBgQ3JlYXRlIHJlZGlyZWN0IHRvIFtbJHtyZWRpcmVjdFZhbHVlfV1dYDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBMb2FkcyBleGlzdGluZyBwYWdlIGRhdGEuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHByaXZhdGUgbG9hZEV4aXN0aW5nRGF0YSgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9sZFJlZGlyZWN0VGFyZ2V0ID0gdGhpcy5yZWRpcmVjdFJlZ2V4LmV4ZWModGhpcy5wYWdlQ29udGVudCk/LlsxXTtcbiAgICAgICAgICAgICAgICB0aGlzLm9sZFJlZGlyZWN0VGFncyA9IChcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5yZWRpcmVjdFRlbXBsYXRlcylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKFt0YWcsIHRhZ0RhdGFdKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0YWcsIC4uLnRhZ0RhdGEuYWxpYXNlc10uc29tZSgodGFnT3JSZWRpcmVjdCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJlZ0V4cChge3tcXFxccypbJHt0YWdPclJlZGlyZWN0WzBdLnRvTG93ZXJDYXNlKCl9JHt0YWdPclJlZGlyZWN0WzBdfV0ke3RhZ09yUmVkaXJlY3Quc2xpY2UoMSl9XFxcXHMqKFxcXFx8fH19KWApLnRlc3QodGhpcy5wYWdlQ29udGVudCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHRhZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pIGFzIHN0cmluZ1tdXG4gICAgICAgICAgICAgICAgKS5zb3J0KChhLCBiKSA9PiBhLnRvTG93ZXJDYXNlKCkubG9jYWxlQ29tcGFyZShiLnRvTG93ZXJDYXNlKCkpKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsUmVkaXJlY3RUYWdzID0gT2JqZWN0LmVudHJpZXModGhpcy5yZWRpcmVjdFRlbXBsYXRlcylcbiAgICAgICAgICAgICAgICAgICAgLmZsYXRNYXAoKFt0YWcsIHRhZ0RhdGFdKSA9PiBbdGFnLCAuLi50YWdEYXRhLmFsaWFzZXNdKVxuICAgICAgICAgICAgICAgICAgICAubWFwKCh0YWdPclJlZGlyZWN0KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJlZ0V4cChge3tcXFxccypbJHt0YWdPclJlZGlyZWN0WzBdLnRvTG93ZXJDYXNlKCl9JHt0YWdPclJlZGlyZWN0WzBdfV0ke3RhZ09yUmVkaXJlY3Quc2xpY2UoMSl9XFxcXHMqKFxcXFx8fH19KWApLnRlc3QodGhpcy5wYWdlQ29udGVudCkgPyB0YWdPclJlZGlyZWN0IDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pIGFzIHN0cmluZ1tdO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5vbGRSZWRpcmVjdFRhZ0RhdGEgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsUmVkaXJlY3RUYWdzXG4gICAgICAgICAgICAgICAgICAgICAgICAubWFwKCh0YWcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXRjaCA9IG5ldyBSZWdFeHAoYHt7XFxcXHMqWyR7dGFnWzBdLnRvTG93ZXJDYXNlKCl9JHt0YWdbMF19XSR7dGFnLnNsaWNlKDEpfVxcXFx8PyguKj8pXFxcXHMqfX1gKS5leGVjKHRoaXMucGFnZUNvbnRlbnQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3VGFnID0gT2JqZWN0LmVudHJpZXModGhpcy5yZWRpcmVjdFRlbXBsYXRlcykuZmluZCgoW3RlbXBsYXRlLCB0YWdEYXRhXSkgPT4gW3RlbXBsYXRlLCAuLi50YWdEYXRhLmFsaWFzZXNdLmluY2x1ZGVzKHRhZykpPy5bMF07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5hbEFyZ3VtZW50cyA9IG1hdGNoPy5bMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvcmlnaW5hbEFyZ3VtZW50cykgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3JtYXR0ZWRBcmd1bWVudHMgPSBtYXRjaFsxXS5zcGxpdCgnfCcpLm1hcCgoYXJndW1lbnQsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXJndW1lbnQuaW5jbHVkZXMoJz0nKSkgcmV0dXJuIFsoaW5kZXggKyAxKS50b1N0cmluZygpLCBhcmd1bWVudC50cmltKCldO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFtuYW1lLCB2YWx1ZV0gPSBhcmd1bWVudC5zcGxpdCgnPScpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbbmFtZS50cmltKCksIHZhbHVlLnRyaW0oKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW25ld1RhZywgZm9ybWF0dGVkQXJndW1lbnRzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pIGFzIFtzdHJpbmcsIHN0cmluZ1tdW11dW10sXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIHRoaXMub2xkRGVmYXVsdFNvcnQgPVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhZ2VDb250ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAubWF0Y2goL3t7REVGQVVMVFNPUlQ6Lio/fX0vZylcbiAgICAgICAgICAgICAgICAgICAgICAgID8uYXQoLTEpXG4gICAgICAgICAgICAgICAgICAgICAgICA/LnNsaWNlKDE0LCAtMilcbiAgICAgICAgICAgICAgICAgICAgICAgID8udHJpbSgpID8/ICcnO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5vbGRDYXRlZ29yaWVzID0gdGhpcy5wYWdlQ29udGVudC5tYXRjaCgvXFxbXFxbW0NjXWF0ZWdvcnk6Lis/XV0vZyk/Lm1hcCgoY2F0ZWdvcnkpID0+IGNhdGVnb3J5LnNsaWNlKDExLCAtMikpID8/IFtdO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5vbGRTdHJheVRleHQgPSBbXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFnZUNvbnRlbnQubWF0Y2goL3t7c2hvcnQgZGVzY3JpcHRpb25cXHwuKj99fS9pKT8uWzBdLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhZ2VDb250ZW50Lm1hdGNoKC97e0RJU1BMQVlUSVRMRTouKj99fS8pPy5bMF0sXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFnZUNvbnRlbnQubWF0Y2goL3t7aXRhbGljIHRpdGxlXFx8Py4qP319L2kpPy5bMF0sXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFnZUNvbnRlbnQubWF0Y2goL3t7dGl0bGUgbGFuZ3VhZ2VcXHwuKj99fS8pPy5bMF0sXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgICAgICAgICAgICAgIC5qb2luKCdcXG4nKTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9sZFJlZGlyZWN0VGFyZ2V0KSB0aGlzLnJlZGlyZWN0SW5wdXQuc2V0VmFsdWUodGhpcy5vbGRSZWRpcmVjdFRhcmdldC5yZXBsYWNlQWxsKCdfJywgJyAnKSk7XG4gICAgICAgICAgICAgICAgZWxzZSBtdy5ub3RpZnkoJ0NvdWxkIG5vdCBmaW5kIHJlZGlyZWN0IHRhcmdldCEnLCB7IHR5cGU6ICdlcnJvcicgfSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnRhZ1NlbGVjdC5zZXRWYWx1ZSh0aGlzLm9sZFJlZGlyZWN0VGFncyk7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFt0ZW1wbGF0ZU5hbWUsIGRhdGFdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMub2xkUmVkaXJlY3RUYWdEYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3VuZFRlbXBsYXRlRWRpdG9yID0gdGhpcy50ZW1wbGF0ZUVkaXRvcnNJbmZvLmZpbmQoKGVkaXRvckluZm8pID0+IGVkaXRvckluZm8ubmFtZSA9PT0gdGVtcGxhdGVOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZFRlbXBsYXRlRWRpdG9yKSBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtwYXJhbWV0ZXJOYW1lLCBhcmd1bWVudF0gb2YgZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm91bmRQYXJhbWV0ZXJFZGl0b3IgPSBmb3VuZFRlbXBsYXRlRWRpdG9yLnBhcmFtZXRlcnMuZmluZCgocGFyYW1ldGVyKSA9PiBbcGFyYW1ldGVyLm5hbWUsIC4uLnBhcmFtZXRlci5hbGlhc2VzXS5pbmNsdWRlcyhwYXJhbWV0ZXJOYW1lKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZFBhcmFtZXRlckVkaXRvcikgZm91bmRQYXJhbWV0ZXJFZGl0b3IuZWRpdG9yLnNldFZhbHVlKGFyZ3VtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9sZERlZmF1bHRTb3J0KSB0aGlzLmRlZmF1bHRTb3J0SW5wdXQuc2V0VmFsdWUodGhpcy5vbGREZWZhdWx0U29ydCk7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNhdGVnb3J5IG9mIHRoaXMub2xkQ2F0ZWdvcmllcykgdGhpcy5jYXRlZ29yeVNlbGVjdC5hZGRBbGxvd2VkVmFsdWUoY2F0ZWdvcnkpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3Quc2V0VmFsdWUodGhpcy5vbGRDYXRlZ29yaWVzLm1hcCgoY2F0ZWdvcnkpID0+ICh7IGRhdGE6IGNhdGVnb3J5LCBsYWJlbDogY2F0ZWdvcnkgfSkpKTtcblxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU3VtbWFyeSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFJ1bnMgY2hlY2tzIG9uIHRoZSBwcm92aWRlZCBkYXRhIGFuZCByZXR1cm5zIHRoZSBlcnJvcnMgKGlmIGFueSkuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHByaXZhdGUgYXN5bmMgdmFsaWRhdGVTdWJtaXNzaW9uKCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9ycyA9IFtdO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZGVzdGluYXRpb24gPSB0aGlzLnJlZGlyZWN0SW5wdXQuZ2V0VmFsdWUoKS50cmltKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdGFncyA9IHRoaXMudGFnU2VsZWN0LmdldFZhbHVlKCk7XG5cbiAgICAgICAgICAgICAgICAvKiBJbnZhbGlkIGNoYXJhY3RlcnMgKi9cbiAgICAgICAgICAgICAgICBpZiAoIS9eXFxzKlteW1xcXXt8fV0rXFxzKiQvLnRlc3QoZGVzdGluYXRpb24pKSBlcnJvcnMucHVzaCh7IHRpdGxlOiBkZXN0aW5hdGlvbiwgbWVzc2FnZTogJ2lzIG5vdCBhIHZhbGlkIHBhZ2UgdGl0bGUhJyB9KTtcblxuICAgICAgICAgICAgICAgIC8qIEZhaWxlZCBkdXJpbmcgdGl0bGUgcGFyc2luZyAqL1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFyc2VkRGVzdGluYXRpb24gPSBtdy5UaXRsZS5uZXdGcm9tVGV4dChkZXN0aW5hdGlvbik7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvcnMubGVuZ3RoID09PSAwKSBlcnJvcnMucHVzaCh7IHRpdGxlOiBkZXN0aW5hdGlvbiwgbWVzc2FnZTogJ2lzIG5vdCBhIHZhbGlkIHBhZ2UgdGl0bGUhJyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnBhcnNlZERlc3RpbmF0aW9uICYmIGVycm9ycy5sZW5ndGggPT09IDApIGVycm9ycy5wdXNoKHsgdGl0bGU6IGRlc3RpbmF0aW9uLCBtZXNzYWdlOiAnaXMgbm90IGEgdmFsaWQgcGFnZSB0aXRsZSEnIH0pO1xuXG4gICAgICAgICAgICAgICAgLyogU2VsZiByZWRpcmVjdHMgKi9cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wYXJzZWREZXN0aW5hdGlvbj8udG9TdHJpbmcoKSA9PT0gdGhpcy5wYWdlVGl0bGVQYXJzZWQudG9TdHJpbmcoKSkgZXJyb3JzLnB1c2goeyBtZXNzYWdlOiAnY2Fubm90IHJlZGlyZWN0IHRvIGl0c2VsZiEnIH0pO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZGVzdGluYXRpb25EYXRhID0gKGF3YWl0IHRoaXMuYXBpXG4gICAgICAgICAgICAgICAgICAgIC5nZXQoeyBhY3Rpb246ICdxdWVyeScsIGZvcm1hdHZlcnNpb246ICcyJywgcHJvcDogWydwYWdlcHJvcHMnLCAnY2F0ZWdvcmllcyddLCB0aXRsZXM6IGRlc3RpbmF0aW9uIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5UGFnZVByb3BzUGFyYW1zKVxuICAgICAgICAgICAgICAgICAgICAuY2F0Y2goKGVycm9yQ29kZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvKiBOb25leGlzdGVudCBkZXN0aW5hdGlvbiAqLyBpZiAoZXJyb3JDb2RlID09PSAnbWlzc2luZ3RpdGxlJykgZXJyb3JzLnB1c2goeyB0aXRsZTogZGVzdGluYXRpb24sIG1lc3NhZ2U6ICdkb2VzIG5vdCBleGlzdCEnIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgLyogT3RoZXIgQVBJIGVycm9yICovIGVsc2UgZXJyb3JzLnB1c2goeyB0aXRsZTogZGVzdGluYXRpb24sIG1lc3NhZ2U6IGB3YXMgbm90IGFibGUgdG8gYmUgZmV0Y2hlZCBmcm9tIHRoZSBBUEkgKCR7ZXJyb3JDb2RlfSkhYCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9KSkgYXMgKFBhZ2Vwcm9wc1Jlc3VsdCAmIENhdGVnb3JpZXNSZXN1bHQpIHwgbnVsbDtcbiAgICAgICAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvblBhcnNlUmVzdWx0ID0gKGF3YWl0IHRoaXMuYXBpLmdldCh7IGFjdGlvbjogJ3BhcnNlJywgcGFnZTogZGVzdGluYXRpb24sIHByb3A6ICdzZWN0aW9ucycsIHJlZGlyZWN0czogdHJ1ZSB9IHNhdGlzZmllcyBBcGlQYXJzZVBhcmFtcykpIGFzIFBhZ2VQYXJzZVJlc3VsdDtcblxuICAgICAgICAgICAgICAgIC8qIERvdWJsZSByZWRpcmVjdHMgKi9cbiAgICAgICAgICAgICAgICBpZiAoZGVzdGluYXRpb25QYXJzZVJlc3VsdC5wYXJzZS5yZWRpcmVjdHM/LlswXSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvblJlZGlyZWN0ID1cbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uUGFyc2VSZXN1bHQucGFyc2UucmVkaXJlY3RzWzBdLnRvICsgKGRlc3RpbmF0aW9uUGFyc2VSZXN1bHQucGFyc2UucmVkaXJlY3RzWzBdLnRvZnJhZ21lbnQgPyBgIyR7ZGVzdGluYXRpb25QYXJzZVJlc3VsdC5wYXJzZS5yZWRpcmVjdHNbMF0udG9mcmFnbWVudH1gIDogJycpO1xuICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogZGVzdGluYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgaXMgYSByZWRpcmVjdCB0byA8YSBocmVmPVwiJHttdy51dGlsLmdldFVybChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvblJlZGlyZWN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgKX1cIiB0YXJnZXQ9XCJfYmxhbmtcIj4ke2Rlc3RpbmF0aW9uUmVkaXJlY3R9PC9hPi4gUmV0YXJnZXQgdG8gdGhhdCBwYWdlIGluc3RlYWQsIGFzIGRvdWJsZSByZWRpcmVjdHMgYXJlbid0IGFsbG93ZWQuYCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLyogTm9uZXhpc3RlbnQgc2VjdGlvbiAqL1xuICAgICAgICAgICAgICAgIGlmIChkZXN0aW5hdGlvbi5zcGxpdCgnIycpLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsaWRTZWN0aW9uID0gZGVzdGluYXRpb25QYXJzZVJlc3VsdC5wYXJzZS5zZWN0aW9ucy5maW5kKChzZWN0aW9uKSA9PiBzZWN0aW9uLmxpbmUucmVwbGFjZUFsbCgvPFxcLz9pPi9nLCAnJykgPT09IGRlc3RpbmF0aW9uLnNwbGl0KCcjJylbMV0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWRTZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFncy5pbmNsdWRlcygnUiB0byBhbmNob3InKSkgZXJyb3JzLnB1c2goeyBtZXNzYWdlOiAnaXMgdGFnZ2VkIGFzIGEgcmVkaXJlY3QgdG8gYW4gYW5jaG9yLCBidXQgaXQgaXMgYWN0dWFsbHkgYSByZWRpcmVjdCB0byBhIHNlY3Rpb24hJyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGFncy5pbmNsdWRlcygnUiB0byBzZWN0aW9uJykpIGVycm9ycy5wdXNoKHsgbWVzc2FnZTogJ2lzIGEgcmVkaXJlY3QgdG8gYSBzZWN0aW9uLCBidXQgaXQgaXMgbm90IHRhZ2dlZCB3aXRoIDxjb2RlPnt7UiB0byBzZWN0aW9ufX08L2NvZGU+IScgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvbkNvbnRlbnQgPSAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF3YWl0IHRoaXMuYXBpLmdldCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wOiAncmV2aXNpb25zJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnZwcm9wOiAnY29udGVudCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ2c2xvdHM6ICdtYWluJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGVzOiB0aGlzLnBhcnNlZERlc3RpbmF0aW9uIS50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5UmV2aXNpb25zUGFyYW1zKSkgYXMgUGFnZVJldmlzaW9uc1Jlc3VsdFxuICAgICAgICAgICAgICAgICAgICAgICAgKS5xdWVyeS5wYWdlc1swXS5yZXZpc2lvbnNbMF0uc2xvdHMubWFpbi5jb250ZW50O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbmNob3JzID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLihkZXN0aW5hdGlvbkNvbnRlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hdGNoKC8oPzw9e3tcXHMqP1tBYV0oPzpuY2hvcnM/fG5jaG9yIGZvciByZWRpcmVjdHxua2VyfE5DSE9SfG5jKVxccyo/XFx8KS4rPyg/PX19KS9nKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/Lm1hcCgoYW5jaG9yOiBzdHJpbmcpID0+IGFuY2hvci5zcGxpdCgnfCcpLm1hcCgocGFydCkgPT4gcGFydC50cmltKCkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/LmZsYXQoKSA/PyBbXSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKGRlc3RpbmF0aW9uQ29udGVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWF0Y2goLyg/PD17e1xccyo/KD86W1Z2XSg/OmlzaWJsZSBhbmNob3JzP3xpc2FuY3xBbmNofGFuY2hvcnxpc2libGVhbmNob3J8YSl8W0FhXSg/Om5jaG9yZHxjaG9yZWR8bmNob3JcXCspfFtUdF1leHQgYW5jaG9yKVxccyo/XFx8KS4rPyg/PSg/PCEhfD0pfX0pL2cpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8ubWFwKChhbmNob3I6IHN0cmluZykgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zcGxpdCgnfCcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgocGFydCkgPT4gcGFydC50cmltKCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigocGFydCkgPT4gIS9edGV4dFxccyo/PS8udGVzdChwYXJ0KSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPy5mbGF0KCkgPz8gW10pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLihkZXN0aW5hdGlvbkNvbnRlbnQubWF0Y2goLyg/PD1pZD0pXCI/Lis/KD89XCJ8PnxcXHwpL2cpPy5tYXAoKGFuY2hvcjogc3RyaW5nKSA9PiBhbmNob3IudHJpbSgpKSA/PyBbXSksXG4gICAgICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFuY2hvcnMuaW5jbHVkZXMoZGVzdGluYXRpb24uc3BsaXQoJyMnKVsxXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFncy5pbmNsdWRlcygnUiB0byBzZWN0aW9uJykpIGVycm9ycy5wdXNoKHsgbWVzc2FnZTogJ2lzIHRhZ2dlZCBhcyBhIHJlZGlyZWN0IHRvIGEgc2VjdGlvbiwgYnV0IGl0IGlzIGFjdHVhbGx5IGEgcmVkaXJlY3QgdG8gYW4gYW5jaG9yIScgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YWdzLmluY2x1ZGVzKCdSIHRvIGFuY2hvcicpKSBlcnJvcnMucHVzaCh7IG1lc3NhZ2U6ICdpcyBhIHJlZGlyZWN0IHRvIGFuIGFuY2hvciwgYnV0IGl0IGlzIG5vdCB0YWdnZWQgd2l0aCA8Y29kZT57e1IgZnJvbSBhbmNob3J9fTwvY29kZT4hJyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBlcnJvcnMucHVzaCh7IG1lc3NhZ2U6IGBpcyBhIHJlZGlyZWN0IHRvIDxhIGhyZWY9XCIke213LnV0aWwuZ2V0VXJsKGRlc3RpbmF0aW9uKX1cIiB0YXJnZXQ9XCJfYmxhbmtcIj4ke2Rlc3RpbmF0aW9ufTwvYT4sIGJ1dCB0aGF0IHNlY3Rpb24gb3IgYW5jaG9yIGRvZXMgbm90IGV4aXN0IWAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvKiBJbXByb3Blcmx5IHRhZ2dlZCBhcyByZWRpcmVjdCB0byBzZWN0aW9uL2FuY2hvciAqL1xuICAgICAgICAgICAgICAgIGlmIChkZXN0aW5hdGlvbi5zcGxpdCgnIycpLmxlbmd0aCA9PT0gMSAmJiAodGFncy5pbmNsdWRlcygnUiB0byBzZWN0aW9uJykgfHwgdGFncy5pbmNsdWRlcygnUiB0byBhbmNob3InKSkpXG4gICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHsgbWVzc2FnZTogJ2lzIG5vdCBhIHJlZGlyZWN0IHRvIGEgc2VjdGlvbi9hbmNob3IsIGJ1dCBpdCBpcyB0YWdnZWQgd2l0aCA8Y29kZT57e1IgZnJvbSBzZWN0aW9ufX08L2NvZGU+IG9yIDxjb2RlPnt7UiBmcm9tIGFuY2hvcn19PC9jb2RlPiEnIH0pO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0SXNEaXNhbWJpZ3VhdGlvblBhZ2UgPSAhIShkZXN0aW5hdGlvbkRhdGEhLnF1ZXJ5LnBhZ2VzWzBdLnBhZ2Vwcm9wcyAmJiAnZGlzYW1iaWd1YXRpb24nIGluIGRlc3RpbmF0aW9uRGF0YSEucXVlcnkucGFnZXNbMF0ucGFnZXByb3BzKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXRJc1N1cm5hbWVMaXN0ID0gISEoZGVzdGluYXRpb25EYXRhIS5xdWVyeS5wYWdlc1swXS5jYXRlZ29yaWVzICYmIGRlc3RpbmF0aW9uRGF0YSEucXVlcnkucGFnZXNbMF0uY2F0ZWdvcmllcy5zb21lKChjYXRlZ29yeSkgPT4gY2F0ZWdvcnkudGl0bGUgPT09ICdDYXRlZ29yeTpTdXJuYW1lcycpKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHRvRGlzYW1iaWd1YXRpb25QYWdlVGFncyA9IFsnUiB0byBkaXNhbWJpZ3VhdGlvbiBwYWdlJywgJ1IgZnJvbSBpbmNvbXBsZXRlIGRpc2FtYmlndWF0aW9uJ107XG4gICAgICAgICAgICAgICAgY29uc3QgdG9TdXJuYW1lTGlzdFRhZ3MgPSBbJ1IgZnJvbSBhbWJpZ3VvdXMgc29ydCBuYW1lJywgJ1IgZnJvbSBhbWJpZ3VvdXMgdGVybSddO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgdGFnZ2VkQXNSZWRpcmVjdFRvRGlzYW1iaWd1YXRpb25QYWdlID0gdG9EaXNhbWJpZ3VhdGlvblBhZ2VUYWdzLnNvbWUoKHRlbXBsYXRlKSA9PiB0YWdzLmluY2x1ZGVzKHRlbXBsYXRlKSk7XG4gICAgICAgICAgICAgICAgY29uc3QgdGFnZ2VkQXNSZWRpcmVjdFRvU3VybmFtZUxpc3QgPSB0b1N1cm5hbWVMaXN0VGFncy5zb21lKCh0ZW1wbGF0ZSkgPT4gdGFncy5pbmNsdWRlcyh0ZW1wbGF0ZSkpO1xuXG4gICAgICAgICAgICAgICAgLyogUmVkaXJlY3QgdG8gZGlzYW1iaWd1YXRpb24gcGFnZSB3aXRob3V0IHRlbXBsYXRlICovXG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldElzRGlzYW1iaWd1YXRpb25QYWdlICYmICF0YWdnZWRBc1JlZGlyZWN0VG9EaXNhbWJpZ3VhdGlvblBhZ2UgJiYgIXRhZ2dlZEFzUmVkaXJlY3RUb1N1cm5hbWVMaXN0KVxuICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7IG1lc3NhZ2U6ICdpcyBhIHJlZGlyZWN0IHRvIGEgZGlzYW1iaWd1YXRpb24gcGFnZSwgYnV0IGl0IGlzIG5vdCB0YWdnZWQgd2l0aCBhIGRpc2FtYmlndWF0aW9uIGNhdGVnb3JpemF0aW9uIHRlbXBsYXRlIScgfSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoZGVzdGluYXRpb25EYXRhIS5xdWVyeS5wYWdlc1swXS5wYWdlcHJvcHMgJiYgIXRhcmdldElzRGlzYW1iaWd1YXRpb25QYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8qIEltcHJvcGVybHkgdGFnZ2VkIGFzIHJlZGlyZWN0IHRvIGRpc2FtYmlndWF0aW9uIHBhZ2UgKi9cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZ2dlZEFzUmVkaXJlY3RUb0Rpc2FtYmlndWF0aW9uUGFnZSkgZXJyb3JzLnB1c2goeyBtZXNzYWdlOiAnaXMgbm90IGEgcmVkaXJlY3QgdG8gYSBkaXNhbWJpZ3VhdGlvbiBwYWdlLCBidXQgaXQgaXMgdGFnZ2VkIHdpdGggYSBkaXNhbWJpZ3VhdGlvbiBjYXRlZ29yaXphdGlvbiB0ZW1wbGF0ZSEnIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIC8qIFJlZGlyZWN0IHRvIHN1cm5hbWUgbGlzdCB3aXRob3V0IHRlbXBsYXRlICovXG4gICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXRJc1N1cm5hbWVMaXN0ICYmICF0YWdnZWRBc1JlZGlyZWN0VG9TdXJuYW1lTGlzdClcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHsgbWVzc2FnZTogJ2lzIGEgcmVkaXJlY3QgdG8gYSBzdXJuYW1lIGxpc3QsIGJ1dCBpdCBpcyBub3QgdGFnZ2VkIHdpdGggYSBjb3JyZWN0IGRpc2FtYmlndWF0aW9uIGNhdGVnb3JpemF0aW9uIHRlbXBsYXRlIScgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLyoge3tSIHRvIGRpc2FtYmlndWF0aW9uIHBhZ2V9fSB3aXRob3V0IFwiIChkaXNhbWJpZ3VhdGlvbilcIiBhdCBlbmQgb2YgdGl0bGUgKi9cbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0SXNEaXNhbWJpZ3VhdGlvblBhZ2UgJiYgdGFncy5pbmNsdWRlcygnUiB0byBkaXNhbWJpZ3VhdGlvbiBwYWdlJykgJiYgIXRoaXMucGFnZVRpdGxlUGFyc2VkLmdldE1haW5UZXh0KCkuZW5kc1dpdGgoJyAoZGlzYW1iaWd1YXRpb24pJykpXG4gICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lzIHRhZ2dlZCB3aXRoIDxjb2RlPnt7UiB0byBkaXNhbWJpZ3VhdGlvbiBwYWdlfX08L2NvZGU+LCBidXQgdGhpcyB0aXRsZSBkb2VzIG5vdCBlbmQgd2l0aCBcIiAoZGlzYW1iaWd1YXRpb24pXCIuIFVzZSA8Y29kZT57e1IgZnJvbSBhbWJpZ3VvdXMgdGVybX19PC9jb2RlPiBvciBhIHNpbWlsYXIgY2F0ZWdvcml6YXRpb24gdGVtcGxhdGUgaW5zdGVhZCEnLFxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIC8qIFRhZ2dlZCB3aXRoIGEgcHJvdGVjdGlvbiB0ZW1wbGF0ZSAqL1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdGVtcGxhdGUgb2YgWydSIHNlbWktcHJvdGVjdGVkJywgJ1IgZXh0ZW5kZWQtcHJvdGVjdGVkJywgJ1IgdGVtcGxhdGUtcHJvdGVjdGVkJywgJ1IgZnVsbHkgcHJvdGVjdGVkJ10pXG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWdzLmluY2x1ZGVzKHRlbXBsYXRlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHsgbWVzc2FnZTogYGlzIHRhZ2dlZCB3aXRoIHVubmVjZXNzYXJpbHkgdGFnZ2VkIHdpdGggPGNvZGU+e3ske3RlbXBsYXRlfX19PC9jb2RlPiB3aGljaCB3aWxsIGJlIGR1cGxpY2F0ZWQgYnkgdGhlIHJlZGlyZWN0IGNhdGVnb3J5IHNoZWxsIWAgfSk7XG5cbiAgICAgICAgICAgICAgICAvKiBMaW5rZWQgdG8gYSBXaWtpZGF0YSBpdGVtIHdpdGhvdXQgYmVpbmcgdGFnZ2VkIHdpdGgge3tSIHdpdGggV2lraWRhdGEgaXRlbX19ICovXG4gICAgICAgICAgICAgICAgaWYgKG13LmNvbmZpZy5nZXQoJ3dnV2lraWJhc2VJdGVtSWQnKSAmJiAhdGFncy5pbmNsdWRlcygnUiB3aXRoIFdpa2lkYXRhIGl0ZW0nKSlcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goeyBtZXNzYWdlOiBcImlzIGxpbmtlZCB0byBhIFdpa2lkYXRhIGl0ZW0gYnV0IGl0IGlzbid0IHRhZ2dlZCB3aXRoIDxjb2RlPnt7UiB3aXRoIFdpa2lkYXRhIGl0ZW19fTwvY29kZT4hXCIgfSk7XG5cbiAgICAgICAgICAgICAgICAvKiBUYWdnZWQgd2l0aCB7e1Igd2l0aCBXaWtpZGF0YSBpdGVtfX0gd2l0aG91dCBiZWluZyBsaW5rZWQgdG8gYW4gaXRlbSAqL1xuICAgICAgICAgICAgICAgIGlmICh0YWdzLmluY2x1ZGVzKCdSIHdpdGggV2lraWRhdGEgaXRlbScpICYmICFtdy5jb25maWcuZ2V0KCd3Z1dpa2liYXNlSXRlbUlkJykpXG4gICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHsgbWVzc2FnZTogJ2lzIHRhZ2dlZCB3aXRoIDxjb2RlPnt7UiB3aXRoIFdpa2lkYXRhIGl0ZW19fTwvY29kZT4gYnV0IGl0IGlzIG5vdCBhY3R1YWxseSBsaW5rZWQgdG8gYSBXaWtpZGF0YSBpdGVtIScgfSk7XG5cbiAgICAgICAgICAgICAgICAvKiBTeW5jaW5nIHRhbGsgcGFnZSBidXQgdGFsayBwYWdlIGV4aXN0cyBhbmQgaXNuJ3QgYSByZWRpcmVjdCAqL1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnN5bmNUYWxrQ2hlY2tib3g/LmlzU2VsZWN0ZWQoKSAmJiAhdGhpcy50YWxrRGF0YSEucXVlcnkucGFnZXNbMF0ubWlzc2luZyAmJiAhdGhpcy50YWxrRGF0YSEucXVlcnkucGFnZXNbMF0ucmVkaXJlY3QpXG4gICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHsgdGl0bGU6IHRoaXMucGFnZVRpdGxlUGFyc2VkLmdldFRhbGtQYWdlKCkhLmdldFByZWZpeGVkVGV4dCgpLCBtZXNzYWdlOiAnZXhpc3RzLCBidXQgaXMgbm90IGEgcmVkaXJlY3QhJyB9KTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogSGFuZGxlcyB0aGUgZXZlbnQgd2hlbiB0aGUgdXNlciBjbGlja3MgdGhlIFwiU3VibWl0XCIgYnV0dG9uLlxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBwcml2YXRlIGFzeW5jIGhhbmRsZVN1Ym1pdEJ1dHRvbkNsaWNrKCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzVG9EaXNhYmxlID0gW1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZGlyZWN0SW5wdXQsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGFnU2VsZWN0LFxuICAgICAgICAgICAgICAgICAgICAuLi50aGlzLnRlbXBsYXRlRWRpdG9yc0luZm8uZmxhdE1hcCgodGVtcGxhdGUpID0+IHRlbXBsYXRlLnBhcmFtZXRlcnMubWFwKChwYXJhbWV0ZXIpID0+IHBhcmFtZXRlci5lZGl0b3IpKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcmV2aWV3QnV0dG9uLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRTb3J0SW5wdXQsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNvcnRTdWdnZXN0QnV0dG9uLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0LFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1bW1hcnlJbnB1dCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24sXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3luY1RhbGtDaGVja2JveCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXRyb2xDaGVja2JveCxcbiAgICAgICAgICAgICAgICBdLmZpbHRlcihCb29sZWFuKTtcblxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50c1RvRGlzYWJsZSkgKGVsZW1lbnQgYXMgT08udWkuV2lkZ2V0KS5zZXREaXNhYmxlZCh0cnVlKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldExhYmVsKCdDaGVja2luZyB0YXJnZXQgdmFsaWRpdHkuLi4nKTtcblxuICAgICAgICAgICAgICAgIGxldCBlcnJvcnM6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgdGhpcy52YWxpZGF0ZVN1Ym1pc3Npb24+PiA9IFtdO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm5lZWRzQ2hlY2spIGVycm9ycyA9IGF3YWl0IHRoaXMudmFsaWRhdGVTdWJtaXNzaW9uKCk7XG4gICAgICAgICAgICAgICAgZWxzZSB0aGlzLnBhcnNlZERlc3RpbmF0aW9uID0gbXcuVGl0bGUubmV3RnJvbVRleHQodGhpcy5yZWRpcmVjdElucHV0LmdldFZhbHVlKCkpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucmVkaXJlY3QtaGVscGVyLXdhcm5pbmcnKSkgZWxlbWVudC5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB7IHRpdGxlLCBtZXNzYWdlIH0gb2YgZXJyb3JzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYWJlbCA9IG5ldyBPTy51aS5IdG1sU25pcHBldChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgJHt0aXRsZSA/IGA8YSBocmVmPVwiJHttdy51dGlsLmdldFVybCh0aXRsZSl9XCIgdGFyZ2V0PVwiX2JsYW5rXCI+JHt0aXRsZX08L2E+YCA6ICdUaGlzIHBhZ2UnfSAke21lc3NhZ2V9IENsaWNrIGFnYWluIHdpdGhvdXQgbWFraW5nIGNoYW5nZXMgdG8gc3VibWl0IGFueXdheS5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdhcm5pbmdNZXNzYWdlID0gbmV3IE9PLnVpLk1lc3NhZ2VXaWRnZXQoeyB0eXBlOiAnZXJyb3InLCBjbGFzc2VzOiBbJ3JlZGlyZWN0LWhlbHBlci13YXJuaW5nJ10sIGlubGluZTogdHJ1ZSwgbGFiZWwgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWRpdG9yQm94LiRlbGVtZW50WzBdLmFwcGVuZCh3YXJuaW5nTWVzc2FnZS4kZWxlbWVudFswXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHNUb0Rpc2FibGUpIChlbGVtZW50IGFzIE9PLnVpLldpZGdldCkuc2V0RGlzYWJsZWQoZmFsc2UpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpLmxlbmd0aCA+IDApIHRoaXMucHJldmlld0J1dHRvbi5zZXREaXNhYmxlZChmYWxzZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24uc2V0TGFiZWwoJ1N1Ym1pdCBhbnl3YXknKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZWVkc0NoZWNrID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8qIEVkaXQvY3JlYXRlIHJlZGlyZWN0ICovXG4gICAgICAgICAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24uc2V0TGFiZWwoYCR7dGhpcy5leGlzdHMgPyAnRWRpdGluZycgOiAnQ3JlYXRpbmcnfSByZWRpcmVjdC4uLmApO1xuXG4gICAgICAgICAgICAgICAgY29uc3Qgb3V0cHV0ID0gdGhpcy5jcmVhdGVPdXRwdXQoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVkaXJlY3RJbnB1dC5nZXRWYWx1ZSgpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9sZFN0cmF5VGV4dCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0U29ydElucHV0LmdldFZhbHVlKCksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXSxcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgY29uc3Qgc3VtbWFyeSA9ICh0aGlzLnN1bW1hcnlJbnB1dC5nZXRWYWx1ZSgpIHx8ICh0aGlzLnN1bW1hcnlJbnB1dC4kdGFiSW5kZXhlZFswXSBhcyBIVE1MSW5wdXRFbGVtZW50KS5wbGFjZWhvbGRlcikgKyB0aGlzLnNjcmlwdEFkdmVydDtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZWRpdE9yQ3JlYXRlKHRoaXMucGFnZVRpdGxlLCBvdXRwdXQsIHN1bW1hcnkpO1xuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KSByZXR1cm47XG5cbiAgICAgICAgICAgICAgICBtdy5ub3RpZnkoYFJlZGlyZWN0ICR7dGhpcy5leGlzdHMgPyAnZWRpdGVkJyA6ICdjcmVhdGVkJ30gc3VjY2Vzc2Z1bGx5IWAsIHsgdHlwZTogJ3N1Y2Nlc3MnIH0pO1xuXG4gICAgICAgICAgICAgICAgLyogU3luYyB0YWxrIHBhZ2UgY2hlY2tib3ggaGFuZGxlciAqL1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnN5bmNUYWxrQ2hlY2tib3g/LmlzU2VsZWN0ZWQoKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5zZXRMYWJlbCgnRWRpdGluZyB0YWxrIHBhZ2UuLi4nKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmcm9tTW92ZSA9IHRoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkuaW5jbHVkZXMoJ1IgZnJvbSBtb3ZlJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3V0cHV0ID0gdGhpcy5jcmVhdGVPdXRwdXQodGhpcy5wYXJzZWREZXN0aW5hdGlvbiEuZ2V0VGFsa1BhZ2UoKSEuZ2V0UHJlZml4ZWRUZXh0KCksIGZyb21Nb3ZlID8gWydSIGZyb20gbW92ZSddIDogW10sIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBbXSk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFsa1Jlc3VsdCA9IGF3YWl0IHRoaXMuZWRpdE9yQ3JlYXRlKHRoaXMucGFnZVRpdGxlUGFyc2VkLmdldFRhbGtQYWdlKCkhLmdldFByZWZpeGVkVGV4dCgpLCBvdXRwdXQsICdTeW5jaW5nIHJlZGlyZWN0IGZyb20gbWFpbiBwYWdlJyArIHRoaXMuc2NyaXB0QWR2ZXJ0KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0YWxrUmVzdWx0KSByZXR1cm47XG5cbiAgICAgICAgICAgICAgICAgICAgbXcubm90aWZ5KCdUYWxrIHBhZ2Ugc3luY2VkIHN1Y2Nlc3NmdWxseSEnLCB7IHR5cGU6ICdzdWNjZXNzJyB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvKiBQYXRyb2wgY2hlY2tib3ggaGFuZGxlciAqL1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhdHJvbENoZWNrYm94Py5pc1NlbGVjdGVkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24uc2V0TGFiZWwoJ1BhdHJvbGxpbmcgcmVkaXJlY3QuLi4nKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXRyb2xMaW5rOiBIVE1MQW5jaG9yRWxlbWVudCB8IG51bGwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucGF0cm9sbGluayBhJyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hcmtSZXZpZXdlZEJ1dHRvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNtd2UtcHQtbWFyay1hcy1yZXZpZXdlZC1idXR0b24nKSBhcyBIVE1MQnV0dG9uRWxlbWVudCB8IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhdHJvbExpbmspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhdHJvbFJlc3VsdCA9IGF3YWl0IHRoaXMuYXBpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBvc3RXaXRoVG9rZW4oJ3BhdHJvbCcsIHsgYWN0aW9uOiAncGF0cm9sJywgcmNpZDogbmV3IFVSTChwYXRyb2xMaW5rLmhyZWYpLnNlYXJjaFBhcmFtcy5nZXQoJ3JjaWQnKSEgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2goKGVycm9yQ29kZTogc3RyaW5nLCBlcnJvckluZm86IE1lZGlhV2lraURhdGFFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdy5ub3RpZnkoYEVycm9yIHBhdHJvbGxpbmcgJHt0aGlzLnBhZ2VUaXRsZX0gdmlhIEFQSTogJHtlcnJvckluZm8/LmVycm9yLmluZm8gPz8gJ1Vua25vd24gZXJyb3InfSAoJHtlcnJvckNvZGV9KWAsIHsgdHlwZTogJ2Vycm9yJyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGF0cm9sUmVzdWx0KSBtdy5ub3RpZnkoJ1JlZGlyZWN0IHBhdHJvbGxlZCBzdWNjZXNzZnVsbHkhJywgeyB0eXBlOiAnc3VjY2VzcycgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWFya1Jldmlld2VkQnV0dG9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXJrUmV2aWV3ZWRCdXR0b24uY2xpY2soKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG13Lm5vdGlmeSgnUmVkaXJlY3QgcGF0cm9sbGVkIHN1Y2Nlc3NmdWxseSEnLCB7IHR5cGU6ICdzdWNjZXNzJyB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIG13Lm5vdGlmeSgnUGFnZSBjdXJhdGlvbiB0b29sYmFyIG5vdCBmb3VuZCwgcmVkaXJlY3QgY2Fubm90IGJlIHBhdHJvbGxlZCEnLCB7IHR5cGU6ICdlcnJvcicgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24uc2V0TGFiZWwoJ0NvbXBsZXRlLCByZWxvYWRpbmcuLi4nKTtcblxuICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gbXcudXRpbC5nZXRVcmwodGhpcy5wYWdlVGl0bGUsIHsgcmVkaXJlY3Q6ICdubycgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgKiBUYWtlcyBwcm92aWRlZCB2YWx1ZXMgdG8gY3JlYXRlIHRoZSBwYWdlIG91dHB1dC5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgcHJpdmF0ZSBjcmVhdGVPdXRwdXQodGFyZ2V0OiBzdHJpbmcsIHRhZ3M6IHN0cmluZ1tdLCBzdHJheVRleHQ6IHN0cmluZyB8IHVuZGVmaW5lZCwgZGVmYXVsdFNvcnQ6IHN0cmluZyB8IHVuZGVmaW5lZCwgY2F0ZWdvcmllczogc3RyaW5nW10pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWRUYXJnZXQgPSBtdy5UaXRsZS5uZXdGcm9tVGV4dCh0YXJnZXQpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkVGl0bGUgPSBwYXJzZWRUYXJnZXRcbiAgICAgICAgICAgICAgICAgICAgPyBgJHtwYXJzZWRUYXJnZXQuZ2V0TmFtZXNwYWNlSWQoKSA9PT0gMTQgPyAnOicgOiAnJ30ke3BhcnNlZFRhcmdldC5nZXRQcmVmaXhlZFRleHQoKX0ke3BhcnNlZFRhcmdldC5nZXRGcmFnbWVudCgpID8gYCMke3BhcnNlZFRhcmdldC5nZXRGcmFnbWVudCgpfWAgOiAnJ31gXG4gICAgICAgICAgICAgICAgICAgIDogdGFyZ2V0LnRyaW0oKTtcblxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYWdlVGl0bGVQYXJzZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRNYWluVGV4dCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAudG9Mb2NhbGVMb3dlckNhc2UoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLm5vcm1hbGl6ZSgnTkZEJylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlQWxsKC9bXFx1MDMwMC1cXHUwMzZGXS9nLCAnJykgPT09XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRTb3J0XG4gICAgICAgICAgICAgICAgICAgICAgICA/LnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5ub3JtYWxpemUoJ05GRCcpXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZUFsbCgvW1xcdTAzMDAtXFx1MDM2Rl0vZywgJycpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0U29ydCA9IHVuZGVmaW5lZDsgLy8gQ2hlY2sgaWYgdGl0bGVzIG5vcm1hbGl6ZSB0byB0aGUgc2FtZSB0ZXh0LCBhbmQgcmVtb3ZlcyB0aGUgREVGQVVMVFNPUlQgaWYgc29cblxuICAgICAgICAgICAgICAgIGNvbnN0IHRhZ3NXaXRoQXJndW1lbnRzID0gdGFncy5tYXAoKHRhZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3VuZEFyZ3VtZW50RWRpdG9yID0gdGhpcy50ZW1wbGF0ZUVkaXRvcnNJbmZvLmZpbmQoKGVkaXRvckluZm8pID0+IGVkaXRvckluZm8ubmFtZSA9PT0gdGFnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZEFyZ3VtZW50RWRpdG9yKSByZXR1cm4gYHt7JHt0YWd9fX1gO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hcHBlZEFyZ3VtZW50cyA9IGZvdW5kQXJndW1lbnRFZGl0b3IucGFyYW1ldGVyc1xuICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgocGFyYW1ldGVyLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcGFyYW1ldGVyLmVkaXRvci5nZXRWYWx1ZSgpLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKSByZXR1cm4gbnVsbDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgfCR7cGFyYW1ldGVyLm5hbWUgPT09IChpbmRleCArIDEpLnRvU3RyaW5nKCkgPyAnJyA6IGAke3BhcmFtZXRlci5uYW1lfT1gfSR7dmFsdWV9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgICAgICAgICAgICAgICAgICAuam9pbignJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGB7eyR7dGFnfSR7bWFwcGVkQXJndW1lbnRzfX19YDtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgIGAjUkVESVJFQ1QgW1ske2Zvcm1hdHRlZFRpdGxlfV1dXFxuYCwgLy9cbiAgICAgICAgICAgICAgICAgICAgdGFncy5sZW5ndGggPiAwID8gYHt7UmVkaXJlY3QgY2F0ZWdvcnkgc2hlbGx8XFxuJHt0YWdzV2l0aEFyZ3VtZW50cy5qb2luKCdcXG4nKX1cXG59fVxcbmAgOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBzdHJheVRleHQgPyBzdHJheVRleHQgKyAnXFxuJyA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRTb3J0ID8gYHt7REVGQVVMVFNPUlQ6JHtkZWZhdWx0U29ydC50cmltKCl9fX1gIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcmllcy5sZW5ndGggPiAwID8gY2F0ZWdvcmllcy5tYXAoKGNhdGVnb3J5KSA9PiBgW1tDYXRlZ29yeToke2NhdGVnb3J5fV1dYCkuam9pbignXFxuJykgOiBudWxsLFxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgICAgICAgICAgICAgICAuam9pbignXFxuJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogRmV0Y2hlcyB0aGUgY29udGVudCBvZiBhIGdpdmVuIHBhZ2UuXG4gICAgICAgICAgICAgKiBAcGFyYW0gdGl0bGUgVGhlIHRpdGxlIHRvIGZldGNoLlxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBwcml2YXRlIGFzeW5jIGdldFBhZ2VDb250ZW50KHRpdGxlOiBzdHJpbmcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAoYXdhaXQgdGhpcy5hcGkuZ2V0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3A6ICdyZXZpc2lvbnMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgcnZwcm9wOiAnY29udGVudCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBydnNsb3RzOiAnbWFpbicsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZXM6IHRpdGxlLFxuICAgICAgICAgICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeVJldmlzaW9uc1BhcmFtcykpIGFzIFBhZ2VSZXZpc2lvbnNSZXN1bHRcbiAgICAgICAgICAgICAgICApLnF1ZXJ5LnBhZ2VzWzBdLnJldmlzaW9uc1swXS5zbG90cy5tYWluLmNvbnRlbnQudHJpbSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEVkaXRzIG9yIGNyZWF0ZXMgYSBwYWdlIHdpdGggZ2l2ZW4gdGV4dC5cbiAgICAgICAgICAgICAqIEBwYXJhbSB0aXRsZSBUaGUgcGFnZSB0aXRsZS5cbiAgICAgICAgICAgICAqIEBwYXJhbSB0ZXh0IFRoZSBwYWdlIHRleHQuXG4gICAgICAgICAgICAgKiBAcGFyYW0gc3VtbWFyeSBUaGUgZWRpdCBzdW1tYXJ5LlxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBwcml2YXRlIGFzeW5jIGVkaXRPckNyZWF0ZSh0aXRsZTogc3RyaW5nLCB0ZXh0OiBzdHJpbmcsIHN1bW1hcnk6IHN0cmluZykge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmFwaVxuICAgICAgICAgICAgICAgICAgICAuZWRpdCh0aXRsZSwgKCkgPT4gKHsgdGV4dCwgc3VtbWFyeSB9KSlcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKChlcnJvckNvZGU6IHN0cmluZywgZXJyb3JJbmZvOiBNZWRpYVdpa2lEYXRhRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvckNvZGUgPT09ICdub2NyZWF0ZS1taXNzaW5nJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hcGkuY3JlYXRlKHRpdGxlLCB7IHN1bW1hcnkgfSwgdGV4dCkuY2F0Y2goKGVycm9yQ29kZTogc3RyaW5nLCBlcnJvckluZm86IE1lZGlhV2lraURhdGFFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdy5ub3RpZnkoYEVycm9yIGNyZWF0aW5nICR7dGl0bGV9OiAke2Vycm9ySW5mbz8uZXJyb3IuaW5mbyA/PyAnVW5rbm93biBlcnJvcid9ICgke2Vycm9yQ29kZX0pYCwgeyB0eXBlOiAnZXJyb3InIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbXcubm90aWZ5KGBFcnJvciBlZGl0aW5nIG9yIGNyZWF0aW5nICR7dGl0bGV9OiAke2Vycm9ySW5mbz8uZXJyb3IuaW5mbyA/PyAnVW5rbm93biBlcnJvcid9ICgke2Vycm9yQ29kZX0pYCwgeyB0eXBlOiAnZXJyb3InIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG5ldyBSZWRpcmVjdEhlbHBlcigpLnJ1bigpO1xuICAgIH0sXG4pO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7O2FBNkNBLEdBQUcsT0FBTyxNQUNOLENBQUMsaUJBQWtCLGVBQWdCLGtCQUFtQixrQkFBbUIs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LEtBQU8sS0FDeERDLEVBQVcsT0FBUyxFQUFJQSxFQUFXLElBQUtyRyxHQUFhLGNBQWNBLENBQVEsSUFBSSxFQUFFLEtBQUs7QUFBQSxDQUFJLEVBQUksSUFDbEcsRUFDSyxPQUFPLE9BQU8sRUFDZCxLQUFLO0FBQUEsQ0FBSSxDQUNsQixDQU1BLE1BQWMsZUFBZVgsRUFBZSxDQUN4QyxPQUNLLE1BQU0sS0FBSyxJQUFJLElBQUksQ0FDaEIsT0FBUSxRQUNSLGNBQWUsSUFDZixLQUFNLFlBQ04sT0FBUSxVQUNSLFFBQVMsT0FDVCxPQUFRQSxDQUNaLENBQW1DLEdBQ3JDLE1BQU0sTUFBTSxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsTUFBTSxLQUFLLFFBQVEsS0FBSyxDQUMxRCxDQVFBLE1BQWMsYUFBYUEsRUFBZXNILEVBQWNwRSxFQUFpQixDQUNyRSxPQUFPLE1BQU0sS0FBSyxJQUNiLEtBQUtsRCxFQUFPLEtBQU8sQ0FBRSxLQUFBc0gsRUFBTSxRQUFBcEUsQ0FBUSxFQUFFLEVBQ3JDLE1BQU0sQ0FBQ3VDLEVBQW1Cb0IsSUFDbkJwQixJQUFjLG1CQUNQLEtBQUssSUFBSSxPQUFPekYsRUFBTyxDQUFFLFFBQUFrRCxDQUFRLEVBQUdvRSxDQUFJLEVBQUUsTUFBTSxDQUFDN0IsRUFBbUJvQixJQUFrQyxDQUN6RyxHQUFHLE9BQU8sa0JBQWtCN0csQ0FBSyxLQUFLNkcsR0FBVyxNQUFNLE1BQVEsZUFBZSxLQUFLcEIsQ0FBUyxJQUFLLENBQUUsS0FBTSxPQUFRLENBQUMsQ0FDdEgsQ0FBQyxHQUVELEdBQUcsT0FBTyw2QkFBNkJ6RixDQUFLLEtBQUs2RyxHQUFXLE1BQU0sTUFBUSxlQUFlLEtBQUtwQixDQUFTLElBQUssQ0FBRSxLQUFNLE9BQVEsQ0FBQyxFQUN0SCxLQUVkLENBQ1QsQ0FDSixDQUVBLElBQUlqRSxFQUFlLEVBQUUsSUFBSSxDQUM3QixDQUNKIiwKICAibmFtZXMiOiBbIlJlZGlyZWN0SW5wdXRXaWRnZXQiLCAiY29uZmlnIiwgInBhZ2VUaXRsZVBhcnNlZCIsICJ2YWx1ZSIsICJkZWZlcnJlZCIsICJ0aXRsZSIsICJyZXN1bHQiLCAibWF0Y2hlZFNlY3Rpb25zIiwgInNlY3Rpb24iLCAicGFyc2VkVGl0bGUiLCAicGFnZSIsICJyZXNwb25zZSIsICJkYXRhIiwgImxhYmVsIiwgIkNhdGVnb3J5SW5wdXRXaWRnZXQiLCAicGFnZXMiLCAiY2F0ZWdvcnkiLCAidGl0bGVXaXRob3V0TmFtZXNwYWNlIiwgIlRlbXBsYXRlUHJldmlld0RpYWxvZyIsICJ0YWciLCAidGFnc0NvbnRlbnQiLCAiY2F0ZWdvcmllc0NvbnRlbnQiLCAicGFuZWxMYXlvdXQiLCAiYWN0aW9uIiwgIlNob3dDaGFuZ2VzRGlhbG9nIiwgIm9sZFRleHQiLCAibmV3VGV4dCIsICJjb21wYXJpc29uIiwgIm5vQ2hhbmdlc0VsZW1lbnQiLCAiUmVkaXJlY3RIZWxwZXIiLCAicGFnZUluZm8iLCAiZGlhbG9nSW5mbyIsICJidXR0b24iLCAiUmVkaXJlY3RIZWxwZXJEaWFsb2ciLCAicG9ydGxldExpbmsiLCAiZXZlbnQiLCAicmVkaXJlY3RUZW1wbGF0ZXMiLCAiY29udGVudFRleHQiLCAicGFnZVRpdGxlIiwgImV4aXN0cyIsICJtYWluUGFnZUNvbnRlbnQiLCAidGFyZ2V0IiwgInRhZ09yUmVkaXJlY3QiLCAic29ydGVkVGFncyIsICJiIiwgImVkaXRvckluZm8iLCAic2hvd25UZW1wbGF0ZUVkaXRvcnMiLCAibm9UZW1wbGF0ZXNNZXNzYWdlIiwgIndpbmRvd01hbmFnZXIiLCAidGVtcGxhdGVQcmV2aWV3RGlhbG9nIiwgInN1bW1hcnlFbGVtZW50IiwgInRlbXBsYXRlTmFtZSIsICJ0ZW1wbGF0ZURhdGEiLCAicGFyYW1ldGVycyIsICJkZXRhaWxzIiwgInN1bW1hcnkiLCAiZWxlbWVudERhdGEiLCAicGFyYW1ldGVyTmFtZSIsICJwYXJhbWV0ZXJEYXRhIiwgImlucHV0IiwgImlucHV0TGF5b3V0IiwgIm5hbWUiLCAiZ2VuZXJhdGlvbmFsU3VmZml4IiwgImxhc3ROYW1lIiwgIm90aGVyTmFtZXMiLCAibmV3TmFtZSIsICJsZWFkaW5nQXJ0aWNsZSIsICJhIiwgInNob3dDaGFuZ2VzRGlhbG9nIiwgInBhZ2VUcmlhZ2VNYXJrQnV0dG9uIiwgInBhdHJvbFJlc3BvbnNlIiwgInJlZGlyZWN0VmFsdWUiLCAidGFyZ2V0Q2hhbmdlZCIsICJ0YWdzQ2hhbmdlZCIsICJ0YWdBcmd1bWVudHNDaGFuZ2VkIiwgInRlbXBsYXRlIiwgInBhcmFtZXRlciIsICJmb3VuZE9sZEFyZ3VtZW50IiwgImFyZ3VtZW50IiwgImRlZmF1bHRTb3J0Q2hhbmdlZCIsICJjYXRlZ29yaWVzQ2hhbmdlZCIsICJjaGFuZ2VzIiwgInRhZ0RhdGEiLCAib3JpZ2luYWxSZWRpcmVjdFRhZ3MiLCAibWF0Y2giLCAibmV3VGFnIiwgImZvcm1hdHRlZEFyZ3VtZW50cyIsICJpbmRleCIsICJmb3VuZFRlbXBsYXRlRWRpdG9yIiwgImZvdW5kUGFyYW1ldGVyRWRpdG9yIiwgImVycm9ycyIsICJkZXN0aW5hdGlvbiIsICJ0YWdzIiwgImRlc3RpbmF0aW9uRGF0YSIsICJlcnJvckNvZGUiLCAiZGVzdGluYXRpb25QYXJzZVJlc3VsdCIsICJkZXN0aW5hdGlvblJlZGlyZWN0IiwgImRlc3RpbmF0aW9uQ29udGVudCIsICJhbmNob3IiLCAicGFydCIsICJ0YXJnZXRJc0Rpc2FtYmlndWF0aW9uUGFnZSIsICJ0YXJnZXRJc1N1cm5hbWVMaXN0IiwgInRvRGlzYW1iaWd1YXRpb25QYWdlVGFncyIsICJ0b1N1cm5hbWVMaXN0VGFncyIsICJ0YWdnZWRBc1JlZGlyZWN0VG9EaXNhbWJpZ3VhdGlvblBhZ2UiLCAidGFnZ2VkQXNSZWRpcmVjdFRvU3VybmFtZUxpc3QiLCAiZWxlbWVudHNUb0Rpc2FibGUiLCAiZWxlbWVudCIsICJtZXNzYWdlIiwgIndhcm5pbmdNZXNzYWdlIiwgIm91dHB1dCIsICJmcm9tTW92ZSIsICJwYXRyb2xMaW5rIiwgIm1hcmtSZXZpZXdlZEJ1dHRvbiIsICJlcnJvckluZm8iLCAic3RyYXlUZXh0IiwgImRlZmF1bHRTb3J0IiwgImNhdGVnb3JpZXMiLCAicGFyc2VkVGFyZ2V0IiwgImZvcm1hdHRlZFRpdGxlIiwgInRhZ3NXaXRoQXJndW1lbnRzIiwgImZvdW5kQXJndW1lbnRFZGl0b3IiLCAibWFwcGVkQXJndW1lbnRzIiwgInRleHQiXQp9Cg==