User:Eejit43/scripts/pageswap.js

Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
// <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/pageswap.ts

"use strict";mw.loader.using(["mediawiki.util","oojs-ui-core","oojs-ui-widgets","oojs-ui-windows","mediawiki.widgets"],async()=>{const r=mw.config.get("wgNamespaceNumber");if(r<0||r>=120||r>=6&&r<=9||r>=14&&r<=99)return;const o=mw.config.get("wgPageName"),s=await fetchUserPermissions();if((await new mw.Api().get({action:"query",prop:"info",titles:o})).query.pages[-1])return;mw.util.addPortletLink(mw.config.get("skin")==="minerva"?"p-tb":"p-cactions","#","Swap","eejit-pageswap").addEventListener("click",e=>{if(e.preventDefault(),!s.canSwap)return mw.notify("You do not have sufficient permissions to swap pages.",{type:"error"});function a(){a.super.apply(this,arguments)}OO.inheritClass(a,OO.ui.ProcessDialog),a.static.name="swap",a.static.title=$("<span>").append($("<a>").attr({href:mw.util.getUrl("WP:ROUNDROBIN"),target:"_blank"}).text("Swap")," two pages"),a.static.actions=[{action:"swap",label:"Swap",flags:["primary","progressive"],disabled:!0},{action:"cancel",label:"Cancel",flags:["safe","close"]}],a.prototype.initialize=function(){a.super.prototype.initialize.call(this),this.panel=new OO.ui.PanelLayout({padded:!0,expanded:!1}),this.content=new OO.ui.FieldsetLayout,this.destinationInput=new mw.widgets.TitleInputWidget({required:!0,$overlay:this.$overlay,excludeCurrentPage:!0,showDescriptions:!0,showRedirectTargets:!1,excludeDynamicNamespaces:!0,showMissing:!1,validate:i=>!(i===""||i===mw.config.get("wgPageName"))}),this.destinationInput.on("change",()=>{let i=this.destinationInput.getValue().replaceAll("_"," ").replace(/^\s+/,"");i=i.replace(new RegExp(`^(https?:)?/{2}?${mw.config.get("wgServer").replace(/^\/{2}/,"")}/wiki/`),""),i=i.split("#")[0],i=i.charAt(0).toUpperCase()+i.slice(1),this.destinationInput.setValue(i)}),this.destinationInput.connect(this,{change:"updateActionState"}),this.destinationInputField=new OO.ui.FieldLayout(this.destinationInput,{label:"Destination page",align:"top"}),this.summaryInput=new OO.ui.ComboBoxInputWidget({required:!0,$overlay:this.$overlay,options:[{data:"Performing [[WP:RM/TR|requested technical move]]"},{data:"Result of [[WP:RM|requested move]]"},{data:"Move to [[WP:COMMONNAME|common name]]"},{data:"Fixing typo"},{data:"Fixing capitalization"},{data:"Fixing per [[WP:NC|naming conventions]]"}]}),this.summaryInput.connect(this,{change:"updateActionState"}),this.summaryInputField=new OO.ui.FieldLayout(this.summaryInput,{label:"Summary",align:"top"}),this.moveTalkCheckbox=new OO.ui.CheckboxInputWidget({selected:!0}),this.moveTalkCheckboxField=new OO.ui.FieldLayout(this.moveTalkCheckbox,{label:"Move talk page (if applicable)",align:"inline"}),this.moveSubpagesCheckbox=new OO.ui.CheckboxInputWidget({selected:!0}),this.moveSubpagesCheckboxField=new OO.ui.FieldLayout(this.moveSubpagesCheckbox,{label:"Move subpages (if applicable)",align:"inline"}),this.content.addItems([this.destinationInputField,this.summaryInputField,this.moveTalkCheckboxField,this.moveSubpagesCheckboxField]),this.panel.$element.append(this.content.$element),this.$body.append(this.panel.$element)},a.prototype.updateActionState=function(){const i=this.destinationInput.getValue()!==""&&this.destinationInput.getValidity()&&this.summaryInput.getValue()!=="";this.actions.setAbilities({swap:i})},a.prototype.getActionProcess=function(i){if(i==="swap"){const u=this.destinationInput.getValue().trim(),p=this.summaryInput.getValue(),g=this.moveTalkCheckbox.isSelected(),m=this.moveSubpagesCheckbox.isSelected();return new OO.ui.Process().next(()=>roundRobin(s,o,u,p,g,m).catch(d=>(console.error(d),$.Deferred().reject(this.showErrors([new OO.ui.Error(d?.message||"An unknown error occurred.")]))))).next(()=>{mw.notify("Moves complete! Reloading...",{type:"success"}),this.close({action:i,success:!0}),setTimeout(()=>window.location.reload(),1e3)})}else if(i==="cancel")return new OO.ui.Process(()=>{this.close({action:i})});return a.super.prototype.getActionProcess.call(this,i)};const l=new a,t=new OO.ui.WindowManager;$("body").append(t.$element),t.addWindows([l]),t.openWindow(l)})});function fetchUserPermissions(){return new mw.Api().get({action:"query",meta:"userinfo",uiprop:"rights"}).then(r=>{const o=r.query.userinfo.rights;return{canSwap:o.includes("suppressredirect")&&o.includes("move-subpages"),allowSwapTemplates:o.includes("templateeditor")}})}function getTalkPageName(r,o,s){const n={},c=r[s.toString()]["*"].length===0?0:r[s.toString()]["*"].length+1;return n.titleWithoutPrefix=o.substring(c,o.length),n.talkTitle=`${r[(s+1).toString()]["*"]}:${n.titleWithoutPrefix}`,n}function swapValidate(r,o,s,n,c){const e={valid:!0,allowMoveSubpages:!0,checkTalk:!0};let a=0;for(const[l,t]of Object.entries(s)){if(a++,l==="-1"||t.ns<0)return e.valid=!1,e.error=`Page ${t.title} does not exist.`,e;if(t.ns>=6&&t.ns<=9||t.ns>=10&&t.ns<=11&&!c.allowSwapTemplates||t.ns>=14&&t.ns<=117||t.ns>=120)return e.valid=!1,e.error=`Namespace of ${t.title} (${t.ns}) not supported.

Likely reasons:
- Names of pages in this namespace relies on other pages
- Namespace features heavily-transcluded pages
- Namespace involves subpages: swaps produce many redlinks


If the move is legitimate, consider a careful manual swap.`,e;r===t.title&&(e.currentTitle=t.title,e.currentNamespace=t.ns,e.currentTalkId=t.talkid,e.currentCanMove=t.actions.move==="",e.currentIsRedirect=t.redirect===""),o===t.title&&(e.destinationTitle=t.title,e.destinationNamespace=t.ns,e.destinationTalkId=t.talkid,e.destinationCanMove=t.actions.move==="",e.destinationIsRedirect=t.redirect==="")}if(!e.valid)return e;if(!e.currentCanMove)return e.valid=!1,e.error=`${e.currentTitle} is immovable`,e;if(!e.destinationCanMove)return e.valid=!1,e.error=`${e.destinationTitle} is immovable`,e;if(e.currentNamespace%2!==e.destinationNamespace%2)return e.valid=!1,e.error="Namespaces don't match: one is a talk page, the other is not",e;if(a!==2)return e.valid=!1,e.error="Destination title is the same as the current title",e;if(e.currentNamespaceAllowSubpages=n[e.currentNamespace.toString()].subpages!=="",e.destinationNamespaceAllowSubpages=n[e.destinationNamespace.toString()].subpages!=="",e.currentTitle.startsWith(e.destinationTitle+"/")||e.destinationTitle.startsWith(e.currentTitle+"/")){if(e.currentNamespace!==e.destinationNamespace)return e.valid=!1,e.error=`${e.currentTitle} in ns ${e.currentNamespace}
${e.destinationTitle} in ns ${e.destinationNamespace}. Disallowing.`,e;e.allowMoveSubpages=e.currentNamespaceAllowSubpages,e.allowMoveSubpages||(e.addLineInfo="One page is a subpage. Disallowing move-subpages")}if(e.currentNamespace%2===1)e.checkTalk=!1;else{const l=getTalkPageName(n,e.currentTitle,e.currentNamespace);e.currentTitleWithoutPrefix=l.titleWithoutPrefix,e.currentTalkName=l.talkTitle;const t=getTalkPageName(n,e.destinationTitle,e.destinationNamespace);e.destinationTitleWithoutPrefix=t.titleWithoutPrefix,e.destinationTalkName=t.talkTitle}return e}async function talkValidate(r,o,s){const n={};if(n.allowMoveTalk=!0,!r)return n;if(o===void 0||s===void 0)return mw.notify("Unable to validate talk. Disallowing movetalk to be safe",{type:"error"}),n.allowMoveTalk=!1,n;n.currTDNE=!0,n.destTDNE=!0,n.currentTalkCanCreate=!0,n.destinationTalkCanCreate=!0;const c=[o,s];if(c.length>0){const e=(await new mw.Api().get({action:"query",prop:"info",intestactions:"move|create",titles:c.join("|")})).query.pages;for(const[,a]of Object.entries(e))if(a.title===o)n.currTDNE=a.invalid===""||a.missing==="",n.currentTalkTitle=a.title,n.currentTalkCanMove=a.actions.move==="",n.currentTalkCanCreate=a.actions.create==="",n.currentTalkIsRedirect=a.redirect==="";else if(a.title===s)n.destTDNE=a.invalid===""||a.missing==="",n.destinationTalkTitle=a.title,n.destinationTalkCanMove=a.actions.move==="",n.destinationTalkCanCreate=a.actions.create==="",n.destinationTalkIsRedirect=a.redirect==="";else return mw.notify("Found pageid not matching given ids.",{type:"error"}),{}}return n.allowMoveTalk=n.currentTalkCanCreate&&n.currentTalkCanMove&&n.destinationTalkCanCreate&&n.destinationTalkCanMove,n}async function getSubpages(r,o,s,n){if(!n&&r[s.toString()].subpages!=="")return{data:[]};const c=getTalkPageName(r,o,s),e=(await new mw.Api().get({action:"query",list:"allpages",apnamespace:n?s+1:s,apfrom:c.titleWithoutPrefix+"/",apto:c.titleWithoutPrefix+"0",aplimit:101})).query.allpages,a=[[],[]];for(const u in e)a[u<50?0:1].push(e[u].pageid);if(a[0].length===0)return{data:[]};if(a[1].length===51)return{error:"100+ subpages, too many to move."};const l=[],t=(await new mw.Api().get({action:"query",prop:"info",intestactions:"move|create",pageids:a[0].join("|")})).query.pages;for(const[,u]of Object.entries(t))l.push({title:u.title,isRedir:u.redirect==="",canMove:u.actions?.move===""});if(a[1].length===0)return{data:l};const i=(await new mw.Api().get({action:"query",prop:"info",intestactions:"move|create",pageids:a[1].join("|")})).query.pages;for(const[,u]of Object.entries(i))l.push({title:u.title,isRedirect:u.redirect==="",canMove:u.actions?.move===""});return{data:l}}function printSubpageInfo(r,o){const s={},n=[],c=[];let e=0;for(const[,a]of Object.entries(o.data))a.canMove||c.push(a.title),n.push((a.isRedirect?"(R) ":"  ")+a.title),a.isRedirect&&e++;return n.length>0&&mw.notify(c.length>0?`Disabling move-subpages.
The following ${c.length} (of ${n.length}) total subpages of ${r} CANNOT be moved:

${c.join(", ")}`:`${n.length} total subpages of ${r}.${e!==0?` ${e} redirects, labeled (R)`:""}: ${n.join(", ")}`),s.allowMoveSubpages=c.length===0,s.noNeed=n.length===0,s}function swapPages(r,o,s,n,c){const e=`Draft:Move/${r}`,a=[{action:"move",from:o,to:e,reason:"[[WP:ROUNDROBIN|Round-robin page move]] step 1 (with [[User:Eejit43/scripts/pageswap|pageswap 2]])",watchlist:"unwatch",noredirect:1},{action:"move",from:r,to:o,reason:s,watchlist:"unwatch",noredirect:1},{action:"move",from:e,to:r,reason:"[[WP:ROUNDROBIN|Round-robin page move]] step 3 (with [[User:Eejit43/scripts/pageswap|pageswap 2]])",watchlist:"unwatch",noredirect:1}];for(const l of a)n&&(l.movetalk=1),c&&(l.movesubpages=1);return new Promise((l,t)=>{const i={success:!0};let u=0;function p(){if(u>=a.length)return l(i);new mw.Api().postWithToken("csrf",a[u]).done(()=>{u++,p()}).fail(()=>{i.success=!1,i.message=`Failed on move ${u+1} (${a[u].from} \u2192 ${a[u].to})`,t(i)})}return p(),i})}async function roundRobin(r,o,s,n,c,e){const a=(await new mw.Api().get({action:"query",meta:"siteinfo",siprop:"namespaces"})).query.namespaces,l=(await new mw.Api().get({action:"query",prop:"info",inprop:"talkid",intestactions:"move|create",titles:`${o}|${s}`})).query;for(const w in l.normalized)o===l.normalized[w].from&&(o=l.normalized[w].to),s===l.normalized[w].from&&(s=l.normalized[w].to);const t=swapValidate(o,s,l.pages,a,r);if(!t.valid)throw new Error(t.error);t.addLineInfo!==void 0&&mw.notify(t.addLineInfo);const i=await getSubpages(a,t.currentTitle,t.currentNamespace,!1);if(i.error!==void 0)throw new Error(i.error);const u=printSubpageInfo(t.currentTitle,i),p=await getSubpages(a,t.destinationTitle,t.destinationNamespace,!1);if(p.error!==void 0)throw new Error(p.error);const g=printSubpageInfo(t.destinationTitle,p),m=await talkValidate(t.checkTalk,t.currentTalkName,t.destinationTalkName),d=await getSubpages(a,t.currentTitle,t.currentNamespace,!0);if(d.error!==void 0)throw new Error(d.error);const b=printSubpageInfo(t.currentTalkName,d),h=await getSubpages(a,t.destinationTitle,t.destinationNamespace,!0);if(h.error!==void 0)throw new Error(h.error);const k=printSubpageInfo(t.destinationTalkName,h),y=u.noNeed&&g.noNeed&&b.noNeed&&k.noNeed,T=t.currentNamespaceAllowSubpages&&!g.noNeed||t.destinationNamespaceAllowSubpages&&!u.noNeed;c&&t.checkTalk&&!m.allowMoveTalk&&(c=!1,mw.notify(`Disallowing moving talk. ${m.currentTalkCanCreate?m.destinationTalkCanCreate?"Talk page is immovable":`${t.destinationTalkName} is create-protected`:`${t.currentTalkName} is create-protected`}`));let f=!1;!T&&!y&&t.allowMoveSubpages&&u.allowMoveSubpages&&g.allowMoveSubpages&&b.allowMoveSubpages&&k.allowMoveSubpages?f=e:T&&(f=!1,mw.notify("One namespace does not have subpages enabled. Disallowing move subpages.")),console.log(`[Pageswap] Swapping "${o}" with "${s}" with summary "${n}" and moveTalk ${c} and moveSubpages ${f}`);const v=await swapPages(o,s,n,c,f);if(console.log(v),!v.success)throw new Error(v.error)}

