User:Eejit43/scripts/redirect-helper.js
Appearance
< User:Eejit43 | scripts
Code that you insert on this page could contain malicious content capable of compromising your account. If you import a script from another page with "importScript", "mw.loader.load", "iusc", or "lusc", take note that this causes you to dynamically load a remote script, which could be changed by others. Editors are responsible for all edits and actions they perform, including by scripts. User scripts are not centrally supported and may malfunction or become inoperable due to software changes. A guide to help you find broken scripts is available. If you are unsure whether code you are adding to this page is safe, you can ask at the appropriate village pump. This code will be executed when previewing this page. |
![]() | This user script seems to have a documentation page at User:Eejit43/scripts/redirect-helper. |
// <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/redirect-helper.ts
"use strict";(()=>{var W=Object.defineProperty;var O=(g,t)=>()=>(g&&(t=g(g=0)),t);var D=(g,t)=>{for(var i in t)W(g,i,{get:t[i],enumerable:!0})};var w,P=O(()=>{"use strict";w=class extends OO.ui.TextInputWidget{api=new mw.Api;constructor(t){super(t),OO.ui.mixin.LookupElement.call(this,t)}getLookupRequest=()=>{let t=this.getValue(),i=$.Deferred();t||i.resolve([]);let e=mw.Title.newFromText(t);return this.api.get({action:"query",formatversion:"2",gaplimit:20,gapnamespace:14,gapprefix:e?.getMainText()??t,generator:"allpages",prop:"categories"}).catch(()=>null).then(a=>{if(a?.query?.pages){let s=a.query.pages.filter(r=>!r.categories?.some(n=>n.title==="Category:Wikipedia soft redirected categories")).map(r=>{let n=r.title.split(":")[1];return{data:n,label:n}});this.emit("showing-values",s),i.resolve(s)}else i.resolve([])}),i.promise({abort(){}})};getLookupCacheDataFromResponse=t=>t??[];getLookupMenuOptionsFromData=t=>t.map(({data:i,label:e})=>new OO.ui.MenuOptionWidget({data:i,label:e}))};Object.assign(w.prototype,OO.ui.mixin.LookupElement.prototype)});var b,k=O(()=>{"use strict";b=class g extends OO.ui.ProcessDialog{api=new mw.Api;constructor(t){super(t),g.static.name="ShowChangesDialog",g.static.title="Changes to be made",g.static.actions=[{action:"cancel",label:"Close",flags:["safe","close"]}]}getSetupProcess=()=>g.super.prototype.getSetupProcess.call(this).next(()=>{let[t,i]=this.getData();return this.api.post({action:"compare",formatversion:"2",prop:["diff"],fromslots:"main","fromtext-main":t,"fromcontentmodel-main":"wikitext",toslots:"main","totext-main":i,"tocontentmodel-main":"wikitext"}).then(e=>{let a=e.compare.body,s=new OO.ui.MessageWidget({type:"warning",label:"No changes to make!"}),r=new OO.ui.PanelLayout({padded:!0,expanded:!1});r.$element.append(a?`
<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>
${a}
</tbody>
</table>`:s.$element[0]),this.$body.append(r.$element)})});getActionProcess=t=>t?new OO.ui.Process(()=>{this.close()}):g.super.prototype.getActionProcess.call(this,t);getTeardownProcess=()=>g.super.prototype.getTeardownProcess.call(this).next(()=>{this.$body.empty()})};Object.assign(b.prototype,OO.ui.ProcessDialog.prototype)});var T,S=O(()=>{"use strict";T=class g extends OO.ui.ProcessDialog{api=new mw.Api;pageTitleParsed;constructor(t,i){super(t),this.pageTitleParsed=i,g.static.name="OutputPreviewDialog",g.static.title="Redirect categorization templates preview",g.static.actions=[{action:"cancel",label:"Close",flags:["safe","close"]}]}getSetupProcess=()=>g.super.prototype.getSetupProcess.call(this).next(()=>this.api.post({action:"parse",formatversion:"2",contentmodel:"wikitext",prop:["text","categorieshtml"],title:this.pageTitleParsed.getPrefixedDb(),text:this.getData()}).then(t=>{let i=t.parse.text,e=t.parse.categorieshtml,a=new OO.ui.PanelLayout({padded:!0,expanded:!1});a.$element.append(i,e),this.$body.append(a.$element)}));getActionProcess=t=>t?new OO.ui.Process(()=>{this.close()}):g.super.prototype.getActionProcess.call(this,t);getTeardownProcess=()=>g.super.prototype.getTeardownProcess.call(this).next(()=>{this.$body.empty()})};Object.assign(T.prototype,OO.ui.ProcessDialog.prototype)});var x,C=O(()=>{"use strict";x=class extends OO.ui.TextInputWidget{api=new mw.Api;pageTitleParsed;constructor(t,i){super(t),OO.ui.mixin.LookupElement.call(this,t),this.pageTitleParsed=i}getLookupRequest=()=>{let t=this.getValue(),i=$.Deferred();if(!t)i.resolve([]);else if(t.includes("#")){let e=t.split("#")[0];this.api.get({action:"parse",page:e,prop:"sections",redirects:!0}).catch(()=>null).then(a=>{if(a){let s=a.parse.sections.filter(r=>r.line.toLowerCase().replaceAll(/<\/?i>/g,"").startsWith(t.split("#")[1].toLowerCase()));i.resolve(s.map(r=>({data:`${a.parse.title}#${r.line.replaceAll(/<\/?i>/g,"")}`,label:`${a.parse.title}#${r.line.replaceAll(/<\/?i>/g,"")}`})))}else i.resolve([])})}else{let e=mw.Title.newFromText(t);this.api.get({action:"query",formatversion:"2",gaplimit:20,gapnamespace:e?.getNamespaceId()??0,gapprefix:e?.getMainText()??t,generator:"allpages",prop:["info","pageprops"]}).catch(()=>null).then(a=>{a?i.resolve(a.query.pages.filter(s=>s.title!==this.pageTitleParsed.getPrefixedText()).map(s=>({data:s.title,label:new OO.ui.HtmlSnippet(`${s.title}${"disambiguation"in s.pageprops?" <i>(disambiguation)</i>":""}${"redirect"in s?" <i>(redirect)</i>":""}`)}))):i.resolve([])})}return i.promise({abort(){}})};getLookupCacheDataFromResponse=t=>t??[];getLookupMenuOptionsFromData=t=>t.map(({data:i,label:e})=>new OO.ui.MenuOptionWidget({data:i,label:e}))};Object.assign(x.prototype,OO.ui.mixin.LookupElement.prototype)});var R={};D(R,{default:()=>v});var v,I=O(()=>{"use strict";P();k();S();C();v=class{api=new mw.Api;redirectRegex=/^#.*?:?\s*\[\[\s*:?([^[\]{|}]+?)\s*(?:\|[^[\]{|}]+?)?]]\s*/i;scriptMessage=" (via [[w:en:User:Eejit43/scripts/redirect-helper|redirect-helper]])";redirectTemplates;contentText;pageTitle;pageTitleParsed;exists;defaultCreatedWatchMethod;needsCheck=!0;editorBox;syncWithMainButton;redirectInput;redirectInputLayout;tagSelect;tagSelectLayout;templateParametersEditor;templateEditorsInfo=[];categorySelect;categorySelectInput;categorySelectLayout;defaultSortInput;defaultSortSuggestButton;defaultSortInputLayout;summaryInput;summaryInputLayout;submitButton;showChangesButton;showPreviewButton;syncTalkCheckbox;syncTalkCheckboxLayout;watchCheckbox;watchCheckboxLayout;patrolCheckbox;patrolCheckboxLayout;submitLayout;talkData;pageContent="";oldRedirectTarget;oldRedirectTags;oldRedirectTagData;oldDefaultSort;oldCategories;oldStrayText;parsedDestination;constructor({redirectTemplates:t,contentText:i,pageTitle:e,pageTitleParsed:a},s,r){this.redirectTemplates=t,this.contentText=i,this.pageTitle=e,this.pageTitleParsed=a,this.exists=s,this.defaultCreatedWatchMethod=r}async load(){mw.util.addCSS(`
#create-redirect-button {
margin-bottom: 20px;
}
#redirect-helper-box {
margin-right: auto;
margin-bottom: 25px !important;
margin-left: auto;
background-color: whitesmoke;
width: 700px;
max-width: calc(100% - 50px);
color: #202122;
}
.redirect-input-layout label {
font-weight: bold;
}
.redirect-helper-redirect-possibilities::after {
content: " (redirect with possibilities)";
font-style: italic;
}
.redirect-helper-template-parameters-container,
.redirect-helper-template-parameters-container details {
margin-block: 10px;
border-radius: 5px;
background-color: #e2e2e2;
padding: 5px;
}
.redirect-helper-template-parameters-container summary {
cursor: pointer;
font-weight: bold;
}
.redirect-helper-template-parameters-container details {
margin-block: 5px;
background-color: #d1cece;
}
#redirect-helper-no-templates-message {
padding: 5px;
}
#redirect-helper-summary-layout {
margin-top: 15px;
border-top: 1px solid gray;
padding-top: 10px;
}
#redirect-helper-submit-layout {
margin-top: 10px;
}
#redirect-helper-submit-layout > * {
margin-bottom: 0;
}
.redirect-helper-warning {
margin-top: 8px;
}
.redirect-helper-autofix-button {
margin-left: 5px;
font-size: 12px;
}
.redirect-helper-autofix-button a {
padding: 3px 4px !important;
min-height: unset !important;
}`),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(){let t=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",()=>{let i=this.redirectRegex.exec(t)?.[1];if(!i)return mw.notify("Failed to parse main page content!",{type:"error"});this.redirectInput.setValue(mw.Title.newFromText(i)?.getTalkPage()?.getPrefixedText()??""),["R from move",...this.redirectTemplates["R from move"].aliases].some(a=>new RegExp(`{{\\s*[${a[0].toLowerCase()}${a[0]}]${a.slice(1)}\\s*(\\||}})`).test(t))&&this.tagSelect.setValue(["R from move"])})}loadInputElements(){this.redirectInput=new x({placeholder:"Target page name",required:!0},this.pageTitleParsed),this.redirectInput.on("change",()=>{let e=this.redirectInput.getValue();e=e.replace(new RegExp(`^(https?:)?/{2}?${mw.config.get("wgServer").replace(/^\/{2}/,"")}/wiki/`),""),e=e.replace(/^:/,""),e.length>0?(this.redirectInput.setValue(e[0].toUpperCase()+e.slice(1).replaceAll("_"," ")),this.defaultSortSuggestButton.setDisabled(!1),this.submitButton.setDisabled(!1),this.showPreviewButton.setDisabled(!1),this.showChangesButton.setDisabled(!1)):(this.defaultSortSuggestButton.setDisabled(!0),this.submitButton.setDisabled(!0),this.showPreviewButton.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.entries(this.redirectTemplates).map(([e,{redirect:a}])=>{if(!a)return{data:e,label:e};let s=new OO.ui.HtmlSnippet(`<span class="redirect-helper-redirect-possibilities">${e}</span>`);return{data:e,label:s}})}),this.tagSelect.getMenu().filterMode="substring",this.tagSelect.on("change",()=>{let e=this.tagSelect.getValue().sort((s,r)=>s.toLowerCase().localeCompare(r.toLowerCase()));this.tagSelect.getValue().join(";")!==e.join(";")&&this.tagSelect.setValue(e),this.updateSummary(),this.submitButton.setLabel("Submit"),this.needsCheck=!0;for(let s of this.templateEditorsInfo)s.details.style.display="none";let a=0;for(let s of this.tagSelect.getValue()){let r=this.templateEditorsInfo.find(n=>n.name===s);r&&(r.details.style.display="block",a++)}t.textContent=`Template parameters (${a>0?`for ${a} template${a>1?"s":""}`:"none to show"})`,i.style.display=a>0?"none":"block"}),this.tagSelectLayout=new OO.ui.FieldLayout(this.tagSelect,{label:"Redirect categorization templates:",classes:["redirect-input-layout"],align:"top"}),this.templateParametersEditor=document.createElement("details"),this.templateParametersEditor.classList.add("redirect-helper-template-parameters-container");let t=document.createElement("summary");t.textContent="Template parameters (none to show)",this.templateParametersEditor.append(t);for(let[e,a]of Object.entries(this.redirectTemplates)){let s=Object.entries(a.parameters);if(s.length===0)continue;let r=document.createElement("details");r.style.display="none";let n=document.createElement("summary");n.textContent=e,r.append(n);let o={name:e,details:r,parameters:[]};for(let[u,c]of s){let m=new OO.ui.TextInputWidget({placeholder:c.default?.toString(),required:c.required});m.on("change",()=>{this.updateSummary(),this.submitButton.setLabel("Submit"),this.needsCheck=!0});let l=new OO.ui.FieldLayout(m,{label:new OO.ui.HtmlSnippet(`${u}${!c.label||u.toLowerCase()===c.label.toLowerCase()?"":` (${c.label})`}${c.description?` (${c.description})`:""} (type: ${c.type}) ${c.suggested?" (suggested)":""}${c.example?` (example: "${c.example}")`:""}`),align:"inline"});r.append(l.$element[0]),o.parameters.push({name:u,aliases:c.aliases,editor:m})}this.templateParametersEditor.append(r),this.templateEditorsInfo.push(o)}let i=document.createElement("div");i.id="redirect-helper-no-templates-message",i.textContent="No templates with parameters to display!",this.templateParametersEditor.append(i),this.defaultSortInput=new OO.ui.TextInputWidget,this.defaultSortInput.on("change",()=>{let e=this.defaultSortInput.getValue();e.length>0&&this.defaultSortInput.setValue(e.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 e=this.pageTitleParsed.getMainText().replace(/ \(.*\)$/,"");if(["R from birth name","R from fictional character","R from band member","R from member","R from person","R from personal name","R from relative","R from spouse"].some(a=>this.tagSelect.getValue().includes(a))){if(!e.includes(" "))return mw.notify("redirect-helper wasn't able to determine a sort key different from the current page title!",{type:"warn"});let a="";if(/ (?:[JS]r.?|[IVX]+)$/.test(e)&&(a=e.slice(e.lastIndexOf(" ")),e=e.slice(0,e.lastIndexOf(" ")),!e.includes(" ")))return e+a;let s=e.slice(e.lastIndexOf(" ")+1).replace(/,$/,"").replace(/O'/,"O"),r=e.slice(0,e.lastIndexOf(" "));this.defaultSortInput.setValue(s+", "+r+a)}else{let a=e.replaceAll("Mr.","Mister").replaceAll("&","And");for(let s of["An","A","The"])if(a.startsWith(s+" ")){a=a.slice(s.length+1)+", "+s;break}a===e?mw.notify("redirect-helper wasn't able to determine a sort key different from the current page title!",{type:"warn"}):this.defaultSortInput.setValue(a)}}),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 w({placeholder:"Add categories here"}),this.categorySelectInput.on("change",()=>{let e=this.categorySelectInput.getValue();e=e.replace(new RegExp(`^(https?:)?/{2}?${mw.config.get("wgServer").replace(/^\/{2}/,"")}/wiki/`),""),e=e.replace(/^Category:/,""),e.length>0&&this.categorySelectInput.setValue(e[0].toUpperCase()+e.slice(1).replaceAll("_"," "))}),this.categorySelectInput.on("showing-values",e=>{for(let a of e)this.categorySelect.addAllowedValue(a.data)}),this.categorySelect=new OO.ui.TagMultiselectWidget({allowReordering:!1,inputPosition:"outline",inputWidget:this.categorySelectInput}),this.categorySelect.on("change",()=>{let e=this.categorySelect.getValue().sort((a,s)=>a.toLowerCase().localeCompare(s.toLowerCase()));this.categorySelect.getValue().join(";")!==e.join(";")&&this.categorySelect.setValue(e),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(){let t=new OO.ui.WindowManager;document.body.append(t.$element[0]),this.submitButton=new OO.ui.ButtonWidget({label:"Submit",disabled:!0,flags:["progressive"]}),this.submitButton.on("click",()=>this.handleSubmitButtonClick());let i=new T({size:"large"},this.pageTitleParsed);t.addWindows([i]),this.showPreviewButton=new OO.ui.ButtonWidget({label:"Show preview",disabled:!0}),this.showPreviewButton.on("click",()=>{i.setData(this.createOutput(this.redirectInput.getValue(),this.tagSelect.getValue(),this.oldStrayText,this.defaultSortInput.getValue(),this.categorySelect.getValue())),i.open()});let e=new b({size:"large"});if(t.addWindows([e]),this.showChangesButton=new OO.ui.ButtonWidget({label:"Show changes",disabled:!0}),this.showChangesButton.on("click",async()=>{this.exists&&(this.pageContent=await this.getPageContent(this.pageTitle)),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"})]})),!this.exists){let a={};["nochange","preferences"].includes(this.defaultCreatedWatchMethod)?a.indeterminate=!0:this.defaultCreatedWatchMethod==="watch"?a.selected=!0:a.selected=!1,this.watchCheckbox=new OO.ui.CheckboxInputWidget(a),this.watchCheckboxLayout=new OO.ui.Widget({content:[new OO.ui.FieldLayout(this.watchCheckbox,{label:"Watch 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.showPreviewButton,this.showChangesButton,this.syncTalkCheckboxLayout,this.watchCheckboxLayout,this.patrolCheckboxLayout].filter(Boolean)})}async checkShouldPromptPatrol(){let t=document.querySelector("#mwe-pt-mark .mwe-pt-tool-icon");if(t?.click(),t?.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 mw.user.getRights()).includes("patrol"))return!1;let e=await this.api.get({action:"pagetriagelist",page_id:mw.config.get("wgArticleId")});return e.pagetriagelist.pages[0]?.user_name===mw.config.get("wgUserName")||e.pagetriagelist.result!=="success"||e.pagetriagelist.pages.length===0?!1:!Number.parseInt(e.pagetriagelist.pages[0]?.patrol_status)}}updateSummary(){let t=this.redirectInput.getValue().trim();if(!t)this.summaryInput.$tabIndexed[0].placeholder="";else if(this.exists){let i=this.oldRedirectTarget?.replaceAll("_"," ");i&&(i=i[0].toUpperCase()+i.slice(1));let e=t!==i,a=this.tagSelect.getValue().some(u=>!this.oldRedirectTags.includes(u))||this.oldRedirectTags.some(u=>!this.tagSelect.getValue().includes(u)),s=!1;if(this.oldRedirectTagData){let u=Object.entries(this.redirectTemplates).filter(([,c])=>Object.entries(c.parameters).length>0);for(let[c,m]of u){if(!this.oldRedirectTags.includes(c)||!this.tagSelect.getValue().includes(c))continue;let p=this.oldRedirectTagData[c]??Object.entries(m.parameters).map(([d])=>[d,""]),h=this.templateEditorsInfo.find(d=>d.name===c);for(let d of h.parameters){let f=p.find(L=>L[0]===d.name)?.[1]??"",y=d.editor.getValue().trim();if(f!==y){s=!0;break}}if(s)break}}let r=this.defaultSortInput.getValue().trim()!==this.oldDefaultSort.replaceAll("_"," "),n=this.categorySelect.getValue().some(u=>!this.oldCategories.includes(u))||this.oldCategories.some(u=>!this.categorySelect.getValue().includes(u)),o=[];e&&o.push(`retarget to [[${t}]]`),a&&o.push(`${this.tagSelect.getValue().length>0&&this.oldRedirectTags.length>0?"change":this.tagSelect.getValue().length>0?"add":"remove"} categorization templates`),s&&o.push("change categorization template arguments"),r&&o.push(`${this.defaultSortInput.getValue().trim().length>0&&this.oldDefaultSort.replaceAll("_"," ").length>0?"change":this.defaultSortInput.getValue().trim().length>0?"add":"remove"} default sort key`),n&&o.push(`${this.categorySelect.getValue().length>0&&this.oldCategories.length>0?"change":this.categorySelect.getValue().length>0?"add":"remove"} categories`),o.length===0&&o.push("perform redirect cleanup"),o[0]=o[0][0].toUpperCase()+o[0].slice(1),o.length>1&&(o[o.length-1]=`and ${o.at(-1)}`),this.summaryInput.$tabIndexed[0].placeholder=o.join(o.length>2?", ":" ")}else this.summaryInput.$tabIndexed[0].placeholder=`Create redirect to [[${t}]]`}async loadExistingData(){this.exists&&(this.pageContent=await this.getPageContent(this.pageTitle)),this.oldRedirectTarget=this.redirectRegex.exec(this.pageContent)?.[1],this.oldRedirectTags=Object.entries(this.redirectTemplates).map(([i,e])=>[i,...e.aliases].some(a=>new RegExp(`{{\\s*[${a[0].toLowerCase()}${a[0]}]${a.slice(1)}\\s*(\\||}})`).test(this.pageContent))?i:null).filter(Boolean).sort((i,e)=>i.toLowerCase().localeCompare(e.toLowerCase()));let t=Object.entries(this.redirectTemplates).flatMap(([i,e])=>[i,...e.aliases]).map(i=>new RegExp(`{{\\s*[${i[0].toLowerCase()}${i[0]}]${i.slice(1)}\\s*(\\||}})`).test(this.pageContent)?i:null).filter(Boolean);this.oldRedirectTagData=Object.fromEntries(t.map(i=>{let e=new RegExp(`{{\\s*[${i[0].toLowerCase()}${i[0]}]${i.slice(1)}\\|?(.*?)\\s*}}`).exec(this.pageContent),a=Object.entries(this.redirectTemplates).find(([n,o])=>[n,...o.aliases].includes(i))?.[0];if(!e?.[1])return null;let r=e[1].split("|").map((n,o)=>{if(!n.includes("="))return[(o+1).toString(),n.trim()];let[u,c]=n.split("=");return[u.trim(),c.trim()]});return[a,r]}).filter(Boolean)),this.oldDefaultSort=this.pageContent.match(/{{DEFAULTSORT:.*?}}/g)?.at(-1)?.slice(14,-2).trim()??"",this.oldCategories=this.pageContent.match(/\[\[[Cc]ategory:.+?]]/g)?.map(i=>i.slice(11,-2))??[],this.oldStrayText=[/{{short description\|.*?}}/i.exec(this.pageContent)?.[0],/{{DISPLAYTITLE:.*?}}/.exec(this.pageContent)?.[0],/{{italic title\|?.*?}}/i.exec(this.pageContent)?.[0],/{{title language\|.*?}}/.exec(this.pageContent)?.[0],/{{authority control(\|.*?)?}}/i.exec(this.pageContent)?.[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(let[i,e]of Object.entries(this.oldRedirectTagData)){let a=this.templateEditorsInfo.find(s=>s.name===i);if(a)for(let[s,r]of e){let n=a.parameters.find(o=>[o.name,...o.aliases].includes(s));n&&n.editor.setValue(r)}}this.oldDefaultSort&&this.defaultSortInput.setValue(this.oldDefaultSort);for(let i of this.oldCategories)this.categorySelect.addAllowedValue(i);this.categorySelect.setValue(this.oldCategories.map(i=>({data:i,label:i}))),this.updateSummary()}async validateSubmission(){let t=[],i=this.redirectInput.getValue().trim(),e=this.tagSelect.getValue();/^\s*[^[\]{|}]+\s*$/.test(i)||t.push({title:i,message:"is not a valid page title!"});try{this.parsedDestination=mw.Title.newFromText(i)}catch{t.length===0&&t.push({title:i,message:"is not a valid page title!"})}!this.parsedDestination&&t.length===0&&t.push({title:i,message:"is not a valid page title!"}),this.parsedDestination?.getPrefixedText()===this.pageTitleParsed.getPrefixedText()&&t.push({message:"cannot redirect to itself!"});let a=await this.api.get({action:"query",formatversion:"2",prop:["pageprops","categories"],titles:i}).catch(l=>(l==="missingtitle"?t.push({title:i,message:"does not exist!"}):t.push({title:i,message:`was not able to be fetched from the API (${l})!`}),null)),s=await this.api.get({action:"parse",page:i,prop:"sections",redirects:!0});if(s.parse.redirects.length>0){let l=s.parse.redirects[0].to+(s.parse.redirects[0].tofragment?`#${s.parse.redirects[0].tofragment}`:"");t.push({title:i,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.`,autoFixes:[{type:"change-target",target:l}]})}if(i.split("#").length>1)if(s.parse.sections.find(p=>p.line.replaceAll(/<\/?i>/g,"")===i.split("#")[1]))e.includes("R to anchor")&&t.push({message:"is tagged as a redirect to an anchor, but it is actually a redirect to a section!",autoFixes:[{type:"add",tag:"R to section"},{type:"remove",tag:"R to anchor"}]}),e.includes("R to section")||t.push({message:"is a redirect to a section, but it is not tagged with <code>{{R to section}}</code>!",autoFixes:[{type:"add",tag:"R to section"}]});else{let p=(await this.api.get({action:"query",formatversion:"2",prop:"revisions",rvprop:"content",rvslots:"main",titles:this.parsedDestination.getPrefixedText()})).query.pages[0].revisions[0].slots.main.content;[...p.match(/(?<={{\s*?[Aa](?:nchors?|nchor for redirect|nker|NCHOR|nc)\s*?\|).+?(?=}})/g)?.map(d=>d.split("|").map(f=>f.trim())).flat()??[],...p.match(/(?<={{\s*?(?:[Vv](?:isible anchors?|isanc|Anch|anchor|isibleanchor|a)|[Aa](?:nchord|chored|nchor\+)|[Tt]ext anchor)\s*?\|).+?(?=(?<!!|=)}})/g)?.map(d=>d.split("|").map(f=>f.trim()).filter(f=>!/^text\s*?=/.test(f))).flat()??[],...p.match(/(?<=id=)"?.+?(?="|>|\|)/g)?.map(d=>d.trim())??[],...p.match(/EpisodeNumber += +\d+/g)?.map(d=>`ep${d.split("=")[1].trim()}`)??[]].includes(i.split("#")[1])?(e.includes("R to section")&&t.push({message:"is tagged as a redirect to a section, but it is actually a redirect to an anchor!",autoFixes:[{type:"add",tag:"R to anchor"},{type:"remove",tag:"R to section"}]}),e.includes("R to anchor")||t.push({message:"is a redirect to an anchor, but it is not tagged with <code>{{R from anchor}}</code>!",autoFixes:[{type:"add",tag:"R to anchor"}]})):t.push({message:`is a redirect to <a href="${mw.util.getUrl(i)}" target="_blank">${i}</a>, but that section or anchor does not exist!`,autoFixes:[{type:"change-target",target:i.split("#")[0]}]})}if(i.split("#").length===1)for(let l of["R to section","R to anchor"])e.includes(l)&&t.push({message:`is not a redirect to a section/anchor, but it is tagged with <code>{{${l}}}</code>!`,autoFixes:[{type:"remove",tag:l}]});let r=!!(a.query.pages[0].pageprops&&"disambiguation"in a.query.pages[0].pageprops),n=!!a.query.pages[0].categories?.some(l=>l.title==="Category:Surnames"),o=["R to disambiguation page","R from incomplete disambiguation"],u=["R from ambiguous sort name","R from ambiguous term"],c=o.some(l=>e.includes(l)),m=u.some(l=>e.includes(l));r&&!c&&!m&&t.push({message:"is a redirect to a disambiguation page, but it is not tagged with a disambiguation categorization template!"}),a.query.pages[0].pageprops&&!r&&((!n&&(c||m)||n&&c)&&t.push({message:"is not a redirect to a disambiguation page, but it is tagged with a disambiguation categorization template!",autoFixes:[...o,...u].map(l=>({type:"remove",tag:l}))}),n&&!m&&t.push({message:"is a redirect to a surname list, but it is not tagged with a correct disambiguation categorization template!"})),r&&e.includes("R to disambiguation page")&&!this.pageTitleParsed.getMainText().endsWith(" (disambiguation)")&&t.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!',autoFixes:[{type:"remove",tag:"R to disambiguation page"}]});for(let l of["R protected","R semi-protected","R extended-protected","R template-protected","R fully protected"])e.includes(l)&&t.push({message:`is tagged with unnecessarily tagged with <code>{{${l}}}</code> which will be duplicated by the redirect category shell!`,autoFixes:[{type:"remove",tag:l}]});mw.config.get("wgWikibaseItemId")&&!e.includes("R with Wikidata item")&&t.push({message:"is linked to a Wikidata item but it isn't tagged with <code>{{R with Wikidata item}}</code>!",autoFixes:[{type:"add",tag:"R with Wikidata item"}]}),e.includes("R with Wikidata item")&&!mw.config.get("wgWikibaseItemId")&&t.push({message:"is tagged with <code>{{R with Wikidata item}}</code> but it is not actually linked to a Wikidata item!",autoFixes:[{type:"remove",tag:"R with Wikidata item"}]});for(let l of e){if(!(l in this.redirectTemplates))continue;let p=this.redirectTemplates[l];for(let[h,d]of Object.entries(p.parameters)){let f=this.templateEditorsInfo.find(y=>y.name===l)?.parameters.find(y=>[y.name,...y.aliases].includes(h));f&&d.required&&!f.editor.getValue().trim()&&t.push({message:`is tagged with <code>{{${l}}}</code> but it is missing the required parameter <code>${h}</code>!`})}}return this.syncTalkCheckbox?.isSelected()&&!this.talkData.query.pages[0].missing&&!this.talkData.query.pages[0].redirect&&t.push({title:this.pageTitleParsed.getTalkPage().getPrefixedText(),message:"exists, but is not a redirect!"}),t}async handleSubmitButtonClick(){let t=[this.redirectInput,this.tagSelect,...this.templateEditorsInfo.flatMap(r=>r.parameters.map(n=>n.editor)),this.defaultSortInput,this.defaultSortSuggestButton,this.categorySelect,this.summaryInput,this.submitButton,this.showPreviewButton,this.showChangesButton,this.syncTalkCheckbox,this.watchCheckbox,this.patrolCheckbox].filter(Boolean);for(let r of t)r.setDisabled(!0);this.submitButton.setLabel("Checking target validity...");let i=[];if(this.needsCheck?i=await this.validateSubmission():this.parsedDestination=mw.Title.newFromText(this.redirectInput.getValue()),i.length>0){for(let r of document.querySelectorAll(".redirect-helper-warning"))r.remove();for(let{title:r,message:n,autoFixes:o}of i){let u=new OO.ui.HtmlSnippet(`${r?`<a href="${mw.util.getUrl(r)}" target="_blank">${r}</a>`:"This page"} ${n} Click again without making changes to submit anyway.`),c=new OO.ui.MessageWidget({type:"error",classes:["redirect-helper-warning"],inline:!0,label:u});if(o){let m=new OO.ui.ButtonWidget({label:"Perform auto-fix",flags:["progressive"],classes:["redirect-helper-autofix-button"]});m.on("click",()=>{let l=this.tagSelect.getValue();for(let p of o)p.type==="add"&&!l.includes(p.tag)&&this.tagSelect.addTag(p.tag,p.tag),p.type==="remove"&&l.includes(p.tag)&&this.tagSelect.removeTagByData(p.tag),p.type==="change-target"&&this.redirectInput.setValue(p.target);c.$element[0].style.textDecoration="line-through 2px black",m.$element[0].remove()}),c.$element[0].querySelector(".oo-ui-labelElement-label").append(m.$element[0])}this.editorBox.$element[0].append(c.$element[0])}for(let r of t)r.setDisabled(!1);this.submitButton.setLabel("Submit anyway"),this.needsCheck=!1;return}this.submitButton.setLabel(`${this.exists?"Editing":"Creating"} redirect...`);let e=this.createOutput(this.redirectInput.getValue(),this.tagSelect.getValue(),this.oldStrayText,this.defaultSortInput.getValue(),this.categorySelect.getValue()),a=(this.summaryInput.getValue()||this.summaryInput.$tabIndexed[0].placeholder)+this.scriptMessage;if(await this.editOrCreate(this.pageTitle,e,a)){if(mw.notify(`Redirect ${this.exists?"edited":"created"} successfully!`,{type:"success"}),this.syncTalkCheckbox?.isSelected()){this.submitButton.setLabel("Editing talk page...");let r=this.tagSelect.getValue().includes("R from move"),n=this.createOutput(this.parsedDestination.getTalkPage().getPrefixedText(),r?["R from move"]:[],void 0,void 0,[]);if(!await this.editOrCreate(this.pageTitleParsed.getTalkPage().getPrefixedText(),n,"Syncing redirect from main page"+this.scriptMessage))return;mw.notify("Talk page synced successfully!",{type:"success"})}if(this.patrolCheckbox?.isSelected()){this.submitButton.setLabel("Patrolling redirect...");let r=document.querySelector(".patrollink a"),n=document.querySelector("#mwe-pt-mark-as-reviewed-button");r?await this.api.postWithToken("patrol",{action:"patrol",rcid:new URL(r.href).searchParams.get("rcid")}).catch((u,c)=>(mw.notify(`Error patrolling ${this.pageTitle} via API: ${c?.error.info??"Unknown error"} (${u})`,{type:"error"}),null))&&mw.notify("Redirect patrolled successfully!",{type:"success"}):n?(n.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(t,i,e,a,s){let r=mw.Title.newFromText(t),n=r?`${r.getNamespaceId()===14?":":""}${r.getPrefixedText()}${r.getFragment()?`#${r.getFragment()}`:""}`:t.trim();this.pageTitleParsed.getMainText().toLocaleLowerCase().normalize("NFD").replaceAll(/[\u0300-\u036F]/g,"")===a?.toLowerCase().normalize("NFD").replaceAll(/[\u0300-\u036F]/g,"")&&(a=void 0);let o=i.map(u=>{let c=this.templateEditorsInfo.find(p=>p.name===u);if(!c)return`{{${u}}}`;let m=c.parameters.findLastIndex((p,h)=>p.name===(h+1).toString()&&p.editor.getValue().trim()),l=c.parameters.map((p,h)=>{let d=p.editor.getValue().trim();return!d&&h>m?null:`|${p.name===(h+1).toString()?"":`${p.name}=`}${d}`}).filter(Boolean).join("");return`{{${u}${l}}}`});return[`#REDIRECT [[${n}]]
`,i.length>0?`{{Redirect category shell|
${o.join(`
`)}
}}
`:null,e?e+`
`:null,a?`{{DEFAULTSORT:${a.trim()}}}`:null,s.length>0?s.map(u=>`[[Category:${u}]]`).join(`
`):null].filter(Boolean).join(`
`)}async getPageContent(t){return(await this.api.get({action:"query",formatversion:"2",prop:"revisions",rvprop:"content",rvslots:"main",titles:t})).query.pages[0].revisions[0].slots.main.content.trim()}async editOrCreate(t,i,e){let a="preferences";return this.watchCheckbox&&(this.watchCheckbox.isIndeterminate()?a=this.defaultCreatedWatchMethod:this.watchCheckbox.isSelected()?a="watch":a="unwatch"),await this.api.edit(t,()=>({text:i,summary:e})).catch((s,r)=>s==="nocreate-missing"?this.api.create(t,{summary:e,watchlist:a},i).catch((n,o)=>(mw.notify(`Error creating ${t}: ${o?.error.info??"Unknown error"} (${n})`,{type:"error"}),null)):(mw.notify(`Error editing or creating ${t}: ${r?.error.info??"Unknown error"} (${s})`,{type:"error"}),null))}}});var A=["mediawiki.util","oojs-ui-core","oojs-ui-widgets","oojs-ui-windows","oojs-ui.styles.icons-content","oojs-ui.styles.icons-editing-core"];mw.loader.using(A,async()=>{let{default:g}=await Promise.resolve().then(()=>(I(),R));class t{api=new mw.Api;redirectTemplates;contentText;pageTitle;pageTitleParsed;createdWatchMethod;async run(){if(!this.passesPreChecks())return;this.redirectTemplates=await this.fetchRedirectTemplates();let e=document.querySelector("#mw-content-text");if(!e)return mw.notify("redirect-helper: Failed to find content text element!",{type:"error"});this.contentText=e,this.pageTitle=mw.config.get("wgPageName");let a=mw.Title.newFromText(this.pageTitle);if(!a)return mw.notify("redirect-helper: Failed to parse page title!",{type:"error"});this.pageTitleParsed=a;let s=window.redirectHelperConfiguration?.createdWatchMethod;this.createdWatchMethod=s&&["nochange","preferences","unwatch","watch"].includes(s)?s:"preferences",await this.checkPageAndLoad()}passesPreChecks(){return[mw.config.get("wgNamespaceNumber")>=0,mw.config.get("wgIsProbablyEditable"),mw.config.get("wgAction")==="view"||mw.config.get("wgAction")==="edit",(mw.config.get("wgRevisionId")||mw.config.get("wgCurRevisionId"))===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(){let e=await this.api.get({action:"query",formatversion:"2",prop:"info",titles:this.pageTitle}),a={redirectTemplates:this.redirectTemplates,contentText:this.contentText,pageTitle:this.pageTitle,pageTitleParsed:this.pageTitleParsed};if(e.query.pages[0].missing){mw.util.addCSS(`
#create-redirect-button {
margin-bottom: 20px;
}`);let s=new OO.ui.ButtonWidget({id:"create-redirect-button",label:"Create redirect",icon:"articleRedirect",flags:["progressive"]});s.on("click",()=>{s.$element[0].remove(),new g(a,!1,this.createdWatchMethod).load()}),this.contentText.prepend(s.$element[0])}else if(e.query.pages[0].redirect)new g(a,!0,this.createdWatchMethod).load();else{let s=mw.util.addPortletLink(mw.config.get("skin")==="minerva"?"p-tb":"p-cactions","#","Redirect page","redirect-helper");s.addEventListener("click",r=>{r.preventDefault(),new g(a,!1,this.createdWatchMethod).load(),window.scrollTo({top:0,behavior:"smooth"}),s.remove()})}}}new t().run()});})();
// </nowiki>
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc2NyaXB0cy9yZWRpcmVjdC1oZWxwZXIvY2F0ZWdvcnktaW5wdXQtd2lkZ2V0LnRzIiwgIi4uLy4uL3NjcmlwdHMvcmVkaXJlY3QtaGVscGVyL2NoYW5nZXMtZGlhbG9nLnRzIiwgIi4uLy4uL3NjcmlwdHMvcmVkaXJlY3QtaGVscGVyL291dHB1dC1wcmV2aWV3LWRpYWxvZy50cyIsICIuLi8uLi9zY3JpcHRzL3JlZGlyZWN0LWhlbHBlci9yZWRpcmVjdC10YXJnZXQtaW5wdXQtd2lkZ2V0LnRzIiwgIi4uLy4uL3NjcmlwdHMvcmVkaXJlY3QtaGVscGVyL3JlZGlyZWN0LWhlbHBlci1kaWFsb2cudHMiLCAiLi4vLi4vc2NyaXB0cy9yZWRpcmVjdC1oZWxwZXIvcmVkaXJlY3QtaGVscGVyLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgdHlwZSB7IEFwaVF1ZXJ5QWxsUGFnZXNHZW5lcmF0b3JQYXJhbWV0ZXJzLCBDYXRlZ29yaWVzUmVzdWx0IH0gZnJvbSAnLi4vLi4vZ2xvYmFsLXR5cGVzJztcbmltcG9ydCB0eXBlIHsgTG9va3VwRWxlbWVudENvbmZpZyB9IGZyb20gJy4vcmVkaXJlY3QtdGFyZ2V0LWlucHV0LXdpZGdldCc7XG5cbi8qKlxuICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBhIGNhdGVnb3J5IGxvb2t1cCBlbGVtZW50LlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDYXRlZ29yeUlucHV0V2lkZ2V0IGV4dGVuZHMgT08udWkuVGV4dElucHV0V2lkZ2V0IHtcbiAgICAvLyBVdGlsaXR5IHZhcmlhYmxlc1xuICAgIHByaXZhdGUgYXBpID0gbmV3IG13LkFwaSgpO1xuXG4gICAgY29uc3RydWN0b3IoY29uZmlnOiBMb29rdXBFbGVtZW50Q29uZmlnKSB7XG4gICAgICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICAgICAgT08udWkubWl4aW4uTG9va3VwRWxlbWVudC5jYWxsKHRoaXMgYXMgdW5rbm93biBhcyBPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50LCBjb25maWcpO1xuICAgIH1cblxuICAgIGdldExvb2t1cFJlcXVlc3QgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpO1xuICAgICAgICBjb25zdCBkZWZlcnJlZCA9ICQuRGVmZXJyZWQoKTtcblxuICAgICAgICBpZiAoIXZhbHVlKSBkZWZlcnJlZC5yZXNvbHZlKFtdKTtcblxuICAgICAgICBjb25zdCBwYXJzZWRUaXRsZSA9IG13LlRpdGxlLm5ld0Zyb21UZXh0KHZhbHVlKTtcblxuICAgICAgICB0aGlzLmFwaVxuICAgICAgICAgICAgLmdldCh7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgICAgICBnYXBsaW1pdDogMjAsXG4gICAgICAgICAgICAgICAgZ2FwbmFtZXNwYWNlOiAxNCxcbiAgICAgICAgICAgICAgICBnYXBwcmVmaXg6IHBhcnNlZFRpdGxlPy5nZXRNYWluVGV4dCgpID8/IHZhbHVlLFxuICAgICAgICAgICAgICAgIGdlbmVyYXRvcjogJ2FsbHBhZ2VzJyxcbiAgICAgICAgICAgICAgICBwcm9wOiAnY2F0ZWdvcmllcycsXG4gICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeUFsbFBhZ2VzR2VuZXJhdG9yUGFyYW1ldGVycylcbiAgICAgICAgICAgIC5jYXRjaCgoKSA9PiBudWxsKVxuICAgICAgICAgICAgLnRoZW4oKHJlc3VsdDogQ2F0ZWdvcmllc1Jlc3VsdCB8IG51bGwpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0Py5xdWVyeT8ucGFnZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFnZXMgPSByZXN1bHQucXVlcnkucGFnZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhZ2UpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFwYWdlLmNhdGVnb3JpZXM/LnNvbWUoKGNhdGVnb3J5KSA9PiBjYXRlZ29yeS50aXRsZSA9PT0gJ0NhdGVnb3J5Oldpa2lwZWRpYSBzb2Z0IHJlZGlyZWN0ZWQgY2F0ZWdvcmllcycpLFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgocGFnZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRpdGxlV2l0aG91dE5hbWVzcGFjZSA9IHBhZ2UudGl0bGUuc3BsaXQoJzonKVsxXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHRpdGxlV2l0aG91dE5hbWVzcGFjZSwgbGFiZWw6IHRpdGxlV2l0aG91dE5hbWVzcGFjZSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdzaG93aW5nLXZhbHVlcycsIHBhZ2VzKTtcblxuICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHBhZ2VzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgZGVmZXJyZWQucmVzb2x2ZShbXSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZSh7IGFib3J0KCkge30gfSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gICAgfTtcblxuICAgIGdldExvb2t1cENhY2hlRGF0YUZyb21SZXNwb25zZSA9IDxUPihyZXNwb25zZTogVFtdIHwgbnVsbCB8IHVuZGVmaW5lZCkgPT4gcmVzcG9uc2UgPz8gW107XG5cbiAgICBnZXRMb29rdXBNZW51T3B0aW9uc0Zyb21EYXRhID0gKGRhdGE6IHsgZGF0YTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXSkgPT5cbiAgICAgICAgZGF0YS5tYXAoKHsgZGF0YSwgbGFiZWwgfSkgPT4gbmV3IE9PLnVpLk1lbnVPcHRpb25XaWRnZXQoeyBkYXRhLCBsYWJlbCB9KSk7XG59XG5cbk9iamVjdC5hc3NpZ24oQ2F0ZWdvcnlJbnB1dFdpZGdldC5wcm90b3R5cGUsIE9PLnVpLm1peGluLkxvb2t1cEVsZW1lbnQucHJvdG90eXBlKTtcbiIsICJpbXBvcnQgdHlwZSB7IEFwaUNvbXBhcmVQYWdlc1BhcmFtcyB9IGZyb20gJ3R5cGVzLW1lZGlhd2lraS9hcGlfcGFyYW1zJztcblxuLyoqXG4gKiBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGlzIGEgZGlhbG9nIHVzZWQgZm9yIHNob3dpbmcgY2hhbmdlcyB0byBiZSBtYWRlLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDaGFuZ2VzRGlhbG9nIGV4dGVuZHMgT08udWkuUHJvY2Vzc0RpYWxvZyB7XG4gICAgLy8gVXRpbGl0eSB2YXJpYWJsZXNcbiAgICBwcml2YXRlIGFwaSA9IG5ldyBtdy5BcGkoKTtcblxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZzogT08udWkuUHJvY2Vzc0RpYWxvZy5Db25maWdPcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICAgICAgQ2hhbmdlc0RpYWxvZy5zdGF0aWMubmFtZSA9ICdTaG93Q2hhbmdlc0RpYWxvZyc7XG4gICAgICAgIENoYW5nZXNEaWFsb2cuc3RhdGljLnRpdGxlID0gJ0NoYW5nZXMgdG8gYmUgbWFkZSc7XG4gICAgICAgIENoYW5nZXNEaWFsb2cuc3RhdGljLmFjdGlvbnMgPSBbeyBhY3Rpb246ICdjYW5jZWwnLCBsYWJlbDogJ0Nsb3NlJywgZmxhZ3M6IFsnc2FmZScsICdjbG9zZSddIH1dO1xuICAgIH1cblxuICAgIGdldFNldHVwUHJvY2VzcyA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIENoYW5nZXNEaWFsb2cuc3VwZXIucHJvdG90eXBlLmdldFNldHVwUHJvY2Vzcy5jYWxsKHRoaXMpLm5leHQoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgW29sZFRleHQsIG5ld1RleHRdID0gdGhpcy5nZXREYXRhKCkgYXMgc3RyaW5nW107XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFwaVxuICAgICAgICAgICAgICAgIC5wb3N0KHtcbiAgICAgICAgICAgICAgICAgICAgJ2FjdGlvbic6ICdjb21wYXJlJyxcbiAgICAgICAgICAgICAgICAgICAgJ2Zvcm1hdHZlcnNpb24nOiAnMicsXG4gICAgICAgICAgICAgICAgICAgICdwcm9wJzogWydkaWZmJ10sXG4gICAgICAgICAgICAgICAgICAgICdmcm9tc2xvdHMnOiAnbWFpbicsXG4gICAgICAgICAgICAgICAgICAgICdmcm9tdGV4dC1tYWluJzogb2xkVGV4dCxcbiAgICAgICAgICAgICAgICAgICAgJ2Zyb21jb250ZW50bW9kZWwtbWFpbic6ICd3aWtpdGV4dCcsXG4gICAgICAgICAgICAgICAgICAgICd0b3Nsb3RzJzogJ21haW4nLFxuICAgICAgICAgICAgICAgICAgICAndG90ZXh0LW1haW4nOiBuZXdUZXh0LFxuICAgICAgICAgICAgICAgICAgICAndG9jb250ZW50bW9kZWwtbWFpbic6ICd3aWtpdGV4dCcsXG4gICAgICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXBpQ29tcGFyZVBhZ2VzUGFyYW1zICYge1xuICAgICAgICAgICAgICAgICAgICAnZnJvbXRleHQtbWFpbic6IHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgJ2Zyb21jb250ZW50bW9kZWwtbWFpbic6IHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgJ3RvdGV4dC1tYWluJzogc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICAndG9jb250ZW50bW9kZWwtbWFpbic6IHN0cmluZztcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcGFyaXNvbiA9IChyZXN1bHQgYXMgeyBjb21wYXJlOiB7IGJvZHk6IHN0cmluZyB9IH0pLmNvbXBhcmUuYm9keTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBub0NoYW5nZXNFbGVtZW50ID0gbmV3IE9PLnVpLk1lc3NhZ2VXaWRnZXQoeyB0eXBlOiAnd2FybmluZycsIGxhYmVsOiAnTm8gY2hhbmdlcyB0byBtYWtlIScgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFuZWxMYXlvdXQgPSBuZXcgT08udWkuUGFuZWxMYXlvdXQoeyBwYWRkZWQ6IHRydWUsIGV4cGFuZGVkOiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgcGFuZWxMYXlvdXQuJGVsZW1lbnQuYXBwZW5kKFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyaXNvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYFxuPHRhYmxlIGNsYXNzPVwiZGlmZiBkaWZmLWVkaXRmb250LW1vbm9zcGFjZVwiPlxuICAgIDxjb2xncm91cD5cbiAgICAgICAgPGNvbCBjbGFzcz1cImRpZmYtbWFya2VyXCI+XG4gICAgICAgIDxjb2wgY2xhc3M9XCJkaWZmLWNvbnRlbnRcIj5cbiAgICAgICAgPGNvbCBjbGFzcz1cImRpZmYtbWFya2VyXCI+XG4gICAgICAgIDxjb2wgY2xhc3M9XCJkaWZmLWNvbnRlbnRcIj5cbiAgICA8L2NvbGdyb3VwPlxuICAgIDx0Ym9keT5cbiAgICAgICAgJHtjb21wYXJpc29ufVxuICAgIDwvdGJvZHk+XG48L3RhYmxlPmBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG5vQ2hhbmdlc0VsZW1lbnQuJGVsZW1lbnRbMF0sXG4gICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgKHRoaXMgYXMgdW5rbm93biBhcyB7ICRib2R5OiBKUXVlcnkgfSkuJGJvZHkuYXBwZW5kKHBhbmVsTGF5b3V0LiRlbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGdldEFjdGlvblByb2Nlc3MgPSAoYWN0aW9uOiBzdHJpbmcpID0+IHtcbiAgICAgICAgcmV0dXJuIGFjdGlvblxuICAgICAgICAgICAgPyBuZXcgT08udWkuUHJvY2VzcygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICA6IENoYW5nZXNEaWFsb2cuc3VwZXIucHJvdG90eXBlLmdldEFjdGlvblByb2Nlc3MuY2FsbCh0aGlzLCBhY3Rpb24pO1xuICAgIH07XG5cbiAgICBnZXRUZWFyZG93blByb2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiBDaGFuZ2VzRGlhbG9nLnN1cGVyLnByb3RvdHlwZS5nZXRUZWFyZG93blByb2Nlc3MuY2FsbCh0aGlzKS5uZXh0KCgpID0+IHtcbiAgICAgICAgICAgICh0aGlzIGFzIHVua25vd24gYXMgeyAkYm9keTogSlF1ZXJ5IH0pLiRib2R5LmVtcHR5KCk7XG4gICAgICAgIH0pO1xuICAgIH07XG59XG5cbk9iamVjdC5hc3NpZ24oQ2hhbmdlc0RpYWxvZy5wcm90b3R5cGUsIE9PLnVpLlByb2Nlc3NEaWFsb2cucHJvdG90eXBlKTtcbiIsICJpbXBvcnQgdHlwZSB7IEFwaVBhcnNlUGFyYW1zIH0gZnJvbSAndHlwZXMtbWVkaWF3aWtpL2FwaV9wYXJhbXMnO1xuXG4vKipcbiAqIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaXMgYSBkaWFsb2cgdXNlZCBmb3IgcHJldmlld2luZyB0ZW1wbGF0ZSBvdXRwdXQuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE91dHB1dFByZXZpZXdEaWFsb2cgZXh0ZW5kcyBPTy51aS5Qcm9jZXNzRGlhbG9nIHtcbiAgICAvLyBVdGlsaXR5IHZhcmlhYmxlc1xuICAgIHByaXZhdGUgYXBpID0gbmV3IG13LkFwaSgpO1xuXG4gICAgLy8gQXNzaWduZWQgaW4gY29uc3RydWN0b3JcbiAgICBwcml2YXRlIHBhZ2VUaXRsZVBhcnNlZDogbXcuVGl0bGU7XG5cbiAgICBjb25zdHJ1Y3Rvcihjb25maWc6IE9PLnVpLlByb2Nlc3NEaWFsb2cuQ29uZmlnT3B0aW9ucywgcGFnZVRpdGxlUGFyc2VkOiBtdy5UaXRsZSkge1xuICAgICAgICBzdXBlcihjb25maWcpO1xuXG4gICAgICAgIHRoaXMucGFnZVRpdGxlUGFyc2VkID0gcGFnZVRpdGxlUGFyc2VkO1xuXG4gICAgICAgIE91dHB1dFByZXZpZXdEaWFsb2cuc3RhdGljLm5hbWUgPSAnT3V0cHV0UHJldmlld0RpYWxvZyc7XG4gICAgICAgIE91dHB1dFByZXZpZXdEaWFsb2cuc3RhdGljLnRpdGxlID0gJ1JlZGlyZWN0IGNhdGVnb3JpemF0aW9uIHRlbXBsYXRlcyBwcmV2aWV3JztcbiAgICAgICAgT3V0cHV0UHJldmlld0RpYWxvZy5zdGF0aWMuYWN0aW9ucyA9IFt7IGFjdGlvbjogJ2NhbmNlbCcsIGxhYmVsOiAnQ2xvc2UnLCBmbGFnczogWydzYWZlJywgJ2Nsb3NlJ10gfV07XG4gICAgfVxuXG4gICAgZ2V0U2V0dXBQcm9jZXNzID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gT3V0cHV0UHJldmlld0RpYWxvZy5zdXBlci5wcm90b3R5cGUuZ2V0U2V0dXBQcm9jZXNzLmNhbGwodGhpcykubmV4dCgoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hcGlcbiAgICAgICAgICAgICAgICAucG9zdCh7XG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ3BhcnNlJyxcbiAgICAgICAgICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50bW9kZWw6ICd3aWtpdGV4dCcsXG4gICAgICAgICAgICAgICAgICAgIHByb3A6IFsndGV4dCcsICdjYXRlZ29yaWVzaHRtbCddLFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGhpcy5wYWdlVGl0bGVQYXJzZWQuZ2V0UHJlZml4ZWREYigpLFxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiB0aGlzLmdldERhdGEoKSBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUGFyc2VQYXJhbXMpXG4gICAgICAgICAgICAgICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YWdzQ29udGVudCA9IChyZXN1bHQgYXMgeyBwYXJzZTogeyB0ZXh0OiBzdHJpbmcgfSB9KS5wYXJzZS50ZXh0O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXRlZ29yaWVzQ29udGVudCA9IChyZXN1bHQgYXMgeyBwYXJzZTogeyBjYXRlZ29yaWVzaHRtbDogc3RyaW5nIH0gfSkucGFyc2UuY2F0ZWdvcmllc2h0bWw7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFuZWxMYXlvdXQgPSBuZXcgT08udWkuUGFuZWxMYXlvdXQoeyBwYWRkZWQ6IHRydWUsIGV4cGFuZGVkOiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgcGFuZWxMYXlvdXQuJGVsZW1lbnQuYXBwZW5kKHRhZ3NDb250ZW50LCBjYXRlZ29yaWVzQ29udGVudCk7XG5cbiAgICAgICAgICAgICAgICAgICAgKHRoaXMgYXMgdW5rbm93biBhcyB7ICRib2R5OiBKUXVlcnkgfSkuJGJvZHkuYXBwZW5kKHBhbmVsTGF5b3V0LiRlbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGdldEFjdGlvblByb2Nlc3MgPSAoYWN0aW9uOiBzdHJpbmcpID0+IHtcbiAgICAgICAgcmV0dXJuIGFjdGlvblxuICAgICAgICAgICAgPyBuZXcgT08udWkuUHJvY2VzcygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICA6IE91dHB1dFByZXZpZXdEaWFsb2cuc3VwZXIucHJvdG90eXBlLmdldEFjdGlvblByb2Nlc3MuY2FsbCh0aGlzLCBhY3Rpb24pO1xuICAgIH07XG5cbiAgICBnZXRUZWFyZG93blByb2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiBPdXRwdXRQcmV2aWV3RGlhbG9nLnN1cGVyLnByb3RvdHlwZS5nZXRUZWFyZG93blByb2Nlc3MuY2FsbCh0aGlzKS5uZXh0KCgpID0+IHtcbiAgICAgICAgICAgICh0aGlzIGFzIHVua25vd24gYXMgeyAkYm9keTogSlF1ZXJ5IH0pLiRib2R5LmVtcHR5KCk7XG4gICAgICAgIH0pO1xuICAgIH07XG59XG5cbk9iamVjdC5hc3NpZ24oT3V0cHV0UHJldmlld0RpYWxvZy5wcm90b3R5cGUsIE9PLnVpLlByb2Nlc3NEaWFsb2cucHJvdG90eXBlKTtcbiIsICJpbXBvcnQgdHlwZSB7IEFwaVBhcnNlUGFyYW1zIH0gZnJvbSAndHlwZXMtbWVkaWF3aWtpL2FwaV9wYXJhbXMnO1xuaW1wb3J0IHR5cGUgeyBBcGlRdWVyeUFsbFBhZ2VzR2VuZXJhdG9yUGFyYW1ldGVycywgUGFnZVBhcnNlUmVzdWx0IH0gZnJvbSAnLi4vLi4vZ2xvYmFsLXR5cGVzJztcblxuZXhwb3J0IGludGVyZmFjZSBMb29rdXBFbGVtZW50Q29uZmlnIGV4dGVuZHMgT08udWkuVGV4dElucHV0V2lkZ2V0LkNvbmZpZ09wdGlvbnMsIE9PLnVpLm1peGluLkxvb2t1cEVsZW1lbnQuQ29uZmlnT3B0aW9ucyB7fVxuXG4vKipcbiAqIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaXMgYSB0aXRsZSBsb29rdXAgZWxlbWVudC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVkaXJlY3RUYXJnZXRJbnB1dFdpZGdldCBleHRlbmRzIE9PLnVpLlRleHRJbnB1dFdpZGdldCB7XG4gICAgLy8gVXRpbGl0eSB2YXJpYWJsZXNcbiAgICBwcml2YXRlIGFwaSA9IG5ldyBtdy5BcGkoKTtcblxuICAgIC8vIEFzc2lnbmVkIGluIGNvbnN0cnVjdG9yXG4gICAgcHJpdmF0ZSBwYWdlVGl0bGVQYXJzZWQ6IG13LlRpdGxlO1xuXG4gICAgY29uc3RydWN0b3IoY29uZmlnOiBMb29rdXBFbGVtZW50Q29uZmlnLCBwYWdlVGl0bGVQYXJzZWQ6IG13LlRpdGxlKSB7XG4gICAgICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICAgICAgT08udWkubWl4aW4uTG9va3VwRWxlbWVudC5jYWxsKHRoaXMgYXMgdW5rbm93biBhcyBPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50LCBjb25maWcpO1xuXG4gICAgICAgIHRoaXMucGFnZVRpdGxlUGFyc2VkID0gcGFnZVRpdGxlUGFyc2VkO1xuICAgIH1cblxuICAgIGdldExvb2t1cFJlcXVlc3QgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpO1xuICAgICAgICBjb25zdCBkZWZlcnJlZCA9ICQuRGVmZXJyZWQoKTtcblxuICAgICAgICBpZiAoIXZhbHVlKSBkZWZlcnJlZC5yZXNvbHZlKFtdKTtcbiAgICAgICAgZWxzZSBpZiAodmFsdWUuaW5jbHVkZXMoJyMnKSkge1xuICAgICAgICAgICAgY29uc3QgdGl0bGUgPSB2YWx1ZS5zcGxpdCgnIycpWzBdO1xuXG4gICAgICAgICAgICB0aGlzLmFwaVxuICAgICAgICAgICAgICAgIC5nZXQoeyBhY3Rpb246ICdwYXJzZScsIHBhZ2U6IHRpdGxlLCBwcm9wOiAnc2VjdGlvbnMnLCByZWRpcmVjdHM6IHRydWUgfSBzYXRpc2ZpZXMgQXBpUGFyc2VQYXJhbXMpXG4gICAgICAgICAgICAgICAgLmNhdGNoKCgpID0+IG51bGwpXG4gICAgICAgICAgICAgICAgLnRoZW4oKHJlc3VsdDogUGFnZVBhcnNlUmVzdWx0IHwgbnVsbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXRjaGVkU2VjdGlvbnMgPSByZXN1bHQucGFyc2Uuc2VjdGlvbnMuZmlsdGVyKChzZWN0aW9uKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb24ubGluZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZUFsbCgvPFxcLz9pPi9nLCAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0YXJ0c1dpdGgodmFsdWUuc3BsaXQoJyMnKVsxXS50b0xvd2VyQ2FzZSgpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZWRTZWN0aW9ucy5tYXAoKHNlY3Rpb24pID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGAke3Jlc3VsdC5wYXJzZS50aXRsZX0jJHtzZWN0aW9uLmxpbmUucmVwbGFjZUFsbCgvPFxcLz9pPi9nLCAnJyl9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGAke3Jlc3VsdC5wYXJzZS50aXRsZX0jJHtzZWN0aW9uLmxpbmUucmVwbGFjZUFsbCgvPFxcLz9pPi9nLCAnJyl9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgZGVmZXJyZWQucmVzb2x2ZShbXSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWRUaXRsZSA9IG13LlRpdGxlLm5ld0Zyb21UZXh0KHZhbHVlKTtcblxuICAgICAgICAgICAgdGhpcy5hcGlcbiAgICAgICAgICAgICAgICAuZ2V0KHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICAgICAgICAgIGdhcGxpbWl0OiAyMCxcbiAgICAgICAgICAgICAgICAgICAgZ2FwbmFtZXNwYWNlOiBwYXJzZWRUaXRsZT8uZ2V0TmFtZXNwYWNlSWQoKSA/PyAwLFxuICAgICAgICAgICAgICAgICAgICBnYXBwcmVmaXg6IHBhcnNlZFRpdGxlPy5nZXRNYWluVGV4dCgpID8/IHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBnZW5lcmF0b3I6ICdhbGxwYWdlcycsXG4gICAgICAgICAgICAgICAgICAgIHByb3A6IFsnaW5mbycsICdwYWdlcHJvcHMnXSxcbiAgICAgICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeUFsbFBhZ2VzR2VuZXJhdG9yUGFyYW1ldGVycylcbiAgICAgICAgICAgICAgICAuY2F0Y2goKCkgPT4gbnVsbClcbiAgICAgICAgICAgICAgICAudGhlbihcbiAgICAgICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnk6IHsgcGFnZXM6IHsgdGl0bGU6IHN0cmluZzsgcGFnZXByb3BzOiB7IGRpc2FtYmlndWF0aW9uPzogc3RyaW5nIH07IHJlZGlyZWN0Pzogc3RyaW5nIH1bXSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSB8IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucXVlcnkucGFnZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKHBhZ2UpID0+IHBhZ2UudGl0bGUgIT09IHRoaXMucGFnZVRpdGxlUGFyc2VkLmdldFByZWZpeGVkVGV4dCgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgocGFnZSkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBwYWdlLnRpdGxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBuZXcgT08udWkuSHRtbFNuaXBwZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAke3BhZ2UudGl0bGV9JHsnZGlzYW1iaWd1YXRpb24nIGluIHBhZ2UucGFnZXByb3BzID8gJyA8aT4oZGlzYW1iaWd1YXRpb24pPC9pPicgOiAnJ30keydyZWRpcmVjdCcgaW4gcGFnZSA/ICcgPGk+KHJlZGlyZWN0KTwvaT4nIDogJyd9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGRlZmVycmVkLnJlc29sdmUoW10pO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZSh7IGFib3J0KCkge30gfSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gICAgfTtcblxuICAgIGdldExvb2t1cENhY2hlRGF0YUZyb21SZXNwb25zZSA9IDxUPihyZXNwb25zZTogVFtdIHwgbnVsbCB8IHVuZGVmaW5lZCkgPT4gcmVzcG9uc2UgPz8gW107XG5cbiAgICBnZXRMb29rdXBNZW51T3B0aW9uc0Zyb21EYXRhID0gKGRhdGE6IHsgZGF0YTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXSkgPT5cbiAgICAgICAgZGF0YS5tYXAoKHsgZGF0YSwgbGFiZWwgfSkgPT4gbmV3IE9PLnVpLk1lbnVPcHRpb25XaWRnZXQoeyBkYXRhLCBsYWJlbCB9KSk7XG59XG5cbk9iamVjdC5hc3NpZ24oUmVkaXJlY3RUYXJnZXRJbnB1dFdpZGdldC5wcm90b3R5cGUsIE9PLnVpLm1peGluLkxvb2t1cEVsZW1lbnQucHJvdG90eXBlKTtcbiIsICJpbXBvcnQgdHlwZSB7XG4gICAgQXBpUGFyc2VQYXJhbXMsXG4gICAgQXBpUXVlcnlJbmZvUGFyYW1zLFxuICAgIEFwaVF1ZXJ5UGFnZVByb3BzUGFyYW1zLFxuICAgIEFwaVF1ZXJ5UmV2aXNpb25zUGFyYW1zLFxuICAgIFBhZ2VUcmlhZ2VBcGlQYWdlVHJpYWdlTGlzdFBhcmFtcyxcbn0gZnJvbSAndHlwZXMtbWVkaWF3aWtpL2FwaV9wYXJhbXMnO1xuaW1wb3J0IHR5cGUge1xuICAgIENhdGVnb3JpZXNSZXN1bHQsXG4gICAgTWVkaWFXaWtpRGF0YUVycm9yLFxuICAgIFBhZ2VJbmZvUmVzdWx0LFxuICAgIFBhZ2VQYXJzZVJlc3VsdCxcbiAgICBQYWdlUmV2aXNpb25zUmVzdWx0LFxuICAgIFBhZ2VUcmlhZ2VMaXN0UmVzcG9uc2UsXG4gICAgUGFnZXByb3BzUmVzdWx0LFxufSBmcm9tICcuLi8uLi9nbG9iYWwtdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBXYXRjaE1ldGhvZCB9IGZyb20gJy4uL2FmY3JjLWhlbHBlci9hZmNyYy1oZWxwZXInO1xuaW1wb3J0IENhdGVnb3J5SW5wdXRXaWRnZXQgZnJvbSAnLi9jYXRlZ29yeS1pbnB1dC13aWRnZXQnO1xuaW1wb3J0IENoYW5nZXNEaWFsb2cgZnJvbSAnLi9jaGFuZ2VzLWRpYWxvZyc7XG5pbXBvcnQgT3V0cHV0UHJldmlld0RpYWxvZyBmcm9tICcuL291dHB1dC1wcmV2aWV3LWRpYWxvZyc7XG5pbXBvcnQgUmVkaXJlY3RUYXJnZXRJbnB1dFdpZGdldCBmcm9tICcuL3JlZGlyZWN0LXRhcmdldC1pbnB1dC13aWRnZXQnO1xuXG5leHBvcnQgdHlwZSBSZWRpcmVjdFRlbXBsYXRlRGF0YSA9IFJlY29yZDxzdHJpbmcsIHsgcmVkaXJlY3Q/OiB0cnVlOyBwYXJhbWV0ZXJzOiBSZWRpcmVjdFRlbXBsYXRlUGFyYW1ldGVyczsgYWxpYXNlczogc3RyaW5nW10gfT47XG5cbnR5cGUgUmVkaXJlY3RUZW1wbGF0ZVBhcmFtZXRlcnMgPSBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIHtcbiAgICAgICAgYWxpYXNlczogc3RyaW5nW107XG4gICAgICAgIGxhYmVsOiBzdHJpbmcgfCBudWxsO1xuICAgICAgICBkZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAgICAgdHlwZTogc3RyaW5nO1xuICAgICAgICByZXF1aXJlZDogYm9vbGVhbjtcbiAgICAgICAgc3VnZ2VzdGVkOiBib29sZWFuO1xuICAgICAgICBkZWZhdWx0OiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbDtcbiAgICAgICAgZXhhbXBsZTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGw7XG4gICAgfVxuPjtcblxuZXhwb3J0IGludGVyZmFjZSBUZW1wbGF0ZUVkaXRvckVsZW1lbnRJbmZvIHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgZGV0YWlsczogSFRNTERldGFpbHNFbGVtZW50O1xuICAgIHBhcmFtZXRlcnM6IHsgbmFtZTogc3RyaW5nOyBhbGlhc2VzOiBzdHJpbmdbXTsgZWRpdG9yOiBPTy51aS5UZXh0SW5wdXRXaWRnZXQgfVtdO1xufVxuXG4vKipcbiAqIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaGFuZGxlcyB0aGUgZGlhbG9nIHBvcnRpb24gb2YgcmVkaXJlY3QtaGVscGVyIHNjcmlwdC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVkaXJlY3RIZWxwZXJEaWFsb2cge1xuICAgIC8vIFV0aWxpdHkgdmFyaWFibGVzXG4gICAgcHJpdmF0ZSBhcGkgPSBuZXcgbXcuQXBpKCk7XG4gICAgcHJpdmF0ZSByZWRpcmVjdFJlZ2V4ID0gL14jLio/Oj9cXHMqXFxbXFxbXFxzKjo/KFteW1xcXXt8fV0rPylcXHMqKD86XFx8W15bXFxde3x9XSs/KT9dXVxccyovaTtcbiAgICBwcml2YXRlIHNjcmlwdE1lc3NhZ2UgPSAnICh2aWEgW1t3OmVuOlVzZXI6RWVqaXQ0My9zY3JpcHRzL3JlZGlyZWN0LWhlbHBlcnxyZWRpcmVjdC1oZWxwZXJdXSknO1xuXG4gICAgLy8gQXNzaWduZWQgaW4gY29uc3RydWN0b3JcbiAgICBwcml2YXRlIHJlZGlyZWN0VGVtcGxhdGVzOiBSZWRpcmVjdFRlbXBsYXRlRGF0YTtcbiAgICBwcml2YXRlIGNvbnRlbnRUZXh0OiBIVE1MRGl2RWxlbWVudDtcbiAgICBwcml2YXRlIHBhZ2VUaXRsZTogc3RyaW5nO1xuICAgIHByaXZhdGUgcGFnZVRpdGxlUGFyc2VkOiBtdy5UaXRsZTtcblxuICAgIHByaXZhdGUgZXhpc3RzOiBib29sZWFuO1xuICAgIHByaXZhdGUgZGVmYXVsdENyZWF0ZWRXYXRjaE1ldGhvZDogV2F0Y2hNZXRob2Q7XG5cbiAgICAvLyBVc2VkIGR1cmluZyBydW4oKVxuICAgIHByaXZhdGUgbmVlZHNDaGVjayA9IHRydWU7XG5cbiAgICBwcml2YXRlIGVkaXRvckJveCE6IE9PLnVpLlBhbmVsTGF5b3V0O1xuICAgIHByaXZhdGUgc3luY1dpdGhNYWluQnV0dG9uPzogT08udWkuQnV0dG9uV2lkZ2V0O1xuICAgIHByaXZhdGUgcmVkaXJlY3RJbnB1dCE6IFJlZGlyZWN0VGFyZ2V0SW5wdXRXaWRnZXQ7XG4gICAgcHJpdmF0ZSByZWRpcmVjdElucHV0TGF5b3V0ITogT08udWkuRmllbGRMYXlvdXQ7XG4gICAgcHJpdmF0ZSB0YWdTZWxlY3QhOiBPTy51aS5NZW51VGFnTXVsdGlzZWxlY3RXaWRnZXQ7XG4gICAgcHJpdmF0ZSB0YWdTZWxlY3RMYXlvdXQhOiBPTy51aS5BY3Rpb25GaWVsZExheW91dDtcbiAgICBwcml2YXRlIHRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvciE6IEhUTUxEZXRhaWxzRWxlbWVudDtcbiAgICBwcml2YXRlIHRlbXBsYXRlRWRpdG9yc0luZm86IFRlbXBsYXRlRWRpdG9yRWxlbWVudEluZm9bXSA9IFtdO1xuICAgIHByaXZhdGUgY2F0ZWdvcnlTZWxlY3QhOiBPTy51aS5UYWdNdWx0aXNlbGVjdFdpZGdldDtcbiAgICBwcml2YXRlIGNhdGVnb3J5U2VsZWN0SW5wdXQhOiBDYXRlZ29yeUlucHV0V2lkZ2V0O1xuICAgIHByaXZhdGUgY2F0ZWdvcnlTZWxlY3RMYXlvdXQhOiBPTy51aS5GaWVsZExheW91dDtcbiAgICBwcml2YXRlIGRlZmF1bHRTb3J0SW5wdXQhOiBPTy51aS5UZXh0SW5wdXRXaWRnZXQ7XG4gICAgcHJpdmF0ZSBkZWZhdWx0U29ydFN1Z2dlc3RCdXR0b24hOiBPTy51aS5CdXR0b25XaWRnZXQ7XG4gICAgcHJpdmF0ZSBkZWZhdWx0U29ydElucHV0TGF5b3V0ITogT08udWkuQWN0aW9uRmllbGRMYXlvdXQ7XG4gICAgcHJpdmF0ZSBzdW1tYXJ5SW5wdXQhOiBPTy51aS5Db21ib0JveElucHV0V2lkZ2V0O1xuICAgIHByaXZhdGUgc3VtbWFyeUlucHV0TGF5b3V0ITogT08udWkuRmllbGRMYXlvdXQ7XG4gICAgcHJpdmF0ZSBzdWJtaXRCdXR0b24hOiBPTy51aS5CdXR0b25XaWRnZXQ7XG4gICAgcHJpdmF0ZSBzaG93Q2hhbmdlc0J1dHRvbiE6IE9PLnVpLkJ1dHRvbldpZGdldDtcbiAgICBwcml2YXRlIHNob3dQcmV2aWV3QnV0dG9uITogT08udWkuQnV0dG9uV2lkZ2V0O1xuICAgIHByaXZhdGUgc3luY1RhbGtDaGVja2JveD86IE9PLnVpLkNoZWNrYm94SW5wdXRXaWRnZXQ7XG4gICAgcHJpdmF0ZSBzeW5jVGFsa0NoZWNrYm94TGF5b3V0PzogT08udWkuV2lkZ2V0O1xuICAgIHByaXZhdGUgd2F0Y2hDaGVja2JveD86IE9PLnVpLkNoZWNrYm94SW5wdXRXaWRnZXQ7XG4gICAgcHJpdmF0ZSB3YXRjaENoZWNrYm94TGF5b3V0PzogT08udWkuV2lkZ2V0O1xuICAgIHByaXZhdGUgcGF0cm9sQ2hlY2tib3g/OiBPTy51aS5DaGVja2JveElucHV0V2lkZ2V0O1xuICAgIHByaXZhdGUgcGF0cm9sQ2hlY2tib3hMYXlvdXQ/OiBPTy51aS5XaWRnZXQ7XG4gICAgcHJpdmF0ZSBzdWJtaXRMYXlvdXQhOiBPTy51aS5Ib3Jpem9udGFsTGF5b3V0O1xuXG4gICAgcHJpdmF0ZSB0YWxrRGF0YT86IFBhZ2VJbmZvUmVzdWx0O1xuXG4gICAgcHJpdmF0ZSBwYWdlQ29udGVudCA9ICcnO1xuXG4gICAgcHJpdmF0ZSBvbGRSZWRpcmVjdFRhcmdldD86IHN0cmluZztcbiAgICBwcml2YXRlIG9sZFJlZGlyZWN0VGFncz86IHN0cmluZ1tdO1xuICAgIHByaXZhdGUgb2xkUmVkaXJlY3RUYWdEYXRhPzogUmVjb3JkPHN0cmluZywgc3RyaW5nW11bXT47XG4gICAgcHJpdmF0ZSBvbGREZWZhdWx0U29ydD86IHN0cmluZztcbiAgICBwcml2YXRlIG9sZENhdGVnb3JpZXM/OiBzdHJpbmdbXTtcbiAgICBwcml2YXRlIG9sZFN0cmF5VGV4dD86IHN0cmluZztcblxuICAgIHByaXZhdGUgcGFyc2VkRGVzdGluYXRpb24hOiBtdy5UaXRsZSB8IG51bGw7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAge1xuICAgICAgICAgICAgcmVkaXJlY3RUZW1wbGF0ZXMsXG4gICAgICAgICAgICBjb250ZW50VGV4dCxcbiAgICAgICAgICAgIHBhZ2VUaXRsZSxcbiAgICAgICAgICAgIHBhZ2VUaXRsZVBhcnNlZCxcbiAgICAgICAgfTogeyByZWRpcmVjdFRlbXBsYXRlczogUmVkaXJlY3RUZW1wbGF0ZURhdGE7IGNvbnRlbnRUZXh0OiBIVE1MRGl2RWxlbWVudDsgcGFnZVRpdGxlOiBzdHJpbmc7IHBhZ2VUaXRsZVBhcnNlZDogbXcuVGl0bGUgfSxcbiAgICAgICAgZXhpc3RzOiBib29sZWFuLFxuICAgICAgICBjcmVhdGVkV2F0Y2hNZXRob2Q6IFdhdGNoTWV0aG9kLFxuICAgICkge1xuICAgICAgICB0aGlzLnJlZGlyZWN0VGVtcGxhdGVzID0gcmVkaXJlY3RUZW1wbGF0ZXM7XG4gICAgICAgIHRoaXMuY29udGVudFRleHQgPSBjb250ZW50VGV4dDtcbiAgICAgICAgdGhpcy5wYWdlVGl0bGUgPSBwYWdlVGl0bGU7XG4gICAgICAgIHRoaXMucGFnZVRpdGxlUGFyc2VkID0gcGFnZVRpdGxlUGFyc2VkO1xuXG4gICAgICAgIHRoaXMuZXhpc3RzID0gZXhpc3RzO1xuXG4gICAgICAgIHRoaXMuZGVmYXVsdENyZWF0ZWRXYXRjaE1ldGhvZCA9IGNyZWF0ZWRXYXRjaE1ldGhvZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkcyB0aGUgcmVkaXJlY3QtaGVscGVyIGRpYWxvZyBpbnRvIHRoZSBwYWdlLlxuICAgICAqL1xuICAgIGFzeW5jIGxvYWQoKSB7XG4gICAgICAgIG13LnV0aWwuYWRkQ1NTKGBcbiNjcmVhdGUtcmVkaXJlY3QtYnV0dG9uIHtcbiAgICBtYXJnaW4tYm90dG9tOiAyMHB4O1xufVxuXG4jcmVkaXJlY3QtaGVscGVyLWJveCB7XG4gICAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xuICAgIG1hcmdpbi1ib3R0b206IDI1cHggIWltcG9ydGFudDtcbiAgICBtYXJnaW4tbGVmdDogYXV0bztcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZXNtb2tlO1xuICAgIHdpZHRoOiA3MDBweDtcbiAgICBtYXgtd2lkdGg6IGNhbGMoMTAwJSAtIDUwcHgpO1xuICAgIGNvbG9yOiAjMjAyMTIyO1xufVxuXG4ucmVkaXJlY3QtaW5wdXQtbGF5b3V0IGxhYmVsIHtcbiAgICBmb250LXdlaWdodDogYm9sZDtcbn1cblxuLnJlZGlyZWN0LWhlbHBlci1yZWRpcmVjdC1wb3NzaWJpbGl0aWVzOjphZnRlciB7XG4gICAgY29udGVudDogXCIgKHJlZGlyZWN0IHdpdGggcG9zc2liaWxpdGllcylcIjtcbiAgICBmb250LXN0eWxlOiBpdGFsaWM7XG59XG5cbi5yZWRpcmVjdC1oZWxwZXItdGVtcGxhdGUtcGFyYW1ldGVycy1jb250YWluZXIsXG4ucmVkaXJlY3QtaGVscGVyLXRlbXBsYXRlLXBhcmFtZXRlcnMtY29udGFpbmVyIGRldGFpbHMge1xuICAgIG1hcmdpbi1ibG9jazogMTBweDtcbiAgICBib3JkZXItcmFkaXVzOiA1cHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2UyZTJlMjtcbiAgICBwYWRkaW5nOiA1cHg7XG59XG5cbi5yZWRpcmVjdC1oZWxwZXItdGVtcGxhdGUtcGFyYW1ldGVycy1jb250YWluZXIgc3VtbWFyeSB7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuXG4ucmVkaXJlY3QtaGVscGVyLXRlbXBsYXRlLXBhcmFtZXRlcnMtY29udGFpbmVyIGRldGFpbHMge1xuICAgIG1hcmdpbi1ibG9jazogNXB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNkMWNlY2U7XG59XG5cbiNyZWRpcmVjdC1oZWxwZXItbm8tdGVtcGxhdGVzLW1lc3NhZ2Uge1xuICAgIHBhZGRpbmc6IDVweDtcbn1cblxuI3JlZGlyZWN0LWhlbHBlci1zdW1tYXJ5LWxheW91dCB7XG4gICAgbWFyZ2luLXRvcDogMTVweDtcbiAgICBib3JkZXItdG9wOiAxcHggc29saWQgZ3JheTtcbiAgICBwYWRkaW5nLXRvcDogMTBweDtcbn1cblxuI3JlZGlyZWN0LWhlbHBlci1zdWJtaXQtbGF5b3V0IHtcbiAgICBtYXJnaW4tdG9wOiAxMHB4O1xufVxuXG4jcmVkaXJlY3QtaGVscGVyLXN1Ym1pdC1sYXlvdXQgPiAqIHtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xufVxuXG4ucmVkaXJlY3QtaGVscGVyLXdhcm5pbmcge1xuICAgIG1hcmdpbi10b3A6IDhweDtcbn1cblxuLnJlZGlyZWN0LWhlbHBlci1hdXRvZml4LWJ1dHRvbiB7XG4gICAgbWFyZ2luLWxlZnQ6IDVweDtcbiAgICBmb250LXNpemU6IDEycHg7XG59XG5cbi5yZWRpcmVjdC1oZWxwZXItYXV0b2ZpeC1idXR0b24gYSB7XG4gICAgcGFkZGluZzogM3B4IDRweCAhaW1wb3J0YW50O1xuICAgIG1pbi1oZWlnaHQ6IHVuc2V0ICFpbXBvcnRhbnQ7XG59YCk7XG5cbiAgICAgICAgbXcubG9hZGVyLmFkZExpbmtUYWcoJ2h0dHBzOi8vd3d3Lm1lZGlhd2lraS5vcmcvdy9sb2FkLnBocD9tb2R1bGVzPW1lZGlhd2lraS5kaWZmLnN0eWxlcyZvbmx5PXN0eWxlcycpO1xuXG4gICAgICAgIC8qIExvYWQgZWxlbWVudHMgKi9cbiAgICAgICAgdGhpcy5lZGl0b3JCb3ggPSBuZXcgT08udWkuUGFuZWxMYXlvdXQoeyBpZDogJ3JlZGlyZWN0LWhlbHBlci1ib3gnLCBwYWRkZWQ6IHRydWUsIGV4cGFuZGVkOiBmYWxzZSwgZnJhbWVkOiB0cnVlIH0pO1xuXG4gICAgICAgIGlmICh0aGlzLnBhZ2VUaXRsZVBhcnNlZC5pc1RhbGtQYWdlKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IG1haW5QYWdlRGF0YSA9IChhd2FpdCB0aGlzLmFwaS5nZXQoe1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICAgICAgcHJvcDogJ2luZm8nLFxuICAgICAgICAgICAgICAgIHRpdGxlczogdGhpcy5wYWdlVGl0bGVQYXJzZWQuZ2V0U3ViamVjdFBhZ2UoKSEuZ2V0UHJlZml4ZWRUZXh0KCksXG4gICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeUluZm9QYXJhbXMpKSBhcyBQYWdlSW5mb1Jlc3VsdDtcblxuICAgICAgICAgICAgaWYgKG1haW5QYWdlRGF0YS5xdWVyeSEucGFnZXNbMF0ucmVkaXJlY3QpIGF3YWl0IHRoaXMubG9hZFN5bmNXaXRoTWFpbkJ1dHRvbigpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5sb2FkSW5wdXRFbGVtZW50cygpO1xuICAgICAgICBhd2FpdCB0aGlzLmxvYWRTdWJtaXRFbGVtZW50cygpO1xuXG4gICAgICAgIC8qIEFkZCBlbGVtZW50cyB0byBzY3JlZW4gYW5kIGxvYWQgZGF0YSAoaWYgYXBwbGljYWJsZSkgKi9cbiAgICAgICAgdGhpcy5lZGl0b3JCb3guJGVsZW1lbnRbMF0uYXBwZW5kKFxuICAgICAgICAgICAgLi4uKFtcbiAgICAgICAgICAgICAgICB0aGlzLnN5bmNXaXRoTWFpbkJ1dHRvbj8uJGVsZW1lbnRbMF0sXG4gICAgICAgICAgICAgICAgdGhpcy5yZWRpcmVjdElucHV0TGF5b3V0LiRlbGVtZW50WzBdLFxuICAgICAgICAgICAgICAgIHRoaXMudGFnU2VsZWN0TGF5b3V0LiRlbGVtZW50WzBdLFxuICAgICAgICAgICAgICAgIHRoaXMudGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yLFxuICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNvcnRJbnB1dExheW91dC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0TGF5b3V0LiRlbGVtZW50WzBdLFxuICAgICAgICAgICAgICAgIHRoaXMuc3VtbWFyeUlucHV0TGF5b3V0LiRlbGVtZW50WzBdLFxuICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0TGF5b3V0LiRlbGVtZW50WzBdLFxuICAgICAgICAgICAgXS5maWx0ZXIoQm9vbGVhbikgYXMgSFRNTEVsZW1lbnRbXSksXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5jb250ZW50VGV4dC5wcmVwZW5kKHRoaXMuZWRpdG9yQm94LiRlbGVtZW50WzBdKTtcblxuICAgICAgICBpZiAodGhpcy5leGlzdHMpIHZvaWQgdGhpcy5sb2FkRXhpc3RpbmdEYXRhKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZHMgdGhlIFwiU3luYyB3aXRoIG1haW4gcGFnZVwiIGJ1dHRvblwiIG9uIHRhbGsgcGFnZXMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBsb2FkU3luY1dpdGhNYWluQnV0dG9uKCkge1xuICAgICAgICBjb25zdCBtYWluUGFnZUNvbnRlbnQgPSBhd2FpdCB0aGlzLmdldFBhZ2VDb250ZW50KHRoaXMucGFnZVRpdGxlUGFyc2VkLmdldFN1YmplY3RQYWdlKCkhLmdldFByZWZpeGVkVGV4dCgpKTtcblxuICAgICAgICB0aGlzLnN5bmNXaXRoTWFpbkJ1dHRvbiA9IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoeyBsYWJlbDogJ1N5bmMgd2l0aCBtYWluIHBhZ2UnLCBpY29uOiAnbGluaycsIGZsYWdzOiBbJ3Byb2dyZXNzaXZlJ10gfSk7XG4gICAgICAgIHRoaXMuc3luY1dpdGhNYWluQnV0dG9uLm9uKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMucmVkaXJlY3RSZWdleC5leGVjKG1haW5QYWdlQ29udGVudCk/LlsxXTtcbiAgICAgICAgICAgIGlmICghdGFyZ2V0KSByZXR1cm4gbXcubm90aWZ5KCdGYWlsZWQgdG8gcGFyc2UgbWFpbiBwYWdlIGNvbnRlbnQhJywgeyB0eXBlOiAnZXJyb3InIH0pO1xuXG4gICAgICAgICAgICB0aGlzLnJlZGlyZWN0SW5wdXQuc2V0VmFsdWUobXcuVGl0bGUubmV3RnJvbVRleHQodGFyZ2V0KT8uZ2V0VGFsa1BhZ2UoKT8uZ2V0UHJlZml4ZWRUZXh0KCkgPz8gJycpO1xuICAgICAgICAgICAgY29uc3QgZnJvbU1vdmUgPSBbJ1IgZnJvbSBtb3ZlJywgLi4udGhpcy5yZWRpcmVjdFRlbXBsYXRlc1snUiBmcm9tIG1vdmUnXS5hbGlhc2VzXS5zb21lKCh0YWdPclJlZGlyZWN0KSA9PlxuICAgICAgICAgICAgICAgIG5ldyBSZWdFeHAoYHt7XFxcXHMqWyR7dGFnT3JSZWRpcmVjdFswXS50b0xvd2VyQ2FzZSgpfSR7dGFnT3JSZWRpcmVjdFswXX1dJHt0YWdPclJlZGlyZWN0LnNsaWNlKDEpfVxcXFxzKihcXFxcfHx9fSlgKS50ZXN0KFxuICAgICAgICAgICAgICAgICAgICBtYWluUGFnZUNvbnRlbnQsXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoZnJvbU1vdmUpIHRoaXMudGFnU2VsZWN0LnNldFZhbHVlKFsnUiBmcm9tIG1vdmUnXSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWRzIHRoZSBpbnB1dCBlbGVtZW50cy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGxvYWRJbnB1dEVsZW1lbnRzKCkge1xuICAgICAgICAvKiBSZWRpcmVjdCB0YXJnZXQgaW5wdXQgKi9cbiAgICAgICAgdGhpcy5yZWRpcmVjdElucHV0ID0gbmV3IFJlZGlyZWN0VGFyZ2V0SW5wdXRXaWRnZXQoeyBwbGFjZWhvbGRlcjogJ1RhcmdldCBwYWdlIG5hbWUnLCByZXF1aXJlZDogdHJ1ZSB9LCB0aGlzLnBhZ2VUaXRsZVBhcnNlZCk7XG4gICAgICAgIHRoaXMucmVkaXJlY3RJbnB1dC5vbignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5yZWRpcmVjdElucHV0LmdldFZhbHVlKCk7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UobmV3IFJlZ0V4cChgXihodHRwcz86KT8vezJ9PyR7bXcuY29uZmlnLmdldCgnd2dTZXJ2ZXInKS5yZXBsYWNlKC9eXFwvezJ9LywgJycpfS93aWtpL2ApLCAnJyk7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL146LywgJycpO1xuXG4gICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVkaXJlY3RJbnB1dC5zZXRWYWx1ZSh2YWx1ZVswXS50b1VwcGVyQ2FzZSgpICsgdmFsdWUuc2xpY2UoMSkucmVwbGFjZUFsbCgnXycsICcgJykpO1xuICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNvcnRTdWdnZXN0QnV0dG9uLnNldERpc2FibGVkKGZhbHNlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5zZXREaXNhYmxlZChmYWxzZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93UHJldmlld0J1dHRvbi5zZXREaXNhYmxlZChmYWxzZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93Q2hhbmdlc0J1dHRvbi5zZXREaXNhYmxlZChmYWxzZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNvcnRTdWdnZXN0QnV0dG9uLnNldERpc2FibGVkKHRydWUpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldERpc2FibGVkKHRydWUpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd1ByZXZpZXdCdXR0b24uc2V0RGlzYWJsZWQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93Q2hhbmdlc0J1dHRvbi5zZXREaXNhYmxlZCh0cnVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy51cGRhdGVTdW1tYXJ5KCk7XG4gICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5zZXRMYWJlbCgnU3VibWl0Jyk7XG4gICAgICAgICAgICB0aGlzLm5lZWRzQ2hlY2sgPSB0cnVlO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnJlZGlyZWN0SW5wdXRMYXlvdXQgPSBuZXcgT08udWkuRmllbGRMYXlvdXQodGhpcy5yZWRpcmVjdElucHV0LCB7XG4gICAgICAgICAgICBsYWJlbDogJ1JlZGlyZWN0IHRhcmdldDonLFxuICAgICAgICAgICAgY2xhc3NlczogWydyZWRpcmVjdC1pbnB1dC1sYXlvdXQnXSxcbiAgICAgICAgICAgIGFsaWduOiAndG9wJyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyogUmVkaXJlY3QgY2F0ZWdvcml6YXRpb24gdGVtcGxhdGUgc2VsZWN0aW9uICovXG4gICAgICAgIHRoaXMudGFnU2VsZWN0ID0gbmV3IE9PLnVpLk1lbnVUYWdNdWx0aXNlbGVjdFdpZGdldCh7XG4gICAgICAgICAgICBhbGxvd0FyYml0cmFyeTogZmFsc2UsXG4gICAgICAgICAgICBhbGxvd1Jlb3JkZXJpbmc6IGZhbHNlLFxuICAgICAgICAgICAgb3B0aW9uczogT2JqZWN0LmVudHJpZXModGhpcy5yZWRpcmVjdFRlbXBsYXRlcykubWFwKChbdGFnLCB7IHJlZGlyZWN0IH1dKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZWRpcmVjdCkgcmV0dXJuIHsgZGF0YTogdGFnLCBsYWJlbDogdGFnIH07XG5cbiAgICAgICAgICAgICAgICBjb25zdCBsYWJlbCA9IG5ldyBPTy51aS5IdG1sU25pcHBldChgPHNwYW4gY2xhc3M9XCJyZWRpcmVjdC1oZWxwZXItcmVkaXJlY3QtcG9zc2liaWxpdGllc1wiPiR7dGFnfTwvc3Bhbj5gKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHRhZywgbGFiZWwgfTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICAgICAgKHRoaXMudGFnU2VsZWN0LmdldE1lbnUoKSBhcyBPTy51aS5NZW51U2VsZWN0V2lkZ2V0LkNvbmZpZ09wdGlvbnMpLmZpbHRlck1vZGUgPSAnc3Vic3RyaW5nJztcbiAgICAgICAgdGhpcy50YWdTZWxlY3Qub24oJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNvcnRlZFRhZ3MgPSAodGhpcy50YWdTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXSkuc29ydCgoYSwgYikgPT4gYS50b0xvd2VyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoYi50b0xvd2VyQ2FzZSgpKSk7XG5cbiAgICAgICAgICAgIGlmICgodGhpcy50YWdTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXSkuam9pbignOycpICE9PSBzb3J0ZWRUYWdzLmpvaW4oJzsnKSkgdGhpcy50YWdTZWxlY3Quc2V0VmFsdWUoc29ydGVkVGFncyk7XG5cbiAgICAgICAgICAgIHRoaXMudXBkYXRlU3VtbWFyeSgpO1xuICAgICAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24uc2V0TGFiZWwoJ1N1Ym1pdCcpO1xuICAgICAgICAgICAgdGhpcy5uZWVkc0NoZWNrID0gdHJ1ZTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBlZGl0b3JJbmZvIG9mIHRoaXMudGVtcGxhdGVFZGl0b3JzSW5mbykgZWRpdG9ySW5mby5kZXRhaWxzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgICAgICAgICAgIGxldCBzaG93blRlbXBsYXRlRWRpdG9ycyA9IDA7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHRhZyBvZiB0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZWRpdG9ySW5mbyA9IHRoaXMudGVtcGxhdGVFZGl0b3JzSW5mby5maW5kKChlZGl0b3JJbmZvKSA9PiBlZGl0b3JJbmZvLm5hbWUgPT09IHRhZyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoZWRpdG9ySW5mbykge1xuICAgICAgICAgICAgICAgICAgICBlZGl0b3JJbmZvLmRldGFpbHMuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgICAgICAgICAgIHNob3duVGVtcGxhdGVFZGl0b3JzKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzdW1tYXJ5RWxlbWVudC50ZXh0Q29udGVudCA9IGBUZW1wbGF0ZSBwYXJhbWV0ZXJzICgke3Nob3duVGVtcGxhdGVFZGl0b3JzID4gMCA/IGBmb3IgJHtzaG93blRlbXBsYXRlRWRpdG9yc30gdGVtcGxhdGUke3Nob3duVGVtcGxhdGVFZGl0b3JzID4gMSA/ICdzJyA6ICcnfWAgOiAnbm9uZSB0byBzaG93J30pYDtcblxuICAgICAgICAgICAgbm9UZW1wbGF0ZXNNZXNzYWdlLnN0eWxlLmRpc3BsYXkgPSBzaG93blRlbXBsYXRlRWRpdG9ycyA+IDAgPyAnbm9uZScgOiAnYmxvY2snO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnRhZ1NlbGVjdExheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dCh0aGlzLnRhZ1NlbGVjdCwge1xuICAgICAgICAgICAgbGFiZWw6ICdSZWRpcmVjdCBjYXRlZ29yaXphdGlvbiB0ZW1wbGF0ZXM6JyxcbiAgICAgICAgICAgIGNsYXNzZXM6IFsncmVkaXJlY3QtaW5wdXQtbGF5b3V0J10sXG4gICAgICAgICAgICBhbGlnbjogJ3RvcCcsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qIFJlZGlyZWN0IGNhdGVnb3JpemF0aW9uIHRlbXBsYXRlIHBhcmFtZXRlcnMgKi9cbiAgICAgICAgdGhpcy50ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkZXRhaWxzJyk7XG4gICAgICAgIHRoaXMudGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yLmNsYXNzTGlzdC5hZGQoJ3JlZGlyZWN0LWhlbHBlci10ZW1wbGF0ZS1wYXJhbWV0ZXJzLWNvbnRhaW5lcicpO1xuXG4gICAgICAgIGNvbnN0IHN1bW1hcnlFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3VtbWFyeScpO1xuICAgICAgICBzdW1tYXJ5RWxlbWVudC50ZXh0Q29udGVudCA9ICdUZW1wbGF0ZSBwYXJhbWV0ZXJzIChub25lIHRvIHNob3cpJztcbiAgICAgICAgdGhpcy50ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3IuYXBwZW5kKHN1bW1hcnlFbGVtZW50KTtcblxuICAgICAgICBmb3IgKGNvbnN0IFt0ZW1wbGF0ZU5hbWUsIHRlbXBsYXRlRGF0YV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5yZWRpcmVjdFRlbXBsYXRlcykpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtZXRlcnMgPSBPYmplY3QuZW50cmllcyh0ZW1wbGF0ZURhdGEucGFyYW1ldGVycyk7XG4gICAgICAgICAgICBpZiAocGFyYW1ldGVycy5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBjb25zdCBkZXRhaWxzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGV0YWlscycpO1xuICAgICAgICAgICAgZGV0YWlscy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gICAgICAgICAgICBjb25zdCBzdW1tYXJ5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3VtbWFyeScpO1xuICAgICAgICAgICAgc3VtbWFyeS50ZXh0Q29udGVudCA9IHRlbXBsYXRlTmFtZTtcbiAgICAgICAgICAgIGRldGFpbHMuYXBwZW5kKHN1bW1hcnkpO1xuXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50RGF0YTogVGVtcGxhdGVFZGl0b3JFbGVtZW50SW5mbyA9IHsgbmFtZTogdGVtcGxhdGVOYW1lLCBkZXRhaWxzLCBwYXJhbWV0ZXJzOiBbXSB9O1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtwYXJhbWV0ZXJOYW1lLCBwYXJhbWV0ZXJEYXRhXSBvZiBwYXJhbWV0ZXJzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5wdXQgPSBuZXcgT08udWkuVGV4dElucHV0V2lkZ2V0KHtcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6IHBhcmFtZXRlckRhdGEuZGVmYXVsdD8udG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHBhcmFtZXRlckRhdGEucmVxdWlyZWQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaW5wdXQub24oJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTdW1tYXJ5KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldExhYmVsKCdTdWJtaXQnKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZWVkc0NoZWNrID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0TGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KGlucHV0LCB7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiBuZXcgT08udWkuSHRtbFNuaXBwZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICBgJHtwYXJhbWV0ZXJOYW1lfSR7IXBhcmFtZXRlckRhdGEubGFiZWwgfHwgcGFyYW1ldGVyTmFtZS50b0xvd2VyQ2FzZSgpID09PSBwYXJhbWV0ZXJEYXRhLmxhYmVsLnRvTG93ZXJDYXNlKCkgPyAnJyA6IGAgKCR7cGFyYW1ldGVyRGF0YS5sYWJlbH0pYH0ke3BhcmFtZXRlckRhdGEuZGVzY3JpcHRpb24gPyBgICgke3BhcmFtZXRlckRhdGEuZGVzY3JpcHRpb259KWAgOiAnJ30gKHR5cGU6ICR7cGFyYW1ldGVyRGF0YS50eXBlfSkgJHtwYXJhbWV0ZXJEYXRhLnN1Z2dlc3RlZCA/ICcgKHN1Z2dlc3RlZCknIDogJyd9JHtwYXJhbWV0ZXJEYXRhLmV4YW1wbGUgPyBgIChleGFtcGxlOiBcIiR7cGFyYW1ldGVyRGF0YS5leGFtcGxlfVwiKWAgOiAnJ31gLFxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICBhbGlnbjogJ2lubGluZScsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZGV0YWlscy5hcHBlbmQoaW5wdXRMYXlvdXQuJGVsZW1lbnRbMF0pO1xuXG4gICAgICAgICAgICAgICAgZWxlbWVudERhdGEucGFyYW1ldGVycy5wdXNoKHsgbmFtZTogcGFyYW1ldGVyTmFtZSwgYWxpYXNlczogcGFyYW1ldGVyRGF0YS5hbGlhc2VzLCBlZGl0b3I6IGlucHV0IH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvci5hcHBlbmQoZGV0YWlscyk7XG5cbiAgICAgICAgICAgIHRoaXMudGVtcGxhdGVFZGl0b3JzSW5mby5wdXNoKGVsZW1lbnREYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5vVGVtcGxhdGVzTWVzc2FnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBub1RlbXBsYXRlc01lc3NhZ2UuaWQgPSAncmVkaXJlY3QtaGVscGVyLW5vLXRlbXBsYXRlcy1tZXNzYWdlJztcbiAgICAgICAgbm9UZW1wbGF0ZXNNZXNzYWdlLnRleHRDb250ZW50ID0gJ05vIHRlbXBsYXRlcyB3aXRoIHBhcmFtZXRlcnMgdG8gZGlzcGxheSEnO1xuXG4gICAgICAgIHRoaXMudGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yLmFwcGVuZChub1RlbXBsYXRlc01lc3NhZ2UpO1xuXG4gICAgICAgIC8qIERFRkFVTFRTT1JUIGlucHV0ICovXG4gICAgICAgIHRoaXMuZGVmYXVsdFNvcnRJbnB1dCA9IG5ldyBPTy51aS5UZXh0SW5wdXRXaWRnZXQoKTtcbiAgICAgICAgdGhpcy5kZWZhdWx0U29ydElucHV0Lm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGVmYXVsdFNvcnRJbnB1dC5nZXRWYWx1ZSgpO1xuXG4gICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID4gMCkgdGhpcy5kZWZhdWx0U29ydElucHV0LnNldFZhbHVlKHZhbHVlLnJlcGxhY2VBbGwoJ18nLCAnICcpKTtcblxuICAgICAgICAgICAgdGhpcy51cGRhdGVTdW1tYXJ5KCk7XG4gICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5zZXRMYWJlbCgnU3VibWl0Jyk7XG4gICAgICAgICAgICB0aGlzLm5lZWRzQ2hlY2sgPSB0cnVlO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmRlZmF1bHRTb3J0U3VnZ2VzdEJ1dHRvbiA9IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoeyBpY29uOiAncm9ib3QnLCBsYWJlbDogJ1N1Z2dlc3QnLCBkaXNhYmxlZDogdHJ1ZSB9KTtcbiAgICAgICAgdGhpcy5kZWZhdWx0U29ydFN1Z2dlc3RCdXR0b24ub24oJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgbGV0IG5hbWUgPSB0aGlzLnBhZ2VUaXRsZVBhcnNlZC5nZXRNYWluVGV4dCgpLnJlcGxhY2UoLyBcXCguKlxcKSQvLCAnJyk7IC8vIFJlbW92ZSBkaXNhbWJpZ3VhdGlvblxuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAnUiBmcm9tIGJpcnRoIG5hbWUnLFxuICAgICAgICAgICAgICAgICAgICAnUiBmcm9tIGZpY3Rpb25hbCBjaGFyYWN0ZXInLFxuICAgICAgICAgICAgICAgICAgICAnUiBmcm9tIGJhbmQgbWVtYmVyJyxcbiAgICAgICAgICAgICAgICAgICAgJ1IgZnJvbSBtZW1iZXInLFxuICAgICAgICAgICAgICAgICAgICAnUiBmcm9tIHBlcnNvbicsXG4gICAgICAgICAgICAgICAgICAgICdSIGZyb20gcGVyc29uYWwgbmFtZScsXG4gICAgICAgICAgICAgICAgICAgICdSIGZyb20gcmVsYXRpdmUnLFxuICAgICAgICAgICAgICAgICAgICAnUiBmcm9tIHNwb3VzZScsXG4gICAgICAgICAgICAgICAgXS5zb21lKCh0YWcpID0+IHRoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkuaW5jbHVkZXModGFnKSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIC8vIEhhbmRsaW5nIGlzIG1vZGlmaWVkIGZyb20gZXZhZDM3J3MgXCJSYXRlclwiXG5cbiAgICAgICAgICAgICAgICBpZiAoIW5hbWUuaW5jbHVkZXMoJyAnKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG13Lm5vdGlmeShcInJlZGlyZWN0LWhlbHBlciB3YXNuJ3QgYWJsZSB0byBkZXRlcm1pbmUgYSBzb3J0IGtleSBkaWZmZXJlbnQgZnJvbSB0aGUgY3VycmVudCBwYWdlIHRpdGxlIVwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnd2FybicsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgbGV0IGdlbmVyYXRpb25hbFN1ZmZpeCA9ICcnO1xuICAgICAgICAgICAgICAgIGlmICgvICg/OltKU11yLj98W0lWWF0rKSQvLnRlc3QobmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvbmFsU3VmZml4ID0gbmFtZS5zbGljZShuYW1lLmxhc3RJbmRleE9mKCcgJykpO1xuICAgICAgICAgICAgICAgICAgICBuYW1lID0gbmFtZS5zbGljZSgwLCBuYW1lLmxhc3RJbmRleE9mKCcgJykpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW5hbWUuaW5jbHVkZXMoJyAnKSkgcmV0dXJuIG5hbWUgKyBnZW5lcmF0aW9uYWxTdWZmaXg7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdE5hbWUgPSBuYW1lXG4gICAgICAgICAgICAgICAgICAgIC5zbGljZShuYW1lLmxhc3RJbmRleE9mKCcgJykgKyAxKVxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvLCQvLCAnJylcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL08nLywgJ08nKTtcbiAgICAgICAgICAgICAgICBjb25zdCBvdGhlck5hbWVzID0gbmFtZS5zbGljZSgwLCBuYW1lLmxhc3RJbmRleE9mKCcgJykpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0U29ydElucHV0LnNldFZhbHVlKGxhc3ROYW1lICsgJywgJyArIG90aGVyTmFtZXMgKyBnZW5lcmF0aW9uYWxTdWZmaXgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV3TmFtZSA9IG5hbWUucmVwbGFjZUFsbCgnTXIuJywgJ01pc3RlcicpLnJlcGxhY2VBbGwoJyYnLCAnQW5kJyk7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGxlYWRpbmdBcnRpY2xlIG9mIFsnQW4nLCAnQScsICdUaGUnXSlcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld05hbWUuc3RhcnRzV2l0aChsZWFkaW5nQXJ0aWNsZSArICcgJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld05hbWUgPSBuZXdOYW1lLnNsaWNlKGxlYWRpbmdBcnRpY2xlLmxlbmd0aCArIDEpICsgJywgJyArIGxlYWRpbmdBcnRpY2xlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChuZXdOYW1lID09PSBuYW1lKVxuICAgICAgICAgICAgICAgICAgICBtdy5ub3RpZnkoXCJyZWRpcmVjdC1oZWxwZXIgd2Fzbid0IGFibGUgdG8gZGV0ZXJtaW5lIGEgc29ydCBrZXkgZGlmZmVyZW50IGZyb20gdGhlIGN1cnJlbnQgcGFnZSB0aXRsZSFcIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3dhcm4nLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBlbHNlIHRoaXMuZGVmYXVsdFNvcnRJbnB1dC5zZXRWYWx1ZShuZXdOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5kZWZhdWx0U29ydElucHV0TGF5b3V0ID0gbmV3IE9PLnVpLkFjdGlvbkZpZWxkTGF5b3V0KHRoaXMuZGVmYXVsdFNvcnRJbnB1dCwgdGhpcy5kZWZhdWx0U29ydFN1Z2dlc3RCdXR0b24sIHtcbiAgICAgICAgICAgIGxhYmVsOiBuZXcgT08udWkuSHRtbFNuaXBwZXQoXG4gICAgICAgICAgICAgICAgYERlZmF1bHQgc29ydCBrZXkgKERFRkFVTFRTT1JUKSAoc2VlIDxhIGhyZWY9XCIke213LnV0aWwuZ2V0VXJsKCdXaWtpcGVkaWE6Q2F0ZWdvcml6YXRpb24jU29ydCBrZXlzJyl9XCIgdGFyZ2V0PVwiX2JsYW5rXCI+Z3VpZGVsaW5lPC9hPik6YCxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBjbGFzc2VzOiBbJ3JlZGlyZWN0LWlucHV0LWxheW91dCddLFxuICAgICAgICAgICAgYWxpZ246ICd0b3AnLFxuICAgICAgICB9KTtcblxuICAgICAgICAvKiBDYXRlZ29yaWVzIHNlbGVjdGlvbiAqL1xuICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0SW5wdXQgPSBuZXcgQ2F0ZWdvcnlJbnB1dFdpZGdldCh7IHBsYWNlaG9sZGVyOiAnQWRkIGNhdGVnb3JpZXMgaGVyZScgfSk7XG4gICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3RJbnB1dC5vbignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5jYXRlZ29yeVNlbGVjdElucHV0LmdldFZhbHVlKCk7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UobmV3IFJlZ0V4cChgXihodHRwcz86KT8vezJ9PyR7bXcuY29uZmlnLmdldCgnd2dTZXJ2ZXInKS5yZXBsYWNlKC9eXFwvezJ9LywgJycpfS93aWtpL2ApLCAnJyk7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL15DYXRlZ29yeTovLCAnJyk7XG5cbiAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPiAwKSB0aGlzLmNhdGVnb3J5U2VsZWN0SW5wdXQuc2V0VmFsdWUodmFsdWVbMF0udG9VcHBlckNhc2UoKSArIHZhbHVlLnNsaWNlKDEpLnJlcGxhY2VBbGwoJ18nLCAnICcpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3RJbnB1dC5vbignc2hvd2luZy12YWx1ZXMnLCAocGFnZXM6IHsgZGF0YTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXSkgPT4ge1xuICAgICAgICAgICAgZm9yIChjb25zdCBwYWdlIG9mIHBhZ2VzKSB0aGlzLmNhdGVnb3J5U2VsZWN0LmFkZEFsbG93ZWRWYWx1ZShwYWdlLmRhdGEpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jYXRlZ29yeVNlbGVjdCA9IG5ldyBPTy51aS5UYWdNdWx0aXNlbGVjdFdpZGdldCh7XG4gICAgICAgICAgICBhbGxvd1Jlb3JkZXJpbmc6IGZhbHNlLFxuICAgICAgICAgICAgaW5wdXRQb3NpdGlvbjogJ291dGxpbmUnLFxuICAgICAgICAgICAgaW5wdXRXaWRnZXQ6IHRoaXMuY2F0ZWdvcnlTZWxlY3RJbnB1dCxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3Qub24oJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNvcnRlZFRhZ3MgPSAodGhpcy5jYXRlZ29yeVNlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdKS5zb3J0KChhLCBiKSA9PiBhLnRvTG93ZXJDYXNlKCkubG9jYWxlQ29tcGFyZShiLnRvTG93ZXJDYXNlKCkpKTtcblxuICAgICAgICAgICAgaWYgKCh0aGlzLmNhdGVnb3J5U2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10pLmpvaW4oJzsnKSAhPT0gc29ydGVkVGFncy5qb2luKCc7JykpIHRoaXMuY2F0ZWdvcnlTZWxlY3Quc2V0VmFsdWUoc29ydGVkVGFncyk7XG5cbiAgICAgICAgICAgIHRoaXMudXBkYXRlU3VtbWFyeSgpO1xuICAgICAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24uc2V0TGFiZWwoJ1N1Ym1pdCcpO1xuICAgICAgICAgICAgdGhpcy5uZWVkc0NoZWNrID0gdHJ1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jYXRlZ29yeVNlbGVjdExheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dCh0aGlzLmNhdGVnb3J5U2VsZWN0LCB7XG4gICAgICAgICAgICBsYWJlbDogJ0NhdGVnb3JpZXM6JyxcbiAgICAgICAgICAgIGNsYXNzZXM6IFsncmVkaXJlY3QtaW5wdXQtbGF5b3V0J10sXG4gICAgICAgICAgICBhbGlnbjogJ3RvcCcsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qIFN1bW1hcnkgaW5wdXQgKi9cbiAgICAgICAgdGhpcy5zdW1tYXJ5SW5wdXQgPSBuZXcgT08udWkuQ29tYm9Cb3hJbnB1dFdpZGdldCh7XG4gICAgICAgICAgICBvcHRpb25zOiBbXG4gICAgICAgICAgICAgICAgeyBkYXRhOiAnUmVzb2x2ZSBkb3VibGUgcmVkaXJlY3QnIH0sIC8vXG4gICAgICAgICAgICAgICAgeyBkYXRhOiAnUmVzb2x2ZSBzZWxmIHJlZGlyZWN0JyB9LFxuICAgICAgICAgICAgICAgIHsgZGF0YTogJ1JlbW92ZSBpbmNvcnJlY3QgcmNhdHMnIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnN1bW1hcnlJbnB1dExheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dCh0aGlzLnN1bW1hcnlJbnB1dCwge1xuICAgICAgICAgICAgaWQ6ICdyZWRpcmVjdC1oZWxwZXItc3VtbWFyeS1sYXlvdXQnLFxuICAgICAgICAgICAgbGFiZWw6ICdTdW1tYXJ5OicsXG4gICAgICAgICAgICBjbGFzc2VzOiBbJ3JlZGlyZWN0LWlucHV0LWxheW91dCddLFxuICAgICAgICAgICAgYWxpZ246ICd0b3AnLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkcyB0aGUgZWxlbWVudHMgaW4gdGhlIHN1Ym1pdCBidXR0b24gcm93LlxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgbG9hZFN1Ym1pdEVsZW1lbnRzKCkge1xuICAgICAgICBjb25zdCB3aW5kb3dNYW5hZ2VyID0gbmV3IE9PLnVpLldpbmRvd01hbmFnZXIoKTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmQod2luZG93TWFuYWdlci4kZWxlbWVudFswXSk7XG5cbiAgICAgICAgLyogU2V0IHVwIHN1Ym1pdCBidXR0b24gKi9cbiAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24gPSBuZXcgT08udWkuQnV0dG9uV2lkZ2V0KHsgbGFiZWw6ICdTdWJtaXQnLCBkaXNhYmxlZDogdHJ1ZSwgZmxhZ3M6IFsncHJvZ3Jlc3NpdmUnXSB9KTtcbiAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24ub24oJ2NsaWNrJywgKCkgPT4gdGhpcy5oYW5kbGVTdWJtaXRCdXR0b25DbGljaygpKTtcblxuICAgICAgICAvKiBTZXQgdXAgc2hvdyBwcmV2aWV3IGJ1dHRvbiAqL1xuICAgICAgICBjb25zdCB0ZW1wbGF0ZVByZXZpZXdEaWFsb2cgPSBuZXcgT3V0cHV0UHJldmlld0RpYWxvZyh7IHNpemU6ICdsYXJnZScgfSwgdGhpcy5wYWdlVGl0bGVQYXJzZWQpO1xuICAgICAgICB3aW5kb3dNYW5hZ2VyLmFkZFdpbmRvd3MoW3RlbXBsYXRlUHJldmlld0RpYWxvZ10pO1xuXG4gICAgICAgIHRoaXMuc2hvd1ByZXZpZXdCdXR0b24gPSBuZXcgT08udWkuQnV0dG9uV2lkZ2V0KHsgbGFiZWw6ICdTaG93IHByZXZpZXcnLCBkaXNhYmxlZDogdHJ1ZSB9KTtcbiAgICAgICAgdGhpcy5zaG93UHJldmlld0J1dHRvbi5vbignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICB0ZW1wbGF0ZVByZXZpZXdEaWFsb2cuc2V0RGF0YShcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZU91dHB1dChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWRpcmVjdElucHV0LmdldFZhbHVlKCksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10sXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2xkU3RyYXlUZXh0LFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRTb3J0SW5wdXQuZ2V0VmFsdWUoKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXRlZ29yeVNlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGVtcGxhdGVQcmV2aWV3RGlhbG9nLm9wZW4oKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyogU2V0IHVwIHNob3cgY2hhbmdlcyBidXR0b24gKi9cbiAgICAgICAgY29uc3Qgc2hvd0NoYW5nZXNEaWFsb2cgPSBuZXcgQ2hhbmdlc0RpYWxvZyh7IHNpemU6ICdsYXJnZScgfSk7XG4gICAgICAgIHdpbmRvd01hbmFnZXIuYWRkV2luZG93cyhbc2hvd0NoYW5nZXNEaWFsb2ddKTtcblxuICAgICAgICB0aGlzLnNob3dDaGFuZ2VzQnV0dG9uID0gbmV3IE9PLnVpLkJ1dHRvbldpZGdldCh7IGxhYmVsOiAnU2hvdyBjaGFuZ2VzJywgZGlzYWJsZWQ6IHRydWUgfSk7XG4gICAgICAgIHRoaXMuc2hvd0NoYW5nZXNCdXR0b24ub24oJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuZXhpc3RzKSB0aGlzLnBhZ2VDb250ZW50ID0gYXdhaXQgdGhpcy5nZXRQYWdlQ29udGVudCh0aGlzLnBhZ2VUaXRsZSk7XG5cbiAgICAgICAgICAgIHNob3dDaGFuZ2VzRGlhbG9nLnNldERhdGEoW1xuICAgICAgICAgICAgICAgIHRoaXMucGFnZUNvbnRlbnQsXG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVPdXRwdXQoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVkaXJlY3RJbnB1dC5nZXRWYWx1ZSgpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9sZFN0cmF5VGV4dCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0U29ydElucHV0LmdldFZhbHVlKCksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICBzaG93Q2hhbmdlc0RpYWxvZy5vcGVuKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qIFNldCB1cCBzeW5jIHRhbGsgY2hlY2tib3ggKi9cbiAgICAgICAgaWYgKCF0aGlzLnBhZ2VUaXRsZVBhcnNlZC5pc1RhbGtQYWdlKCkpIHtcbiAgICAgICAgICAgIHRoaXMudGFsa0RhdGEgPSAoYXdhaXQgdGhpcy5hcGkuZ2V0KHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgICAgIHByb3A6ICdpbmZvJyxcbiAgICAgICAgICAgICAgICB0aXRsZXM6IHRoaXMucGFnZVRpdGxlUGFyc2VkLmdldFRhbGtQYWdlKCkhLmdldFByZWZpeGVkVGV4dCgpLFxuICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlJbmZvUGFyYW1zKSkgYXMgUGFnZUluZm9SZXN1bHQ7XG4gICAgICAgICAgICB0aGlzLnN5bmNUYWxrQ2hlY2tib3ggPSBuZXcgT08udWkuQ2hlY2tib3hJbnB1dFdpZGdldCh7IHNlbGVjdGVkOiAhIXRoaXMudGFsa0RhdGEucXVlcnkhLnBhZ2VzWzBdLnJlZGlyZWN0IH0pO1xuXG4gICAgICAgICAgICB0aGlzLnN5bmNUYWxrQ2hlY2tib3hMYXlvdXQgPSBuZXcgT08udWkuV2lkZ2V0KHtcbiAgICAgICAgICAgICAgICBjb250ZW50OiBbbmV3IE9PLnVpLkZpZWxkTGF5b3V0KHRoaXMuc3luY1RhbGtDaGVja2JveCwgeyBsYWJlbDogJ1N5bmMgdGFsayBwYWdlJywgYWxpZ246ICdpbmxpbmUnIH0pXSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogU2V0IHVwIHdhdGNoIHBhZ2UgY2hlY2tib3ggKi9cbiAgICAgICAgaWYgKCF0aGlzLmV4aXN0cykge1xuICAgICAgICAgICAgY29uc3QgY29uZmlnOiBPTy51aS5DaGVja2JveElucHV0V2lkZ2V0LkNvbmZpZ09wdGlvbnMgPSB7fTtcblxuICAgICAgICAgICAgaWYgKFsnbm9jaGFuZ2UnLCAncHJlZmVyZW5jZXMnXS5pbmNsdWRlcyh0aGlzLmRlZmF1bHRDcmVhdGVkV2F0Y2hNZXRob2QpKSBjb25maWcuaW5kZXRlcm1pbmF0ZSA9IHRydWU7XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLmRlZmF1bHRDcmVhdGVkV2F0Y2hNZXRob2QgPT09ICd3YXRjaCcpIGNvbmZpZy5zZWxlY3RlZCA9IHRydWU7XG4gICAgICAgICAgICBlbHNlIGNvbmZpZy5zZWxlY3RlZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICB0aGlzLndhdGNoQ2hlY2tib3ggPSBuZXcgT08udWkuQ2hlY2tib3hJbnB1dFdpZGdldChjb25maWcpO1xuXG4gICAgICAgICAgICB0aGlzLndhdGNoQ2hlY2tib3hMYXlvdXQgPSBuZXcgT08udWkuV2lkZ2V0KHtcbiAgICAgICAgICAgICAgICBjb250ZW50OiBbbmV3IE9PLnVpLkZpZWxkTGF5b3V0KHRoaXMud2F0Y2hDaGVja2JveCwgeyBsYWJlbDogJ1dhdGNoIHBhZ2UnLCBhbGlnbjogJ2lubGluZScgfSldLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBTZXQgdXAgcGF0cm9sIGNoZWNrYm94ICovXG4gICAgICAgIGlmIChhd2FpdCB0aGlzLmNoZWNrU2hvdWxkUHJvbXB0UGF0cm9sKCkpIHtcbiAgICAgICAgICAgIHRoaXMucGF0cm9sQ2hlY2tib3ggPSBuZXcgT08udWkuQ2hlY2tib3hJbnB1dFdpZGdldCh7IHNlbGVjdGVkOiB0cnVlIH0pO1xuXG4gICAgICAgICAgICB0aGlzLnBhdHJvbENoZWNrYm94TGF5b3V0ID0gbmV3IE9PLnVpLldpZGdldCh7XG4gICAgICAgICAgICAgICAgY29udGVudDogW25ldyBPTy51aS5GaWVsZExheW91dCh0aGlzLnBhdHJvbENoZWNrYm94LCB7IGxhYmVsOiAnTWFyayBhcyBwYXRyb2xsZWQnLCBhbGlnbjogJ2lubGluZScgfSldLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBTZXQgdXAgbGF5b3V0ICovXG4gICAgICAgIHRoaXMuc3VibWl0TGF5b3V0ID0gbmV3IE9PLnVpLkhvcml6b250YWxMYXlvdXQoe1xuICAgICAgICAgICAgaWQ6ICdyZWRpcmVjdC1oZWxwZXItc3VibWl0LWxheW91dCcsXG4gICAgICAgICAgICBpdGVtczogW1xuICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLFxuICAgICAgICAgICAgICAgIHRoaXMuc2hvd1ByZXZpZXdCdXR0b24sXG4gICAgICAgICAgICAgICAgdGhpcy5zaG93Q2hhbmdlc0J1dHRvbixcbiAgICAgICAgICAgICAgICB0aGlzLnN5bmNUYWxrQ2hlY2tib3hMYXlvdXQsXG4gICAgICAgICAgICAgICAgdGhpcy53YXRjaENoZWNrYm94TGF5b3V0LFxuICAgICAgICAgICAgICAgIHRoaXMucGF0cm9sQ2hlY2tib3hMYXlvdXQsXG4gICAgICAgICAgICBdLmZpbHRlcihCb29sZWFuKSBhcyBPTy51aS5XaWRnZXRbXSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgdXNlciBzaG91bGQgYmUgcHJvbXB0ZWQgdG8gcGF0cm9sIHRoZSBwYWdlLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgY2hlY2tTaG91bGRQcm9tcHRQYXRyb2woKSB7XG4gICAgICAgIGNvbnN0IHBhZ2VUcmlhZ2VNYXJrQnV0dG9uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MSW1hZ2VFbGVtZW50PignI213ZS1wdC1tYXJrIC5td2UtcHQtdG9vbC1pY29uJyk7XG4gICAgICAgIHBhZ2VUcmlhZ2VNYXJrQnV0dG9uPy5jbGljaygpO1xuICAgICAgICBwYWdlVHJpYWdlTWFya0J1dHRvbj8uY2xpY2soKTtcblxuICAgICAgICBpZiAobXcuY29uZmlnLmdldCgnd2dOYW1lc3BhY2VOdW1iZXInKSAhPT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBlbHNlIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucGF0cm9sbGluaycpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgZWxzZSBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI213ZS1wdC1tYXJrLWFzLXJldmlld2VkLWJ1dHRvbicpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgZWxzZSBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI213ZS1wdC1tYXJrLWFzLXVucmV2aWV3ZWQtYnV0dG9uJykpIHJldHVybiBmYWxzZTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoIW13LmNvbmZpZy5nZXQoJ3dnQXJ0aWNsZUlkJykpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IHVzZXJQZXJtaXNzaW9ucyA9IGF3YWl0IG13LnVzZXIuZ2V0UmlnaHRzKCk7XG4gICAgICAgICAgICBpZiAoIXVzZXJQZXJtaXNzaW9ucy5pbmNsdWRlcygncGF0cm9sJykpIHJldHVybiBmYWxzZTtcblxuICAgICAgICAgICAgY29uc3QgcGF0cm9sUmVzcG9uc2UgPSAoYXdhaXQgdGhpcy5hcGkuZ2V0KHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdwYWdldHJpYWdlbGlzdCcsXG4gICAgICAgICAgICAgICAgcGFnZV9pZDogbXcuY29uZmlnLmdldCgnd2dBcnRpY2xlSWQnKSwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbiAgICAgICAgICAgIH0gc2F0aXNmaWVzIFBhZ2VUcmlhZ2VBcGlQYWdlVHJpYWdlTGlzdFBhcmFtcykpIGFzIFBhZ2VUcmlhZ2VMaXN0UmVzcG9uc2U7XG5cbiAgICAgICAgICAgIGlmIChwYXRyb2xSZXNwb25zZS5wYWdldHJpYWdlbGlzdC5wYWdlc1swXT8udXNlcl9uYW1lID09PSBtdy5jb25maWcuZ2V0KCd3Z1VzZXJOYW1lJykpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGVsc2UgaWYgKHBhdHJvbFJlc3BvbnNlLnBhZ2V0cmlhZ2VsaXN0LnJlc3VsdCAhPT0gJ3N1Y2Nlc3MnIHx8IHBhdHJvbFJlc3BvbnNlLnBhZ2V0cmlhZ2VsaXN0LnBhZ2VzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgZWxzZSByZXR1cm4gIU51bWJlci5wYXJzZUludChwYXRyb2xSZXNwb25zZS5wYWdldHJpYWdlbGlzdC5wYWdlc1swXT8ucGF0cm9sX3N0YXR1cyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBzdW1tYXJ5IGlucHV0IHBsYWNlaG9sZGVyLlxuICAgICAqL1xuICAgIHByaXZhdGUgdXBkYXRlU3VtbWFyeSgpIHtcbiAgICAgICAgY29uc3QgcmVkaXJlY3RWYWx1ZSA9IHRoaXMucmVkaXJlY3RJbnB1dC5nZXRWYWx1ZSgpLnRyaW0oKTtcblxuICAgICAgICBpZiAoIXJlZGlyZWN0VmFsdWUpICh0aGlzLnN1bW1hcnlJbnB1dC4kdGFiSW5kZXhlZFswXSBhcyBIVE1MSW5wdXRFbGVtZW50KS5wbGFjZWhvbGRlciA9ICcnO1xuICAgICAgICBlbHNlIGlmICh0aGlzLmV4aXN0cykge1xuICAgICAgICAgICAgbGV0IG9sZFRhcmdldCA9IHRoaXMub2xkUmVkaXJlY3RUYXJnZXQ/LnJlcGxhY2VBbGwoJ18nLCAnICcpO1xuICAgICAgICAgICAgaWYgKG9sZFRhcmdldCkgb2xkVGFyZ2V0ID0gb2xkVGFyZ2V0WzBdLnRvVXBwZXJDYXNlKCkgKyBvbGRUYXJnZXQuc2xpY2UoMSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHRhcmdldENoYW5nZWQgPSByZWRpcmVjdFZhbHVlICE9PSBvbGRUYXJnZXQ7XG5cbiAgICAgICAgICAgIGNvbnN0IHRhZ3NDaGFuZ2VkID1cbiAgICAgICAgICAgICAgICB0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpLnNvbWUoKHRhZykgPT4gIXRoaXMub2xkUmVkaXJlY3RUYWdzIS5pbmNsdWRlcyh0YWcgYXMgc3RyaW5nKSkgfHxcbiAgICAgICAgICAgICAgICB0aGlzLm9sZFJlZGlyZWN0VGFncyEuc29tZSgodGFnKSA9PiAhdGhpcy50YWdTZWxlY3QuZ2V0VmFsdWUoKS5pbmNsdWRlcyh0YWcpKTtcblxuICAgICAgICAgICAgbGV0IHRhZ0FyZ3VtZW50c0NoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmICh0aGlzLm9sZFJlZGlyZWN0VGFnRGF0YSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhZ3NXaXRoUGFyYW1ldGVycyA9IE9iamVjdC5lbnRyaWVzKHRoaXMucmVkaXJlY3RUZW1wbGF0ZXMpLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgKFssIGRhdGFdKSA9PiBPYmplY3QuZW50cmllcyhkYXRhLnBhcmFtZXRlcnMpLmxlbmd0aCA+IDAsXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW3RhZywgZGF0YV0gb2YgdGFnc1dpdGhQYXJhbWV0ZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhZ1dhc1NlbGVjdGVkID0gdGhpcy5vbGRSZWRpcmVjdFRhZ3MhLmluY2x1ZGVzKHRhZyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGFnV2FzU2VsZWN0ZWQgfHwgIXRoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkuaW5jbHVkZXModGFnKSkgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2xkVGFnRGF0YSA9IHRoaXMub2xkUmVkaXJlY3RUYWdEYXRhW3RhZ10gPz8gT2JqZWN0LmVudHJpZXMoZGF0YS5wYXJhbWV0ZXJzKS5tYXAoKFtuYW1lXSkgPT4gW25hbWUsICcnXSk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm91bmRUYWdFZGl0b3JEYXRhID0gdGhpcy50ZW1wbGF0ZUVkaXRvcnNJbmZvLmZpbmQoKHRlbXBsYXRlKSA9PiB0ZW1wbGF0ZS5uYW1lID09PSB0YWcpITtcblxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHBhcmFtZXRlciBvZiBmb3VuZFRhZ0VkaXRvckRhdGEucGFyYW1ldGVycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2xkQXJndW1lbnQgPSBvbGRUYWdEYXRhLmZpbmQoKGFyZ3VtZW50KSA9PiBhcmd1bWVudFswXSA9PT0gcGFyYW1ldGVyLm5hbWUpPy5bMV0gPz8gJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdBcmd1bWVudCA9IHBhcmFtZXRlci5lZGl0b3IuZ2V0VmFsdWUoKS50cmltKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbGRBcmd1bWVudCAhPT0gbmV3QXJndW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdBcmd1bWVudHNDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWdBcmd1bWVudHNDaGFuZ2VkKSBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRTb3J0Q2hhbmdlZCA9IHRoaXMuZGVmYXVsdFNvcnRJbnB1dC5nZXRWYWx1ZSgpLnRyaW0oKSAhPT0gdGhpcy5vbGREZWZhdWx0U29ydCEucmVwbGFjZUFsbCgnXycsICcgJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IGNhdGVnb3JpZXNDaGFuZ2VkID1cbiAgICAgICAgICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0LmdldFZhbHVlKCkuc29tZSgoY2F0ZWdvcnkpID0+ICF0aGlzLm9sZENhdGVnb3JpZXMhLmluY2x1ZGVzKGNhdGVnb3J5IGFzIHN0cmluZykpIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5vbGRDYXRlZ29yaWVzIS5zb21lKChjYXRlZ29yeSkgPT4gIXRoaXMuY2F0ZWdvcnlTZWxlY3QuZ2V0VmFsdWUoKS5pbmNsdWRlcyhjYXRlZ29yeSkpO1xuXG4gICAgICAgICAgICBjb25zdCBjaGFuZ2VzID0gW107XG5cbiAgICAgICAgICAgIGlmICh0YXJnZXRDaGFuZ2VkKSBjaGFuZ2VzLnB1c2goYHJldGFyZ2V0IHRvIFtbJHtyZWRpcmVjdFZhbHVlfV1dYCk7XG4gICAgICAgICAgICBpZiAodGFnc0NoYW5nZWQpXG4gICAgICAgICAgICAgICAgY2hhbmdlcy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICBgJHt0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpLmxlbmd0aCA+IDAgJiYgdGhpcy5vbGRSZWRpcmVjdFRhZ3MhLmxlbmd0aCA+IDAgPyAnY2hhbmdlJyA6IHRoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkubGVuZ3RoID4gMCA/ICdhZGQnIDogJ3JlbW92ZSd9IGNhdGVnb3JpemF0aW9uIHRlbXBsYXRlc2AsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICh0YWdBcmd1bWVudHNDaGFuZ2VkKSBjaGFuZ2VzLnB1c2goJ2NoYW5nZSBjYXRlZ29yaXphdGlvbiB0ZW1wbGF0ZSBhcmd1bWVudHMnKTtcbiAgICAgICAgICAgIGlmIChkZWZhdWx0U29ydENoYW5nZWQpXG4gICAgICAgICAgICAgICAgY2hhbmdlcy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICBgJHt0aGlzLmRlZmF1bHRTb3J0SW5wdXQuZ2V0VmFsdWUoKS50cmltKCkubGVuZ3RoID4gMCAmJiB0aGlzLm9sZERlZmF1bHRTb3J0IS5yZXBsYWNlQWxsKCdfJywgJyAnKS5sZW5ndGggPiAwID8gJ2NoYW5nZScgOiB0aGlzLmRlZmF1bHRTb3J0SW5wdXQuZ2V0VmFsdWUoKS50cmltKCkubGVuZ3RoID4gMCA/ICdhZGQnIDogJ3JlbW92ZSd9IGRlZmF1bHQgc29ydCBrZXlgLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoY2F0ZWdvcmllc0NoYW5nZWQpXG4gICAgICAgICAgICAgICAgY2hhbmdlcy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICBgJHt0aGlzLmNhdGVnb3J5U2VsZWN0LmdldFZhbHVlKCkubGVuZ3RoID4gMCAmJiB0aGlzLm9sZENhdGVnb3JpZXMhLmxlbmd0aCA+IDAgPyAnY2hhbmdlJyA6IHRoaXMuY2F0ZWdvcnlTZWxlY3QuZ2V0VmFsdWUoKS5sZW5ndGggPiAwID8gJ2FkZCcgOiAncmVtb3ZlJ30gY2F0ZWdvcmllc2AsXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKGNoYW5nZXMubGVuZ3RoID09PSAwKSBjaGFuZ2VzLnB1c2goJ3BlcmZvcm0gcmVkaXJlY3QgY2xlYW51cCcpO1xuXG4gICAgICAgICAgICBjaGFuZ2VzWzBdID0gY2hhbmdlc1swXVswXS50b1VwcGVyQ2FzZSgpICsgY2hhbmdlc1swXS5zbGljZSgxKTtcbiAgICAgICAgICAgIGlmIChjaGFuZ2VzLmxlbmd0aCA+IDEpIGNoYW5nZXNbY2hhbmdlcy5sZW5ndGggLSAxXSA9IGBhbmQgJHtjaGFuZ2VzLmF0KC0xKX1gO1xuXG4gICAgICAgICAgICAodGhpcy5zdW1tYXJ5SW5wdXQuJHRhYkluZGV4ZWRbMF0gYXMgSFRNTElucHV0RWxlbWVudCkucGxhY2Vob2xkZXIgPSBjaGFuZ2VzLmpvaW4oY2hhbmdlcy5sZW5ndGggPiAyID8gJywgJyA6ICcgJyk7XG4gICAgICAgIH0gZWxzZSAodGhpcy5zdW1tYXJ5SW5wdXQuJHRhYkluZGV4ZWRbMF0gYXMgSFRNTElucHV0RWxlbWVudCkucGxhY2Vob2xkZXIgPSBgQ3JlYXRlIHJlZGlyZWN0IHRvIFtbJHtyZWRpcmVjdFZhbHVlfV1dYDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkcyBleGlzdGluZyBwYWdlIGRhdGEuXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBsb2FkRXhpc3RpbmdEYXRhKCkge1xuICAgICAgICBpZiAodGhpcy5leGlzdHMpIHRoaXMucGFnZUNvbnRlbnQgPSBhd2FpdCB0aGlzLmdldFBhZ2VDb250ZW50KHRoaXMucGFnZVRpdGxlKTtcblxuICAgICAgICB0aGlzLm9sZFJlZGlyZWN0VGFyZ2V0ID0gdGhpcy5yZWRpcmVjdFJlZ2V4LmV4ZWModGhpcy5wYWdlQ29udGVudCk/LlsxXTtcblxuICAgICAgICB0aGlzLm9sZFJlZGlyZWN0VGFncyA9IChcbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKHRoaXMucmVkaXJlY3RUZW1wbGF0ZXMpXG4gICAgICAgICAgICAgICAgLm1hcCgoW3RhZywgdGFnRGF0YV0pID0+XG4gICAgICAgICAgICAgICAgICAgIFt0YWcsIC4uLnRhZ0RhdGEuYWxpYXNlc10uc29tZSgodGFnT3JSZWRpcmVjdCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSZWdFeHAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYHt7XFxcXHMqWyR7dGFnT3JSZWRpcmVjdFswXS50b0xvd2VyQ2FzZSgpfSR7dGFnT3JSZWRpcmVjdFswXX1dJHt0YWdPclJlZGlyZWN0LnNsaWNlKDEpfVxcXFxzKihcXFxcfHx9fSlgLFxuICAgICAgICAgICAgICAgICAgICAgICAgKS50ZXN0KHRoaXMucGFnZUNvbnRlbnQpLFxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHRhZ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pIGFzIHN0cmluZ1tdXG4gICAgICAgICkuc29ydCgoYSwgYikgPT4gYS50b0xvd2VyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoYi50b0xvd2VyQ2FzZSgpKSk7XG5cbiAgICAgICAgY29uc3Qgb3JpZ2luYWxSZWRpcmVjdFRhZ3MgPSBPYmplY3QuZW50cmllcyh0aGlzLnJlZGlyZWN0VGVtcGxhdGVzKVxuICAgICAgICAgICAgLmZsYXRNYXAoKFt0YWcsIHRhZ0RhdGFdKSA9PiBbdGFnLCAuLi50YWdEYXRhLmFsaWFzZXNdKVxuICAgICAgICAgICAgLm1hcCgodGFnT3JSZWRpcmVjdCkgPT5cbiAgICAgICAgICAgICAgICBuZXcgUmVnRXhwKGB7e1xcXFxzKlske3RhZ09yUmVkaXJlY3RbMF0udG9Mb3dlckNhc2UoKX0ke3RhZ09yUmVkaXJlY3RbMF19XSR7dGFnT3JSZWRpcmVjdC5zbGljZSgxKX1cXFxccyooXFxcXHx8fX0pYCkudGVzdChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYWdlQ29udGVudCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgID8gdGFnT3JSZWRpcmVjdFxuICAgICAgICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pIGFzIHN0cmluZ1tdO1xuXG4gICAgICAgIHRoaXMub2xkUmVkaXJlY3RUYWdEYXRhID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgICAgb3JpZ2luYWxSZWRpcmVjdFRhZ3NcbiAgICAgICAgICAgICAgICAubWFwKCh0YWcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSBuZXcgUmVnRXhwKGB7e1xcXFxzKlske3RhZ1swXS50b0xvd2VyQ2FzZSgpfSR7dGFnWzBdfV0ke3RhZy5zbGljZSgxKX1cXFxcfD8oLio/KVxcXFxzKn19YCkuZXhlYyhcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFnZUNvbnRlbnQsXG4gICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3VGFnID0gT2JqZWN0LmVudHJpZXModGhpcy5yZWRpcmVjdFRlbXBsYXRlcykuZmluZCgoW3RlbXBsYXRlLCB0YWdEYXRhXSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIFt0ZW1wbGF0ZSwgLi4udGFnRGF0YS5hbGlhc2VzXS5pbmNsdWRlcyh0YWcpLFxuICAgICAgICAgICAgICAgICAgICApPy5bMF07XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxBcmd1bWVudHMgPSBtYXRjaD8uWzFdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW9yaWdpbmFsQXJndW1lbnRzKSByZXR1cm4gbnVsbDtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3JtYXR0ZWRBcmd1bWVudHMgPSBtYXRjaFsxXS5zcGxpdCgnfCcpLm1hcCgoYXJndW1lbnQsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFyZ3VtZW50LmluY2x1ZGVzKCc9JykpIHJldHVybiBbKGluZGV4ICsgMSkudG9TdHJpbmcoKSwgYXJndW1lbnQudHJpbSgpXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgW25hbWUsIHZhbHVlXSA9IGFyZ3VtZW50LnNwbGl0KCc9Jyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbbmFtZS50cmltKCksIHZhbHVlLnRyaW0oKV07XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbbmV3VGFnLCBmb3JtYXR0ZWRBcmd1bWVudHNdO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKSBhcyBbc3RyaW5nLCBzdHJpbmdbXVtdXVtdLFxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMub2xkRGVmYXVsdFNvcnQgPVxuICAgICAgICAgICAgdGhpcy5wYWdlQ29udGVudFxuICAgICAgICAgICAgICAgIC5tYXRjaCgve3tERUZBVUxUU09SVDouKj99fS9nKVxuICAgICAgICAgICAgICAgID8uYXQoLTEpXG4gICAgICAgICAgICAgICAgPy5zbGljZSgxNCwgLTIpXG4gICAgICAgICAgICAgICAgLnRyaW0oKSA/PyAnJztcblxuICAgICAgICB0aGlzLm9sZENhdGVnb3JpZXMgPSB0aGlzLnBhZ2VDb250ZW50Lm1hdGNoKC9cXFtcXFtbQ2NdYXRlZ29yeTouKz9dXS9nKT8ubWFwKChjYXRlZ29yeSkgPT4gY2F0ZWdvcnkuc2xpY2UoMTEsIC0yKSkgPz8gW107XG5cbiAgICAgICAgdGhpcy5vbGRTdHJheVRleHQgPSBbXG4gICAgICAgICAgICAve3tzaG9ydCBkZXNjcmlwdGlvblxcfC4qP319L2kuZXhlYyh0aGlzLnBhZ2VDb250ZW50KT8uWzBdLFxuICAgICAgICAgICAgL3t7RElTUExBWVRJVExFOi4qP319Ly5leGVjKHRoaXMucGFnZUNvbnRlbnQpPy5bMF0sXG4gICAgICAgICAgICAve3tpdGFsaWMgdGl0bGVcXHw/Lio/fX0vaS5leGVjKHRoaXMucGFnZUNvbnRlbnQpPy5bMF0sXG4gICAgICAgICAgICAve3t0aXRsZSBsYW5ndWFnZVxcfC4qP319Ly5leGVjKHRoaXMucGFnZUNvbnRlbnQpPy5bMF0sXG4gICAgICAgICAgICAve3thdXRob3JpdHkgY29udHJvbChcXHwuKj8pP319L2kuZXhlYyh0aGlzLnBhZ2VDb250ZW50KT8uWzBdLFxuICAgICAgICBdXG4gICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgICAgICAuam9pbignXFxuJyk7XG5cbiAgICAgICAgaWYgKHRoaXMub2xkUmVkaXJlY3RUYXJnZXQpIHRoaXMucmVkaXJlY3RJbnB1dC5zZXRWYWx1ZSh0aGlzLm9sZFJlZGlyZWN0VGFyZ2V0LnJlcGxhY2VBbGwoJ18nLCAnICcpKTtcbiAgICAgICAgZWxzZSBtdy5ub3RpZnkoJ0NvdWxkIG5vdCBmaW5kIHJlZGlyZWN0IHRhcmdldCEnLCB7IHR5cGU6ICdlcnJvcicgfSk7XG5cbiAgICAgICAgdGhpcy50YWdTZWxlY3Quc2V0VmFsdWUodGhpcy5vbGRSZWRpcmVjdFRhZ3MpO1xuXG4gICAgICAgIGZvciAoY29uc3QgW3RlbXBsYXRlTmFtZSwgZGF0YV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5vbGRSZWRpcmVjdFRhZ0RhdGEpKSB7XG4gICAgICAgICAgICBjb25zdCBmb3VuZFRlbXBsYXRlRWRpdG9yID0gdGhpcy50ZW1wbGF0ZUVkaXRvcnNJbmZvLmZpbmQoKGVkaXRvckluZm8pID0+IGVkaXRvckluZm8ubmFtZSA9PT0gdGVtcGxhdGVOYW1lKTtcbiAgICAgICAgICAgIGlmICghZm91bmRUZW1wbGF0ZUVkaXRvcikgY29udGludWU7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgW3BhcmFtZXRlck5hbWUsIGFyZ3VtZW50XSBvZiBkYXRhKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZm91bmRQYXJhbWV0ZXJFZGl0b3IgPSBmb3VuZFRlbXBsYXRlRWRpdG9yLnBhcmFtZXRlcnMuZmluZCgocGFyYW1ldGVyKSA9PlxuICAgICAgICAgICAgICAgICAgICBbcGFyYW1ldGVyLm5hbWUsIC4uLnBhcmFtZXRlci5hbGlhc2VzXS5pbmNsdWRlcyhwYXJhbWV0ZXJOYW1lKSxcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgaWYgKGZvdW5kUGFyYW1ldGVyRWRpdG9yKSBmb3VuZFBhcmFtZXRlckVkaXRvci5lZGl0b3Iuc2V0VmFsdWUoYXJndW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMub2xkRGVmYXVsdFNvcnQpIHRoaXMuZGVmYXVsdFNvcnRJbnB1dC5zZXRWYWx1ZSh0aGlzLm9sZERlZmF1bHRTb3J0KTtcblxuICAgICAgICBmb3IgKGNvbnN0IGNhdGVnb3J5IG9mIHRoaXMub2xkQ2F0ZWdvcmllcykgdGhpcy5jYXRlZ29yeVNlbGVjdC5hZGRBbGxvd2VkVmFsdWUoY2F0ZWdvcnkpO1xuICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0LnNldFZhbHVlKHRoaXMub2xkQ2F0ZWdvcmllcy5tYXAoKGNhdGVnb3J5KSA9PiAoeyBkYXRhOiBjYXRlZ29yeSwgbGFiZWw6IGNhdGVnb3J5IH0pKSk7XG5cbiAgICAgICAgdGhpcy51cGRhdGVTdW1tYXJ5KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUnVucyBjaGVja3Mgb24gdGhlIHByb3ZpZGVkIGRhdGEgYW5kIHJldHVybnMgdGhlIGVycm9ycyAoaWYgYW55KS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlU3VibWlzc2lvbigpIHtcbiAgICAgICAgY29uc3QgZXJyb3JzOiB7XG4gICAgICAgICAgICB0aXRsZT86IHN0cmluZztcbiAgICAgICAgICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgICAgICAgICAgIGF1dG9GaXhlcz86ICh7IHR5cGU6ICdhZGQnIHwgJ3JlbW92ZSc7IHRhZzogc3RyaW5nIH0gfCB7IHR5cGU6ICdjaGFuZ2UtdGFyZ2V0JzsgdGFyZ2V0OiBzdHJpbmcgfSlbXTtcbiAgICAgICAgfVtdID0gW107XG5cbiAgICAgICAgY29uc3QgZGVzdGluYXRpb24gPSB0aGlzLnJlZGlyZWN0SW5wdXQuZ2V0VmFsdWUoKS50cmltKCk7XG4gICAgICAgIGNvbnN0IHRhZ3MgPSB0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdO1xuXG4gICAgICAgIC8qIEludmFsaWQgY2hhcmFjdGVycyAqL1xuICAgICAgICBpZiAoIS9eXFxzKlteW1xcXXt8fV0rXFxzKiQvLnRlc3QoZGVzdGluYXRpb24pKSBlcnJvcnMucHVzaCh7IHRpdGxlOiBkZXN0aW5hdGlvbiwgbWVzc2FnZTogJ2lzIG5vdCBhIHZhbGlkIHBhZ2UgdGl0bGUhJyB9KTtcblxuICAgICAgICAvKiBGYWlsZWQgZHVyaW5nIHRpdGxlIHBhcnNpbmcgKi9cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMucGFyc2VkRGVzdGluYXRpb24gPSBtdy5UaXRsZS5uZXdGcm9tVGV4dChkZXN0aW5hdGlvbik7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgaWYgKGVycm9ycy5sZW5ndGggPT09IDApIGVycm9ycy5wdXNoKHsgdGl0bGU6IGRlc3RpbmF0aW9uLCBtZXNzYWdlOiAnaXMgbm90IGEgdmFsaWQgcGFnZSB0aXRsZSEnIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5wYXJzZWREZXN0aW5hdGlvbiAmJiBlcnJvcnMubGVuZ3RoID09PSAwKSBlcnJvcnMucHVzaCh7IHRpdGxlOiBkZXN0aW5hdGlvbiwgbWVzc2FnZTogJ2lzIG5vdCBhIHZhbGlkIHBhZ2UgdGl0bGUhJyB9KTtcblxuICAgICAgICAvKiBTZWxmIHJlZGlyZWN0cyAqL1xuICAgICAgICBpZiAodGhpcy5wYXJzZWREZXN0aW5hdGlvbj8uZ2V0UHJlZml4ZWRUZXh0KCkgPT09IHRoaXMucGFnZVRpdGxlUGFyc2VkLmdldFByZWZpeGVkVGV4dCgpKVxuICAgICAgICAgICAgZXJyb3JzLnB1c2goeyBtZXNzYWdlOiAnY2Fubm90IHJlZGlyZWN0IHRvIGl0c2VsZiEnIH0pO1xuXG4gICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uRGF0YSA9IChhd2FpdCB0aGlzLmFwaVxuICAgICAgICAgICAgLmdldCh7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgICAgICBwcm9wOiBbJ3BhZ2Vwcm9wcycsICdjYXRlZ29yaWVzJ10sXG4gICAgICAgICAgICAgICAgdGl0bGVzOiBkZXN0aW5hdGlvbixcbiAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5UGFnZVByb3BzUGFyYW1zKVxuICAgICAgICAgICAgLmNhdGNoKChlcnJvckNvZGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3JDb2RlID09PSAnbWlzc2luZ3RpdGxlJykgZXJyb3JzLnB1c2goeyB0aXRsZTogZGVzdGluYXRpb24sIG1lc3NhZ2U6ICdkb2VzIG5vdCBleGlzdCEnIH0pO1xuICAgICAgICAgICAgICAgIGVsc2UgZXJyb3JzLnB1c2goeyB0aXRsZTogZGVzdGluYXRpb24sIG1lc3NhZ2U6IGB3YXMgbm90IGFibGUgdG8gYmUgZmV0Y2hlZCBmcm9tIHRoZSBBUEkgKCR7ZXJyb3JDb2RlfSkhYCB9KTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSkpIGFzIChQYWdlcHJvcHNSZXN1bHQgJiBDYXRlZ29yaWVzUmVzdWx0KSB8IG51bGw7XG4gICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uUGFyc2VSZXN1bHQgPSAoYXdhaXQgdGhpcy5hcGkuZ2V0KHtcbiAgICAgICAgICAgIGFjdGlvbjogJ3BhcnNlJyxcbiAgICAgICAgICAgIHBhZ2U6IGRlc3RpbmF0aW9uLFxuICAgICAgICAgICAgcHJvcDogJ3NlY3Rpb25zJyxcbiAgICAgICAgICAgIHJlZGlyZWN0czogdHJ1ZSxcbiAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUGFyc2VQYXJhbXMpKSBhcyBQYWdlUGFyc2VSZXN1bHQ7XG5cbiAgICAgICAgLyogRG91YmxlIHJlZGlyZWN0cyAqL1xuICAgICAgICBpZiAoZGVzdGluYXRpb25QYXJzZVJlc3VsdC5wYXJzZSEucmVkaXJlY3RzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uUmVkaXJlY3QgPVxuICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uUGFyc2VSZXN1bHQucGFyc2UhLnJlZGlyZWN0c1swXS50byArXG4gICAgICAgICAgICAgICAgKGRlc3RpbmF0aW9uUGFyc2VSZXN1bHQucGFyc2UhLnJlZGlyZWN0c1swXS50b2ZyYWdtZW50ID8gYCMke2Rlc3RpbmF0aW9uUGFyc2VSZXN1bHQucGFyc2UhLnJlZGlyZWN0c1swXS50b2ZyYWdtZW50fWAgOiAnJyk7XG4gICAgICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgdGl0bGU6IGRlc3RpbmF0aW9uLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBpcyBhIHJlZGlyZWN0IHRvIDxhIGhyZWY9XCIke213LnV0aWwuZ2V0VXJsKFxuICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvblJlZGlyZWN0LFxuICAgICAgICAgICAgICAgICl9XCIgdGFyZ2V0PVwiX2JsYW5rXCI+JHtkZXN0aW5hdGlvblJlZGlyZWN0fTwvYT4uIFJldGFyZ2V0IHRvIHRoYXQgcGFnZSBpbnN0ZWFkLCBhcyBkb3VibGUgcmVkaXJlY3RzIGFyZW4ndCBhbGxvd2VkLmAsXG4gICAgICAgICAgICAgICAgYXV0b0ZpeGVzOiBbeyB0eXBlOiAnY2hhbmdlLXRhcmdldCcsIHRhcmdldDogZGVzdGluYXRpb25SZWRpcmVjdCB9XSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogTm9uZXhpc3RlbnQgc2VjdGlvbiAqL1xuICAgICAgICBpZiAoZGVzdGluYXRpb24uc3BsaXQoJyMnKS5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICBjb25zdCB2YWxpZFNlY3Rpb24gPSBkZXN0aW5hdGlvblBhcnNlUmVzdWx0LnBhcnNlIS5zZWN0aW9ucy5maW5kKFxuICAgICAgICAgICAgICAgIChzZWN0aW9uKSA9PiBzZWN0aW9uLmxpbmUucmVwbGFjZUFsbCgvPFxcLz9pPi9nLCAnJykgPT09IGRlc3RpbmF0aW9uLnNwbGl0KCcjJylbMV0sXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKHZhbGlkU2VjdGlvbikge1xuICAgICAgICAgICAgICAgIGlmICh0YWdzLmluY2x1ZGVzKCdSIHRvIGFuY2hvcicpKVxuICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnaXMgdGFnZ2VkIGFzIGEgcmVkaXJlY3QgdG8gYW4gYW5jaG9yLCBidXQgaXQgaXMgYWN0dWFsbHkgYSByZWRpcmVjdCB0byBhIHNlY3Rpb24hJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9GaXhlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgdHlwZTogJ2FkZCcsIHRhZzogJ1IgdG8gc2VjdGlvbicgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHR5cGU6ICdyZW1vdmUnLCB0YWc6ICdSIHRvIGFuY2hvcicgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmICghdGFncy5pbmNsdWRlcygnUiB0byBzZWN0aW9uJykpXG4gICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdpcyBhIHJlZGlyZWN0IHRvIGEgc2VjdGlvbiwgYnV0IGl0IGlzIG5vdCB0YWdnZWQgd2l0aCA8Y29kZT57e1IgdG8gc2VjdGlvbn19PC9jb2RlPiEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXV0b0ZpeGVzOiBbeyB0eXBlOiAnYWRkJywgdGFnOiAnUiB0byBzZWN0aW9uJyB9XSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uQ29udGVudCA9IChcbiAgICAgICAgICAgICAgICAgICAgKGF3YWl0IHRoaXMuYXBpLmdldCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wOiAncmV2aXNpb25zJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ2cHJvcDogJ2NvbnRlbnQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgcnZzbG90czogJ21haW4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGVzOiB0aGlzLnBhcnNlZERlc3RpbmF0aW9uIS5nZXRQcmVmaXhlZFRleHQoKSxcbiAgICAgICAgICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlSZXZpc2lvbnNQYXJhbXMpKSBhcyBQYWdlUmV2aXNpb25zUmVzdWx0XG4gICAgICAgICAgICAgICAgKS5xdWVyeSEucGFnZXNbMF0ucmV2aXNpb25zWzBdLnNsb3RzLm1haW4uY29udGVudDtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGFuY2hvcnMgPSBbXG4gICAgICAgICAgICAgICAgICAgIC4uLihkZXN0aW5hdGlvbkNvbnRlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXRjaCgvKD88PXt7XFxzKj9bQWFdKD86bmNob3JzP3xuY2hvciBmb3IgcmVkaXJlY3R8bmtlcnxOQ0hPUnxuYylcXHMqP1xcfCkuKz8oPz19fSkvZylcbiAgICAgICAgICAgICAgICAgICAgICAgID8ubWFwKChhbmNob3I6IHN0cmluZykgPT4gYW5jaG9yLnNwbGl0KCd8JykubWFwKChwYXJ0KSA9PiBwYXJ0LnRyaW0oKSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAuZmxhdCgpID8/IFtdKSxcbiAgICAgICAgICAgICAgICAgICAgLi4uKGRlc3RpbmF0aW9uQ29udGVudFxuICAgICAgICAgICAgICAgICAgICAgICAgLm1hdGNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8oPzw9e3tcXHMqPyg/OltWdl0oPzppc2libGUgYW5jaG9ycz98aXNhbmN8QW5jaHxhbmNob3J8aXNpYmxlYW5jaG9yfGEpfFtBYV0oPzpuY2hvcmR8Y2hvcmVkfG5jaG9yXFwrKXxbVHRdZXh0IGFuY2hvcilcXHMqP1xcfCkuKz8oPz0oPzwhIXw9KX19KS9nLFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgPy5tYXAoKGFuY2hvcjogc3RyaW5nKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3BsaXQoJ3wnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKChwYXJ0KSA9PiBwYXJ0LnRyaW0oKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigocGFydCkgPT4gIS9edGV4dFxccyo/PS8udGVzdChwYXJ0KSksXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAuZmxhdCgpID8/IFtdKSxcbiAgICAgICAgICAgICAgICAgICAgLi4uKGRlc3RpbmF0aW9uQ29udGVudC5tYXRjaCgvKD88PWlkPSlcIj8uKz8oPz1cInw+fFxcfCkvZyk/Lm1hcCgoYW5jaG9yOiBzdHJpbmcpID0+IGFuY2hvci50cmltKCkpID8/IFtdKSxcbiAgICAgICAgICAgICAgICAgICAgLi4uKGRlc3RpbmF0aW9uQ29udGVudC5tYXRjaCgvRXBpc29kZU51bWJlciArPSArXFxkKy9nKT8ubWFwKChhbmNob3I6IHN0cmluZykgPT4gYGVwJHthbmNob3Iuc3BsaXQoJz0nKVsxXS50cmltKCl9YCkgPz9cbiAgICAgICAgICAgICAgICAgICAgICAgIFtdKSxcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGlmIChhbmNob3JzLmluY2x1ZGVzKGRlc3RpbmF0aW9uLnNwbGl0KCcjJylbMV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWdzLmluY2x1ZGVzKCdSIHRvIHNlY3Rpb24nKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnaXMgdGFnZ2VkIGFzIGEgcmVkaXJlY3QgdG8gYSBzZWN0aW9uLCBidXQgaXQgaXMgYWN0dWFsbHkgYSByZWRpcmVjdCB0byBhbiBhbmNob3IhJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvRml4ZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAnYWRkJywgdGFnOiAnUiB0byBhbmNob3InIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgdHlwZTogJ3JlbW92ZScsIHRhZzogJ1IgdG8gc2VjdGlvbicgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGFncy5pbmNsdWRlcygnUiB0byBhbmNob3InKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnaXMgYSByZWRpcmVjdCB0byBhbiBhbmNob3IsIGJ1dCBpdCBpcyBub3QgdGFnZ2VkIHdpdGggPGNvZGU+e3tSIGZyb20gYW5jaG9yfX08L2NvZGU+IScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b0ZpeGVzOiBbeyB0eXBlOiAnYWRkJywgdGFnOiAnUiB0byBhbmNob3InIH1dLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBpcyBhIHJlZGlyZWN0IHRvIDxhIGhyZWY9XCIke213LnV0aWwuZ2V0VXJsKGRlc3RpbmF0aW9uKX1cIiB0YXJnZXQ9XCJfYmxhbmtcIj4ke2Rlc3RpbmF0aW9ufTwvYT4sIGJ1dCB0aGF0IHNlY3Rpb24gb3IgYW5jaG9yIGRvZXMgbm90IGV4aXN0IWAsXG4gICAgICAgICAgICAgICAgICAgICAgICBhdXRvRml4ZXM6IFt7IHR5cGU6ICdjaGFuZ2UtdGFyZ2V0JywgdGFyZ2V0OiBkZXN0aW5hdGlvbi5zcGxpdCgnIycpWzBdIH1dLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8qIEltcHJvcGVybHkgdGFnZ2VkIGFzIHJlZGlyZWN0IHRvIHNlY3Rpb24vYW5jaG9yICovXG4gICAgICAgIGlmIChkZXN0aW5hdGlvbi5zcGxpdCgnIycpLmxlbmd0aCA9PT0gMSlcbiAgICAgICAgICAgIGZvciAoY29uc3QgdGFnIG9mIFsnUiB0byBzZWN0aW9uJywgJ1IgdG8gYW5jaG9yJ10pXG4gICAgICAgICAgICAgICAgaWYgKHRhZ3MuaW5jbHVkZXModGFnKSlcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYGlzIG5vdCBhIHJlZGlyZWN0IHRvIGEgc2VjdGlvbi9hbmNob3IsIGJ1dCBpdCBpcyB0YWdnZWQgd2l0aCA8Y29kZT57eyR7dGFnfX19PC9jb2RlPiFgLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXV0b0ZpeGVzOiBbeyB0eXBlOiAncmVtb3ZlJywgdGFnIH1dLFxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCB0YXJnZXRJc0Rpc2FtYmlndWF0aW9uUGFnZSA9ICEhKFxuICAgICAgICAgICAgZGVzdGluYXRpb25EYXRhIS5xdWVyeSEucGFnZXNbMF0ucGFnZXByb3BzICYmICdkaXNhbWJpZ3VhdGlvbicgaW4gZGVzdGluYXRpb25EYXRhIS5xdWVyeSEucGFnZXNbMF0ucGFnZXByb3BzXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHRhcmdldElzU3VybmFtZUxpc3QgPSAhIWRlc3RpbmF0aW9uRGF0YSEucXVlcnkhLnBhZ2VzWzBdLmNhdGVnb3JpZXM/LnNvbWUoXG4gICAgICAgICAgICAoY2F0ZWdvcnkpID0+IGNhdGVnb3J5LnRpdGxlID09PSAnQ2F0ZWdvcnk6U3VybmFtZXMnLFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IHRvRGlzYW1iaWd1YXRpb25QYWdlVGFncyA9IFsnUiB0byBkaXNhbWJpZ3VhdGlvbiBwYWdlJywgJ1IgZnJvbSBpbmNvbXBsZXRlIGRpc2FtYmlndWF0aW9uJ107XG4gICAgICAgIGNvbnN0IHRvU3VybmFtZUxpc3RUYWdzID0gWydSIGZyb20gYW1iaWd1b3VzIHNvcnQgbmFtZScsICdSIGZyb20gYW1iaWd1b3VzIHRlcm0nXTtcblxuICAgICAgICBjb25zdCB0YWdnZWRBc1JlZGlyZWN0VG9EaXNhbWJpZ3VhdGlvblBhZ2UgPSB0b0Rpc2FtYmlndWF0aW9uUGFnZVRhZ3Muc29tZSgodGVtcGxhdGUpID0+IHRhZ3MuaW5jbHVkZXModGVtcGxhdGUpKTtcbiAgICAgICAgY29uc3QgdGFnZ2VkQXNSZWRpcmVjdFRvU3VybmFtZUxpc3QgPSB0b1N1cm5hbWVMaXN0VGFncy5zb21lKCh0ZW1wbGF0ZSkgPT4gdGFncy5pbmNsdWRlcyh0ZW1wbGF0ZSkpO1xuXG4gICAgICAgIC8qIFJlZGlyZWN0IHRvIGRpc2FtYmlndWF0aW9uIHBhZ2Ugd2l0aG91dCB0ZW1wbGF0ZSAqL1xuICAgICAgICBpZiAodGFyZ2V0SXNEaXNhbWJpZ3VhdGlvblBhZ2UgJiYgIXRhZ2dlZEFzUmVkaXJlY3RUb0Rpc2FtYmlndWF0aW9uUGFnZSAmJiAhdGFnZ2VkQXNSZWRpcmVjdFRvU3VybmFtZUxpc3QpXG4gICAgICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ2lzIGEgcmVkaXJlY3QgdG8gYSBkaXNhbWJpZ3VhdGlvbiBwYWdlLCBidXQgaXQgaXMgbm90IHRhZ2dlZCB3aXRoIGEgZGlzYW1iaWd1YXRpb24gY2F0ZWdvcml6YXRpb24gdGVtcGxhdGUhJyxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChkZXN0aW5hdGlvbkRhdGEhLnF1ZXJ5IS5wYWdlc1swXS5wYWdlcHJvcHMgJiYgIXRhcmdldElzRGlzYW1iaWd1YXRpb25QYWdlKSB7XG4gICAgICAgICAgICAvKiBJbXByb3Blcmx5IHRhZ2dlZCBhcyByZWRpcmVjdCB0byBkaXNhbWJpZ3VhdGlvbiBwYWdlICovXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgKCF0YXJnZXRJc1N1cm5hbWVMaXN0ICYmICh0YWdnZWRBc1JlZGlyZWN0VG9EaXNhbWJpZ3VhdGlvblBhZ2UgfHwgdGFnZ2VkQXNSZWRpcmVjdFRvU3VybmFtZUxpc3QpKSB8fFxuICAgICAgICAgICAgICAgICh0YXJnZXRJc1N1cm5hbWVMaXN0ICYmIHRhZ2dlZEFzUmVkaXJlY3RUb0Rpc2FtYmlndWF0aW9uUGFnZSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdpcyBub3QgYSByZWRpcmVjdCB0byBhIGRpc2FtYmlndWF0aW9uIHBhZ2UsIGJ1dCBpdCBpcyB0YWdnZWQgd2l0aCBhIGRpc2FtYmlndWF0aW9uIGNhdGVnb3JpemF0aW9uIHRlbXBsYXRlIScsXG4gICAgICAgICAgICAgICAgICAgIGF1dG9GaXhlczogWy4uLnRvRGlzYW1iaWd1YXRpb25QYWdlVGFncywgLi4udG9TdXJuYW1lTGlzdFRhZ3NdLm1hcCgodGFnKSA9PiAoeyB0eXBlOiAncmVtb3ZlJywgdGFnIH0pKSxcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLyogUmVkaXJlY3QgdG8gc3VybmFtZSBsaXN0IHdpdGhvdXQgdGVtcGxhdGUgKi9cbiAgICAgICAgICAgIGlmICh0YXJnZXRJc1N1cm5hbWVMaXN0ICYmICF0YWdnZWRBc1JlZGlyZWN0VG9TdXJuYW1lTGlzdClcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdpcyBhIHJlZGlyZWN0IHRvIGEgc3VybmFtZSBsaXN0LCBidXQgaXQgaXMgbm90IHRhZ2dlZCB3aXRoIGEgY29ycmVjdCBkaXNhbWJpZ3VhdGlvbiBjYXRlZ29yaXphdGlvbiB0ZW1wbGF0ZSEnLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoge3tSIHRvIGRpc2FtYmlndWF0aW9uIHBhZ2V9fSB3aXRob3V0IFwiIChkaXNhbWJpZ3VhdGlvbilcIiBhdCBlbmQgb2YgdGl0bGUgKi9cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGFyZ2V0SXNEaXNhbWJpZ3VhdGlvblBhZ2UgJiZcbiAgICAgICAgICAgIHRhZ3MuaW5jbHVkZXMoJ1IgdG8gZGlzYW1iaWd1YXRpb24gcGFnZScpICYmXG4gICAgICAgICAgICAhdGhpcy5wYWdlVGl0bGVQYXJzZWQuZ2V0TWFpblRleHQoKS5lbmRzV2l0aCgnIChkaXNhbWJpZ3VhdGlvbiknKVxuICAgICAgICApXG4gICAgICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgbWVzc2FnZTpcbiAgICAgICAgICAgICAgICAgICAgJ2lzIHRhZ2dlZCB3aXRoIDxjb2RlPnt7UiB0byBkaXNhbWJpZ3VhdGlvbiBwYWdlfX08L2NvZGU+LCBidXQgdGhpcyB0aXRsZSBkb2VzIG5vdCBlbmQgd2l0aCBcIiAoZGlzYW1iaWd1YXRpb24pXCIuIFVzZSA8Y29kZT57e1IgZnJvbSBhbWJpZ3VvdXMgdGVybX19PC9jb2RlPiBvciBhIHNpbWlsYXIgY2F0ZWdvcml6YXRpb24gdGVtcGxhdGUgaW5zdGVhZCEnLFxuICAgICAgICAgICAgICAgIGF1dG9GaXhlczogW3sgdHlwZTogJ3JlbW92ZScsIHRhZzogJ1IgdG8gZGlzYW1iaWd1YXRpb24gcGFnZScgfV0sXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAvKiBUYWdnZWQgd2l0aCBhIHByb3RlY3Rpb24gdGVtcGxhdGUgKi9cbiAgICAgICAgZm9yIChjb25zdCB0ZW1wbGF0ZSBvZiBbJ1IgcHJvdGVjdGVkJywgJ1Igc2VtaS1wcm90ZWN0ZWQnLCAnUiBleHRlbmRlZC1wcm90ZWN0ZWQnLCAnUiB0ZW1wbGF0ZS1wcm90ZWN0ZWQnLCAnUiBmdWxseSBwcm90ZWN0ZWQnXSlcbiAgICAgICAgICAgIGlmICh0YWdzLmluY2x1ZGVzKHRlbXBsYXRlKSlcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBpcyB0YWdnZWQgd2l0aCB1bm5lY2Vzc2FyaWx5IHRhZ2dlZCB3aXRoIDxjb2RlPnt7JHt0ZW1wbGF0ZX19fTwvY29kZT4gd2hpY2ggd2lsbCBiZSBkdXBsaWNhdGVkIGJ5IHRoZSByZWRpcmVjdCBjYXRlZ29yeSBzaGVsbCFgLFxuICAgICAgICAgICAgICAgICAgICBhdXRvRml4ZXM6IFt7IHR5cGU6ICdyZW1vdmUnLCB0YWc6IHRlbXBsYXRlIH1dLFxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIC8qIExpbmtlZCB0byBhIFdpa2lkYXRhIGl0ZW0gd2l0aG91dCBiZWluZyB0YWdnZWQgd2l0aCB7e1Igd2l0aCBXaWtpZGF0YSBpdGVtfX0gKi9cbiAgICAgICAgaWYgKG13LmNvbmZpZy5nZXQoJ3dnV2lraWJhc2VJdGVtSWQnKSAmJiAhdGFncy5pbmNsdWRlcygnUiB3aXRoIFdpa2lkYXRhIGl0ZW0nKSlcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBcImlzIGxpbmtlZCB0byBhIFdpa2lkYXRhIGl0ZW0gYnV0IGl0IGlzbid0IHRhZ2dlZCB3aXRoIDxjb2RlPnt7UiB3aXRoIFdpa2lkYXRhIGl0ZW19fTwvY29kZT4hXCIsXG4gICAgICAgICAgICAgICAgYXV0b0ZpeGVzOiBbeyB0eXBlOiAnYWRkJywgdGFnOiAnUiB3aXRoIFdpa2lkYXRhIGl0ZW0nIH1dLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgLyogVGFnZ2VkIHdpdGgge3tSIHdpdGggV2lraWRhdGEgaXRlbX19IHdpdGhvdXQgYmVpbmcgbGlua2VkIHRvIGFuIGl0ZW0gKi9cbiAgICAgICAgaWYgKHRhZ3MuaW5jbHVkZXMoJ1Igd2l0aCBXaWtpZGF0YSBpdGVtJykgJiYgIW13LmNvbmZpZy5nZXQoJ3dnV2lraWJhc2VJdGVtSWQnKSlcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiAnaXMgdGFnZ2VkIHdpdGggPGNvZGU+e3tSIHdpdGggV2lraWRhdGEgaXRlbX19PC9jb2RlPiBidXQgaXQgaXMgbm90IGFjdHVhbGx5IGxpbmtlZCB0byBhIFdpa2lkYXRhIGl0ZW0hJyxcbiAgICAgICAgICAgICAgICBhdXRvRml4ZXM6IFt7IHR5cGU6ICdyZW1vdmUnLCB0YWc6ICdSIHdpdGggV2lraWRhdGEgaXRlbScgfV0sXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAvKiBNaXNzaW5nIHRhZyByZXF1aXJlZCBwYXJhbWV0ZXIgKi9cbiAgICAgICAgZm9yIChjb25zdCB0YWcgb2YgdGFncykge1xuICAgICAgICAgICAgaWYgKCEodGFnIGluIHRoaXMucmVkaXJlY3RUZW1wbGF0ZXMpKSBjb250aW51ZTtcblxuICAgICAgICAgICAgY29uc3QgdGFnRGF0YSA9IHRoaXMucmVkaXJlY3RUZW1wbGF0ZXNbdGFnXTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBbcGFyYW1ldGVyTmFtZSwgcGFyYW1ldGVyRGF0YV0gb2YgT2JqZWN0LmVudHJpZXModGFnRGF0YS5wYXJhbWV0ZXJzKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZvdW5kUGFyYW1ldGVyID0gdGhpcy50ZW1wbGF0ZUVkaXRvcnNJbmZvXG4gICAgICAgICAgICAgICAgICAgIC5maW5kKChlZGl0b3JJbmZvKSA9PiBlZGl0b3JJbmZvLm5hbWUgPT09IHRhZylcbiAgICAgICAgICAgICAgICAgICAgPy5wYXJhbWV0ZXJzLmZpbmQoKHBhcmFtZXRlcikgPT4gW3BhcmFtZXRlci5uYW1lLCAuLi5wYXJhbWV0ZXIuYWxpYXNlc10uaW5jbHVkZXMocGFyYW1ldGVyTmFtZSkpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFmb3VuZFBhcmFtZXRlcikgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyRGF0YS5yZXF1aXJlZCAmJiAhZm91bmRQYXJhbWV0ZXIuZWRpdG9yLmdldFZhbHVlKCkudHJpbSgpKVxuICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgaXMgdGFnZ2VkIHdpdGggPGNvZGU+e3ske3RhZ319fTwvY29kZT4gYnV0IGl0IGlzIG1pc3NpbmcgdGhlIHJlcXVpcmVkIHBhcmFtZXRlciA8Y29kZT4ke3BhcmFtZXRlck5hbWV9PC9jb2RlPiFgLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8qIFN5bmNpbmcgdGFsayBwYWdlIGJ1dCB0YWxrIHBhZ2UgZXhpc3RzIGFuZCBpc24ndCBhIHJlZGlyZWN0ICovXG4gICAgICAgIGlmICh0aGlzLnN5bmNUYWxrQ2hlY2tib3g/LmlzU2VsZWN0ZWQoKSAmJiAhdGhpcy50YWxrRGF0YSEucXVlcnkhLnBhZ2VzWzBdLm1pc3NpbmcgJiYgIXRoaXMudGFsa0RhdGEhLnF1ZXJ5IS5wYWdlc1swXS5yZWRpcmVjdClcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgICB0aXRsZTogdGhpcy5wYWdlVGl0bGVQYXJzZWQuZ2V0VGFsa1BhZ2UoKSEuZ2V0UHJlZml4ZWRUZXh0KCksXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ2V4aXN0cywgYnV0IGlzIG5vdCBhIHJlZGlyZWN0IScsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZXJyb3JzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgdGhlIGV2ZW50IHdoZW4gdGhlIHVzZXIgY2xpY2tzIHRoZSBcIlN1Ym1pdFwiIGJ1dHRvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIGhhbmRsZVN1Ym1pdEJ1dHRvbkNsaWNrKCkge1xuICAgICAgICBjb25zdCBlbGVtZW50c1RvRGlzYWJsZSA9IFtcbiAgICAgICAgICAgIHRoaXMucmVkaXJlY3RJbnB1dCxcbiAgICAgICAgICAgIHRoaXMudGFnU2VsZWN0LFxuICAgICAgICAgICAgLi4udGhpcy50ZW1wbGF0ZUVkaXRvcnNJbmZvLmZsYXRNYXAoKHRlbXBsYXRlKSA9PiB0ZW1wbGF0ZS5wYXJhbWV0ZXJzLm1hcCgocGFyYW1ldGVyKSA9PiBwYXJhbWV0ZXIuZWRpdG9yKSksXG4gICAgICAgICAgICB0aGlzLmRlZmF1bHRTb3J0SW5wdXQsXG4gICAgICAgICAgICB0aGlzLmRlZmF1bHRTb3J0U3VnZ2VzdEJ1dHRvbixcbiAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3QsXG4gICAgICAgICAgICB0aGlzLnN1bW1hcnlJbnB1dCxcbiAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLFxuICAgICAgICAgICAgdGhpcy5zaG93UHJldmlld0J1dHRvbixcbiAgICAgICAgICAgIHRoaXMuc2hvd0NoYW5nZXNCdXR0b24sXG4gICAgICAgICAgICB0aGlzLnN5bmNUYWxrQ2hlY2tib3gsXG4gICAgICAgICAgICB0aGlzLndhdGNoQ2hlY2tib3gsXG4gICAgICAgICAgICB0aGlzLnBhdHJvbENoZWNrYm94LFxuICAgICAgICBdLmZpbHRlcihCb29sZWFuKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHNUb0Rpc2FibGUpIChlbGVtZW50IGFzIE9PLnVpLldpZGdldCkuc2V0RGlzYWJsZWQodHJ1ZSk7XG5cbiAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24uc2V0TGFiZWwoJ0NoZWNraW5nIHRhcmdldCB2YWxpZGl0eS4uLicpO1xuXG4gICAgICAgIGxldCBlcnJvcnM6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgdGhpcy52YWxpZGF0ZVN1Ym1pc3Npb24+PiA9IFtdO1xuICAgICAgICBpZiAodGhpcy5uZWVkc0NoZWNrKSBlcnJvcnMgPSBhd2FpdCB0aGlzLnZhbGlkYXRlU3VibWlzc2lvbigpO1xuICAgICAgICBlbHNlIHRoaXMucGFyc2VkRGVzdGluYXRpb24gPSBtdy5UaXRsZS5uZXdGcm9tVGV4dCh0aGlzLnJlZGlyZWN0SW5wdXQuZ2V0VmFsdWUoKSk7XG5cbiAgICAgICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnJlZGlyZWN0LWhlbHBlci13YXJuaW5nJykpIGVsZW1lbnQucmVtb3ZlKCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHsgdGl0bGUsIG1lc3NhZ2UsIGF1dG9GaXhlcyB9IG9mIGVycm9ycykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gbmV3IE9PLnVpLkh0bWxTbmlwcGV0KFxuICAgICAgICAgICAgICAgICAgICBgJHt0aXRsZSA/IGA8YSBocmVmPVwiJHttdy51dGlsLmdldFVybCh0aXRsZSl9XCIgdGFyZ2V0PVwiX2JsYW5rXCI+JHt0aXRsZX08L2E+YCA6ICdUaGlzIHBhZ2UnfSAke21lc3NhZ2V9IENsaWNrIGFnYWluIHdpdGhvdXQgbWFraW5nIGNoYW5nZXMgdG8gc3VibWl0IGFueXdheS5gLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgY29uc3Qgd2FybmluZ01lc3NhZ2UgPSBuZXcgT08udWkuTWVzc2FnZVdpZGdldCh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzZXM6IFsncmVkaXJlY3QtaGVscGVyLXdhcm5pbmcnXSxcbiAgICAgICAgICAgICAgICAgICAgaW5saW5lOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGlmIChhdXRvRml4ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXV0b0ZpeEJ1dHRvbiA9IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdQZXJmb3JtIGF1dG8tZml4JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzOiBbJ3Byb2dyZXNzaXZlJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc2VzOiBbJ3JlZGlyZWN0LWhlbHBlci1hdXRvZml4LWJ1dHRvbiddLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgYXV0b0ZpeEJ1dHRvbi5vbignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YWdzID0gdGhpcy50YWdTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvRml4IG9mIGF1dG9GaXhlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdXRvRml4LnR5cGUgPT09ICdhZGQnICYmICF0YWdzLmluY2x1ZGVzKGF1dG9GaXgudGFnKSkgdGhpcy50YWdTZWxlY3QuYWRkVGFnKGF1dG9GaXgudGFnLCBhdXRvRml4LnRhZyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXV0b0ZpeC50eXBlID09PSAncmVtb3ZlJyAmJiB0YWdzLmluY2x1ZGVzKGF1dG9GaXgudGFnKSkgdGhpcy50YWdTZWxlY3QucmVtb3ZlVGFnQnlEYXRhKGF1dG9GaXgudGFnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdXRvRml4LnR5cGUgPT09ICdjaGFuZ2UtdGFyZ2V0JykgdGhpcy5yZWRpcmVjdElucHV0LnNldFZhbHVlKGF1dG9GaXgudGFyZ2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZ01lc3NhZ2UuJGVsZW1lbnRbMF0uc3R5bGUudGV4dERlY29yYXRpb24gPSAnbGluZS10aHJvdWdoIDJweCBibGFjayc7XG4gICAgICAgICAgICAgICAgICAgICAgICBhdXRvRml4QnV0dG9uLiRlbGVtZW50WzBdLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICB3YXJuaW5nTWVzc2FnZS4kZWxlbWVudFswXS5xdWVyeVNlbGVjdG9yKCcub28tdWktbGFiZWxFbGVtZW50LWxhYmVsJykhLmFwcGVuZChhdXRvRml4QnV0dG9uLiRlbGVtZW50WzBdKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvckJveC4kZWxlbWVudFswXS5hcHBlbmQod2FybmluZ01lc3NhZ2UuJGVsZW1lbnRbMF0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHNUb0Rpc2FibGUpIChlbGVtZW50IGFzIE9PLnVpLldpZGdldCkuc2V0RGlzYWJsZWQoZmFsc2UpO1xuXG4gICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5zZXRMYWJlbCgnU3VibWl0IGFueXdheScpO1xuICAgICAgICAgICAgdGhpcy5uZWVkc0NoZWNrID0gZmFsc2U7XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIEVkaXQvY3JlYXRlIHJlZGlyZWN0ICovXG4gICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldExhYmVsKGAke3RoaXMuZXhpc3RzID8gJ0VkaXRpbmcnIDogJ0NyZWF0aW5nJ30gcmVkaXJlY3QuLi5gKTtcblxuICAgICAgICBjb25zdCBvdXRwdXQgPSB0aGlzLmNyZWF0ZU91dHB1dChcbiAgICAgICAgICAgIHRoaXMucmVkaXJlY3RJbnB1dC5nZXRWYWx1ZSgpLFxuICAgICAgICAgICAgdGhpcy50YWdTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXSxcbiAgICAgICAgICAgIHRoaXMub2xkU3RyYXlUZXh0LFxuICAgICAgICAgICAgdGhpcy5kZWZhdWx0U29ydElucHV0LmdldFZhbHVlKCksXG4gICAgICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10sXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3Qgc3VtbWFyeSA9XG4gICAgICAgICAgICAodGhpcy5zdW1tYXJ5SW5wdXQuZ2V0VmFsdWUoKSB8fCAodGhpcy5zdW1tYXJ5SW5wdXQuJHRhYkluZGV4ZWRbMF0gYXMgSFRNTElucHV0RWxlbWVudCkucGxhY2Vob2xkZXIpICsgdGhpcy5zY3JpcHRNZXNzYWdlO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZWRpdE9yQ3JlYXRlKHRoaXMucGFnZVRpdGxlLCBvdXRwdXQsIHN1bW1hcnkpO1xuICAgICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuO1xuXG4gICAgICAgIG13Lm5vdGlmeShgUmVkaXJlY3QgJHt0aGlzLmV4aXN0cyA/ICdlZGl0ZWQnIDogJ2NyZWF0ZWQnfSBzdWNjZXNzZnVsbHkhYCwgeyB0eXBlOiAnc3VjY2VzcycgfSk7XG5cbiAgICAgICAgLyogU3luYyB0YWxrIHBhZ2UgY2hlY2tib3ggaGFuZGxlciAqL1xuICAgICAgICBpZiAodGhpcy5zeW5jVGFsa0NoZWNrYm94Py5pc1NlbGVjdGVkKCkpIHtcbiAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldExhYmVsKCdFZGl0aW5nIHRhbGsgcGFnZS4uLicpO1xuXG4gICAgICAgICAgICBjb25zdCBmcm9tTW92ZSA9IHRoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkuaW5jbHVkZXMoJ1IgZnJvbSBtb3ZlJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IG91dHB1dCA9IHRoaXMuY3JlYXRlT3V0cHV0KFxuICAgICAgICAgICAgICAgIHRoaXMucGFyc2VkRGVzdGluYXRpb24hLmdldFRhbGtQYWdlKCkhLmdldFByZWZpeGVkVGV4dCgpLFxuICAgICAgICAgICAgICAgIGZyb21Nb3ZlID8gWydSIGZyb20gbW92ZSddIDogW10sXG4gICAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBbXSxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGNvbnN0IHRhbGtSZXN1bHQgPSBhd2FpdCB0aGlzLmVkaXRPckNyZWF0ZShcbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2VUaXRsZVBhcnNlZC5nZXRUYWxrUGFnZSgpIS5nZXRQcmVmaXhlZFRleHQoKSxcbiAgICAgICAgICAgICAgICBvdXRwdXQsXG4gICAgICAgICAgICAgICAgJ1N5bmNpbmcgcmVkaXJlY3QgZnJvbSBtYWluIHBhZ2UnICsgdGhpcy5zY3JpcHRNZXNzYWdlLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICghdGFsa1Jlc3VsdCkgcmV0dXJuO1xuXG4gICAgICAgICAgICBtdy5ub3RpZnkoJ1RhbGsgcGFnZSBzeW5jZWQgc3VjY2Vzc2Z1bGx5IScsIHsgdHlwZTogJ3N1Y2Nlc3MnIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogUGF0cm9sIGNoZWNrYm94IGhhbmRsZXIgKi9cbiAgICAgICAgaWYgKHRoaXMucGF0cm9sQ2hlY2tib3g/LmlzU2VsZWN0ZWQoKSkge1xuICAgICAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24uc2V0TGFiZWwoJ1BhdHJvbGxpbmcgcmVkaXJlY3QuLi4nKTtcblxuICAgICAgICAgICAgY29uc3QgcGF0cm9sTGluazogSFRNTEFuY2hvckVsZW1lbnQgfCBudWxsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnBhdHJvbGxpbmsgYScpO1xuICAgICAgICAgICAgY29uc3QgbWFya1Jldmlld2VkQnV0dG9uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MQnV0dG9uRWxlbWVudD4oJyNtd2UtcHQtbWFyay1hcy1yZXZpZXdlZC1idXR0b24nKTtcblxuICAgICAgICAgICAgaWYgKHBhdHJvbExpbmspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXRyb2xSZXN1bHQgPSAoYXdhaXQgdGhpcy5hcGlcbiAgICAgICAgICAgICAgICAgICAgLnBvc3RXaXRoVG9rZW4oJ3BhdHJvbCcsIHsgYWN0aW9uOiAncGF0cm9sJywgcmNpZDogbmV3IFVSTChwYXRyb2xMaW5rLmhyZWYpLnNlYXJjaFBhcmFtcy5nZXQoJ3JjaWQnKSEgfSlcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKChlcnJvckNvZGUsIGVycm9ySW5mbykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbXcubm90aWZ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBFcnJvciBwYXRyb2xsaW5nICR7dGhpcy5wYWdlVGl0bGV9IHZpYSBBUEk6ICR7KGVycm9ySW5mbyBhcyBNZWRpYVdpa2lEYXRhRXJyb3IpPy5lcnJvci5pbmZvID8/ICdVbmtub3duIGVycm9yJ30gKCR7ZXJyb3JDb2RlfSlgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgdHlwZTogJ2Vycm9yJyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH0pKSBhcyBvYmplY3QgfCBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChwYXRyb2xSZXN1bHQpIG13Lm5vdGlmeSgnUmVkaXJlY3QgcGF0cm9sbGVkIHN1Y2Nlc3NmdWxseSEnLCB7IHR5cGU6ICdzdWNjZXNzJyB9KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWFya1Jldmlld2VkQnV0dG9uKSB7XG4gICAgICAgICAgICAgICAgbWFya1Jldmlld2VkQnV0dG9uLmNsaWNrKCk7XG4gICAgICAgICAgICAgICAgbXcubm90aWZ5KCdSZWRpcmVjdCBwYXRyb2xsZWQgc3VjY2Vzc2Z1bGx5IScsIHsgdHlwZTogJ3N1Y2Nlc3MnIH0pO1xuICAgICAgICAgICAgfSBlbHNlIG13Lm5vdGlmeSgnUGFnZSBjdXJhdGlvbiB0b29sYmFyIG5vdCBmb3VuZCwgcmVkaXJlY3QgY2Fubm90IGJlIHBhdHJvbGxlZCEnLCB7IHR5cGU6ICdlcnJvcicgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5zZXRMYWJlbCgnQ29tcGxldGUsIHJlbG9hZGluZy4uLicpO1xuXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gbXcudXRpbC5nZXRVcmwodGhpcy5wYWdlVGl0bGUsIHsgcmVkaXJlY3Q6ICdubycgfSk7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBUYWtlcyBwcm92aWRlZCB2YWx1ZXMgdG8gY3JlYXRlIHRoZSBwYWdlIG91dHB1dC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZU91dHB1dChcbiAgICAgICAgdGFyZ2V0OiBzdHJpbmcsXG4gICAgICAgIHRhZ3M6IHN0cmluZ1tdLFxuICAgICAgICBzdHJheVRleHQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgZGVmYXVsdFNvcnQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgY2F0ZWdvcmllczogc3RyaW5nW10sXG4gICAgKSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFRhcmdldCA9IG13LlRpdGxlLm5ld0Zyb21UZXh0KHRhcmdldCk7XG5cbiAgICAgICAgY29uc3QgZm9ybWF0dGVkVGl0bGUgPSBwYXJzZWRUYXJnZXRcbiAgICAgICAgICAgID8gYCR7cGFyc2VkVGFyZ2V0LmdldE5hbWVzcGFjZUlkKCkgPT09IDE0ID8gJzonIDogJyd9JHtwYXJzZWRUYXJnZXQuZ2V0UHJlZml4ZWRUZXh0KCl9JHtwYXJzZWRUYXJnZXQuZ2V0RnJhZ21lbnQoKSA/IGAjJHtwYXJzZWRUYXJnZXQuZ2V0RnJhZ21lbnQoKX1gIDogJyd9YFxuICAgICAgICAgICAgOiB0YXJnZXQudHJpbSgpO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMucGFnZVRpdGxlUGFyc2VkXG4gICAgICAgICAgICAgICAgLmdldE1haW5UZXh0KClcbiAgICAgICAgICAgICAgICAudG9Mb2NhbGVMb3dlckNhc2UoKVxuICAgICAgICAgICAgICAgIC5ub3JtYWxpemUoJ05GRCcpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2VBbGwoL1tcXHUwMzAwLVxcdTAzNkZdL2csICcnKSA9PT1cbiAgICAgICAgICAgIGRlZmF1bHRTb3J0XG4gICAgICAgICAgICAgICAgPy50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgICAgLm5vcm1hbGl6ZSgnTkZEJylcbiAgICAgICAgICAgICAgICAucmVwbGFjZUFsbCgvW1xcdTAzMDAtXFx1MDM2Rl0vZywgJycpXG4gICAgICAgIClcbiAgICAgICAgICAgIGRlZmF1bHRTb3J0ID0gdW5kZWZpbmVkOyAvLyBDaGVjayBpZiB0aXRsZXMgbm9ybWFsaXplIHRvIHRoZSBzYW1lIHRleHQsIGFuZCByZW1vdmVzIHRoZSBERUZBVUxUU09SVCBpZiBzb1xuXG4gICAgICAgIGNvbnN0IHRhZ3NXaXRoQXJndW1lbnRzID0gdGFncy5tYXAoKHRhZykgPT4ge1xuICAgICAgICAgICAgY29uc3QgZm91bmRBcmd1bWVudEVkaXRvciA9IHRoaXMudGVtcGxhdGVFZGl0b3JzSW5mby5maW5kKChlZGl0b3JJbmZvKSA9PiBlZGl0b3JJbmZvLm5hbWUgPT09IHRhZyk7XG4gICAgICAgICAgICBpZiAoIWZvdW5kQXJndW1lbnRFZGl0b3IpIHJldHVybiBge3ske3RhZ319fWA7XG5cbiAgICAgICAgICAgIGNvbnN0IGxhc3ROdW1iZXJQYXJhbWV0ZXJJbmRleCA9IGZvdW5kQXJndW1lbnRFZGl0b3IucGFyYW1ldGVycy5maW5kTGFzdEluZGV4KFxuICAgICAgICAgICAgICAgIChwYXJhbWV0ZXIsIGluZGV4KSA9PiBwYXJhbWV0ZXIubmFtZSA9PT0gKGluZGV4ICsgMSkudG9TdHJpbmcoKSAmJiBwYXJhbWV0ZXIuZWRpdG9yLmdldFZhbHVlKCkudHJpbSgpLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgY29uc3QgbWFwcGVkQXJndW1lbnRzID0gZm91bmRBcmd1bWVudEVkaXRvci5wYXJhbWV0ZXJzXG4gICAgICAgICAgICAgICAgLm1hcCgocGFyYW1ldGVyLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHBhcmFtZXRlci5lZGl0b3IuZ2V0VmFsdWUoKS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdmFsdWUgJiYgaW5kZXggPiBsYXN0TnVtYmVyUGFyYW1ldGVySW5kZXgpIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgfCR7cGFyYW1ldGVyLm5hbWUgPT09IChpbmRleCArIDEpLnRvU3RyaW5nKCkgPyAnJyA6IGAke3BhcmFtZXRlci5uYW1lfT1gfSR7dmFsdWV9YDtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgICAgICAgICAuam9pbignJyk7XG5cbiAgICAgICAgICAgIHJldHVybiBge3ske3RhZ30ke21hcHBlZEFyZ3VtZW50c319fWA7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBgI1JFRElSRUNUIFtbJHtmb3JtYXR0ZWRUaXRsZX1dXVxcbmAsXG4gICAgICAgICAgICB0YWdzLmxlbmd0aCA+IDAgPyBge3tSZWRpcmVjdCBjYXRlZ29yeSBzaGVsbHxcXG4ke3RhZ3NXaXRoQXJndW1lbnRzLmpvaW4oJ1xcbicpfVxcbn19XFxuYCA6IG51bGwsXG4gICAgICAgICAgICBzdHJheVRleHQgPyBzdHJheVRleHQgKyAnXFxuJyA6IG51bGwsXG4gICAgICAgICAgICBkZWZhdWx0U29ydCA/IGB7e0RFRkFVTFRTT1JUOiR7ZGVmYXVsdFNvcnQudHJpbSgpfX19YCA6IG51bGwsXG4gICAgICAgICAgICBjYXRlZ29yaWVzLmxlbmd0aCA+IDAgPyBjYXRlZ29yaWVzLm1hcCgoY2F0ZWdvcnkpID0+IGBbW0NhdGVnb3J5OiR7Y2F0ZWdvcnl9XV1gKS5qb2luKCdcXG4nKSA6IG51bGwsXG4gICAgICAgIF1cbiAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgICAgIC5qb2luKCdcXG4nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGZXRjaGVzIHRoZSBjb250ZW50IG9mIGEgZ2l2ZW4gcGFnZS5cbiAgICAgKiBAcGFyYW0gdGl0bGUgVGhlIHRpdGxlIHRvIGZldGNoLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgZ2V0UGFnZUNvbnRlbnQodGl0bGU6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKGF3YWl0IHRoaXMuYXBpLmdldCh7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgICAgICBwcm9wOiAncmV2aXNpb25zJyxcbiAgICAgICAgICAgICAgICBydnByb3A6ICdjb250ZW50JyxcbiAgICAgICAgICAgICAgICBydnNsb3RzOiAnbWFpbicsXG4gICAgICAgICAgICAgICAgdGl0bGVzOiB0aXRsZSxcbiAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5UmV2aXNpb25zUGFyYW1zKSkgYXMgUGFnZVJldmlzaW9uc1Jlc3VsdFxuICAgICAgICApLnF1ZXJ5IS5wYWdlc1swXS5yZXZpc2lvbnNbMF0uc2xvdHMubWFpbi5jb250ZW50LnRyaW0oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFZGl0cyBvciBjcmVhdGVzIGEgcGFnZSB3aXRoIGdpdmVuIHRleHQuXG4gICAgICogQHBhcmFtIHRpdGxlIFRoZSBwYWdlIHRpdGxlLlxuICAgICAqIEBwYXJhbSB0ZXh0IFRoZSBwYWdlIHRleHQuXG4gICAgICogQHBhcmFtIHN1bW1hcnkgVGhlIGVkaXQgc3VtbWFyeS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIGVkaXRPckNyZWF0ZSh0aXRsZTogc3RyaW5nLCB0ZXh0OiBzdHJpbmcsIHN1bW1hcnk6IHN0cmluZykge1xuICAgICAgICBsZXQgd2F0Y2hsaXN0OiBXYXRjaE1ldGhvZCA9ICdwcmVmZXJlbmNlcyc7XG5cbiAgICAgICAgaWYgKHRoaXMud2F0Y2hDaGVja2JveClcbiAgICAgICAgICAgIGlmICh0aGlzLndhdGNoQ2hlY2tib3guaXNJbmRldGVybWluYXRlKCkpIHdhdGNobGlzdCA9IHRoaXMuZGVmYXVsdENyZWF0ZWRXYXRjaE1ldGhvZDtcbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMud2F0Y2hDaGVja2JveC5pc1NlbGVjdGVkKCkpIHdhdGNobGlzdCA9ICd3YXRjaCc7XG4gICAgICAgICAgICBlbHNlIHdhdGNobGlzdCA9ICd1bndhdGNoJztcblxuICAgICAgICByZXR1cm4gKGF3YWl0IHRoaXMuYXBpXG4gICAgICAgICAgICAuZWRpdCh0aXRsZSwgKCkgPT4gKHsgdGV4dCwgc3VtbWFyeSB9KSlcbiAgICAgICAgICAgIC5jYXRjaCgoZXJyb3JDb2RlLCBlcnJvckluZm8pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3JDb2RlID09PSAnbm9jcmVhdGUtbWlzc2luZycpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFwaS5jcmVhdGUodGl0bGUsIHsgc3VtbWFyeSwgd2F0Y2hsaXN0IH0sIHRleHQpLmNhdGNoKChlcnJvckNvZGUsIGVycm9ySW5mbykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbXcubm90aWZ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBFcnJvciBjcmVhdGluZyAke3RpdGxlfTogJHsoZXJyb3JJbmZvIGFzIE1lZGlhV2lraURhdGFFcnJvcik/LmVycm9yLmluZm8gPz8gJ1Vua25vd24gZXJyb3InfSAoJHtlcnJvckNvZGV9KWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBtdy5ub3RpZnkoXG4gICAgICAgICAgICAgICAgICAgICAgICBgRXJyb3IgZWRpdGluZyBvciBjcmVhdGluZyAke3RpdGxlfTogJHsoZXJyb3JJbmZvIGFzIE1lZGlhV2lraURhdGFFcnJvcik/LmVycm9yLmluZm8gPz8gJ1Vua25vd24gZXJyb3InfSAoJHtlcnJvckNvZGV9KWAsXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKSBhcyBSZXR1cm5UeXBlPHR5cGVvZiB0aGlzLmFwaS5lZGl0PiB8IG51bGw7XG4gICAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgQXBpUXVlcnlJbmZvUGFyYW1zLCBBcGlRdWVyeVJldmlzaW9uc1BhcmFtcyB9IGZyb20gJ3R5cGVzLW1lZGlhd2lraS9hcGlfcGFyYW1zJztcbmltcG9ydCB0eXBlIHsgUGFnZUluZm9SZXN1bHQsIFBhZ2VSZXZpc2lvbnNSZXN1bHQgfSBmcm9tICcuLi8uLi9nbG9iYWwtdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBXYXRjaE1ldGhvZCB9IGZyb20gJy4uL2FmY3JjLWhlbHBlci9hZmNyYy1oZWxwZXInO1xuaW1wb3J0IHR5cGUgeyBSZWRpcmVjdFRlbXBsYXRlRGF0YSB9IGZyb20gJy4vcmVkaXJlY3QtaGVscGVyLWRpYWxvZyc7XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgICBpbnRlcmZhY2UgV2luZG93IHtcbiAgICAgICAgcmVkaXJlY3RIZWxwZXJDb25maWd1cmF0aW9uPzogeyBjcmVhdGVkV2F0Y2hNZXRob2Q/OiBXYXRjaE1ldGhvZCB9O1xuICAgIH1cbn1cblxuY29uc3QgZGVwZW5kZW5jaWVzID0gW1xuICAgICdtZWRpYXdpa2kudXRpbCcsXG4gICAgJ29vanMtdWktY29yZScsXG4gICAgJ29vanMtdWktd2lkZ2V0cycsXG4gICAgJ29vanMtdWktd2luZG93cycsXG4gICAgJ29vanMtdWkuc3R5bGVzLmljb25zLWNvbnRlbnQnLFxuICAgICdvb2pzLXVpLnN0eWxlcy5pY29ucy1lZGl0aW5nLWNvcmUnLFxuXTtcblxubXcubG9hZGVyLnVzaW5nKGRlcGVuZGVuY2llcywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgZGVmYXVsdDogUmVkaXJlY3RIZWxwZXJEaWFsb2cgfSA9IGF3YWl0IGltcG9ydCgnLi9yZWRpcmVjdC1oZWxwZXItZGlhbG9nJyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG5cbiAgICAvKipcbiAgICAgKiBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGhhbmRsZXMgdGhlIGVudGlyZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSByZWRpcmVjdC1oZWxwZXIgc2NyaXB0LlxuICAgICAqL1xuICAgIGNsYXNzIFJlZGlyZWN0SGVscGVyIHtcbiAgICAgICAgLy8gVXRpbGl0eSB2YXJpYWJsZXNcbiAgICAgICAgcHJpdmF0ZSBhcGkgPSBuZXcgbXcuQXBpKCk7XG5cbiAgICAgICAgLy8gQXNzaWduZWQgZHVyaW5nIHJ1bigpXG4gICAgICAgIHByaXZhdGUgcmVkaXJlY3RUZW1wbGF0ZXMhOiBSZWRpcmVjdFRlbXBsYXRlRGF0YTtcbiAgICAgICAgcHJpdmF0ZSBjb250ZW50VGV4dCE6IEhUTUxEaXZFbGVtZW50O1xuICAgICAgICBwcml2YXRlIHBhZ2VUaXRsZSE6IHN0cmluZztcbiAgICAgICAgcHJpdmF0ZSBwYWdlVGl0bGVQYXJzZWQhOiBtdy5UaXRsZTtcbiAgICAgICAgcHJpdmF0ZSBjcmVhdGVkV2F0Y2hNZXRob2QhOiBXYXRjaE1ldGhvZDtcblxuICAgICAgICAvKipcbiAgICAgICAgICogUnVucyB0aGUgcmVkaXJlY3QgaGVscGVyLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcnVuKCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnBhc3Nlc1ByZUNoZWNrcygpKSByZXR1cm47XG5cbiAgICAgICAgICAgIHRoaXMucmVkaXJlY3RUZW1wbGF0ZXMgPSBhd2FpdCB0aGlzLmZldGNoUmVkaXJlY3RUZW1wbGF0ZXMoKTtcblxuICAgICAgICAgICAgY29uc3QgY29udGVudFRleHQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxEaXZFbGVtZW50PignI213LWNvbnRlbnQtdGV4dCcpO1xuICAgICAgICAgICAgaWYgKCFjb250ZW50VGV4dCkgcmV0dXJuIG13Lm5vdGlmeSgncmVkaXJlY3QtaGVscGVyOiBGYWlsZWQgdG8gZmluZCBjb250ZW50IHRleHQgZWxlbWVudCEnLCB7IHR5cGU6ICdlcnJvcicgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuY29udGVudFRleHQgPSBjb250ZW50VGV4dDtcblxuICAgICAgICAgICAgdGhpcy5wYWdlVGl0bGUgPSBtdy5jb25maWcuZ2V0KCd3Z1BhZ2VOYW1lJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IHBhZ2VUaXRsZVBhcnNlZCA9IG13LlRpdGxlLm5ld0Zyb21UZXh0KHRoaXMucGFnZVRpdGxlKTtcbiAgICAgICAgICAgIGlmICghcGFnZVRpdGxlUGFyc2VkKSByZXR1cm4gbXcubm90aWZ5KCdyZWRpcmVjdC1oZWxwZXI6IEZhaWxlZCB0byBwYXJzZSBwYWdlIHRpdGxlIScsIHsgdHlwZTogJ2Vycm9yJyB9KTtcblxuICAgICAgICAgICAgdGhpcy5wYWdlVGl0bGVQYXJzZWQgPSBwYWdlVGl0bGVQYXJzZWQ7XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZ0NyZWF0ZWRXYXRjaE1ldGhvZCA9IHdpbmRvdy5yZWRpcmVjdEhlbHBlckNvbmZpZ3VyYXRpb24/LmNyZWF0ZWRXYXRjaE1ldGhvZDtcblxuICAgICAgICAgICAgdGhpcy5jcmVhdGVkV2F0Y2hNZXRob2QgPVxuICAgICAgICAgICAgICAgIGNvbmZpZ0NyZWF0ZWRXYXRjaE1ldGhvZCAmJiBbJ25vY2hhbmdlJywgJ3ByZWZlcmVuY2VzJywgJ3Vud2F0Y2gnLCAnd2F0Y2gnXS5pbmNsdWRlcyhjb25maWdDcmVhdGVkV2F0Y2hNZXRob2QpXG4gICAgICAgICAgICAgICAgICAgID8gY29uZmlnQ3JlYXRlZFdhdGNoTWV0aG9kXG4gICAgICAgICAgICAgICAgICAgIDogJ3ByZWZlcmVuY2VzJztcblxuICAgICAgICAgICAgYXdhaXQgdGhpcy5jaGVja1BhZ2VBbmRMb2FkKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogQ2hlY2tzIGlmIHRoZSBwYWdlIHBhc3NlcyBwcmUgY2hlY2tzLlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSBwYXNzZXNQcmVDaGVja3MoKSB7XG4gICAgICAgICAgICBjb25zdCBjb25kaXRpb25zID0gW1xuICAgICAgICAgICAgICAgIG13LmNvbmZpZy5nZXQoJ3dnTmFtZXNwYWNlTnVtYmVyJykgPj0gMCwgLy8gSXMgbm90IHZpcnR1YWwgbmFtZXNwYWNlXG4gICAgICAgICAgICAgICAgbXcuY29uZmlnLmdldCgnd2dJc1Byb2JhYmx5RWRpdGFibGUnKSwgLy8gUGFnZSBpcyBlZGl0YWJsZVxuICAgICAgICAgICAgICAgIG13LmNvbmZpZy5nZXQoJ3dnQWN0aW9uJykgPT09ICd2aWV3JyB8fCBtdy5jb25maWcuZ2V0KCd3Z0FjdGlvbicpID09PSAnZWRpdCcsIC8vIFZpZXdpbmcgb3IgZWRpdGluZyB0aGUgcGFnZVxuICAgICAgICAgICAgICAgIChtdy5jb25maWcuZ2V0KCd3Z1JldmlzaW9uSWQnKSB8fCBtdy5jb25maWcuZ2V0KCd3Z0N1clJldmlzaW9uSWQnKSkgPT09IG13LmNvbmZpZy5nZXQoJ3dnQ3VyUmV2aXNpb25JZCcpLCAvLyBWaWV3aW5nIHRoZSBjdXJyZW50IHJldmlzaW9uXG4gICAgICAgICAgICAgICAgIW13LmNvbmZpZy5nZXQoJ3dnRGlmZk9sZElkJyksIC8vIE5vdCB2aWV3aW5nIGEgZGlmZlxuICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgcmV0dXJuIGNvbmRpdGlvbnMuZXZlcnkoQm9vbGVhbik7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogRmV0Y2hlcyB0aGUgcmVkaXJlY3QgdGVtcGxhdGVzLlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSBhc3luYyBmZXRjaFJlZGlyZWN0VGVtcGxhdGVzKCkge1xuICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoXG4gICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICAoYXdhaXQgdGhpcy5hcGkuZ2V0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3A6ICdyZXZpc2lvbnMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgcnZwcm9wOiAnY29udGVudCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBydnNsb3RzOiAnbWFpbicsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZXM6ICdVc2VyOkVlaml0NDMvc2NyaXB0cy9yZWRpcmVjdC1oZWxwZXIuanNvbicsXG4gICAgICAgICAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5UmV2aXNpb25zUGFyYW1zKSkgYXMgUGFnZVJldmlzaW9uc1Jlc3VsdFxuICAgICAgICAgICAgICAgICkucXVlcnkucGFnZXNbMF0/LnJldmlzaW9ucz8uWzBdPy5zbG90cz8ubWFpbj8uY29udGVudCB8fCAne30nLFxuICAgICAgICAgICAgKSBhcyBSZWRpcmVjdFRlbXBsYXRlRGF0YTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDaGVja3MgYSBwYWdlJ3Mgc3RhdHVzIGFuZCBsb2FkcyB0aGUgaGVscGVyIGFwcHJvcHJpYXRlbHkuXG4gICAgICAgICAqL1xuICAgICAgICBwcml2YXRlIGFzeW5jIGNoZWNrUGFnZUFuZExvYWQoKSB7XG4gICAgICAgICAgICBjb25zdCBwYWdlSW5mbyA9IChhd2FpdCB0aGlzLmFwaS5nZXQoe1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICAgICAgcHJvcDogJ2luZm8nLFxuICAgICAgICAgICAgICAgIHRpdGxlczogdGhpcy5wYWdlVGl0bGUsXG4gICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeUluZm9QYXJhbXMpKSBhcyBQYWdlSW5mb1Jlc3VsdDtcblxuICAgICAgICAgICAgY29uc3QgZGlhbG9nSW5mbyA9IHtcbiAgICAgICAgICAgICAgICByZWRpcmVjdFRlbXBsYXRlczogdGhpcy5yZWRpcmVjdFRlbXBsYXRlcyxcbiAgICAgICAgICAgICAgICBjb250ZW50VGV4dDogdGhpcy5jb250ZW50VGV4dCxcbiAgICAgICAgICAgICAgICBwYWdlVGl0bGU6IHRoaXMucGFnZVRpdGxlLFxuICAgICAgICAgICAgICAgIHBhZ2VUaXRsZVBhcnNlZDogdGhpcy5wYWdlVGl0bGVQYXJzZWQsXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpZiAocGFnZUluZm8ucXVlcnkucGFnZXNbMF0ubWlzc2luZykge1xuICAgICAgICAgICAgICAgIG13LnV0aWwuYWRkQ1NTKGBcbiNjcmVhdGUtcmVkaXJlY3QtYnV0dG9uIHtcbiAgICBtYXJnaW4tYm90dG9tOiAyMHB4O1xufWApO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgYnV0dG9uID0gbmV3IE9PLnVpLkJ1dHRvbldpZGdldCh7XG4gICAgICAgICAgICAgICAgICAgIGlkOiAnY3JlYXRlLXJlZGlyZWN0LWJ1dHRvbicsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnQ3JlYXRlIHJlZGlyZWN0JyxcbiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ2FydGljbGVSZWRpcmVjdCcsXG4gICAgICAgICAgICAgICAgICAgIGZsYWdzOiBbJ3Byb2dyZXNzaXZlJ10sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYnV0dG9uLm9uKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uLiRlbGVtZW50WzBdLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICAgICB2b2lkIG5ldyBSZWRpcmVjdEhlbHBlckRpYWxvZyhkaWFsb2dJbmZvLCBmYWxzZSwgdGhpcy5jcmVhdGVkV2F0Y2hNZXRob2QpLmxvYWQoKTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHRoaXMuY29udGVudFRleHQucHJlcGVuZChidXR0b24uJGVsZW1lbnRbMF0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwYWdlSW5mby5xdWVyeS5wYWdlc1swXS5yZWRpcmVjdCkgdm9pZCBuZXcgUmVkaXJlY3RIZWxwZXJEaWFsb2coZGlhbG9nSW5mbywgdHJ1ZSwgdGhpcy5jcmVhdGVkV2F0Y2hNZXRob2QpLmxvYWQoKTtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBvcnRsZXRMaW5rID0gbXcudXRpbC5hZGRQb3J0bGV0TGluayhcbiAgICAgICAgICAgICAgICAgICAgbXcuY29uZmlnLmdldCgnc2tpbicpID09PSAnbWluZXJ2YScgPyAncC10YicgOiAncC1jYWN0aW9ucycsXG4gICAgICAgICAgICAgICAgICAgICcjJyxcbiAgICAgICAgICAgICAgICAgICAgJ1JlZGlyZWN0IHBhZ2UnLFxuICAgICAgICAgICAgICAgICAgICAncmVkaXJlY3QtaGVscGVyJyxcbiAgICAgICAgICAgICAgICApITtcbiAgICAgICAgICAgICAgICBwb3J0bGV0TGluay5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgICAgICAgICAgIHZvaWQgbmV3IFJlZGlyZWN0SGVscGVyRGlhbG9nKGRpYWxvZ0luZm8sIGZhbHNlLCB0aGlzLmNyZWF0ZWRXYXRjaE1ldGhvZCkubG9hZCgpO1xuXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zY3JvbGxUbyh7IHRvcDogMCwgYmVoYXZpb3I6ICdzbW9vdGgnIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIHBvcnRsZXRMaW5rLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdm9pZCBuZXcgUmVkaXJlY3RIZWxwZXIoKS5ydW4oKTtcbn0pO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7O2dKQUFBLElBTXFCQSxFQU5yQkMsRUFBQUMsRUFBQSxrQkFNcUJGLEVBQXJCLGNBQWlELEdBQUcsR0FBRyxlQUFnQixDQUUzRCxJQUFNLElBQUksR0FBRyxJQUVyQixZQUFZRyxFQUE2QixDQUNyQyxNQUFNQSxDQUFNLEVBRVosR0FBRyxHQUFHLE1BQU0sY0FBYyxLQUFLLEtBQThDQSxDQUFNLENBQ3ZGLENBRUEsaUJBQW1CLElBQU0sQ0FDckIsSUFBTUMsRUFBUSxLQUFLLFNBQVMsRUFDdEJDLEVBQVcsRUFBRSxTQUFTLEVBRXZCRCxHQUFPQyxFQUFTLFFBQVEsQ0FBQyxDQUFDLEVBRS9CLElBQU1DLEVBQWMsR0FBRyxNQUFNLFlBQVlGLENBQUssRUFFOUMsWUFBSyxJQUNBLElBQUksQ0FDRCxPQUFRLFFBQ1IsY0FBZSxJQUNmLFNBQVUsR0FDVixhQUFjLEdBQ2QsVUFBV0UsR0FBYSxZQUFZLEdBQUtGLEVBQ3pDLFVBQVcsV0FDWCxLQUFNLFlBQ1YsQ0FBK0MsRUFDOUMsTUFBTSxJQUFNLElBQUksRUFDaEIsS0FBTUcsR0FBb0MsQ0FDdkMsR0FBSUEsR0FBUSxPQUFPLE1BQU8sQ0FDdEIsSUFBTUMsRUFBUUQsRUFBTyxNQUFNLE1BQ3RCLE9BQ0lFLEdBQ0csQ0FBQ0EsRUFBSyxZQUFZLEtBQU1DLEdBQWFBLEVBQVMsUUFBVSwrQ0FBK0MsQ0FDL0csRUFDQyxJQUFLRCxHQUFTLENBQ1gsSUFBTUUsRUFBd0JGLEVBQUssTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLEVBRXJELE1BQU8sQ0FBRSxLQUFNRSxFQUF1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LFVBQVcsS0FBSyxVQUNoQixnQkFBaUIsS0FBSyxlQUMxQixFQUVBLEdBQUlELEVBQVMsTUFBTSxNQUFNLENBQUMsRUFBRSxRQUFTLENBQ2pDLEdBQUcsS0FBSyxPQUFPO0FBQUE7QUFBQTtBQUFBLEVBRzdCLEVBRWMsSUFBTUUsRUFBUyxJQUFJLEdBQUcsR0FBRyxhQUFhLENBQ2xDLEdBQUkseUJBQ0osTUFBTyxrQkFDUCxLQUFNLGtCQUNOLE1BQU8sQ0FBQyxhQUFhLENBQ3pCLENBQUMsRUFDREEsRUFBTyxHQUFHLFFBQVMsSUFBTSxDQUNyQkEsRUFBTyxTQUFTLENBQUMsRUFBRSxPQUFPLEVBQ3JCLElBQUlQLEVBQXFCTSxFQUFZLEdBQU8sS0FBSyxrQkFBa0IsRUFBRSxLQUFLLENBQ25GLENBQUMsRUFFRCxLQUFLLFlBQVksUUFBUUMsRUFBTyxTQUFTLENBQUMsQ0FBQyxDQUMvQyxTQUFXRixFQUFTLE1BQU0sTUFBTSxDQUFDLEVBQUUsU0FBZSxJQUFJTCxFQUFxQk0sRUFBWSxHQUFNLEtBQUssa0JBQWtCLEVBQUUsS0FBSyxNQUN0SCxDQUNELElBQU1FLEVBQWMsR0FBRyxLQUFLLGVBQ3hCLEdBQUcsT0FBTyxJQUFJLE1BQU0sSUFBTSxVQUFZLE9BQVMsYUFDL0MsSUFDQSxnQkFDQSxpQkFDSixFQUNBQSxFQUFZLGlCQUFpQixRQUFVQyxHQUFVLENBQzdDQSxFQUFNLGVBQWUsRUFFaEIsSUFBSVQsRUFBcUJNLEVBQVksR0FBTyxLQUFLLGtCQUFrQixFQUFFLEtBQUssRUFFL0UsT0FBTyxTQUFTLENBQUUsSUFBSyxFQUFHLFNBQVUsUUFBUyxDQUFDLEVBRTlDRSxFQUFZLE9BQU8sQ0FDdkIsQ0FBQyxDQUNMLENBQ0osQ0FDSixDQUVLLElBQUlQLEVBQWUsRUFBRSxJQUFJLENBQ2xDLENBQUMiLAogICJuYW1lcyI6IFsiQ2F0ZWdvcnlJbnB1dFdpZGdldCIsICJpbml0X2NhdGVnb3J5X2lucHV0X3dpZGdldCIsICJfX2VzbU1pbiIsICJjb25maWciLCAidmFsdWUiLCAiZGVmZXJyZWQiLCAicGFyc2VkVGl0bGUiLCAicmVzdWx0IiwgInBhZ2VzIiwgInBhZ2UiLCAiY2F0ZWdvcnkiLCAidGl0bGVXaXRob3V0TmFtZXNwYWNlIiwgInJlc3BvbnNlIiwgImRhdGEiLCAibGFiZWwiLCAiQ2hhbmdlc0RpYWxvZyIsICJpbml0X2NoYW5nZXNfZGlhbG9nIiwgIl9fZXNtTWluIiwgIl9DaGFuZ2VzRGlhbG9nIiwgImNvbmZpZyIsICJvbGRUZXh0IiwgIm5ld1RleHQiLCAicmVzdWx0IiwgImNvbXBhcmlzb24iLCAibm9DaGFuZ2VzRWxlbWVudCIsICJwYW5lbExheW91dCIsICJhY3Rpb24iLCAiT3V0cHV0UHJldmlld0RpYWxvZyIsICJpbml0X291dHB1dF9wcmV2aWV3X2RpYWxvZyIsICJfX2VzbU1pbiIsICJfT3V0cHV0UHJldmlld0RpYWxvZyIsICJjb25maWciLCAicGFnZVRpdGxlUGFyc2VkIiwgInJlc3VsdCIsICJ0YWdzQ29udGVudCIsICJjYXRlZ29yaWVzQ29udGVudCIsICJwYW5lbExheW91dCIsICJhY3Rpb24iLCAiUmVkaXJlY3RUYXJnZXRJbnB1dFdpZGdldCIsICJpbml0X3JlZGlyZWN0X3RhcmdldF9pbnB1dF93aWRnZXQiLCAiX19lc21NaW4iLCAiY29uZmlnIiwgInBhZ2VUaXRsZVBhcnNlZCIsICJ2YWx1ZSIsICJkZWZlcnJlZCIsICJ0aXRsZSIsICJyZXN1bHQiLCAibWF0Y2hlZFNlY3Rpb25zIiwgInNlY3Rpb24iLCAicGFyc2VkVGl0bGUiLCAicGFnZSIsICJyZXNwb25zZSIsICJkYXRhIiwgImxhYmVsIiwgInJlZGlyZWN0X2hlbHBlcl9kaWFsb2dfZXhwb3J0cyIsICJfX2V4cG9ydCIsICJSZWRpcmVjdEhlbHBlckRpYWxvZyIsICJpbml0X3JlZGlyZWN0X2hlbHBlcl9kaWFsb2ciLCAiX19lc21NaW4iLCAiaW5pdF9jYXRlZ29yeV9pbnB1dF93aWRnZXQiLCAiaW5pdF9jaGFuZ2VzX2RpYWxvZyIsICJpbml0X291dHB1dF9wcmV2aWV3X2RpYWxvZyIsICJpbml0X3JlZGlyZWN0X3RhcmdldF9pbnB1dF93aWRnZXQiLCAicmVkaXJlY3RUZW1wbGF0ZXMiLCAiY29udGVudFRleHQiLCAicGFnZVRpdGxlIiwgInBhZ2VUaXRsZVBhcnNlZCIsICJleGlzdHMiLCAiY3JlYXRlZFdhdGNoTWV0aG9kIiwgIm1haW5QYWdlQ29udGVudCIsICJ0YXJnZXQiLCAidGFnT3JSZWRpcmVjdCIsICJSZWRpcmVjdFRhcmdldElucHV0V2lkZ2V0IiwgInZhbHVlIiwgInRhZyIsICJyZWRpcmVjdCIsICJsYWJlbCIsICJzb3J0ZWRUYWdzIiwgImEiLCAiYiIsICJlZGl0b3JJbmZvIiwgInNob3duVGVtcGxhdGVFZGl0b3JzIiwgInN1bW1hcnlFbGVtZW50IiwgIm5vVGVtcGxhdGVzTWVzc2FnZSIsICJ0ZW1wbGF0ZU5hbWUiLCAidGVtcGxhdGVEYXRhIiwgInBhcmFtZXRlcnMiLCAiZGV0YWlscyIsICJzdW1tYXJ5IiwgImVsZW1lbnREYXRhIiwgInBhcmFtZXRlck5hbWUiLCAicGFyYW1ldGVyRGF0YSIsICJpbnB1dCIsICJpbnB1dExheW91dCIsICJuYW1lIiwgImdlbmVyYXRpb25hbFN1ZmZpeCIsICJsYXN0TmFtZSIsICJvdGhlck5hbWVzIiwgIm5ld05hbWUiLCAibGVhZGluZ0FydGljbGUiLCAiQ2F0ZWdvcnlJbnB1dFdpZGdldCIsICJwYWdlcyIsICJwYWdlIiwgIndpbmRvd01hbmFnZXIiLCAidGVtcGxhdGVQcmV2aWV3RGlhbG9nIiwgIk91dHB1dFByZXZpZXdEaWFsb2ciLCAic2hvd0NoYW5nZXNEaWFsb2ciLCAiQ2hhbmdlc0RpYWxvZyIsICJjb25maWciLCAicGFnZVRyaWFnZU1hcmtCdXR0b24iLCAicGF0cm9sUmVzcG9uc2UiLCAicmVkaXJlY3RWYWx1ZSIsICJvbGRUYXJnZXQiLCAidGFyZ2V0Q2hhbmdlZCIsICJ0YWdzQ2hhbmdlZCIsICJ0YWdBcmd1bWVudHNDaGFuZ2VkIiwgInRhZ3NXaXRoUGFyYW1ldGVycyIsICJkYXRhIiwgIm9sZFRhZ0RhdGEiLCAiZm91bmRUYWdFZGl0b3JEYXRhIiwgInRlbXBsYXRlIiwgInBhcmFtZXRlciIsICJvbGRBcmd1bWVudCIsICJhcmd1bWVudCIsICJuZXdBcmd1bWVudCIsICJkZWZhdWx0U29ydENoYW5nZWQiLCAiY2F0ZWdvcmllc0NoYW5nZWQiLCAiY2F0ZWdvcnkiLCAiY2hhbmdlcyIsICJ0YWdEYXRhIiwgIm9yaWdpbmFsUmVkaXJlY3RUYWdzIiwgIm1hdGNoIiwgIm5ld1RhZyIsICJmb3JtYXR0ZWRBcmd1bWVudHMiLCAiaW5kZXgiLCAiZm91bmRUZW1wbGF0ZUVkaXRvciIsICJmb3VuZFBhcmFtZXRlckVkaXRvciIsICJlcnJvcnMiLCAiZGVzdGluYXRpb24iLCAidGFncyIsICJkZXN0aW5hdGlvbkRhdGEiLCAiZXJyb3JDb2RlIiwgImRlc3RpbmF0aW9uUGFyc2VSZXN1bHQiLCAiZGVzdGluYXRpb25SZWRpcmVjdCIsICJzZWN0aW9uIiwgImRlc3RpbmF0aW9uQ29udGVudCIsICJhbmNob3IiLCAicGFydCIsICJ0YXJnZXRJc0Rpc2FtYmlndWF0aW9uUGFnZSIsICJ0YXJnZXRJc1N1cm5hbWVMaXN0IiwgInRvRGlzYW1iaWd1YXRpb25QYWdlVGFncyIsICJ0b1N1cm5hbWVMaXN0VGFncyIsICJ0YWdnZWRBc1JlZGlyZWN0VG9EaXNhbWJpZ3VhdGlvblBhZ2UiLCAidGFnZ2VkQXNSZWRpcmVjdFRvU3VybmFtZUxpc3QiLCAiZm91bmRQYXJhbWV0ZXIiLCAiZWxlbWVudHNUb0Rpc2FibGUiLCAiZWxlbWVudCIsICJ0aXRsZSIsICJtZXNzYWdlIiwgImF1dG9GaXhlcyIsICJ3YXJuaW5nTWVzc2FnZSIsICJhdXRvRml4QnV0dG9uIiwgImF1dG9GaXgiLCAib3V0cHV0IiwgImZyb21Nb3ZlIiwgInBhdHJvbExpbmsiLCAibWFya1Jldmlld2VkQnV0dG9uIiwgImVycm9ySW5mbyIsICJzdHJheVRleHQiLCAiZGVmYXVsdFNvcnQiLCAiY2F0ZWdvcmllcyIsICJwYXJzZWRUYXJnZXQiLCAiZm9ybWF0dGVkVGl0bGUiLCAidGFnc1dpdGhBcmd1bWVudHMiLCAiZm91bmRBcmd1bWVudEVkaXRvciIsICJsYXN0TnVtYmVyUGFyYW1ldGVySW5kZXgiLCAibWFwcGVkQXJndW1lbnRzIiwgInRleHQiLCAid2F0Y2hsaXN0IiwgImRlcGVuZGVuY2llcyIsICJSZWRpcmVjdEhlbHBlckRpYWxvZyIsICJSZWRpcmVjdEhlbHBlciIsICJjb250ZW50VGV4dCIsICJwYWdlVGl0bGVQYXJzZWQiLCAiY29uZmlnQ3JlYXRlZFdhdGNoTWV0aG9kIiwgInBhZ2VJbmZvIiwgImRpYWxvZ0luZm8iLCAiYnV0dG9uIiwgInBvcnRsZXRMaW5rIiwgImV2ZW50Il0KfQo=