!function(){"use strict";function e(e){var t=[],a=[];this.getId=function(){return e.sliderid},this.getCbHandle=function(){return e.cbhandle},this.getView=function(n){return n||(n=0),e.value[n]===t[n]?a[n]:(t[n]=e.value[n],e.formatter?a[n]=e.formatter(e.value[n],e.ctrlhandle):a[n]=e.value[n],a[n])},this.updateClass=function(t,a){e.updateClass(t,a)},this.forceRefresh=function(t){e.forceRefresh(t)},this.getValue=function(t){return t||(t=0),e.value[t]},this.getRelative=function(t){return t||(t=0),e.relative[t]},this.setValue=function(t,a){a||(a=0),e.setValue(t,a)},this.setDisable=function(t){e.setDisable(t)}}var t=angular.module("RangeSlider",[]);t.directive("rangeSlider",["$log","$document","$timeout",function(t,a,n){function i(t,i,s,l){t.initWidget=function(e){e.byStep&&(t.byStep=parseInt(e.byStep)),e.notMore&&(t.notMore=parseInt(e.notMore)),e.notLess&&(t.notLess=parseInt(e.notLess)),e.id&&(t.sliderid=e.id),void 0!==e.value&&(t.value=e.value,t.forceRefresh(50))},t.forceRefresh=function(e){var a=t.value;t.value=[void 0,void 0],n(function(){t.setValue(a[0],0),t.dual&&t.setValue(a[1],1)},e)},t.updateClass=function(e,t){t?i.addClass(e):i.removeClass(e)},t.setDisable=function(e){e?(i.addClass("disable"),t.handles[0].css("visibility","hidden"),t.dual&&t.handles[1].css("visibility","hidden")):(i.removeClass("disable"),t.handles[0].css("visibility","visible"),t.dual&&t.handles[1].css("visibility","visible"))},t.normalize=function(e){var a,n=t.notMore-t.notLess,i=e*n;if(t.byStep>0){var s=(i-i%t.byStep)/t.byStep,l=i%t.byStep,o=l>=.5*t.byStep?t.byStep:0;return a=s*t.byStep+o+t.notLess}if(t.byStep<0){var r=Math.pow(10,-1*t.byStep);return a=t.notLess+parseInt(i*r)/r}return i},t.getValue=function(e,a){t.vertical?t.relative[a]=(e-t.bounds.handles[a].getBoundingClientRect().height)/(t.bounds.bar.getBoundingClientRect().height-t.bounds.handles[a].getBoundingClientRect().height):t.relative[a]=e/(t.bounds.bar.getBoundingClientRect().width-t.bounds.handles[a].getBoundingClientRect().width);var n=t.normalize(t.relative[a]);n!==t.value[a]&&(nt.stopValue&&(n=t.stopValue),t.formatter?t.viewValue=t.formatter(n,t.ctrlhandle):t.viewValue=n,t.displays[a]&&t.displays[a].html(t.viewValue),t.value[a]=n,l&&l.$setViewValue(t.viewValue),t.$apply(),n>t.startValue&&nt.value[0]&&(t.dual?t.setValue(e,1):t.setValue(e,0)),t.vertical?(a=t.bounds.bar.getBoundingClientRect().height*(e-t.notLess)/(t.notMore-t.notLess),t.start.css("height",a+"px")):(a=t.bounds.bar.getBoundingClientRect().width*(e-t.notLess)/(t.notMore-t.notLess),t.start.css("width",a+"px")),t.startValue=e},t.setStop=function(e){var a;et.notMore&&(e=t.notMore),e0&&t.$apply(t.setValue(t.value[t.actif]+t.byStep,t.actif)),t.byStep<0&&t.$apply(t.setValue(t.value[t.actif]+1/Math.pow(10,-1*t.byStep),t.actif)),t.callback&&t.callback(t.value[t.actif],t.ctrlhandle);break;case 37:case 40:t.byStep>0&&t.$apply(t.setValue(t.value[t.actif]-t.byStep,t.actif)),t.byStep<0&&t.$apply(t.setValue(t.value[t.actif]-1/Math.pow(10,-1*t.byStep),t.actif)),t.callback&&t.callback(t.value[t.actif],t.ctrlhandle);break;case 27:t.handles[t.actif][0].blur()}},t.moveHandle=function(e,a,n){var i;t.vertical?(i=t.bounds.bar.getBoundingClientRect().bottom-n,i>t.bounds.bar.getBoundingClientRect().height&&(i=t.bounds.bar.getBoundingClientRect().height),ii&&(i=0),a+t.bounds.handles[e].getBoundingClientRect().width>t.bounds.bar.getBoundingClientRect().right&&(i=t.bounds.bar.getBoundingClientRect().width-t.bounds.handles[e].getBoundingClientRect().width)),t.getValue(i,e),t.dual&&t.value[0]>t.value[1]&&(0===e?t.setValue(t.value[0],1):t.setValue(t.value[1],0))},t.focusCB=function(e){e?a.on("keydown",t.keydown):a.unbind("keydown",t.keydown)},t.touchBarCB=function(e){var a,n=0,i=e.changedTouches,s=t.value[n];if(e.preventDefault(),t.dual){a=t.vertical?(i[0].pageY-t.bounds.bar.getBoundingClientRect().bottom)/t.bounds.bar.getBoundingClientRect().height:(i[0].pageX-t.bounds.bar.getBoundingClientRect().left)/t.bounds.bar.getBoundingClientRect().width;var l=Math.abs(a-t.relative[0]),o=Math.abs(a-t.relative[1]);l>o&&(n=1)}t.moveHandle(n,i[0].pageX,i[0].pageY),t.callback&&s!==t.value[n]&&t.callback(t.value[n],t.ctrlhandle)},t.touchHandleCB=function(e,n){function s(e){e.preventDefault();for(var a=e.changedTouches,i=0;it.stopAt,t.stopAt&&t.setStop(t.stopAt)}),t.initialSettings(t.initial)},t.init(),t.$watch("inithook",function(){t.inithook&&t.inithook(t.ctrlhandle)}),t.$watch("initvalues",function(){t.initvalues&&t.initWidget(t.initvalues)}),t.$watch("ngModel",function(e){t.setValue(e,0)})}var s='
';return{restrict:"E",scope:{startAt:"=",stopAt:"=",callback:"=",formatter:"=",inithook:"=",cbhandle:"=",initvalues:"=",ngModel:"="},require:"?ngModel",template:s,replace:!0,link:i}}])}(),function(){"use strict";var e='
afb://{{hostname}}:{{httpdport}}
';angular.module("TokenRefresh",["AppConfig","ModalNotification"]).directive("tokenRefresh",["$log","$window","$timeout","$location","Notification","AppConfig","AppCall",function(t,a,n,i,s,l,o){function r(e,r,u){e.logged=void 0,a.onbeforeunload=function(){o.get("token","reset",{},function(){t.log("OPA exit")})},e.online=function(){r.addClass("online"),r.removeClass("offline"),e.logged=!0},e.offline=function(){r.addClass("offline"),r.removeClass("online"),e.logged=!1},e.onerror=function(){e.logged!==!1&&(s.warning({message:"AppFramework Binder Lost",delay:5e3}),e.offline()),e.status=0},e.onsuccess=function(t){t.request.token&&(l.session.token=t.request.token),t.request.uuid&&(l.session.uuid=t.request.uuid),t.request.timeout&&(l.session.timeout=t.request.timeout),e.logged!==!0&&(s.success({message:"AppFramework Binder Back to Live",delay:3e3}),e.online(),e.callback&&e.callback(t)),e.status=1},e.getping=function(){o.get("token","ping",{},function(t){200===t.status?e.onsuccess(t.data):e.onerror(),n(e.getping,1e3*l.session.pingrate)})},e.refresh=function(){o.get("token","refresh",{},function(t){200===t.status?e.onsuccess(t.data):e.onerror(),n(e.refresh,250*l.session.timeout)})},e.tkcreate=function(){o.get("token","create",{token:l.session.initial},function(t){200===t.status?e.onsuccess(t.data):e.onerror()})},e.icon=u.icon||"fi-lightbulb",e.hostname=i.host(),e.httpdport=i.port(),e.autolog=JSON.parse(u.autolog||!1),e.autolog&&e.tkcreate(),n(e.getping,1e3*l.session.pingrate),n(e.refresh,250*l.session.timeout)}return{template:e,scope:{callback:"="},restrict:"E",link:r}}])}(),function(){"use strict";var e='
{{tip}}
';angular.module("ModalNotification",[]).directive("tipModal",["$timeout",function(t){function a(e,a,n){function i(){function a(){e.show&&e.modal.css({opacity:1,visibility:"visible"})}e.show=!0,e.timeout=t(a,e.delay)}function s(){e.show=!1,e.modal.css({opacity:0,visibility:"hidden"})}e.parent=a.parent(),e.modal=a.find("div"),e.icon=n.icon||"fi-lightbulb",e.parent.addClass("as-modal-tip"),e.parent.bind("click",s),e.parent.bind("focus",i),e.parent.bind("mouseover",i),e.parent.bind("mouseleave",s),e.parent.bind("blur",s),e.delay=n.delay||1e3}return{restrict:"E",template:e,link:a,scope:{tip:"="}}}])}(),function(){"use strict";var e='{{label}}';angular.module("LinkButton",[]).directive("linkButton",["$location",function(t){function a(e,a,n){e.clicked=function(){n.query?t.path(n.href).search(n.query):t.path(n.href)},e.icon=n.icon||"fi-link",e.label=n.label||"Jump",e.href=n.href||"/home",a.addClass(e.label.toLowerCase())}return{restrict:"E",template:e,link:a,scope:{}}}])}(),function(){"use strict";function e(e,t,a){var n=new XMLHttpRequest,i=new FormData;n.upload.onprogress=function(t){var a=Math.round(t.lengthComputable?100*t.loaded/t.total:0);e.slider&&e.slider.setValue(a)},n.onload=function(){e.divElem.addClass("success"),e.divElem.removeClass("error");var t={status:n.status,headers:n.getAllResponseHeaders()};e.callback(t)},n.onerror=function(){e.divElem.addClass("error"),e.divElem.removeClass("success")},n.onabort=function(){e.divElem.addClass("error"),e.divElem.removeClass("success");var t={status:n.status,headers:n.getAllResponseHeaders()};e.callback(t)},this.postfile=function(e){n.open("POST",e,!0),n.send(i)};for(var s=0;s1024*e.maxsize)setTimeout(a,100);else{var l=new FileReader;l.readAsArrayBuffer(this.file),l.onload=a,i.append(e.name,this.file,this.file.name)}}var t='
{{label}}
',a='Upload Application {{appname}} ?
',n='Invalid Application {{appname}} ?
';angular.module("UploadFiles",["AppConfig","ModalNotification","RangeSlider"]).directive("uploadAppli",["AppConfig","JQemu","Notification","ModalFactory","$timeout",function(i,s,l,o,r){function u(t,s,l){if(t.inputElem=s.find("input"),t.divElem=s.find("div"),t.imgClicked=function(){t.inputElem[0].click()},t.SliderInitCB=function(e){t.slider=e},t.UpLoadFile=function(s){var u,c,d,p=function(){u.postfile(l.posturl+"?token="+i.session.token),t.modal.deactivate(),r(function(){t.modal.destroy()},1e3)},f=function(){t.modal.deactivate(),r(function(){t.modal.destroy()},1e3)},g=function(e){if(e){var i=new JSZip(e.target.result),s=i.file("icon_128.png");s?(c=window.URL.createObjectURL(new Blob([s.asArrayBuffer()],{type:"image"})),d=a):(c=t.isnotvalid,d=n)}else u.file.size>1024*t.maxsize&&(c=t.istoobig,d=n),isNaN(u.file.size)&&(c=t.isnotvalid,d=n);var l={animationIn:"slideInFromTop",contentScope:{success:p,abandon:f,icon:c,appname:u.basename},template:d};t.modal=new o(l),t.modal.activate()};u=new e(t,s,g)},t.name=l.name||"appli",t.category=l.category||"appli",t.mimetype=l.accept||".wgt",t.maxsize=l.maxsize||1e5,t.regexp=new RegExp(l.accept+".*","i"),t.icon=l.icon||"fi-upload",t.label=l.label||"Upload",l.thumbnail?t.isnotvalid=i.paths[t.category]+l.isnotvalid:t.isnotvalid=i.paths[t.category]+"w3c-widget.png",l.istoobig?t.istoobig=i.paths[t.category]+l.istoobig:t.istoobig=i.paths[t.category]+"istoobig.png",t.noslider=l.noslider||!1,!l.posturl)throw new TypeError("file-upload %s posturl=/api/xxxx/xxxx required",t.attrs)}return{restrict:"E",template:t,link:u,scope:{callback:"="}}}])}(),function(){"use strict";var e='{{errmsg}}',t=/^(([^<>()[\]\.,;:\s@\"]+(\.[^<>()[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i;angular.module("InputText",["JQueryEmu"]).directive("inputText",["JQemu",function(a){function n(e,n,i){e.error=!1,e.valid=!1,e.status="untouch",e.input=n.find("input"),e.required=0,"required"in i&&(e.required=1,n.addClass("required")),e.selected=function(){e.error=!1,e.errmsg=!1,e.status="touch"},e.validate=function(){e.parent.removeClass("ng-pristine"),e.value?(e.error=!1,e.value=e.value.trim(),"nospace"in i&&(e.value=e.value.replace(/\s/g,"")),"lowercase"in i&&(e.value=e.value.toLowerCase()),"minlen"in i&&e.value.length0&&e.l4acounter.validated--),e.callback(i.name,null,e.done)):(e.required&&!e.valid&&e.l4acounter.validated++,e.status="valid",e.valid=!0,e.callback(i.name,e.value,e.done))},e.done=function(t){for(var a in t)e[a]=t[a]},e.label=i.label,e.name=i.name,e.placeholder=i.placeholder,e.type=i.type||"text",e.tip=i.tip,e.parent=a.parent(n,"FORM"),"email"in i&&(i.lowercase=!0,i.nospace=!0,i.minlen=6),e.required&&(e.l4acounter=e.parent.data("l4acounter"),e.l4acounter?e.l4acounter.required++:(e.l4acounter={required:1,validated:0},e.parent.data("l4acounter",e.l4acounter))),e.$watch("value",function(){e.value&&e.validate()})}return{restrict:"E",template:e,link:n,scope:{callback:"=",value:"="}}}])}(),function(){"use strict";var e=' ';angular.module("InputPassword",[]).directive("inputPassword",function(){function t(e,t,a){e.valid1=function(t,a){e.firstpwd=a},e.valid2=function(t,n,i){e.firstpwd!==n?i({valid:!1,status:"invalid",errmsg:"both password should match"}):e.callback(a.name,n)},e.done=function(t){for(var a in t)e[a]=t[a]},e.name=a.name,e.label1=a.label||"Password",e.label2=a.label||"Password Verification",e.place1=a.placeholder1||"User Password",e.tip1=a.tip||"Choose a Password",e.place2=a.placeholder1||"Password Verification",e.tip2=a.tip||"Confirme your Password",e.minlen=a.minlen||10,"required"in a&&(e.required="required")}return{restrict:"E",template:e,link:t,scope:{callback:"="}}})}(),function(){"use strict";var e='
{{label}}
';angular.module("SubmitButton",[]).directive("submitButton",function(){function t(e,t,a){e.icon=a.icon||"fi-foot",e.label=a.label||"Next",t.addClass(e.label.toLowerCase())}return{restrict:"E",template:e,link:t,scope:{clicked:"="}}})}(),function(){"use strict";var e='
{{label}}
',t='×Application {{label}}',a='×Application {{label}}
  • Name : {{detail.name}}
  • Description {{detail.description}}
  • Author : {{detail.author}}
';angular.module("AppliButton",[]).directive("appliButton",["AppConfig","AppCall","ModalFactory","Notification","$timeout","$window","$location","urlquery",function(n,i,s,l,o,r,u,c){function d(e,d,p){e.runstatus="stop",e.runmode=c.runmode||"auto",e.clicked=function(){var n=function(t,a){l.error({message:"Fail /api/afm-main"+t+"="+e.label+" RunID="+e.appID,delay:5e3}),d.addClass("fail"),d.removeClass("success"),e.callback(e.appID,t,a)},c=function(t,a){d.removeClass("fail"),e.runID=a.data.response.runid,e.callback(e.appID,t,a)},p=function(){e.modApp.deactivate(),o(function(){e.modApp.destroy()},1e3)},f=function(){e.modInfo.deactivate(),o(function(){e.modInfo.destroy()},1e3)},g=function(t){switch(t){case"start":if("stop"!==e.runstatus)return;i.get("afm-main","start",{id:e.appID,mode:e.runmode},function(a){return 200!==a.status||"afb-reply"!==a.data.jtype?void n("start",a):(e.runstatus="start",c(t,a),void(a.data.response.uri&&(e.winapp=r.open(a.data.response.uri.replace("%h",u.host())))))});break;case"stop":if("start"!==e.runstatus)return;i.get("afm-main","terminate",{runid:e.runID},function(a){return 200!==a.status||"afb-reply"!==a.data.jtype?void n("stop",a):(e.runstatus="stop",e.winapp&&(e.winapp.close(),e.winapp=!1),void c(t,a))});break;case"info":i.get("afm-main","detail",{id:e.appID},function(t){if(200!==t.status||"afb-reply"!==t.data.jtype)return void n("detail",t);var i={animationIn:"slideInFromTop",contentScope:{close:f,icon:e.icon,label:e.appID,detail:t.data.response},template:a};e.modInfo=new s(i),e.modInfo.activate()});break;case"uninstall":if("stop"!==e.runstatus)return;i.get("afm-main","uninstall",{id:e.appID},function(e){return 200!==e.status||"afb-reply"!==e.data.jtype?void n("uninstall",e):void c(t,e)})}p()},m={animationIn:"slideInFromTop",contentScope:{action:g,runstatus:e.runstatus,close:p,icon:e.icon,label:e.label},template:t};e.modApp=new s(m),e.modApp.activate()},p.handle&&e.store[p.handle].name?(e.icon=n.paths.icons+p.handle,e.label=e.store[p.handle].name,e.appID=p.handle):(e.icon=n.paths.icons+"w3c-ico.png",e.label=p.handle),d.addClass(e.label.toLowerCase())}return{restrict:"E",template:e,link:d,scope:{callback:"=",store:"="}}}])}(),function(){"use strict";angular.module("DashboardModule",["SubmitButton","TokenRefresh","AppliButton"]).controller("DashboardController",["AppCall","Notification",function(e,t){var a=this;a.uuid="none",a.token="none",a.session="none",a.status="err-no",a.appliIDs=[],a.appliStore={},a.AppliCB=function(e,t,n){a.request=t,a.errcode=n.status,n.data&&(a.response=n.data),"uninstall"===t&&a.GetRunnables()},a.GetRunnables=function(){e.get("afm-main","runnables",{},function(e){if(a.request="/api/afm-main/runnable",a.response=e.data,a.errcode=e.status,200===e.status){if("afb-reply"!=e.data.jtype)return void t.error({message:"Invalid Respond to /opa/afm-main/runnable response.data="+e.data,delay:5e3});for(var n=[],i=e.data.response.runnables,s=0;s\n \n \n\n')}])}(),function(){angular.module("AFBclient").run(["$templateCache",function(e){e.put("pages/Dashboard/Dashboard.html",'

Application Framework Manager Simple Client

req= {{ctrl.request}} res= {{ctrl.response}} status= {{ctrl.errcode}}
')}])}(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndpZGdldHMvUmFuZ2VTbGlkZXJzL1JhbmdlU2xpZGVyTW9kLmpzIiwid2lkZ2V0cy9Ob3RpZmljYXRpb25zL1Rva2VuUmVmcmVzaFN2Yy5qcyIsIndpZGdldHMvTm90aWZpY2F0aW9ucy9Nb2RhbE5vdGlmaWNhdGlvbi5qcyIsIndpZGdldHMvTmF2aWdhdGlvbi9MaW5rQnV0dG9uLmpzIiwid2lkZ2V0cy9Gb3JtSW5wdXQvVXBsb2FkQXBwbGkuanMiLCJ3aWRnZXRzL0Zvcm1JbnB1dC9JbnB1dFRleHQuanMiLCJ3aWRnZXRzL0Zvcm1JbnB1dC9JbnB1dFBhc3N3b3JkLmpzIiwid2lkZ2V0cy9BY3Rpb25CdXR0b25zL1N1Ym1pdEJ1dHRvbi5qcyIsIndpZGdldHMvQWN0aW9uQnV0dG9ucy9BcHBsaUJ1dHRvbi5qcyIsInBhZ2VzL0Rhc2hib2FyZC9EYXNoYm9hcmRNb2R1bGUuanMiLCJzZXJ2aWNlcy9KUXVlcnlFbXUuanMiLCJldGMvcm91dGVzLmpzIiwiZXRjL0FwcENvbmZpZy5qcyIsImFwcC5qcyIsInBhZ2VzL0Rhc2hib2FyZC9EYXNoYm9hcmQuanMiXSwibmFtZXMiOlsiUmFuZ2VTbGlkZXJIYW5kbGUiLCJzY29wZSIsImludGVybmFscyIsImV4dGVybmFscyIsInRoaXMiLCJnZXRJZCIsInNsaWRlcmlkIiwiZ2V0Q2JIYW5kbGUiLCJjYmhhbmRsZSIsImdldFZpZXciLCJoYW5kbGUiLCJ2YWx1ZSIsImZvcm1hdHRlciIsImN0cmxoYW5kbGUiLCJ1cGRhdGVDbGFzcyIsImNsYXNzZSIsInN0YXR1cyIsImZvcmNlUmVmcmVzaCIsInRpbWVyIiwiZ2V0VmFsdWUiLCJnZXRSZWxhdGl2ZSIsInJlbGF0aXZlIiwic2V0VmFsdWUiLCJzZXREaXNhYmxlIiwiZmxhZyIsIlJhbmdlU2xpZGVyIiwiYW5ndWxhciIsIm1vZHVsZSIsImRpcmVjdGl2ZSIsIiRsb2ciLCIkZG9jdW1lbnQiLCIkdGltZW91dCIsImxpbmsiLCJlbGVtZW50IiwiYXR0cnMiLCJtb2RlbCIsImluaXRXaWRnZXQiLCJpbml0dmFsdWVzIiwiYnlTdGVwIiwicGFyc2VJbnQiLCJub3RNb3JlIiwibm90TGVzcyIsImlkIiwidW5kZWZpbmVkIiwiZHVhbCIsImFkZENsYXNzIiwicmVtb3ZlQ2xhc3MiLCJkaXNhYmxlZCIsImhhbmRsZXMiLCJjc3MiLCJub3JtYWxpemUiLCJyZXN1bHQiLCJyYW5nZSIsInBvaW50IiwibW9kIiwicmVtIiwicm91bmQiLCJwb3dlciIsIk1hdGgiLCJwb3ciLCJvZmZzZXQiLCJ2ZXJ0aWNhbCIsImJvdW5kcyIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsImhlaWdodCIsImJhciIsIndpZHRoIiwibmV3dmFsdWUiLCJzdGFydFZhbHVlIiwic3RvcFZhbHVlIiwidmlld1ZhbHVlIiwiZGlzcGxheXMiLCJodG1sIiwiJHNldFZpZXdWYWx1ZSIsIiRhcHBseSIsInRyYW5zbGF0ZSIsInNldFN0YXJ0Iiwic3RhcnQiLCJzZXRTdG9wIiwic3RvcCIsInJpZ2h0Iiwidm9mZnNldCIsIi13ZWJraXQtdHJhbnNmb3JtIiwiLW1vei10cmFuc2Zvcm0iLCItbXMtdHJhbnNmb3JtIiwiLW8tdHJhbnNmb3JtIiwidHJhbnNmb3JtIiwic2xpZGVyIiwiYm90dG9tIiwibGVmdCIsImtleWRvd24iLCJlIiwia2V5Q29kZSIsImFjdGlmIiwiY2FsbGJhY2siLCJibHVyIiwibW92ZUhhbmRsZSIsImNsaWVudFgiLCJjbGllbnRZIiwiZm9jdXNDQiIsImluc2lkZSIsIm9uIiwidW5iaW5kIiwidG91Y2hCYXJDQiIsImV2ZW50IiwidG91Y2hlcyIsImNoYW5nZWRUb3VjaGVzIiwib2xkdmFsdWUiLCJwcmV2ZW50RGVmYXVsdCIsInBhZ2VZIiwicGFnZVgiLCJkaXN0YW5jZTAiLCJhYnMiLCJkaXN0YW5jZTEiLCJ0b3VjaEhhbmRsZUNCIiwidG91Y2hldnQiLCJ0b3VjaG1vdmUiLCJpZHgiLCJsZW5ndGgiLCJ0b3VjaGVuZCIsImhhbmRsZUNCIiwiY2xpY2tldmVudCIsIm1vdXNlbW92ZSIsIm1vdXNldXAiLCJhdXRvbWF0aWMiLCJmb2N1cyIsImZpbmQiLCJzZWxlY3QiLCJlbGVtIiwiZG9tZWxlbSIsInF1ZXJ5U2VsZWN0b3IiLCJhbmdlbGVtIiwiaW5pdGlhbFNldHRpbmdzIiwiaW5pdGlhbCIsImRlY2ltYWxfcGxhY2VzX21hdGNoX3Jlc3VsdCIsInByZWNpc2lvbiIsIm1hdGNoIiwiZXZ0IiwiaW5pdCIsInJhbmRvbSIsIkluZmluaXR5IiwiZHVhbEhhbmRsZXMiLCJ0cmlnZ2VyX2lucHV0X2NoYW5nZSIsImRpc2FibGUiLCJkaXNwbGF5VGFyZ2V0IiwiZ2V0RWxlbWVudEJ5SWQiLCJzcGxpdCIsIm5nTW9kZWwiLCIkd2F0Y2giLCJzdGFydEF0Iiwic3RvcEF0IiwiaW5pdGhvb2siLCJuZXdWYWx1ZSIsInRlbXBsYXRlIiwicmVzdHJpY3QiLCJyZXF1aXJlIiwicmVwbGFjZSIsIiR3aW5kb3ciLCIkbG9jYXRpb24iLCJOb3RpZmljYXRpb24iLCJBcHBDb25maWciLCJBcHBDYWxsIiwibXltZXRob2RzIiwibG9nZ2VkIiwib25iZWZvcmV1bmxvYWQiLCJnZXQiLCJsb2ciLCJvbmxpbmUiLCJvZmZsaW5lIiwib25lcnJvciIsIndhcm5pbmciLCJtZXNzYWdlIiwiZGVsYXkiLCJvbnN1Y2Nlc3MiLCJqcmVzcCIsInJlcXVlc3QiLCJ0b2tlbiIsInNlc3Npb24iLCJ1dWlkIiwidGltZW91dCIsInN1Y2Nlc3MiLCJnZXRwaW5nIiwiZGF0YSIsInBpbmdyYXRlIiwicmVmcmVzaCIsInRrY3JlYXRlIiwiaWNvbiIsImhvc3RuYW1lIiwiaG9zdCIsImh0dHBkcG9ydCIsInBvcnQiLCJhdXRvbG9nIiwiSlNPTiIsInBhcnNlIiwidG1wbCIsImRpc3BsYXkiLCJhY3Rpb24iLCJzaG93IiwibW9kYWwiLCJvcGFjaXR5IiwidmlzaWJpbGl0eSIsImNsb3NlIiwicGFyZW50IiwiYmluZCIsInRpcCIsImNsaWNrZWQiLCJxdWVyeSIsInBhdGgiLCJocmVmIiwic2VhcmNoIiwibGFiZWwiLCJ0b0xvd2VyQ2FzZSIsIkxvYWRGaWxlU3ZjIiwiZmlsZXMiLCJmaWxlQ0IiLCJ4bWxSZXEiLCJYTUxIdHRwUmVxdWVzdCIsInhmb3JtIiwiRm9ybURhdGEiLCJ1cGxvYWQiLCJvbnByb2dyZXNzIiwicHJvZ3Jlc3MiLCJsZW5ndGhDb21wdXRhYmxlIiwibG9hZGVkIiwidG90YWwiLCJvbmxvYWQiLCJkaXZFbGVtIiwicmVzcG9uc2UiLCJoZWFkZXJzIiwiZ2V0QWxsUmVzcG9uc2VIZWFkZXJzIiwib25hYm9ydCIsInBvc3RmaWxlIiwicG9zdHVybCIsIm9wZW4iLCJzZW5kIiwiaSIsImZpbGUiLCJiYXNlbmFtZSIsIm5hbWUiLCJyZXZlcnNlIiwiaXNOYU4iLCJzaXplIiwibWF4c2l6ZSIsInNldFRpbWVvdXQiLCJyZWFkZXIiLCJGaWxlUmVhZGVyIiwicmVhZEFzQXJyYXlCdWZmZXIiLCJhcHBlbmQiLCJ0bXBsQXBwbGkiLCJ0bXBsTW9kYWwiLCJ0bXBsRXJyb3IiLCJKUWVtdSIsIk1vZGFsRmFjdG9yeSIsImlucHV0RWxlbSIsImltZ0NsaWNrZWQiLCJjbGljayIsIlNsaWRlckluaXRDQiIsIlVwTG9hZEZpbGUiLCJhcHBpY29uIiwiZGVhY3RpdmF0ZSIsImRlc3Ryb3kiLCJhYmFuZG9uIiwicmVhZGVyQ0IiLCJ6aXBhcHAiLCJKU1ppcCIsInRhcmdldCIsInRodW1ibmFpbCIsIndpbmRvdyIsIlVSTCIsImNyZWF0ZU9iamVjdFVSTCIsIkJsb2IiLCJhc0FycmF5QnVmZmVyIiwidHlwZSIsImlzbm90dmFsaWQiLCJpc3Rvb2JpZyIsImNvbmZpZyIsImFuaW1hdGlvbkluIiwiY29udGVudFNjb3BlIiwiYXBwbmFtZSIsImFjdGl2YXRlIiwiY2F0ZWdvcnkiLCJtaW1ldHlwZSIsImFjY2VwdCIsInJlZ2V4cCIsIlJlZ0V4cCIsInBhdGhzIiwibm9zbGlkZXIiLCJUeXBlRXJyb3IiLCJlbWFpbHBhdGVybiIsImVycm9yIiwidmFsaWQiLCJpbnB1dCIsInJlcXVpcmVkIiwic2VsZWN0ZWQiLCJlcnJtc2ciLCJ2YWxpZGF0ZSIsInRyaW0iLCJtaW5sZW4iLCJ0ZXN0IiwibDRhY291bnRlciIsInZhbGlkYXRlZCIsImRvbmUiLCJwbGFjZWhvbGRlciIsImxvd2VyY2FzZSIsIm5vc3BhY2UiLCJ2YWxpZDEiLCJmaXJzdHB3ZCIsInZhbGlkMiIsImxhYmVsMSIsImxhYmVsMiIsInBsYWNlMSIsInBsYWNlaG9sZGVyMSIsInRpcDEiLCJwbGFjZTIiLCJ0aXAyIiwidG1wbERldGFpbCIsInVybHF1ZXJ5IiwicnVuc3RhdHVzIiwicnVubW9kZSIsIm5vdGlmeUVycm9yIiwiYXBwSUQiLCJub3RpZnlTdWNjZXNzIiwicnVuSUQiLCJydW5pZCIsImNsb3NlTW9kQXBwIiwibW9kQXBwIiwiY2xvc2VNb2RJbmZvIiwibW9kSW5mbyIsImFjdGlvbk1vZGFsIiwibW9kZSIsImp0eXBlIiwidXJpIiwid2luYXBwIiwiZGV0YWlsIiwic3RvcmUiLCJpY29ucyIsImNvbnRyb2xsZXIiLCJhcHBsaUlEcyIsImFwcGxpU3RvcmUiLCJBcHBsaUNCIiwiYXBwbGlJRCIsImVycmNvZGUiLCJHZXRSdW5uYWJsZXMiLCJydW5uYWJsZXMiLCJGaWxlVXBsb2FkZWQiLCJBdXRvU3RhcnQiLCJmYWN0b3J5IiwiRmluZEluUGFyZW50Iiwic2VsZWN0b3IiLCJ0b1VwcGVyQ2FzZSIsInRhZ05hbWUiLCJGaW5kQnlUYWciLCJ0YWciLCJjaGlsZHJlbiIsIm5leHQiLCJGaW5kQnlDbGFzcyIsImhhc0NsYXNzIiwibXlNZXRob2RzIiwiZm91bmRhdGlvblJvdXRlcyIsInVybCIsIm15Q29uZmlnIiwiaW1hZ2UiLCJhdmF0YXIiLCJhdWRpbyIsImFwcGxpIiwiJGh0dHAiLCJteUNhbGxzIiwicGx1Z2luIiwicGFyYW1zIiwidGhlbiIsIlBhcnNlUXVlcnlTdHJpbmciLCJxZCIsImxvY2F0aW9uIiwic3Vic3RyIiwiZm9yRWFjaCIsIml0ZW0iLCJrIiwidiIsImRlY29kZVVSSUNvbXBvbmVudCIsInB1c2giLCIkdXJsUHJvdmlkZXIiLCIkbG9jYXRpb25Qcm92aWRlciIsIm90aGVyd2lzZSIsImh0bWw1TW9kZSIsImhhc2hQcmVmaXgiLCJydW4iLCJGYXN0Q2xpY2siLCJhdHRhY2giLCJkb2N1bWVudCIsImJvZHkiLCIkaW5qZWN0IiwiJHRlbXBsYXRlQ2FjaGUiLCJwdXQiXSwibWFwcGluZ3MiOiJDQWtEQSxXQUNBLFlBSUEsU0FBQUEsR0FBQUMsR0FDQSxHQUFBQyxNQUNBQyxJQUVBQyxNQUFBQyxNQUFBLFdBQ0EsTUFBQUosR0FBQUssVUFHQUYsS0FBQUcsWUFBQSxXQUNBLE1BQUFOLEdBQUFPLFVBR0FKLEtBQUFLLFFBQUEsU0FBQUMsR0FJQSxNQUhBQSxLQUFBQSxFQUFBLEdBR0FULEVBQUFVLE1BQUFELEtBQUFSLEVBQUFRLEdBQUFQLEVBQUFPLElBR0FSLEVBQUFRLEdBQUFULEVBQUFVLE1BQUFELEdBQ0FULEVBQUFXLFVBQUFULEVBQUFPLEdBQUFULEVBQUFXLFVBQUFYLEVBQUFVLE1BQUFELEdBQUFULEVBQUFZLFlBQ0FWLEVBQUFPLEdBQUFULEVBQUFVLE1BQUFELEdBRUFQLEVBQUFPLEtBR0FOLEtBQUFVLFlBQUEsU0FBQUMsRUFBQUMsR0FDQWYsRUFBQWEsWUFBQUMsRUFBQUMsSUFHQVosS0FBQWEsYUFBQSxTQUFBQyxHQUNBakIsRUFBQWdCLGFBQUFDLElBR0FkLEtBQUFlLFNBQUEsU0FBQVQsR0FFQSxNQURBQSxLQUFBQSxFQUFBLEdBQ0FULEVBQUFVLE1BQUFELElBR0FOLEtBQUFnQixZQUFBLFNBQUFWLEdBRUEsTUFEQUEsS0FBQUEsRUFBQSxHQUNBVCxFQUFBb0IsU0FBQVgsSUFHQU4sS0FBQWtCLFNBQUEsU0FBQVgsRUFBQUQsR0FDQUEsSUFBQUEsRUFBQSxHQUNBVCxFQUFBcUIsU0FBQVgsRUFBQUQsSUFHQU4sS0FBQW1CLFdBQUEsU0FBQUMsR0FDQXZCLEVBQUFzQixXQUFBQyxJQXBEQSxHQUFBQyxHQUFBQyxRQUFBQyxPQUFBLGlCQXdEQUYsR0FBQUcsVUFBQSxlQUFBLE9BQUEsWUFBQSxXQUFBLFNBQUFDLEVBQUFDLEVBQUFDLEdB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V0FBQTlXLFFBQUFDLE9BQUEsYUFBQXNXLEtBQUEsaUJBQUEsU0FBQU0sR0FBQUEsRUFBQUMsSUFBQSxpQ0FDQSIsImZpbGUiOiJBRkJjbGllbnQubWluLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyogXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUgXCJJb1QuYnpoXCJcbiAqIEF1dGhvciBcIkZ1bHVwIEFyIEZvbGxcIlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uXG4gKiBcbiAqIEJ1Z3M6IElucHV0IHdpdGggQ2FsbGJhY2sgU0hPVUxEIEJFIGdldCAncmVxdWlyZWQnIGNsYXNzXG4gKiBcbiAqIHJlZjogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvRXZlbnRzL21vdXNlb3ZlclxuICogXG4gKiB1c2FnZTogXG5Vc2FnZSAgPHJhbmdlLXNsaWRlcj5cbi0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgPHJhbmdlLXNsaWRlclxuICAgICAgaWQ9XCJteS1zbGlkZXItbmFtZVwiICAgICAgICAgICAgICAgICAgICAgLy8gb25seSB1c2UgYXMgYW4gYXJndW1lbnQgdG8gY2FsbGJhY2tcbiAgICAgIGNsYXNzPVwibXktY3VzdG9tLWNsYXNzXCIgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgY2xhc3MgaXMgaWJ6LXJhbmdlLXNsaWRlclxuICAgICAgcGxhY2Vob2xkZXI9XCJUcmFjayBEYXRlIFNlbGVjdGlvblwiICAgICAgLy8gcGxhY2UgaG9sZGVyIGZvciBkYXRlIHJlYWRvbmx5IGlucHV0IHpvbmVcblxuICAgICAgPCEtLSBGb3VuZGF0aW9uIGNsYXNzZXMgLS0+XG4gICAgICBjbGFzcz1cInJhZGl1c1wiICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBadXJiIGZvdW5kYXRpb24gZG9jIGZvciBmdXJ0aGVyIGluZm8uXG4gICAgICBjbGFzcz1cImliei1oYW5kbGUtZGlzcGxheVwiICAgICAgICAgICAgICAvLyBpbmNyZWFzZSBoYW5kbGUgd2lkdGggdG8gaG9sZCBzbGlkZXIgY3VycmVudCB2YWx1ZVxuXG4gICAgICA8IS0tIEFuZ3VsYXIgU2NvcGUgVmFyaWFibGVzIC0tPlxuICAgICAgY2FsbGJhY2s9XCJteUNhbGxCYWNrXCIgICAgICAgICAgICAgICAgICAgIC8vICRzY29wZS5teUNhbGxCYWNrKHNsaWRlcmhhbmRsZSkgaXMgY2FsbGVkIHdoZW4gZXZlciBzbGlkZXIgaGFuZGxlIGJsdXJcbiAgICAgIGZvcm1hdHRlcj1cIlNsaWRlckZvcm1hdENCXCIgICAgICAgICAgICAgICAvLyAkc2NvcGUubXlGb3JtYXR0ZXIodmFsdWUsIHNsaWRlcmlkKSB3aGVuIGV4aXN0IGlzIGNhbGwgd2hlbiBldmVyIHNsaWRlciBoYW5kbGUgbW92ZXMuIFNob3VsZCByZXR1cm4gZXh0ZXJuYWwgZm9ybSBvZiBzbGlkZXIgdmFsdWUuXG4gICAgICBuZy1tb2RlbD1cInh4eHh4eFwiICAgICAgICAgICAgICAgICAgICAgICAgLy8geHh4IE11c3QgYmUgZGVmaW5lZCwgc2NyaXB0IHdpbGwgc3RvcmUgYSBuZXcgUmFuZ2VyT2JqZWN0IHdpdGhpbiBwcm92aWRlZCBuZy1tb2RlbCB2YXJpYWJsZS5cbiAgICAgIHN0YXJ0LWF0PVwiU2NvcGVWYXJcIiAgICAgICAgICAgICAgICAgICAgICAvLyBEeW5hbWljIGxpbWl0YXRpb24gd2hlbiBzbGlkZXIgaXMgY29uc3RyYWlucyBieSBhbiBleHRlcm5hbCBjb21wb25hbnQgW2V4OiBjaGVjayBpbi9vdXRdXG4gICAgICBzdG9wLWF0PVwiU2NvcGVWYXJcIiAgICAgICAgICAgICAgICAgICAgICAgLy8gSWRlbSBidXQgZm9yIGVuZC5cblxuICAgICAgPCEtLSBBbmd1bGFyIERpcmVjdGl2ZSBBdHRyaWJ1dGVzIC0tPlxuICAgICAgbm90LWxlc3M9XCJpbnRlZ2VyXCIgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpeGVkIHN0YXJ0aW5nIHZhbHVlIGZvciBzbGlkZXIgW2RlZmF1bHQgMF1cbiAgICAgIG5vdC1tb3JlPVwiaW50ZWdlclwiICAgICAgICAgICAgICAgICAgICAgICAvLyBGaXhlZCBlbmQgdmFsdWUgZm9yIHNsaWRlcnMgW2RlZmF1bHQgMTAwXVxuICAgICAgYnktc3RlcD1cIistaW50ZWdlclwiICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGJ5LXN0ZXAgaXMgPjAgdGhlbiBzbGlkZXIgdXNlIGl0IGFzIHN0ZXAtdmFsdWUsIHdoZW4gbmVnYXRpdmUgdXNlIGl0IGZvciBkZWNpbWFsIHByZWNpc2lvblxuICAgICAgZGlzcGxheS10YXJnZXQ9XCJoYW5kbGVcIiAgICAgICAgICAgICAgICAgIC8vIGRpc3BsYXkgc2xpZGVyIGV4dGVybmFsIGZvcm1hdGVkIHZhbHVlIGluIHRoZSBoYW5kbGUgW3JlcXVpcmVyIGNhbHNzPVwiaWJ6LWhhbmRsZS1kaXNwbGF5XCJdXG4gICAgICBkdWFsLWhhbmRsZXM9J3RydWUnICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCBhIHNlY29uZCBoYW5kbGUgdG8gc2xpZGVyIGZvciBtaW4vbWF4IHJhbmdlXG4gICAgICBpbml0aWFsPSd2YWx1ZXxbc3RhcnQvc3RvcF0nICAgICAgICAgICAgIC8vIHNsaWRlciBpbml0aWFsIHZhbHVlIFtkdWFsLWhhbmRsZXNdIG1heSBoYXZlIGluaXRpYWwgdmFsdWVzXG4gICAvPjwvcmFuZ2Utc2xpZGVyPlxuICovXG5cbihmdW5jdGlvbiAoKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmFuZ2VTbGlkZXIgPSBhbmd1bGFyLm1vZHVsZSgnUmFuZ2VTbGlkZXInLFtdKTtcblxuZnVuY3Rpb24gUmFuZ2VTbGlkZXJIYW5kbGUgKHNjb3BlKSB7XG4gICAgdmFyIGludGVybmFscyA9IFtdO1xuICAgIHZhciBleHRlcm5hbHMgPSBbXTtcblxuICAgIHRoaXMuZ2V0SWQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHNjb3BlLnNsaWRlcmlkO1xuICAgIH07XG5cbiAgICB0aGlzLmdldENiSGFuZGxlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBzY29wZS5jYmhhbmRsZTtcbiAgICB9O1xuXG4gICAgdGhpcy5nZXRWaWV3PSBmdW5jdGlvbiAoaGFuZGxlKSB7XG4gICAgICAgIGlmICghaGFuZGxlKSBoYW5kbGUgPSAwO1xuXG4gICAgICAgIC8vIGlmIHZhbHVlIGRpZCBub3QgY2hhbmdlIHJldHVybiBjdXJyZW50IGV4dGVybmFsIHJlcHJlc2VudGF0aW9uXG4gICAgICAgIGlmIChzY29wZS52YWx1ZVtoYW5kbGVdID09PSBpbnRlcm5hbHNbaGFuZGxlXSkgcmV0dXJuIGV4dGVybmFsc1toYW5kbGVdO1xuXG4gICAgICAgIC8vIGJ1aWxkIGV4dGVybmFsIHJlcHJlc2VudGF0aW9uIGFuZCBzYXZlIGl0IGZvciBmdXJ0aGVyIHJlcXVlc3RzXG4gICAgICAgIGludGVybmFsc1toYW5kbGVdID0gc2NvcGUudmFsdWVbaGFuZGxlXTtcbiAgICAgICAgaWYgKHNjb3BlLmZvcm1hdHRlcikgZXh0ZXJuYWxzW2hhbmRsZV0gPSBzY29wZS5mb3JtYXR0ZXIoc2NvcGUudmFsdWVbaGFuZGxlXSwgc2NvcGUuY3RybGhhbmRsZSk7XG4gICAgICAgIGVsc2UgIGV4dGVybmFsc1toYW5kbGVdID0gc2NvcGUudmFsdWVbaGFuZGxlXTtcblxuICAgICAgICByZXR1cm4gZXh0ZXJuYWxzW2hhbmRsZV07XG4gICAgfTtcblxuICAgIHRoaXMudXBkYXRlQ2xhc3MgPSBmdW5jdGlvbiAoY2xhc3NlLCBzdGF0dXMpIHtcbiAgICAgICBzY29wZS51cGRhdGVDbGFzcyAoY2xhc3NlLCBzdGF0dXMpO1xuICAgIH07XG5cbiAgICB0aGlzLmZvcmNlUmVmcmVzaCA9IGZ1bmN0aW9uICh0aW1lcikge1xuICAgICAgIHNjb3BlLmZvcmNlUmVmcmVzaCh0aW1lcik7XG4gICAgfTtcblxuICAgIHRoaXMuZ2V0VmFsdWU9IGZ1bmN0aW9uIChoYW5kbGUpIHtcbiAgICAgICAgaWYgKCFoYW5kbGUpIGhhbmRsZSA9IDA7XG4gICAgICAgIHJldHVybiBzY29wZS52YWx1ZVtoYW5kbGVdO1xuICAgIH07XG5cbiAgICB0aGlzLmdldFJlbGF0aXZlPSBmdW5jdGlvbiAoaGFuZGxlKSB7XG4gICAgICAgIGlmICghaGFuZGxlKSBoYW5kbGUgPSAwO1xuICAgICAgICByZXR1cm4gc2NvcGUucmVsYXRpdmVbaGFuZGxlXTtcbiAgICB9O1xuXG4gICAgdGhpcy5zZXRWYWx1ZT0gZnVuY3Rpb24gKHZhbHVlLCBoYW5kbGUpIHtcbiAgICAgICAgaWYgKCFoYW5kbGUpIGhhbmRsZSA9IDA7XG4gICAgICAgIHNjb3BlLnNldFZhbHVlICh2YWx1ZSwgaGFuZGxlKTtcbiAgICB9O1xuXG4gICAgdGhpcy5zZXREaXNhYmxlPSBmdW5jdGlvbiAoZmxhZykge1xuICAgICAgICBzY29wZS5zZXREaXNhYmxlKGZsYWcpO1xuICAgIH07XG59XG5cblJhbmdlU2xpZGVyLmRpcmVjdGl2ZSgncmFuZ2VTbGlkZXInLCBbXCIkbG9nXCIsIFwiJGRvY3VtZW50XCIsIFwiJHRpbWVvdXRcIiwgZnVuY3Rpb24gKCRsb2csICRkb2N1bWVudCwgJHRpbWVvdXQpIHtcblxuICAgIHZhciB0ZW1wbGF0ZT0gJzxkaXYgY2xhc3M9XCJpYnotcmFuZ2Utc2xpZGVyIHJhbmdlLXNsaWRlclwiIHRpdGxlPVwie3t0aXRsZX19XCJkYXRhLXNsaWRlcj4nK1xuICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPVwicmFuZ2Utc2xpZGVyLWhhbmRsZSBoYW5kbGUtbWluXCIgbmctbW91c2Vkb3duPVwiaGFuZGxlQ0IoJGV2ZW50LDApXCIgbmctZm9jdXM9XCJmb2N1c0NCKHRydWUpXCIgbmctYmx1cj1cImZvY3VzQ0IoZmFsc2UpXCIgcm9sZT1cInNsaWRlclwiIHRhYmluZGV4PVwiMFwiPjwvc3Bhbj4nK1xuICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPVwiaGFuZGxlLW1heFwiIG5nLW1vdXNlZG93bj1cImhhbmRsZUNCKCRldmVudCwxKVwiIG5nLWZvY3VzPVwiZm9jdXNDQih0cnVlKVwiIG5nLWJsdXI9XCJmb2N1c0NCKGZhbHNlKVwiIHJvbGU9XCJzbGlkZXJcIiB0YWJpbmRleD1cIjBcIj48L3NwYW4+JytcbiAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cInJhbmdlLXNsaWRlci1hY3RpdmUtc2VnbWVudFwiPjwvc3Bhbj4nK1xuICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPVwiaWJ6LXJhbmdlLXNsaWRlci1zdGFydFwiID48L3NwYW4+ICcrXG4gICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9XCJpYnotcmFuZ2Utc2xpZGVyLXN0b3BcIj48L3NwYW4+ICcrXG4gICAgICAgICAgICAgICAgICAnPGlucHV0IGlkPXt7c2xpZGVyaWR9fSB0eXBlPVwiaGlkZGVuXCI+JytcbiAgICAgICAgICAgICAgICAgICc8L2Rpdj4nO1xuXG5cbiAgICBmdW5jdGlvbiBsaW5rIChzY29wZSwgZWxlbWVudCwgYXR0cnMsIG1vZGVsKSB7XG4gICAgICAgIC8vIGZ1bGwgaW5pdGlhbGlzYXRpb24gb2Ygc2xpZGVyIGZyb20gYSBzaW5nbGUgb2JqZWN0XG4gICAgICAgIHNjb3BlLmluaXRXaWRnZXQgPSBmdW5jdGlvbiAoaW5pdHZhbHVlcykge1xuXG4gICAgICAgICAgICBpZiAoaW5pdHZhbHVlcy5ieVN0ZXApICBzY29wZS5ieVN0ZXAgID0gcGFyc2VJbnQoaW5pdHZhbHVlcy5ieVN0ZXApO1xuICAgICAgICAgICAgaWYgKGluaXR2YWx1ZXMubm90TW9yZSkgc2NvcGUubm90TW9yZSA9IHBhcnNlSW50KGluaXR2YWx1ZXMubm90TW9yZSk7XG4gICAgICAgICAgICBpZiAoaW5pdHZhbHVlcy5ub3RMZXNzKSBzY29wZS5ub3RMZXNzID0gcGFyc2VJbnQoaW5pdHZhbHVlcy5ub3RMZXNzKTtcbiAgICAgICAgICAgIGlmIChpbml0dmFsdWVzLmlkKSAgICAgIHNjb3BlLnNsaWRlcmlkPSBpbml0dmFsdWVzLmlkO1xuXG4gICAgICAgICAgICAvLyBodWdlbHkgYnV0IGluIHNvbWUgY2FzZSBET00gaXMgbm90IGZpbmlzaCB3aGVuIHdlIHRyeSB0byBzZXQgdmFsdWVzICEhIVxuICAgICAgICAgICAgaWYgKGluaXR2YWx1ZXMudmFsdWUgIT09IHVuZGVmaW5lZCkgICB7XG4gICAgICAgICAgICAgICAgc2NvcGUudmFsdWUgPSBpbml0dmFsdWVzLnZhbHVlO1xuICAgICAgICAgICAgICAgIHNjb3BlLmZvcmNlUmVmcmVzaCAoNTApOyAvLyB3YWl0IDUwbXMgZm9yIERPTSB0byBiZSByZWFkeVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIHRoaXMgZnVuY3Rpb24gcmVjb21wdXRlIHNsaWRlIHBvc2l0aW9uaW5nXG4gICAgICAgIHNjb3BlLmZvcmNlUmVmcmVzaCA9IGZ1bmN0aW9uICh0aW1lcikge1xuICAgICAgICAgICB2YXIgdmFsdWUgPSBzY29wZS52YWx1ZTtcbiAgICAgICAgICAgc2NvcGUudmFsdWUgPSBbdW5kZWZpbmVkLHVuZGVmaW5lZF07XG4gICAgICAgICAgICR0aW1lb3V0IChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgIHNjb3BlLnNldFZhbHVlKHZhbHVlWzBdLDApO1xuICAgICAgICAgICAgICAgaWYgKHNjb3BlLmR1YWwpICBzY29wZS5zZXRWYWx1ZSh2YWx1ZVsxXSwxKTtcbiAgICAgICAgICAgfSwgdGltZXIpO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIGhhbmRsZXIgdG8gY2hhbmdlIGNsYXNzIGZyb20gc2xpZGVyIGhhbmRsZVxuICAgICAgICBzY29wZS51cGRhdGVDbGFzcyA9IGZ1bmN0aW9uIChjbGFzc2UsIHN0YXR1cykge1xuXG4gICAgICAgICAgICBpZiAoc3RhdHVzKSBlbGVtZW50LmFkZENsYXNzIChjbGFzc2UpO1xuICAgICAgICAgICAgZWxzZSAgZWxlbWVudC5yZW1vdmVDbGFzcyAoY2xhc3NlKTtcbiAgICAgICAgfTtcblxuICAgICAgICBzY29wZS5zZXREaXNhYmxlID0gZnVuY3Rpb24gKGRpc2FibGVkKSB7XG5cbiAgICAgICAgICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQuYWRkQ2xhc3MgKFwiZGlzYWJsZVwiKTtcbiAgICAgICAgICAgICAgICBzY29wZS5oYW5kbGVzWzBdLmNzcyAoJ3Zpc2liaWxpdHknLCdoaWRkZW4nKTtcbiAgICAgICAgICAgICAgICBpZiAoc2NvcGUuZHVhbCkge1xuICAgICAgICAgICAgICAgICAgICBzY29wZS5oYW5kbGVzWzFdLmNzcyAoJ3Zpc2liaWxpdHknLCdoaWRkZW4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQ2xhc3MgKFwiZGlzYWJsZVwiKTtcbiAgICAgICAgICAgICAgICBzY29wZS5oYW5kbGVzWzBdLmNzcyAoJ3Zpc2liaWxpdHknLCd2aXNpYmxlJyk7XG4gICAgICAgICAgICAgICAgaWYgKHNjb3BlLmR1YWwpIHNjb3BlLmhhbmRsZXNbMV0uY3NzICgndmlzaWJpbGl0eScsJ3Zpc2libGUnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9O1xuXG4gICAgICAgIHNjb3BlLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgdmFyIHJlc3VsdDtcbiAgICAgICAgICAgIHZhciByYW5nZSA9IHNjb3BlLm5vdE1vcmUgLSBzY29wZS5ub3RMZXNzO1xuICAgICAgICAgICAgdmFyIHBvaW50ID0gdmFsdWUgKiByYW5nZTtcblxuICAgICAgICAgICAgLy8gaWYgc3RlcCBpcyBwb3NpdGl2ZSBsZXQncyByb3VuZCBzdGVwIGJ5IHN0ZXBcbiAgICAgICAgICAgIGlmIChzY29wZS5ieVN0ZXAgPiAgMCkge1xuICAgICAgICAgICAgICAgIHZhciBtb2QgPSAocG9pbnQgLSAocG9pbnQgJSBzY29wZS5ieVN0ZXApKSAvIHNjb3BlLmJ5U3RlcDtcbiAgICAgICAgICAgICAgICB2YXIgcmVtID0gcG9pbnQgJSBzY29wZS5ieVN0ZXA7XG5cbiAgICAgICAgICAgICAgICB2YXIgcm91bmQgPSAocmVtID49IHNjb3BlLmJ5U3RlcCAqIDAuNSA/IHNjb3BlLmJ5U3RlcCA6IDApO1xuICAgICAgICAgICAgICAgIHJlc3VsdD0gKG1vZCAqIHNjb3BlLmJ5U3RlcCArIHJvdW5kKSArIHNjb3BlLm5vdExlc3M7XG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyAoXCJyYW5nZT0lZCB2YWx1ZT0lZCBwb2ludD0lZCBtb2Q9JWQgcmVtPSVkIHJvdW5kPSVkIHJlc3VsdD0lZFwiLCByYW5nZSwgdmFsdWUsIHBvaW50LCBtb2QsIHJlbSwgcm91bmQsIHJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpZiBzdGVwIGlzIG5lZ2F0aXZlIHJldHVybiByb3VuZCB0byBhc2tlZCBkZWNpbWFsXG4gICAgICAgICAgICBpZiAoc2NvcGUuYnlTdGVwIDwgIDApIHtcbiAgICAgICAgICAgICAgICB2YXIgcG93ZXIgID0gIE1hdGgucG93ICgxMCwoc2NvcGUuYnlTdGVwICogLTEpKTtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBzY29wZS5ub3RMZXNzICsgcGFyc2VJbnQgKHBvaW50ICogcG93ZXIpIC8gcG93ZXI7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChyZXN1bHQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpZiBzdGVwIGlzIG51bGwgcmV0dXJuIGZ1bGwgdmFsdWVcbiAgICAgICAgICAgIHJldHVybiBwb2ludDtcbiAgICAgICB9O1xuXG4gICAgICAgIC8vIHJldHVybiBjdXJyZW50IHZhbHVlXG4gICAgICAgIHNjb3BlLmdldFZhbHVlID0gZnVuY3Rpb24gKG9mZnNldCwgaGFuZGxlKSB7XG4gICAgICAgICAgICBpZiAoc2NvcGUudmVydGljYWwpIHtcbiAgICAgICAgICAgICAgICBzY29wZS5yZWxhdGl2ZVtoYW5kbGVdID0gKG9mZnNldCAtIHNjb3BlLmJvdW5kcy5oYW5kbGVzW2hhbmRsZV0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0KSAvIChzY29wZS5ib3VuZHMuYmFyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCAtIHNjb3BlLmJvdW5kcy5oYW5kbGVzW2hhbmRsZV0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc2NvcGUucmVsYXRpdmVbaGFuZGxlXSA9IG9mZnNldCAvICAoc2NvcGUuYm91bmRzLmJhci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCAtIHNjb3BlLmJvdW5kcy5oYW5kbGVzW2hhbmRsZV0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgbmV3dmFsdWUgPSBzY29wZS5ub3JtYWxpemUgKHNjb3BlLnJlbGF0aXZlW2hhbmRsZV0pO1xuXG5cbiAgICAgICAgICAgIC8vIGlmIGludGVybmFsIHZhbHVlIGNoYW5nZSB1cGRhdGUgb3IgbW9kZWxcbiAgICAgICAgICAgIGlmIChuZXd2YWx1ZSAhPT0gc2NvcGUudmFsdWVbaGFuZGxlXSkge1xuICAgICAgICAgICAgICAgIGlmIChuZXd2YWx1ZSA8IHNjb3BlLnN0YXJ0VmFsdWUpIG5ld3ZhbHVlPXNjb3BlLnN0YXJ0VmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKG5ld3ZhbHVlID4gc2NvcGUuc3RvcFZhbHVlKSAgbmV3dmFsdWU9c2NvcGUuc3RvcFZhbHVlO1xuXG5cbiAgICAgICAgICAgICAgICBpZiAoc2NvcGUuZm9ybWF0dGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLnZpZXdWYWx1ZSA9IHNjb3BlLmZvcm1hdHRlciAobmV3dmFsdWUsIHNjb3BlLmN0cmxoYW5kbGUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLnZpZXdWYWx1ZSA9IG5ld3ZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoc2NvcGUuZGlzcGxheXNbaGFuZGxlXSkge1xuICAgICAgICAgICAgICAgICAgICBzY29wZS5kaXNwbGF5c1toYW5kbGVdLmh0bWwgKHNjb3BlLnZpZXdWYWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gdXBkYXRlIGV4dGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbFxuICAgICAgICAgICAgICAgIHNjb3BlLnZhbHVlW2hhbmRsZV0gPSBuZXd2YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAobW9kZWwpIG1vZGVsLiRzZXRWaWV3VmFsdWUgKHNjb3BlLnZpZXdWYWx1ZSk7XG4gICAgICAgICAgICAgICAgc2NvcGUuJGFwcGx5KCk7XG4gICAgICAgICAgICAgICAgaWYgKG5ld3ZhbHVlID4gc2NvcGUuc3RhcnRWYWx1ZSAmJiBuZXd2YWx1ZSA8IHNjb3BlLnN0b3BWYWx1ZSkgc2NvcGUudHJhbnNsYXRlKG9mZnNldCwgaGFuZGxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuXG4gICAgICAgIHNjb3BlLnNldFN0YXJ0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICB2YXIgb2Zmc2V0O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAodmFsdWUgPiBzY29wZS52YWx1ZVswXSkge1xuICAgICAgICAgICAgICAgIGlmICghc2NvcGUuZHVhbCkgc2NvcGUuc2V0VmFsdWUgKHZhbHVlLDApO1xuICAgICAgICAgICAgICAgIGVsc2Ugc2NvcGUuc2V0VmFsdWUgKHZhbHVlLDEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc2NvcGUudmVydGljYWwpIHtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSBzY29wZS5ib3VuZHMuYmFyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCAqICh2YWx1ZSAtIHNjb3BlLm5vdExlc3MpIC8gKHNjb3BlLm5vdE1vcmUgLSBzY29wZS5ub3RMZXNzKTtcbiAgICAgICAgICAgICAgICBzY29wZS5zdGFydC5jc3MoJ2hlaWdodCcsb2Zmc2V0ICsgJ3B4Jyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG9mZnNldCA9IHNjb3BlLmJvdW5kcy5iYXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggKiAodmFsdWUgLSBzY29wZS5ub3RMZXNzKSAvIChzY29wZS5ub3RNb3JlIC0gc2NvcGUubm90TGVzcyk7XG4gICAgICAgICAgICAgICAgc2NvcGUuc3RhcnQuY3NzKCd3aWR0aCcsb2Zmc2V0ICsgJ3B4Jyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNjb3BlLnN0YXJ0VmFsdWU9IHZhbHVlO1xuICAgICAgICB9O1xuXG4gICAgICAgIHNjb3BlLnNldFN0b3AgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHZhciBvZmZzZXQ7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICh2YWx1ZSA8IHNjb3BlLnZhbHVlWzBdKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFzY29wZS5kdWFsKSBzY29wZS5zZXRWYWx1ZSAodmFsdWUsMCk7XG4gICAgICAgICAgICAgICAgZWxzZSBzY29wZS5zZXRWYWx1ZSAodmFsdWUsMSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzY29wZS52ZXJ0aWNhbCkge1xuICAgICAgICAgICAgICAgIG9mZnNldCA9IHNjb3BlLmJvdW5kcy5iYXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0ICogKHZhbHVlIC0gc2NvcGUubm90TGVzcykgLyAoc2NvcGUubm90TW9yZSAtIHNjb3BlLm5vdExlc3MpO1xuICAgICAgICAgICAgICAgIHNjb3BlLnN0YXJ0LmNzcygnaGVpZ2h0JyxvZmZzZXQgKyAncHgnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gc2NvcGUuYm91bmRzLmJhci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCAqICh2YWx1ZSAtIHNjb3BlLm5vdExlc3MpIC8gKHNjb3BlLm5vdE1vcmUgLSBzY29wZS5ub3RMZXNzKTtcbiAgICAgICAgICAgICAgICBzY29wZS5zdG9wLmNzcyh7J3JpZ2h0JzogMCwgJ3dpZHRoJzogKHNjb3BlLmJvdW5kcy5iYXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggIC0gb2Zmc2V0KSArICdweCd9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2NvcGUuc3RvcFZhbHVlPSB2YWx1ZTtcbiAgICAgICAgfTtcblxuICAgICAgICBzY29wZS50cmFuc2xhdGUgPSBmdW5jdGlvbiAob2Zmc2V0LCBoYW5kbGUpIHtcbiAgICAgICAgICAgIHZhciBzdGFydDtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHNjb3BlLnZlcnRpY2FsKSB7XG4gICAgICAgICAgICAgICAgLy8gdGFrZSBoYW5kbGUgc2l6ZSBpbiBhY2NvdW50IHRvIGNvbXB1dGUgbWlkZGxlXG4gICAgICAgICAgICAgICAgdmFyIHZvZmZzZXQgPSBzY29wZS5ib3VuZHMuYmFyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCAtIG9mZnNldDtcblxuICAgICAgICAgICAgICAgIHNjb3BlLmhhbmRsZXNbaGFuZGxlXS5jc3Moe1xuICAgICAgICAgICAgICAgICAgICAnLXdlYmtpdC10cmFuc2Zvcm0nOiAndHJhbnNsYXRlWSgnICsgdm9mZnNldCArICdweCknLFxuICAgICAgICAgICAgICAgICAgICAnLW1vei10cmFuc2Zvcm0nOiAndHJhbnNsYXRlWSgnICsgdm9mZnNldCArICdweCknLFxuICAgICAgICAgICAgICAgICAgICAnLW1zLXRyYW5zZm9ybSc6ICd0cmFuc2xhdGVZKCcgKyB2b2Zmc2V0ICsgJ3B4KScsXG4gICAgICAgICAgICAgICAgICAgICctby10cmFuc2Zvcm0nOiAndHJhbnNsYXRlWSgnICsgdm9mZnNldCArICdweCknLFxuICAgICAgICAgICAgICAgICAgICAndHJhbnNmb3JtJzogJ3RyYW5zbGF0ZVkoJyArIHZvZmZzZXQgKyAncHgpJ1xuICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICBpZiAoIXNjb3BlLmR1YWwpIHNjb3BlLnNsaWRlci5jc3MoJ2hlaWdodCcsIG9mZnNldCArICdweCcpO1xuICAgICAgICAgICAgICAgZWxzZSBpZiAoc2NvcGUucmVsYXRpdmVbMV0gJiYgc2NvcGUucmVsYXRpdmVbMF0pIHtcbiAgICAgICAgICAgICAgICAgICB2YXIgaGVpZ2h0ID0gKHNjb3BlLnJlbGF0aXZlWzFdIC0gc2NvcGUucmVsYXRpdmVbMF0pICogIHNjb3BlLmJvdW5kcy5iYXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgIHN0YXJ0ICA9IChzY29wZS5yZWxhdGl2ZVswXSAqICBzY29wZS5ib3VuZHMuYmFyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCk7XG4gICAgICAgICAgICAgICAgICAgc2NvcGUuc2xpZGVyLmNzcyAoeydib3R0b20nOiBzdGFydCsncHgnLCdoZWlnaHQnOiBoZWlnaHQgKyAncHgnfSk7XG4gICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICAgICAgc2NvcGUuaGFuZGxlc1toYW5kbGVdLmNzcyh7XG4gICAgICAgICAgICAgICAgICAgICctd2Via2l0LXRyYW5zZm9ybSc6ICd0cmFuc2xhdGVYKCcgKyBvZmZzZXQgKyAncHgpJyxcbiAgICAgICAgICAgICAgICAgICAgJy1tb3otdHJhbnNmb3JtJzogJ3RyYW5zbGF0ZVgoJyArIG9mZnNldCArICdweCknLFxuICAgICAgICAgICAgICAgICAgICAnLW1zLXRyYW5zZm9ybSc6ICd0cmFuc2xhdGVYKCcgKyBvZmZzZXQgKyAncHgpJyxcbiAgICAgICAgICAgICAgICAgICAgJy1vLXRyYW5zZm9ybSc6ICd0cmFuc2xhdGVYKCcgKyBvZmZzZXQgKyAncHgpJyxcbiAgICAgICAgICAgICAgICAgICAgJ3RyYW5zZm9ybSc6ICd0cmFuc2xhdGVYKCcgKyBvZmZzZXQgKyAncHgpJ1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmICghc2NvcGUuZHVhbCkgc2NvcGUuc2xpZGVyLmNzcygnd2lkdGgnLG9mZnNldCArICdweCcpO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNjb3BlLnJlbGF0aXZlWzFdICYmIHNjb3BlLnJlbGF0aXZlWzBdKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB3aWR0aCA9IChzY29wZS5yZWxhdGl2ZVsxXSAtIHNjb3BlLnJlbGF0aXZlWzBdKSAqICBzY29wZS5ib3VuZHMuYmFyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICAgICAgICAgICAgICAgICAgICBzdGFydCA9IChzY29wZS5yZWxhdGl2ZVswXSAqICBzY29wZS5ib3VuZHMuYmFyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoKTtcbiAgICAgICAgICAgICAgICAgICAgc2NvcGUuc2xpZGVyLmNzcyAoeydsZWZ0Jzogc3RhcnQrJ3B4Jywnd2lkdGgnOiB3aWR0aCArICdweCd9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gcG9zaXRpb24gaGFuZGxlIG9uIHRoZSBiYXIgZGVwZW5kaW5nIGEgZ2l2ZW4gdmFsdWVcbiAgICAgICAgc2NvcGUuc2V0VmFsdWUgPSBmdW5jdGlvbiAodmFsdWUgLCBoYW5kbGUpIHtcbiAgICAgICAgICAgIHZhciBvZmZzZXQ7XG5cbiAgICAgICAgICAgIC8vIGlmIHZhbHVlIGRpZCBub3QgY2hhbmdlIGlnbm9yZVxuICAgICAgICAgICAgaWYgKHZhbHVlID09PSBzY29wZS52YWx1ZVtoYW5kbGVdKSByZXR1cm47XG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgICB2YWx1ZT0wO1xuICAgICAgICAgICAgaWYgKHZhbHVlID4gc2NvcGUubm90TW9yZSkgdmFsdWU9c2NvcGUubm90TW9yZTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA8IHNjb3BlLm5vdExlc3MpIHZhbHVlPXNjb3BlLm5vdExlc3M7XG5cbiAgICAgICAgICAgIGlmIChzY29wZS52ZXJ0aWNhbCkge1xuICAgICAgICAgICAgICAgIHNjb3BlLnJlbGF0aXZlW2hhbmRsZV0gPSAodmFsdWUgLSBzY29wZS5ub3RMZXNzKSAvIChzY29wZS5ub3RNb3JlIC0gc2NvcGUubm90TGVzcyk7XG4gICAgICAgICAgICAgICAgaWYgKGhhbmRsZSA9PT0gMCkgb2Zmc2V0ID0gKHNjb3BlLnJlbGF0aXZlW2hhbmRsZV0gKiBzY29wZS5ib3VuZHMuYmFyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCkgKyBzY29wZS5ib3VuZHMuaGFuZGxlc1toYW5kbGVdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodC8yO1xuICAgICAgICAgICAgICAgIGlmIChoYW5kbGUgPT09IDEpIG9mZnNldCA9IHNjb3BlLnJlbGF0aXZlW2hhbmRsZV0gKiBzY29wZS5ib3VuZHMuYmFyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzY29wZS5yZWxhdGl2ZVtoYW5kbGVdID0gKHZhbHVlIC0gc2NvcGUubm90TGVzcykgLyAoc2NvcGUubm90TW9yZSAtIHNjb3BlLm5vdExlc3MpO1xuICAgICAgICAgICAgICAgIG9mZnNldCA9IHNjb3BlLnJlbGF0aXZlW2hhbmRsZV0gKiAgKHNjb3BlLmJvdW5kcy5iYXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggLSBzY29wZS5ib3VuZHMuaGFuZGxlc1toYW5kbGVdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2NvcGUudHJhbnNsYXRlIChvZmZzZXQsaGFuZGxlKTtcbiAgICAgICAgICAgIHNjb3BlLnZhbHVlW2hhbmRsZV0gPSB2YWx1ZTtcblxuICAgICAgICAgICAgaWYgKHNjb3BlLmZvcm1hdHRlcikge1xuICAgICAgICAgICAgICAgIC8vIHdoZW4gY2FsbCB0aHJvdWdoIHNldFZhbHVlIHdlIGRvIG5vdCBwYXNzIGNiSGFuZGxlXG4gICAgICAgICAgICAgICAgc2NvcGUudmlld1ZhbHVlID0gc2NvcGUuZm9ybWF0dGVyICh2YWx1ZSwgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc2NvcGUudmlld1ZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChtb2RlbCkgbW9kZWwuJHNldFZpZXdWYWx1ZSggc2NvcGUudmlld1ZhbHVlKTtcblxuICAgICAgICAgICAgaWYgKHNjb3BlLmRpc3BsYXlzW2hhbmRsZV0pIHtcbiAgICAgICAgICAgICAgICBzY29wZS5kaXNwbGF5c1toYW5kbGVdLmh0bWwgKHNjb3BlLnZpZXdWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cblxuICAgICAgICAvLyBNaW5pbWFsIGtleXN0cm9rZSBoYW5kbGluZyB0byBjbG9zZSBwaWNrZXIgd2l0aCBFU0MgW3Njb3BlLmFjdGlmIGlzIGN1cnJlbnQgaGFuZGxlIGluZGV4XVxuICAgICAgICBzY29wZS5rZXlkb3duPSAgZnVuY3Rpb24oZSl7XG5cbiAgICAgICAgICAgIHN3aXRjaChlLmtleUNvZGUpe1xuICAgICAgICAgICAgICAgIGNhc2UgMzk6IC8vIFJpZ2h0XG4gICAgICAgICAgICAgICAgY2FzZSAzODogLy8gdXBcbiAgICAgICAgICAgICAgICAgICAgIGlmIChzY29wZS5ieVN0ZXAgPiAwKSBzY29wZS4kYXBwbHkoc2NvcGUuc2V0VmFsdWUgKChzY29wZS52YWx1ZVtzY29wZS5hY3RpZl0rc2NvcGUuYnlTdGVwKSwgc2NvcGUuYWN0aWYpKTtcbiAgICAgICAgICAgICAgICAgICAgIGlmIChzY29wZS5ieVN0ZXAgPCAwKSBzY29wZS4kYXBwbHkoc2NvcGUuc2V0VmFsdWUgKChzY29wZS52YWx1ZVtzY29wZS5hY3RpZl0rKDEgLyBNYXRoLnBvdygxMCwgc2NvcGUuYnlTdGVwKi0xKSkpLHNjb3BlLmFjdGlmKSk7XG4gICAgICAgICAgICAgICAgICAgICBpZiAoc2NvcGUuY2FsbGJhY2spICBzY29wZS5jYWxsYmFjayAoc2NvcGUudmFsdWVbc2NvcGUuYWN0aWZdLCBzY29wZS5jdHJsaGFuZGxlKTtcbiAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzc6IC8vIGxlZnRcbiAgICAgICAgICAgICAgICBjYXNlIDQwOiAvLyBkb3duXG4gICAgICAgICAgICAgICAgICAgIGlmIChzY29wZS5ieVN0ZXAgPiAwKSBzY29wZS4kYXBwbHkoc2NvcGUuc2V0VmFsdWUgKChzY29wZS52YWx1ZVtzY29wZS5hY3RpZl0gLSBzY29wZS5ieVN0ZXApLCBzY29wZS5hY3RpZikpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2NvcGUuYnlTdGVwIDwgMCkgc2NvcGUuJGFwcGx5KHNjb3BlLnNldFZhbHVlICgoc2NvcGUudmFsdWVbc2NvcGUuYWN0aWZdIC0gKDEgLyBNYXRoLnBvdygxMCwgc2NvcGUuYnlTdGVwKi0xKSkpLHNjb3BlLmFjdGlmKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzY29wZS5jYWxsYmFjaykgIHNjb3BlLmNhbGxiYWNrIChzY29wZS52YWx1ZVtzY29wZS5hY3RpZl0sIHNjb3BlLmN0cmxoYW5kbGUpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI3OiAvLyBlc2NcbiAgICAgICAgICAgICAgICAgICAgc2NvcGUuaGFuZGxlc1tzY29wZS5hY3RpZl1bMF0uYmx1cigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHNjb3BlLm1vdmVIYW5kbGUgPSBmdW5jdGlvbiAoaGFuZGxlLCBjbGllbnRYLCBjbGllbnRZKSB7XG4gICAgICAgICAgICB2YXIgb2Zmc2V0O1xuICAgICAgICAgICAgaWYgKHNjb3BlLnZlcnRpY2FsKSB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gc2NvcGUuYm91bmRzLmJhci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5ib3R0b20gLSBjbGllbnRZO1xuICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPiBzY29wZS5ib3VuZHMuYmFyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCkgb2Zmc2V0ID0gc2NvcGUuYm91bmRzLmJhci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgaWYgKG9mZnNldCA8IHNjb3BlLmJvdW5kcy5oYW5kbGVzW2hhbmRsZV0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0KSBvZmZzZXQgPSBzY29wZS5ib3VuZHMuaGFuZGxlc1toYW5kbGVdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gY2xpZW50WCAtIHNjb3BlLmJvdW5kcy5iYXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdDtcblxuICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPCAwKSBvZmZzZXQgPSAwO1xuICAgICAgICAgICAgICAgIGlmICgoY2xpZW50WCArIHNjb3BlLmJvdW5kcy5oYW5kbGVzW2hhbmRsZV0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGgpID4gc2NvcGUuYm91bmRzLmJhci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5yaWdodCkge1xuICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBzY29wZS5ib3VuZHMuYmFyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoIC0gc2NvcGUuYm91bmRzLmhhbmRsZXNbaGFuZGxlXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNjb3BlLmdldFZhbHVlICAob2Zmc2V0LCBoYW5kbGUpO1xuXG4gICAgICAgICAgICAvLyBwcmV2ZW50IGR1YWwgaGFuZGxlIHRvIGNyb3NzXG4gICAgICAgICAgICBpZiAoc2NvcGUuZHVhbCAmJiBzY29wZS52YWx1ZSBbMF0gPiBzY29wZS52YWx1ZVsxXSkge1xuICAgICAgICAgICAgICAgIGlmIChoYW5kbGUgPT09IDApIHNjb3BlLnNldFZhbHVlIChzY29wZS52YWx1ZVswXSAsIDEpO1xuICAgICAgICAgICAgICAgIGVsc2Ugc2NvcGUuc2V0VmFsdWUoc2NvcGUudmFsdWVbMV0sMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cblxuICAgICAgICBzY29wZS5mb2N1c0NCID0gZnVuY3Rpb24gKGluc2lkZSkge1xuICAgICAgICAgICAgaWYgKGluc2lkZSkge1xuICAgICAgICAgICAgICAgICRkb2N1bWVudC5vbigna2V5ZG93bicsc2NvcGUua2V5ZG93bik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICRkb2N1bWVudC51bmJpbmQoJ2tleWRvd24nLHNjb3BlLmtleWRvd24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIGJhciB3YXMgdG91Y2ggbGV0IG1vdmUgaGFuZGxlIHRvIHRoaXMgcG9pbnRcbiAgICAgICAgc2NvcGUudG91Y2hCYXJDQiA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgdmFyIGhhbmRsZT0wO1xuICAgICAgICAgICAgdmFyIHJlbGF0aXZlO1xuICAgICAgICAgICAgdmFyIHRvdWNoZXMgPSBldmVudC5jaGFuZ2VkVG91Y2hlcztcbiAgICAgICAgICAgIHZhciBvbGR2YWx1ZSA9IHNjb3BlLnZhbHVlW2hhbmRsZV07XG5cbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgdHdvIGhhbmRsZXMgc2VsZWN0IGNsb3Nlc3Qgb25lIGZyb20gdG91Y2ggcG9pbnRcbiAgICAgICAgICAgIGlmIChzY29wZS5kdWFsKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNjb3BlLnZlcnRpY2FsKSByZWxhdGl2ZSA9ICh0b3VjaGVzWzBdLnBhZ2VZIC0gc2NvcGUuYm91bmRzLmJhci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5ib3R0b20pIC8gc2NvcGUuYm91bmRzLmJhci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgZWxzZSByZWxhdGl2ZT0gKHRvdWNoZXNbMF0ucGFnZVggLSBzY29wZS5ib3VuZHMuYmFyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQpIC8gc2NvcGUuYm91bmRzLmJhci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcblxuICAgICAgICAgICAgICAgIHZhciBkaXN0YW5jZTAgPSBNYXRoLmFicyhyZWxhdGl2ZSAtIHNjb3BlLnJlbGF0aXZlWzBdKTtcbiAgICAgICAgICAgICAgICB2YXIgZGlzdGFuY2UxID0gTWF0aC5hYnMocmVsYXRpdmUgLSBzY29wZS5yZWxhdGl2ZVsxXSk7XG4gICAgICAgICAgICAgICAgaWYgKGRpc3RhbmNlMSA8IGRpc3RhbmNlMCkgaGFuZGxlPTE7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIG1vdmUgaGFuZGxlIHRvIG5ldyBwbGFjZVxuICAgICAgICAgICAgc2NvcGUubW92ZUhhbmRsZSAoaGFuZGxlLHRvdWNoZXNbMF0ucGFnZVgsIHRvdWNoZXNbMF0ucGFnZVkpO1xuICAgICAgICAgICAgaWYgKHNjb3BlLmNhbGxiYWNrICYmIG9sZHZhbHVlICE9PSBzY29wZS52YWx1ZVtoYW5kbGVdKSBzY29wZS5jYWxsYmFjayAoc2NvcGUudmFsdWVbaGFuZGxlXSwgc2NvcGUuY3RybGhhbmRsZSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gaGFuZGxlIHdhcyB0b3VjaCBhbmQgZHJhZ1xuICAgICAgICBzY29wZS50b3VjaEhhbmRsZUNCID0gZnVuY3Rpb24gKHRvdWNoZXZ0LCBoYW5kbGUpIHtcbiAgICAgICAgICAgIHZhciBvbGR2YWx1ZSA9IHNjb3BlLnZhbHVlW2hhbmRsZV07XG5cbiAgICAgICAgICAgIHRvdWNoZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAkZG9jdW1lbnQub24oJ3RvdWNobW92ZScsdG91Y2htb3ZlKTtcbiAgICAgICAgICAgICRkb2N1bWVudC5vbigndG91Y2hlbmQnICx0b3VjaGVuZCk7XG4gICAgICAgICAgICBlbGVtZW50LnVuYmluZCgndG91Y2hzdGFydCcsIHNjb3BlLnRvdWNoQmFyQ0IpO1xuXG4gICAgICAgICAgICBmdW5jdGlvbiB0b3VjaG1vdmUoZXZlbnQpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHZhciB0b3VjaGVzID0gZXZlbnQuY2hhbmdlZFRvdWNoZXM7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaWR4ID0gMDsgaWR4IDwgdG91Y2hlcy5sZW5ndGg7IGlkeCsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLm1vdmVIYW5kbGUgKGhhbmRsZSx0b3VjaGVzW2lkeF0ucGFnZVgsIHRvdWNoZXNbaWR4XS5wYWdlWSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmdW5jdGlvbiB0b3VjaGVuZChldmVudCkge1xuICAgICAgICAgICAgICAgJGRvY3VtZW50LnVuYmluZCgndG91Y2htb3ZlJyx0b3VjaG1vdmUpO1xuICAgICAgICAgICAgICAgJGRvY3VtZW50LnVuYmluZCgndG91Y2hlbmQnICx0b3VjaGVuZCk7XG4gICAgICAgICAgICAgICBlbGVtZW50Lm9uKCd0b3VjaHN0YXJ0Jywgc2NvcGUudG91Y2hCYXJDQik7XG5cbiAgICAgICAgICAgICAgICAvLyBpZiB2YWx1ZSBjaGFuZ2Ugbm90aWZ5IGFwcGxpY2F0aW9uIGNhbGxiYWNrXG4gICAgICAgICAgICAgICAgaWYgKHNjb3BlLmNhbGxiYWNrICYmIG9sZHZhbHVlICE9PSBzY29wZS52YWx1ZVtoYW5kbGVdKSBzY29wZS5jYWxsYmFjayAoc2NvcGUudmFsdWVbaGFuZGxlXSwgc2NvcGUuY3RybGhhbmRsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgc2NvcGUuaGFuZGxlQ0IgPSBmdW5jdGlvbiAoY2xpY2tldmVudCwgaGFuZGxlKSB7XG5cbiAgICAgICAgICAgIGlmIChhdHRycy5hdXRvbWF0aWMpIHJldHVybjtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIG9sZHZhbHVlID0gc2NvcGUudmFsdWVbaGFuZGxlXTtcbiAgICAgICAgICAgIC8vIHJlZ2lzdGVyIG1vdXNlIGV2ZW50IHRvIHRyYWNrIGhhbmRsZVxuICAgICAgICAgICAgY2xpY2tldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgICAkZG9jdW1lbnQub24oJ21vdXNlbW92ZScsbW91c2Vtb3ZlKTtcbiAgICAgICAgICAgICRkb2N1bWVudC5vbignbW91c2V1cCcsIG1vdXNldXApO1xuICAgICAgICAgICAgc2NvcGUuaGFuZGxlc1toYW5kbGVdWzBdLmZvY3VzKCk7XG4gICAgICAgICAgICBzY29wZS5hY3RpZj1oYW5kbGU7XG5cbiAgICAgICAgICAgIC8vIHNsaWRlciBoYW5kbGUgaXMgbW92aW5nXG4gICAgICAgICAgICBmdW5jdGlvbiBtb3VzZW1vdmUoZXZlbnQpIHtcbiAgICAgICAgICAgICAgICBzY29wZS5tb3ZlSGFuZGxlIChoYW5kbGUsIGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBtb3VzZSBpcyB1cCBkYW5zIGxlYXZlIHNsaWRlciBzZW5kIHJlc2l6ZSBldmVudHNcbiAgICAgICAgICAgIGZ1bmN0aW9uIG1vdXNldXAoKSB7XG4gICAgICAgICAgICAgICAgJGRvY3VtZW50LnVuYmluZCgnbW91c2Vtb3ZlJywgbW91c2Vtb3ZlKTtcbiAgICAgICAgICAgICAgICAkZG9jdW1lbnQudW5iaW5kKCdtb3VzZXVwJywgbW91c2V1cCk7XG5cbiAgICAgICAgICAgICAgICAvLyBpZiB2YWx1ZSBjaGFuZ2Ugbm90aWZ5IGFwcGxpY2F0aW9uIGNhbGxiYWNrXG4gICAgICAgICAgICAgICAgaWYgKHNjb3BlLmNhbGxiYWNrICYmIG9sZHZhbHVlICE9PSBzY29wZS52YWx1ZVtoYW5kbGVdKSBzY29wZS5jYWxsYmFjayAoc2NvcGUudmFsdWVbaGFuZGxlXSwgc2NvcGUuY3RybGhhbmRsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gc2ltdWxhdGUganF1ZXJ5IGZpbmQgYnkgY2xhc3NlcyBjYXBhYmlsaXRpZXMgW3dhcm5pbmcgb25seSByZXR1cm4gMXN0IGVsZW1lbnRzXVxuICAgICAgICBzY29wZS5maW5kID0gZnVuY3Rpb24gKHNlbGVjdCwgZWxlbSkge1xuICAgICAgICAgICAgdmFyIGRvbWVsZW07XG5cbiAgICAgICAgICAgIGlmIChlbGVtKSBkb21lbGVtID0gZWxlbVswXS5xdWVyeVNlbGVjdG9yKHNlbGVjdCk7XG4gICAgICAgICAgICBlbHNlIGRvbWVsZW0gPSBlbGVtZW50WzBdLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0KTtcblxuICAgICAgICAgICAgdmFyIGFuZ2VsZW0gPSBhbmd1bGFyLmVsZW1lbnQoZG9tZWxlbSk7XG4gICAgICAgICAgICByZXR1cm4gKGFuZ2VsZW0pO1xuICAgICAgICB9O1xuXG5cblxuICAgICAgICBzY29wZS5pbml0aWFsU2V0dGluZ3MgPSBmdW5jdGlvbiAoaW5pdGlhbCkge1xuICAgICAgICAgICAgdmFyIGRlY2ltYWxfcGxhY2VzX21hdGNoX3Jlc3VsdDtcbiAgICAgICAgICAgIHNjb3BlLnZhbHVlPVtdOyAgLy8gc3RvcmUgbG93L2hlaWdodCB2YWx1ZSB3aGVuIHR3byBoYW5kbGVzXG4gICAgICAgICAgICBzY29wZS5yZWxhdGl2ZT1bXTtcblxuICAgICAgICAgICAgaWYgKHNjb3BlLnByZWNpc2lvbiA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGRlY2ltYWxfcGxhY2VzX21hdGNoX3Jlc3VsdCA9ICgnJyArIHNjb3BlLmJ5U3RlcCkubWF0Y2goL1xcLihbXFxkXSopLyk7XG4gICAgICAgICAgICAgICAgc2NvcGUucHJlY2lzaW9uID0gZGVjaW1hbF9wbGFjZXNfbWF0Y2hfcmVzdWx0ICYmIGRlY2ltYWxfcGxhY2VzX21hdGNoX3Jlc3VsdFsxXSA/IGRlY2ltYWxfcGxhY2VzX21hdGNoX3Jlc3VsdFsxXS5sZW5ndGggOiAwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBwb3NpdGlvbiBoYW5kbGUgdG8gaW5pdGlhbCB2YWx1ZShzKVxuICAgICAgICAgICAgZWxlbWVudC5vbigndG91Y2hzdGFydCcsIHNjb3BlLnRvdWNoQmFyQ0IpO1xuICAgICAgICAgICAgc2NvcGUuaGFuZGxlc1swXS5vbigndG91Y2hzdGFydCcsIGZ1bmN0aW9uKGV2dCl7c2NvcGUudG91Y2hIYW5kbGVDQihldnQsMCk7fSk7XG5cbiAgICAgICAgICAgIC8vIHRoaXMgc2xpZGVyIGhhcyB0d28gaGFuZGxlcyBsb3cvaGlnaHRcbiAgICAgICAgICAgIGlmIChzY29wZS5kdWFsKSB7XG4gICAgICAgICAgICAgICAgc2NvcGUuaGFuZGxlc1sxXS5hZGRDbGFzcygncmFuZ2Utc2xpZGVyLWhhbmRsZScpO1xuICAgICAgICAgICAgICAgIHNjb3BlLmhhbmRsZXNbMV0ub24oJ3RvdWNoc3RhcnQnLCBmdW5jdGlvbihldnQpe3Njb3BlLnRvdWNoSGFuZGxlQ0IoZXZ0LDEpO30pO1xuICAgICAgICAgICAgICAgIGlmICghc2NvcGUuaW5pdHZhbHVlcykgc2NvcGUuc2V0VmFsdWUgKGluaXRpYWxbMV0sMSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYW4gaW5pdHN0YXRlIG9iamVjdCBhcHBseSBpdFxuICAgICAgICAgICAgaWYgKHNjb3BlLmluaXR2YWx1ZXMpIHNjb3BlLmluaXRXaWRnZXQgKHNjb3BlLmluaXR2YWx1ZXMpO1xuICAgICAgICAgICAgZWxzZSAgIHNjb3BlLnNldFZhbHVlIChpbml0aWFsWzBdLDApO1xuICAgICAgICB9O1xuXG4gICAgICAgIHNjb3BlLmluaXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzY29wZS5zbGlkZXJpZCAgID0gYXR0cnMuaWQgfHwgXCJzbGlkZXItXCIgKyBwYXJzZUludCAoTWF0aC5yYW5kb20oKSAqIDEwMDApO1xuICAgICAgICAgICAgc2NvcGUuc3RhcnRWYWx1ZSA9IC1JbmZpbml0eTtcbiAgICAgICAgICAgIHNjb3BlLnN0b3BWYWx1ZSAgPSBJbmZpbml0eTtcbiAgICAgICAgICAgIHNjb3BlLmJ5U3RlcCAgID0gcGFyc2VJbnQoYXR0cnMuYnlTdGVwKSB8fCAxO1xuICAgICAgICAgICAgc2NvcGUudmVydGljYWwgPSBhdHRycy52ZXJ0aWNhbCAgIHx8IGZhbHNlO1xuICAgICAgICAgICAgc2NvcGUuZHVhbCAgICAgPSBhdHRycy5kdWFsSGFuZGxlc3x8IGZhbHNlO1xuICAgICAgICAgICAgc2NvcGUudHJpZ2dlcl9pbnB1dF9jaGFuZ2U9IGZhbHNlO1xuICAgICAgICAgICAgc2NvcGUubm90TW9yZSAgPSBwYXJzZUludChhdHRycy5ub3RNb3JlKSAgIHx8IDEwMDtcbiAgICAgICAgICAgIHNjb3BlLm5vdExlc3MgID0gcGFyc2VJbnQoYXR0cnMubm90TGVzcykgICB8fCAwO1xuXG4gICAgICAgICAgICBpZiAoc2NvcGUudmVydGljYWwpIGVsZW1lbnQuYWRkQ2xhc3MoXCJ2ZXJ0aWNhbC1yYW5nZVwiKTtcblxuICAgICAgICAgICAgc2NvcGUuaGFuZGxlcz0gW3Njb3BlLmZpbmQoJy5oYW5kbGUtbWluJyksIHNjb3BlLmZpbmQoJy5oYW5kbGUtbWF4JyldO1xuICAgICAgICAgICAgc2NvcGUuYmFyICAgID0gZWxlbWVudDtcbiAgICAgICAgICAgIHNjb3BlLnNsaWRlciA9IHNjb3BlLmZpbmQoJy5yYW5nZS1zbGlkZXItYWN0aXZlLXNlZ21lbnQnKTtcbiAgICAgICAgICAgIHNjb3BlLnN0YXJ0ICA9IHNjb3BlLmZpbmQoJy5pYnotcmFuZ2Utc2xpZGVyLXN0YXJ0Jyk7XG4gICAgICAgICAgICBzY29wZS5zdG9wICAgPSBzY29wZS5maW5kKCcuaWJ6LXJhbmdlLXNsaWRlci1zdG9wJyk7XG4gICAgICAgICAgICBzY29wZS5kaXNhYmxlPSBhdHRycy5kaXNhYmxlIHx8IGZhbHNlO1xuXG4gICAgICAgICAgICBzY29wZS5jdHJsaGFuZGxlID0gbmV3IFJhbmdlU2xpZGVySGFuZGxlIChzY29wZSk7XG5cbiAgICAgICAgICAgIC8vIHByZXBhcmUgRE9NIG9iamVjdCBwb2ludGVyIHRvIGNvbXB1dGUgc2l6ZSBkeW5hbWljYWxseVxuICAgICAgICAgICAgc2NvcGUuYm91bmRzID0ge1xuICAgICAgICAgICAgICAgIGJhciAgICA6IGVsZW1lbnRbMF0sXG4gICAgICAgICAgICAgICAgaGFuZGxlczogW3Njb3BlLmhhbmRsZXNbMF1bMF0sIHNjb3BlLmhhbmRsZXNbMV1bMF1dXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpZiAoYXR0cnMuZGlzYWJsZSA9PT0gJ3RydWUnKSBzY29wZS5zZXREaXNhYmxlKHRydWUpO1xuXG4gICAgICAgICAgICBpZiAoYXR0cnMuZGlzcGxheVRhcmdldCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoYXR0cnMuZGlzcGxheVRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIHRydWUgOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICdoYW5kbGUnIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLmRpc3BsYXlzID0gc2NvcGUuaGFuZGxlcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLmhhbmRsZXNbMF0uYWRkQ2xhc3MoJ2liei1yYW5nZS1zbGlkZXItZGlzcGxheScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3BlLmR1YWwpIHNjb3BlLmhhbmRsZXNbMV0uYWRkQ2xhc3MoJ2liei1yYW5nZS1zbGlkZXItZGlzcGxheScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBzY29wZS5kaXNwbGF5cyA9ICBbJGRvY3VtZW50LmdldEVsZW1lbnRCeUlkIChhdHRycy5kaXNwbGF5VGFyZ2V0KV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHNjb3BlLmRpc3BsYXlzPVtdO1xuXG4gICAgICAgICAgICAvLyBleHRyYWN0IGluaXRpYWwgdmFsdWVzIGZyb20gYXR0cnMgYW5kIHBhcnNlIGludG8gaW50XG4gICAgICAgICAgICBpZiAoIWF0dHJzLmluaXRpYWwpIHtcbiAgICAgICAgICAgICAgICBzY29wZS5pbml0aWFsICA9IFtzY29wZS5uZ01vZGVsLCBzY29wZS5uZ01vZGVsXTsgLy8gaW5pdGlhbGl6ZSB0byBtb2RlbCB2YWx1ZXNcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGluaXRpYWwgID0gYXR0cnMuaW5pdGlhbC5zcGxpdCgnLCcpO1xuICAgICAgICAgICAgICAgIHNjb3BlLmluaXRpYWwgPSBbXG4gICAgICAgICAgICAgICAgICAgIGluaXRpYWxbMF0gIT09IHVuZGVmaW5lZCA/IHBhcnNlSW50IChpbml0aWFsWzBdKSA6IHNjb3BlLm5vdExlc3MsXG4gICAgICAgICAgICAgICAgICAgIGluaXRpYWxbMV0gIT09IHVuZGVmaW5lZCA/IHBhcnNlSW50IChpbml0aWFsWzFdKSA6IHNjb3BlLm5vdE1vcmVcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBNb25pdG9yIGFueSBjaGFuZ2VzIG9uIHN0YXJ0L3N0b3AgZGF0ZXMuXG4gICAgICAgICAgICBzY29wZS4kd2F0Y2goJ3N0YXJ0QXQnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2NvcGUudmFsdWUgPCBzY29wZS5zdGFydEF0ICkge1xuICAgICAgICAgICAgICAgICAgICAvL3Njb3BlLnNldFZhbHVlIChzY29wZS5zdGFydEF0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHNjb3BlLnN0YXJ0QXQpIHNjb3BlLnNldFN0YXJ0IChzY29wZS5zdGFydEF0KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBzY29wZS4kd2F0Y2goJ3N0b3BBdCcgLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2NvcGUudmFsdWUgPiBzY29wZS5zdG9wQXQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9zY29wZS5zZXRWYWx1ZSAoc2NvcGUuc3RvcEF0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHNjb3BlLnN0b3BBdCkgc2NvcGUuc2V0U3RvcCAoc2NvcGUuc3RvcEF0KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBmaW5pc2ggd2lkZ2V0IGluaXRpYWxpc2F0aW9uXG4gICAgICAgICAgICBzY29wZS5pbml0aWFsU2V0dGluZ3MgKHNjb3BlLmluaXRpYWwpO1xuXG4gICAgICAgIH07XG5cbiAgICAgICAgc2NvcGUuaW5pdCgpO1xuICAgICAgICBcbiAgICAgICAgIC8vIHNsaWRlciBpcyByZWFkeSBwcm92aWRlIGNvbnRyb2wgaGFuZGxlIHRvIGFwcGxpY2F0aW9uIGNvbnRyb2xsZXJcbiAgICAgICAgc2NvcGUuJHdhdGNoICgnaW5pdGhvb2snLCBmdW5jdGlvbiAoKSB7ICAgICAgICAgLy8gaW5pdCBWYWx1ZXMgbWF5IGFycml2ZSBsYXRlXG4gICAgICAgICAgICBpZiAoc2NvcGUuaW5pdGhvb2spIHNjb3BlLmluaXRob29rIChzY29wZS5jdHJsaGFuZGxlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgc2NvcGUuJHdhdGNoICgnaW5pdHZhbHVlcycsIGZ1bmN0aW9uICgpIHsgXHQvLyBpbml0IFZhbHVlcyBtYXkgYXJyaXZlIGxhdGVcbiAgICAgICAgICAgIGlmIChzY29wZS5pbml0dmFsdWVzKSBzY29wZS5pbml0V2lkZ2V0KHNjb3BlLmluaXR2YWx1ZXMpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyB0d28td2F5IGJpbmRpbmcgaWYgbW9kZWwgdmFsdWUgY2hhbmdlc1xuICAgICAgICBzY29wZS4kd2F0Y2ggKCduZ01vZGVsJywgZnVuY3Rpb24gKG5ld1ZhbHVlKSB7XG4gICAgICAgICAgc2NvcGUuc2V0VmFsdWUobmV3VmFsdWUsIDApO1xuICAgICAgICB9KTtcbiAgICB9XG5cbnJldHVybiB7XG4gICAgcmVzdHJpY3Q6IFwiRVwiLCAgICAvLyByZXN0cmljdCB0byA8cmFuZ2Utc2xpZGVyPiBIVE1MIGVsZW1lbnQgbmFtZVxuICAgIHNjb3BlOiB7XG4gICAgICAgIHN0YXJ0QXQgIDonPScsICAvLyBGaXJzdCBhY2NlcHRhYmxlIGRhdGVcbiAgICAgICAgc3RvcEF0ICAgOic9JywgIC8vIExhc3QgYWNjZXB0YWJsZSBkYXRlXG4gICAgICAgIGNhbGxiYWNrIDonPScsICAvLyBDYWxsYmFjayB0byBhY3RpZiB3aGVuIGEgZGF0ZSBpcyBzZWxlY3RlZFxuICAgICAgICBmb3JtYXR0ZXI6Jz0nLCAgLy8gQ2FsbGJhY2sgZm9yIGRyYWcgZXZlbnQgY2FsbCBlYWNoIHRpbWUgaW50ZXJuYWwgdmFsdWUgY2hhbmdlc1xuICAgICAgICBpbml0aG9vayA6Jz0nLCAgLy8gSG9vayBwb2ludCB0byBjb250cm9sIHNsaWRlciBmcm9tIEFQSVxuICAgICAgICBjYmhhbmRsZSA6Jz0nLCAgLy8gQXJndW1lbnQgYWRkZWQgdG8gZXZlcnkgY2FsbGJhY2tcbiAgICAgICAgaW5pdHZhbHVlczonPScsICAgLy8gSW5pdGlhbCB2YWx1ZXMgYXMgYSBzaW5nbGUgb2JqZWN0XG4gICAgICAgIG5nTW9kZWw6ICc9JyAgICAvLyB0aGUgbW9kZWwgdmFsdWVcbiAgICB9LFxuICAgIHJlcXVpcmU6ICc/bmdNb2RlbCcsXG4gICAgdGVtcGxhdGU6IHRlbXBsYXRlLCAvLyBodG1sIHRlbXBsYXRlIGlzIGJ1aWxkIGZyb20gSlNcbiAgICByZXBsYWNlOiB0cnVlLCAgICAgIC8vIHJlcGxhY2UgY3VycmVudCBkaXJlY3RpdmUgd2l0aCB0ZW1wbGF0ZSB3aGlsZSBpbmhlcml0aW5nIG9mIGNsYXNzXG4gICAgbGluazogbGluayAgICAgICAgICAvLyBwaWNrYWRhdGUgb2JqZWN0J3MgbWV0aG9kc1xufTtcbn1dKTtcblxuY29uc29sZS5sb2cgKFwiUmFuZ2VTbGlkZXIgTG9hZGVkXCIpO1xuXG59KSgpOyIsIi8qXG4gYWxzYS1nYXRld2F5IC0tIHByb3ZpZGUgYSBSRVNUL0hUVFAgaW50ZXJmYWNlIHRvIEFMU0EtTWl4ZXJcblxuIENvcHlyaWdodCAoQykgMjAxNSwgRnVsdXAgQXIgRm9sbFxuXG4gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yXG4gKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cblxuIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG5cbiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuIGFsb25nIHdpdGggc2NvcGUgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLlxuXG4gUmVmZXJlbmNlczpcblxuICovXG5cbihmdW5jdGlvbiAoKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgdmFyIHRlbXBsYXRlID1cbiAgICAgICAgICAnPGRpdiBjbGFzcz1cImFmYi1tb25pdG9yXCIgbmctY2xpY2s9XCJnZXRwaW5nKClcIj4nICtcbiAgICAgICAgICc8c3BhbiBjbGFzcz1cImFmYi1yZWZyZXNoLXRva2VuXCIgID5hZmI6Ly97e2hvc3RuYW1lfX06e3todHRwZHBvcnR9fTwvc3Bhbj4nICtcbiAgICAgICAgICc8aSBjbGFzcz1cInt7aWNvbn19XCI+PC9pPicgK1xuICAgICAgICAgJzwvZGl2Pic7XG5cblxuLy8gc2NvcGUgbW9kdWxlIGlzIGxvYWQgc3RhdGljYWxseSBiZWZvcmUgYW55IHJvdXRlIGlzIGNhdGl2YXRlZFxuYW5ndWxhci5tb2R1bGUoJ1Rva2VuUmVmcmVzaCcsIFsnQXBwQ29uZmlnJywgJ01vZGFsTm90aWZpY2F0aW9uJ10pXG5cbiAgICAuZGlyZWN0aXZlICgndG9rZW5SZWZyZXNoJywgW1wiJGxvZ1wiLCBcIiR3aW5kb3dcIiwgXCIkdGltZW91dFwiLCBcIiRsb2NhdGlvblwiLCBcIk5vdGlmaWNhdGlvblwiLCBcIkFwcENvbmZpZ1wiLCBcIkFwcENhbGxcIiwgZnVuY3Rpb24oJGxvZywgJHdpbmRvdywgJHRpbWVvdXQsICRsb2NhdGlvbiwgTm90aWZpY2F0aW9uLCBBcHBDb25maWcsIEFwcENhbGwpIHtcblxuICAgIGZ1bmN0aW9uIG15bWV0aG9kcyhzY29wZSwgZWxlbSwgYXR0cnMpIHtcbiAgICAgICAgc2NvcGUubG9nZ2VkPXVuZGVmaW5lZDsgLy8gbmVpdGhlciB0aHUgbmVpdGhlciBmYWxzZVxuICAgICAgICBcbiAgICAgICAgJHdpbmRvdy5vbmJlZm9yZXVubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIEFwcENhbGwuZ2V0IChcInRva2VuXCIsIFwicmVzZXRcIiwgey8qcXVlcnkqL30sIGZ1bmN0aW9uICgpIHsgICAgXG4gICAgICAgICAgICAkbG9nLmxvZyhcIk9QQSBleGl0XCIpOyAgICAgICAgICAgIFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgICAgICAgICAgIFxuICAgICAgICBzY29wZS5vbmxpbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBlbGVtLmFkZENsYXNzICAgIChcIm9ubGluZVwiKTtcbiAgICAgICAgICAgIGVsZW0ucmVtb3ZlQ2xhc3MgKFwib2ZmbGluZVwiKTtcbiAgICAgICAgICAgIHNjb3BlLmxvZ2dlZD10cnVlO1xuICAgICAgICB9O1xuXG4gICAgICAgIHNjb3BlLm9mZmxpbmUgPSBmdW5jdGlvbigpe1xuICAgICAgICAgICAgZWxlbS5hZGRDbGFzcyAgICAoXCJvZmZsaW5lXCIpO1xuICAgICAgICAgICAgZWxlbS5yZW1vdmVDbGFzcyAoXCJvbmxpbmVcIik7XG4gICAgICAgICAgICBzY29wZS5sb2dnZWQ9ZmFsc2U7XG4gICAgICAgIH07XG4gICAgICAgIFxuICAgICAgICBzY29wZS5vbmVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpZiAoc2NvcGUubG9nZ2VkICE9PSBmYWxzZSkgIHtcbiAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24ud2FybmluZyAoe21lc3NhZ2U6IFwiQXBwRnJhbWV3b3JrIEJpbmRlciBMb3N0XCIsIGRlbGF5OiA1MDAwfSk7XG4gICAgICAgICAgICAgICAgc2NvcGUub2ZmbGluZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2NvcGUuc3RhdHVzID0gMDtcbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIHNjb3BlLm9uc3VjY2VzcyA9IGZ1bmN0aW9uKGpyZXNwKSB7XG4gICAgICAgICAgICBpZiAoanJlc3AucmVxdWVzdC50b2tlbikgQXBwQ29uZmlnLnNlc3Npb24udG9rZW4gPSBqcmVzcC5yZXF1ZXN0LnRva2VuO1xuICAgICAgICAgICAgaWYgKGpyZXNwLnJlcXVlc3QudXVpZCkgIEFwcENvbmZpZy5zZXNzaW9uLnV1aWQgID0ganJlc3AucmVxdWVzdC51dWlkO1xuICAgICAgICAgICAgaWYgKGpyZXNwLnJlcXVlc3QudGltZW91dCkgIEFwcENvbmZpZy5zZXNzaW9uLnRpbWVvdXQgID0ganJlc3AucmVxdWVzdC50aW1lb3V0O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoc2NvcGUubG9nZ2VkICE9PSB0cnVlKSAge1xuICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbi5zdWNjZXNzICh7bWVzc2FnZTogXCJBcHBGcmFtZXdvcmsgQmluZGVyIEJhY2sgdG8gTGl2ZVwiLCBkZWxheTogMzAwMH0pO1xuICAgICAgICAgICAgICAgIHNjb3BlLm9ubGluZSgpO1xuICAgICAgICAgICAgICAgIGlmIChzY29wZS5jYWxsYmFjaykgc2NvcGUuY2FsbGJhY2soanJlc3ApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2NvcGUuc3RhdHVzID0gMTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBDaGVjayBCaW5kZXIgc3RhdHVzXG4gICAgICAgIHNjb3BlLmdldHBpbmcgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgQXBwQ2FsbC5nZXQgKFwidG9rZW5cIiwgXCJwaW5nXCIsIHsvKnF1ZXJ5Ki99LGZ1bmN0aW9uKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAyMDApIHNjb3BlLm9uc3VjY2VzcyAocmVzdWx0LmRhdGEpO1xuICAgICAgICAgICAgICAgIGVsc2UgIHNjb3BlLm9uZXJyb3IoKTtcbiAgICAgICAgICAgICAgICAvLyByZXN0YXJ0IGEgbmV3IHRpbWVyIGZvciBuZXh0IHBpbmdcbiAgICAgICAgICAgICAgICAkdGltZW91dCAoc2NvcGUuZ2V0cGluZywgQXBwQ29uZmlnLnNlc3Npb24ucGluZ3JhdGUqMTAwMCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIC8vIENoZWNrIEJpbmRlciBzdGF0dXNcbiAgICAgICAgc2NvcGUucmVmcmVzaCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBBcHBDYWxsLmdldCAoXCJ0b2tlblwiLCBcInJlZnJlc2hcIiwgey8qcXVlcnkqL30sZnVuY3Rpb24ocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IDIwMCkgc2NvcGUub25zdWNjZXNzIChyZXN1bHQuZGF0YSk7XG4gICAgICAgICAgICAgICAgZWxzZSAgc2NvcGUub25lcnJvcigpO1xuICAgICAgICAgICAgICAgIC8vIHJlc3RhcnQgYSBuZXcgdGltZXIgZm9yIG5leHQgcmVmcmVzaFxuICAgICAgICAgICAgICAgICR0aW1lb3V0IChzY29wZS5yZWZyZXNoLCBBcHBDb25maWcuc2Vzc2lvbi50aW1lb3V0ICoyNTApO1xuICAgICAgICAgICAgfSk7ICAgICAgICAgICAgXG4gICAgICAgIH07XG4gICAgICAgIFxuICAgICAgICAvLyBJbml0aWFsIGNvbm5lY3Rpb25cbiAgICAgICAgc2NvcGUudGtjcmVhdGUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgQXBwQ2FsbC5nZXQgKFwidG9rZW5cIiwgXCJjcmVhdGVcIiwge3Rva2VuOiBBcHBDb25maWcuc2Vzc2lvbi5pbml0aWFsfSxmdW5jdGlvbihyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gMjAwKSBzY29wZS5vbnN1Y2Nlc3MgKHJlc3VsdC5kYXRhKTtcbiAgICAgICAgICAgICAgICBlbHNlICBzY29wZS5vbmVycm9yKCk7XG4gICAgICAgICAgICB9KTsgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgfTtcbiBcbiAgICAgICAgc2NvcGUuaWNvbiAgICAgID0gYXR0cnMuaWNvbiAgIHx8IFwiZmktbGlnaHRidWxiXCI7XG4gICAgICAgIHNjb3BlLmhvc3RuYW1lICA9ICRsb2NhdGlvbi5ob3N0KCk7XG4gICAgICAgIHNjb3BlLmh0dHBkcG9ydCA9ICRsb2NhdGlvbi5wb3J0KCk7XG4gICAgICAgIHNjb3BlLmF1dG9sb2cgICA9IEpTT04ucGFyc2UoYXR0cnMuYXV0b2xvZyB8fCBmYWxzZSk7XG4gICAgICAgIFxuICAgICAgICBpZiAoc2NvcGUuYXV0b2xvZykgc2NvcGUudGtjcmVhdGUoKTtcblxuICAgICAgICAvLyBJbml0IHBpbmcgYW5kIHJlZnJlc2ggcHJvY2Vzc1xuICAgICAgICAkdGltZW91dCAoc2NvcGUuZ2V0cGluZywgQXBwQ29uZmlnLnNlc3Npb24ucGluZ3JhdGUqMTAwMCk7XG4gICAgICAgICR0aW1lb3V0IChzY29wZS5yZWZyZXNoLCBBcHBDb25maWcuc2Vzc2lvbi50aW1lb3V0ICoyNTApO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIHRlbXBsYXRlOiB0ZW1wbGF0ZSxcbiAgICAgICAgc2NvcGU6IHtcbiAgICAgICAgICAgIGNhbGxiYWNrIDogXCI9XCJcbiAgICAgICAgfSxcbiAgICAgICAgcmVzdHJpY3Q6ICdFJyxcbiAgICAgICAgbGluazogbXltZXRob2RzXG4gICAgfTtcbn1dKTtcblxufSkoKTtcbmNvbnNvbGUubG9nIChcIlRva2VuIFJlZnJlc2ggTG9hZGVkXCIpO1xuXG4iLCIvKiBcbiAqIENvcHlyaWdodCAoQykgMjAxNSBcIklvVC5iemhcIlxuICogQXV0aG9yIFwiRnVsdXAgQXIgRm9sbFwiXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi5cbiAqIFxuICogQnVnczogSW5wdXQgd2l0aCBDYWxsYmFjayBTSE9VTEQgQkUgZ2V0ICdyZXF1aXJlZCcgY2xhc3NcbiAqIFxuICogcmVmOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9FdmVudHMvbW91c2VvdmVyXG4gKiBcbiAqIHVzYWdlOiBcbiAqIFxuICogdGlwTW9kYWw6IGxpc3RlbiBldmVudCBmcm9tIGVsZW0ucGFyZW50KCkgdG8gZGlzcGxheSB0aXAtbW9kYWxcbiAqICAgICAgPGRpdiBjbGFzcz1cInh4eHhcIj5cbiAqICAgICAgICAgIDx0aXAtbW9kYWwgdGlwPXh4eHg+PC90aXAtbW9kYWw+XG4gKiAgICAgICAgICA8aW5wdXQtdGV4dCAuLi4uPjwvaW5wdXQtdGV4dD5cbiAqICAgICAgPC9kaXY+XG4gKiAgICAgIFxuICogTm90ZTogdXNlIENTUy52aXNpYmlsaXR5IHRvIGF2b2lkIGRpc3BsYXkgZmxpY2tlcmluZyBhdCBpbml0aWFsIGRpc3BsYXkuXG4gKi9cblxuKGZ1bmN0aW9uICgpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICB2YXIgdG1wbCA9ICc8ZGl2IGNsYXNzPVwidGlwLW1vZGFsLXBvcHVwXCI+JyArXG4gICAgICAgICAgICAnPGkgY2xhc3M9XCJ7e2ljb259fVwiPjwvaT4nICtcbiAgICAgICAgICAgICc8c3Bhbj57e3RpcH19PC9zcGFuPicgK1xuICAgICAgICAgICAgJzwvc3Bhbj48L2Rpdj4nIDtcblxuICAgIGFuZ3VsYXIubW9kdWxlKCdNb2RhbE5vdGlmaWNhdGlvbicsIFtdKVxuICAgICAgICAgICAgLmRpcmVjdGl2ZSgndGlwTW9kYWwnLCBbXCIkdGltZW91dFwiLCBmdW5jdGlvbiAoJHRpbWVvdXQpIHtcblxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG15bWV0aG9kcyhzY29wZSwgZWxlbSwgYXR0cnMpIHtcbiAgICAgICAgICAgICAgICAgICAgc2NvcGUucGFyZW50ID0gZWxlbS5wYXJlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgc2NvcGUubW9kYWwgICAgPSBlbGVtLmZpbmQoXCJkaXZcIik7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgIFxuICAgICAgICAgICAgICAgICAgICAvLyBkZWxheSB0aXAgZGlzcGxheSB0byBhdm9pZCBibGlua2luZyB3aGVuIG1vdmluZyBtb3VzZSBmYXN0XG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGRpc3BsYXkgKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYWN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NvcGUuc2hvdykgc2NvcGUubW9kYWwuY3NzKHtvcGFjaXR5OiAxLCB2aXNpYmlsaXR5Oid2aXNpYmxlJ30pOyAgXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBzY29wZS5zaG93ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLnRpbWVvdXQgPSAkdGltZW91dChhY3Rpb24sIHNjb3BlLmRlbGF5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gY2xvc2UgKCkge1xuICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLnNob3cgPSBmYWxzZTsgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICBzY29wZS5tb2RhbC5jc3Moe29wYWNpdHk6IDAsIHZpc2liaWxpdHk6J2hpZGRlbid9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBcblxuICAgICAgICAgICAgICAgICAgICAvLyBhanVzdCBpY29uIG9yIHVzZSBkZWZhdWx0XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLmljb24gID0gYXR0cnMuaWNvbiB8fCAnZmktbGlnaHRidWxiJztcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBQYXJlbnQgZWxlbWVudCB0byBnZXQgbW91c2UgZXZlbnRcbiAgICAgICAgICAgICAgICAgICAgc2NvcGUucGFyZW50LmFkZENsYXNzICgnYXMtbW9kYWwtdGlwJyk7XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLnBhcmVudC5iaW5kKCdjbGljaycsIGNsb3NlKTtcbiAgICAgICAgICAgICAgICAgICAgc2NvcGUucGFyZW50LmJpbmQoJ2ZvY3VzJywgZGlzcGxheSk7XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLnBhcmVudC5iaW5kKCdtb3VzZW92ZXInLCBkaXNwbGF5KTtcbiAgICAgICAgICAgICAgICAgICAgc2NvcGUucGFyZW50LmJpbmQoJ21vdXNlbGVhdmUnLCBjbG9zZSk7XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLnBhcmVudC5iaW5kKCdibHVyJywgY2xvc2UpO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgc2NvcGUuZGVsYXkgPSBhdHRycy5kZWxheSB8fCAxMDAwOyAvLyB3YWl0IDFzIGJlZm9yZSBkaXNwbGF5aW5nIHRpcFxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0OiAnRScsXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiB0bXBsLFxuICAgICAgICAgICAgICAgICAgICBsaW5rOiBteW1ldGhvZHMsXG4gICAgICAgICAgICAgICAgICAgIHNjb3BlOiB7dGlwOiBcIj1cIn0gLy8gdGlwIG1heSBub3QgYmUgZGVmaW5lZCB3aGVuIHdpZGdldCBpcyBkaXNwbGF5XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1dKTtcbn0pKCk7XG4iLCIvKiBcbiAqIENvcHlyaWdodCAoQykgMjAxNSBcIklvVC5iemhcIlxuICogQXV0aG9yIFwiRnVsdXAgQXIgRm9sbFwiXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi5cbiAqIFxuICogQnVnczogSW5wdXQgd2l0aCBDYWxsYmFjayBTSE9VTEQgQkUgZ2V0ICdyZXF1aXJlZCcgY2xhc3NcbiAqL1xuXG4oZnVuY3Rpb24gKCkge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIHZhciB0bXBsID0gJzxzcGFuIHRpdGxlPVwiR290bzoge3tocmVmfX1cIiBuZy1jbGljaz1cImNsaWNrZWQoKVwiPicgK1xuICAgICAgICAgICAgJzxpIGNsYXNzPVwie3tpY29ufX1cIj48L2k+JyArXG4gICAgICAgICAgICAnPHNwYW4+e3tsYWJlbH19PC9zcGFuPicgK1xuICAgICAgICAgICAgJzwvc3Bhbj4nO1xuXG5cbiAgICBhbmd1bGFyLm1vZHVsZSgnTGlua0J1dHRvbicsIFtdKVxuICAgICAgICAgICAgLmRpcmVjdGl2ZSgnbGlua0J1dHRvbicsIFtcIiRsb2NhdGlvblwiLCBmdW5jdGlvbiAoJGxvY2F0aW9uKSB7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gbXltZXRob2RzKHNjb3BlLCBlbGVtLCBhdHRycykge1xuXG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLmNsaWNrZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXR0cnMucXVlcnkpICRsb2NhdGlvbi5wYXRoKGF0dHJzLmhyZWYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSAkbG9jYXRpb24ucGF0aChhdHRycy5ocmVmKS5zZWFyY2goYXR0cnMucXVlcnkpO1xuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIGFqdXN0IGljb24gb3IgdXNlIGRlZmF1bHRcbiAgICAgICAgICAgICAgICAgICAgc2NvcGUuaWNvbiA9IGF0dHJzLmljb24gICB8fCAnZmktbGluayc7XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLmxhYmVsID0gYXR0cnMubGFiZWwgfHwgJ0p1bXAnO1xuICAgICAgICAgICAgICAgICAgICBzY29wZS5ocmVmICA9IGF0dHJzLmhyZWYgIHx8ICcvaG9tZSc7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAvLyBhZGQgbGFiZWwgYXMgY2xhc3NcbiAgICAgICAgICAgICAgICAgICAgZWxlbS5hZGRDbGFzcyAoc2NvcGUubGFiZWwudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3Q6ICdFJyxcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6IHRtcGwsXG4gICAgICAgICAgICAgICAgICAgIGxpbms6IG15bWV0aG9kcyxcbiAgICAgICAgICAgICAgICAgICAgc2NvcGU6IHt9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1dKTtcbn0pKCk7XG4iLCJcbi8qIFxuICogQ29weXJpZ2h0IChDKSAyMDE1IFwiSW9ULmJ6aFwiXG4gKiBBdXRob3IgXCJGdWx1cCBBciBGb2xsXCJcbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yXG4gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcbiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuLlxuICogXG4gKiBSZWZlcmVuY2U6XG4gKiAgIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL2RvY3MvV2ViL0FQSS9GaWxlUmVhZGVyIFxuICogICBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1VzaW5nX2ZpbGVzX2Zyb21fd2ViX2FwcGxpY2F0aW9ucyNVc2luZ19oaWRkZW5fZmlsZV9pbnB1dF9lbGVtZW50c191c2luZ190aGVfY2xpY2slMjglMjlfbWV0aG9kXG4gKiAgIGh0dHBzOi8vdW5jb3JrZWRzdHVkaW9zLmNvbS9ibG9nL211bHRpcGFydGZvcm1kYXRhLWZpbGUtdXBsb2FkLXdpdGgtYW5ndWxhcmpzXG4gKiAgIGh0dHBzOi8vd3d3LnRlcmxpY2kuY29tLzIwMTUvMDUvMTYvdXBsb2FkaW5nLWZpbGVzLWxvY2FsbHkuaHRtbFxuICogICBodHRwczovL2dpdGh1Yi5jb20vbmVydmdoL2FuZ3VsYXItZmlsZS11cGxvYWQvYmxvYi9tYXN0ZXIvc3JjL3NlcnZpY2VzL0ZpbGVVcGxvYWRlci5qc1xuICogICBodHRwczovL3N0dWsuZ2l0aHViLmlvL2pzemlwL2RvY3VtZW50YXRpb24vaG93dG8vcmVhZF96aXAuaHRtbFxuICogICBodHRwOi8vb25laHVuZ3J5bWluZC5jb20vemlwLXBhcnNpbmctanN6aXAtYW5ndWxhci9cbiAqICAgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xNTM0MTkxMi9ob3ctdG8tZ28tZnJvbS1ibG9iLXRvLWFycmF5YnVmZmVyXG4gKiAgIFxuICogICBCdWdzOiB6aXAgZmlsZSBzZW50IGV2ZW4gd2hlbiBmbGFnIGFzIGludmFsaWQgXG4gKi9cblxuIFxuXG4oZnVuY3Rpb24oKSB7XG4ndXNlIHN0cmljdCc7XG5cbnZhciB0bXBsQXBwbGkgPSAnPGlucHV0IHR5cGU9XCJmaWxlXCIgbmFtZT1cInt7bmFtZX19LWlucHV0XCIgb25jaGFuZ2U9XCJhbmd1bGFyLmVsZW1lbnQodGhpcykuc2NvcGUoKS5VcExvYWRGaWxlKHRoaXMuZmlsZXMpXCIgYWNjZXB0PVwie3ttaW1ldHlwZX19XCIgc3R5bGU9XCJkaXNwbGF5Om5vbmVcIj4nK1xuICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJ1cGxvYWQtZmlsZVwiIG5nLWNsaWNrPVwiaW1nQ2xpY2tlZCgpXCI+JyArXG4gICAgICAgICAgICAnPGkgY2xhc3M9XCJ7e2ljb259fVwiPjwvaT4gPHNwYW4+e3tsYWJlbH19PC9zcGFuPicgK1xuICAgICAgICAgICAgJzxyYW5nZS1zbGlkZXIgbmctc2hvdz1cIiFub3NsaWRlclwiIGlkPVwie3tuYW1lfX0tc2xpZGVyXCIgYXV0b21hdGljPXRydWUgaW5pdGhvb2s9XCJTbGlkZXJJbml0Q0JcIj48L3JhbmdlLXNsaWRlcj4nICtcbiAgICAgICAgICAgICc8L2Rpdj4nO1xuICAgIFxudmFyIHRtcGxNb2RhbCA9ICc8c3BhbiBjbGFzcz1cIm1vZGFsLXRleHRcIj5VcGxvYWQgQXBwbGljYXRpb24gPGI+e3thcHBuYW1lfX08L2I+ID88L3NwYW4+JyArXG4gICAgICAgICAgICAnPGRpdj4nK1xuICAgICAgICAgICAgJzxpbWcgbmctc3JjPVwie3tpY29ufX1cIj4nICtcbiAgICAgICAgICAgICc8c3VibWl0LWJ1dHRvbiBpY29uPVwiZmkteFwiIGxhYmVsPVwiQ2FuY2VsXCIgY2xpY2tlZD1cImFiYW5kb25cIj48L3N1Ym1pdC1idXR0b24+JytcbiAgICAgICAgICAgICc8c3VibWl0LWJ1dHRvbiBpY29uPVwiZmktbGlrZVwiIGxhYmVsPVwiSW5zdGFsbFwiIGNsaWNrZWQ9XCJzdWNjZXNzXCI+PC9zdWJtaXQtYnV0dG9uPiAnICtcbiAgICAgICAgICAgICc8L2Rpdj4nO1xuICAgIFxudmFyIHRtcGxFcnJvciA9ICc8c3BhbiBjbGFzcz1cIm1vZGFsLXRleHRcIj5JbnZhbGlkIEFwcGxpY2F0aW9uIDxiPnt7YXBwbmFtZX19PC9iPiA/PC9zcGFuPicgK1xuICAgICAgICAgICAgJzxkaXY+JytcbiAgICAgICAgICAgICc8aW1nIG5nLXNyYz1cInt7aWNvbn19XCI+JyArXG4gICAgICAgICAgICAnPHN1Ym1pdC1idXR0b24gaWNvbj1cImZpLXhcIiBsYWJlbD1cIkNsb3NlXCIgY2xpY2tlZD1cImFiYW5kb25cIj48L3N1Ym1pdC1idXR0b24+JytcbiAgICAgICAgICAgICc8L2Rpdj4nO1xuICAgIFxuXG4vLyBTZXJ2aWNlIENyZWF0ZSB4Zm9ybSBpbnNlcnQgZmlsZXMgaW4gYW5kIFBvc3QgaXQgdG8gdXJsXG5mdW5jdGlvbiBMb2FkRmlsZVN2YyAoc2NvcGUsIGZpbGVzLCBmaWxlQ0IpIHtcbiAgICB2YXIgeG1sUmVxID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgdmFyIHhmb3JtICA9IG5ldyBGb3JtRGF0YSgpO1xuICAgIFxuICAgIC8vIFVwZGF0ZSBzbGlkZXIgZHVyaW5nIFVwbG9hZFxuICAgIHhtbFJlcS51cGxvYWQub25wcm9ncmVzcyA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICB2YXIgcHJvZ3Jlc3MgPSBNYXRoLnJvdW5kKGV2ZW50Lmxlbmd0aENvbXB1dGFibGUgPyBldmVudC5sb2FkZWQgKiAxMDAgLyBldmVudC50b3RhbCA6IDApO1xuICAgICAgICBpZiAoc2NvcGUuc2xpZGVyKSBzY29wZS5zbGlkZXIuc2V0VmFsdWUgKHByb2dyZXNzKTtcbiAgICB9O1xuXG4gICAgLy8gVXBsb2FkIGlzIGZpbmlzaCBsZXQncyBub3RpZnkgY29udHJvbGVyIGNhbGxiYWNrXG4gICAgeG1sUmVxLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2NvcGUuZGl2RWxlbS5hZGRDbGFzcyAoXCJzdWNjZXNzXCIpO1xuICAgICAgICBzY29wZS5kaXZFbGVtLnJlbW92ZUNsYXNzIChcImVycm9yXCIpO1xuICAgICAgICB2YXIgcmVzcG9uc2UgPXtcbiAgICAgICAgICAgIHN0YXR1cyA6IHhtbFJlcS5zdGF0dXMsXG4gICAgICAgICAgICBoZWFkZXJzOiB4bWxSZXEuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkgXG4gICAgICAgIH07XG4gICAgICAgIHNjb3BlLmNhbGxiYWNrIChyZXNwb25zZSk7XG4gICAgfTtcblxuICAgIHhtbFJlcS5vbmVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBzY29wZS5kaXZFbGVtLmFkZENsYXNzIChcImVycm9yXCIpO1xuICAgICAgICBzY29wZS5kaXZFbGVtLnJlbW92ZUNsYXNzIChcInN1Y2Nlc3NcIik7XG4gICAgfTtcblxuICAgIHhtbFJlcS5vbmFib3J0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBzY29wZS5kaXZFbGVtLmFkZENsYXNzIChcImVycm9yXCIpO1xuICAgICAgICBzY29wZS5kaXZFbGVtLnJlbW92ZUNsYXNzIChcInN1Y2Nlc3NcIik7XG4gICAgICAgIHZhciByZXNwb25zZSA9e1xuICAgICAgICAgICAgc3RhdHVzIDogeG1sUmVxLnN0YXR1cyxcbiAgICAgICAgICAgIGhlYWRlcnM6IHhtbFJlcS5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSBcbiAgICAgICAgfTtcbiAgICAgICAgc2NvcGUuY2FsbGJhY2sgKHJlc3BvbnNlKTtcbiAgICB9O1xuICAgIFxuICAgIHRoaXMucG9zdGZpbGUgPSBmdW5jdGlvbihwb3N0dXJsKSB7IFxuICAgICAgICAvLyBldmVyeXRoaW5nIGxvb2tzIE9LIGxldCdzIFBvc3QgaXRcbiAgICAgICAgeG1sUmVxLm9wZW4oXCJQT1NUXCIsIHBvc3R1cmwgLCB0cnVlKTtcbiAgICAgICAgeG1sUmVxLnNlbmQoeGZvcm0pO1xuICAgIH07XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMuZmlsZSA9IGZpbGVzW2ldO1xuICAgICAgICAvLyBVbmtub3cgVHlwZSAhISEgaWYgKCF0aGlzLmZpbGUudHlwZS5tYXRjaChzY29wZS5taW1ldHlwZSkpIGNvbnRpbnVlO1xuXG4gICAgICAgIGNvbnNvbGUubG9nIChcIlNlbGVjdGVkIGZpbGU9XCIgKyB0aGlzLmZpbGUubmFtZSArIFwiIHNpemU9XCIrIHRoaXMuZmlsZS5zaXplLzEwMjQgKyBcIiBUeXBlPVwiKyB0aGlzLmZpbGUudHlwZSk7XG4gICAgICAgIFxuICAgICAgICB0aGlzLmJhc2VuYW1lPSB0aGlzLmZpbGUubmFtZS5zcGxpdCgnLycpLnJldmVyc2UoKVswXTtcblxuICAgICAgICAvLyBGaWxlIHRvIHVwbG9hZCBpcyB0b28gYmlnXG4gICAgICAgIGlmIChpc05hTih0aGlzLmZpbGUuc2l6ZSkgfHwgdGhpcy5maWxlLnNpemUgPiBzY29wZS5tYXhzaXplKjEwMjQpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQgKGZpbGVDQiwxMDApOyAgLy8gT24gZXJyb3IgYXN5bmNocm9ub3VzIGNhbGxiYWNrIHdpdGhvdXQgYXJndW1lbnRcbiAgICAgICAgICAgIFxuICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICAvLyBJZiBGaWxlIGlzIHJlYWRhYmxlIGxldCdzIHJlYWQgaXRcbiAgICAgICAgICAgIHZhciByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgICAgICAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKHRoaXMuZmlsZSk7XG4gICAgICAgICAgICByZWFkZXIub25sb2FkID0gZmlsZUNCO1xuXG4gICAgICAgICAgICAvLyBpZiBldmVyeXRoaW5nIGlzIE9LIGxldCdzIGFkZCBmaWxlIHRvIHhmb3JtXG4gICAgICAgICAgICB4Zm9ybS5hcHBlbmQoc2NvcGUubmFtZSwgdGhpcy5maWxlLCB0aGlzLmZpbGUubmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmFuZ3VsYXIubW9kdWxlKCdVcGxvYWRGaWxlcycsWydBcHBDb25maWcnLCAnTW9kYWxOb3RpZmljYXRpb24nLCAnUmFuZ2VTbGlkZXInXSlcblxuLmRpcmVjdGl2ZSgndXBsb2FkQXBwbGknLCBbXCJBcHBDb25maWdcIiwgXCJKUWVtdVwiLCBcIk5vdGlmaWNhdGlvblwiLCBcIk1vZGFsRmFjdG9yeVwiLCBcIiR0aW1lb3V0XCIsIGZ1bmN0aW9uKEFwcENvbmZpZywgIEpRZW11LCBOb3RpZmljYXRpb24sIE1vZGFsRmFjdG9yeSwgJHRpbWVvdXQpIHtcbiAgICBmdW5jdGlvbiBteW1ldGhvZHMoc2NvcGUsIGVsZW0sIGF0dHJzKSB7XG4gICAgICAgIFxuICAgICAgICAvLyBnZXQgd2lkZ2V0IGltYWdlIGhhbmRsZSBmcm9tIHRlbXBsYXRlXG4gICAgICAgIHNjb3BlLmlucHV0RWxlbSAgPSBlbGVtLmZpbmQoJ2lucHV0Jyk7XG4gICAgICAgIHNjb3BlLmRpdkVsZW0gICAgPSBlbGVtLmZpbmQoJ2RpdicpO1xuICAgICAgICBcbiAgICAgICAgLy8gSW1hZ2Ugd2FzIGNraWNrIGxldCdzIHNpbXVsYXRlIGFuIGlucHV0IChmaWxlKSBjbGlja1xuICAgICAgICBzY29wZS5pbWdDbGlja2VkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc2NvcGUuaW5wdXRFbGVtWzBdLmNsaWNrKCk7IC8vIFdhcm5pbmcgQW5ndWxhciBUcmlnZ2VyRXZlbnQgZG9lcyBub3Qgd29yayEhIVxuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgLy8gU2xpZGVyIGNvbnRyb2wgaGFuZGxlIHJlZ2lzdHJhdGlvbiBhZnRlciBjcmVhdGlvblxuICAgICAgICBzY29wZS5TbGlkZXJJbml0Q0I9ZnVuY3Rpb24gKHNsaWRlcikge1xuICAgICAgICAgICBzY29wZS5zbGlkZXI9IHNsaWRlcjsgXG4gICAgICAgIH07XG4gICAgICAgIFxuICAgICAgICAvLyBVcGxvYWQgaXMgZGVsZWdhdGVkIHRvIGEgc2hhcmVkIGZ1bmN0aW9uXG4gICAgICAgIHNjb3BlLlVwTG9hZEZpbGU9ZnVuY3Rpb24gKGZpbGVzKSB7XG4gICAgICAgICAgICB2YXIgaGFuZGxlOyBcbiAgICAgICAgICAgIHZhciBhcHBpY29uO1xuICAgICAgICAgICAgdmFyIHRlbXBsYXRlO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgc3VjY2VzcyA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIC8vIFRoaXMgTG9va3MgT0sgbGV0J3MgUG9zdCBYZm9ybS9GaWxlXG4gICAgICAgICAgICAgICAgaGFuZGxlLnBvc3RmaWxlKGF0dHJzLnBvc3R1cmwgKyBcIj90b2tlbj1cIiArIEFwcENvbmZpZy5zZXNzaW9uLnRva2VuKTtcblxuICAgICAgICAgICAgICAgIHNjb3BlLm1vZGFsLmRlYWN0aXZhdGUoKTtcbiAgICAgICAgICAgICAgICAkdGltZW91dCAoZnVuY3Rpb24oKSB7c2NvcGUubW9kYWwuZGVzdHJveSgpO30sIDEwMDApO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIGFiYW5kb24gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBzY29wZS5tb2RhbC5kZWFjdGl2YXRlKCk7XG4gICAgICAgICAgICAgICAgJHRpbWVvdXQgKGZ1bmN0aW9uKCkge3Njb3BlLm1vZGFsLmRlc3Ryb3koKTt9LCAxMDAwKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIHJlYWRlckNCID0gZnVuY3Rpb24gKHVwbG9hZCkge1xuICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gRmlsZSB1cGxvYWQgZmFpbCBoYW5kbGUgZXJyb3JcbiAgICAgICAgICAgICAgICBpZiAoISB1cGxvYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZS5maWxlLnNpemUgPiBzY29wZS5tYXhzaXplKjEwMjQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGljb24gPSBzY29wZS5pc3Rvb2JpZztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlPSB0bXBsRXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc05hTihoYW5kbGUuZmlsZS5zaXplKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXBwaWNvbiA9IHNjb3BlLmlzbm90dmFsaWQ7IFxuICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU9IHRtcGxFcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIHppcGFwcCA9IG5ldyBKU1ppcCAodXBsb2FkLnRhcmdldC5yZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgdGh1bWJuYWlsID0gemlwYXBwLmZpbGUoXCJpY29uXzEyOC5wbmdcIik7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaXMgd2UgaGF2ZSBhIHRodW1ibmFpbCB3aXRoaW4gbG9hZGVkIFppcGZpbGVcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aHVtYm5haWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nIChcIlRoaXMgaXMgbm90IGEgdmFsaWQgQXBwbGljYXRpb24gRnJhbWV3b3JrIEFQUFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGljb24gPSBzY29wZS5pc25vdHZhbGlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU9IHRtcGxFcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9zY29wZS5pbWdFbGVtWzBdLnNyYyA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFt0aHVtYm5haWwuYXNBcnJheUJ1ZmZlcigpXSwge3R5cGU6IFwiaW1hZ2VcIn0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGljb24gPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbdGh1bWJuYWlsLmFzQXJyYXlCdWZmZXIoKV0sIHt0eXBlOiBcImltYWdlXCJ9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IHRtcGxNb2RhbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyByZWZlcmVuY2UgaHR0cDovL2ZvdW5kYXRpb24uenVyYi5jb20vYXBwcy9kb2NzLyMhL2FuZ3VsYXItbW9kdWxlc1xuICAgICAgICAgICAgICAgIHZhciBjb25maWcgPSB7XG4gICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbkluOiAnc2xpZGVJbkZyb21Ub3AnLFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50U2NvcGU6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgOiBzdWNjZXNzLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWJhbmRvbiA6IGFiYW5kb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBpY29uICAgIDogYXBwaWNvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcG5hbWUgOiBoYW5kbGUuYmFzZW5hbWVcbiAgICAgICAgICAgICAgICAgICAgfSwgdGVtcGxhdGUgOiB0ZW1wbGF0ZVxuICAgICAgICAgICAgICAgIH07IFxuICAgICAgICAgICAgICAgIC8vIFBvcHVwIE1vZGFsIHRvIHJlbmRlciBhcHBsaWNhdGlvbiBkYXRhXG4gICAgICAgICAgICAgICAgc2NvcGUubW9kYWwgPSBuZXcgTW9kYWxGYWN0b3J5KGNvbmZpZyk7XG4gICAgICAgICAgICAgICAgc2NvcGUubW9kYWwuYWN0aXZhdGUgKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBMb2FkIGZpbGUgd2l0aGluIGJyb3dzZXIgYW5kIGlmIE9LIGNhbGwgcmVhZGVyQ0JcbiAgICAgICAgICAgIGhhbmRsZSA9IG5ldyBMb2FkRmlsZVN2YyAoc2NvcGUsIGZpbGVzLCByZWFkZXJDQik7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyAoaGFuZGxlKTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBJbml0aWFsbGl6ZSBkZWZhdWx0IHZhbHVlcyBmcm9tIGF0dHJpYnV0ZXMgdmFsdWVzXG4gICAgICAgIHNjb3BlLm5hbWU9IGF0dHJzLm5hbWUgfHwgJ2FwcGxpJztcbiAgICAgICAgc2NvcGUuY2F0ZWdvcnk9IGF0dHJzLmNhdGVnb3J5ICB8fCAnYXBwbGknO1xuICAgICAgICBzY29wZS5taW1ldHlwZT0gKGF0dHJzLmFjY2VwdCB8fCAnLndndCcpO1xuICAgICAgICBzY29wZS5tYXhzaXplID0gYXR0cnMubWF4c2l6ZSB8fCAxMDAwMDA7IC8vIGRlZmF1bHQgbWF4IHNpemUgMTAwTUJcbiAgICAgICAgc2NvcGUucmVnZXhwICA9IG5ldyBSZWdFeHAgKGF0dHJzLmFjY2VwdCsgJy4qJywnaScpO1xuICAgICAgICBzY29wZS5pY29uICAgID0gYXR0cnMuaWNvbiB8fCAnZmktdXBsb2FkJztcbiAgICAgICAgc2NvcGUubGFiZWwgICA9IGF0dHJzLmxhYmVsIHx8ICdVcGxvYWQnO1xuICAgICAgICBcbiAgICAgICAgaWYgKGF0dHJzLnRodW1ibmFpbCkgc2NvcGUuaXNub3R2YWxpZD0gQXBwQ29uZmlnLnBhdGhzW3Njb3BlLmNhdGVnb3J5XSArICBhdHRycy5pc25vdHZhbGlkO1xuICAgICAgICBlbHNlICBzY29wZS5pc25vdHZhbGlkPUFwcENvbmZpZy5wYXRoc1tzY29wZS5jYXRlZ29yeV0gKyAndzNjLXdpZGdldC5wbmcnO1xuXG4gICAgICAgIGlmIChhdHRycy5pc3Rvb2JpZykgc2NvcGUuaXN0b29iaWc9IEFwcENvbmZpZy5wYXRoc1tzY29wZS5jYXRlZ29yeV0gKyAgYXR0cnMuaXN0b29iaWc7XG4gICAgICAgIGVsc2UgIHNjb3BlLmlzdG9vYmlnPUFwcENvbmZpZy5wYXRoc1tzY29wZS5jYXRlZ29yeV0gKyAnaXN0b29iaWcucG5nJztcbiAgICAgICAgc2NvcGUubm9zbGlkZXIgPSBhdHRycy5ub3NsaWRlciB8fCBmYWxzZTtcblxuICAgICAgICBpZiAoIWF0dHJzLnBvc3R1cmwpIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ZpbGUtdXBsb2FkICVzIHBvc3R1cmw9L2FwaS94eHh4L3h4eHggcmVxdWlyZWQnLCBzY29wZS5hdHRycyk7ICAgICAgICAgICAgXG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHJlc3RyaWN0OiAnRScsXG4gICAgICAgIHRlbXBsYXRlOiB0bXBsQXBwbGksXG4gICAgICAgIGxpbms6IG15bWV0aG9kcyxcbiAgICAgICAgc2NvcGU6IHtcbiAgICAgICAgICAgIGNhbGxiYWNrIDogJz0nXG4gICAgICAgIH1cbiAgICB9O1xuICAgIFxufV0pO1xuXG5jb25zb2xlLmxvZyAoXCJVcGxvYWRGaWxlIExvYWRlZFwiKTtcbn0pKCk7XG4iLCJcbi8qIFxuICogQ29weXJpZ2h0IChDKSAyMDE1IFwiSW9ULmJ6aFwiXG4gKiBBdXRob3IgXCJGdWx1cCBBciBGb2xsXCJcbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yXG4gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcbiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuLlxuICovXG5cblxuXG4oZnVuY3Rpb24oKSB7XG4ndXNlIHN0cmljdCc7XG5cbnZhciB0bXBsID0gJzx0aXAtbW9kYWwgdGlwPVwidGlwXCI+PC90aXAtbW9kYWw+JyArXG4gICAgICAgICAgICc8bGFiZWwgZm9yPVwie3tuYW1lfX0taW50ZXh0XCI+e3tsYWJlbH19IDxpIG5nLXNob3c9XCJyZXF1aXJlZFwiIG5nLWNsaWNrPVwiVG9CZURlZmluZWRcIiAnICtcbiAgICAgICAgICAgJ2NsYXNzPVwicmVxdWlyZWQge3tzdGF0dXN9fSBmaS1jaGVja2JveFwiIHRpdGxlPVwiRnJlZSBWYWx1ZSBCdXQgTWFuZGF0b3J5IEFyZ3VtZW50XCIgYWx0PVwiP1wiPiAmbmJzcDsgPC9pPjwvbGFiZWw+JysgICAgICAgICAgXG4gICAgICAgICAgICc8aW5wdXQgJytcbiAgICAgICAgICAgJyB0eXBlPVwie3t0eXBlfX1cIiBpZD1cInt7bmFtZX19LWludGV4dFwiIHBsYWNlaG9sZGVyPVwie3twbGFjZWhvbGRlcn19XCIgIGNsYXNzPVwic3RhdHVzLXt7c3RhdHVzfX1cIicrXG4gICAgICAgICAgICcgbmctbW9kZWw9XCJ2YWx1ZVwiIG5nLWJsdXI9XCJ2YWxpZGF0ZSgpXCIgbmctZm9jdXM9XCJzZWxlY3RlZCgpXCIgJytcbiAgICAgICAgICAgJyBuZy1tb2RlbC1vcHRpb25zPVwieyB1cGRhdGVPbjogXFwnZGVmYXVsdCBibHVyXFwnLCBkZWJvdW5jZToge2RlZmF1bHQ6IDUwMCwgYmx1cjogMH0gfVwiJyArXG4gICAgICAgICAgICc+PGFsZXJ0IGRhdGEtbmctc2hvdz1cIiF2YWxpZCYmZXJybXNnXCI+e3tlcnJtc2d9fTwvYWxlcnQ+JztcblxudmFyIGVtYWlscGF0ZXJuID0gL14oKFtePD4oKVtcXF1cXC4sOzpcXHNAXFxcIl0rKFxcLltePD4oKVtcXF1cXC4sOzpcXHNAXFxcIl0rKSopfChcXFwiLitcXFwiKSlAKChbXjw+KClbXFxdXFwuLDs6XFxzQFxcXCJdK1xcLikrW148PigpW1xcXVxcLiw7Olxcc0BcXFwiXXsyLH0pJC9pO1xuXG5hbmd1bGFyLm1vZHVsZSgnSW5wdXRUZXh0JyxbJ0pRdWVyeUVtdSddKVxuXG4uZGlyZWN0aXZlKCdpbnB1dFRleHQnLCBbXCJKUWVtdVwiLCBmdW5jdGlvbihKUWVtdSkge1xuICAgIGZ1bmN0aW9uIG15bWV0aG9kcyhzY29wZSwgZWxlbSwgYXR0cnMpIHtcbiAgICBcbiAgICAvLyBkZWZhdWx0IHZhbHVlIGF0IDFzdCByZW5kZXJpbmdcbiAgICBzY29wZS5lcnJvciAgPSBmYWxzZTtcbiAgICBzY29wZS52YWxpZCAgPSBmYWxzZTtcbiAgICBzY29wZS5zdGF0dXMgPSAndW50b3VjaCc7XG4gICBcbiAgICBzY29wZS5pbnB1dCA9IGVsZW0uZmluZCAoXCJpbnB1dFwiKTtcbiAgICBzY29wZS5yZXF1aXJlZCA9IDA7XG4gICAgXG4gICAgLy8gcmVxdWlyZXIgaXMgdXNlIHRvIGluY3JlbWVudCByZXF1ZXN0ZWQgY291bnRlclxuICAgIGlmIChcInJlcXVpcmVkXCIgaW4gYXR0cnMpIHtcbiAgICAgICAgc2NvcGUucmVxdWlyZWQgPSAxO1xuICAgICAgICBlbGVtLmFkZENsYXNzIChcInJlcXVpcmVkXCIpO1xuICAgIH1cbiAgICAgICBcbiAgICAgLy8gdXNlciBlbnRlciBpbnB1dCByZXNldCBlcnJvciBzdGF0dXNcbiAgICAgc2NvcGUuc2VsZWN0ZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNjb3BlLmVycm9yPWZhbHNlOyBcbiAgICAgICAgc2NvcGUuZXJybXNnPWZhbHNlOyBcbiAgICAgICAgc2NvcGUuc3RhdHVzID0gJ3RvdWNoJztcbiAgICAgfTsgICBcbiAgICAgICAgICAgIFxuICAgICBzY29wZS52YWxpZGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgIFxuICAgICAgICAgLy8gZ2V0IHZhbHVlIGZyb20gaW5wdXQgZmllbGQgYnlwYXNzaW5nIEFuZ3VsYXIgbmctbW9kZWxcbiAgICAgICAgIGNvbnNvbGUubG9nIChcIkNsaWNrZWQgSW5wdXRUZXh0IG5hbWU9JXMgdmFsdWU9JXMgdmFsaWQ9JXNcIiwgc2NvcGUubmFtZSwgc2NvcGUudmFsdWUsIHNjb3BlLnZhbGlkKTsgICAgICAgIFxuXG4gICAgICAgICAvLyBmb3JtIGlzIG5vdCB1bnRvdWNoZWQgYW55bW9yZVxuICAgICAgICAgc2NvcGUucGFyZW50LnJlbW92ZUNsYXNzIChcIm5nLXByaXN0aW5lXCIpO1xuXG4gICAgICAgICAvLyBpZiB2YWx1ZSBub3QgbnVsbCBjbGVhbiB1cCBzdHJpbmdcbiAgICAgICAgIGlmIChzY29wZS52YWx1ZSkge1xuICAgICAgICAgICAgIHNjb3BlLmVycm9yPWZhbHNlOyBcbiAgICAgICAgICAgIC8vIHJlbW92ZSBsZWFkaW5nIGFuZCB0cmFpbGxpbmcgc3BhY2VcbiAgICAgICAgICAgIHNjb3BlLnZhbHVlID0gc2NvcGUudmFsdWUudHJpbSgpO1xuICAgICAgICAgXG4gICAgICAgICAgICAvLyByZW1vdmUgYW55IHNwYWNlIGlzIG5vdCBhbGxvd2VkXG4gICAgICAgICAgICBpZiAoJ25vc3BhY2UnIGluIGF0dHJzKSB7XG4gICAgICAgICAgICAgICBzY29wZS52YWx1ZT1zY29wZS52YWx1ZS5yZXBsYWNlKC9cXHMvZywgJycpOyAgICBcbiAgICAgICAgICAgIH1cbiAgICAgICAgIFxuICAgICAgICAgICAgaWYgKCdsb3dlcmNhc2UnIGluIGF0dHJzKSB7XG4gICAgICAgICAgICAgICBzY29wZS52YWx1ZSA9IHNjb3BlLnZhbHVlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICBcbiAgICAgICAgICAgIC8vIGNoZWNrIG1pbmltdW0gbGVuZ2h0XG4gICAgICAgICAgICBpZiAoXCJtaW5sZW5cIiBpbiBhdHRycykge1xuICAgICAgICAgICAgICBpZiAoc2NvcGUudmFsdWUubGVuZ3RoIDwgYXR0cnMubWlubGVuKSB7XG4gICAgICAgICAgICAgICAgIHNjb3BlLnN0YXR1cz0naW52YWxpZCc7XG4gICAgICAgICAgICAgICAgIHNjb3BlLmVycm1zZz1zY29wZS5uYW1lICsgJzogTWluaW51bSBMZW5naD0gJyArIGF0dHJzLm1pbmxlbiArICcgQ2hhcmFjdGVycyc7XG4gICAgICAgICAgICAgICAgIHNjb3BlLmVycm9yPXRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKCdlbWFpbCcgaW4gYXR0cnMpIHtcbiAgICAgICAgICAgIGlmICghZW1haWxwYXRlcm4udGVzdCAoc2NvcGUudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgc2NvcGUuc3RhdHVzPSdpbnZhbGlkJztcbiAgICAgICAgICAgICAgICBzY29wZS5lcnJtc2c9J2ludmFsaWQgZW1haWwgYWRkcmVzcyc7XG4gICAgICAgICAgICAgICAgc2NvcGUuZXJyb3I9dHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgIH1cbiAgICAgICAgIFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHNjb3BlLnJlcXVpcmVkKSB7XG4gICAgICAgICAgICAgICAgIHNjb3BlLnN0YXR1cz0naW52YWxpZCc7XG4gICAgICAgICAgICAgICAgIHNjb3BlLmVycm1zZz1zY29wZS5uYW1lICsgJzogUmVxdWlyZWQgQXR0cmlidXRlJztcbiAgICAgICAgICAgICAgICAgc2NvcGUuZXJyb3I9dHJ1ZTsgXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgLy8gSWYgbG9jYWwgY29udHJvbCBmYWlsIGxldCdzIHJlZnVzZSBpbnB1dFxuICAgICAgICAgaWYgKHNjb3BlLmVycm9yKSB7XG4gICAgICAgICAgICAgaWYgKHNjb3BlLnJlcXVpcmVkICYmIHNjb3BlLnZhbGlkKSB7XG4gICAgICAgICAgICAgICAgIHNjb3BlLnZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgIGlmIChzY29wZS5sNGFjb3VudGVyLnZhbGlkYXRlZCA+IDApIHNjb3BlLmw0YWNvdW50ZXIudmFsaWRhdGVkIC0tO1xuICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgLy8gdXNlIGNhbGwgdG8gdXBkYXRlIGZvcm0gc2NvcGUgb24gZm9ybSBjb21wbGV0ZW5lc3NcbiAgICAgICAgICAgICBzY29wZS5jYWxsYmFjayAoYXR0cnMubmFtZSwgbnVsbCwgc2NvcGUuZG9uZSk7XG4gICAgICAgICB9IGVsc2UgeyBcbiAgICAgICAgICAgICAvLyBsb2NhbGNoZWNrIGlzIE9LIGJhY2t1cCBtYXkgbmV2ZXJ0aGVsZXNzIGNoYW5nZSBzdGF0dXMgdG8gZmFsc2VcbiAgICAgICAgICAgIGlmIChzY29wZS5yZXF1aXJlZCAgJiYgIXNjb3BlLnZhbGlkKSBzY29wZS5sNGFjb3VudGVyLnZhbGlkYXRlZCArKztcbiAgICAgICAgICAgIHNjb3BlLnN0YXR1cz0ndmFsaWQnO1xuICAgICAgICAgICAgc2NvcGUudmFsaWQ9dHJ1ZTtcbiAgICAgICAgICAgIHNjb3BlLmNhbGxiYWNrIChhdHRycy5uYW1lLCBzY29wZS52YWx1ZSwgc2NvcGUuZG9uZSk7XG4gICAgICAgICB9XG4gICAgICAgICAgXG4gICAgIH07XG4gICAgIFxuICAgICAvLyB0aGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIGZyb20gY29udHJvbGxlciB0byB1cGRhdGUgd2lkZ2V0IHN0YXR1c1xuICAgICBzY29wZS5kb25lPWZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgY29uc29sZS5sb2cgKFwiVGV4dC1JbnB1dCBDYWxsYmFjayBJRD1cIisgYXR0cnMubmFtZSArIFwiIGRhdGE9XCIsIGRhdGEpO1xuICAgICAgIGZvciAodmFyIGkgaW4gZGF0YSkgc2NvcGVbaV0gPSBkYXRhW2ldOyAgICAgICAgIFxuICAgICB9O1xuICAgICBcbiAgICAgLy8gRXhwb3J0IHNvbWUgYXR0cmlidXRlcyB3aXRoaW4gZGlyZWN0aXZlIHNjb3BlIGZvciB0ZW1wbGF0ZVxuICAgICBzY29wZS5sYWJlbCAgICAgICA9IGF0dHJzLmxhYmVsO1xuICAgICBzY29wZS5uYW1lICAgICAgICA9IGF0dHJzLm5hbWU7XG4gICAgIHNjb3BlLnBsYWNlaG9sZGVyID0gYXR0cnMucGxhY2Vob2xkZXI7XG4gICAgIHNjb3BlLnR5cGUgICAgICAgID0gYXR0cnMudHlwZSB8fCBcInRleHRcIjtcbiAgICAgc2NvcGUudGlwICAgICAgICAgPSBhdHRycy50aXA7XG5cbiAgICAgLy8gc2VhcmNoIGZvciBmb3JtIHdpdGhpbiBwYXJlbnQgZWxlbW50c1xuICAgICBzY29wZS5wYXJlbnQgPSBKUWVtdS5wYXJlbnQgKGVsZW0sIFwiRk9STVwiKTtcblxuICAgICAvLyBlbWFpbCBlbmZvcmNlIGxvd2VyY2FzZSBhbmQgbm9zcGFjZSAgIFxuICAgICBpZiAoXCJlbWFpbFwiIGluIGF0dHJzKSB7XG4gICAgICAgIGF0dHJzLmxvd2VyY2FzZT10cnVlOyBcbiAgICAgICAgYXR0cnMubm9zcGFjZT10cnVlOyBcbiAgICAgICAgYXR0cnMubWlubGVuPTY7IFxuICAgICB9XG5cbiAgICAgaWYgKHNjb3BlLnJlcXVpcmVkKSB7XG4gICAgICAgICBzY29wZS5sNGFjb3VudGVyID0gc2NvcGUucGFyZW50LmRhdGEgKFwibDRhY291bnRlclwiKTtcbiAgICAgICAgIGlmICghc2NvcGUubDRhY291bnRlcikgeyBcbiAgICAgICAgICAgIHNjb3BlLmw0YWNvdW50ZXIgPSAge3JlcXVpcmVkOjEsIHZhbGlkYXRlZDowfTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRmllbGQgXCIrc2NvcGUubmFtZStcIiBpcyByZXF1aXJlZCAoMXN0KVwiKTtcbiAgICAgICAgICAgIHNjb3BlLnBhcmVudC5kYXRhIChcImw0YWNvdW50ZXJcIiwgc2NvcGUubDRhY291bnRlcik7IFxuICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkZpZWxkIFwiK3Njb3BlLm5hbWUrXCIgaXMgcmVxdWlyZWRcIik7XG4gICAgICAgICAgICAgc2NvcGUubDRhY291bnRlci5yZXF1aXJlZCArKztcbiAgICAgICAgIH1cbiAgICAgfVxuICAgICAgICAgXG4gICAgIC8vIHJlZnJlc2ggdmFsaWRhdGlvbiBlYWNoIHRpbWUgY29udHJvbGVyIHVwZGF0ZSB2YWx1ZVxuICAgICBzY29wZS4kd2F0Y2ggKCd2YWx1ZScsIGZ1bmN0aW9uKCl7XG4gICAgICAgICBpZihzY29wZS52YWx1ZSkgc2NvcGUudmFsaWRhdGUoKTsgfVxuICAgICApO1xuICAgIFxuICAgIH1cbiAgICBcbiAgICByZXR1cm4ge1xuICAgICAgICByZXN0cmljdDogJ0UnLFxuICAgICAgICB0ZW1wbGF0ZTogdG1wbCxcbiAgICAgICAgbGluazogbXltZXRob2RzLFxuICAgICAgICBzY29wZToge1xuICAgICAgICAgICAgY2FsbGJhY2sgOiAnPScsXG4gICAgICAgICAgICB2YWx1ZTogJz0nXG4gICAgICAgIH1cbiAgICB9O1xufV0pO1xuXG5jb25zb2xlLmxvZyAoXCJJbnB1dFRleHQgTG9hZGVkXCIpO1xufSkoKTtcbiIsIi8qIFxuICogQ29weXJpZ2h0IChDKSAyMDE1IFwiSW9ULmJ6aFwiXG4gKiBBdXRob3IgXCJGdWx1cCBBciBGb2xsXCJcbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yXG4gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcbiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4gKi9cblxuKGZ1bmN0aW9uKCkge1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgdG1wbCA9ICc8aW5wdXQtdGV4dCAgY2xhc3M9XCJwYXNzd29yZFwiIHRpcD1cInt7dGlwMX19XCIgIHBsYWNlaG9sZGVyPVwie3twbGFjZTF9fVwiJyArXG4gICAgICAgICAgICdsYWJlbD1cInt7bGFiZWwxfX1cIiBjYWxsYmFjaz1cInZhbGlkMVwiIG5hbWU9XCJ7e25hbWV9fS0xXCIgdmFsdWU9XCJwYXNzMVwiIHJlcXVpcmVkIG1pbmxlbj1cInt7bWlubGVufX1cIiB0eXBlPVwicGFzc3dvcmRcIiA+JyArXG4gICAgICAgICAgICc8L2lucHV0LXRleHQ+JyArIFxuICAgICAgICAgICAnPGlucHV0LXRleHQgIGNsYXNzPVwicGFzc3dvcmRcIiB0aXA9XCJ0aXAyXCIgIHBsYWNlaG9sZGVyPVwie3twbGFjZTJ9fVwiJyArXG4gICAgICAgICAgICdsYWJlbD1cInt7bGFiZWwyfX1cIiBjYWxsYmFjaz1cInZhbGlkMlwiIG5hbWU9XCJ7e25hbWV9fS0yXCIgdmFsdWU9XCJwYXNzMlwiIHJlcXVpcmVkIG1pbmxlbj1cInt7bWlubGVufX1cIiB0eXBlPVwicGFzc3dvcmRcIiA+ICcrXG4gICAgICAgICAgICc8L2lucHV0LXRleHQ+JztcblxuYW5ndWxhci5tb2R1bGUoJ0lucHV0UGFzc3dvcmQnLFtdKVxuXG4uZGlyZWN0aXZlKCdpbnB1dFBhc3N3b3JkJywgZnVuY3Rpb24oKSB7XG4gICAgZnVuY3Rpb24gbXltZXRob2RzKHNjb3BlLCBlbGVtLCBhdHRycykge1xuICAgIFxuICAgIHNjb3BlLnZhbGlkMSA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgICAgICBjb25zb2xlLmxvZyAoXCJDbGlja2VkIElucHV0UGFzc3dvcmQxIG5hbWU9JXMgdmFsdWU9JXNcIiwgbmFtZSwgdmFsdWUpOyAgICAgICAgXG4gICAgICAgIHNjb3BlLmZpcnN0cHdkID0gdmFsdWU7XG4gICAgfTtcbiAgICBcbiAgICBzY29wZS52YWxpZDIgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUsIGRvbmUpIHsgICAgICAgIFxuICAgICAgICBjb25zb2xlLmxvZyAoXCJDbGlja2VkIElucHV0UGFzc3dvcmQyIG5hbWU9JXMgdmFsdWU9JXNcIiwgbmFtZSwgdmFsdWUpOyAgICAgICAgXG4gICAgICAgIFxuICAgICAgICAvLyBpZiBib3RoIHBhc3N3ZCBlcXVhbCB0aGVuIGNhbGwgZm9ybSBDQlxuICAgICAgICBpZiAoc2NvcGUuZmlyc3Rwd2QgIT09IHZhbHVlKSB7XG4gICAgICAgICAgZG9uZSh7dmFsaWQ6IGZhbHNlLCBzdGF0dXM6ICdpbnZhbGlkJywgZXJybXNnOiBcImJvdGggcGFzc3dvcmQgc2hvdWxkIG1hdGNoXCJ9KTsgIFxuICAgICAgICB9IGVsc2UgeyAgXG4gICAgICAgICAgc2NvcGUuY2FsbGJhY2sgKGF0dHJzLm5hbWUsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgXG4gICAgIH07XG4gICAgIFxuICAgICAvLyB0aGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIGZyb20gY29udHJvbGxlciB0byB1cGRhdGUgd2lkZ2V0IHN0YXR1c1xuICAgICBzY29wZS5kb25lPWZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgY29uc29sZS5sb2cgKFwiVGV4dC1JbnB1dCBDYWxsYmFjayBJRD1cIisgYXR0cnMubmFtZSArIFwiIGRhdGE9XCIsIGRhdGEpO1xuICAgICAgIGZvciAodmFyIGkgaW4gZGF0YSkgc2NvcGVbaV0gPSBkYXRhW2ldOyAgICAgICAgIFxuICAgICB9O1xuICAgICBcbiAgICAgLy8gRXhwb3J0IHNvbWUgYXR0cmlidXRlcyB3aXRoaW4gZGlyZWN0aXZlIHNjb3BlIGZvciB0ZW1wbGF0ZVxuICAgICBzY29wZS5uYW1lICAgPSBhdHRycy5uYW1lO1xuICAgICBzY29wZS5sYWJlbDEgPSBhdHRycy5sYWJlbCB8fCAnUGFzc3dvcmQnO1xuICAgICBzY29wZS5sYWJlbDIgPSBhdHRycy5sYWJlbCB8fCAnUGFzc3dvcmQgVmVyaWZpY2F0aW9uJztcbiAgICAgc2NvcGUucGxhY2UxID0gYXR0cnMucGxhY2Vob2xkZXIxIHx8ICdVc2VyIFBhc3N3b3JkJztcbiAgICAgc2NvcGUudGlwMSAgID0gYXR0cnMudGlwIHx8ICdDaG9vc2UgYSBQYXNzd29yZCc7XG4gICAgIHNjb3BlLnBsYWNlMiA9IGF0dHJzLnBsYWNlaG9sZGVyMSB8fCAnUGFzc3dvcmQgVmVyaWZpY2F0aW9uJztcbiAgICAgc2NvcGUudGlwMiAgID0gYXR0cnMudGlwICAgIHx8ICdDb25maXJtZSB5b3VyIFBhc3N3b3JkJztcbiAgICAgc2NvcGUubWlubGVuID0gYXR0cnMubWlubGVuIHx8IDEwO1xuICAgICBcbiAgICAgaWYgKFwicmVxdWlyZWRcIiBpbiBhdHRycykgc2NvcGUucmVxdWlyZWQgPSAncmVxdWlyZWQnO1xuICAgICAgICAgXG4gICAgfVxuICAgIFxuICAgIHJldHVybiB7XG4gICAgICAgIHJlc3RyaWN0OiAnRScsXG4gICAgICAgIHRlbXBsYXRlOiB0bXBsLFxuICAgICAgICBsaW5rOiBteW1ldGhvZHMsXG4gICAgICAgIHNjb3BlOiB7XG4gICAgICAgICAgICBjYWxsYmFjayA6ICc9JyxcbiAgICAgICAgfVxuICAgIH07XG59KTtcblxuY29uc29sZS5sb2cgKFwiSW5wdXRQYXNzd29yZCBMb2FkZWRcIik7XG59KSgpO1xuIiwiLyogXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUgXCJJb1QuYnpoXCJcbiAqIEF1dGhvciBcIkZ1bHVwIEFyIEZvbGxcIlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uXG4gKiBcbiAqIEJ1Z3M6IElucHV0IHdpdGggQ2FsbGJhY2sgU0hPVUxEIEJFIGdldCAncmVxdWlyZWQnIGNsYXNzXG4gKi9cblxuKGZ1bmN0aW9uICgpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICB2YXIgdG1wbCA9ICc8ZGl2ICBuZy1jbGljaz1cImNsaWNrZWQoKVwiPicgK1xuICAgICAgICAgICAgJzxpIGNsYXNzPVwie3tpY29ufX1cIj48L2k+JyArXG4gICAgICAgICAgICAnPHNwYW4+e3tsYWJlbH19PC9zcGFuPicgK1xuICAgICAgICAgICAgJzwvZGl2Pic7XG5cbiAgICBhbmd1bGFyLm1vZHVsZSgnU3VibWl0QnV0dG9uJywgW10pXG4gICAgICAgICAgICAuZGlyZWN0aXZlKCdzdWJtaXRCdXR0b24nLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBteW1ldGhvZHMoc2NvcGUsIGVsZW0sIGF0dHJzKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gYWp1c3QgaWNvbiBvciB1c2UgZGVmYXVsdFxuICAgICAgICAgICAgICAgICAgICBzY29wZS5pY29uID0gYXR0cnMuaWNvbiB8fCAnZmktZm9vdCc7XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLmxhYmVsID0gYXR0cnMubGFiZWwgfHwgJ05leHQnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgLy8gYWRkIGxhYmVsIGFzIGNsYXNzXG4gICAgICAgICAgICAgICAgICAgIGVsZW0uYWRkQ2xhc3MgKHNjb3BlLmxhYmVsLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgLy8gbm90ZTogY2xpY2tlZCBpbiBpbXBvcnRlZCBhbmQgd2hlbiB0ZW1wbGF0ZSBpcyBjbGlja2VkXG4gICAgICAgICAgICAgICAgICAgIC8vIGl0IHdpbGwgY2FsbCBjbGlja2VkIG1ldGhvZCBwYXNzZWQgaW4gcGFyYW0uXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0OiAnRScsXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiB0bXBsLFxuICAgICAgICAgICAgICAgICAgICBsaW5rOiBteW1ldGhvZHMsXG4gICAgICAgICAgICAgICAgICAgIHNjb3BlOiB7Y2xpY2tlZCA6ICc9J31cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG59KSgpO1xuIiwiLyogXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUgXCJJb1QuYnpoXCJcbiAqIEF1dGhvciBcIkZ1bHVwIEFyIEZvbGxcIlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uXG4gKiBcbiAqIEJ1Z3M6IElucHV0IHdpdGggQ2FsbGJhY2sgU0hPVUxEIEJFIGdldCAncmVxdWlyZWQnIGNsYXNzXG4gKi9cblxuKGZ1bmN0aW9uICgpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICB2YXIgdG1wbEFwcGxpID0gJzxkaXYgIG5nLWNsaWNrPVwiY2xpY2tlZCgpXCI+JyArXG4gICAgICAgICAgICAnPGltZyBuZy1zcmM9XCJ7e2ljb259fVwiPicgK1xuICAgICAgICAgICAgJzxzcGFuPnt7bGFiZWx9fTwvc3Bhbj4nICtcbiAgICAgICAgICAgICc8L2Rpdj4nO1xuICAgIFxuICAgIHZhciB0bXBsTW9kYWwgPSBcbiAgICAgICAgICAgICc8YiBjbGFzcz1cImNsb3NlLWJ1dHRvblwiIG5nLWNsaWNrPVwiY2xvc2UoKVwiPsOXPC9iPicgK1xuICAgICAgICAgICAgJzxpbWcgbmctc3JjPVwie3tpY29ufX1cIj4nICtcbiAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cIm1vZGFsLXRleHRcIj5BcHBsaWNhdGlvbiA8Yj57e2xhYmVsfX08L2I+PC9zcGFuPicgK1xuICAgICAgICAgICAgJzx1bCBjbGFzcz1cInZlcnRpY2FsIGljb24tbGVmdCBwcmltYXJ5IG1lbnUtYmFyIGFwcGxpLW1lbnUtc3RhcnRcIj4nICtcbiAgICAgICAgICAgICc8bGkgY2xhc3M9c3RhcnQte3tydW5zdGF0dXN9fT48YSBuZy1jbGljaz1hY3Rpb24oXCJzdGFydFwiKT48aSBjbGFzcz1cImZpLWNoZWNrXCI+IFN0YXJ0PC9pPjwvYT48L2xpPicgK1xuICAgICAgICAgICAgJzxsaSBjbGFzcz1zdG9wLXt7cnVuc3RhdHVzfX0+PGEgbmctY2xpY2s9YWN0aW9uKFwic3RvcFwiKT48aSBjbGFzcz1cImZpLXhcIj4gU3RvcDwvaT48L2E+PC9saT4nICtcbiAgICAgICAgICAgICc8bGk+PGEgbmctY2xpY2s9YWN0aW9uKFwiaW5mb1wiKT48aSBjbGFzcz1cImZpLWluZm9cIj4gSW5mbzwvaT48L2E+PC9saT4nICtcbiAgICAgICAgICAgICc8bGkgY2xhc3M9c3RhcnQte3tydW5zdGF0dXN9fT48YSBuZy1jbGljaz1hY3Rpb24oXCJ1bmluc3RhbGxcIik+PGkgY2xhc3M9XCJmaS14XCI+IFVuaW5zdGFsbDwvaT48L2E+PC9saT4nICtcbiAgICAgICAgICAgICc8L3VsPicgK1xuICAgICAgICAgICAgJyc7XG4gICAgXG4gICAgdmFyIHRtcGxEZXRhaWwgPSBcbiAgICAgICAgICAgICc8YiBjbGFzcz1cImNsb3NlLWJ1dHRvblwiIG5nLWNsaWNrPVwiY2xvc2UoKVwiPsOXPC9iPicgK1xuICAgICAgICAgICAgJzxpbWcgbmctc3JjPVwie3tpY29ufX1cIj4nICtcbiAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cIm1vZGFsLXRleHRcIj5BcHBsaWNhdGlvbiA8Yj57e2xhYmVsfX08L2I+PC9zcGFuPicgK1xuICAgICAgICAgICAgJzx1bCBjbGFzcz1cInZlcnRpY2FsIGljb24tbGVmdCBhcHBsaS1tZW51LWluZm9cIj4nICtcbiAgICAgICAgICAgICc8bGk+PGkgY2xhc3M9XCJmaS1wYXBlcmNsaXBcIj4gTmFtZSA6IHt7ZGV0YWlsLm5hbWV9fSA8L2k+PC9saT4nICtcbiAgICAgICAgICAgICc8bGk+PGkgY2xhc3M9XCJmaS1pbmZvXCI+IERlc2NyaXB0aW9uIHt7ZGV0YWlsLmRlc2NyaXB0aW9ufX08L2k+PC9saT4nICtcbiAgICAgICAgICAgICc8bGk+PGkgY2xhc3M9XCJmaS10b3Jzb1wiPiBBdXRob3IgOiB7e2RldGFpbC5hdXRob3J9fTwvaT48L2xpPicgK1xuICAgICAgICAgICAgJzwvdWw+JyArXG4gICAgICAgICAgICAnJztcblxuICAgIGFuZ3VsYXIubW9kdWxlKCdBcHBsaUJ1dHRvbicsIFtdKVxuICAgICAgICAgICAgLmRpcmVjdGl2ZSgnYXBwbGlCdXR0b24nLCBbXCJBcHBDb25maWdcIiwgXCJBcHBDYWxsXCIsIFwiTW9kYWxGYWN0b3J5XCIsIFwiTm90aWZpY2F0aW9uXCIsIFwiJHRpbWVvdXRcIiwgXCIkd2luZG93XCIsIFwiJGxvY2F0aW9uXCIsIFwidXJscXVlcnlcIiwgZnVuY3Rpb24gKEFwcENvbmZpZywgQXBwQ2FsbCwgTW9kYWxGYWN0b3J5LCBOb3RpZmljYXRpb24sICR0aW1lb3V0LCAkd2luZG93LCAkbG9jYXRpb24sIHVybHF1ZXJ5KSB7XG5cbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBteW1ldGhvZHMoc2NvcGUsIGVsZW0sIGF0dHJzKSB7XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLnJ1bnN0YXR1cyA9IFwic3RvcFwiO1xuICAgICAgICAgICAgICAgICAgICBzY29wZS5ydW5tb2RlICAgPSB1cmxxdWVyeS5ydW5tb2RlIHx8IFwiYXV0b1wiO1xuICAgICAgICAgICAgICAgICAgICBzY29wZS5jbGlja2VkID0gZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbm90aWZ5RXJyb3IgPSBmdW5jdGlvbihhY3Rpb24sIHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uLmVycm9yICh7bWVzc2FnZTogXCJGYWlsIC9hcGkvYWZtLW1haW5cIiArIGFjdGlvbiArIFwiPVwiICsgc2NvcGUubGFiZWwgKyBcIiBSdW5JRD1cIisgc2NvcGUuYXBwSUQsIGRlbGF5OiA1MDAwfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbS5hZGRDbGFzcyAoXCJmYWlsXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0ucmVtb3ZlQ2xhc3MgKFwic3VjY2Vzc1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29wZS5jYWxsYmFjayAoc2NvcGUuYXBwSUQsIGFjdGlvbiwgcmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5vdGlmeVN1Y2Nlc3MgPSBmdW5jdGlvbiAoYWN0aW9uLCByZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0ucmVtb3ZlQ2xhc3MgKFwiZmFpbFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29wZS5ydW5JRCA9IHJlc3BvbnNlLmRhdGEucmVzcG9uc2UucnVuaWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUuY2FsbGJhY2sgKHNjb3BlLmFwcElELCBhY3Rpb24sIHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjbG9zZU1vZEFwcCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLm1vZEFwcC5kZWFjdGl2YXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRpbWVvdXQgKGZ1bmN0aW9uKCkge3Njb3BlLm1vZEFwcC5kZXN0cm95KCk7fSwgMTAwMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2xvc2VNb2RJbmZvID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUubW9kSW5mby5kZWFjdGl2YXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRpbWVvdXQgKGZ1bmN0aW9uKCkge3Njb3BlLm1vZEluZm8uZGVzdHJveSgpO30sIDEwMDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFjdGlvbk1vZGFsID0gZnVuY3Rpb24oYWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cgKFwiTW9kYWwgQWN0aW9uPSVzXCIsIGFjdGlvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJzdGFydFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3BlLnJ1bnN0YXR1cyAhPT0gXCJzdG9wXCIpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwcENhbGwuZ2V0IChcImFmbS1tYWluXCIsIFwic3RhcnRcIiwge2lkOiBzY29wZS5hcHBJRCwgbW9kZTogc2NvcGUucnVubW9kZX0sIGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyAhPT0gMjAwIHx8IHJlc3BvbnNlLmRhdGEuanR5cGUgIT09IFwiYWZiLXJlcGx5XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5RXJyb3IgKFwic3RhcnRcIiwgcmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLnJ1bnN0YXR1cz1cInN0YXJ0XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5U3VjY2VzcyAoYWN0aW9uLCByZXNwb25zZSk7XG5cdFx0XHRcdFx0aWYocmVzcG9uc2UuZGF0YS5yZXNwb25zZS51cmkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLndpbmFwcD0gJHdpbmRvdy5vcGVuKHJlc3BvbnNlLmRhdGEucmVzcG9uc2UudXJpLnJlcGxhY2UoXCIlaFwiLCAkbG9jYXRpb24uaG9zdCgpKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInN0b3BcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzY29wZS5ydW5zdGF0dXMgIT09IFwic3RhcnRcIikgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcHBDYWxsLmdldCAoXCJhZm0tbWFpblwiLCBcInRlcm1pbmF0ZVwiLCB7cnVuaWQ6IHNjb3BlLnJ1bklEfSwgZnVuY3Rpb24ocmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzICE9PSAyMDAgfHwgcmVzcG9uc2UuZGF0YS5qdHlwZSAhPT0gXCJhZmItcmVwbHlcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlFcnJvciAoXCJzdG9wXCIsIHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29wZS5ydW5zdGF0dXM9XCJzdG9wXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgYSByZW1vdGUgd2luZG93IGFwcCB3YXMgb3BlbiBsZXQncyBjbG9zZSBpdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzY29wZS53aW5hcHApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyAoXCJDbG9zaW5nIEFwcGxpY2F0aW9uIFdpbmRvdyBsYWJlbD0lcyBpZD0lc1wiLCBzY29wZS5sYWJlbCwgc2NvcGUuYXBwSUQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLndpbmFwcC5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLndpbmFwcD1mYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5U3VjY2VzcyAoYWN0aW9uLCByZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiaW5mb1wiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBwQ2FsbC5nZXQgKFwiYWZtLW1haW5cIiwgXCJkZXRhaWxcIiwge2lkOiBzY29wZS5hcHBJRH0sIGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyAhPT0gMjAwIHx8IHJlc3BvbnNlLmRhdGEuanR5cGUgIT09IFwiYWZiLXJlcGx5XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5RXJyb3IgKFwiZGV0YWlsXCIsIHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWZlcmVuY2UgaHR0cDovL2ZvdW5kYXRpb24uenVyYi5jb20vYXBwcy9kb2NzLyMhL2FuZ3VsYXItbW9kdWxlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb25maWcgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbkluOiAnc2xpZGVJbkZyb21Ub3AnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50U2NvcGU6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlICAgOiBjbG9zZU1vZEluZm8sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uICAgIDogc2NvcGUuaWNvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsICAgOiBzY29wZS5hcHBJRCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbCAgOiByZXNwb25zZS5kYXRhLnJlc3BvbnNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRlbXBsYXRlIDogdG1wbERldGFpbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBvcHVwIE1vZGFsIHRvIHJlbmRlciBhcHBsaWNhdGlvbiBkYXRhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUubW9kSW5mbyA9IG5ldyBNb2RhbEZhY3RvcnkoY29uZmlnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29wZS5tb2RJbmZvLmFjdGl2YXRlICgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ1bmluc3RhbGxcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzY29wZS5ydW5zdGF0dXMgIT09IFwic3RvcFwiKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcHBDYWxsLmdldCAoXCJhZm0tbWFpblwiLCBcInVuaW5zdGFsbFwiLCB7aWQ6IHNjb3BlLmFwcElEfSwgZnVuY3Rpb24ocmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzICE9PSAyMDAgfHwgcmVzcG9uc2UuZGF0YS5qdHlwZSAhPT0gXCJhZmItcmVwbHlcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlFcnJvciAoXCJ1bmluc3RhbGxcIiwgcmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeVN1Y2Nlc3MgKGFjdGlvbiwgcmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cgKFwiQWN0aW9uTW9kYWwgdW5rbm93biBhY3Rpb249WyVzXVwiLCBhY3Rpb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlTW9kQXBwKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZWZlcmVuY2UgaHR0cDovL2ZvdW5kYXRpb24uenVyYi5jb20vYXBwcy9kb2NzLyMhL2FuZ3VsYXItbW9kdWxlc1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbmZpZyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRpb25JbjogJ3NsaWRlSW5Gcm9tVG9wJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50U2NvcGU6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uICAgOiBhY3Rpb25Nb2RhbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuc3RhdHVzOiBzY29wZS5ydW5zdGF0dXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlICAgIDogY2xvc2VNb2RBcHAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb24gICAgIDogc2NvcGUuaWNvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgICAgOiBzY29wZS5sYWJlbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRlbXBsYXRlICA6IHRtcGxNb2RhbFxuICAgICAgICAgICAgICAgICAgICAgICAgfTsgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBQb3B1cCBNb2RhbCB0byByZW5kZXIgYXBwbGljYXRpb24gZGF0YVxuICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUubW9kQXBwID0gbmV3IE1vZGFsRmFjdG9yeShjb25maWcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUubW9kQXBwLmFjdGl2YXRlICgpO1xuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIGV4dHJhY3QgYXBwbGljYXRpb24gaW5mb3JtYXRpb24gZnJvbSBBcHBJRCtTdG9yZVxuICAgICAgICAgICAgICAgICAgICBpZiAoYXR0cnMuaGFuZGxlICYmIHNjb3BlLnN0b3JlIFthdHRycy5oYW5kbGVdLm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLmljb24gID0gQXBwQ29uZmlnLnBhdGhzLmljb25zICsgYXR0cnMuaGFuZGxlOyAvL3Njb3BlLnN0b3JlIFthdHRycy5oYW5kbGVdLm5hbWUudG9Mb3dlckNhc2UoKSArICctaWNvLnBuZyc7XG4gICAgICAgICAgICAgICAgICAgICAgICBzY29wZS5sYWJlbCA9IHNjb3BlLnN0b3JlIFthdHRycy5oYW5kbGVdLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBzY29wZS5hcHBJRD0gYXR0cnMuaGFuZGxlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLmljb24gID0gQXBwQ29uZmlnLnBhdGhzLmljb25zICsgJ3czYy1pY28ucG5nJztcbiAgICAgICAgICAgICAgICAgICAgICAgICBzY29wZS5sYWJlbCA9IGF0dHJzLmhhbmRsZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgLy8gYWRkIGxhYmVsIGFzIGNsYXNzXG4gICAgICAgICAgICAgICAgICAgIGVsZW0uYWRkQ2xhc3MgKHNjb3BlLmxhYmVsLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgLy8gbm90ZTogY2xpY2tlZCBpbiBpbXBvcnRlZCBhbmQgd2hlbiB0ZW1wbGF0ZSBpcyBjbGlja2VkXG4gICAgICAgICAgICAgICAgICAgIC8vIGl0IHdpbGwgY2FsbCBjbGlja2VkIG1ldGhvZCBwYXNzZWQgaW4gcGFyYW0uXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0OiAnRScsXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiB0bXBsQXBwbGksXG4gICAgICAgICAgICAgICAgICAgIGxpbms6IG15bWV0aG9kcyxcbiAgICAgICAgICAgICAgICAgICAgc2NvcGU6IHtjYWxsYmFjazogJz0nLCBzdG9yZTogJz0nfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XSk7XG59KSgpO1xuIiwiKGZ1bmN0aW9uKCkge1xuJ3VzZSBzdHJpY3QnO1xuXG4vLyBXQVJOSU5HOiBtYWtlIHN1cmUgdGhhbiBhcHAvZnJvbnRlbmQvc2VydmljZXMvQXBwQ29uZmlnLmpzIG1hdGNoIHlvdXIgc2VydmVyXG5cbi8vIGxpc3QgYWxsIHJlcGVuZGVuY2llcyB3aXRoaW4gdGhlIHBhZ2UgKyBjb250cm9sZXIgaWYgbmVlZGVkXG5hbmd1bGFyLm1vZHVsZSgnRGFzaGJvYXJkTW9kdWxlJywgWydTdWJtaXRCdXR0b24nLCAnVG9rZW5SZWZyZXNoJywgJ0FwcGxpQnV0dG9uJ10pXG5cbiAgLmNvbnRyb2xsZXIoJ0Rhc2hib2FyZENvbnRyb2xsZXInLCBbXCJBcHBDYWxsXCIsIFwiTm90aWZpY2F0aW9uXCIsIGZ1bmN0aW9uIChBcHBDYWxsLCBOb3RpZmljYXRpb24pIHtcbiAgICAgICAgdmFyIHNjb3BlID0gdGhpczsgLy8gSSBoYXRlIEphdmFTY3JpcHRcbiAgICAgICAgc2NvcGUudXVpZCAgID1cIm5vbmVcIjtcbiAgICAgICAgc2NvcGUudG9rZW4gID1cIm5vbmVcIjtcbiAgICAgICAgc2NvcGUuc2Vzc2lvbj1cIm5vbmVcIjtcbiAgICAgICAgc2NvcGUuc3RhdHVzID1cImVyci1ub1wiO1xuICAgICAgICBzY29wZS5hcHBsaUlEcyA9W107IC8vIGFycmF5IHRvIGhvbGQgYXBwbGljYXRpb25zIElEXG4gICAgICAgIHNjb3BlLmFwcGxpU3RvcmU9e307IC8vIGFycmF5IHRvIGhvbGQgYXBwbGljYXRpb25zIGpzb24gZGVzY3JpcHRpb25cblxuICAgICAgIFxuICAgICAgICBzY29wZS5BcHBsaUNCID0gZnVuY3Rpb24oYXBwbGlJRCwgYWN0aW9uLCByZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIC8vIEFjdGlvbiBpcyBkb25lIHdpdGhpbiBXaWRnZXQgQ29udHJvbGxlciBvbmx5IHVwZGF0ZSBkZWJ1ZyBVSSB6b25lXG4gICAgICAgICAgICAgICAgc2NvcGUucmVxdWVzdCAgPSBhY3Rpb247IFxuICAgICAgICAgICAgICAgIHNjb3BlLmVycmNvZGUgID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5kYXRhKSBzY29wZS5yZXNwb25zZSA9IHJlc3BvbnNlLmRhdGE7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gT24gYXBwIHdhcyByZW1vdmVkIGxldCdzIHVwZGF0ZSBydW5uYWJsZSBsaXN0XG4gICAgICAgICAgICAgICAgaWYgKGFjdGlvbiA9PT0gXCJ1bmluc3RhbGxcIikgIHNjb3BlLkdldFJ1bm5hYmxlcygpO1xuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgc2NvcGUuR2V0UnVubmFibGVzID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyAoXCJEYXNoYm9hcmQgR2V0UnVubmFibGVzXCIpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBBcHBDYWxsLmdldCAoXCJhZm0tbWFpblwiLCBcInJ1bm5hYmxlc1wiLCB7LypxdWVyeSovfSwgZnVuY3Rpb24ocmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgZGVidWcgVUkgem9uZVxuICAgICAgICAgICAgICAgIHNjb3BlLnJlcXVlc3QgID0gXCIvYXBpL2FmbS1tYWluL3J1bm5hYmxlXCI7IFxuICAgICAgICAgICAgICAgIHNjb3BlLnJlc3BvbnNlID0gcmVzcG9uc2UuZGF0YTtcbiAgICAgICAgICAgICAgICBzY29wZS5lcnJjb2RlICA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzICE9PSAyMDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cgKFwiSG9vcCBHZXRSdW5uYWJsZSBmYWlsZWRcIik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhpcyBpcyBhIHZhbGlkIHJlc3BvbnNlIGZyb20gQmluZGVyXG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEuanR5cGUgIT0gXCJhZmItcmVwbHlcIikge1xuICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uLmVycm9yICh7bWVzc2FnZTogXCJJbnZhbGlkIFJlc3BvbmQgdG8gL29wYS9hZm0tbWFpbi9ydW5uYWJsZSByZXNwb25zZS5kYXRhPVwiK3Jlc3BvbnNlLmRhdGEsIGRlbGF5OiA1MDAwfSk7IFxuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBsb29wIG9uIHJ1bm5hYmxlIGFwcGxpY2F0aW9uIHRvIHByZXBhcmUgZm9yIGRpc3BsYXlcbiAgICAgICAgICAgICAgICB2YXIgIGFwcGxpSURzPVtdO1xuICAgICAgICAgICAgICAgIHZhciAgcnVubmFibGVzID0gcmVzcG9uc2UuZGF0YS5yZXNwb25zZS5ydW5uYWJsZXM7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaWR4PTA7IGlkeCA8IHJ1bm5hYmxlcy5sZW5ndGg7IGlkeCArKykge1xuICAgICAgICAgICAgICAgICAgICBhcHBsaUlEc1tpZHhdID0gcnVubmFibGVzIFtpZHhdLmlkO1xuICAgICAgICAgICAgICAgICAgICBzY29wZS5hcHBsaVN0b3JlIFtydW5uYWJsZXMgW2lkeF0uaWRdID0gIHJ1bm5hYmxlcyBbaWR4XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2NvcGUuYXBwbGlJRHMgPSBhcHBsaUlEczsgLy8gYXZvaWQgcGFydGlhbCB1cGRhdGUgdG8gbGltaXQgVUkgcmVmcmVzaFxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgfSk7ICAgICAgICAgICAgXG4gICAgICAgIH07XG4gICAgICAgIFxuICAgICAgICBzY29wZS5GaWxlVXBsb2FkZWQgPSBmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nIChcImZpbGUgVXBsb2FkZWRcIik7XG4gICAgICAgICAgICAvLyBDYW5ub3QgZGlzcGxheSBwb3N0IHJlc3VsdHMgYXMgR2V0UnVubmFibGUgd2lsbCBvdmVybG9hZCB0aGVtIGF5bmNocm9ub3VzbHlcbiAgICAgICAgICAgIHNjb3BlLnJlcXVlc3QgID0gXCIvYXBpL2FmbS1tYWluL2luc3RhbGxcIjsgXG4gICAgICAgICAgICBzY29wZS5yZXNwb25zZSA9IHJlc3BvbnNlLmhlYWRlcnM7XG4gICAgICAgICAgICBzY29wZS5lcnJjb2RlICA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gZXZlcnl0aGluZyBsb29rcyBPSyB1cGRhdGUgYXBwIGxpc3RcbiAgICAgICAgICAgIHNjb3BlLkdldFJ1bm5hYmxlcygpO1xuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgc2NvcGUuQXV0b1N0YXJ0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2cgKFwiQXV0b1N0YXJ0IHJlcXVlc3RpbmcgQXBwcyBsaXN0XCIpO1xuICAgICAgICAgICAgc2NvcGUuR2V0UnVubmFibGVzKCk7XG4gICAgICAgIH07XG4gICAgICAgICAgXG4gICB9XSk7XG5cbmNvbnNvbGUubG9nIChcIkRhc2hib2FyZCBDb250cm9sbGVyIExvYWRlZFwiKTtcbn0pKCk7IFxuIiwiLyogXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUgXCJJb1QuYnpoXCJcbiAqIEF1dGhvciBcIkZ1bHVwIEFyIEZvbGxcIlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqIFxuICogVXNhZ2U6XG4gKiBcbiAqICAgLy8gbW91c2UgZXZlbnQgcHJvYmFibHkgcG9pbnQgb24gaWNvbiBhbmQgbm90IG9uIGJ1dHRvbiBkaXZcbiAqICAgLi4uIG5nLWNsaWNrPVwiTG9ja0NoYW5uZWwoJGV2ZW50KVxuICAgICB2YXIgdGFyZ2V0PSBhbmd1bGFyLmVsZW1lbnQoZXZlbnQuY3VycmVudFRhcmdldCk7XG4gICAgIHZhciBidXR0b249IEpRZW11LkZpbmRJblBhcmVudCAodGFyZ2V0LCAnZGl2Jyk7XG4gKiBcbiAqL1xuXG5cbihmdW5jdGlvbiAoKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG5cbiAgICAgICAgICBcbiAgICAvLyBfYWxsIG1vZHVsZXMgb25seSByZWZlcmVuY2UgZGVwZW5kZW5jaWVzXG4gICAgYW5ndWxhci5tb2R1bGUoJ0pRdWVyeUVtdScsIFtdKVxuXG4gICAgICAgICAgICAvLyBGYWN0b3J5IGlzIGEgc2luZ2xldG9uIGFuZCBzaGFyZSBpdHMgY29udGV4dCB3aXRoaW4gYWxsIGluc3RhbmNlcy5cbiAgICAgICAgICAgIC5mYWN0b3J5KCdKUWVtdScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgICAgIHZhciBGaW5kSW5QYXJlbnQgPSBmdW5jdGlvbiAoZWxlbWVudCwgc2VsZWN0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmVudCA9IGVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzZWFyY2ggPSBzZWxlY3Rvci50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAocGFyZW50WzBdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VhcmNoID09PSBwYXJlbnRbMF0udGFnTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBIVE1MRGl2RWxlbWVudCBwcm9wZXJ0aWVzXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIHZhciAgRmluZEJ5VGFnPSBmdW5jdGlvbiAoZWxlbWVudCwgdGFnLCBzZWxlY3Rvcikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgc2VhcmNoID0gc2VsZWN0b3IudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHR5cGUgICA9IHRhZy50b0xvd2VyQ2FzZSgpKyBcIk5hbWVcIjtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkcmVuID0gZWxlbWVudC5jaGlsZHJlbigpO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY2hpbGRyZW5bMF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWFyY2ggPT09IGNoaWxkcmVuWzBdW3R5cGVdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkcmVuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gSFRNTERpdkVsZW1lbnQgcHJvcGVydGllc1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBjaGlsZHJlbi5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIHZhciAgRmluZEJ5Q2xhc3M9IGZ1bmN0aW9uIChlbGVtZW50LCBzZWxlY3Rvcikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgc2VhcmNoID0gc2VsZWN0b3IudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkcmVuID0gZWxlbWVudC5jaGlsZHJlbigpO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY2hpbGRyZW5bMF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlbi5oYXNDbGFzcyhzZWFyY2gpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkcmVuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gSFRNTERpdkVsZW1lbnQgcHJvcGVydGllc1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBjaGlsZHJlbi5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgdmFyIG15TWV0aG9kcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgRmluZEluUGFyZW50OiBGaW5kSW5QYXJlbnQsXG4gICAgICAgICAgICAgICAgICAgIEZpbmRCeVRhZzogRmluZEJ5VGFnLFxuICAgICAgICAgICAgICAgICAgICBGaW5kQnlDbGFzczogRmluZEJ5Q2xhc3NcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIG15TWV0aG9kcztcbiAgICAgICAgICAgIH0pO1xuXG59KSgpOyIsInZhciBmb3VuZGF0aW9uUm91dGVzID0gW3tcIm5hbWVcIjpcIkRhc2hib2FyZFwiLFwidXJsXCI6XCIvZGFzaGJvYXJkXCIsXCJjb250cm9sbGVyXCI6XCJEYXNoYm9hcmRDb250cm9sbGVyIGFzIGN0cmxcIixcImFuaW1hdGlvbkluXCI6XCJzbGlkZUluUmlnaHRcIixcInBhdGhcIjpcInBhZ2VzL0Rhc2hib2FyZC9EYXNoYm9hcmQuaHRtbFwifV07IFxuIiwiKGZ1bmN0aW9uICgpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICAvLyBfYWxsIG1vZHVsZXMgb25seSByZWZlcmVuY2UgZGVwZW5kZW5jaWVzXG4gICAgYW5ndWxhci5tb2R1bGUoJ0FwcENvbmZpZycsIFtdKVxuICAgIFxuICAgICAgICAgICAgLy8gRmFjdG9yeSBpcyBhIHNpbmdsZXRvbiBhbmQgc2hhcmUgaXRzIGNvbnRleHQgd2l0aGluIGFsbCBpbnN0YW5jZXMuXG4gICAgICAgICAgICAuZmFjdG9yeSgnQXBwQ29uZmlnJywgW1widXJscXVlcnlcIiwgZnVuY3Rpb24gKHVybHF1ZXJ5KSB7XG5cbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyAoXCJVUkw9XCIrICRsb2NhdGlvbi51cmwoKSArIFwiIFF1ZXJ5PVwiICsgbG9jYXRpb24uaHJlZisgXCIgd2luZG93PVwiICsgZG9jdW1lbnQucmVmZXJyZXIpO1xuXG4gICAgICAgICAgICAgICAgdmFyIG15Q29uZmlnID0ge1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgcGF0aHM6IHsgLy8gV2FybmluZyBwYXRocyBzaG91bGQgZW5kIHdpdGggL1xuICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UgOiAnaW1hZ2VzLycsXG4gICAgICAgICAgICAgICAgICAgICAgICBpY29ucyA6ICcvaWNvbnMvJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF2YXRhcjogJ2ltYWdlcy9hdmF0YXJzLycsXG4gICAgICAgICAgICAgICAgICAgICAgICBhdWRpbyA6ICdpbWFnZXMvYXVkaW8vJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpIDogJ2ltYWdlcy9hcHBsaS8nXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIHNlc3Npb246IHsgLy8gVGhvc2UgZGF0YSBhcmUgdXBkYXRlZCBieSBzZXNzaW9uIHNlcnZpY2VcbiAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbCA6IHVybHF1ZXJ5LnRva2VuIHx8ICcxMjM0NTY3ODknLCAgLy8gdHlwaWNhbCBkZXYgaW5pdGlhbCB0b2tlblxuICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0IDogMzYwMCwgICAgICAgICAvLyB0aW1lb3V0IGlzIHVwZGF0ZWQgY2xpZW50IHNlc3NpbiBjb250ZXh0IGNyZWF0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgIHBpbmdyYXRlOiAxNSwgICAgICAgICAgIC8vIFBpbmcgcmF0ZSB0byBjaGVjayBpZiBzZXJ2ZXIgaXMgc3RpbGwgYWxpdmVcbiAgICAgICAgICAgICAgICAgICAgICAgdXVpZCAgICA6ICcnLCAgICAgICAgICAgLy8gdXVpZCBtYXAgd2l0aCBjb29raWUgb3IgbG9uZyB0ZXJtIHNlc3Npb24gYWNjZXNzIGtleVxuICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiAgIDogJycgICAgICAgICAgICAvLyB3aWxsIGJlIHJldHVybmVkIGZyb20gYXV0aGVudGljYXRpb24gICAgXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIG15Q29uZmlnO1xuICAgICAgICAgICAgfV0pXG5cbiAgICAgICAgICAgIC8vIEZhY3RvcnkgaXMgYSBzaW5nbGV0b24gYW5kIHNoYXJlIGl0cyBjb250ZXh0IHdpdGhpbiBhbGwgaW5zdGFuY2VzLlxuICAgICAgICAgICAgLmZhY3RvcnkoJ0FwcENhbGwnLCBbXCIkaHR0cFwiLCBcIkFwcENvbmZpZ1wiLCBcIiRsb2dcIiwgZnVuY3Rpb24gKCRodHRwLCBBcHBDb25maWcsICRsb2cpIHtcbiAgICAgICAgICAgICAgICB2YXIgbXlDYWxscyA9IHtcbiAgICAgICAgICAgICAgICAgICAgZ2V0IDogZnVuY3Rpb24ocGx1Z2luLCBhY3Rpb24sIHF1ZXJ5LCBjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFxdWVyeS50b2tlbikgcXVlcnkudG9rZW4gPSBBcHBDb25maWcuc2Vzc2lvbi50b2tlbjsgLy8gYWRkIHRva2VuIHRvIHByb3ZpZGVkIHF1ZXJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAkaHR0cC5nZXQoJy9hcGkvJyArIHBsdWdpbiArICcvJyArIGFjdGlvbiAsIHtwYXJhbXM6IHF1ZXJ5fSkudGhlbiAoY2FsbGJhY2ssIGNhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbXlDYWxscztcbiAgICAgICAgICAgIH1dKTtcbiAgICBcbiBcbn0pKCk7XG4iLCIoZnVuY3Rpb24oKSB7XG4gICd1c2Ugc3RyaWN0JztcbiAgXG4gICAgZnVuY3Rpb24gIFBhcnNlUXVlcnlTdHJpbmcgKCkge1xuICAgICAgdmFyIHFkID0ge307XG4gICAgICBsb2NhdGlvbi5zZWFyY2guc3Vic3RyKDEpLnNwbGl0KFwiJlwiKS5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgICB2YXIgayA9IGl0ZW0uc3BsaXQoXCI9XCIpWzBdO1xuICAgICAgICAgIHZhciB2ID0gZGVjb2RlVVJJQ29tcG9uZW50KGl0ZW0uc3BsaXQoXCI9XCIpWzFdKTsgXG4gICAgICAgICAgaWYgKGsgaW4gcWQpIHFkW2tdLnB1c2godik7IGVsc2UgcWRba10gPSBbdl07XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBxZDtcbiAgICB9XG5cbiAgYW5ndWxhci5tb2R1bGUoJ0FGQmNsaWVudCcsIFsgLy8gV2FybmluZzogQXBwbmFtZSBzaG91bGQgZml0IHdpdGggZ3VscGZpbGUuanMgJiBpbmRleC5odG1sXG4gICAgJ3VpLnJvdXRlcicsXG4gICAgJ25nQW5pbWF0ZScsXG5cbiAgICAvL2ZvdW5kYXRpb25cbiAgICAnZm91bmRhdGlvbicsXG4gICAgJ2ZvdW5kYXRpb24uZHluYW1pY1JvdXRpbmcnLFxuICAgICdmb3VuZGF0aW9uLmR5bmFtaWNSb3V0aW5nLmFuaW1hdGlvbnMnLFxuICAgIFxuICAgIC8vIGV4dGVybmFsIGNvbXBvbmVudHNcbiAgICAndWktbm90aWZpY2F0aW9uJyxcbiAgICBcbiAgICAvLyBBcHBsaWNhdGlvbiBDb21wb25lbnRzXG4gICAgJ0FwcENvbmZpZycsXG4gICAgJ0pRdWVyeUVtdScsXG4gICAgJ0Rhc2hib2FyZE1vZHVsZScsXG4gICAgJ1VwbG9hZEZpbGVzJyxcbiAgICAnTGlua0J1dHRvbicsXG4gICAgJ1Rva2VuUmVmcmVzaCcsXG4gICAgJ1JhbmdlU2xpZGVyJyxcbiAgICAnTW9kYWxOb3RpZmljYXRpb24nXG4gIF0pXG4gICAgLnZhbHVlICgndXJscXVlcnknLCBQYXJzZVF1ZXJ5U3RyaW5nKCkpXG4gICAgLmNvbmZpZyhjb25maWcpXG4gICAgLnJ1bihydW4pXG4gIDtcblxuICBjb25maWcuJGluamVjdCA9IFsnJHVybFJvdXRlclByb3ZpZGVyJywgJyRsb2NhdGlvblByb3ZpZGVyJ107XG4gIFxuICBmdW5jdGlvbiBjb25maWcoJHVybFByb3ZpZGVyLCAkbG9jYXRpb25Qcm92aWRlciwgQXBwQ29uZmlnKSB7XG4gICAgJHVybFByb3ZpZGVyLm90aGVyd2lzZSgnL2Rhc2hib2FyZCcpO1xuXG4gICAgLy8gaHR0cHM6Ly9kb2NzLmFuZ3VsYXJqcy5vcmcvZXJyb3IvJGxvY2F0aW9uL25vYmFzZVxuICAgICRsb2NhdGlvblByb3ZpZGVyLmh0bWw1TW9kZSh0cnVlKS5oYXNoUHJlZml4KCchJyk7XG4gICAgXG4gIH1cblxuICBmdW5jdGlvbiBydW4oKSB7XG4gICAgRmFzdENsaWNrLmF0dGFjaChkb2N1bWVudC5ib2R5KTtcbiAgfVxuICBcbi8vIEZvbmRhdGlvbi1hcHAudGVtcGxhdGUgaXMgbm90IGluY2x1ZGVkIGNvcnJlY3RseSBieSBndWxwIFxuLy8gSW5jbHVkZSBoZXJlIG1pc3NpbmcgdGVtcGxhdGVzIGZyb20gZm91bmRhdGlvbi1hcHBzL2Rpc3QvanMvZm91bmRhdGlvbi1hcHBzLXRlbXBsYXRlcy5qc1xuYW5ndWxhci5tb2R1bGUoJ2ZvdW5kYXRpb24nKS5ydW4oWyckdGVtcGxhdGVDYWNoZScsIGZ1bmN0aW9uKCR0ZW1wbGF0ZUNhY2hlKSB7XG4gICR0ZW1wbGF0ZUNhY2hlLnB1dCgnY29tcG9uZW50cy9tb2RhbC9tb2RhbC5odG1sJyxcbiAgICAnPGRpdlxcbicgK1xuICAgICcgIGNsYXNzPVwibW9kYWwtb3ZlcmxheVwiXFxuJyArXG4gICAgJyAgbmctY2xpY2s9XCJoaWRlT3ZlcmxheSgpXCI+XFxuJyArXG4gICAgJyAgPGFzaWRlXFxuJyArXG4gICAgJyAgICBjbGFzcz1cIm1vZGFsXCJcXG4nICtcbiAgICAnICAgIG5nLWNsaWNrPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1wiXFxuJyArXG4gICAgJyAgICBuZy10cmFuc2NsdWRlPlxcbicgK1xuICAgICcgIDwvYXNpZGU+XFxuJyArXG4gICAgJzwvZGl2PlxcbicgK1xuICAgICcnKTtcbn1dKTtcblxuY29uc29sZS5sb2cgKFwib3BhPUFGQmNsaWVudCBMb2FkZWRcIik7XG59KSgpO1xuIiwiKGZ1bmN0aW9uKCkge2FuZ3VsYXIubW9kdWxlKCdBRkJjbGllbnQnKS5ydW4oWyckdGVtcGxhdGVDYWNoZScsIGZ1bmN0aW9uKCR0ZW1wbGF0ZUNhY2hlKSB7JHRlbXBsYXRlQ2FjaGUucHV0KCdwYWdlcy9EYXNoYm9hcmQvRGFzaGJvYXJkLmh0bWwnLFxuICAgICc8aDM+PGltZyBjbGFzcz1cImxvZ29cIiBzcmM9XCJpbWFnZXMvbG9nby90cmlza2VsX2lvdF9iemh4MjUwLnBuZ1wiIGFsdD1cIklvVC5iemggTG9nb1wiIHN0eWxlPVwiaGVpZ2h0OjE1MHB4XCI+IEFwcGxpY2F0aW9uIEZyYW1ld29yayBNYW5hZ2VyIFNpbXBsZSBDbGllbnQ8L2gzPjxkaXYgY2xhc3M9XCJidXR0b24tYm94IGJveC1jb250ZW50XCI+PGFwcGxpLWJ1dHRvbiBuZy1yZXBlYXQ9XCJhcHBsaUlEIGluIGN0cmwuYXBwbGlJRHNcIiBzdG9yZT1cImN0cmwuYXBwbGlTdG9yZVwiIGhhbmRsZT1cInt7YXBwbGlJRH19XCIgY2FsbGJhY2s9XCJjdHJsLkFwcGxpQ0JcIj48L2FwcGxpLWJ1dHRvbj48dXBsb2FkLWFwcGxpIGNsYXNzPVwiaWJ6LXJpZ2h0XCIgbGFiZWw9XCJVcGxvYWRcIiBuYW1lPVwid2lkZ2V0XCIgaWNvbj1cImZpLXVwbG9hZFwiIHBvc3R1cmw9XCIvYXBpL2FmbS1tYWluL2luc3RhbGxcIiBjYWxsYmFjaz1cImN0cmwuRmlsZVVwbG9hZGVkXCIgdGl0bGU9XCJVcGxvYWQgQUdMIEFwcFwiPjwvdXBsb2FkLWFwcGxpPjwvZGl2PjxkaXYgY2xhc3M9XCJtZXNzYWdlLWJveCBib3gtY29udGVudCB2ZXJ0aWNhbCBncmlkLWZyYW1lXCI+PGRpdiBjbGFzcz1cInJlc3BvbnNlXCI+PHNwYW4gY2xhc3M9XCJncmlkLWNvbnRlbnQgbm9zY3JvbGwgcmVxIHt7Y3RybC5zdGF0dXN9fVwiPnJlcT0ge3tjdHJsLnJlcXVlc3R9fTwvc3Bhbj4gPHNwYW4gY2xhc3M9XCJncmlkLWNvbnRlbnQgbm9zY3JvbGwgcmVzIHt7Y3RybC5zdGF0dXN9fVwiPnJlcz0ge3tjdHJsLnJlc3BvbnNlfX08L3NwYW4+IDxzcGFuIGNsYXNzPVwiZ3JpZC1jb250ZW50IG5vc2Nyb2xsIHN0YXR1cyB7e2N0cmwuc3RhdHVzfX1cIj5zdGF0dXM9IHt7Y3RybC5lcnJjb2RlfX08L3NwYW4+PC9kaXY+PC9kaXY+PHRva2VuLXJlZnJlc2ggYXV0b2xvZz1cInRydWVcIiBjYWxsYmFjaz1cImN0cmwuQXV0b1N0YXJ0XCI+PC90b2tlbi1yZWZyZXNoPicpO31dKTtcbn0pKCk7XG4iXSwic291cmNlUm9vdCI6Ii9zb3VyY2UvIn0=