// </nowiki>
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc2NyaXB0cy9wYWdlc3dhcC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsibXcubG9hZGVyLnVzaW5nKFsnbWVkaWF3aWtpLnV0aWwnLCAnb29qcy11aS1jb3JlJywgJ29vanMtdWktd2lkZ2V0cycsICdvb2pzLXVpLXdpbmRvd3MnLCAnbWVkaWF3aWtpLndpZGdldHMnXSwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG5hbWVzcGFjZSA9IG13LmNvbmZpZy5nZXQoJ3dnTmFtZXNwYWNlTnVtYmVyJyk7XG4gICAgaWYgKG5hbWVzcGFjZSA8IDAgfHwgbmFtZXNwYWNlID49IDEyMCB8fCAobmFtZXNwYWNlID49IDYgJiYgbmFtZXNwYWNlIDw9IDkpIHx8IChuYW1lc3BhY2UgPj0gMTQgJiYgbmFtZXNwYWNlIDw9IDk5KSkgcmV0dXJuO1xuXG4gICAgY29uc3QgY3VycmVudFRpdGxlID0gbXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpO1xuXG4gICAgY29uc3QgdXNlclBlcm1pc3Npb25zID0gYXdhaXQgZmV0Y2hVc2VyUGVybWlzc2lvbnMoKTtcblxuICAgIGNvbnN0IHBhZ2VJbmZvID0gKGF3YWl0IG5ldyBtdy5BcGkoKS5nZXQoeyBhY3Rpb246ICdxdWVyeScsIHByb3A6ICdpbmZvJywgdGl0bGVzOiBjdXJyZW50VGl0bGUgfSkpIGFzIHsgcXVlcnk6IHsgcGFnZXM6IFJlY29yZDxudW1iZXIsIHVua25vd24+IH0gfTtcbiAgICBpZiAocGFnZUluZm8ucXVlcnkucGFnZXNbLTFdKSByZXR1cm47XG5cbiAgICBjb25zdCBsaW5rID0gbXcudXRpbC5hZGRQb3J0bGV0TGluayhtdy5jb25maWcuZ2V0KCdza2luJykgPT09ICdtaW5lcnZhJyA/ICdwLXRiJyA6ICdwLWNhY3Rpb25zJywgJyMnLCAnU3dhcCcsICdlZWppdC1wYWdlc3dhcCcpITtcblxuICAgIGxpbmsuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXZlbnQpID0+IHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBpZiAoIXVzZXJQZXJtaXNzaW9ucy5jYW5Td2FwKSByZXR1cm4gbXcubm90aWZ5KCdZb3UgZG8gbm90IGhhdmUgc3VmZmljaWVudCBwZXJtaXNzaW9ucyB0byBzd2FwIHBhZ2VzLicsIHsgdHlwZTogJ2Vycm9yJyB9KTtcblxuICAgICAgICBmdW5jdGlvbiBTd2FwRGlhbG9nKCkge1xuICAgICAgICAgICAgU3dhcERpYWxvZy5zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICB9XG4gICAgICAgIE9PLmluaGVyaXRDbGFzcyhTd2FwRGlhbG9nLCBPTy51aS5Qcm9jZXNzRGlhbG9nKTtcblxuICAgICAgICBTd2FwRGlhbG9nLnN0YXRpYy5uYW1lID0gJ3N3YXAnO1xuICAgICAgICBTd2FwRGlhbG9nLnN0YXRpYy50aXRsZSA9ICQoJzxzcGFuPicpLmFwcGVuZChcbiAgICAgICAgICAgICQoJzxhPicpXG4gICAgICAgICAgICAgICAgLmF0dHIoeyBocmVmOiBtdy51dGlsLmdldFVybCgnV1A6Uk9VTkRST0JJTicpLCB0YXJnZXQ6ICdfYmxhbmsnIH0pXG4gICAgICAgICAgICAgICAgLnRleHQoJ1N3YXAnKSxcbiAgICAgICAgICAgICcgdHdvIHBhZ2VzJyxcbiAgICAgICAgKTtcbiAgICAgICAgU3dhcERpYWxvZy5zdGF0aWMuYWN0aW9ucyA9IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdzd2FwJyxcbiAgICAgICAgICAgICAgICBsYWJlbDogJ1N3YXAnLFxuICAgICAgICAgICAgICAgIGZsYWdzOiBbJ3ByaW1hcnknLCAncHJvZ3Jlc3NpdmUnXSxcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAnY2FuY2VsJyxcbiAgICAgICAgICAgICAgICBsYWJlbDogJ0NhbmNlbCcsXG4gICAgICAgICAgICAgICAgZmxhZ3M6IFsnc2FmZScsICdjbG9zZSddLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgXTtcblxuICAgICAgICBTd2FwRGlhbG9nLnByb3RvdHlwZS5pbml0aWFsaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgU3dhcERpYWxvZy5zdXBlci5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMpO1xuXG4gICAgICAgICAgICB0aGlzLnBhbmVsID0gbmV3IE9PLnVpLlBhbmVsTGF5b3V0KHtcbiAgICAgICAgICAgICAgICBwYWRkZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgZXhwYW5kZWQ6IGZhbHNlLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuY29udGVudCA9IG5ldyBPTy51aS5GaWVsZHNldExheW91dCgpO1xuXG4gICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uSW5wdXQgPSBuZXcgbXcud2lkZ2V0cy5UaXRsZUlucHV0V2lkZ2V0KHtcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAkb3ZlcmxheTogdGhpcy4kb3ZlcmxheSxcbiAgICAgICAgICAgICAgICBleGNsdWRlQ3VycmVudFBhZ2U6IHRydWUsXG4gICAgICAgICAgICAgICAgc2hvd0Rlc2NyaXB0aW9uczogdHJ1ZSxcbiAgICAgICAgICAgICAgICBzaG93UmVkaXJlY3RUYXJnZXRzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBleGNsdWRlRHluYW1pY05hbWVzcGFjZXM6IHRydWUsIC8vIFwiU3BlY2lhbFwiIGFuZCBcIk1lZGlhXCJcbiAgICAgICAgICAgICAgICBzaG93TWlzc2luZzogZmFsc2UsXG4gICAgICAgICAgICAgICAgdmFsaWRhdGU6ICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09ICcnIHx8IHZhbHVlID09PSBtdy5jb25maWcuZ2V0KCd3Z1BhZ2VOYW1lJykpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbklucHV0Lm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5kZXN0aW5hdGlvbklucHV0LmdldFZhbHVlKCkucmVwbGFjZUFsbCgnXycsICcgJykucmVwbGFjZSgvXlxccysvLCAnJyk7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKG5ldyBSZWdFeHAoYF4oaHR0cHM/Oik/L3syfT8ke213LmNvbmZpZy5nZXQoJ3dnU2VydmVyJykucmVwbGFjZSgvXlxcL3syfS8sICcnKX0vd2lraS9gKSwgJycpO1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuc3BsaXQoJyMnKVswXTtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdmFsdWUuc2xpY2UoMSk7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbklucHV0LnNldFZhbHVlKHZhbHVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbklucHV0LmNvbm5lY3QodGhpcywgeyBjaGFuZ2U6ICd1cGRhdGVBY3Rpb25TdGF0ZScgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb25JbnB1dEZpZWxkID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KHRoaXMuZGVzdGluYXRpb25JbnB1dCwgeyBsYWJlbDogJ0Rlc3RpbmF0aW9uIHBhZ2UnLCBhbGlnbjogJ3RvcCcgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuc3VtbWFyeUlucHV0ID0gbmV3IE9PLnVpLkNvbWJvQm94SW5wdXRXaWRnZXQoe1xuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgICRvdmVybGF5OiB0aGlzLiRvdmVybGF5LFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgICAgICAgICAgICAgeyBkYXRhOiAnUGVyZm9ybWluZyBbW1dQOlJNL1RSfHJlcXVlc3RlZCB0ZWNobmljYWwgbW92ZV1dJyB9LCAvL1xuICAgICAgICAgICAgICAgICAgICB7IGRhdGE6ICdSZXN1bHQgb2YgW1tXUDpSTXxyZXF1ZXN0ZWQgbW92ZV1dJyB9LFxuICAgICAgICAgICAgICAgICAgICB7IGRhdGE6ICdNb3ZlIHRvIFtbV1A6Q09NTU9OTkFNRXxjb21tb24gbmFtZV1dJyB9LFxuICAgICAgICAgICAgICAgICAgICB7IGRhdGE6ICdGaXhpbmcgdHlwbycgfSxcbiAgICAgICAgICAgICAgICAgICAgeyBkYXRhOiAnRml4aW5nIGNhcGl0YWxpemF0aW9uJyB9LFxuICAgICAgICAgICAgICAgICAgICB7IGRhdGE6ICdGaXhpbmcgcGVyIFtbV1A6TkN8bmFtaW5nIGNvbnZlbnRpb25zXV0nIH0sXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLnN1bW1hcnlJbnB1dC5jb25uZWN0KHRoaXMsIHsgY2hhbmdlOiAndXBkYXRlQWN0aW9uU3RhdGUnIH0pO1xuXG4gICAgICAgICAgICB0aGlzLnN1bW1hcnlJbnB1dEZpZWxkID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KHRoaXMuc3VtbWFyeUlucHV0LCB7IGxhYmVsOiAnU3VtbWFyeScsIGFsaWduOiAndG9wJyB9KTtcblxuICAgICAgICAgICAgdGhpcy5tb3ZlVGFsa0NoZWNrYm94ID0gbmV3IE9PLnVpLkNoZWNrYm94SW5wdXRXaWRnZXQoeyBzZWxlY3RlZDogdHJ1ZSB9KTtcbiAgICAgICAgICAgIHRoaXMubW92ZVRhbGtDaGVja2JveEZpZWxkID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KHRoaXMubW92ZVRhbGtDaGVja2JveCwgeyBsYWJlbDogJ01vdmUgdGFsayBwYWdlIChpZiBhcHBsaWNhYmxlKScsIGFsaWduOiAnaW5saW5lJyB9KTtcblxuICAgICAgICAgICAgdGhpcy5tb3ZlU3VicGFnZXNDaGVja2JveCA9IG5ldyBPTy51aS5DaGVja2JveElucHV0V2lkZ2V0KHsgc2VsZWN0ZWQ6IHRydWUgfSk7XG4gICAgICAgICAgICB0aGlzLm1vdmVTdWJwYWdlc0NoZWNrYm94RmllbGQgPSBuZXcgT08udWkuRmllbGRMYXlvdXQodGhpcy5tb3ZlU3VicGFnZXNDaGVja2JveCwgeyBsYWJlbDogJ01vdmUgc3VicGFnZXMgKGlmIGFwcGxpY2FibGUpJywgYWxpZ246ICdpbmxpbmUnIH0pO1xuXG4gICAgICAgICAgICB0aGlzLmNvbnRlbnQuYWRkSXRlbXMoW3RoaXMuZGVzdGluYXRpb25JbnB1dEZpZWxkLCB0aGlzLnN1bW1hcnlJbnB1dEZpZWxkLCB0aGlzLm1vdmVUYWxrQ2hlY2tib3hGaWVsZCwgdGhpcy5tb3ZlU3VicGFnZXNDaGVja2JveEZpZWxkXSk7XG5cbiAgICAgICAgICAgIHRoaXMucGFuZWwuJGVsZW1lbnQuYXBwZW5kKHRoaXMuY29udGVudC4kZWxlbWVudCk7XG4gICAgICAgICAgICB0aGlzLiRib2R5LmFwcGVuZCh0aGlzLnBhbmVsLiRlbGVtZW50KTtcbiAgICAgICAgfTtcblxuICAgICAgICBTd2FwRGlhbG9nLnByb3RvdHlwZS51cGRhdGVBY3Rpb25TdGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbnN0IGlzVmFsaWQgPSB0aGlzLmRlc3RpbmF0aW9uSW5wdXQuZ2V0VmFsdWUoKSAhPT0gJycgJiYgdGhpcy5kZXN0aW5hdGlvbklucHV0LmdldFZhbGlkaXR5KCkgJiYgdGhpcy5zdW1tYXJ5SW5wdXQuZ2V0VmFsdWUoKSAhPT0gJyc7XG4gICAgICAgICAgICB0aGlzLmFjdGlvbnMuc2V0QWJpbGl0aWVzKHsgc3dhcDogaXNWYWxpZCB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBTd2FwRGlhbG9nLnByb3RvdHlwZS5nZXRBY3Rpb25Qcm9jZXNzID0gZnVuY3Rpb24gKGFjdGlvbjogc3RyaW5nKSB7XG4gICAgICAgICAgICBpZiAoYWN0aW9uID09PSAnc3dhcCcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvbiA9IHRoaXMuZGVzdGluYXRpb25JbnB1dC5nZXRWYWx1ZSgpLnRyaW0oKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdW1tYXJ5ID0gdGhpcy5zdW1tYXJ5SW5wdXQuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBtb3ZlVGFsayA9IHRoaXMubW92ZVRhbGtDaGVja2JveC5pc1NlbGVjdGVkKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgbW92ZVN1YnBhZ2VzID0gdGhpcy5tb3ZlU3VicGFnZXNDaGVja2JveC5pc1NlbGVjdGVkKCk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE9PLnVpLlByb2Nlc3MoKVxuICAgICAgICAgICAgICAgICAgICAubmV4dCgoKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgcm91bmRSb2Jpbih1c2VyUGVybWlzc2lvbnMsIGN1cnJlbnRUaXRsZSwgZGVzdGluYXRpb24sIHN1bW1hcnksIG1vdmVUYWxrLCBtb3ZlU3VicGFnZXMpLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkLkRlZmVycmVkKCkucmVqZWN0KHRoaXMuc2hvd0Vycm9ycyhbbmV3IE9PLnVpLkVycm9yKGVycm9yPy5tZXNzYWdlIHx8ICdBbiB1bmtub3duIGVycm9yIG9jY3VycmVkLicpXSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgLm5leHQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbXcubm90aWZ5KCdNb3ZlcyBjb21wbGV0ZSEgUmVsb2FkaW5nLi4uJywgeyB0eXBlOiAnc3VjY2VzcycgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsb3NlKHsgYWN0aW9uLCBzdWNjZXNzOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCksIDEwMDApO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uID09PSAnY2FuY2VsJylcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE9PLnVpLlByb2Nlc3MoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsb3NlKHsgYWN0aW9uIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gU3dhcERpYWxvZy5zdXBlci5wcm90b3R5cGUuZ2V0QWN0aW9uUHJvY2Vzcy5jYWxsKHRoaXMsIGFjdGlvbik7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgZGlhbG9nID0gbmV3IFN3YXBEaWFsb2coKTtcbiAgICAgICAgY29uc3Qgd2luZG93TWFuYWdlciA9IG5ldyBPTy51aS5XaW5kb3dNYW5hZ2VyKCk7XG4gICAgICAgICQoJ2JvZHknKS5hcHBlbmQod2luZG93TWFuYWdlci4kZWxlbWVudCk7XG4gICAgICAgIHdpbmRvd01hbmFnZXIuYWRkV2luZG93cyhbZGlhbG9nXSk7XG4gICAgICAgIHdpbmRvd01hbmFnZXIub3BlbldpbmRvdyhkaWFsb2cpO1xuICAgIH0pO1xufSk7XG5cbi8vICEhIFNvbWUgY29udGVudCBiZWxvdyB0aGlzIGNvbnRhaW5zIGNvZGUgbW9kaWZpZWQgZnJvbSBbW1VzZXI6QW5keSBNLiBXYW5nL3BhZ2Vzd2FwLmpzXV0gISFcblxuLyoqXG4gKiBDaGVja3MgaWYgdXNlciBoYXMgdGhlIHJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHBlcmZvcm0gYSBzd2FwXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx7Y2FuU3dhcDogYm9vbGVhbiwgYWxsb3dTd2FwVGVtcGxhdGVzOiBib29sZWFufT59XG4gKi9cbmZ1bmN0aW9uIGZldGNoVXNlclBlcm1pc3Npb25zKCkge1xuICAgIHJldHVybiBuZXcgbXcuQXBpKClcbiAgICAgICAgLmdldCh7XG4gICAgICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgICAgICBtZXRhOiAndXNlcmluZm8nLFxuICAgICAgICAgICAgdWlwcm9wOiAncmlnaHRzJyxcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4oKGRhdGEpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJpZ2h0c0xpc3QgPSBkYXRhLnF1ZXJ5LnVzZXJpbmZvLnJpZ2h0cztcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgY2FuU3dhcDogcmlnaHRzTGlzdC5pbmNsdWRlcygnc3VwcHJlc3NyZWRpcmVjdCcpICYmIHJpZ2h0c0xpc3QuaW5jbHVkZXMoJ21vdmUtc3VicGFnZXMnKSwgLy8gUGFnZSBtb3ZlciByaWdodCBvbiB0aGUgRW5nbGlzaCBXaWtpcGVkaWFcbiAgICAgICAgICAgICAgICBhbGxvd1N3YXBUZW1wbGF0ZXM6IHJpZ2h0c0xpc3QuaW5jbHVkZXMoJ3RlbXBsYXRlZWRpdG9yJyksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbn1cblxuLyoqXG4gKiBHaXZlbiBuYW1lc3BhY2UgZGF0YSwgdGl0bGUsIHRpdGxlIG5hbWVzcGFjZSwgcmV0dXJucyBleHBlY3RlZCB0aXRsZSBvZiBwYWdlXG4gKiBBbG9uZyB3aXRoIHRpdGxlIHdpdGhvdXQgcHJlZml4XG4gKiBQcmVjb25kaXRpb24sIHRpdGxlLCB0aXRsZU5zIGlzIGEgc3ViamVjdCBwYWdlIVxuICovXG5mdW5jdGlvbiBnZXRUYWxrUGFnZU5hbWUobmFtZXNwYWNlRGF0YSwgdGl0bGUsIHRpdGxlTmFtZXNwYWNlKSB7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgY29uc3QgcHJlZml4TGVuZ3RoID0gbmFtZXNwYWNlRGF0YVt0aXRsZU5hbWVzcGFjZS50b1N0cmluZygpXVsnKiddLmxlbmd0aCA9PT0gMCA/IDAgOiBuYW1lc3BhY2VEYXRhW3RpdGxlTmFtZXNwYWNlLnRvU3RyaW5nKCldWycqJ10ubGVuZ3RoICsgMTtcbiAgICByZXN1bHQudGl0bGVXaXRob3V0UHJlZml4ID0gdGl0bGUuc3Vic3RyaW5nKHByZWZpeExlbmd0aCwgdGl0bGUubGVuZ3RoKTtcbiAgICByZXN1bHQudGFsa1RpdGxlID0gYCR7bmFtZXNwYWNlRGF0YVsodGl0bGVOYW1lc3BhY2UgKyAxKS50b1N0cmluZygpXVsnKiddfToke3Jlc3VsdC50aXRsZVdpdGhvdXRQcmVmaXh9YDtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEdpdmVuIHR3byAobm9ybWFsaXplZCkgdGl0bGVzLCBmaW5kIHRoZWlyIG5hbWVzcGFjZXMsIGlmIHRoZXkgYXJlIHJlZGlyZWN0cyxcbiAqIGlmIGhhdmUgYSB0YWxrIHBhZ2UsIHdoZXRoZXIgdGhlIGN1cnJlbnQgdXNlciBjYW4gbW92ZSB0aGUgcGFnZXMsIHN1Z2dlc3RzXG4gKiB3aGV0aGVyIG1vdmVzdWJwYWdlcyBzaG91bGQgYmUgYWxsb3dlZCwgd2hldGhlciB0YWxrIHBhZ2VzIG5lZWQgdG8gYmUgY2hlY2tlZFxuICovXG5mdW5jdGlvbiBzd2FwVmFsaWRhdGUoc3RhcnRUaXRsZSwgZW5kVGl0bGUsIHBhZ2VzRGF0YSwgbmFtZXNwYWNlc0RhdGEsIHVzZXJQZXJtaXNzaW9ucykge1xuICAgIGNvbnN0IHJlc3VsdCA9IHsgdmFsaWQ6IHRydWUsIGFsbG93TW92ZVN1YnBhZ2VzOiB0cnVlLCBjaGVja1RhbGs6IHRydWUgfTtcblxuICAgIGxldCBjb3VudCA9IDA7XG4gICAgZm9yIChjb25zdCBbcGFnZUlkLCBwYWdlRGF0YV0gb2YgT2JqZWN0LmVudHJpZXMocGFnZXNEYXRhKSkge1xuICAgICAgICBjb3VudCsrO1xuICAgICAgICBpZiAocGFnZUlkID09PSAnLTEnIHx8IHBhZ2VEYXRhLm5zIDwgMCkge1xuICAgICAgICAgICAgcmVzdWx0LnZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICByZXN1bHQuZXJyb3IgPSBgUGFnZSAke3BhZ2VEYXRhLnRpdGxlfSBkb2VzIG5vdCBleGlzdC5gO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICAvLyBFbmFibGUgb25seSBpbiBNYWluLCBUYWxrLCBVc2VyLCBVc2VyIHRhbGssIFdpa2lwZWRpYSwgV2lraXBlZGlhIHRhbGssIEhlbHAsIEhlbHAgdGFsaywgRHJhZnQsIGFuZCBEcmFmdCB0YWxrXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIChwYWdlRGF0YS5ucyA+PSA2ICYmIHBhZ2VEYXRhLm5zIDw9IDkpIHx8XG4gICAgICAgICAgICAocGFnZURhdGEubnMgPj0gMTAgJiYgcGFnZURhdGEubnMgPD0gMTEgJiYgIXVzZXJQZXJtaXNzaW9ucy5hbGxvd1N3YXBUZW1wbGF0ZXMpIHx8XG4gICAgICAgICAgICAocGFnZURhdGEubnMgPj0gMTQgJiYgcGFnZURhdGEubnMgPD0gMTE3KSB8fFxuICAgICAgICAgICAgcGFnZURhdGEubnMgPj0gMTIwXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmVzdWx0LnZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICByZXN1bHQuZXJyb3IgPSBgTmFtZXNwYWNlIG9mICR7cGFnZURhdGEudGl0bGV9ICgke3BhZ2VEYXRhLm5zfSkgbm90IHN1cHBvcnRlZC5cXG5cXG5MaWtlbHkgcmVhc29uczpcXG4tIE5hbWVzIG9mIHBhZ2VzIGluIHRoaXMgbmFtZXNwYWNlIHJlbGllcyBvbiBvdGhlciBwYWdlc1xcbi0gTmFtZXNwYWNlIGZlYXR1cmVzIGhlYXZpbHktdHJhbnNjbHVkZWQgcGFnZXNcXG4tIE5hbWVzcGFjZSBpbnZvbHZlcyBzdWJwYWdlczogc3dhcHMgcHJvZHVjZSBtYW55IHJlZGxpbmtzXFxuXFxuXFxuSWYgdGhlIG1vdmUgaXMgbGVnaXRpbWF0ZSwgY29uc2lkZXIgYSBjYXJlZnVsIG1hbnVhbCBzd2FwLmA7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGFydFRpdGxlID09PSBwYWdlRGF0YS50aXRsZSkge1xuICAgICAgICAgICAgcmVzdWx0LmN1cnJlbnRUaXRsZSA9IHBhZ2VEYXRhLnRpdGxlO1xuICAgICAgICAgICAgcmVzdWx0LmN1cnJlbnROYW1lc3BhY2UgPSBwYWdlRGF0YS5ucztcbiAgICAgICAgICAgIHJlc3VsdC5jdXJyZW50VGFsa0lkID0gcGFnZURhdGEudGFsa2lkO1xuICAgICAgICAgICAgcmVzdWx0LmN1cnJlbnRDYW5Nb3ZlID0gcGFnZURhdGEuYWN0aW9ucy5tb3ZlID09PSAnJztcbiAgICAgICAgICAgIHJlc3VsdC5jdXJyZW50SXNSZWRpcmVjdCA9IHBhZ2VEYXRhLnJlZGlyZWN0ID09PSAnJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW5kVGl0bGUgPT09IHBhZ2VEYXRhLnRpdGxlKSB7XG4gICAgICAgICAgICByZXN1bHQuZGVzdGluYXRpb25UaXRsZSA9IHBhZ2VEYXRhLnRpdGxlO1xuICAgICAgICAgICAgcmVzdWx0LmRlc3RpbmF0aW9uTmFtZXNwYWNlID0gcGFnZURhdGEubnM7XG4gICAgICAgICAgICByZXN1bHQuZGVzdGluYXRpb25UYWxrSWQgPSBwYWdlRGF0YS50YWxraWQ7XG4gICAgICAgICAgICByZXN1bHQuZGVzdGluYXRpb25DYW5Nb3ZlID0gcGFnZURhdGEuYWN0aW9ucy5tb3ZlID09PSAnJztcbiAgICAgICAgICAgIHJlc3VsdC5kZXN0aW5hdGlvbklzUmVkaXJlY3QgPSBwYWdlRGF0YS5yZWRpcmVjdCA9PT0gJyc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXJlc3VsdC52YWxpZCkgcmV0dXJuIHJlc3VsdDtcbiAgICBpZiAoIXJlc3VsdC5jdXJyZW50Q2FuTW92ZSkge1xuICAgICAgICByZXN1bHQudmFsaWQgPSBmYWxzZTtcbiAgICAgICAgcmVzdWx0LmVycm9yID0gYCR7cmVzdWx0LmN1cnJlbnRUaXRsZX0gaXMgaW1tb3ZhYmxlYDtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgaWYgKCFyZXN1bHQuZGVzdGluYXRpb25DYW5Nb3ZlKSB7XG4gICAgICAgIHJlc3VsdC52YWxpZCA9IGZhbHNlO1xuICAgICAgICByZXN1bHQuZXJyb3IgPSBgJHtyZXN1bHQuZGVzdGluYXRpb25UaXRsZX0gaXMgaW1tb3ZhYmxlYDtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgaWYgKHJlc3VsdC5jdXJyZW50TmFtZXNwYWNlICUgMiAhPT0gcmVzdWx0LmRlc3RpbmF0aW9uTmFtZXNwYWNlICUgMikge1xuICAgICAgICByZXN1bHQudmFsaWQgPSBmYWxzZTtcbiAgICAgICAgcmVzdWx0LmVycm9yID0gXCJOYW1lc3BhY2VzIGRvbid0IG1hdGNoOiBvbmUgaXMgYSB0YWxrIHBhZ2UsIHRoZSBvdGhlciBpcyBub3RcIjtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgaWYgKGNvdW50ICE9PSAyKSB7XG4gICAgICAgIHJlc3VsdC52YWxpZCA9IGZhbHNlO1xuICAgICAgICByZXN1bHQuZXJyb3IgPSAnRGVzdGluYXRpb24gdGl0bGUgaXMgdGhlIHNhbWUgYXMgdGhlIGN1cnJlbnQgdGl0bGUnO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICByZXN1bHQuY3VycmVudE5hbWVzcGFjZUFsbG93U3VicGFnZXMgPSBuYW1lc3BhY2VzRGF0YVtyZXN1bHQuY3VycmVudE5hbWVzcGFjZS50b1N0cmluZygpXS5zdWJwYWdlcyAhPT0gJyc7XG4gICAgcmVzdWx0LmRlc3RpbmF0aW9uTmFtZXNwYWNlQWxsb3dTdWJwYWdlcyA9IG5hbWVzcGFjZXNEYXRhW3Jlc3VsdC5kZXN0aW5hdGlvbk5hbWVzcGFjZS50b1N0cmluZygpXS5zdWJwYWdlcyAhPT0gJyc7XG5cbiAgICAvLyBJZiBzYW1lIG5hbWVzcGFjZSAoc3VicGFnZXMgYWxsb3dlZCksIGlmIG9uZSBpcyBzdWJwYWdlIG9mIGFub3RoZXIsIGRpc2FsbG93IG1vdmluZyBzdWJwYWdlc1xuICAgIGlmIChyZXN1bHQuY3VycmVudFRpdGxlLnN0YXJ0c1dpdGgocmVzdWx0LmRlc3RpbmF0aW9uVGl0bGUgKyAnLycpIHx8IHJlc3VsdC5kZXN0aW5hdGlvblRpdGxlLnN0YXJ0c1dpdGgocmVzdWx0LmN1cnJlbnRUaXRsZSArICcvJykpIHtcbiAgICAgICAgaWYgKHJlc3VsdC5jdXJyZW50TmFtZXNwYWNlICE9PSByZXN1bHQuZGVzdGluYXRpb25OYW1lc3BhY2UpIHtcbiAgICAgICAgICAgIHJlc3VsdC52YWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgcmVzdWx0LmVycm9yID0gYCR7cmVzdWx0LmN1cnJlbnRUaXRsZX0gaW4gbnMgJHtyZXN1bHQuY3VycmVudE5hbWVzcGFjZX1cXG4ke3Jlc3VsdC5kZXN0aW5hdGlvblRpdGxlfSBpbiBucyAke3Jlc3VsdC5kZXN0aW5hdGlvbk5hbWVzcGFjZX0uIERpc2FsbG93aW5nLmA7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzdWx0LmFsbG93TW92ZVN1YnBhZ2VzID0gcmVzdWx0LmN1cnJlbnROYW1lc3BhY2VBbGxvd1N1YnBhZ2VzO1xuICAgICAgICBpZiAoIXJlc3VsdC5hbGxvd01vdmVTdWJwYWdlcykgcmVzdWx0LmFkZExpbmVJbmZvID0gJ09uZSBwYWdlIGlzIGEgc3VicGFnZS4gRGlzYWxsb3dpbmcgbW92ZS1zdWJwYWdlcyc7XG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdC5jdXJyZW50TmFtZXNwYWNlICUgMiA9PT0gMSlcbiAgICAgICAgcmVzdWx0LmNoZWNrVGFsayA9IGZhbHNlOyAvLyBObyBuZWVkIHRvIGNoZWNrIHRhbGtzLCBhbHJlYWR5IHRhbGsgcGFnZXNcbiAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgY3VycmVudFRhbGtEYXRhID0gZ2V0VGFsa1BhZ2VOYW1lKG5hbWVzcGFjZXNEYXRhLCByZXN1bHQuY3VycmVudFRpdGxlLCByZXN1bHQuY3VycmVudE5hbWVzcGFjZSk7XG4gICAgICAgIHJlc3VsdC5jdXJyZW50VGl0bGVXaXRob3V0UHJlZml4ID0gY3VycmVudFRhbGtEYXRhLnRpdGxlV2l0aG91dFByZWZpeDtcbiAgICAgICAgcmVzdWx0LmN1cnJlbnRUYWxrTmFtZSA9IGN1cnJlbnRUYWxrRGF0YS50YWxrVGl0bGU7XG4gICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uRGF0YSA9IGdldFRhbGtQYWdlTmFtZShuYW1lc3BhY2VzRGF0YSwgcmVzdWx0LmRlc3RpbmF0aW9uVGl0bGUsIHJlc3VsdC5kZXN0aW5hdGlvbk5hbWVzcGFjZSk7XG4gICAgICAgIHJlc3VsdC5kZXN0aW5hdGlvblRpdGxlV2l0aG91dFByZWZpeCA9IGRlc3RpbmF0aW9uRGF0YS50aXRsZVdpdGhvdXRQcmVmaXg7XG4gICAgICAgIHJlc3VsdC5kZXN0aW5hdGlvblRhbGtOYW1lID0gZGVzdGluYXRpb25EYXRhLnRhbGtUaXRsZTtcbiAgICAgICAgLy8gVE9ETzogcG9zc2libGUgdGhhdCByZXQuY3VycmVudFRhbGtJZCBpcyB1bmRlZmluZWQsIGJ1dCBzdWJqZWN0IHBhZ2UgaGFzIHRhbGsgc3VicGFnZXNcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEdpdmVuIHR3byB0YWxrIHBhZ2UgdGl0bGVzIChtYXkgYmUgdW5kZWZpbmVkKSwgcmV0cmlldmVzIHRoZWlyIHBhZ2VzIGZvciBjb21wYXJpc29uXG4gKiBBc3N1bWVzIHRoYXQgdGFsayBwYWdlcyBhbHdheXMgaGF2ZSBzdWJwYWdlcyBlbmFibGVkLlxuICogQXNzdW1lcyB0aGF0IHBhZ2VzIGFyZSBub3QgaWRlbnRpY2FsIChzdWJqZWN0IHBhZ2VzIHdlcmUgYWxyZWFkeSB2ZXJpZmllZClcbiAqIEFzc3VtZXMgbmFtZXNwYWNlcyBhcmUgb2theSAoc3ViamVjdCBwYWdlcyBhbHJlYWR5IGNoZWNrZWQpXG4gKiAoQ3VycmVudGx5KSBhc3N1bWVzIHRoYXQgdGhlIG1hbGljaW91cyBjYXNlIG9mIHN1YmplY3QgcGFnZXNcbiAqICAgbm90IGRldGVjdGVkIGFzIHN1YnBhZ2VzIGFuZCB0aGUgdGFsayBwYWdlcyBBUkUgc3VicGFnZXNcbiAqICAgKGkuZS4gQSBhbmQgQS9CIHZzLiBUYWxrOkEgYW5kIFRhbGs6QS9CKSBkb2VzIG5vdCBoYXBwZW4gLyBkb2VzIG5vdCBoYW5kbGVcbiAqIFJldHVybnMgc3RydWN0dXJlIGluZGljYXRpbmcgd2hldGhlciBtb3ZlIHRhbGsgc2hvdWxkIGJlIGFsbG93ZWRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gdGFsa1ZhbGlkYXRlKGNoZWNrVGFsaywgZmlyc3RUYWxrLCBzZWNvbmRUYWxrKSB7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgcmVzdWx0LmFsbG93TW92ZVRhbGsgPSB0cnVlO1xuICAgIGlmICghY2hlY2tUYWxrKSByZXR1cm4gcmVzdWx0O1xuICAgIGlmIChmaXJzdFRhbGsgPT09IHVuZGVmaW5lZCB8fCBzZWNvbmRUYWxrID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbXcubm90aWZ5KCdVbmFibGUgdG8gdmFsaWRhdGUgdGFsay4gRGlzYWxsb3dpbmcgbW92ZXRhbGsgdG8gYmUgc2FmZScsIHsgdHlwZTogJ2Vycm9yJyB9KTtcbiAgICAgICAgcmVzdWx0LmFsbG93TW92ZVRhbGsgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgcmVzdWx0LmN1cnJURE5FID0gdHJ1ZTtcbiAgICByZXN1bHQuZGVzdFRETkUgPSB0cnVlO1xuICAgIHJlc3VsdC5jdXJyZW50VGFsa0NhbkNyZWF0ZSA9IHRydWU7XG4gICAgcmVzdWx0LmRlc3RpbmF0aW9uVGFsa0NhbkNyZWF0ZSA9IHRydWU7XG4gICAgY29uc3QgdGFsa1RpdGxlQXJyID0gW2ZpcnN0VGFsaywgc2Vjb25kVGFsa107XG4gICAgaWYgKHRhbGtUaXRsZUFyci5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHRhbGtEYXRhID0gKFxuICAgICAgICAgICAgYXdhaXQgbmV3IG13LkFwaSgpLmdldCh7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgICAgIHByb3A6ICdpbmZvJyxcbiAgICAgICAgICAgICAgICBpbnRlc3RhY3Rpb25zOiAnbW92ZXxjcmVhdGUnLFxuICAgICAgICAgICAgICAgIHRpdGxlczogdGFsa1RpdGxlQXJyLmpvaW4oJ3wnKSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICkucXVlcnkucGFnZXM7XG5cbiAgICAgICAgZm9yIChjb25zdCBbLCBwYWdlRGF0YV0gb2YgT2JqZWN0LmVudHJpZXModGFsa0RhdGEpKVxuICAgICAgICAgICAgaWYgKHBhZ2VEYXRhLnRpdGxlID09PSBmaXJzdFRhbGspIHtcbiAgICAgICAgICAgICAgICByZXN1bHQuY3VyclRETkUgPSBwYWdlRGF0YS5pbnZhbGlkID09PSAnJyB8fCBwYWdlRGF0YS5taXNzaW5nID09PSAnJztcbiAgICAgICAgICAgICAgICByZXN1bHQuY3VycmVudFRhbGtUaXRsZSA9IHBhZ2VEYXRhLnRpdGxlO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5jdXJyZW50VGFsa0Nhbk1vdmUgPSBwYWdlRGF0YS5hY3Rpb25zLm1vdmUgPT09ICcnO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5jdXJyZW50VGFsa0NhbkNyZWF0ZSA9IHBhZ2VEYXRhLmFjdGlvbnMuY3JlYXRlID09PSAnJztcbiAgICAgICAgICAgICAgICByZXN1bHQuY3VycmVudFRhbGtJc1JlZGlyZWN0ID0gcGFnZURhdGEucmVkaXJlY3QgPT09ICcnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwYWdlRGF0YS50aXRsZSA9PT0gc2Vjb25kVGFsaykge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5kZXN0VERORSA9IHBhZ2VEYXRhLmludmFsaWQgPT09ICcnIHx8IHBhZ2VEYXRhLm1pc3NpbmcgPT09ICcnO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5kZXN0aW5hdGlvblRhbGtUaXRsZSA9IHBhZ2VEYXRhLnRpdGxlO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5kZXN0aW5hdGlvblRhbGtDYW5Nb3ZlID0gcGFnZURhdGEuYWN0aW9ucy5tb3ZlID09PSAnJztcbiAgICAgICAgICAgICAgICByZXN1bHQuZGVzdGluYXRpb25UYWxrQ2FuQ3JlYXRlID0gcGFnZURhdGEuYWN0aW9ucy5jcmVhdGUgPT09ICcnO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5kZXN0aW5hdGlvblRhbGtJc1JlZGlyZWN0ID0gcGFnZURhdGEucmVkaXJlY3QgPT09ICcnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtdy5ub3RpZnkoJ0ZvdW5kIHBhZ2VpZCBub3QgbWF0Y2hpbmcgZ2l2ZW4gaWRzLicsIHsgdHlwZTogJ2Vycm9yJyB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVzdWx0LmFsbG93TW92ZVRhbGsgPSByZXN1bHQuY3VycmVudFRhbGtDYW5DcmVhdGUgJiYgcmVzdWx0LmN1cnJlbnRUYWxrQ2FuTW92ZSAmJiByZXN1bHQuZGVzdGluYXRpb25UYWxrQ2FuQ3JlYXRlICYmIHJlc3VsdC5kZXN0aW5hdGlvblRhbGtDYW5Nb3ZlO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogR2l2ZW4gZXhpc3RpbmcgdGl0bGUgKG5vdCBwcmVmaXhlZCB3aXRoIFwiL1wiKSwgb3B0aW9uYWxseSBzZWFyY2hpbmcgZm9yIHRhbGssXG4gKiAgIGZpbmRzIHN1YnBhZ2VzIChpbmNsLiB0aG9zZSB0aGF0IGFyZSByZWRpcnMpIGFuZCB3aGV0aGVyIGxpbWl0cyBhcmUgZXhjZWVkZWRcbiAqIEFzIG9mIDIwMTYtMDgsIHVzZXMgMiBhcGkgZ2V0IGNhbGxzIHRvIGdldCBuZWVkZWQgZGV0YWlsczpcbiAqICAgd2hldGhlciB0aGUgcGFnZSBjYW4gYmUgbW92ZWQsIHdoZXRoZXIgdGhlIHBhZ2UgaXMgYSByZWRpcmVjdFxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRTdWJwYWdlcyhuYW1lc3BhY2VEYXRhLCB0aXRsZSwgdGl0bGVOYW1lc3BhY2UsIGlzVGFsaykge1xuICAgIGlmICghaXNUYWxrICYmIG5hbWVzcGFjZURhdGFbdGl0bGVOYW1lc3BhY2UudG9TdHJpbmcoKV0uc3VicGFnZXMgIT09ICcnKSByZXR1cm4geyBkYXRhOiBbXSB9O1xuXG4gICAgY29uc3QgdGl0bGVQYWdlRGF0YSA9IGdldFRhbGtQYWdlTmFtZShuYW1lc3BhY2VEYXRhLCB0aXRsZSwgdGl0bGVOYW1lc3BhY2UpO1xuICAgIGNvbnN0IHN1YnBhZ2VzID0gKFxuICAgICAgICBhd2FpdCBuZXcgbXcuQXBpKCkuZ2V0KHtcbiAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgIGxpc3Q6ICdhbGxwYWdlcycsXG4gICAgICAgICAgICBhcG5hbWVzcGFjZTogaXNUYWxrID8gdGl0bGVOYW1lc3BhY2UgKyAxIDogdGl0bGVOYW1lc3BhY2UsXG4gICAgICAgICAgICBhcGZyb206IHRpdGxlUGFnZURhdGEudGl0bGVXaXRob3V0UHJlZml4ICsgJy8nLFxuICAgICAgICAgICAgYXB0bzogdGl0bGVQYWdlRGF0YS50aXRsZVdpdGhvdXRQcmVmaXggKyAnMCcsXG4gICAgICAgICAgICBhcGxpbWl0OiAxMDEsXG4gICAgICAgIH0pXG4gICAgKS5xdWVyeS5hbGxwYWdlcztcblxuICAgIC8vIFR3byBxdWVyaWVzIGFyZSBuZWVkZWQgZHVlIHRvIEFQSSBsaW1pdHNcbiAgICBjb25zdCBzdWJwYWdlSWRzID0gW1tdLCBbXV07XG4gICAgZm9yIChjb25zdCBpZCBpbiBzdWJwYWdlcykgc3VicGFnZUlkc1tpZCA8IDUwID8gMCA6IDFdLnB1c2goc3VicGFnZXNbaWRdLnBhZ2VpZCk7XG5cbiAgICBpZiAoc3VicGFnZUlkc1swXS5sZW5ndGggPT09IDApIHJldHVybiB7IGRhdGE6IFtdIH07XG5cbiAgICBpZiAoc3VicGFnZUlkc1sxXS5sZW5ndGggPT09IDUxKSByZXR1cm4geyBlcnJvcjogJzEwMCsgc3VicGFnZXMsIHRvbyBtYW55IHRvIG1vdmUuJyB9O1xuXG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgY29uc3Qgc3VicGFnZURhdGFPbmUgPSAoXG4gICAgICAgIGF3YWl0IG5ldyBtdy5BcGkoKS5nZXQoe1xuICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgcHJvcDogJ2luZm8nLFxuICAgICAgICAgICAgaW50ZXN0YWN0aW9uczogJ21vdmV8Y3JlYXRlJyxcbiAgICAgICAgICAgIHBhZ2VpZHM6IHN1YnBhZ2VJZHNbMF0uam9pbignfCcpLFxuICAgICAgICB9KVxuICAgICkucXVlcnkucGFnZXM7XG4gICAgZm9yIChjb25zdCBbLCBwYWdlRGF0YV0gb2YgT2JqZWN0LmVudHJpZXMoc3VicGFnZURhdGFPbmUpKVxuICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgICB0aXRsZTogcGFnZURhdGEudGl0bGUsXG4gICAgICAgICAgICBpc1JlZGlyOiBwYWdlRGF0YS5yZWRpcmVjdCA9PT0gJycsXG4gICAgICAgICAgICBjYW5Nb3ZlOiBwYWdlRGF0YS5hY3Rpb25zPy5tb3ZlID09PSAnJyxcbiAgICAgICAgfSk7XG5cbiAgICBpZiAoc3VicGFnZUlkc1sxXS5sZW5ndGggPT09IDApIHJldHVybiB7IGRhdGE6IHJlc3VsdCB9O1xuXG4gICAgY29uc3Qgc3VicGFnZURhdGFUd28gPSAoXG4gICAgICAgIGF3YWl0IG5ldyBtdy5BcGkoKS5nZXQoe1xuICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgcHJvcDogJ2luZm8nLFxuICAgICAgICAgICAgaW50ZXN0YWN0aW9uczogJ21vdmV8Y3JlYXRlJyxcbiAgICAgICAgICAgIHBhZ2VpZHM6IHN1YnBhZ2VJZHNbMV0uam9pbignfCcpLFxuICAgICAgICB9KVxuICAgICkucXVlcnkucGFnZXM7XG4gICAgZm9yIChjb25zdCBbLCBwYWdlRGF0YV0gb2YgT2JqZWN0LmVudHJpZXMoc3VicGFnZURhdGFUd28pKVxuICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgICB0aXRsZTogcGFnZURhdGEudGl0bGUsXG4gICAgICAgICAgICBpc1JlZGlyZWN0OiBwYWdlRGF0YS5yZWRpcmVjdCA9PT0gJycsXG4gICAgICAgICAgICBjYW5Nb3ZlOiBwYWdlRGF0YS5hY3Rpb25zPy5tb3ZlID09PSAnJyxcbiAgICAgICAgfSk7XG5cbiAgICByZXR1cm4geyBkYXRhOiByZXN1bHQgfTtcbn1cblxuLyoqXG4gKiBQcmludHMgc3VicGFnZSBkYXRhIGdpdmVuIHJldHJpZXZlZCBzdWJwYWdlIGluZm9ybWF0aW9uIHJldHVybmVkIGJ5IGdldFN1YnBhZ2VzXG4gKiBSZXR1cm5zIGEgc3VnZ2VzdGlvbiB3aGV0aGVyIG1vdmVzdWJwYWdlcyBzaG91bGQgYmUgYWxsb3dlZFxuICovXG5mdW5jdGlvbiBwcmludFN1YnBhZ2VJbmZvKGJhc2VQYWdlLCBjdXJyZW50U3VicGFnZSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIGNvbnN0IGN1cnJlbnRTdWJwYWdlcyA9IFtdO1xuICAgIGNvbnN0IHN1YnBhZ2VzQ2Fubm90TW92ZSA9IFtdO1xuICAgIGxldCByZWRpcmVjdENvdW50ID0gMDtcbiAgICBmb3IgKGNvbnN0IFssIHBhZ2VEYXRhXSBvZiBPYmplY3QuZW50cmllcyhjdXJyZW50U3VicGFnZS5kYXRhKSkge1xuICAgICAgICBpZiAoIXBhZ2VEYXRhLmNhbk1vdmUpIHN1YnBhZ2VzQ2Fubm90TW92ZS5wdXNoKHBhZ2VEYXRhLnRpdGxlKTtcblxuICAgICAgICBjdXJyZW50U3VicGFnZXMucHVzaCgocGFnZURhdGEuaXNSZWRpcmVjdCA/ICcoUikgJyA6ICcgICcpICsgcGFnZURhdGEudGl0bGUpO1xuICAgICAgICBpZiAocGFnZURhdGEuaXNSZWRpcmVjdCkgcmVkaXJlY3RDb3VudCsrO1xuICAgIH1cblxuICAgIGlmIChjdXJyZW50U3VicGFnZXMubGVuZ3RoID4gMClcbiAgICAgICAgbXcubm90aWZ5KFxuICAgICAgICAgICAgc3VicGFnZXNDYW5ub3RNb3ZlLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICA/IGBEaXNhYmxpbmcgbW92ZS1zdWJwYWdlcy5cXG5UaGUgZm9sbG93aW5nICR7c3VicGFnZXNDYW5ub3RNb3ZlLmxlbmd0aH0gKG9mICR7Y3VycmVudFN1YnBhZ2VzLmxlbmd0aH0pIHRvdGFsIHN1YnBhZ2VzIG9mICR7YmFzZVBhZ2V9IENBTk5PVCBiZSBtb3ZlZDpcXG5cXG4ke3N1YnBhZ2VzQ2Fubm90TW92ZS5qb2luKFxuICAgICAgICAgICAgICAgICAgICAgICcsICcsXG4gICAgICAgICAgICAgICAgICApfWBcbiAgICAgICAgICAgICAgICA6IGAke2N1cnJlbnRTdWJwYWdlcy5sZW5ndGh9IHRvdGFsIHN1YnBhZ2VzIG9mICR7YmFzZVBhZ2V9LiR7cmVkaXJlY3RDb3VudCAhPT0gMCA/IGAgJHtyZWRpcmVjdENvdW50fSByZWRpcmVjdHMsIGxhYmVsZWQgKFIpYCA6ICcnfTogJHtjdXJyZW50U3VicGFnZXMuam9pbignLCAnKX1gLFxuICAgICAgICApO1xuXG4gICAgcmVzdWx0LmFsbG93TW92ZVN1YnBhZ2VzID0gc3VicGFnZXNDYW5ub3RNb3ZlLmxlbmd0aCA9PT0gMDtcbiAgICByZXN1bHQubm9OZWVkID0gY3VycmVudFN1YnBhZ2VzLmxlbmd0aCA9PT0gMDtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFN3YXBzIHRoZSB0d28gcGFnZXMgKGdpdmVuIGFsbCBwcmVyZXF1aXNpdGUgY2hlY2tzKVxuICogT3B0aW9uYWxseSBtb3ZlcyB0YWxrIHBhZ2VzIGFuZCBzdWJwYWdlc1xuICovXG5mdW5jdGlvbiBzd2FwUGFnZXModGl0bGVPbmUsIHRpdGxlVHdvLCBzdW1tYXJ5LCBtb3ZlVGFsaywgbW92ZVN1YnBhZ2VzKSB7XG4gICAgY29uc3QgaW50ZXJtZWRpYXRlVGl0bGUgPSBgRHJhZnQ6TW92ZS8ke3RpdGxlT25lfWA7XG5cbiAgICBjb25zdCBtb3ZlcyA9IFtcbiAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uOiAnbW92ZScsXG4gICAgICAgICAgICBmcm9tOiB0aXRsZVR3byxcbiAgICAgICAgICAgIHRvOiBpbnRlcm1lZGlhdGVUaXRsZSxcbiAgICAgICAgICAgIHJlYXNvbjogJ1tbV1A6Uk9VTkRST0JJTnxSb3VuZC1yb2JpbiBwYWdlIG1vdmVdXSBzdGVwIDEgKHdpdGggW1tVc2VyOkVlaml0NDMvc2NyaXB0cy9wYWdlc3dhcHxwYWdlc3dhcCAyXV0pJyxcbiAgICAgICAgICAgIHdhdGNobGlzdDogJ3Vud2F0Y2gnLFxuICAgICAgICAgICAgbm9yZWRpcmVjdDogMSxcbiAgICAgICAgfSxcbiAgICAgICAgeyBhY3Rpb246ICdtb3ZlJywgZnJvbTogdGl0bGVPbmUsIHRvOiB0aXRsZVR3bywgcmVhc29uOiBzdW1tYXJ5LCB3YXRjaGxpc3Q6ICd1bndhdGNoJywgbm9yZWRpcmVjdDogMSB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBhY3Rpb246ICdtb3ZlJyxcbiAgICAgICAgICAgIGZyb206IGludGVybWVkaWF0ZVRpdGxlLFxuICAgICAgICAgICAgdG86IHRpdGxlT25lLFxuICAgICAgICAgICAgcmVhc29uOiAnW1tXUDpST1VORFJPQklOfFJvdW5kLXJvYmluIHBhZ2UgbW92ZV1dIHN0ZXAgMyAod2l0aCBbW1VzZXI6RWVqaXQ0My9zY3JpcHRzL3BhZ2Vzd2FwfHBhZ2Vzd2FwIDJdXSknLFxuICAgICAgICAgICAgd2F0Y2hsaXN0OiAndW53YXRjaCcsXG4gICAgICAgICAgICBub3JlZGlyZWN0OiAxLFxuICAgICAgICB9LFxuICAgIF07XG5cbiAgICBmb3IgKGNvbnN0IG1vdmUgb2YgbW92ZXMpIHtcbiAgICAgICAgaWYgKG1vdmVUYWxrKSBtb3ZlLm1vdmV0YWxrID0gMTtcbiAgICAgICAgaWYgKG1vdmVTdWJwYWdlcykgbW92ZS5tb3Zlc3VicGFnZXMgPSAxO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHsgc3VjY2VzczogdHJ1ZSB9O1xuICAgICAgICBsZXQgaSA9IDA7XG5cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtanNkb2NcbiAgICAgICAgZnVuY3Rpb24gZG9Nb3ZlKCkge1xuICAgICAgICAgICAgaWYgKGkgPj0gbW92ZXMubGVuZ3RoKSByZXR1cm4gcmVzb2x2ZShyZXN1bHQpO1xuXG4gICAgICAgICAgICBuZXcgbXcuQXBpKClcbiAgICAgICAgICAgICAgICAucG9zdFdpdGhUb2tlbignY3NyZicsIG1vdmVzW2ldKVxuICAgICAgICAgICAgICAgIC5kb25lKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICBkb01vdmUoKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5mYWlsKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnN1Y2Nlc3MgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0Lm1lc3NhZ2UgPSBgRmFpbGVkIG9uIG1vdmUgJHtpICsgMX0gKCR7bW92ZXNbaV0uZnJvbX0gXHUyMTkyICR7bW92ZXNbaV0udG99KWA7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChyZXN1bHQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgZG9Nb3ZlKCk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBHaXZlbiB0d28gdGl0bGVzLCBub3JtYWxpemVzLCBkb2VzIHByZXJlcXVpc2l0ZSBjaGVja3MgZm9yIHRhbGsvc3VicGFnZXMsXG4gKiBwcm9tcHRzIHVzZXIgZm9yIGNvbmZpZyBiZWZvcmUgc3dhcHBpbmcgdGhlIHRpdGxlc1xuICovXG5hc3luYyBmdW5jdGlvbiByb3VuZFJvYmluKHVzZXJQZXJtaXNzaW9ucywgY3VycmVudFRpdGxlLCBkZXN0aW5hdGlvblRpdGxlLCBzdW1tYXJ5LCBtb3ZlVGFsaywgbW92ZVN1YnBhZ2VzKSB7XG4gICAgLy8gR2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCBhbGwgbmFtZXNwYWNlc1xuICAgIGNvbnN0IG5hbWVzcGFjZXNJbmZvcm1hdGlvbiA9IChcbiAgICAgICAgYXdhaXQgbmV3IG13LkFwaSgpLmdldCh7XG4gICAgICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgICAgICBtZXRhOiAnc2l0ZWluZm8nLFxuICAgICAgICAgICAgc2lwcm9wOiAnbmFtZXNwYWNlcycsXG4gICAgICAgIH0pXG4gICAgKS5xdWVyeS5uYW1lc3BhY2VzO1xuXG4gICAgLy8gU3BlY2lmaWMgaW5mb3JtYXRpb24gYWJvdXQgY3VycmVudCBhbmQgZGVzdGluYXRpb24gcGFnZXNcbiAgICBjb25zdCBwYWdlc0RhdGEgPSAoXG4gICAgICAgIGF3YWl0IG5ldyBtdy5BcGkoKS5nZXQoe1xuICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgcHJvcDogJ2luZm8nLFxuICAgICAgICAgICAgaW5wcm9wOiAndGFsa2lkJyxcbiAgICAgICAgICAgIGludGVzdGFjdGlvbnM6ICdtb3ZlfGNyZWF0ZScsXG4gICAgICAgICAgICB0aXRsZXM6IGAke2N1cnJlbnRUaXRsZX18JHtkZXN0aW5hdGlvblRpdGxlfWAsXG4gICAgICAgIH0pXG4gICAgKS5xdWVyeTtcblxuICAgIC8vIE5vcm1hbGl6ZSB0aXRsZXMgaWYgbmVjZXNzYXJ5XG4gICAgZm9yIChjb25zdCBjaGFuZ2VzIGluIHBhZ2VzRGF0YS5ub3JtYWxpemVkKSB7XG4gICAgICAgIGlmIChjdXJyZW50VGl0bGUgPT09IHBhZ2VzRGF0YS5ub3JtYWxpemVkW2NoYW5nZXNdLmZyb20pIGN1cnJlbnRUaXRsZSA9IHBhZ2VzRGF0YS5ub3JtYWxpemVkW2NoYW5nZXNdLnRvO1xuICAgICAgICBpZiAoZGVzdGluYXRpb25UaXRsZSA9PT0gcGFnZXNEYXRhLm5vcm1hbGl6ZWRbY2hhbmdlc10uZnJvbSkgZGVzdGluYXRpb25UaXRsZSA9IHBhZ2VzRGF0YS5ub3JtYWxpemVkW2NoYW5nZXNdLnRvO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIG5hbWVzcGFjZXNcbiAgICBjb25zdCB2YWxpZGF0aW9uRGF0YSA9IHN3YXBWYWxpZGF0ZShjdXJyZW50VGl0bGUsIGRlc3RpbmF0aW9uVGl0bGUsIHBhZ2VzRGF0YS5wYWdlcywgbmFtZXNwYWNlc0luZm9ybWF0aW9uLCB1c2VyUGVybWlzc2lvbnMpO1xuICAgIGlmICghdmFsaWRhdGlvbkRhdGEudmFsaWQpIHRocm93IG5ldyBFcnJvcih2YWxpZGF0aW9uRGF0YS5lcnJvcik7XG5cbiAgICBpZiAodmFsaWRhdGlvbkRhdGEuYWRkTGluZUluZm8gIT09IHVuZGVmaW5lZCkgbXcubm90aWZ5KHZhbGlkYXRpb25EYXRhLmFkZExpbmVJbmZvKTtcblxuICAgIC8vIFN1YnBhZ2UgY2hlY2tzXG4gICAgY29uc3QgY3VycmVudFN1YnBhZ2VzID0gYXdhaXQgZ2V0U3VicGFnZXMobmFtZXNwYWNlc0luZm9ybWF0aW9uLCB2YWxpZGF0aW9uRGF0YS5jdXJyZW50VGl0bGUsIHZhbGlkYXRpb25EYXRhLmN1cnJlbnROYW1lc3BhY2UsIGZhbHNlKTtcbiAgICBpZiAoY3VycmVudFN1YnBhZ2VzLmVycm9yICE9PSB1bmRlZmluZWQpIHRocm93IG5ldyBFcnJvcihjdXJyZW50U3VicGFnZXMuZXJyb3IpO1xuICAgIGNvbnN0IGN1cnJlbnRTdWJwYWdlRmxhZ3MgPSBwcmludFN1YnBhZ2VJbmZvKHZhbGlkYXRpb25EYXRhLmN1cnJlbnRUaXRsZSwgY3VycmVudFN1YnBhZ2VzKTtcbiAgICBjb25zdCBkZXN0aW5hdGlvblN1YnBhZ2VzID0gYXdhaXQgZ2V0U3VicGFnZXMobmFtZXNwYWNlc0luZm9ybWF0aW9uLCB2YWxpZGF0aW9uRGF0YS5kZXN0aW5hdGlvblRpdGxlLCB2YWxpZGF0aW9uRGF0YS5kZXN0aW5hdGlvbk5hbWVzcGFjZSwgZmFsc2UpO1xuICAgIGlmIChkZXN0aW5hdGlvblN1YnBhZ2VzLmVycm9yICE9PSB1bmRlZmluZWQpIHRocm93IG5ldyBFcnJvcihkZXN0aW5hdGlvblN1YnBhZ2VzLmVycm9yKTtcbiAgICBjb25zdCBkZXN0aW5hdGlvblN1YnBhZ2VGbGFncyA9IHByaW50U3VicGFnZUluZm8odmFsaWRhdGlvbkRhdGEuZGVzdGluYXRpb25UaXRsZSwgZGVzdGluYXRpb25TdWJwYWdlcyk7XG5cbiAgICBjb25zdCB0YWxrVmFsaWRhdGlvbkRhdGEgPSBhd2FpdCB0YWxrVmFsaWRhdGUodmFsaWRhdGlvbkRhdGEuY2hlY2tUYWxrLCB2YWxpZGF0aW9uRGF0YS5jdXJyZW50VGFsa05hbWUsIHZhbGlkYXRpb25EYXRhLmRlc3RpbmF0aW9uVGFsa05hbWUpO1xuXG4gICAgLy8gVE9ETzogY2hlY2sgZW1wdHkgc3VicGFnZSBkZXN0aW5hdGlvbnMgb24gYm90aCBzaWRlcyAoc3ViaiwgdGFsaykgZm9yIGNyZWF0ZSBwcm90ZWN0aW9uXG4gICAgY29uc3QgY3VycmVudFRhbGtTdWJwYWdlcyA9IGF3YWl0IGdldFN1YnBhZ2VzKG5hbWVzcGFjZXNJbmZvcm1hdGlvbiwgdmFsaWRhdGlvbkRhdGEuY3VycmVudFRpdGxlLCB2YWxpZGF0aW9uRGF0YS5jdXJyZW50TmFtZXNwYWNlLCB0cnVlKTtcbiAgICBpZiAoY3VycmVudFRhbGtTdWJwYWdlcy5lcnJvciAhPT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3IoY3VycmVudFRhbGtTdWJwYWdlcy5lcnJvcik7XG4gICAgY29uc3QgY3VycmVudFRhbGtTdWJwYWdlRmxhZ3MgPSBwcmludFN1YnBhZ2VJbmZvKHZhbGlkYXRpb25EYXRhLmN1cnJlbnRUYWxrTmFtZSwgY3VycmVudFRhbGtTdWJwYWdlcyk7XG4gICAgY29uc3QgZGVzdGluYXRpb25UYWxrU3VicGFnZXMgPSBhd2FpdCBnZXRTdWJwYWdlcyhuYW1lc3BhY2VzSW5mb3JtYXRpb24sIHZhbGlkYXRpb25EYXRhLmRlc3RpbmF0aW9uVGl0bGUsIHZhbGlkYXRpb25EYXRhLmRlc3RpbmF0aW9uTmFtZXNwYWNlLCB0cnVlKTtcbiAgICBpZiAoZGVzdGluYXRpb25UYWxrU3VicGFnZXMuZXJyb3IgIT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IEVycm9yKGRlc3RpbmF0aW9uVGFsa1N1YnBhZ2VzLmVycm9yKTtcbiAgICBjb25zdCBkZXN0aW5hdGlvblRhbGtTdWJwYWdlRmxhZ3MgPSBwcmludFN1YnBhZ2VJbmZvKHZhbGlkYXRpb25EYXRhLmRlc3RpbmF0aW9uVGFsa05hbWUsIGRlc3RpbmF0aW9uVGFsa1N1YnBhZ2VzKTtcblxuICAgIGNvbnN0IG5vU3VicGFnZXMgPSBjdXJyZW50U3VicGFnZUZsYWdzLm5vTmVlZCAmJiBkZXN0aW5hdGlvblN1YnBhZ2VGbGFncy5ub05lZWQgJiYgY3VycmVudFRhbGtTdWJwYWdlRmxhZ3Mubm9OZWVkICYmIGRlc3RpbmF0aW9uVGFsa1N1YnBhZ2VGbGFncy5ub05lZWQ7XG4gICAgLy8gSWYgb25lIG5hbWVzcGFjZSBkaXNhYmxlcyBzdWJwYWdlcywgb3RoZXIgZW5hYmxlcyBzdWJwYWdlcyAoYW5kIGhhcyBzdWJwYWdlcyksIGNvbnNpZGVyIGFib3J0LiBBc3N1bWUgdGFsayBwYWdlcyBhbHdheXMgc2FmZSAoVE9ETyBmaXgpXG4gICAgY29uc3Qgc3VicGFnZUNvbGxpc2lvbiA9ICh2YWxpZGF0aW9uRGF0YS5jdXJyZW50TmFtZXNwYWNlQWxsb3dTdWJwYWdlcyAmJiAhZGVzdGluYXRpb25TdWJwYWdlRmxhZ3Mubm9OZWVkKSB8fCAodmFsaWRhdGlvbkRhdGEuZGVzdGluYXRpb25OYW1lc3BhY2VBbGxvd1N1YnBhZ2VzICYmICFjdXJyZW50U3VicGFnZUZsYWdzLm5vTmVlZCk7XG5cbiAgICBpZiAobW92ZVRhbGsgJiYgdmFsaWRhdGlvbkRhdGEuY2hlY2tUYWxrICYmICF0YWxrVmFsaWRhdGlvbkRhdGEuYWxsb3dNb3ZlVGFsaykge1xuICAgICAgICBtb3ZlVGFsayA9IGZhbHNlO1xuICAgICAgICBtdy5ub3RpZnkoXG4gICAgICAgICAgICBgRGlzYWxsb3dpbmcgbW92aW5nIHRhbGsuICR7XG4gICAgICAgICAgICAgICAgIXRhbGtWYWxpZGF0aW9uRGF0YS5jdXJyZW50VGFsa0NhbkNyZWF0ZVxuICAgICAgICAgICAgICAgICAgICA/IGAke3ZhbGlkYXRpb25EYXRhLmN1cnJlbnRUYWxrTmFtZX0gaXMgY3JlYXRlLXByb3RlY3RlZGBcbiAgICAgICAgICAgICAgICAgICAgOiAhdGFsa1ZhbGlkYXRpb25EYXRhLmRlc3RpbmF0aW9uVGFsa0NhbkNyZWF0ZVxuICAgICAgICAgICAgICAgICAgICAgID8gYCR7dmFsaWRhdGlvbkRhdGEuZGVzdGluYXRpb25UYWxrTmFtZX0gaXMgY3JlYXRlLXByb3RlY3RlZGBcbiAgICAgICAgICAgICAgICAgICAgICA6ICdUYWxrIHBhZ2UgaXMgaW1tb3ZhYmxlJ1xuICAgICAgICAgICAgfWAsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgbGV0IGZpbmFsTW92ZVN1YnBhZ2VzID0gZmFsc2U7XG4gICAgLy8gVE9ETyBmdXR1cmU6IGN1cnJUU3BGbGFncy5hbGxvd01vdmVTdWJwYWdlcyAmJiBkZXN0VFNwRmxhZ3MuYWxsb3dNb3ZlU3VicGFnZXMgbmVlZHMgdG8gYmUgc2VwYXJhdGUgY2hlY2suIElmIHRhbGsgc3VicGFnZXMgaW1tb3ZhYmxlLCBzaG91bGQgbm90IGFmZmVjdCBzdWJqc3BhY2VcbiAgICBpZiAoXG4gICAgICAgICFzdWJwYWdlQ29sbGlzaW9uICYmXG4gICAgICAgICFub1N1YnBhZ2VzICYmXG4gICAgICAgIHZhbGlkYXRpb25EYXRhLmFsbG93TW92ZVN1YnBhZ2VzICYmXG4gICAgICAgIGN1cnJlbnRTdWJwYWdlRmxhZ3MuYWxsb3dNb3ZlU3VicGFnZXMgJiZcbiAgICAgICAgZGVzdGluYXRpb25TdWJwYWdlRmxhZ3MuYWxsb3dNb3ZlU3VicGFnZXMgJiZcbiAgICAgICAgY3VycmVudFRhbGtTdWJwYWdlRmxhZ3MuYWxsb3dNb3ZlU3VicGFnZXMgJiZcbiAgICAgICAgZGVzdGluYXRpb25UYWxrU3VicGFnZUZsYWdzLmFsbG93TW92ZVN1YnBhZ2VzXG4gICAgKVxuICAgICAgICBmaW5hbE1vdmVTdWJwYWdlcyA9IG1vdmVTdWJwYWdlcztcbiAgICBlbHNlIGlmIChzdWJwYWdlQ29sbGlzaW9uKSB7XG4gICAgICAgIGZpbmFsTW92ZVN1YnBhZ2VzID0gZmFsc2U7XG4gICAgICAgIG13Lm5vdGlmeSgnT25lIG5hbWVzcGFjZSBkb2VzIG5vdCBoYXZlIHN1YnBhZ2VzIGVuYWJsZWQuIERpc2FsbG93aW5nIG1vdmUgc3VicGFnZXMuJyk7XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coYFtQYWdlc3dhcF0gU3dhcHBpbmcgXCIke2N1cnJlbnRUaXRsZX1cIiB3aXRoIFwiJHtkZXN0aW5hdGlvblRpdGxlfVwiIHdpdGggc3VtbWFyeSBcIiR7c3VtbWFyeX1cIiBhbmQgbW92ZVRhbGsgJHttb3ZlVGFsa30gYW5kIG1vdmVTdWJwYWdlcyAke2ZpbmFsTW92ZVN1YnBhZ2VzfWApO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3dhcFBhZ2VzKGN1cnJlbnRUaXRsZSwgZGVzdGluYXRpb25UaXRsZSwgc3VtbWFyeSwgbW92ZVRhbGssIGZpbmFsTW92ZVN1YnBhZ2VzKTtcblxuICAgIGNvbnNvbGUubG9nKHJlc3VsdCk7XG5cbiAgICBpZiAoIXJlc3VsdC5zdWNjZXNzKSB0aHJvdyBuZXcgRXJyb3IocmVzdWx0LmVycm9yKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7OzthQUFBLEdBQUcsT0FBTyxNQUFNLENBQUMsaUJBQWtCLGVBQWdCLGtCQUFtQixrQkFBbUIsbUJB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QUNBLEVBQU8sUUFBUyxNQUFNLElBQUksTUFBTUEsRUFBTyxLQUFLLENBQ3JEIiwKICAibmFtZXMiOiBbIm5hbWVzcGFjZSIsICJjdXJyZW50VGl0bGUiLCAidXNlclBlcm1pc3Npb25zIiwgImV2ZW50IiwgIlN3YXBEaWFsb2ciLCAidmFsdWUiLCAiaXNWYWxpZCIsICJhY3Rpb24iLCAiZGVzdGluYXRpb24iLCAic3VtbWFyeSIsICJtb3ZlVGFsayIsICJtb3ZlU3VicGFnZXMiLCAiZXJyb3IiLCAiZGlhbG9nIiwgIndpbmRvd01hbmFnZXIiLCAiZGF0YSIsICJyaWdodHNMaXN0IiwgIm5hbWVzcGFjZURhdGEiLCAidGl0bGUiLCAidGl0bGVOYW1lc3BhY2UiLCAicmVzdWx0IiwgInByZWZpeExlbmd0aCIsICJzdGFydFRpdGxlIiwgImVuZFRpdGxlIiwgInBhZ2VzRGF0YSIsICJuYW1lc3BhY2VzRGF0YSIsICJjb3VudCIsICJwYWdlSWQiLCAicGFnZURhdGEiLCAiY3VycmVudFRhbGtEYXRhIiwgImRlc3RpbmF0aW9uRGF0YSIsICJjaGVja1RhbGsiLCAiZmlyc3RUYWxrIiwgInNlY29uZFRhbGsiLCAidGFsa1RpdGxlQXJyIiwgInRhbGtEYXRhIiwgImlzVGFsayIsICJ0aXRsZVBhZ2VEYXRhIiwgInN1YnBhZ2VzIiwgInN1YnBhZ2VJZHMiLCAiaWQiLCAic3VicGFnZURhdGFPbmUiLCAic3VicGFnZURhdGFUd28iLCAiYmFzZVBhZ2UiLCAiY3VycmVudFN1YnBhZ2UiLCAiY3VycmVudFN1YnBhZ2VzIiwgInN1YnBhZ2VzQ2Fubm90TW92ZSIsICJyZWRpcmVjdENvdW50IiwgInRpdGxlT25lIiwgInRpdGxlVHdvIiwgImludGVybWVkaWF0ZVRpdGxlIiwgIm1vdmVzIiwgIm1vdmUiLCAicmVzb2x2ZSIsICJyZWplY3QiLCAiaSIsICJkb01vdmUiLCAiZGVzdGluYXRpb25UaXRsZSIsICJuYW1lc3BhY2VzSW5mb3JtYXRpb24iLCAiY2hhbmdlcyIsICJ2YWxpZGF0aW9uRGF0YSIsICJjdXJyZW50U3VicGFnZUZsYWdzIiwgImRlc3RpbmF0aW9uU3VicGFnZXMiLCAiZGVzdGluYXRpb25TdWJwYWdlRmxhZ3MiLCAidGFsa1ZhbGlkYXRpb25EYXRhIiwgImN1cnJlbnRUYWxrU3VicGFnZXMiLCAiY3VycmVudFRhbGtTdWJwYWdlRmxhZ3MiLCAiZGVzdGluYXRpb25UYWxrU3VicGFnZXMiLCAiZGVzdGluYXRpb25UYWxrU3VicGFnZUZsYWdzIiwgIm5vU3VicGFnZXMiLCAic3VicGFnZUNvbGxpc2lvbiIsICJmaW5hbE1vdmVTdWJwYWdlcyJdCn0K