PageSourceSearch

https://www.adareparish.ie/wp-content/themes/parish-website-new-fr…/assets/javascript/foundation.js?ver=2.6.1

js adareparish.ie collected 2026-10-03 23:16:49 UTC 839,751 bytes, 6,780 lines download raw bytes

1function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}!function(t){"use strict";function e(t){if(void 0===Function.prototype.name){var e=/function\s([^(]{1,})\(/,i=e.exec(t.toString());return i&&i.length>1?i[1].trim():""}return void 0===t.prototype?t.constructor.name:t.prototype.constructor.name}function i(t){return/true/.test(t)?!0:/false/.test(t)?!1:isNaN(1*t)?t:parseFloat(t)}function n(t){return t.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}var s="6.2.1",o={version:s,_plugins:{},_uuids:[],rtl:function(){return"rtl"===t("html").attr("dir")},plugin:function(t,i){var s=i||e(t),o=n(s);this._plugins[o]=this[s]=t},registerPlugin:function(t,i){var s=i?n(i):e(t.constructor).toLowerCase();t.uuid=this.GetYoDigits(6,s),t.$element.attr("data-"+s)||t.$element.attr("data-"+s,t.uuid),t.$element.data("zfPlugin")||t.$element.data("zfPlugin",t),t.$element.trigger("init.zf."+s),this._uuids.push(t.uuid)},unregisterPlugin:function(t){var i=n(e(t.$element.data("zfPlugin").constructor));this._uuids.splice(this._uuids.indexOf(t.uuid),1),t.$element.removeAttr("data-"+i).removeData("zfPlugin").trigger("destroyed.zf."+i);for(var s in t)t[s]=null},reInit:function(e){var i=e instanceof t;try{if(i)e.each(function(){t(this).data("zfPlugin")._init()});else{var s=typeof e,o=this,a={object:function(e){e.forEach(function(e){e=n(e),t("[data-"+e+"]").foundation("_init")})},string:function(){e=n(e),t("[data-"+e+"]").foundation("_init")},undefined:function(){this.object(Object.keys(o._plugins))}};a[s](e)}}catch(r){console.error(r)}finally{return e}},GetYoDigits:function(t,e){return t=t||6,Math.round(Math.pow(36,t+1)-Math.random()*Math.pow(36,t)).toString(36).slice(1)+(e?"-"+e:"")},reflow:function(e,n){"undefined"==typeof n?n=Object.keys(this._plugins):"string"==typeof n&&(n=[n]);var s=this;t.each(n,function(n,o){var a=s._plugins[o],r=t(e).find("[data-"+o+"]").addBack("[data-"+o+"]");r.each(function(){var e=t(this),n={};if(e.data("zfPlugin"))return void console.warn("Tried to initialize "+o+" on an element that already has a Foundation plugin.");if(e.attr("data-options")){e.attr("data-options").split(";").forEach(function(t,e){var s=t.split(":").map(function(t){return t.trim()});s[0]&&(n[s[0]]=i(s[1]))})}
1try{e.data("zfPlugin",new a(t(this),n))}catch(s){console.error(s)}finally{return}})})},getFnName:e,transitionend:function(t){var e,i={transition:"transitionend",WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"otransitionend"},n=document.createElement("div");for(var s in i)"undefined"!=typeof n.style[s]&&(e=i[s]);return e?e:(e=setTimeout(function(){t.triggerHandler("transitionend",[t])},1),"transitionend")}};o.util={throttle:function(t,e){var i=null;return function(){var n=this,s=arguments;null===i&&(i=setTimeout(function(){t.apply(n,s),i=null},e))}}};var a=function(i){var n=typeof i,s=t("meta.foundation-mq"),a=t(".no-js");if(s.length||t('<meta class="foundation-mq">').appendTo(document.head),a.length&&a.removeClass("no-js"),"undefined"===n)o.MediaQuery._init(),o.reflow(this);else{if("string"!==n)throw new TypeError("We're sorry, "+n+" is not a valid parameter. You must use a string representing the method you wish to invoke.");var r=Array.prototype.slice.call(arguments,1),l=this.data("zfPlugin");if(void 0===l||void 0===l[i])throw new ReferenceError("We're sorry, '"+i+"' is not an available method for "+(l?e(l):"this element")+".");1===this.length?l[i].apply(l,r):this.each(function(e,n){l[i].apply(t(n).data("zfPlugin"),r)})}return this};window.Foundation=o,t.fn.foundation=a,function(){Date.now&&window.Date.now||(window.Date.now=Date.now=function(){return(new Date).getTime()});for(var t=["webkit","moz"],e=0;e<t.length&&!window.requestAnimationFrame;++e){var i=t[e];window.requestAnimationFrame=window[i+"RequestAnimationFrame"],window.cancelAnimationFrame=window[i+"CancelAnimationFrame"]||window[i+"CancelRequestAnimationFrame"]}if(/iP(ad|hone|od).*OS 6/.test(window.navigator.userAgent)||!window.requestAnimationFrame||!window.cancelAnimationFrame){var n=0;window.requestAnimationFrame=function(t){var e=Date.now(),i=Math.max(n+16,e);return setTimeout(function(){t(n=i)},i-e)},window.cancelAnimationFrame=clearTimeout}window.performance&&window.performance.now||(window.performance={start:Date.now(),now:function(){return Date.now()-this.start}})}(),Function.prototype.bind||(Function.prototype.bind=function(t){if("function"!=typeof this)throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");var e=Array.prototype.slice.call(arguments,1),i=this,n=function(){},s=function(){return i.apply(this instanceof n?this:t,e.concat(Array.prototype.slice.call(arguments)))};return this.prototype&&(n.prototype=this.prototype),s.prototype=new n,s})}(jQuery),!function(t){function e(t){var e={};return"string"!=typeof t?e:(t=t.trim().slice(1,-1))?e=t.split("&").reduce(function(t,e){var i=e.replace(/\+/g," ").split("="),n=i[0],s=i[1];return n=decodeURIComponent(n),s=void 0===s?null:decodeURIComponent(s),t.hasOwnProperty(n)?Array.isArray(t[n])?t[n].push(s):t[n]=[t[n],s]:t[n]=s,t},{}):e}var i={queries:[],current:"",_init:function(){var i,n=this,s=t(".foundation-mq").css("font-family");i=e(s);for(var o in i)n.queries.push({name:o,value:"only screen and (min-width: "+i[o]+")"});this.current=this._getCurrentSize(),this._watcher()},atLeast:function(t){var e=this.get(t);return e?window.matchMedia(e).matches:!1},get:function(t){for(var e in this.queries){var i=this.queries[e];if(t===i.name)return i.value}return null},_getCurrentSize:function(){for(var t,e=0;e<this.queries.length;e++){var i=this.queries[e];window.matchMedia(i.value).matches&&(t=i)}return"object"==typeof t?t.name:t},_watcher:function(){var e=this;t(window).on("resize.zf.mediaquery",function(){var i=e._getCurrentSize();i!==e.current&&(t(window).trigger("changed.zf.mediaquery",[i,e.current]),e.current=i)})}};Foundation.MediaQuery=i,window.matchMedia||(window.matchMedia=function(){"use strict";var t=window.styleMedia||window.media;if(!t){var e=document.createElement("style"),i=document.getElementsByTagName("script")[0],n=null;e.type="text/css",e.id="matchmediajs-test",i.parentNode.insertBefore(e,i),n="getComputedStyle"in window&&window.getComputedStyle(e,null)||e.currentStyle,t={matchMedium:function(t){var i="@media "+t+"{ #matchmediajs-test { width: 1px; } }";return e.styleSheet?e.styleSheet.cssText=i:e.textContent=i,"1px"===n.width}}}return function(e){return{matches:t.matchMedium(e||"all"),media:e||"all"}}}()),Foundation.MediaQuery=i}(jQuery),!function(t){function e(t){var e={};for(var i in t)e[t[i]]=t[i];return e}var i={9:"TAB",13:"ENTER",27:"ESCAPE",32:"SPACE",37:"ARROW_LEFT",38:"ARROW_UP",39:"ARROW_RIGHT",40:"ARROW_DOWN"},n={},s={keys:e(i),parseKey:function(t){var e=i[t.which||t.keyCode]||String.fromCharCode(t.which).toUpperCase();return t.shiftKey&&(e="SHIFT_"+e),t.ctrlKey&&(e="CTRL_"+e),t.altKey&&
1(e="ALT_"+e),e},handleKey:function(e,i,s){var o,a,r,l=n[i],u=this.parseKey(e);return l?(o="undefined"==typeof l.ltr?l:Foundation.rtl()?t.extend({},l.ltr,l.rtl):t.extend({},l.rtl,l.ltr),a=o[u],r=s[a],void(r&&"function"==typeof r?(r.apply(),(s.handled||"function"==typeof s.handled)&&s.handled.apply()):(s.unhandled||"function"==typeof s.unhandled)&&s.unhandled.apply())):console.warn("Component not defined!")},findFocusable:function(e){return e.find("a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]").filter(function(){return t(this).is(":visible")&&!(t(this).attr("tabindex")<0)})},register:function(t,e){n[t]=e}};Foundation.Keyboard=s}(jQuery),!function(t){function e(t,e,i){function n(r){a||(a=window.performance.now()),o=r-a,i.apply(e),t>o?s=window.requestAnimationFrame(n,e):(window.cancelAnimationFrame(s),e.trigger("finished.zf.animate",[e]).triggerHandler("finished.zf.animate",[e]))}var s,o,a=null;s=window.requestAnimationFrame(n)}function i(e,i,o,a){function r(){e||i.hide(),l(),a&&a.apply(i)}function l(){i[0].style.transitionDuration=0,i.removeClass(u+" "+d+" "+o)}if(i=t(i).eq(0),i.length){var u=e?n[0]:n[1],d=e?s[0]:s[1];l(),i.addClass(o).css("transition","none"),requestAnimationFrame(function(){i.addClass(u),e&&i.show()}),requestAnimationFrame(function(){i[0].offsetWidth,i.css("transition","").addClass(d)}),i.one(Foundation.transitionend(i),r)}}var n=["mui-enter","mui-leave"],s=["mui-enter-active","mui-leave-active"],o={animateIn:function(t,e,n){i(!0,t,e,n)},animateOut:function(t,e,n){i(!1,t,e,n)}};Foundation.Move=e,Foundation.Motion=o}(jQuery),!function(t){var e={Feather:function(e){var i=arguments.length<=1||void 0===arguments[1]?"zf":arguments[1];e.attr("role","menubar");var n=e.find("li").attr({role:"menuitem"}),s="is-"+i+"-submenu",o=s+"-item",a="is-"+i+"-submenu-parent";e.find("a:first").attr("tabindex",0),n.each(function(){var e=t(this),i=e.children("ul");i.length&&(e.addClass(a).attr({"aria-haspopup":!0,"aria-expanded":!1,"aria-label":e.children("a:first").text()}),i.addClass("submenu "+s).attr({"data-submenu":"","aria-hidden":!0,role:"menu"})),e.parent("[data-submenu]").length&&e.addClass("is-submenu-item "+o)})},Burn:function(t,e){var i=(t.find("li").removeAttr("tabindex"),"is-"+e+"-submenu"),n=i+"-item",s="is-"+e+"-submenu-parent";t.find("*").removeClass(i+" "+n+" "+s+" is-submenu-item submenu is-active").removeAttr("data-submenu").css("display","")}};Foundation.Nest=e}(jQuery),!function(t){function e(t,e,n,s){var o,a,r,l,u=i(t);if(e){var d=i(e);a=u.offset.top+u.height<=d.height+d.offset.top,o=u.offset.top>=d.offset.top,r=u.offset.left>=d.offset.left,l=u.offset.left+u.width<=d.width}else a=u.offset.top+u.height<=u.windowDims.height+u.windowDims.offset.top,o=u.offset.top>=u.windowDims.offset.top,r=u.offset.left>=u.windowDims.offset.left,l=u.offset.left+u.width<=u.windowDims.width;var h=[a,o,r,l];return n?r===l==!0:s?o===a==!0:-1===h.indexOf(!1)}function i(t,e){if(t=t.length?t[0]:t,t===window||t===document)throw new Error("I'm sorry, Dave. I'm afraid I can't do that.");var i=t.getBoundingClientRect(),n=t.parentNode.getBoundingClientRect(),s=document.body.getBoundingClientRect(),o=window.pageYOffset,a=window.pageXOffset;return{width:i.width,height:i.height,offset:{top:i.top+o,left:i.left+a},parentDims:{width:n.width,height:n.height,offset:{top:n.top+o,left:n.left+a}},windowDims:{width:s.width,height:s.height,offset:{top:o,left:a}}}}function n(t,e,n,s,o,a){var r=i(t),l=e?i(e):null;switch(n){case"top":return{left:Foundation.rtl()?l.offset.left-r.width+l.width:l.offset.left,top:l.offset.top-(r.height+s)};case"left":return{left:l.offset.left-(r.width+o),top:l.offset.top};case"right":return{left:l.offset.left+l.width+o,top:l.offset.top};case"center top":return{left:l.offset.left+l.width/2-r.width/2,top:l.offset.top-(r.height+s)};case"center bottom":return{left:a?o:l.offset.left+l.width/2-r.width/2,top:l.offset.top+l.height+s};case"center left":return{left:l.offset.left-(r.width+o),top:l.offset.top+l.height/2-r.height/2};case"center right":return{left:l.offset.left+l.width+o+1,top:l.offset.top+l.height/2-r.height/2};
1case"center":return{left:r.windowDims.offset.left+r.windowDims.width/2-r.width/2,top:r.windowDims.offset.top+r.windowDims.height/2-r.height/2};case"reveal":return{left:(r.windowDims.width-r.width)/2,top:r.windowDims.offset.top+s};case"reveal full":return{left:r.windowDims.offset.left,top:r.windowDims.offset.top};case"left bottom":return{left:l.offset.left-(r.width+o),top:l.offset.top+l.height};case"right bottom":return{left:l.offset.left+l.width+o-r.width,top:l.offset.top+l.height};default:return{left:Foundation.rtl()?l.offset.left-r.width+l.width:l.offset.left,top:l.offset.top+l.height+s}}}Foundation.Box={ImNotTouchingYou:e,GetDimensions:i,GetOffsets:n}}(jQuery),!function(t){function e(){o(),n(),s(),i()}function i(e){var i=t("[data-yeti-box]"),n=["dropdown","tooltip","reveal"];if(e&&("string"==typeof e?n.push(e):"object"==typeof e&&"string"==typeof e[0]?n.concat(e):console.error("Plugin names must be strings")),i.length){var s=n.map(function(t){return"closeme.zf."+t}).join(" ");t(window).off(s).on(s,function(e,i){var n=e.namespace.split(".")[0],s=t("[data-"+n+"]").not('[data-yeti-box="'+i+'"]');s.each(function(){var e=t(this);e.triggerHandler("close.zf.trigger",[e])})})}}function n(e){var i=void 0,n=t("[data-resize]");n.length&&t(window).off("resize.zf.trigger").on("resize.zf.trigger",function(s){i&&clearTimeout(i),i=setTimeout(function(){a||n.each(function(){t(this).triggerHandler("resizeme.zf.trigger")}),n.attr("data-events","resize")},e||10)})}function s(e){var i=void 0,n=t("[data-scroll]");n.length&&t(window).off("scroll.zf.trigger").on("scroll.zf.trigger",function(s){i&&clearTimeout(i),i=setTimeout(function(){a||n.each(function(){t(this).triggerHandler("scrollme.zf.trigger")}),n.attr("data-events","scroll")},e||10)})}function o(){if(!a)return!1;var e=document.querySelectorAll("[data-resize], [data-scroll], [data-mutate]"),i=function(e){var i=t(e[0].target);switch(i.attr("data-events")){case"resize":i.triggerHandler("resizeme.zf.trigger",[i]);break;case"scroll":i.triggerHandler("scrollme.zf.trigger",[i,window.pageYOffset]);break;default:return!1}};if(e.length)for(var n=0;n<=e.length-1;n++){var s=new a(i);s.observe(e[n],{attributes:!0,childList:!1,characterData:!1,subtree:!1,attributeFilter:["data-events"]})}}var a=function(){for(var t=["WebKit","Moz","O","Ms",""],e=0;e<t.length;e++)if(t[e]+"MutationObserver"in window)return window[t[e]+"MutationObserver"];return!1}(),r=function(e,i){e.data(i).split(" ").forEach(function(n){t("#"+n)["close"===i?"trigger":"triggerHandler"](i+".zf.trigger",[e])})};t(document).on("click.zf.trigger","[data-open]",function(){r(t(this),"open")}),t(document).on("click.zf.trigger","[data-close]",function(){var e=t(this).data("close");e?r(t(this),"close"):t(this).trigger("close.zf.trigger")}),t(document).on("click.zf.trigger","[data-toggle]",function(){r(t(this),"toggle")}),t(document).on("close.zf.trigger","[data-closable]",function(e){e.stopPropagation();var i=t(this).data("closable");""!==i?Foundation.Motion.animateOut(t(this),i,function(){t(this).trigger("closed.zf")}):t(this).fadeOut().trigger("closed.zf")}),t(document).on("focus.zf.trigger blur.zf.trigger","[data-toggle-focus]",function(){var e=t(this).data("toggle-focus");t("#"+e).triggerHandler("toggle.zf.trigger",[t(this)])}),t(window).load(function(){e()}),Foundation.IHearYou=e}(jQuery),!function(t){function e(t,e,i){var n,s,o=this,a=e.duration,r=Object.keys(t.data())[0]||"timer",l=-1;this.isPaused=!1,this.restart=function(){l=-1,clearTimeout(s),this.start()},this.start=function(){this.isPaused=!1,clearTimeout(s),l=0>=l?a:l,t.data("paused",!1),n=Date.now(),s=setTimeout(function(){e.infinite&&o.restart(),i()},l),t.trigger("timerstart.zf."+r)},this.pause=function(){this.isPaused=!0,clearTimeout(s),t.data("paused",!0);var e=Date.now();l-=e-n,t.trigger("timerpaused.zf."+r)}}function i(e,i){function n(){s--,0===s&&i()}var s=e.length;0===s&&i(),e.each(function(){this.complete?n():"undefined"!=typeof this.naturalWidth&&this.naturalWidth>0?n():t(this).one("load",function(){n()})})}Foundation.Timer=e,Foundation.onImagesLoaded=i}(jQuery),function(t){function e(){this.removeEventListener("touchmove",i),this.removeEventListener("touchend",e),u=!1}function i(i){if(t.spotSwipe.preventDefault&&i.preventDefault(),u){var n,s=i.touches[0].pageX,a=(i.touches[0].pageY,o-s);l=(new Date).getTime()-r,Math.abs(a)>=t.spotSwipe.moveThreshold&&l<=t.spotSwipe.timeThreshold&&(n=a>0?"left":"right"),n&&(i.preventDefault(),e.call(this),t(this).trigger("swipe",n).trigger("swipe"+n))}}function n(t){1==t.touches.length&&(o=t.touches[0].pageX,a=t.touches[0].pageY,u=!0,r=(new Date).getTime(),this.addEventListener("touchmove",i,!1),this.addEventListener("touchend",e,!1))}function s(){this.addEventListener&&this.addEventListener("touchstart",n,!1)}t.spotSwipe={version:"1.0.0",enabled:"ontouchstart"in document.documentElement,preventDefault:!1,moveThreshold:75,timeThreshold:200};var o,a,r,l,u=!1;t.event.special.swipe={setup:s},t.each(["left","up","down","right"],function(){t.event.special["swipe"+this]={setup:function(){t(this).on("swipe",t.noop)}}})}(jQuery),!function(t){t.fn.addTouch=function(){this.each(function(i,n){t(n).bind("touchstart touchmove touchend touchcancel",function(){e(event)})});var e=function(t){var e,i=t.changedTouches,n=i[0],s={touchstart:"mousedown",touchmove:"mou
1semove",touchend:"mouseup"},o=s[t.type];"MouseEvent"in window&&"function"==typeof window.MouseEvent?e=window.MouseEvent(o,{bubbles:!0,cancelable:!0,screenX:n.screenX,screenY:n.screenY,clientX:n.clientX,clientY:n.clientY}):(e=document.createEvent("MouseEvent"),e.initMouseEvent(o,!0,!0,window,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null)),n.target.dispatchEvent(e)}}}(jQuery);var _createClass=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}();!function(t){var e=function(){function e(i){var n=arguments.length<=1||void 0===arguments[1]?{}:arguments[1];_classCallCheck(this,e),this.$element=i,this.options=t.extend({},e.defaults,this.$element.data(),n),this._init(),Foundation.registerPlugin(this,"Abide")}return _createClass(e,[{key:"_init",value:function(){this.$inputs=this.$element.find("input, textarea, select").not("[data-abide-ignore]"),this._events()}},{key:"_events",value:function(){var e=this;this.$element.off(".abide").on("reset.zf.abide",function(){e.resetForm()}).on("submit.zf.abide",function(){return e.validateForm()}),"fieldChange"===this.options.validateOn&&this.$inputs.off("change.zf.abide").on("change.zf.abide",function(i){e.validateInput(t(i.target))}),this.options.liveValidate&&this.$inputs.off("input.zf.abide").on("input.zf.abide",function(i){e.validateInput(t(i.target))})}},{key:"_reflow",value:function(){this._init()}},{key:"requiredCheck",value:function(t){if(!t.attr("required"))return!0;var e=!0;switch(t[0].type){case"select":case"select-one":case"select-multiple":var i=t.find("option:selected");i.length&&i.val()||(e=!1);break;default:t.val()&&t.val().length||(e=!1)}return e}},{key:"findFormError",value:function(t){var e=t.siblings(this.options.formErrorSelector);return e.length||(e=t.parent().find(this.options.formErrorSelector)),e}},{key:"findLabel",value:function(t){var e=t[0].id,i=this.$element.find('label[for="'+e+'"]');return i.length?i:t.closest("label")}},{key:"findRadioLabels",value:function(e){var i=this,n=e.map(function(e,n){var s=n.id,o=i.$element.find('label[for="'+s+'"]');return o.length||(o=t(n).closest("label")),o[0]});return t(n)}},{key:"addErrorClasses",value:function(t){var e=this.findLabel(t),i=this.findFormError(t);e.length&&e.addClass(this.options.labelErrorClass),i.length&&i.addClass(this.options.formErrorClass),t.addClass(this.options.inputErrorClass).attr("data-invalid","")}},{key:"removeRadioErrorClasses",value:function(t){var e=this.$element.find(':radio[name="'+t+'"]'),i=this.findRadioLabels(e),n=this.findFormError(e);i.length&&i.removeClass(this.options.labelErrorClass),n.length&&n.removeClass(this.options.formErrorClass),e.removeClass(this.options.inputErrorClass).removeAttr("data-invalid")}},{key:"removeErrorClasses",value:function(t){if("radio"==t[0].type)return this.removeRadioErrorClasses(t.attr("name"));var e=this.findLabel(t),i=this.findFormError(t);e.length&&e.removeClass(this.options.labelErrorClass),i.length&&i.removeClass(this.options.formErrorClass),t.removeClass(this.options.inputErrorClass).removeAttr("data-invalid")}},{key:"validateInput",value:function(t){var e=this.requiredCheck(t),i=!1,n=!0,s=t.attr("data-validator"),o=!0;switch(t[0].type){case"radio":i=this.validateRadio(t.attr("name"));break;case"checkbox":i=e;break;case"select":case"select-one":case"select-multiple":i=e;break;default:i=this.validateText(t)}s&&(n=this.matchValidation(t,s,t.attr("required"))),t.attr("data-equalto")&&(o=this.options.validators.equalTo(t));var a=-1===[e,i,n,o].indexOf(!1),r=(a?"valid":"invalid")+".zf.abide";return this[a?"removeErrorClasses":"addErrorClasses"](t),t.trigger(r,[t]),a}},{key:"validateForm",value:function(){var e=[],i=this;this.$inputs.each(function(){e.push(i.validateInput(t(this)))});var n=-1===e.indexOf(!1);return this.$element.find("[data-abide-error]").css("display",n?"none":"block"),this.$element.trigger((n?"formvalid":"forminvalid")+".zf.abide",[this.$element]),n}},{key:"validateText",value:function(t,e){e=e||t.attr("pattern")||t.attr("type");var i=t.val(),n=!1;return i.length?n=this.options.patterns.hasOwnProperty(e)?this.options.patterns[e].test(i):e!==t.attr("type")?new RegExp(e).test(i):!0:t.prop("required")||(n=!0),n}},{key:"validateRadio",value:function(e){var i=this.$element.find(':radio[name="'+e+'"]'),n=!1;return void 0===i.attr("required")&&(n=!0),i.each(function(e,i){t(i).prop("checked")&&(n=!0)}),n}}
1,{key:"matchValidation",value:function(t,e,i){var n=this;i=!!i;var s=e.split(" ").map(function(e){return n.options.validators[e](t,i,t.parent())});return-1===s.indexOf(!1)}},{key:"resetForm",value:function(){var e=this.$element,i=this.options;t("."+i.labelErrorClass,e).not("small").removeClass(i.labelErrorClass),t("."+i.inputErrorClass,e).not("small").removeClass(i.inputErrorClass),t(i.formErrorSelector+"."+i.formErrorClass).removeClass(i.formErrorClass),e.find("[data-abide-error]").css("display","none"),t(":input",e).not(":button, :submit, :reset, :hidden, [data-abide-ignore]").val("").removeAttr("data-invalid"),e.trigger("formreset.zf.abide",[e])}},{key:"destroy",value:function(){var e=this;this.$element.off(".abide").find("[data-abide-error]").css("display","none"),this.$inputs.off(".abide").each(function(){e.removeErrorClasses(t(this))}),Foundation.unregisterPlugin(this)}}]),e}();e.defaults={validateOn:"fieldChange",labelErrorClass:"is-invalid-label",inputErrorClass:"is-invalid-input",formErrorSelector:".form-error",formErrorClass:"is-visible",liveValidate:!1,patterns:{alpha:/^[a-zA-Z]+$/,alpha_numeric:/^[a-zA-Z0-9]+$/,integer:/^[-+]?\d+$/,number:/^[-+]?\d*(?:[\.\,]\d+)?$/,card:/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/,cvv:/^([0-9]){3,4}$/,email:/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/,url:/^(https?|ftp|file|ssh):\/\/(((([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-zA-Z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-zA-Z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-zA-Z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-zA-Z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-zA-Z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-zA-Z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/,domain:/^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,8}$/,datetime:/^([0-2][0-9]{3})\-([0-1][0-9])\-([0-3][0-9])T([0-5][0-9])\:([0-5][0-9])\:([0-5][0-9])(Z|([\-\+]([0-1][0-9])\:00))$/,date:/(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))$/,time:/^(0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9]){2}$/,dateISO:/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/,month_day_year:/^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]\d{4}$/,day_month_year:/^(0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.]\d{4}$/,color:/^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/},validators:{equalTo:function(e,i,n){return t("#"+e.attr("data-equalto")).val()===e.val()}}},Foundation.plugin(e,"Abide")}(jQuery);var _createClass=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}();!function(t){var e=function(){function e(i,n){_classCallCheck(this,e),this.$element=i,this.options=t.extend({},e.defaults,this.$element.data(),n),this._init(),Foundation.registerPlugin(this,"Accordion"),Foundation.Keyboard.register("Accordion",{ENTER:"toggle",SPACE:"toggle",ARROW_DOWN:"next",ARROW_UP:"previous"})}return _createClass(e,[{key:"_init",value:function(){this.$element.attr("role","tablist"),this.$tabs=this.$element.children("li, [data-accordion-item]"),this.$tabs.each(function(e,i){var n=t(i),s=n.children("[data-tab-content]"),o=s[0].id||Foundation.GetYoDigits(6,"accordion"),a=i.id||o+"-label";n.find("a:first").attr({"aria-controls":o,role:"tab",id:a,"aria-expanded":!1,"aria-selected":!1}),s.attr({role:"tabpanel","aria-labelledby":a,"aria-hidden":!0,id:o})});
1var e=this.$element.find(".is-active").children("[data-tab-content]");e.length&&this.down(e,!0),this._events()}},{key:"_events",value:function(){var e=this;this.$tabs.each(function(){var i=t(this),n=i.children("[data-tab-content]");n.length&&i.children("a").off("click.zf.accordion keydown.zf.accordion").on("click.zf.accordion",function(t){t.preventDefault(),i.hasClass("is-active")?(e.options.allowAllClosed||i.siblings().hasClass("is-active"))&&e.up(n):e.down(n)}).on("keydown.zf.accordion",function(t){Foundation.Keyboard.handleKey(t,"Accordion",{toggle:function(){e.toggle(n)},next:function(){var t=i.next().find("a").focus();e.options.multiExpand||t.trigger("click.zf.accordion")},previous:function(){var t=i.prev().find("a").focus();e.options.multiExpand||t.trigger("click.zf.accordion")},handled:function(){t.preventDefault(),t.stopPropagation()}})})})}},{key:"toggle",value:function(t){if(t.parent().hasClass("is-active")){if(!this.options.allowAllClosed&&!t.parent().siblings().hasClass("is-active"))return;this.up(t)}else this.down(t)}},{key:"down",value:function(e,i){var n=this;if(!this.options.multiExpand&&!i){var s=this.$element.children(".is-active").children("[data-tab-content]");s.length&&this.up(s)}e.attr("aria-hidden",!1).parent("[data-tab-content]").addBack().parent().addClass("is-active"),e.slideDown(this.options.slideSpeed,function(){n.$element.trigger("down.zf.accordion",[e])}),t("#"+e.attr("aria-labelledby")).attr({"aria-expanded":!0,"aria-selected":!0})}},{key:"up",value:function(e){var i=e.parent().siblings(),n=this,s=this.options.multiExpand?i.hasClass("is-active"):e.parent().hasClass("is-active");(this.options.allowAllClosed||s)&&(e.slideUp(n.options.slideSpeed,function(){n.$element.trigger("up.zf.accordion",[e])}),e.attr("aria-hidden",!0).parent().removeClass("is-active"),t("#"+e.attr("aria-labelledby")).attr({"aria-expanded":!1,"aria-selected":!1}))}},{key:"destroy",value:function(){this.$element.find("[data-tab-content]").slideUp(0).css("display",""),this.$element.find("a").off(".zf.accordion"),Foundation.unregisterPlugin(this)}}]),e}();e.defaults={slideSpeed:250,multiExpand:!1,allowAllClosed:!1},Foundation.plugin(e,"Accordion")}(jQuery);var _createClass=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}();!function(t){var e=function(){function e(i,n){_classCallCheck(this,e),this.$element=i,this.options=t.extend({},e.defaults,this.$element.data(),n),Foundation.Nest.Feather(this.$element,"accordion"),this._init(),Foundation.registerPlugin(this,"AccordionMenu"),Foundation.Keyboard.register("AccordionMenu",{ENTER:"toggle",SPACE:"toggle",ARROW_RIGHT:"open",ARROW_UP:"up",ARROW_DOWN:"down",ARROW_LEFT:"close",ESCAPE:"closeAll",TAB:"down",SHIFT_TAB:"up"})}return _createClass(e,[{key:"_init",value:function(){this.$element.find("[data-submenu]").not(".is-active").slideUp(0),this.$element.attr({role:"tablist","aria-multiselectable":this.options.multiOpen}),this.$menuLinks=this.$element.find(".is-accordion-submenu-parent"),this.$menuLinks.each(function(){var e=this.id||Foundation.GetYoDigits(6,"acc-menu-link"),i=t(this),n=i.children("[data-submenu]"),s=n[0].id||Foundation.GetYoDigits(6,"acc-menu"),o=n.hasClass("is-active");i.attr({"aria-controls":s,"aria-expanded":o,role:"tab",id:e}),n.attr({"aria-labelledby":e,"aria-hidden":!o,role:"tabpanel",id:s})});var e=this.$element.find(".is-active");if(e.length){var i=this;e.each(function(){i.down(t(this))})}this._events()}},{key:"_events",value:function(){var e=this;this.$element.find("li").each(function(){var i=t(this).children("[data-submenu]");i.length&&t(this).children("a").off("click.zf.accordionMenu").on("click.zf.accordionMenu",function(t){t.preventDefault(),e.toggle(i)})}).on("keydown.zf.accordionmenu",function(i){var n,s,o=t(this),a=o.parent("ul").children("li"),r=o.children("[data-submenu]");a.each(function(e){return t(this).is(o)?(n=a.eq(Math.max(0,e-1)).find("a").first(),s=a.eq(Math.min(e+1,a.length-1)).find("a").first(),t(this).children("[data-submenu]:visible").length&&(s=o.find("li:first-child").find("a").first()),t(this).is(":first-child")?n=o.parents("li").first().find("a").first():n.
1children("[data-submenu]:visible").length&&(n=n.find("li:last-child").find("a").first()),void(t(this).is(":last-child")&&(s=o.parents("li").first().next("li").find("a").first()))):void 0;
2}),Foundation.Keyboard.handleKey(i,"AccordionMenu",{open:function(){r.is(":hidden")&&(e.down(r),r.find("li").first().find("a").first().focus())},close:function(){r.length&&!r.is(":hidden")?e.up(r):o.parent("[data-submenu]").length&&(e.up(o.parent("[data-submenu]")),o.parents("li").first().find("a").first().focus())},up:function(){n.attr("tabindex",-1).focus(),i.preventDefault()},down:function(){s.attr("tabindex",-1).focus(),i.preventDefault()},toggle:function(){o.children("[data-submenu]").length&&e.toggle(o.children("[data-submenu]"))},closeAll:function(){e.hideAll()},handled:function(){i.stopImmediatePropagation()}})})}},{key:"hideAll",value:function(){this.$element.find("[data-submenu]").slideUp(this.options.slideSpeed)}},{key:"toggle",value:function(t){t.is(":animated")||(t.is(":hidden")?this.down(t):this.up(t))}},{key:"down",value:function(t){var e=this;this.options.multiOpen||this.up(this.$element.find(".is-active").not(t.parentsUntil(this.$element).add(t))),t.addClass("is-active").attr({"aria-hidden":!1}).parent(".is-accordion-submenu-parent").attr({"aria-expanded":!0}),Foundation.Move(this.options.slideSpeed,t,function(){t.slideDown(e.options.slideSpeed,function(){e.$element.trigger("down.zf.accordionMenu",[t])})})}},{key:"up",value:function(t){var e=this;Foundation.Move(this.options.slideSpeed,t,function(){t.slideUp(e.options.slideSpeed,function(){e.$element.trigger("up.zf.accordionMenu",[t])})});var i=t.find("[data-submenu]").slideUp(0).addBack().attr("aria-hidden",!0);i.parent(".is-accordion-submenu-parent").attr("aria-expanded",!1)}},{key:"destroy",value:function(){this.$element.find("[data-submenu]").slideDown(0).css("display",""),this.$element.find("a").off("click.zf.accordionMenu"),Foundation.Nest.Burn(this.$element,"accordion"),Foundation.unregisterPlugin(this)}}]),e}();e.defaults={slideSpeed:250,multiOpen:!0},Foundation.plugin(e,"AccordionMenu")}(jQuery);var _createClass=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}();!function(t){var e=function(){function e(i,n){_classCallCheck(this,e),this.$element=i,this.options=t.extend({},e.defaults,this.$element.data(),n),Foundation.Nest.Feather(this.$element,"drilldown"),this._init(),Foundation.registerPlugin(this,"Drilldown"),Foundation.Keyboard.register("Drilldown",{ENTER:"open",SPACE:"open",ARROW_RIGHT:"next",ARROW_UP:"up",ARROW_DOWN:"down",ARROW_LEFT:"previous",ESCAPE:"close",TAB:"down",SHIFT_TAB:"up"})}return _createClass(e,[{key:"_init",value:function(){this.$submenuAnchors=this.$element.find("li.is-drilldown-submenu-parent").children("a"),this.$submenus=this.$submenuAnchors.parent("li").children("[data-submenu]"),this.$menuItems=this.$element.find("li").not(".js-drilldown-back").attr("role","menuitem").find("a"),this._prepareMenu(),this._keyboardEvents()}},{key:"_prepareMenu",value:function(){var e=this;this.$submenuAnchors.each(function(){var i=t(this),n=i.find("a:first");e.options.parentLink&&n.clone().prependTo(i.children("[data-submenu]")).wrap('<li class="is-submenu-parent-item is-submenu-item is-drilldown-submenu-item" role="menu-item"></li>'),n.data("savedHref",n.attr("href")).removeAttr("href"),i.children("[data-submenu]").attr({"aria-hidden":!0,tabindex:0,role:"menu"}),e._events(i)}),this.$submenus.each(function(){var i=t(this),n=i.find(".js-drilldown-back");n.length||i.prepend(e.options.backButton),e._back(i)}),this.$element.parent().hasClass("is-drilldown")||(this.$wrapper=t(this.options.wrapper).addClass("is-drilldown").css(this._getMaxDims()),this.$element.wrap(this.$wrapper))}},{key:"_events",value:function(e){var i=this;e.off("click.zf.drilldown").on("click.zf.drilldown",function(n){if(t(n.target).parentsUntil("ul","li").hasClass("is-drilldown-submenu-parent")&&(n.stopImmediatePropagation(),n.preventDefault()),i._show(e.parent("li")),i.options.closeOnClick){var s=t("body").not(i.$wrapper);s.off(".zf.drilldown").on("click.zf.drilldown",function(t){t.preventDefault(),i._hideAll(),s.off(".zf.drilldown")})}})}},{key:"_keyboardEvents",value:function(){var e=this;this.$menuItems.add(this.$element.find(".js-drilldown-back > a")).on("keydown.zf.drilldown",function(i){var n,s,o=t(this),a=o.parent("li").parent("ul").children("li").children("a");a.each(function(e){return t(this).is(o)?(n=a.eq(Math.max(0,e-1)),void(s=a.eq(Math.min(e+1,a.length-1)))):void 0}),Foundation.Keyboard.handleKey(i,"Drilldown",{next:function(){o.is(e.$submenuAnchors)&&(e._show(o.parent("li")),o.parent("li").one(Foundation.transitionend(o),function(){o.parent("li").find("ul li a").filter(e.$menuItems).first().focus()}),i.preventDefault())},previous:function(){e._hide(o.parent("li").parent("ul")),o.parent("li").parent("ul").one(Foundation.transitionend(o),function(){setTimeout(function(){o.parent("li").parent("ul").parent("li").children("a").first().focus()},1)}),i.preventDefault()},up:function(){n.focus(),i.preventDefault()},down:function(){s.focus(),i.preventDefault()},close:function(){e._back()},open:function(){o.is(e.$menuItems)?o.is(e.$submenuAnchors)&&(e._show(o.parent("li")),o.parent("li").one(Foundation.transitionend(o),function(){o.parent("li").find("ul li a").filter(e.$menuItems).first().focus()}),i.preventDefault()):(e._hide(o.parent("li").parent("ul")),o.parent("li").parent("ul").one(Foundation.transitionend(o),function(){setTimeout(function(){o.parent("li").parent("ul").parent("li").children("a").first().focus()},1)}),i.preventDefault())},handled:function(){i.stopImmediatePropagation()}})})}}
2,{key:"_hideAll",value:function(){var t=this.$element.find(".is-drilldown-submenu.is-active").addClass("is-closing");t.one(Foundation.transitionend(t),function(e){t.removeClass("is-active is-closing")}),this.$element.trigger("closed.zf.drilldown")}},{key:"_back",value:function(t){var e=this;t.off("click.zf.drilldown"),t.children(".js-drilldown-back").on("click.zf.drilldown",function(i){i.stopImmediatePropagation(),e._hide(t)})}},{key:"_menuLinkEvents",value:function(){var t=this;this.$menuItems.not(".is-drilldown-submenu-parent").off("click.zf.drilldown").on("click.zf.drilldown",function(e){setTimeout(function(){t._hideAll()},0)})}},{key:"_show",value:function(t){t.children("[data-submenu]").addClass("is-active"),this.$element.trigger("open.zf.drilldown",[t])}},{key:"_hide",value:function(t){t.addClass("is-closing").one(Foundation.transitionend(t),function(){t.removeClass("is-active is-closing"),t.blur()}),t.trigger("hide.zf.drilldown",[t])}},{key:"_getMaxDims",value:function(){var e=0,i={};return this.$submenus.add(this.$element).each(function(){var i=t(this).children("li").length;e=i>e?i:e}),i["min-height"]=e*this.$menuItems[0].getBoundingClientRect().height+"px",i["max-width"]=this.$element[0].getBoundingClientRect().width+"px",i}},{key:"destroy",value:function(){this._hideAll(),Foundation.Nest.Burn(this.$element,"drilldown"),this.$element.unwrap().find(".js-drilldown-back, .is-submenu-parent-item").remove().end().find(".is-active, .is-closing, .is-drilldown-submenu").removeClass("is-active is-closing is-drilldown-submenu").end().find("[data-submenu]").removeAttr("aria-hidden tabindex role").off(".zf.drilldown").end().off("zf.drilldown"),this.$element.find("a").each(function(){var e=t(this);e.data("savedHref")&&e.attr("href",e.data("savedHref")).removeData("savedHref")}),Foundation.unregisterPlugin(this)}}]),e}();e.defaults={backButton:'<li class="js-drilldown-back"><a tabindex="0">Back</a></li>',wrapper:"<div></div>",parentLink:!1,closeOnClick:!1},Foundation.plugin(e,"Drilldown")}(jQuery);var _createClass=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}();!function(t){var e=function(){function e(i,n){_classCallCheck(this,e),this.$element=i,this.options=t.extend({},e.defaults,this.$element.data(),n),this._init(),Foundation.registerPlugin(this,"Dropdown"),Foundation.Keyboard.register("Dropdown",{ENTER:"open",SPACE:"open",ESCAPE:"close",TAB:"tab_forward",SHIFT_TAB:"tab_backward"})}return _createClass(e,[{key:"_init",value:function(){var e=this.$element.attr("id");this.$anchor=t('[data-toggle="'+e+'"]')||t('[data-open="'+e+'"]'),this.$anchor.attr({"aria-controls":e,"data-is-focus":!1,"data-yeti-box":e,"aria-haspopup":!0,"aria-expanded":!1}),this.options.positionClass=this.getPositionClass(),this.counter=4,this.usedPositions=[],this.$element.attr({"aria-hidden":"true","data-yeti-box":e,"data-resize":e,"aria-labelledby":this.$anchor[0].id||Foundation.GetYoDigits(6,"dd-anchor")}),this._events()}},{key:"getPositionClass",value:function(){var t=this.$element[0].className.match(/(top|left|right|bottom)/g);t=t?t[0]:"";var e=/float-(.+)\s/.exec(this.$anchor[0].className);e=e?e[1]:"";var i=e?e+" "+t:t;return i}},{key:"_reposition",value:function(t){this.usedPositions.push(t?t:"bottom"),!t&&this.usedPositions.indexOf("top")<0?this.$element.addClass("top"):"top"===t&&this.usedPositions.indexOf("bottom")<0?this.$element.removeClass(t):"left"===t&&this.usedPositions.indexOf("right")<0?this.$element.removeClass(t).addClass("right"):"right"===t&&this.usedPositions.indexOf("left")<0?this.$element.removeClass(t).addClass("left"):!t&&this.usedPositions.indexOf("top")>-1&&this.usedPositions.indexOf("left")<0?this.$element.addClass("left"):"top"===t&&this.usedPositions.indexOf("bottom")>-1&&this.usedPositions.indexOf("left")<0?this.$element.removeClass(t).addClass("left"):"left"===t&&this.usedPositions.indexOf("right")>-1&&this.usedPositions.indexOf("bottom")<0?this.$element.removeClass(t):"right"===t&&this.usedPositions.indexOf("left")>-1&&this.usedPositions.indexOf("bottom")<0?this.$element.removeClass(t):this.$element.removeClass(t),this.classChanged=!0,this.counter--}},{key:"_setPosition",value:function(){if("false"===this.$anchor.attr("aria-expanded"))return!1;var t=this.getPositionClass(),e=Foundation.Box.GetDimensions(this.$element),i=(Foundation.Box.GetDimensions(this.$anchor),"left"===t?"left":"right"===t?"left":"top"),n="top"===i?"height":"width";"height"===n?this.options.vOffset:this.options.hOffset;if(e.width>=e.windowDims.width||!this.counter&&!Foundation.Box.ImNotTouchingYou(this.$element))return this.$element.offset(Foundation.Box.GetOffsets(this.$element,this.$anchor,"center bottom",this.options.vOffset,this.options.hOffset,!0)).css({width:e.windowDims.width-2*this.options.hOffset,height:"auto"}),this.classChanged=!0,!1;for(this.$element.offset(Foundation.Box.GetOffsets(this.$element,this.$anchor,t,this.options.vOffset,this.options.hOffset));!Foundation.Box.ImNotTouchingYou(this.$element,!1,!0)&&this.counter;)this._reposition(t),this._setPosition()}},{key:"_events",value:function(){var e=this;this.$element.on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":this.close.bind(this),"toggle.zf.trigger":this.toggle.bind(this),"resizeme.zf.trigger":this._setPosition.bind(this)}),this.options.hover&&(this.$anchor.off("mouseenter.zf.dropdown mouseleave.zf.dropdown").on("mouseenter.zf.dropdown",function(){clearTimeout(e.timeout),e.timeout=setTimeout(function(){e.open(),e.$anchor.data("hover",!0)},e.options.hoverDelay)}).on("mouseleave.zf.dropdown",function(){clearTimeout(e.timeout),e.timeout=setTimeout(function(){e.close(),e.$anchor.data("hover",!1)},e.options.hoverDelay)}),this.options.hoverPane&&this.$element.off("mouseenter.zf.dropdown mouseleave.zf.dropdown").on("mouseenter.zf.dropdown",function(){clearTimeout(e.timeout)}).on("mouseleave.zf.dropdown",function(){clearTimeout(e.timeout),e.timeout=setTimeout(function(){e.close(),e.$anchor.data("hover",!1)},e.options.hoverDelay)})),this.$anchor.add(this.$element).on("keydown.zf.dropdown",function(i){var n=t(this),s=Foundation.Keyboard.findFocusable(e.$element);Foundation.Keyboard.handleKey(i,"Dropdown",{tab_forward:function(){e.$element.find(":focus").is(s.eq(-1))&&(e.options.trapFocus?(s.eq(0).focus(),i.preventDefault()):e.close())},tab_backward:function(){(e.$element.find(":focus").is(s.eq(0))||e.$element.is(":focus"))&&(e.options.trapFocus?(s.eq(-1).focus(),i.preventDefault()):e.close())},open:function(){n.is(e.$anchor)&&(e.open(),e.$element.attr("tabindex",-1).focus(),i.preventDefault())},close:function(){e.close(),e.$anchor.focus()}})})}},{key:"_addBodyHandler",value:function(){var e=t(document.body).not(this.$element),i=this;e.off("click.zf.dropdown").on("click.zf.dropdown",function(t){i.$anchor.is(t.target)||i.$anchor.find(t.target).length||i.$element.find(t.target).length||(i.close(),e.off("click.zf.dropdown"))})}},{key:"open",value:function(){if(this.$element.trigger("closeme.zf.dropdown",this.$element.attr("id")),this.$anchor.addClass("hover").attr({"aria-expanded":!0}),this._setPosition(),this.$element.addClass("is-open").attr({"aria-hidden":!1}),this.options.autoFocus){var t=Foundation.Keyboard.findFocusable(this.$element);t.length&&t.eq(0).focus()}this.options.closeOnClick&&this._addBodyHandler(),this.$element.trigger("show.zf.dropdown",[this.$element])}},{key:"close",value:function(){if(!this.$element.hasClass("is-open"))return!1;if(this.$element.removeClass("is-open").attr({"aria-hidden":!0}),this.$anchor.removeClass("hover").attr("aria-expanded",!1),this.classChanged){var t=this.getPositionClass();t&&this.$element.removeClass(t),this.$element.addClass(this.options.positionClass).css({height:"",width:""}),this.classChanged=!1,this.counter=4,this.usedPositions.length=0}this.$element.trigger("hide.zf.dropdown",[this.$element])}},{key:"toggle",value:function(){if(this.$element.hasClass("is-open")){if(this.$anchor.data("hover"))return;this.close()}else this.open()}},{key:"destroy",value:function(){this.$element.off(".zf.trigger").hide(),this.$anchor.off(".zf.dropdown"),Foundation.unregisterPlugin(this)}}]),e}();e.defaults={hoverDelay:250,hover:!1,hoverPane:!1,vOffset:1,hOffset:1,positionClass:"",trapFocus:!1,autoFocus:!1,closeOnClick:!1},Foundation.plugin(e,"Dropdown")}(jQuery);var _createClass=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}
2return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}();!function(t){var e=function(){function e(i,n){_classCallCheck(this,e),this.$element=i,this.options=t.extend({},e.defaults,this.$element.data(),n),Foundation.Nest.Feather(this.$element,"dropdown"),this._init(),Foundation.registerPlugin(this,"DropdownMenu"),Foundation.Keyboard.register("DropdownMenu",{ENTER:"open",SPACE:"open",ARROW_RIGHT:"next",ARROW_UP:"up",ARROW_DOWN:"down",ARROW_LEFT:"previous",ESCAPE:"close"})}return _createClass(e,[{key:"_init",value:function(){var t=this.$element.find("li.is-dropdown-submenu-parent");this.$element.children(".is-dropdown-submenu-parent").children(".is-dropdown-submenu").addClass("first-sub"),this.$menuItems=this.$element.find('[role="menuitem"]'),this.$tabs=this.$element.children('[role="menuitem"]'),this.$tabs.find("ul.is-dropdown-submenu").addClass(this.options.verticalClass),this.$element.hasClass(this.options.rightClass)||"right"===this.options.alignment||Foundation.rtl()||this.$element.parents(".top-bar-right").is("*")?(this.options.alignment="right",t.addClass("opens-left")):t.addClass("opens-right"),this.changed=!1,this._events()}},{key:"_events",value:function(){var e=this,i="ontouchstart"in window||"undefined"!=typeof window.ontouchstart,n="is-dropdown-submenu-parent";(this.options.clickOpen||i)&&this.$menuItems.on("click.zf.dropdownmenu touchstart.zf.dropdownmenu",function(s){var o=t(s.target).parentsUntil("ul","."+n),a=o.hasClass(n),r="true"===o.attr("data-is-click");o.children(".is-dropdown-submenu");if(a)if(r){if(!e.options.closeOnClick||!e.options.clickOpen&&!i||e.options.forceFollow&&i)return;s.stopImmediatePropagation(),s.preventDefault(),e._hide(o)}else s.preventDefault(),s.stopImmediatePropagation(),e._show(o.children(".is-dropdown-submenu")),o.add(o.parentsUntil(e.$element,"."+n)).attr("data-is-click",!0)}),this.options.disableHover||this.$menuItems.on("mouseenter.zf.dropdownmenu",function(i){i.stopImmediatePropagation();var s=t(this),o=s.hasClass(n);o&&(clearTimeout(e.delay),e.delay=setTimeout(function(){e._show(s.children(".is-dropdown-submenu"))},e.options.hoverDelay))}).on("mouseleave.zf.dropdownmenu",function(i){var s=t(this),o=s.hasClass(n);if(o&&e.options.autoclose){if("true"===s.attr("data-is-click")&&e.options.clickOpen)return!1;clearTimeout(e.delay),e.delay=setTimeout(function(){e._hide(s)},e.options.closingTime)}}),this.$menuItems.on("keydown.zf.dropdownmenu",function(i){var n,s,o=t(i.target).parentsUntil("ul",'[role="menuitem"]'),a=e.$tabs.index(o)>-1,r=a?e.$tabs:o.siblings("li").add(o);r.each(function(e){return t(this).is(o)?(n=r.eq(e-1),void(s=r.eq(e+1))):void 0});var l=function(){o.is(":last-child")||s.children("a:first").focus()},u=function(){n.children("a:first").focus()},d=function(){var t=o.children("ul.is-dropdown-submenu");t.length&&(e._show(t),o.find("li > a:first").focus())},h=function(){var t=o.parent("ul").parent("li");t.children("a:first").focus(),e._hide(t)},c={open:d,close:function(){e._hide(e.$element),e.$menuItems.find("a:first").focus()},handled:function(){i.preventDefault(),i.stopImmediatePropagation()}};a?e.vertical?"left"===e.options.alignment?t.extend(c,{down:l,up:u,next:d,previous:h}):t.extend(c,{down:l,up:u,next:h,previous:d}):t.extend(c,{next:l,previous:u,down:d,up:h}):"left"===e.options.alignment?t.extend(c,{next:d,previous:h,down:l,up:u}):t.extend(c,{next:h,previous:d,down:l,up:u}),Foundation.Keyboard.handleKey(i,"DropdownMenu",c)})}},{key:"_addBodyHandler",value:function(){var e=t(document.body),i=this;e.off("mouseup.zf.dropdownmenu touchend.zf.dropdownmenu").on("mouseup.zf.dropdownmenu touchend.zf.dropdownmenu",function(t){var n=i.$element.find(t.target);n.length||(i._hide(),e.off("mouseup.zf.dropdownmenu touchend.zf.dropdownmenu"))})}},{key:"_show",value:function(e){var i=this.$tabs.index(this.$tabs.filter(function(i,n){return t(n).find(e).length>0})),n=e.parent("li.is-dropdown-submenu-parent").siblings("li.is-dropdown-submenu-parent");this._hide(n,i),e.css("visibility","hidden").addClass("js-dropdown-active").attr({"aria-hidden":!1}).parent("li.is-dropdown-submenu-parent").addClass("is-active").attr({"aria-expanded":!0});var s=Foundation.Box.ImNotTouchingYou(e,null,!0);if(!s){var o="left"===this.options.alignment?"-right":"-left",a=e.parent(".is-dropdown-submenu-parent");a.removeClass("opens"+o).addClass("opens-"+this.options.alignment),s=Foundation.Box.ImNotTouchingYou(e,null,!0),s||a.removeClass("opens-"+this.options.alignment).addClass("opens-inner"),this.changed=!0}e.css("visibility",""),this.options.closeOnClick&&this._addBodyHandler(),this.$element.trigger("show.zf.dropdownmenu",[e])}},{key:"_hide",value:function(t,e){var i;i=t&&t.length?t:void 0!==e?this.$tabs.not(function(t,i){return t===e}):this.$element;var n=i.hasClass("is-active")||i.find(".is-active").length>0;if(n){if(i.find("li.is-active").add(i).attr({"aria-expanded":!1,"data-is-click":!1}).removeClass("is-active"),i.find("ul.js-dropdown-active").attr({"aria-hidden":!0}).removeClass("js-dropdown-active"),this.changed||i.find("opens-inner").length){var s="left"===this.options.alignment?"right":"left";i.find("li.is-dropdown-submenu-parent").add(i).removeClass("opens-inner opens-"+this.options.alignment).addClass("opens-"+s),this.changed=!1}this.$element.trigger("hide.zf.dropdownmenu",[i])}}},{key:"destroy",value:function(){this.$menuItems.off(".zf.dropdownmenu").removeAttr("data-is-click").removeClass("is-right-arrow is-left-arrow is-down-arrow opens-right opens-left opens-inner"),t(document.body).off(".zf.dropdownmenu"),Foundation.Nest.Burn(this.$element,"dropdown"),Foundation.unregisterPlugin(this)}}]),e}();e.defaults={disableHover:!1,autoclose:!0,hoverDelay:50,clickOpen:!1,closingTime:500,alignment:"left",closeOnClick:!0,verticalClass:"vertical",rightClass:"align-right",forceFollow:!0},Foundation.plugin(e,"DropdownMenu")}(jQuery);var _createClass=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}
2return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}();!function(t){var e=function(){function e(i,n){_classCallCheck(this,e),this.$element=i,this.options=t.extend({},e.defaults,this.$element.data(),n),this._init(),Foundation.registerPlugin(this,"Equalizer")}return _createClass(e,[{key:"_init",value:function(){var e=this.$element.attr("data-equalizer")||"",i=this.$element.find('[data-equalizer-watch="'+e+'"]');this.$watched=i.length?i:this.$element.find("[data-equalizer-watch]"),this.$element.attr("data-resize",e||Foundation.GetYoDigits(6,"eq")),this.hasNested=this.$element.find("[data-equalizer]").length>0,this.isNested=this.$element.parentsUntil(document.body,"[data-equalizer]").length>0,this.isOn=!1;var n,s=this.$element.find("img");this.options.equalizeOn?(n=this._checkMQ(),t(window).on("changed.zf.mediaquery",this._checkMQ.bind(this))):this._events(),(void 0!==n&&n===!1||void 0===n)&&(s.length?Foundation.onImagesLoaded(s,this._reflow.bind(this)):this._reflow())}},{key:"_pauseEvents",value:function(){this.isOn=!1,this.$element.off(".zf.equalizer resizeme.zf.trigger")}},{key:"_events",value:function(){var t=this;this._pauseEvents(),this.hasNested?this.$element.on("postequalized.zf.equalizer",function(e){e.target!==t.$element[0]&&t._reflow()}):this.$element.on("resizeme.zf.trigger",this._reflow.bind(this)),this.isOn=!0}},{key:"_checkMQ",value:function(){var t=!Foundation.MediaQuery.atLeast(this.options.equalizeOn);return t?this.isOn&&(this._pauseEvents(),this.$watched.css("height","auto")):this.isOn||this._events(),t}},{key:"_killswitch",value:function(){}},{key:"_reflow",value:function(){return!this.options.equalizeOnStack&&this._isStacked()?(this.$watched.css("height","auto"),!1):void(this.options.equalizeByRow?this.getHeightsByRow(this.applyHeightByRow.bind(this)):this.getHeights(this.applyHeight.bind(this)))}},{key:"_isStacked",value:function(){return this.$watched[0].offsetTop!==this.$watched[1].offsetTop}},{key:"getHeights",value:function(t){for(var e=[],i=0,n=this.$watched.length;n>i;i++)this.$watched[i].style.height="auto",e.push(this.$watched[i].offsetHeight);t(e)}},{key:"getHeightsByRow",value:function(e){var i=this.$watched.length?this.$watched.first().offset().top:0,n=[],s=0;n[s]=[];for(var o=0,a=this.$watched.length;a>o;o++){this.$watched[o].style.height="auto";var r=t(this.$watched[o]).offset().top;r!=i&&(s++,n[s]=[],i=r),n[s].push([this.$watched[o],this.$watched[o].offsetHeight])}for(var l=0,u=n.length;u>l;l++){var d=t(n[l]).map(function(){return this[1]}).get(),h=Math.max.apply(null,d);n[l].push(h)}e(n)}},{key:"applyHeight",value:function(t){var e=Math.max.apply(null,t);this.$element.trigger("preequalized.zf.equalizer"),this.$watched.css("height",e),this.$element.trigger("postequalized.zf.equalizer")}},{key:"applyHeightByRow",value:function(e){this.$element.trigger("preequalized.zf.equalizer");for(var i=0,n=e.length;n>i;i++){var s=e[i].length,o=e[i][s-1];if(2>=s)t(e[i][0][0]).css({height:"auto"});else{this.$element.trigger("preequalizedrow.zf.equalizer");for(var a=0,r=s-1;r>a;a++)t(e[i][a][0]).css({height:o});this.$element.trigger("postequalizedrow.zf.equalizer")}}this.$element.trigger("postequalized.zf.equalizer")}},{key:"destroy",value:function(){this._pauseEvents(),this.$watched.css("height","auto"),Foundation.unregisterPlugin(this)}}]),e}();e.defaults={equalizeOnStack:!0,equalizeByRow:!1,equalizeOn:""},Foundation.plugin(e,"Equalizer")}(jQuery);var _createClass=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}();!function(t){var e=function(){function e(i,n){_classCallCheck(this,e),this.$element=i,this.options=t.extend({},e.defaults,n),this.rules=[],this.currentPath="",this._init(),this._events(),Foundation.registerPlugin(this,"Interchange")}return _createClass(e,[{key:"_init",value:function(){this._addBreakpoints(),this._generateRules(),this._reflow()}},{key:"_events",value:function(){t(window).on("resize.zf.interchange",Foundation.util.throttle(this._reflow.bind(this),50))}},{key:"_reflow",value:function(){var t;for(var e in this.rules){var i=this.rules[e];window.matchMedia(i.query).matches&&(t=i)}t&&this.replace(t.path)}},{key:"_addBreakpoints",value:function(){for(var t in Foundation.MediaQuery.queries){var i=Foundation.MediaQuery.queries[t];e.SPECIAL_QUERIES[i.name]=i.value}}},{key:"_generateRules",value:function(t){var i,n=[];i=this.options.rules?this.options.rules:this.$element.data("interchange").match(/\[.*?\]/g);for(var s in i){var o=i[s].slice(1,-1).split(", "),a=o.slice(0,-1).join(""),r=o[o.length-1];e.SPECIAL_QUERIES[r]&&(r=e.SPECIAL_QUERIES[r]),n.push({path:a,query:r})}this.rules=n}},{key:"replace",value:function(e){if(this.currentPath!==e){var i=this,n="replaced.zf.interchange";"IMG"===this.$element[0].nodeName?this.$element.attr("src",e).load(function(){i.currentPath=e}).trigger(n):e.match(/\.(gif|jpg|jpeg|png|svg|tiff)([?#].*)?/i)?this.$element.css({"background-image":"url("+e+")"}).trigger(n):t.get(e,function(s){i.$element.html(s).trigger(n),t(s).foundation(),i.currentPath=e})}}},{key:"destroy",value:function(){}}]),e}();e.defaults={rules:null},e.SPECIAL_QUERIES={landscape:"screen and (orientation: landscape)",portrait:"screen and (orientation: portrait)",retina:"only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 2/1), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx)"},Foundation.plugin(e,"Interchange")}(jQuery);var _createClass=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}
2return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}();!function(t){var e=function(){function e(i,n){_classCallCheck(this,e),this.$element=i,this.options=t.extend({},e.defaults,this.$element.data(),n),this._init(),Foundation.registerPlugin(this,"Magellan")}return _createClass(e,[{key:"_init",value:function(){var e=this.$element[0].id||Foundation.GetYoDigits(6,"magellan");this.$targets=t("[data-magellan-target]"),this.$links=this.$element.find("a"),this.$element.attr({"data-resize":e,"data-scroll":e,id:e}),this.$active=t(),this.scrollPos=parseInt(window.pageYOffset,10),this._events()}},{key:"calcPoints",value:function(){var e=this,i=document.body,n=document.documentElement;this.points=[],this.winHeight=Math.round(Math.max(window.innerHeight,n.clientHeight)),this.docHeight=Math.round(Math.max(i.scrollHeight,i.offsetHeight,n.clientHeight,n.scrollHeight,n.offsetHeight)),this.$targets.each(function(){var i=t(this),n=Math.round(i.offset().top-e.options.threshold);i.targetPoint=n,e.points.push(n)})}},{key:"_events",value:function(){var e=this;t("html, body"),{duration:e.options.animationDuration,easing:e.options.animationEasing};t(window).one("load",function(){e.options.deepLinking&&location.hash&&e.scrollToLoc(location.hash),e.calcPoints(),e._updateActive()}),this.$element.on({"resizeme.zf.trigger":this.reflow.bind(this),"scrollme.zf.trigger":this._updateActive.bind(this)}).on("click.zf.magellan",'a[href^="#"]',function(t){t.preventDefault();var i=this.getAttribute("href");e.scrollToLoc(i)})}},{key:"scrollToLoc",value:function(e){var i=Math.round(t(e).offset().top-this.options.threshold/2-this.options.barOffset);t("html, body").stop(!0).animate({scrollTop:i},this.options.animationDuration,this.options.animationEasing)}},{key:"reflow",value:function(){this.calcPoints(),this._updateActive()}},{key:"_updateActive",value:function(){var t,e=parseInt(window.pageYOffset,10);if(e+this.winHeight===this.docHeight)t=this.points.length-1;else if(e<this.points[0])t=0;else{var i=this.scrollPos<e,n=this,s=this.points.filter(function(t,s){return i?e>=t:t-n.options.threshold<=e});t=s.length?s.length-1:0}if(this.$active.removeClass(this.options.activeClass),this.$active=this.$links.eq(t).addClass(this.options.activeClass),this.options.deepLinking){var o=this.$active[0].getAttribute("href");window.history.pushState?window.history.pushState(null,null,o):window.location.hash=o}this.scrollPos=e,this.$element.trigger("update.zf.magellan",[this.$active])}},{key:"destroy",value:function(){if(this.$element.off(".zf.trigger .zf.magellan").find("."+this.options.activeClass).removeClass(this.options.activeClass),this.options.deepLinking){var t=this.$active[0].getAttribute("href");window.location.hash.replace(t,"")}Foundation.unregisterPlugin(this)}}]),e}();e.defaults={animationDuration:500,animationEasing:"linear",threshold:50,activeClass:"active",deepLinking:!1,barOffset:0},Foundation.plugin(e,"Magellan")}(jQuery);var _createClass=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}();!function(t){var e=function(){function e(i,n){_classCallCheck(this,e),this.$element=i,this.options=t.extend({},e.defaults,this.$element.data(),n),this.$lastTrigger=t(),this._init(),this._events(),Foundation.registerPlugin(this,"OffCanvas")}return _createClass(e,[{key:"_init",value:function(){var e=this.$element.attr("id");if(this.$element.attr("aria-hidden","true"),t(document).find('[data-open="'+e+'"], [data-close="'+e+'"], [data-toggle="'+e+'"]').attr("aria-expanded","false").attr("aria-controls",e),this.options.closeOnClick)if(t(".js-off-canvas-exit").length)this.$exiter=t(".js-off-canvas-exit");else{var i=document.createElement("div");i.setAttribute("class","js-off-canvas-exit"),t("[data-off-canvas-content]").append(i),this.$exiter=t(i)}this.options.isRevealed=this.options.isRevealed||new RegExp(this.options.revealClass,"g").test(this.$element[0].className),this.options.isRevealed&&(this.options.revealOn=this.options.revealOn||this.$element[0].className.match(/(reveal-for-medium|reveal-for-large)/g)[0].split("-")[2],this._setMQChecker()),this.options.transitionTime||(this.options.transitionTime=1e3*parseFloat(window.getComputedStyle(t("[data-off-canvas-wrapper]")[0]).transitionDuration))}},{key:"_events",value:function(){this.$element.off(".zf.trigger .zf.offcanvas").on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":this.close.bind(this),"toggle.zf.trigger":this.toggle.bind(this),"ke
2ydown.zf.offcanvas":this._handleKeyboard.bind(this)}),this.options.closeOnClick&&this.$exiter.length&&this.$exiter.on({"click.zf.offcanvas":this.close.bind(this)})}},{key:"_setMQChecker",value:function(){var e=this;t(window).on("changed.zf.mediaquery",function(){Foundation.MediaQuery.atLeast(e.options.revealOn)?e.reveal(!0):e.reveal(!1)}).one("load.zf.offcanvas",function(){Foundation.MediaQuery.atLeast(e.options.revealOn)&&e.reveal(!0)})}},{key:"reveal",value:function(t){var e=this.$element.find("[data-close]");t?(this.close(),this.isRevealed=!0,this.$element.off("open.zf.trigger toggle.zf.trigger"),e.length&&e.hide()):(this.isRevealed=!1,this.$element.on({"open.zf.trigger":this.open.bind(this),"toggle.zf.trigger":this.toggle.bind(this)}),e.length&&e.show())}},{key:"open",value:function(e,i){if(!this.$element.hasClass("is-open")&&!this.isRevealed){var n=this;t(document.body);this.options.forceTop&&t("body").scrollTop(0),Foundation.Move(this.options.transitionTime,this.$element,function(){t("[data-off-canvas-wrapper]").addClass("is-off-canvas-open is-open-"+n.options.position),
3n.$element.addClass("is-open")}),this.$element.attr("aria-hidden","false").trigger("opened.zf.offcanvas"),this.options.closeOnClick&&this.$exiter.addClass("is-visible"),i&&(this.$lastTrigger=i.attr("aria-expanded","true")),this.options.autoFocus&&this.$element.one(Foundation.transitionend(this.$element),function(){n.$element.find("a, button").eq(0).focus()}),this.options.trapFocus&&(t("[data-off-canvas-content]").attr("tabindex","-1"),this._trapFocus())}}},{key:"_trapFocus",value:function(){var t=Foundation.Keyboard.findFocusable(this.$element),e=t.eq(0),i=t.eq(-1);t.off(".zf.offcanvas").on("keydown.zf.offcanvas",function(t){9!==t.which&&9!==t.keycode||(t.target!==i[0]||t.shiftKey||(t.preventDefault(),e.focus()),t.target===e[0]&&t.shiftKey&&(t.preventDefault(),i.focus()))})}},{key:"close",value:function(e){if(this.$element.hasClass("is-open")&&!this.isRevealed){var i=this;t("[data-off-canvas-wrapper]").removeClass("is-off-canvas-open is-open-"+i.options.position),i.$element.removeClass("is-open"),this.$element.attr("aria-hidden","true").trigger("closed.zf.offcanvas"),this.options.closeOnClick&&this.$exiter.removeClass("is-visible"),this.$lastTrigger.attr("aria-expanded","false"),this.options.trapFocus&&t("[data-off-canvas-content]").removeAttr("tabindex")}}},{key:"toggle",value:function(t,e){this.$element.hasClass("is-open")?this.close(t,e):this.open(t,e)}},{key:"_handleKeyboard",value:function(t){27===t.which&&(t.stopPropagation(),t.preventDefault(),this.close(),this.$lastTrigger.focus())}},{key:"destroy",value:function(){this.close(),this.$element.off(".zf.trigger .zf.offcanvas"),this.$exiter.off(".zf.offcanvas"),Foundation.unregisterPlugin(this)}}]),e}();e.defaults={closeOnClick:!0,transitionTime:0,position:"left",forceTop:!0,isRevealed:!1,revealOn:null,autoFocus:!0,revealClass:"reveal-for-",trapFocus:!1},Foundation.plugin(e,"OffCanvas")}(jQuery);var _createClass=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}();!function(t){var e=function(){function e(i,n){_classCallCheck(this,e),this.$element=i,this.options=t.extend({},e.defaults,this.$element.data(),n),this._init(),Foundation.registerPlugin(this,"Orbit"),Foundation.Keyboard.register("Orbit",{ltr:{ARROW_RIGHT:"next",ARROW_LEFT:"previous"},rtl:{ARROW_LEFT:"next",ARROW_RIGHT:"previous"}})}return _createClass(e,[{key:"_init",value:function(){this.$wrapper=this.$element.find("."+this.options.containerClass),this.$slides=this.$element.find("."+this.options.slideClass);var t=this.$element.find("img"),e=this.$slides.filter(".is-active");e.length||this.$slides.eq(0).addClass("is-active"),this.options.useMUI||this.$slides.addClass("no-motionui"),t.length?Foundation.onImagesLoaded(t,this._prepareForOrbit.bind(this)):this._prepareForOrbit(),this.options.bullets&&this._loadBullets(),this._events(),this.options.autoPlay&&this.$slides.length>1&&this.geoSync(),this.options.accessible&&this.$wrapper.attr("tabindex",0)}},{key:"_loadBullets",value:function(){this.$bullets=this.$element.find("."+this.options.boxOfBullets).find("button")}},{key:"geoSync",value:function(){var t=this;this.timer=new Foundation.Timer(this.$element,{duration:this.options.timerDelay,infinite:!1},function(){t.changeSlide(!0)}),this.timer.start()}},{key:"_prepareForOrbit",value:function(){var t=this;this._setWrapperHeight(function(e){t._setSlideHeight(e)})}},{key:"_setWrapperHeight",value:function(e){var i,n=0,s=0;this.$slides.each(function(){i=this.getBoundingClientRect().height,t(this).attr("data-sli
3de",s),s&&t(this).css({position:"relative",display:"none"}),n=i>n?i:n,s++}),s===this.$slides.length&&(this.$wrapper.css({height:n}),e(n))}},{key:"_setSlideHeight",value:function(e){this.$slides.each(function(){t(this).css("max-height",e)})}},{key:"_events",value:function(){var e=this;if(this.$slides.length>1){if(this.options.swipe&&this.$slides.off("swipeleft.zf.orbit swiperight.zf.orbit").on("swipeleft.zf.orbit",function(t){t.preventDefault(),e.changeSlide(!0)}).on("swiperight.zf.orbit",function(t){t.preventDefault(),e.changeSlide(!1)}),this.options.autoPlay&&(this.$slides.on("click.zf.orbit",function(){e.$element.data("clickedOn",!e.$element.data("clickedOn")),e.timer[e.$element.data("clickedOn")?"pause":"start"]()}),this.options.pauseOnHover&&this.$element.on("mouseenter.zf.orbit",function(){e.timer.pause()}).on("mouseleave.zf.orbit",function(){e.$element.data("clickedOn")||e.timer.start()})),this.options.navButtons){var i=this.$element.find("."+this.options.nextClass+", ."+this.options.prevClass);i.attr("tabindex",0).on("click.zf.orbit touchend.zf.orbit",function(i){i.preventDefault(),e.changeSlide(t(this).hasClass(e.options.nextClass))})}this.options.bullets&&this.$bullets.on("click.zf.orbit touchend.zf.orbit",function(){if(/is-active/g.test(this.className))return!1;var i=t(this).data("slide"),n=i>e.$slides.filter(".is-active").data("slide"),s=e.$slides.eq(i);e.changeSlide(n,s,i)}),this.$wrapper.add(this.$bullets).on("keydown.zf.orbit",function(i){Foundation.Keyboard.handleKey(i,"Orbit",{next:function(){e.changeSlide(!0)},previous:function(){e.changeSlide(!1)},handled:function(){t(i.target).is(e.$bullets)&&e.$bullets.filter(".is-active").focus()}})})}}},{key:"changeSlide",value:function(t,e,i){var n=this.$slides.filter(".is-active").eq(0);if(/mui/g.test(n[0].className))return!1;var s,o=this.$slides.first(),a=this.$slides.last(),r=t?"Right":"Left",l=t?"Left":"Right",u=this;s=e?e:t?this.options.infiniteWrap?n.next("."+this.options.slideClass).length?n.next("."+this.options.slideClass):o:n.next("."+this.options.slideClass):this.options.infiniteWrap?n.prev("."+this.options.slideClass).length?n.prev("."+this.options.slideClass):a:n.prev("."+this.options.slideClass),s.length&&(this.options.bullets&&(i=i||this.$slides.index(s),this._updateBullets(i)),this.options.useMUI?(Foundation.Motion.animateIn(s.addClass("is-active").css({position:"absolute",top:0}),this.options["animInFrom"+r],function(){s.css({position:"relative",display:"block"}).attr("aria-live","polite")}),Foundation.Motion.animateOut(n.removeClass("is-active"),this.options["animOutTo"+l],function(){n.removeAttr("aria-live"),u.options.autoPlay&&!u.timer.isPaused&&u.timer.restart()})):(n.removeClass("is-active is-in").removeAttr("aria-live").hide(),s.addClass("is-active is-in").attr("aria-live","polite").show(),this.options.autoPlay&&!this.timer.isPaused&&this.timer.restart()),this.$element.trigger("slidechange.zf.orbit",[s]))}},{key:"_updateBullets",value:function(t){var e=this.$element.find("."+this.options.boxOfBullets).find(".is-active").removeClass("is-active").blur(),i=e.find("span:last").detach();this.$bullets.eq(t).addClass("is-active").append(i)}},{key:"destroy",value:function(){this.$element.off(".zf.orbit").find("*").off(".zf.orbit").end().hide(),Foundation.unregisterPlugin(this)}}]),e}();e.defaults={bullets:!0,navButtons:!0,animInFromRight:"slide-in-right",animOutToRight:"slide-out-right",animInFromLeft:"slide-in-left",animOutToLeft:"slide-out-left",autoPlay:!0,timerDelay:5e3,infiniteWrap:!0,swipe:!0,pauseOnHover:!0,accessible:!0,containerClass:"orbit-container",slideClass:"orbit-slide",boxOfBullets:"orbit-bullets",nextClass:"orbit-next",prevClass:"orbit-previous",useMUI:!0},Foundation.plugin(e,"Orbit")}(jQuery);var _createClass=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}();!function(t){var e=function(){function e(i,n){_classCallCheck(this,e),this.$element=t(i),this.rules=this.$element.data("responsive-menu"),this.currentMq=null,this.currentPlugin=null,this._init(),this._events(),Foundation.registerPlugin(this,"ResponsiveMenu")}return _createClass(e,[{key:"_init",value:function(){if("string"==typeof this.rules){for(var e={},n=this.rules.split(" "),s=0;s<n.length;s++){var o=n[s].split("-"),a=o.length>1?o[0]:"small",r=o.length>1?o[1]:o[0];null!==i[r]&&(e[a]=i[r])}this.rules=e}t.isEmptyObject(this.rules)||this._checkMediaQueries()}},{key:"_events",value:function(){var e=this;t(window).on("changed.zf.mediaquery",function(){e._checkMediaQueries()})}},{key:"_checkMediaQueries",value:function(){var e,n=this;t.each(this.rules,function(t){Foundation.MediaQuery.atLeast(t)&&(e=t)}),e&&(this.currentPlugin instanceof this.rules[e].plugin||(t.each(i,function(t,e){n.$element.removeClass(e.cssClass)}),this.$element.addClass(this.rules[e].cssClass),this.currentPlugin&&this.currentPlugin.destroy(),this.currentPlugin=new this.rules[e].plugin(this.$element,{}
3)))}},{key:"destroy",value:function(){this.currentPlugin.destroy(),t(window).off(".zf.ResponsiveMenu"),Foundation.unregisterPlugin(this)}}]),e}();e.defaults={};var i={dropdown:{cssClass:"dropdown",plugin:Foundation._plugins["dropdown-menu"]||null},drilldown:{cssClass:"drilldown",plugin:Foundation._plugins.drilldown||null},accordion:{cssClass:"accordion-menu",plugin:Foundation._plugins["accordion-menu"]||null}};Foundation.plugin(e,"ResponsiveMenu")}(jQuery);var _createClass=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}();!function(t){var e=function(){function e(i,n){_classCallCheck(this,e),this.$element=t(i),this.options=t.extend({},e.defaults,this.$element.data(),n),this._init(),this._events(),Foundation.registerPlugin(this,"ResponsiveToggle")}return _createClass(e,[{key:"_init",value:function(){var e=this.$element.data("responsive-toggle");e||console.error("Your tab bar needs an ID of a Menu as the value of data-tab-bar."),this.$targetMenu=t("#"+e),this.$toggler=this.$element.find("[data-toggle]"),this._update()}},{key:"_events",value:function(){t(window).on("changed.zf.mediaquery",this._update.bind(this)),this.$toggler.on("click.zf.responsiveToggle",this.toggleMenu.bind(this))}},{key:"_update",value:function(){Foundation.MediaQuery.atLeast(this.options.hideFor)?(this.$element.hide(),this.$targetMenu.show()):(this.$element.show(),this.$targetMenu.hide())}},{key:"toggleMenu",value:function(){Foundation.MediaQuery.atLeast(this.options.hideFor)||(this.$targetMenu.toggle(0),this.$element.trigger("toggled.zf.responsiveToggle"))}},{key:"destroy",value:function(){}}]),e}();e.defaults={hideFor:"medium"},Foundation.plugin(e,"ResponsiveToggle")}(jQuery);var _createClass=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}();!function(t){function e(){return/iP(ad|hone|od).*OS/.test(window.navigator.userAgent)}var i=function(){function i(e,n){_classCallCheck(this,i),this.$element=e,this.options=t.extend({},i.defaults,this.$element.data(),n),this._init(),Foundation.registerPlugin(this,"Reveal"),Foundation.Keyboard.register("Reveal",{ENTER:"open",SPACE:"open",ESCAPE:"close",TAB:"tab_forward",SHIFT_TAB:"tab_backward"})}return _createClass(i,[{key:"_init",value:function(){if(this.id=this.$element.attr("id"),this.isActive=!1,this.cached={mq:Foundation.MediaQuery.current},this.isiOS=e(),this.isiOS&&this.$element.addClass("is-ios"),this.$anchor=t(t('[data-open="'+this.id+'"]').length?'[data-open="'+this.id+'"]':'[data-toggle="'+this.id+'"]'),this.$anchor.length){var i=this.$anchor[0].id||Foundation.GetYoDigits(6,"reveal");this.$anchor.attr({"aria-controls":this.id,id:i,"aria-haspopup":!0,tabindex:0}),this.$element.attr({"aria-labelledby":i})}(this.options.fullScreen||this.$element.hasClass("full"))&&(this.options.fullScreen=!0,this.options.overlay=!1),this.options.overlay&&!this.$overlay&&(this.$overlay=this._makeOverlay(this.id)),this.$element.attr({role:"dialog","aria-hidden":!0,"data-yeti-box":this.id,"data-resize":this.id}),this.$overlay?this.$element.detach().appendTo(this.$overlay):(this.$element.detach().appendTo(t("body")),this.$element.addClass("without-overlay")),this._events(),this.options.deepLink&&window.location.hash==="#"+this.id&&t(window).one("load.zf.reveal",this.open.bind(this))}},{key:"_makeOverlay",value:function(e){var i=t("<div></div>").addClass("reveal-overlay").attr({tabindex:-1,"aria-hidden":!0}).appendTo("body");return i}},{key:"_updatePosition",value:function(){var e,i,n=this.$element.outerWidth(),s=t(window).width(),o=this.$element.outerHeight(),a=t(window).height();e="auto"===this.options.hOffset?parseInt((s-n)/2,10):parseInt(this.options.hOffset,10),i="auto"===this.options.vOffset?o>a?parseInt(Math.min(100,a/10),10):parseInt((a-o)/4,10):parseInt(this.options.vOffset,10),this.$element.css({top:i+"px"}),this.$overlay&&"auto"===this.options.hOffset||(this.$element.css({left:e+"px"}),this.$element.css({margin:"0px"}))}},{key:"_events",value:function(){var e=this;this.$element.on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":this.close.bind(this),"toggle.zf.trigger":this.toggle.bind(this),"resizeme.zf.trigger":function(){e._updatePosition()}}
3),this.$anchor.length&&this.$anchor.on("keydown.zf.reveal",function(t){13!==t.which&&32!==t.which||(t.stopPropagation(),t.preventDefault(),e.open())}),this.options.closeOnClick&&this.options.overlay&&this.$overlay.off(".zf.reveal").on("click.zf.reveal",function(i){i.target===e.$element[0]||t.contains(e.$element[0],i.target)||e.close()}),this.options.deepLink&&t(window).on("popstate.zf.reveal:"+this.id,this._handleState.bind(this))}},{key:"_handleState",value:function(t){window.location.hash!=="#"+this.id||this.isActive?this.close():this.open()}},{key:"open",value:function(){var e=this;if(this.options.deepLink){var i="#"+this.id;window.history.pushState?window.history.pushState(null,null,i):window.location.hash=i}if(this.isActive=!0,this.$element.css({visibility:"hidden"}).show().scrollTop(0),this.options.overlay&&this.$overlay.css({visibility:"hidden"}).show(),this._updatePosition(),this.$element.hide().css({visibility:""}),this.$overlay&&this.$overlay.css({visibility:""}).hide(),this.options.multipleOpened||this.$element.trigger("closeme.zf.reveal",this.id),this.options.animationIn?(this.options.overlay&&Foundation.Motion.animateIn(this.$overlay,"fade-in"),Foundation.Motion.animateIn(this.$element,this.options.animationIn,function(){e.focusableElements=Foundation.Keyboard.findFocusable(e.$element)})):(this.options.overlay&&this.$overlay.show(0),this.$element.show(this.options.showDelay)),this.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),this.$element.trigger("open.zf.reveal"),this.isiOS){var n=window.pageYOffset;t("html, body").addClass("is-reveal-open").scrollTop(n)}else t("body").addClass("is-reveal-open");t("body").addClass("is-reveal-open").attr("aria-hidden",!(!this.options.overlay&&!this.options.fullScreen)),setTimeout(function(){e._extraHandlers()},0)}},{key:"_extraHandlers",value:function(){var e=this;this.focusableElements=Foundation.Keyboard.findFocusable(this.$element),this.options.overlay||!this.options.closeOnClick||this.options.fullScreen||t("body").on("click.zf.reveal",function(i){i.target===e.$element[0]||t.contains(e.$element[0],i.target)||e.close()}),this.options.closeOnEsc&&t(window).on("keydown.zf.reveal",function(t){Foundation.Keyboard.handleKey(t,"Reveal",{close:function(){e.options.closeOnEsc&&(e.close(),e.$anchor.focus())}})}),this.$element.on("keydown.zf.reveal",function(i){var n=t(this);Foundation.Keyboard.handleKey(i,"Reveal",{tab_forward:function(){e.$element.find(":focus").is(e.focusableElements.eq(-1))&&(e.focusableElements.eq(0).focus(),i.preventDefault()),0===e.focusableElements.length&&i.preventDefault()},tab_backward:function(){(e.$element.find(":focus").is(e.focusableElements.eq(0))||e.$element.is(":focus"))&&(e.focusableElements.eq(-1).focus(),i.preventDefault()),0===e.focusableElements.length&&i.preventDefault()},open:function(){e.$element.find(":focus").is(e.$element.find("[data-close]"))?setTimeout(function(){e.$anchor.focus()},1):n.is(e.focusableElements)&&e.open()},close:function(){e.options.closeOnEsc&&(e.close(),e.$anchor.focus())}})})}},{key:"close",value:function(){function e(){i.isiOS?t("html, body").removeClass("is-reveal-open"):t("body").removeClass("is-reveal-open"),t("body").attr({"aria-hidden":!1,tabindex:""}),i.$element.attr("aria-hidden",!0),i.$element.trigger("closed.zf.reveal")}if(!this.isActive||!this.$element.is(":visible"))return!1;var i=this;this.options.animationOut?(this.options.overlay?Foundation.Motion.animateOut(this.$overlay,"fade-out",e):e(),Foundation.Motion.animateOut(this.$element,this.options.animationOut)):(this.options.overlay?this.$overlay.hide(0,e):e(),this.$element.hide(this.options.hideDelay)),this.options.closeOnEsc&&t(window).off("keydown.zf.reveal"),!this.options.overlay&&this.options.closeOnClick&&t("body").off("click.zf.reveal"),this.$element.off("keydown.zf.reveal"),this.options.resetOnClose&&this.$element.html(this.$element.html()),this.isActive=!1,i.options.deepLink&&(window.history.replaceState?window.history.replaceState("",document.title,window.location.pathname):window.location.hash="")}},{key:"toggle",value:function(){this.isActive?this.close():this.open()}},{key:"destroy",value:function(){this.options.overlay&&(this.$element.appendTo(t("body")),this.$overlay.hide().off().remove()),this.$element.hide().off(),this.$anchor.off(".zf"),t(window).off(".zf.reveal:"+this.id
3),Foundation.unregisterPlugin(this)}}]),i}();i.defaults={animationIn:"",animationOut:"",showDelay:0,hideDelay:0,closeOnClick:!0,closeOnEsc:!0,multipleOpened:!1,vOffset:"auto",hOffset:"auto",fullScreen:!1,btmOffsetPct:10,overlay:!0,resetOnClose:!1,deepLink:!1},Foundation.plugin(i,"Reveal")}(jQuery);var _createClass=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}();!function(t){function e(t,e){return t/e}function i(t,e,i,n){return Math.abs(t.position()[e]+t[n]()/2-i)}var n=function(){function n(e,i){_classCallCheck(this,n),this.$element=e,this.options=t.extend({},n.defaults,this.$element.data(),i),this._init(),Foundation.registerPlugin(this,"Slider"),Foundation.Keyboard.register("Slider",{ltr:{ARROW_RIGHT:"increase",ARROW_UP:"increase",ARROW_DOWN:"decrease",ARROW_LEFT:"decrease",SHIFT_ARROW_RIGHT:"increase_fast",SHIFT_ARROW_UP:"increase_fast",SHIFT_ARROW_DOWN:"decrease_fast",SHIFT_ARROW_LEFT:"decrease_fast"},rtl:{ARROW_LEFT:"increase",ARROW_RIGHT:"decrease",SHIFT_ARROW_LEFT:"increase_fast",SHIFT_ARROW_RIGHT:"decrease_fast"}})}return _createClass(n,[{key:"_init",value:function(){this.inputs=this.$element.find("input"),this.handles=this.$element.find("[data-slider-handle]"),this.$handle=this.handles.eq(0),this.$input=this.inputs.length?this.inputs.eq(0):t("#"+this.$handle.attr("aria-controls")),this.$fill=this.$element.find("[data-slider-fill]").css(this.options.vertical?"height":"width",0);var e=!1,i=this;(this.options.disabled||this.$element.hasClass(this.options.disabledClass))&&(this.options.disabled=!0,this.$element.addClass(this.options.disabledClass)),this.inputs.length||(this.inputs=t().add(this.$input),this.options.binding=!0),this._setInitAttr(0),this._events(this.$handle),this.handles[1]&&(this.options.doubleSided=!0,this.$handle2=this.handles.eq(1),this.$input2=this.inputs.length>1?this.inputs.eq(1):t("#"+this.$handle2.attr("aria-controls")),this.inputs[1]||(this.inputs=this.inputs.add(this.$input2)),e=!0,this._setHandlePos(this.$handle,this.options.initialStart,!0,function(){i._setHandlePos(i.$handle2,i.options.initialEnd,!0)}),this._setInitAttr(1),this._events(this.$handle2)),e||this._setHandlePos(this.$handle,this.options.initialStart,!0)}},{key:"_setHandlePos",value:function(t,i,n,s){i=parseFloat(i),i<this.options.start?i=this.options.start:i>this.options.end&&(i=this.options.end);var o=this.options.doubleSided;if(o)if(0===this.handles.index(t)){var a=parseFloat(this.$handle2.attr("aria-valuenow"));i=i>=a?a-this.options.step:i}else{var r=parseFloat(this.$handle.attr("aria-valuenow"));i=r>=i?r+this.options.step:i}this.options.vertical&&!n&&(i=this.options.end-i);var l=this,u=this.options.vertical,d=u?"height":"width",h=u?"top":"left",c=t[0].getBoundingClientRect()[d],f=this.$element[0].getBoundingClientRect()[d],p=e(i-this.options.start,this.options.end-this.options.start).toFixed(2),m=(f-c)*p,v=(100*e(m,f)).toFixed(this.options.decimal);i=parseFloat(i.toFixed(this.options.decimal));var g={};if(this._setValues(t,i),o){var w,y=0===this.handles.index(t),b=~~(100*e(c,f));if(y)g[h]=v+"%",w=parseFloat(this.$handle2[0].style[h])-v+b,s&&"function"==typeof s&&s();else{var $=parseFloat(this.$handle[0].style[h]);w=v-(isNaN($)?this.options.initialStart/((this.options.end-this.options.start)/100):$)+b}g["min-"+d]=w+"%"}this.$element.one("finished.zf.animate",function(){l.$element.trigger("moved.zf.slider",[t])});var C=this.$element.data("dragging")?1e3/60:this.options.moveTime;Foundation.Move(C,t,function(){t.css(h,v+"%"),l.options.doubleSided?l.$fill.css(g):l.$fill.css(d,100*p+"%")}),clearTimeout(l.timeout),l.timeout=setTimeout(function(){l.$element.trigger("changed.zf.slider",[t])},l.options.changedDelay)}},{key:"_setInitAttr",value:function(t){var e=this.inputs.eq(t).attr("id")||Foundation.GetYoDigits(6,"slider");this.inputs.eq(t).attr({id:e,max:this.options.end,min:this.options.start,step:this.options.step}),this.handles.eq(t).attr({role:"slider","aria-controls":e,"aria-valuemax":this.options.end,"aria-valuemin":this.options.start,"aria-valuenow":0===t?this.options.initialStart:this.options.initialEnd,"aria-orientation":this.options.vertical?"vertical":"horizontal",tabindex:0})}},{key:"_setValues",value:function(t,e){var i=this.options.doubleSided?this.handles.index(t):0;this.inputs.eq(i).val(e),t.attr("aria-valuenow",e)}},{key:"_handleEvent",value:function(t,n,s){var o,a;if(s)o=this._adjustValue(null,s),a=!0;else{t.preventDefault();var r=this,l=this.options.vertical,u=l?"height":"width",d=l?"top":"left",h=l?t.pageY:t.pageX,c=this.$handle[0].getBoundingClientRect()[u]/2,f=this.$element[0].getBoundingClientRect()[u],p=this.$element.offset()[d]-h,m=p>0?-c:-f>
3p-c?f:Math.abs(p),v=e(m,f);if(o=(this.options.end-this.options.start)*v+this.options.start,Foundation.rtl()&&!this.options.vertical&&(o=this.options.end-o),o=r._adjustValue(null,o),a=!1,!n){var g=i(this.$handle,d,m,u),w=i(this.$handle2,d,m,u);n=w>=g?this.$handle:this.$handle2}}this._setHandlePos(n,o,a)}},{key:"_adjustValue",value:function(t,e){var i,n,s,o,a=this.options.step,r=parseFloat(a/2);return i=t?parseFloat(t.attr("aria-valuenow")):e,n=i%a,s=i-n,o=s+a,0===n?i:i=i>=s+r?o:s}},{key:"_events",value:function(e){if(this.options.disabled)return!1;var i,n=this;if(this.inputs.off("change.zf.slider").on("change.zf.slider",function(e){var i=n.inputs.index(t(this));n._handleEvent(e,n.handles.eq(i),t(this).val())}),this.options.clickSelect&&this.$element.off("click.zf.slider").on("click.zf.slider",function(e){return n.$element.data("dragging")?!1:void(t(e.target).is("[data-slider-handle]")||(n.options.doubleSided?n._handleEvent(e):n._handleEvent(e,n.$handle)))}),this.options.draggable){this.handles.addTouch();var s=t("body");e.off("mousedown.zf.slider").on("mousedown.zf.slider",function(o){e.addClass("is-dragging"),n.$fill.addClass("is-dragging"),n.$element.data("dragging",!0),i=t(o.currentTarget),s.on("mousemove.zf.slider",function(t){t.preventDefault(),n._handleEvent(t,i)}).on("mouseup.zf.slider",function(t){n._handleEvent(t,i),e.removeClass("is-dragging"),n.$fill.removeClass("is-dragging"),n.$element.data("dragging",!1),s.off("mousemove.zf.slider mouseup.zf.slider")})})}e.off("keydown.zf.slider").on("keydown.zf.slider",function(e){var i,s=t(this),o=n.options.doubleSided?n.handles.index(s):0,a=parseFloat(n.inputs.eq(o).val());Foundation.Keyboard.handleKey(e,"Slider",{decrease:function(){i=a-n.options.step},increase:function(){i=a+n.options.step},decrease_fast:function(){i=a-10*n.options.step},increase_fast:function(){i=a+10*n.options.step},handled:function(){e.preventDefault(),n._setHandlePos(s,i,!0)}})})}},{key:"destroy",value:function(){this.handles.off(".zf.slider"),this.inputs.off(".zf.slider"),this.$element.off(".zf.slider"),Foundation.unregisterPlugin(this)}}]),n}();n.defaults={start:0,end:100,step:1,initialStart:0,initialEnd:100,binding:!1,clickSelect:!0,vertical:!1,draggable:!0,disabled:!1,doubleSided:!1,decimal:2,moveTime:200,disabledClass:"disabled",invertVertical:!1,changedDelay:500},Foundation.plugin(n,"Slider")}(jQuery);var _createClass=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}();!function(t){function e(t){return parseInt(window.getComputedStyle(document.body,null).fontSize,10)*t}var i=function(){function i(e,n){_classCallCheck(this,i),this.$element=e,this.options=t.extend({},i.defaults,this.$element.data(),n),this._init(),Foundation.registerPlugin(this,"Sticky")}return _createClass(i,[{key:"_init",value:function(){var e=this.$element.parent("[data-sticky-container]"),i=this.$element[0].id||Foundation.GetYoDigits(6,"sticky"),n=this;e.length||(this.wasWrapped=!0),this.$container=e.length?e:t(this.options.container).wrapInner(this.$element),this.$container.addClass(this.options.containerClass),this.$element.addClass(this.options.stickyClass).attr({"data-resize":i}),this.scrollCount=this.options.checkEvery,this.isStuck=!1,t(window).one("load.zf.sticky",function(){""!==n.options.anchor?n.$anchor=t("#"+n.options.anchor):n._parsePoints(),n._setSizes(function(){n._calc(!1)}),n._events(i.split("-").reverse().join("-"))})}},{key:"_parsePoints",value:function(){var e=this.options.topAnchor,i=this.options.btmAnchor,n=[e,i],s={};if(e&&i)for(var o=0,a=n.length;a>o&&n[o];o++){var r;if("number"==typeof n[o])r=n[o];else{var l=n[o].split(":"),u=t("#"+l[0]);r=u.offset().top,l[1]&&"bottom"===l[1].toLowerCase()&&(r+=u[0].getBoundingClientRect().height)}s[o]=r}else s={0:1,1:document.documentElement.scrollHeight};this.points=s}},{key:"_events",value:function(e){var i=this,n=this.scrollListener="scroll.zf."+e;this.isOn||(this.canStick&&(this.isOn=!0,t(window).off(n).on(n,function(t){0===i.scrollCount?(i.scrollCount=i.options.checkEvery,i._setSizes(function(){i._calc(!1,window.pageYOffset)})):(i.scrollCount--,i._calc(!1,window.pageYOffset))})),this.$element.off("resizeme.zf.trigger").on("resizeme.zf.trigger",function(t,s){i._setSizes(function(){i._calc(!1),i.canStick?i.isOn||i._events(e):i.isOn&&i._pauseListeners(n)})}))}},{key:"_pauseListeners",value:function(e){this.isOn=!1,t(window).off(e),this.$element.trigger("pause.zf.sticky")}},{key:"_calc",value:function(t,e){return t&&this._setSizes(),this.canStick?(e||(e=window.pageYOffset),void(e>=this.topPoint?e<=this.bottomPoint?this.isStuck||this._setSticky():this.isStuck&&this._removeSticky(!1):this.isStuck&&this._removeSticky(!0))):(this.isStuck&&this._removeSticky(!0),!1)}},{key:"_setSticky",value:function(){var t=this.options.stickTo,e="top"===t?"marginTop":"marginBottom",i="top"===t?"bottom":"top",n={};n[e]=this.options[e]+"em",n[t]=0,n[i]="auto",n.left=this.$container.offset().left+parseInt(window.getComputedStyle(this.$container[0])["padding-left"],10),this.isStuck=!0,this.$element.removeClass("is-anchored is-at-"+i).addClass("is-stuck is-at-"+t).css(n).trigger("sticky.zf.stuckto:"+t)}},{key:"_removeSticky",value:function(t){var e=this.options.stickTo,i="top"===e,n={},s=(this.points?this.points[1]-this.points[0]:this.anchorHeight)-this.elemHeight,o=i?"marginTop":"marginBottom",a=i?"bottom":"top",r=t?"top":"bottom";n[o]=0,t&&!i||i&&!t?(n[e]=s,n[a]=0):(n[e]=0,n[a]=s),n.left="",this.isStuck=!1,this.$element.removeClass("is-stuck is-at-"+e).addClass("is-anchored is-at-"+r).css(n).trigger("sticky.zf.unstuckfrom:"+r)}},{key:"_setSizes",value:function(t){this.canStick=Foundation.MediaQuery.atLeast(this.options.stickyOn),this.canStick||t();var e=this.$container[0].getBoundingClientRect().width,i=window.getComputedStyle(this.$container[0]),n=parseInt(i["padding-right"],10);this.$anchor&&this.$anchor.length?this.anchorHeight=this.$anchor[0].getBoundingClientRect().height:this._parsePoints(),this.$element.css({"max-width":e-n+"px"});var s=this.$element[0].getBoundingClientRect().height||this.containerHeight;this.containerHeight=s,this.$container.css({height:s}),this.elemHeight=s,this.isStuck&&this.$element.css({left:this.$container.offset().left+parseInt(i["padding-left"],10)}),this._setBreakPoints(s,function(){t&&t()})}},{key:"_setBreakPoints",value:function(t,i){if(!this.canStick){if(!i)return!1;i()}var n=e(this.options.marginTop),s=e(this.options.marginBottom),o=this.points?this.points[0]:this.$anchor.offset().top,a=this.points?this.points[1]:o+this.anchorHeight,r=window.innerHeight;"top"===this.options.stickTo?(o-=n,a-=t+n):"bottom"===this.options.stickTo&&(o-=r-(t+s),a-=r-s),this.topPoint=o,this.bottomPoint=a,i&&i()}},{key:"destroy",value:function(){this._removeSticky(!0),this.$element.removeClass(this.options.stickyClass+" is-anchored is-at-top").css({height:"",top:"",bottom:"","max-width":""}).off("resizeme.zf.trigger"),this.$anchor.off("change.zf.sticky"),t(window).off(this.scrollListener),this.wasWrapped?this.$element.unwrap():this.$container.removeClass(this.options.containerClass).css({height:""}),Foundation.unregisterPlugin(this)}}]),i}();
3i.defaults={container:"<div data-sticky-container></div>",stickTo:"top",anchor:"",topAnchor:"",btmAnchor:"",marginTop:1,marginBottom:1,stickyOn:"medium",stickyClass:"sticky",containerClass:"sticky-container",checkEvery:-1},Foundation.plugin(i,"Sticky")}(jQuery);var _createClass=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}();!function(t){var e=function(){function e(i,n){_classCallCheck(this,e),this.$element=i,this.options=t.extend({},e.defaults,this.$element.data(),n),this._init(),Foundation.registerPlugin(this,"Tabs"),Foundation.Keyboard.register("Tabs",{ENTER:"open",SPACE:"open",ARROW_RIGHT:"next",ARROW_UP:"previous",ARROW_DOWN:"next",ARROW_LEFT:"previous"})}return _createClass(e,[{key:"_init",value:function(){var e=this;if(this.$tabTitles=this.$element.find("."+this.options.linkClass),this.$tabContent=t('[data-tabs-content="'+this.$element[0].id+'"]'),this.$tabTitles.each(function(){var i=t(this),n=i.find("a"),s=i.hasClass("is-active"),o=n[0].hash.slice(1),a=n[0].id?n[0].id:o+"-label",r=t("#"+o);i.attr({role:"presentation"}),n.attr({role:"tab","aria-controls":o,"aria-selected":s,id:a}),r.attr({role:"tabpanel","aria-hidden":!s,"aria-labelledby":a}),s&&e.options.autoFocus&&n.focus()}),this.options.matchHeight){var i=this.$tabContent.find("img");i.length?Foundation.onImagesLoaded(i,this._setHeight.bind(this)):this._setHeight()}this._events()}},{key:"_events",value:function(){this._addKeyHandler(),this._addClickHandler(),this.options.matchHeight&&t(window).on("changed.zf.mediaquery",this._setHeight.bind(this))}},{key:"_addClickHandler",value:function(){var e=this;this.$element.off("click.zf.tabs").on("click.zf.tabs","."+this.options.linkClass,function(i){i.preventDefault(),i.stopPropagation(),t(this).hasClass("is-active")||e._handleTabChange(t(this))})}},{key:"_addKeyHandler",value:function(){var e=this;e.$element.find("li:first-of-type"),e.$element.find("li:last-of-type");this.$tabTitles.off("keydown.zf.tabs").on("keydown.zf.tabs",function(i){if(9!==i.which){i.stopPropagation(),i.preventDefault();
4var n,s,o=t(this),a=o.parent("ul").children("li");a.each(function(i){return t(this).is(o)?void(e.options.wrapOnKeys?(n=0===i?a.last():a.eq(i-1),s=i===a.length-1?a.first():a.eq(i+1)):(n=a.eq(Math.max(0,i-1)),s=a.eq(Math.min(i+1,a.length-1)))):void 0}),Foundation.Keyboard.handleKey(i,"Tabs",{open:function(){o.find('[role="tab"]').focus(),e._handleTabChange(o)},previous:function(){n.find('[role="tab"]').focus(),e._handleTabChange(n)},next:function(){s.find('[role="tab"]').focus(),e._handleTabChange(s)}})}})}},{key:"_handleTabChange",value:function(e){var i=e.find('[role="tab"]'),n=i[0].hash,s=this.$tabContent.find(n),o=this.$element.find("."+this.options.linkClass+".is-active").removeClass("is-active").find('[role="tab"]').attr({"aria-selected":"false"});t("#"+o.attr("aria-controls")).removeClass("is-active").attr({"aria-hidden":"true"}),e.addClass("is-active"),i.attr({"aria-selected":"true"}),s.addClass("is-active").attr({"aria-hidden":"false"}),this.$element.trigger("change.zf.tabs",[e])}},{key:"selectTab",value:function(t){var e;e="object"==typeof t?t[0].id:t,e.indexOf("#")<0&&(e="#"+e);var i=this.$tabTitles.find('[href="'+e+'"]').parent("."+this.options.linkClass);this._handleTabChange(i)}},{key:"_setHeight",value:function(){var e=0;this.$tabContent.find("."+this.options.panelClass).css("height","").each(function(){var i=t(this),n=i.hasClass("is-active");n||i.css({visibility:"hidden",display:"block"});var s=this.getBoundingClientRect().height;n||i.css({visibility:"",display:""}),e=s>e?s:e}).css("height",e+"px")}},{key:"destroy",value:function(){this.$element.find("."+this.options.linkClass).off(".zf.tabs").hide().end().find("."+this.options.panelClass).hide(),this.options.matchHeight&&t(window).off("changed.zf.mediaquery"),Foundation.unregisterPlugin(this)}}]),e}();e.defaults={autoFocus:!1,wrapOnKeys:!0,matchHeight:!1,linkClass:"tabs-title",panelClass:"tabs-panel"},Foundation.plugin(e,"Tabs")}(jQuery);var _createClass=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}
4return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}();!function(t){var e=function(){function e(i,n){_classCallCheck(this,e),this.$element=i,this.options=t.extend({},e.defaults,i.data(),n),this.className="",this._init(),this._events(),Foundation.registerPlugin(this,"Toggler")}return _createClass(e,[{key:"_init",value:function(){var e;this.options.animate?(e=this.options.animate.split(" "),this.animationIn=e[0],this.animationOut=e[1]||null):(e=this.$element.data("toggler"),this.className="."===e[0]?e.slice(1):e);var i=this.$element[0].id;t('[data-open="'+i+'"], [data-close="'+i+'"], [data-toggle="'+i+'"]').attr("aria-controls",i),this.$element.attr("aria-expanded",!this.$element.is(":hidden"))}},{key:"_events",value:function(){this.$element.off("toggle.zf.trigger").on("toggle.zf.trigger",this.toggle.bind(this))}},{key:"toggle",value:function(){this[this.options.animate?"_toggleAnimate":"_toggleClass"]()}},{key:"_toggleClass",value:function(){this.$element.toggleClass(this.className);var t=this.$element.hasClass(this.className);t?this.$element.trigger("on.zf.toggler"):this.$element.trigger("off.zf.toggler"),this._updateARIA(t)}},{key:"_toggleAnimate",value:function(){var t=this;this.$element.is(":hidden")?Foundation.Motion.animateIn(this.$element,this.animationIn,function(){t._updateARIA(!0),this.trigger("on.zf.toggler")}):Foundation.Motion.animateOut(this.$element,this.animationOut,function(){t._updateARIA(!1),this.trigger("off.zf.toggler")})}},{key:"_updateARIA",value:function(t){this.$element.attr("aria-expanded",!!t)}},{key:"destroy",value:function(){this.$element.off(".zf.toggler"),Foundation.unregisterPlugin(this)}}]),e}();e.defaults={animate:!1},Foundation.plugin(e,"Toggler")}(jQuery);var _createClass=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}();!function(t){var e=function(){function e(i,n){_classCallCheck(this,e),this.$element=i,this.options=t.extend({},e.defaults,this.$element.data(),n),this.isActive=!1,this.isClick=!1,this._init(),Foundation.registerPlugin(this,"Tooltip")}return _createClass(e,[{key:"_init",value:function(){var e=this.$element.attr("aria-describedby")||Foundation.GetYoDigits(6,"tooltip");this.options.positionClass=this._getPositionClass(this.$element),this.options.tipText=this.options.tipText||this.$element.attr("title"),this.template=this.options.template?t(this.options.template):this._buildTemplate(e),this.template.appendTo(document.body).text(this.options.tipText).hide(),this.$element.attr({title:"","aria-describedby":e,"data-yeti-box":e,"data-toggle":e,"data-resize":e}).addClass(this.triggerClass),this.usedPositions=[],this.counter=4,this.classChanged=!1,this._events()}},{key:"_getPositionClass",value:function(t){if(!t)return"";var e=t[0].className.match(/\b(top|left|right)\b/g);return e=e?e[0]:""}},{key:"_buildTemplate",value:function(e){var i=(this.options.tooltipClass+" "+this.options.positionClass+" "+this.options.templateClasses).trim(),n=t("<div></div>").addClass(i).attr({role:"tooltip","aria-hidden":!0,"data-is-active":!1,"data-is-focus":!1,id:e});return n}},{key:"_reposition",value:function(t){this.usedPositions.push(t?t:"bottom"),!t&&this.usedPositions.indexOf("top")<0?this.template.addClass("top"):"top"===t&&this.usedPositions.indexOf("bottom")<0?this.template.removeClass(t):"left"===t&&this.usedPositions.indexOf("right")<0?this.template.removeClass(t).addClass("right"):"right"===t&&this.usedPositions.indexOf("left")<0?this.template.removeClass(t).addClass("left"):!t&&this.usedPositions.indexOf("top")>-1&&this.usedPositions.indexOf("left")<0?this.template.addClass("left"):"top"===t&&this.usedPositions.indexOf("bottom")>-1&&this.usedPositions.indexOf("left")<0?this.template.removeClass(t).addClass("left"):"left"===t&&this.usedPositions.indexOf("right")>-1&&this.usedPositions.indexOf("bottom")<0?this.template.removeClass(t):"right"===t&&this.usedPositions.indexOf("left")>-1&&this.usedPositions.indexOf("bottom")<0?this.template.removeClass(t):this.template.removeClass(t),this.classChanged=!0,this.counter--}},{key:"_setPosition",value:function(){var t=this._getPositionClass(this.template),e=Foundation.Box.GetDimensions(this.template),i=Foundation.Box.GetDimensions(this.$element),n="left"===t?"left":"right"===t?"left":"top",s="top"===n?"height":"width";"height"===s?this.options.vOffset:this.options.hOffset;if(e.width>=e.windowDims.width||!this.counter&&!Foundation.Box.ImNotTouchingYou(this.template))return this.template.offset(Foundation.Box.GetOffsets(this.template,this.$element,"center bottom",this.options.vOffset,this.options.hOffset,!0)).css({width:i.windowDims.width-2*this.options.hOffset,height:"auto"}),!1;for(this.template.offset(Foundation.Box.GetOffsets(this.template,this.$element,"center "+(t||"bottom"),this.options.vOffset,this.options.hOffset));!Foundation.Box.ImNotTouchingYou(this.template)&&this.counter;)this._reposition(t),this._setPosition()}},{key:"show",value:function(){if("all"!==this.options.showOn&&!Foundation.MediaQuery.atLeast(this.options.showOn))return!1;var t=this;this.template.css("visibility","hidden").show(),this._setPosition(),this.$element.trigger("closeme.zf.tooltip",this.template.attr("id")),this.template.attr({"data-is-active":!0,"aria-hidden":!1}),t.isActive=!0,this.template.stop().hide().css("visibility","").fadeIn(this.options.fadeInDuration,function(){}),this.$element.trigger("show.zf.tooltip")}},{key:"hide",value:function(){var t=this;this.template.stop().attr({"aria-hidden":!0,"data-is-active":!1}).fadeOut(this.options.fadeOutDuration,function(){t.isActive=!1,t.isClick=!1,t.classChanged&&(t.template.removeClass(t._getPositionClass(t.template)).addClass(t.o
4ptions.positionClass),t.usedPositions=[],t.counter=4,t.classChanged=!1)}),this.$element.trigger("hide.zf.tooltip")}},{key:"_events",value:function(){var t=this,e=(this.template,!1);this.options.disableHover||this.$element.on("mouseenter.zf.tooltip",function(e){t.isActive||(t.timeout=setTimeout(function(){t.show()},t.options.hoverDelay))}).on("mouseleave.zf.tooltip",function(i){clearTimeout(t.timeout),(!e||!t.isClick&&t.options.clickOpen)&&t.hide()}),this.options.clickOpen&&this.$element.on("mousedown.zf.tooltip",function(e){e.stopImmediatePropagation(),t.isClick?t.hide():(t.isClick=!0,!t.options.disableHover&&t.$element.attr("tabindex")||t.isActive||t.show())}),this.options.disableForTouch||this.$element.on("tap.zf.tooltip touchend.zf.tooltip",function(e){t.isActive?t.hide():t.show()}),this.$element.on({"close.zf.trigger":this.hide.bind(this)}),this.$element.on("focus.zf.tooltip",function(i){return e=!0,t.isClick?!1:void t.show()}).on("focusout.zf.tooltip",function(i){e=!1,t.isClick=!1,t.hide()}).on("resizeme.zf.trigger",function(){t.isActive&&t._setPosition()})}},{key:"toggle",value:function(){this.isActive?this.hide():this.show()}},{key:"destroy",value:function(){this.$element.attr("title",this.template.text()).off(".zf.trigger .zf.tootip").removeAttr("aria-describedby").removeAttr("data-yeti-box").removeAttr("data-toggle").removeAttr("data-resize"),this.template.remove(),Foundation.unregisterPlugin(this)}}]),e}();e.defaults={disableForTouch:!1,hoverDelay:200,fadeInDuration:150,fadeOutDuration:150,disableHover:!1,templateClasses:"",tooltipClass:"tooltip",triggerClass:"has-tip",showOn:"small",template:"",tipText:"",touchCloseText:"Tap to close.",clickOpen:!0,positionClass:"",vOffset:10,hOffset:12},Foundation.plugin(e,"Tooltip")}(jQuery);
5'use strict';
6
7// Polyfill for requestAnimationFrame
8(function() {
9  if (!Date.now)
10    Date.now = function() { return new Date().getTime(); };
11
12  var vendors = ['webkit', 'moz'];
13  for (var i = 0; i < vendors.length && !window.requestAnimationFrame; ++i) {
14      var vp = vendors[i];
15      window.requestAnimationFrame = window[vp+'RequestAnimationFrame'];
16      window.cancelAnimationFrame = (window[vp+'CancelAnimationFrame']
17                                 || window[vp+'CancelRequestAnimationFrame']);
18  }
19  if (/iP(ad|hone|od).*OS 6/.test(window.navigator.userAgent)
20    || !window.requestAnimationFrame || !window.cancelAnimationFrame) {
21    var lastTime = 0;
22    window.requestAnimationFrame = function(callback) {
23        var now = Date.now();
24        var nextTime = Math.max(lastTime + 16, now);
25        return setTimeout(function() { callback(lastTime = nextTime); },
26                          nextTime - now);
27    };
28    window.cancelAnimationFrame = clearTimeout;
29  }
30})();
31
32var initClasses   = ['mui-enter', 'mui-leave'];
33var activeClasses = ['mui-enter-active', 'mui-leave-active'];
34
35// Find the right "transitionend" event for this browser
36var endEvent = (function() {
37  var transitions = {
38    'transition': 'transitionend',
39    'WebkitTransition': 'webkitTransitionEnd',
40    'MozTransition': 'transitionend',
41    'OTransition': 'otransitionend'
42  }
43  var elem = window.document.createElement('div');
44
45  for (var t in transitions) {
46    if (typeof elem.style[t] !== 'undefined') {
47      return transitions[t];
48    }
49  }
50
51  return null;
52})();
53
54function animate(isIn, element, animation, cb) {
55  element = $(element).eq(0);
56
57  if (!element.length) return;
58
59  if (endEvent === null) {
60    isIn ? element.show() : element.hide();
61    cb();
62    return;
63  }
64
65  var initClass = isIn ? initClasses[0] : initClasses[1];
66  var activeClass = isIn ? activeClasses[0] : activeClasses[1];
67
68  // Set up the animation
69  reset();
70  element.addClass(animation);
71  element.css('transition', 'none');
72  requestAnimationFrame(function() {
73    element.addClass(initClass);
74    if (isIn) element.show();
75  });
76
77  // Start the animation
78  requestAnimationFrame(function() {
79    element[0].offsetWidth;
80    element.css('transition', '');
81    element.addClass(activeClass);
82  });
83
84  // Clean up the animation when it finishes
85  element.one('transitionend', finish);
86
87  // Hides the element (for out animations), resets the element, and runs a callback
88  function finish() {
89    if (!isIn) element.hide();
90    reset();
91    if (cb) cb.apply(element);
92  }
93
94  // Resets transitions and removes motion-specific classes
95  function reset() {
96    element[0].style.transitionDuration = 0;
97    element.removeClass(initClass + ' ' + activeClass + ' ' + animation);
98  }
99}
100
101var MotionUI = {
102  animateIn: function(element, animation, cb) {
103    animate(true, element, animation, cb);
104  },
105
106  animateOut: function(element, animation, cb) {
107    animate(false, element, animation, cb);
108  }
109}
110
111window.whatInput = (function() {
112
113  'use strict';
114
115  /*
116    ---------------
117    variables
118    ---------------
119  */
120
121  // array of actively pressed keys
122  var activeKeys = [];
123
124  // cache document.body
125  var body;
126
127  // boolean: true if touch buffer timer is running
128  var buffer = false;
129
130  // the last used input type
131  var currentInput = null;
132
133  // `input` types that don't accept text
134  var nonTypingInputs = [
135    'button',
136    'checkbox',
137    'file',
138    'image',
139    'radio',
140    'reset',
141    'submit'
142  ];
143
144  // detect version of mouse wheel event to use
145  // via https://developer.mozilla.org/en-US/docs/Web/Events/wheel
146  var mouseWheel = detectWheel();
147
148  // list of modifier keys commonly used with the mouse and
149  // can be safely ignored to prevent false keyboard detection
150  var ignoreMap = [
151    16, // shift
152    17, // control
153    18, // alt
154    91, // Windows key / left Apple cmd
155    93  // Windows menu / right Apple cmd
156  ];
157
158  // mapping of events to input types
159  var inputMap = {
160    'keydown': 'keyboard',
161    'keyup': 'keyboard',
162    'mousedown': 'mouse',
163    'mousemove': 'mouse',
164    'MSPointerDown': 'pointer',
165    'MSPointerMove': 'pointer',
166    'pointerdown': 'pointer',
167    'pointermove': 'pointer',
168    'touchstart': 'touch'
169  };
170
171  // add correct mouse wheel event mapping to `inputMap`
172  inputMap[detectWheel()] = 'mouse';
173
174  // array of all used input types
175  var inputTypes = [];
176
177  // mapping of key codes to a common name
178  var keyMap = {
179    9: 'tab',
180    13: 'enter',
181    16: 'shift',
182    27: 'esc',
183    32: 'space',
184    37: 'left',
185    38: 'up',
186    39: 'right',
187    40: 'down'
188  };
189
190  // map of IE 10 pointer events
191  var pointerMap = {
192    2: 'touch',
193    3: 'touch', // treat pen like touch
194    4: 'mouse'
195  };
196
197  // touch buffer timer
198  var timer;
199
200
201  /*
202    ---------------
203    functions
204    ---------------
205  */
206
207  // allows events that are also triggered to be filtered out for `touchstart`
208  function eventBuffer() {
209    clearTimer();
210    setInput(event);
211
212    buffer = true;
213    timer = window.setTimeout(function() {
214      buffer = false;
215    }, 650);
216  }
217
218  function bufferedEvent(event) {
219    if (!buffer) setInput(event);
220  }
221
222  function unBufferedEvent(event) {
223    clearTimer();
224    setInput(event);
225  }
226
227  function clearTimer() {
228    window.clearTimeout(timer);
229  }
230
231  function setInput(event) {
232    var eventKey = key(event);
233    var value = inputMap[event.type];
234    if (value === 'pointer') value = pointerType(event);
235
236    // don't do anything if the value matches the input type already set
237    if (currentInput !== value) {
238      var eventTarget = target(event);
239      var eventTargetNode = eventTarget.nodeName.toLowerCase();
240      var eventTargetType = (eventTargetNode === 'input') ? eventTarget.getAttribute('type') : null;
241
242      if (
243        (// only if the user flag to allow typing in form fields isn't set
244        !body.hasAttribute('data-whatinput-formtyping') &&
245
246        // only if currentInput has a value
247        currentInput &&
248
249        // only if the input is `keyboard`
250        value === 'keyboard' &&
251
252        // not if the key is `TAB`
253        keyMap[eventKey] !== 'tab' &&
254
255        // only if the target is a form input that accepts text
256        (
257           eventTargetNode === 'textarea' ||
258           eventTargetNode === 'select' ||
259           (eventTargetNode === 'input' && nonTypingInputs.indexOf(eventTargetType) < 0)
260        )) || (
261          // ignore modifier keys
262          ignoreMap.indexOf(eventKey) > -1
263        )
264      ) {
265        // ignore keyboard typing
266      } else {
267        switchInput(value);
268      }
269    }
270
271    if (value === 'keyboard') logKeys(eventKey);
272  }
273
274  function switchInput(string) {
275    currentInput = string;
276    body.setAttribute('data-whatinput', currentInput);
277
278    if (inputTypes.indexOf(currentInput) === -1) inputTypes.push(currentInput);
279  }
280
281  function key(event) {
282    return (event.keyCode) ? event.keyCode : event.which;
283  }
284
285  function target(event) {
286    return event.target || event.srcElement;
287  }
288
289  function pointerType(event) {
290    if (typeof event.pointerType === 'number') {
291      return pointerMap[event.pointerType];
292    } else {
293      return (event.pointerType === 'pen') ? 'touch' : event.pointerType; // treat pen like touch
294    }
295  }
296
297  // keyboard logging
298  function logKeys(eventKey) {
299    if (activeKeys.indexOf(keyMap[eventKey]) === -1 && keyMap[eventKey]) activeKeys.push(keyMap[eventKey]);
300  }
301
302  function unLogKeys(event) {
303    var eventKey = key(event);
304    var arrayPos = activeKeys.indexOf(keyMap[eventKey]);
305
306    if (arrayPos !== -1) activeKeys.splice(arrayPos, 1);
307  }
308
309  function bindEvents() {
310    body = document.body;
311
312    // pointer events (mouse, pen, touch)
313    if (window.PointerEvent) {
314      body.addEventListener('pointerdown', bufferedEvent);
315      body.addEventListener('pointermove', bufferedEvent);
316    } else if (window.MSPointerEvent) {
317      body.addEventListener('MSPointerDown', bufferedEvent);
318      body.addEventListener('MSPointerMove', bufferedEvent);
319    } else {
320
321      // mouse events
322      body.addEventListener('mousedown', bufferedEvent);
323      body.addEventListener('mousemove', bufferedEvent);
324
325      // touch events
326      if ('ontouchstart' in window) {
327        body.addEventListener('touchstart', eventBuffer);
328      }
329    }
330
331    // mouse wheel
332    body.addEventListener(mouseWheel, bufferedEvent);
333
334    // keyboard events
335    body.addEventListener('keydown', unBufferedEvent);
336    body.addEventListener('keyup', unBufferedEvent);
337    document.addEventListener('keyup', unLogKeys);
338  }
339
340
341  /*
342    ---------------
343    utilities
344    ---------------
345  */
346
347  // detect version of mouse wheel event to use
348  // via https://developer.mozilla.org/en-US/docs/Web/Events/wheel
349  function detectWheel() {
350    return mouseWheel = 'onwheel' in document.createElement('div') ?
351      'wheel' : // Modern browsers support "wheel"
352
353      document.onmousewheel !== undefined ?
354        'mousewheel' : // Webkit and IE support at least "mousewheel"
355        'DOMMouseScroll'; // let's assume that remaining browsers are older Firefox
356  }
357
358
359  /*
360    ---------------
361    init
362
363    don't start script unless browser cuts the mustard,
364    also passes if polyfills are used
365    ---------------
366  */
367
368  if (
369    'addEventListener' in window &&
370    Array.prototype.indexOf
371  ) {
372
373    // if the dom is already ready already (script was placed at bottom of <body>
373)
374    if (document.body) {
375      bindEvents();
376
377    // otherwise wait for the dom to load (script was placed in the <head>)
378    } else {
379      document.addEventListener('DOMContentLoaded', bindEvents);
380    }
381  }
382
383
384  /*
385    ---------------
386    api
387    ---------------
388  */
389
390  return {
391
392    // returns string: the current input type
393    ask: function() { return currentInput; },
394
395    // returns array: currently pressed keys
396    keys: function() { return activeKeys; },
397
398    // returns array: all the detected input types
399    types: function() { return inputTypes; },
400
401    // accepts string: manually set the input type
402    set: switchInput
403  };
404
405}());
406
407/*
408     _ _      _       _
409 ___| (_) ___| | __  (_)___
410/ __| | |/ __| |/ /  | / __|
411\__ \ | | (__|   < _ | \__ \
412|___/_|_|\___|_|\_(_)/ |___/
413                   |__/
414
415 Version: 1.5.9
416  Author: Ken Wheeler
417 Website: http://kenwheeler.github.io
418    Docs: http://kenwheeler.github.io/slick
419    Repo: http://github.com/kenwheeler/slick
420  Issues: http://github.com/kenwheeler/slick/issues
421
422 */
423!function(a){"use strict";"function"==typeof define&&define.amd?define(["jquery"],a):"undefined"!=typeof exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){"use strict";var b=window.Slick||{};b=function(){function c(c,d){var f,e=this;e.defaults={accessibility:!0,adaptiveHeight:!1,appendArrows:a(c),appendDots:a(c),arrows:!0,asNavFor:null,prevArrow:'<button type="button" data-role="none" class="slick-prev" aria-label="Previous" tabindex="0" role="button">Previous</button>',nextArrow:'<button type="button" data-role="none" class="slick-next" aria-label="Next" tabindex="0" role="button">Next</button>',autoplay:!1,autoplaySpeed:3e3,centerMode:!1,centerPadding:"50px",cssEase:"ease",customPaging:function(a,b){return'<button type="button" data-role="none" role="button" aria-required="false" tabindex="0">'+(b+1)+"</button>"},dots:!1,dotsClass:"slick-dots",draggable:!0,easing:"linear",edgeFriction:.35,fade:!1,focusOnSelect:!1,infinite:!0,initialSlide:0,lazyLoad:"ondemand",mobileFirst:!1,pauseOnHover:!0,pauseOnDotsHover:!1,respondTo:"window",responsive:null,rows:1,rtl:!1,slide:"",slidesPerRow:1,slidesToShow:1,slidesToScroll:1,speed:500,swipe:!0,swipeToSlide:!1,touchMove:!0,touchThreshold:5,useCSS:!0,useTransform:!1
vendor: 38,833 bytes, lines 423-424
423,variableWidth:!1,vertical:!1,verticalSwiping:!1,waitForAnimate:!0,zIndex:1e3},e.initials={animating:!1,dragging:!1,autoPlayTimer:null,currentDirection:0,currentLeft:null,currentSlide:0,direction:1,$dots:null,listWidth:null,listHeight:null,loadIndex:0,$nextArrow:null,$prevArrow:null,slideCount:null,slideWidth:null,$slideTrack:null,$slides:null,sliding:!1,slideOffset:0,swipeLeft:null,$list:null,touchObject:{},transformsEnabled:!1,unslicked:!1},a.extend(e,e.initials),e.activeBreakpoint=null,e.animType=null,e.animProp=null,e.breakpoints=[],e.breakpointSettings=[],e.cssTransitions=!1,e.hidden="hidden",e.paused=!1,e.positionProp=null,e.respondTo=null,e.rowCount=1,e.shouldClick=!0,e.$slider=a(c),e.$slidesCache=null,e.transformType=null,e.transitionType=null,e.visibilityChange="visibilitychange",e.windowWidth=0,e.windowTimer=null,f=a(c).data("slick")||{},e.options=a.extend({},e.defaults,f,d),e.currentSlide=e.options.initialSlide,e.originalSettings=e.options,"undefined"!=typeof document.mozHidden?(e.hidden="mozHidden",e.visibilityChange="mozvisibilitychange"):"undefined"!=typeof document.webkitHidden&&(e.hidden="webkitHidden",e.visibilityChange="webkitvisibilitychange"),e.autoPlay=a.proxy(e.autoPlay,e),e.autoPlayClear=a.proxy(e.autoPlayClear,e),e.changeSlide=a.proxy(e.changeSlide,e),e.clickHandler=a.proxy(e.clickHandler,e),e.selectHandler=a.proxy(e.selectHandler,e),e.setPosition=a.proxy(e.setPosition,e),e.swipeHandler=a.proxy(e.swipeHandler,e),e.dragHandler=a.proxy(e.dragHandler,e),e.keyHandler=a.proxy(e.keyHandler,e),e.autoPlayIterator=a.proxy(e.autoPlayIterator,e),e.instanceUid=b++,e.htmlExpr=/^(?:\s*(<[\w\W]+>)[^>]*)$/,e.registerBreakpoints(),e.init(!0),e.checkResponsive(!0)}var b=0;return c}(),b.prototype.addSlide=b.prototype.slickAdd=function(b,c,d){var e=this;if("boolean"==typeof c)d=c,c=null;else if(0>c||c>=e.slideCount)return!1;e.unload(),"number"==typeof c?0===c&&0===e.$slides.length?a(b).appendTo(e.$slideTrack):d?a(b).insertBefore(e.$slides.eq(c)):a(b).insertAfter(e.$slides.eq(c)):d===!0?a(b).prependTo(e.$slideTrack):a(b).appendTo(e.$slideTrack),e.$slides=e.$slideTrack.children(this.options.slide),e.$slideTrack.children(this.options.slide).detach(),e.$slideTrack.append(e.$slides),e.$slides.each(function(b,c){a(c).attr("data-slick-index",b)}),e.$slidesCache=e.$slides,e.reinit()},b.prototype.animateHeight=function(){var a=this;if(1===a.options.slidesToShow&&a.options.adaptiveHeight===!0&&a.options.vertical===!1){var b=a.$slides.eq(a.currentSlide).outerHeight(!0);a.$list.animate({height:b},a.options.speed)}},b.prototype.animateSlide=function(b,c){var d={},e=this;e.animateHeight(),e.options.rtl===!0&&e.options.vertical===!1&&(b=-b),e.transformsEnabled===!1?e.options.vertical===!1?e.$slideTrack.animate({left:b},e.options.speed,e.options.easing,c):e.$slideTrack.animate({top:b},e.options.speed,e.options.easing,c):e.cssTransitions===!1?(e.options.rtl===!0&&(e.currentLeft=-e.currentLeft),a({animStart:e.currentLeft}).animate({animStart:b},{duration:e.options.speed,easing:e.options.easing,step:function(a){a=Math.ceil(a),e.options.vertical===!1?(d[e.animType]="translate("+a+"px, 0px)",e.$slideTrack.css(d)):(d[e.animType]="translate(0px,"+a+"px)",e.$slideTrack.css(d))},complete:function(){c&&c.call()}})):(e.applyTransition(),b=Math.ceil(b),e.options.vertical===!1?d[e.animType]="translate3d("+b+"px, 0px, 0px)":d[e.animType]="translate3d(0px,"+b+"px, 0px)",e.$slideTrack.css(d),c&&setTimeout(function(){e.disableTransition(),c.call()},e.options.speed))},b.prototype.asNavFor=function(b){var c=this,d=c.options.asNavFor;d&&null!==d&&(d=a(d).not(c.$slider)),null!==d&&"object"==typeof d&&d.each(function(){var c=a(this).slick("getSlick");c.unslicked||c.slideHandler(b,!0)})},b.prototype.applyTransition=function(a){var b=this,c={};b.options.fade===!1?c[b.transitionType]=b.transformType+" "+b.options.speed+"ms "+b.options.cssEase:c[b.transitionType]="opacity "+b.options.speed+"ms "+b.options.cssEase,b.options.fade===!1?b.$slideTrack.css(c):b.$slides.eq(a).css(c)},b.prototype.autoPlay=function(){var a=this;a.autoPlayTimer&&clearInterval(a.autoPlayTimer),a.slideCount>a.options.slidesToShow&&a.paused!==!0&&(a.autoPlayTimer=setInterval(a.autoPlayIterator,a.options.autoplaySpeed))},b.prototype.autoPlayClear=function(){var a=this;a.autoPlayTimer&&clearInterval(a.autoPlayTimer)},b.prototype.autoPlayIterator=function(){var a=this;a.options.infinite===!1?1===a.direction?(a.currentSlide+1===a.slideCount-1&&(a.direction=0),a.slideHandler(a.currentSlide+a.options.slidesToScroll)):(a.currentSlide-1===0&&(a.direction=1),a.slideHandler(a.currentSlide-a.options.slidesToScroll)):a.slideHandler(a.currentSlide+a.options.slidesToScroll)},b.prototype.buildArrows=function(){var b=this;b.options.arrows===!0&&(b.$prevArrow=a(b.options.prevArrow).addClass("slick-arrow"),b.$nextArrow=a(b.options.nextArrow).addClass("slick-arrow"),b.slideCount>b.options.slidesToShow?(b.$prevArrow.removeClass("slick-hidden").removeAttr("aria-hidden tabindex"),b.$nextArrow.removeClass("slick-hidden").removeAttr("aria-hidden tabindex"),b.htmlExpr.test(b.options.prevArrow)&&b.$prevArrow.prependTo(b.options.appendArrows),b.htmlExpr.test(b.options.nextArrow)&&b.$nextArrow.appendTo(b.options.appendArrows),b.options.infinite!==!0&&b.$prevArrow.addClass("slick-disabled").attr("aria-disabled","true")):b.$prevArrow.add(b.$nextArrow).addClass("slick-hidden").attr({"aria-disabled":"true",tabindex:"-1"}))},b.prototype.buildDots=function(){var c,d,b=this;if(b.options.dots===!0&&b.slideCount>b.options.slidesToShow){for(d='<ul class="'+b.options.dotsClass+'">',c=0;c<=b.getDotCount();c+=1)d+="<li>"+b.options.customPaging.call(this,b,c)+"</li>";d+="</ul>",b.$dots=a(d).appendTo(b.options.appendDots),b.$dots.find("li").first().addClass("slick-active").attr("aria-hidden","false")}},b.prototype.buildOut=function(){var b=this;b.$slides=b.$slider.children(b.options.slide+":not(.slick-cloned)").addClass("slick-slide"),b.slideCount=b.$slides.length,b.$slides.each(function(b,c){a(c).attr("data-slick-index",b).data("originalStyling",a(c).attr("style")||"")}),b.$slider.addClass("slick-slider"),b.$slideTrack=0===b.slideCount?a('<div class="slick-track"/>').appendTo(b.$slider):b.$slides.wrapAll('<div class="slick-track"/>').parent(),b.$list=b.$slideTrack.wrap('<div aria-live="polite" class="slick-list"/>').parent(),b.$slideTrack.css("opacity",0),(b.options.centerMode===!0||b.options.swipeToSlide===!0)&&(b.options.slidesToScroll=1),a("img[data-lazy]",b.$slider).not("[src]").addClass("slick-loading"),b.setupInfinite(),b.buildArrows(),b.buildDots(),b.updateDots(),b.setSlideClasses("number"==typeof b.currentSlide?b.currentSlide:0),b.options.draggable===!0&&b.$list.addClass("draggable")},b.prototype.buildRows=function(){var b,c,d,e,f,g,h,a=this;if(e=document.createDocumentFragment(),g=a.$slider.children(),a.options.rows>1){for(h=a.options.slidesPerRow*a.options.rows,f=Math.ceil(g.length/h),b=0;f>b;b++){var i=document.createElement("div");for(c=0;c<a.options.rows;c++){var j=document.createElement("div");for(d=0;d<a.options.slidesPerRow;d++){var k=b*h+(c*a.options.slidesPerRow+d);g.get(k)&&j.appendChild(g.get(k))}i.appendChild(j)}e.appendChild(i)}a.$slider.html(e),a.$slider.children().children().children().css({width:100/a.options.slidesPerRow+"%",display:"inline-block"})}},b.prototype.checkResponsive=function(b,c){var e,f,g,d=this,h=!1,i=d.$slider.width(),j=window.innerWidth||a(window).width();if("window"===d.respondTo?g=j:"slider"===d.respondTo?g=i:"min"===d.respondTo&&(g=Math.min(j,i)),d.options.responsive&&d.options.responsive.length&&null!==d.options.responsive){f=null;for(e in d.breakpoints)d.breakpoints.hasOwnProperty(e)&&(d.originalSettings.mobileFirst===!1?g<d.breakpoints[e]&&(f=d.breakpoints[e]):g>d.breakpoints[e]&&(f=d.breakpoints[e]));null!==f?null!==d.activeBreakpoint?(f!==d.activeBreakpoint||c)&&(d.activeBreakpoint=f,"unslick"===d.breakpointSettings[f]?d.unslick(f):(d.options=a.extend({},d.originalSettings,d.breakpointSettings[f]),b===!0&&(d.currentSlide=d.options.initialSlide),d.refresh(b)),h=f):(d.activeBreakpoint=f,"unslick"===d.breakpointSettings[f]?d.unslick(f):(d.options=a.extend({},d.originalSettings,d.breakpointSettings[f]),b===!0&&(d.currentSlide=d.options.initialSlide),d.refresh(b)),h=f):null!==d.activeBreakpoint&&(d.activeBreakpoint=null,d.options=d.originalSettings,b===!0&&(d.currentSlide=d.options.initialSlide),d.refresh(b),h=f),b||h===!1||d.$slider.trigger("breakpoint",[d,h])}},b.prototype.changeSlide=function(b,c){var f,g,h,d=this,e=a(b.target);switch(e.is("a")&&b.preventDefault(),e.is("li")||(e=e.closest("li")),h=d.slideCount%d.options.slidesToScroll!==0,f=h?0:(d.slideCount-d.currentSlide)%d.options.slidesToScroll,b.data.message){case"previous":g=0===f?d.options.slidesToScroll:d.options.slidesToShow-f,d.slideCount>d.options.slidesToShow&&d.slideHandler(d.currentSlide-g,!1,c);break;case"next":g=0===f?d.options.slidesToScroll:f,d.slideCount>d.options.slidesToShow&&d.slideHandler(d.currentSlide+g,!1,c);break;case"index":var i=0===b.data.index?0:b.data.index||e.index()*d.options.slidesToScroll;d.slideHandler(d.checkNavigable(i),!1,c),e.children().trigger("focus");break;default:return}},b.prototype.checkNavigable=function(a){var c,d,b=this;if(c=b.getNavigableIndexes(),d=0,a>c[c.length-1])a=c[c.length-1];else for(var e in c){if(a<c[e]){a=d;break}d=c[e]}return a},b.prototype.cleanUpEvents=function(){var b=this;b.options.dots&&null!==b.$dots&&(a("li",b.$dots).off("click.slick",b.changeSlide),b.options.pauseOnDotsHover===!0&&b.options.autoplay===!0&&a("li",b.$dots).off("mouseenter.slick",a.proxy(b.setPaused,b,!0)).off("mouseleave.slick",a.proxy(b.setPaused,b,!1))),b.options.arrows===!0&&b.slideCount>b.options.slidesToShow&&(b.$prevArrow&&b.$prevArrow.off("click.slick",b.changeSlide),b.$nextArrow&&b.$nextArrow.off("click.slick",b.changeSlide)),b.$list.off("touchstart.slick mousedown.slick",b.swipeHandler),b.$list.off("touchmove.slick mousemove.slick",b.swipeHandler),b.$list.off("touchend.slick mouseup.slick",b.swipeHandler),b.$list.off("touchcancel.slick mouseleave.slick",b.swipeHandler),b.$list.off("click.slick",b.clickHandler),a(document).off(b.visibilityChange,b.visibility),b.$list.off("mouseenter.slick",a.proxy(b.setPaused,b,!0)),b.$list.off("mouseleave.slick",a.proxy(b.setPaused,b,!1)),b.options.accessibility===!0&&b.$list.off("keydown.slick",b.keyHandler),b.options.focusOnSelect===!0&&a(b.$slideTrack).children().off("click.slick",b.selectHandler),a(window).off("orientationchange.slick.slick-"+b.instanceUid,b.orientationChange),a(window).off("resize.slick.slick-"+b.instanceUid,b.resize),a("[draggable!=true]",b.$slideTrack).off("dragstart",b.preventDefault),a(window).off("load.slick.slick-"+b.instanceUid,b.setPosition),a(document).off("ready.slick.slick-"+b.instanceUid,b.setPosition)},b.prototype.cleanUpRows=function(){var b,a=this;a.options.rows>1&&(b=a.$slides.children().children(),b.removeAttr("style"),a.$slider.html(b))},b.prototype.clickHandler=function(a){var b=this;b.shouldClick===!1&&(a.stopImmediatePropagation(),a.stopPropagation(),a.preventDefault())},b.prototype.destroy=function(b){var c=this;c.autoPlayClear(),c.touchObject={},c.cleanUpEvents(),a(".slick-cloned",c.$slider).detach(),c.$dots&&c.$dots.remove(),c.$prevArrow&&c.$prevArrow.length&&(c.$prevArrow.removeClass("slick-disabled slick-arrow slick-hidden").removeAttr("aria-hidden aria-disabled tabindex").css("display",""),c.htmlExpr.test(c.options.prevArrow)&&c.$prevArrow.remove()),c.$nextArrow&&c.$nextArrow.length&&(c.$nextArrow.removeClass("slick-disabled slick-arrow slick-hidden").removeAttr("aria-hidden aria-disabled tabindex").css("display",""),c.htmlExpr.test(c.options.nextArrow)&&c.$nextArrow.remove()),c.$slides&&(c.$slides.removeClass("slick-slide slick-active slick-center slick-visible slick-current").removeAttr("aria-hidden").removeAttr("data-slick-index").each(function(){a(this).attr("style",a(this).data("originalStyling"))}),c.$slideTrack.children(this.options.slide).detach(),c.$slideTrack.detach(),c.$list.detach(),c.$slider.append(c.$slides)),c.cleanUpRows(),c.$slider.removeClass("slick-slider"),c.$slider.removeClass("slick-initialized"),c.unslicked=!0,b||c.$slider.trigger("destroy",[c])},b.prototype.disableTransition=function(a){var b=this,c={};c[b.transitionType]="",b.options.fade===!1?b.$slideTrack.css(c):b.$slides.eq(a).css(c)},b.prototype.fadeSlide=function(a,b){var c=this;c.cssTransitions===!1?(c.$slides.eq(a).css({zIndex:c.options.zIndex}),c.$slides.eq(a).animate({opacity:1},c.options.speed,c.options.easing,b)):(c.applyTransition(a),c.$slides.eq(a).css({opacity:1,zIndex:c.options.zIndex}),b&&setTimeout(function(){c.disableTransition(a),b.call()},c.options.speed))},b.prototype.fadeSlideOut=function(a){var b=this;b.cssTransitions===!1?b.$slides.eq(a).animate({opacity:0,zIndex:b.options.zIndex-2},b.options.speed,b.options.easing):(b.applyTransition(a),b.$slides.eq(a).css({opacity:0,zIndex:b.options.zIndex-2}))},b.prototype.filterSlides=b.prototype.slickFilter=function(a){var b=this;null!==a&&(b.$slidesCache=b.$slides,b.unload(),b.$slideTrack.children(this.options.slide).detach(),b.$slidesCache.filter(a).appendTo(b.$slideTrack),b.reinit())},b.prototype.getCurrent=b.prototype.slickCurrentSlide=function(){var a=this;return a.currentSlide},b.prototype.getDotCount=function(){var a=this,b=0,c=0,d=0;if(a.options.infinite===!0)for(;b<a.slideCount;)++d,b=c+a.options.slidesToScroll,c+=a.options.slidesToScroll<=a.options.slidesToShow?a.options.slidesToScroll:a.options.slidesToShow;else if(a.options.centerMode===!0)d=a.slideCount;else for(;b<a.slideCount;)++d,b=c+a.options.slidesToScroll,c+=a.options.slidesToScroll<=a.options.slidesToShow?a.options.slidesToScroll:a.options.slidesToShow;return d-1},b.prototype.getLeft=function(a){var c,d,f,b=this,e=0;return b.slideOffset=0,d=b.$slides.first().outerHeight(!0),b.options.infinite===!0?(b.slideCount>b.options.slidesToShow&&(b.slideOffset=b.slideWidth*b.options.slidesToShow*-1,e=d*b.options.slidesToShow*-1),b.slideCount%b.options.slidesToScroll!==0&&a+b.options.slidesToScroll>b.slideCount&&b.slideCount>b.options.slidesToShow&&(a>b.slideCount?(b.slideOffset=(b.options.slidesToShow-(a-b.slideCount))*b.slideWidth*-1,e=(b.options.slidesToShow-(a-b.slideCount))*d*-1):(b.slideOffset=b.slideCount%b.options.slidesToScroll*b.slideWidth*-1,e=b.slideCount%b.options.slidesToScroll*d*-1))):a+b.options.slidesToShow>b.slideCount&&(b.slideOffset=(a+b.options.slidesToShow-b.slideCount)*b.slideWidth,e=(a+b.options.slidesToShow-b.slideCount)*d),b.slideCount<=b.options.slidesToShow&&(b.slideOffset=0,e=0),b.options.centerMode===!0&&b.options.infinite===!0?b.slideOffset+=b.slideWidth*Math.floor(b.options.slidesToShow/2)-b.slideWidth:b.options.centerMode===!0&&(b.slideOffset=0,b.slideOffset+=b.slideWidth*Math.floor(b.options.slidesToShow/2)),c=b.options.vertical===!1?a*b.slideWidth*-1+b.slideOffset:a*d*-1+e,b.options.variableWidth===!0&&(f=b.slideCount<=b.options.slidesToShow||b.options.infinite===!1?b.$slideTrack.children(".slick-slide").eq(a):b.$slideTrack.children(".slick-slide").eq(a+b.options.slidesToShow),c=b.options.rtl===!0?f[0]?-1*(b.$slideTrack.width()-f[0].offsetLeft-f.width()):0:f[0]?-1*f[0].offsetLeft:0,b.options.centerMode===!0&&(f=b.slideCount<=b.options.slidesToShow||b.options.infinite===!1?b.$slideTrack.children(".slick-slide").eq(a):b.$slideTrack.children(".slick-slide").eq(a+b.options.slidesToShow+1),c=b.options.rtl===!0?f[0]?-1*(b.$slideTrack.width()-f[0].offsetLeft-f.width()):0:f[0]?-1*f[0].offsetLeft:0,c+=(b.$list.width()-f.outerWidth())/2)),c},b.prototype.getOption=b.prototype.slickGetOption=function(a){var b=this;return b.options[a]},b.prototype.getNavigableIndexes=function(){var e,a=this,b=0,c=0,d=[];for(a.options.infinite===!1?e=a.slideCount:(b=-1*a.options.slidesToScroll,c=-1*a.options.slidesToScroll,e=2*a.slideCount);e>b;)d.push(b),b=c+a.options.slidesToScroll,c+=a.options.slidesToScroll<=a.options.slidesToShow?a.options.slidesToScroll:a.options.slidesToShow;return d},b.prototype.getSlick=function(){return this},b.prototype.getSlideCount=function(){var c,d,e,b=this;return e=b.options.centerMode===!0?b.slideWidth*Math.floor(b.options.slidesToShow/2):0,b.options.swipeToSlide===!0?(b.$slideTrack.find(".slick-slide").each(function(c,f){return f.offsetLeft-e+a(f).outerWidth()/2>-1*b.swipeLeft?(d=f,!1):void 0}),c=Math.abs(a(d).attr("data-slick-index")-b.currentSlide)||1):b.options.slidesToScroll},b.prototype.goTo=b.prototype.slickGoTo=function(a,b){var c=this;c.changeSlide({data:{message:"index",index:parseInt(a)}},b)},b.prototype.init=function(b){var c=this;a(c.$slider).hasClass("slick-initialized")||(a(c.$slider).addClass("slick-initialized"),c.buildRows(),c.buildOut(),c.setProps(),c.startLoad(),c.loadSlider(),c.initializeEvents(),c.updateArrows(),c.updateDots()),b&&c.$slider.trigger("init",[c]),c.options.accessibility===!0&&c.initADA()},b.prototype.initArrowEvents=function(){var a=this;a.options.arrows===!0&&a.slideCount>a.options.slidesToShow&&(a.$prevArrow.on("click.slick",{message:"previous"},a.changeSlide),a.$nextArrow.on("click.slick",{message:"next"},a.changeSlide))},b.prototype.initDotEvents=function(){var b=this;b.options.dots===!0&&b.slideCount>b.options.slidesToShow&&a("li",b.$dots).on("click.slick",{message:"index"},b.changeSlide),b.options.dots===!0&&b.options.pauseOnDotsHover===!0&&b.options.autoplay===!0&&a("li",b.$dots).on("mouseenter.slick",a.proxy(b.setPaused,b,!0)).on("mouseleave.slick",a.proxy(b.setPaused,b,!1))},b.prototype.initializeEvents=function(){var b=this;b.initArrowEvents(),b.initDotEvents(),b.$list.on("touchstart.slick mousedown.slick",{action:"start"},b.swipeHandler),b.$list.on("touchmove.slick mousemove.slick",{action:"move"},b.swipeHandler),b.$list.on("touchend.slick mouseup.slick",{action:"end"},b.swipeHandler),b.$list.on("touchcancel.slick mouseleave.slick",{action:"end"},b.swipeHandler),b.$list.on("click.slick",b.clickHandler),a(document).on(b.visibilityChange,a.proxy(b.visibility,b)),b.$list.on("mouseenter.slick",a.proxy(b.setPaused,b,!0)),b.$list.on("mouseleave.slick",a.proxy(b.setPaused,b,!1)),b.options.accessibility===!0&&b.$list.on("keydown.slick",b.keyHandler),b.options.focusOnSelect===!0&&a(b.$slideTrack).children().on("click.slick",b.selectHandler),a(window).on("orientationchange.slick.slick-"+b.instanceUid,a.proxy(b.orientationChange,b)),a(window).on("resize.slick.slick-"+b.instanceUid,a.proxy(b.resize,b)),a("[draggable!=true]",b.$slideTrack).on("dragstart",b.preventDefault),a(window).on("load.slick.slick-"+b.instanceUid,b.setPosition),a(document).on("ready.slick.slick-"+b.instanceUid,b.setPosition)},b.prototype.initUI=function(){var a=this;a.options.arrows===!0&&a.slideCount>a.options.slidesToShow&&(a.$prevArrow.show(),a.$nextArrow.show()),a.options.dots===!0&&a.slideCount>a.options.slidesToShow&&a.$dots.show(),a.options.autoplay===!0&&a.autoPlay()},b.prototype.keyHandler=function(a){var b=this;a.target.tagName.match("TEXTAREA|INPUT|SELECT")||(37===a.keyCode&&b.options.accessibility===!0?b.changeSlide({data:{message:"previous"}}):39===a.keyCode&&b.options.accessibility===!0&&b.changeSlide({data:{message:"next"}}))},b.prototype.lazyLoad=function(){function g(b){a("img[data-lazy]",b).each(function(){var b=a(this),c=a(this).attr("data-lazy"),d=document.createElement("img");d.onload=function(){b.animate({opacity:0},100,function(){b.attr("src",c).animate({opacity:1},200,function(){b.removeAttr("data-lazy").removeClass("slick-loading")})})},d.src=c})}var c,d,e,f,b=this;b.options.centerMode===!0?b.options.infinite===!0?(e=b.currentSlide+(b.options.slidesToShow/2+1),f=e+b.options.slidesToShow+2):(e=Math.max(0,b.currentSlide-(b.options.slidesToShow/2+1)),f=2+(b.options.slidesToShow/2+1)+b.currentSlide):(e=b.options.infinite?b.options.slidesToShow+b.currentSlide:b.currentSlide,f=e+b.options.slidesToShow,b.options.fade===!0&&(e>0&&e--,f<=b.slideCount&&f++)),c=b.$slider.find(".slick-slide").slice(e,f),g(c),b.slideCount<=b.options.slidesToShow?(d=b.$slider.find(".slick-slide"),g(d)):b.currentSlide>=b.slideCount-b.options.slidesToShow?(d=b.$slider.find(".slick-cloned").slice(0,b.options.slidesToShow),g(d)):0===b.currentSlide&&(d=b.$slider.find(".slick-cloned").slice(-1*b.options.slidesToShow),g(d))},b.prototype.loadSlider=function(){var a=this;a.setPosition(),a.$slideTrack.css({opacity:1}),a.$slider.removeClass("slick-loading"),a.initUI(),"progressive"===a.options.lazyLoad&&a.progressiveLazyLoad()},b.prototype.next=b.prototype.slickNext=function(){var a=this;a.changeSlide({data:{message:"next"}})},b.prototype.orientationChange=function(){var a=this;a.checkResponsive(),a.setPosition()},b.prototype.pause=b.prototype.slickPause=function(){var a=this;a.autoPlayClear(),a.paused=!0},b.prototype.play=b.prototype.slickPlay=function(){var a=this;a.paused=!1,a.autoPlay()},b.prototype.postSlide=function(a){var b=this;b.$slider.trigger("afterChange",[b,a]),b.animating=!1,b.setPosition(),b.swipeLeft=null,b.options.autoplay===!0&&b.paused===!1&&b.autoPlay(),b.options.accessibility===!0&&b.initADA()},b.prototype.prev=b.prototype.slickPrev=function(){var a=this;a.changeSlide({data:{message:"previous"}})},b.prototype.preventDefault=function(a){a.preventDefault()},b.prototype.progressiveLazyLoad=function(){var c,d,b=this;c=a("img[data-lazy]",b.$slider).length,c>0&&(d=a("img[data-lazy]",b.$slider).first(),d.attr("src",null),d.attr("src",d.attr("data-lazy")).removeClass("slick-loading").load(function(){d.removeAttr("data-lazy"),b.progressiveLazyLoad(),b.options.adaptiveHeight===!0&&b.setPosition()}).error(function(){d.removeAttr("data-lazy"),b.progressiveLazyLoad()}))},b.prototype.refresh=function(b){var d,e,c=this;e=c.slideCount-c.options.slidesToShow,c.options.infinite||(c.slideCount<=c.options.slidesToShow?c.currentSlide=0:c.currentSlide>e&&(c.currentSlide=e)),d=c.currentSlide,c.destroy(!0),a.extend(c,c.initials,{currentSlide:d}),c.init(),b||c.changeSlide({data:{message:"index",index:d}},!1)},b.prototype.registerBreakpoints=function(){var c,d,e,b=this,f=b.options.responsive||null;if("array"===a.type(f)&&f.length){b.respondTo=b.options.respondTo||"window";for(c in f)if(e=b.breakpoints.length-1,d=f[c].breakpoint,f.hasOwnProperty(c)){for(;e>=0;)b.breakpoints[e]&&b.breakpoints[e]===d&&b.breakpoints.splice(e,1),e--;b.breakpoints.push(d),b.breakpointSettings[d]=f[c].settings}b.breakpoints.sort(function(a,c){return b.options.mobileFirst?a-c:c-a})}},b.prototype.reinit=function(){var b=this;b.$slides=b.$slideTrack.children(b.options.slide).addClass("slick-slide"),b.slideCount=b.$slides.length,b.currentSlide>=b.slideCount&&0!==b.currentSlide&&(b.currentSlide=b.currentSlide-b.options.slidesToScroll),b.slideCount<=b.options.slidesToShow&&(b.currentSlide=0),b.registerBreakpoints(),b.setProps(),b.setupInfinite(),b.buildArrows(),b.updateArrows(),b.initArrowEvents(),b.buildDots(),b.updateDots(),b.initDotEvents(),b.checkResponsive(!1,!0),b.options.focusOnSelect===!0&&a(b.$slideTrack).children().on("click.slick",b.selectHandler),b.setSlideClasses(0),b.setPosition(),b.$slider.trigger("reInit",[b]),b.options.autoplay===!0&&b.focusHandler()},b.prototype.resize=function(){var b=this;a(window).width()!==b.windowWidth&&(clearTimeout(b.windowDelay),b.windowDelay=window.setTimeout(function(){b.windowWidth=a(window).width(),b.checkResponsive(),b.unslicked||b.setPosition()},50))},b.prototype.removeSlide=b.prototype.slickRemove=function(a,b,c){var d=this;return"boolean"==typeof a?(b=a,a=b===!0?0:d.slideCount-1):a=b===!0?--a:a,d.slideCount<1||0>a||a>d.slideCount-1?!1:(d.unload(),c===!0?d.$slideTrack.children().remove():d.$slideTrack.children(this.options.slide).eq(a).remove(),d.$slides=d.$slideTrack.children(this.options.slide),d.$slideTrack.children(this.options.slide).detach(),d.$slideTrack.append(d.$slides),d.$slidesCache=d.$slides,void d.reinit())},b.prototype.setCSS=function(a){var d,e,b=this,c={};b.options.rtl===!0&&(a=-a),d="left"==b.positionProp?Math.ceil(a)+"px":"0px",e="top"==b.positionProp?Math.ceil(a)+"px":"0px",c[b.positionProp]=a,b.transformsEnabled===!1?b.$slideTrack.css(c):(c={},b.cssTransitions===!1?(c[b.animType]="translate("+d+", "+e+")",b.$slideTrack.css(c)):(c[b.animType]="translate3d("+d+", "+e+", 0px)",b.$slideTrack.css(c)))},b.prototype.setDimensions=function(){var a=this;a.options.vertical===!1?a.options.centerMode===!0&&a.$list.css({padding:"0px "+a.options.centerPadding}):(a.$list.height(a.$slides.first().outerHeight(!0)*a.options.slidesToShow),a.options.centerMode===!0&&a.$list.css({padding:a.options.centerPadding+" 0px"})),a.listWidth=a.$list.width(),a.listHeight=a.$list.height(),a.options.vertical===!1&&a.options.variableWidth===!1?(a.slideWidth=Math.ceil(a.listWidth/a.options.slidesToShow),a.$slideTrack.width(Math.ceil(a.slideWidth*a.$slideTrack.children(".slick-slide").length))):a.options.variableWidth===!0?a.$slideTrack.width(5e3*a.slideCount):(a.slideWidth=Math.ceil(a.listWidth),a.$slideTrack.height(Math.ceil(a.$slides.first().outerHeight(!0)*a.$slideTrack.children(".slick-slide").length)));var b=a.$slides.first().outerWidth(!0)-a.$slides.first().width();a.options.variableWidth===!1&&a.$slideTrack.children(".slick-slide").width(a.slideWidth-b)},b.prototype.setFade=function(){var c,b=this;b.$slides.each(function(d,e){c=b.slideWidth*d*-1,b.options.rtl===!0?a(e).css({position:"relative",right:c,top:0,zIndex:b.options.zIndex-2,opacity:0}):a(e).css({position:"relative",left:c,top:0,zIndex:b.options.zIndex-2,opacity:0})}),b.$slides.eq(b.currentSlide).css({zIndex:b.options.zIndex-1,opacity:1})},b.prototype.setHeight=function(){var a=this;if(1===a.options.slidesToShow&&a.options.adaptiveHeight===!0&&a.options.vertical===!1){var b=a.$slides.eq(a.currentSlide).outerHeight(!0);a.$list.css("height",b)}},b.prototype.setOption=b.prototype.slickSetOption=function(b,c,d){var f,g,e=this;if("responsive"===b&&"array"===a.type(c))for(g in c)if("array"!==a.type(e.options.responsive))e.options.responsive=[c[g]];else{for(f=e.options.responsive.length-1;f>=0;)e.options.responsive[f].breakpoint===c[g].breakpoint&&e.options.responsive.splice(f,1),f--;e.options.responsive.push(c[g])}else e.options[b]=c;d===!0&&(e.unload(),e.reinit())},b.prototype.setPosition=function(){var a=this;a.setDimensions(),a.setHeight(),a.options.fade===!1?a.setCSS(a.getLeft(a.currentSlide)):a.setFade(),a.$slider.trigger("setPosition",[a])},b.prototype.setProps=function(){var a=this,b=document.body.style;a.positionProp=a.options.vertical===!0?"top":"left","top"===a.positionProp?a.$slider.addClass("slick-vertical"):a.$slider.removeClass("slick-vertical"),(void 0!==b.WebkitTransition||void 0!==b.MozTransition||void 0!==b.msTransition)&&a.options.useCSS===!0&&(a.cssTransitions=!0),a.options.fade&&("number"==typeof a.options.zIndex?a.options.zIndex<3&&(a.options.zIndex=3):a.options.zIndex=a.defaults.zIndex),void 0!==b.OTransform&&(a.animType="OTransform",a.transformType="-o-transform",a.transitionType="OTransition",void 0===b.perspectiveProperty&&void 0===b.webkitPerspective&&(a.animType=!1)),void 0!==b.MozTransform&&(a.animType="MozTransform",a.transformType="-moz-transform",a.transitionType="MozTransition",void 0===b.perspectiveProperty&&void 0===b.MozPerspective&&(a.animType=!1)),void 0!==b.webkitTransform&&(a.animType="webkitTransform",a.transformType="-webkit-transform",a.transitionType="webkitTransition",void 0===b.perspectiveProperty&&void 0===b.webkitPerspective&&(a.animType=!1)),void 0!==b.msTransform&&(a.animType="msTransform",a.transformType="-ms-transform",a.transitionType="msTransition",void 0===b.msTransform&&(a.animType=!1)),void 0!==b.transform&&a.animType!==!1&&(a.animType="transform",a.transformType="transform",a.transitionType="transition"),a.transformsEnabled=a.options.useTransform&&null!==a.animType&&a.animType!==!1},b.prototype.setSlideClasses=function(a){var c,d,e,f,b=this;d=b.$slider.find(".slick-slide").removeClass("slick-active slick-center slick-current").attr("aria-hidden","true"),b.$slides.eq(a).addClass("slick-current"),b.options.centerMode===!0?(c=Math.floor(b.options.slidesToShow/2),b.options.infinite===!0&&(a>=c&&a<=b.slideCount-1-c?b.$slides.slice(a-c,a+c+1).addClass("slick-active").attr("aria-hidden","false"):(e=b.options.slidesToShow+a,d.slice(e-c+1,e+c+2).addClass("slick-active").attr("aria-hidden","false")),0===a?d.eq(d.length-1-b.options.slidesToShow).addClass("slick-center"):a===b.slideCount-1&&d.eq(b.options.slidesToShow).addClass("slick-center")),b.$slides.eq(a).addClass("slick-center")):a>=0&&a<=b.slideCount-b.options.slidesToShow?b.$slides.slice(a,a+b.options.slidesToShow).addClass("slick-active").attr("aria-hidden","false"):d.length<=b.options.slidesToShow?d.addClass("slick-active").attr("aria-hidden","false"):(f=b.slideCount%b.options.slidesToShow,e=b.options.infinite===!0?b.options.slidesToShow+a:a,b.options.slidesToShow==b.options.slidesToScroll&&b.slideCount-a<b.options.slidesToShow?d.slice(e-(b.options.slidesToShow-f),e+f).addClass("slick-active").attr("aria-hidden","false"):d.slice(e,e+b.options.slidesToShow).addClass("slick-active").attr("aria-hidden","false")),"ondemand"===b.options.lazyLoad&&b.lazyLoad()},b.prototype.setupInfinite=function(){var c,d,e,b=this;if(b.options.fade===!0&&(b.options.centerMode=!1),b.options.infinite===!0&&b.options.fade===!1&&(d=null,b.slideCount>b.options.slidesToShow)){for(e=b.options.centerMode===!0?b.options.slidesToShow+1:b.options.slidesToShow,c=b.slideCount;c>b.slideCount-e;c-=1)d=c-1,a(b.$slides[d]).clone(!0).attr("id","").attr("data-slick-index",d-b.slideCount).prependTo(b.$slideTrack).addClass("slick-cloned");for(c=0;e>c;c+=1)d=c,a(b.$slides[d]).clone(!0).attr("id","").attr("data-slick-index",d+b.slideCount).appendTo(b.$slideTrack).addClass("slick-cloned");b.$slideTrack.find(".slick-cloned").find("[id]").each(function(){a(this).attr("id","")})}},b.prototype.setPaused=function(a){var b=this;b.options.autoplay===!0&&b.options.pauseOnHover===!0&&(b.paused=a,a?b.autoPlayClear():b.autoPlay())},b.prototype.selectHandler=function(b){var c=this,d=a(b.target).is(".slick-slide")?a(b.target):a(b.target).parents(".slick-slide"),e=parseInt(d.attr("data-slick-index"));return e||(e=0),c.slideCount<=c.options.slidesToShow?(c.setSlideClasses(e),void c.asNavFor(e)):void c.slideHandler(e)},b.prototype.slideHandler=function(a,b,c){var d,e,f,g,h=null,i=this;return b=b||!1,i.animating===!0&&i.options.waitForAnimate===!0||i.options.fade===!0&&i.currentSlide===a||i.slideCount<=i.options.slidesToShow?void 0:(b===!1&&i.asNavFor(a),d=a,h=i.getLeft(d),g=i.getLeft(i.currentSlide),i.currentLeft=null===i.swipeLeft?g:i.swipeLeft,i.options.infinite===!1&&i.options.centerMode===!1&&(0>a||a>i.getDotCount()*i.options.slidesToScroll)?void(i.options.fade===!1&&(d=i.currentSlide,c!==!0?i.animateSlide(g,function(){i.postSlide(d);
424}):i.postSlide(d))):i.options.infinite===!1&&i.options.centerMode===!0&&(0>a||a>i.slideCount-i.options.slidesToScroll)?void(i.options.fade===!1&&(d=i.currentSlide,c!==!0?i.animateSlide(g,function(){i.postSlide(d)}):i.postSlide(d))):(i.options.autoplay===!0&&clearInterval(i.autoPlayTimer),e=0>d?i.slideCount%i.options.slidesToScroll!==0?i.slideCount-i.slideCount%i.options.slidesToScroll:i.slideCount+d:d>=i.slideCount?i.slideCount%i.options.slidesToScroll!==0?0:d-i.slideCount:d,i.animating=!0,i.$slider.trigger("beforeChange",[i,i.currentSlide,e]),f=i.currentSlide,i.currentSlide=e,i.setSlideClasses(i.currentSlide),i.updateDots(),i.updateArrows(),i.options.fade===!0?(c!==!0?(i.fadeSlideOut(f),i.fadeSlide(e,function(){i.postSlide(e)})):i.postSlide(e),void i.animateHeight()):void(c!==!0?i.animateSlide(h,function(){i.postSlide(e)}):i.postSlide(e))))},b.prototype.startLoad=function(){var a=this;a.options.arrows===!0&&a.slideCount>a.options.slidesToShow&&(a.$prevArrow.hide(),a.$nextArrow.hide()),a.options.dots===!0&&a.slideCount>a.options.slidesToShow&&a.$dots.hide(),a.$slider.addClass("slick-loading")},b.prototype.swipeDirection=function(){var a,b,c,d,e=this;return a=e.touchObject.startX-e.touchObject.curX,b=e.touchObject.startY-e.touchObject.curY,c=Math.atan2(b,a),d=Math.round(180*c/Math.PI),0>d&&(d=360-Math.abs(d)),45>=d&&d>=0?e.options.rtl===!1?"left":"right":360>=d&&d>=315?e.options.rtl===!1?"left":"right":d>=135&&225>=d?e.options.rtl===!1?"right":"left":e.options.verticalSwiping===!0?d>=35&&135>=d?"left":"right":"vertical"},b.prototype.swipeEnd=function(a){var c,b=this;if(b.dragging=!1,b.shouldClick=b.touchObject.swipeLength>10?!1:!0,void 0===b.touchObject.curX)return!1;if(b.touchObject.edgeHit===!0&&b.$slider.trigger("edge",[b,b.swipeDirection()]),b.touchObject.swipeLength>=b.touchObject.minSwipe)switch(b.swipeDirection()){case"left":c=b.options.swipeToSlide?b.checkNavigable(b.currentSlide+b.getSlideCount()):b.currentSlide+b.getSlideCount(),b.slideHandler(c),b.currentDirection=0,b.touchObject={},b.$slider.trigger("swipe",[b,"left"]);break;case"right":c=b.options.swipeToSlide?b.checkNavigable(b.currentSlide-b.getSlideCount()):b.currentSlide-b.getSlideCount(),b.slideHandler(c),b.currentDirection=1,b.touchObject={},b.$slider.trigger("swipe",[b,"right"])}else b.touchObject.startX!==b.touchObject.curX&&(b.slideHandler(b.currentSlide),b.touchObject={})},b.prototype.swipeHandler=function(a){var b=this;if(!(b.options.swipe===!1||"ontouchend"in document&&b.options.swipe===!1||b.options.draggable===!1&&-1!==a.type.indexOf("mouse")))switch(b.touchObject.fingerCount=a.originalEvent&&void 0!==a.originalEvent.touches?a.originalEvent.touches.length:1,b.touchObject.minSwipe=b.listWidth/b.options.touchThreshold,b.options.verticalSwiping===!0&&(b.touchObject.minSwipe=b.listHeight/b.options.touchThreshold),a.data.action){case"start":b.swipeStart(a);break;case"move":b.swipeMove(a);break;case"end":b.swipeEnd(a)}},b.prototype.swipeMove=function(a){var d,e,f,g,h,b=this;return h=void 0!==a.originalEvent?a.originalEvent.touches:null,!b.dragging||h&&1!==h.length?!1:(d=b.getLeft(b.currentSlide),b.touchObject.curX=void 0!==h?h[0].pageX:a.clientX,b.touchObject.curY=void 0!==h?h[0].pageY:a.clientY,b.touchObject.swipeLength=Math.round(Math.sqrt(Math.pow(b.touchObject.curX-b.touchObject.startX,2))),b.options.verticalSwiping===!0&&(b.touchObject.swipeLength=Math.round(Math.sqrt(Math.pow(b.touchObject.curY-b.touchObject.startY,2)))),e=b.swipeDirection(),"vertical"!==e?(void 0!==a.originalEvent&&b.touchObject.swipeLength>4&&a.preventDefault(),g=(b.options.rtl===!1?1:-1)*(b.touchObject.curX>b.touchObject.startX?1:-1),b.options.verticalSwiping===!0&&(g=b.touchObject.curY>b.touchObject.startY?1:-1),f=b.touchObject.swipeLength,b.touchObject.edgeHit=!1,b.options.infinite===!1&&(0===b.currentSlide&&"right"===e||b.currentSlide>=b.getDotCount()&&"left"===e)&&(f=b.touchObject.swipeLength*b.options.edgeFriction,b.touchObject.edgeHit=!0),b.options.vertical===!1?b.swipeLeft=d+f*g:b.swipeLeft=d+f*(b.$list.height()/b.listWidth)*g,b.options.verticalSwiping===!0&&(b.swipeLeft=d+f*g),b.options.fade===!0||b.options.touchMove===!1?!1:b.animating===!0?(b.swipeLeft=null,!1):void b.setCSS(b.swipeLeft)):void 0)},b.prototype.swipeStart=function(a){var c,b=this;return 1!==b.touchObject.fingerCount||b.slideCount<=b.options.slidesToShow?(b.touchObject={},!1):(void 0!==a.originalEvent&&void 0!==a.originalEvent.touches&&(c=a.originalEvent.touches[0]),b.touchObject.startX=b.touchObject.curX=void 0!==c?c.pageX:a.clientX,b.touchObject.startY=b.touchObject.curY=void 0!==c?c.pageY:a.clientY,void(b.dragging=!0))},b.prototype.unfilterSlides=b.prototype.slickUnfilter=function(){var a=this;null!==a.$slidesCache&&(a.unload(),a.$slideTrack.children(this.options.slide).detach(),a.$slidesCache.appendTo(a.$slideTrack),a.reinit())},b.prototype.unload=function(){var b=this;a(".slick-cloned",b.$slider).remove(),b.$dots&&b.$dots.remove(),b.$prevArrow&&b.htmlExpr.test(b.options.prevArrow)&&b.$prevArrow.remove(),b.$nextArrow&&b.htmlExpr.test(b.options.nextArrow)&&b.$nextArrow.remove(),b.$slides.removeClass("slick-slide slick-active slick-visible slick-current").attr("aria-hidden","true").css("width","")},b.prototype.unslick=function(a){var b=this;b.$slider.trigger("unslick",[b,a]),b.destroy()},b.prototype.updateArrows=function(){var b,a=this;b=Math.floor(a.options.slidesToShow/2),a.options.arrows===!0&&a.slideCount>a.options.slidesToShow&&!a.options.infinite&&(a.$prevArrow.removeClass("slick-disabled").attr("aria-disabled","false"),a.$nextArrow.removeClass("slick-disabled").attr("aria-disabled","false"),0===a.currentSlide?(a.$prevArrow.addClass("slick-disabled").attr("aria-disabled","true"),a.$nextArrow.removeClass("slick-disabled").attr("aria-disabled","false")):a.currentSlide>=a.slideCount-a.options.slidesToShow&&a.options.centerMode===!1?(a.$nextArrow.addClass("slick-disabled").attr("aria-disabled","true"),a.$prevArrow.removeClass("slick-disabled").attr("aria-disabled","false")):a.currentSlide>=a.slideCount-1&&a.options.centerMode===!0&&(a.$nextArrow.addClass("slick-disabled").attr("aria-disabled","true"),a.$prevArrow.removeClass("slick-disabled").attr("aria-disabled","false")))},b.prototype.updateDots=function(){var a=this;null!==a.$dots&&(a.$dots.find("li").removeClass("slick-active").attr("aria-hidden","true"),a.$dots.find("li").eq(Math.floor(a.currentSlide/a.options.slidesToScroll)).addClass("slick-active").attr("aria-hidden","false"))},b.prototype.visibility=function(){var a=this;document[a.hidden]?(a.paused=!0,a.autoPlayClear()):a.options.autoplay===!0&&(a.paused=!1,a.autoPlay())},b.prototype.initADA=function(){var b=this;b.$slides.add(b.$slideTrack.find(".slick-cloned")).attr({"aria-hidden":"true",tabindex:"-1"}).find("a, input, button, select").attr({tabindex:"-1"}),b.$slideTrack.attr("role","listbox"),b.$slides.not(b.$slideTrack.find(".slick-cloned")).each(function(c){a(this).attr({role:"option","aria-describedby":"slick-slide"+b.instanceUid+c})}),null!==b.$dots&&b.$dots.attr("role","tablist").find("li").each(function(c){a(this).attr({role:"presentation","aria-selected":"false","aria-controls":"navigation"+b.instanceUid+c,id:"slick-slide"+b.instanceUid+c})}).first().attr("aria-selected","true").end().find("button").attr("role","button").end().closest("div").attr("role","toolbar"),b.activateADA()},b.prototype.activateADA=function(){var a=this;a.$slideTrack.find(".slick-active").attr({"aria-hidden":"false"}).find("a, input, button, select").attr({tabindex:"0"})},b.prototype.focusHandler=function(){var b=this;b.$slider.on("focus.slick blur.slick","*",function(c){c.stopImmediatePropagation();var d=a(this);setTimeout(function(){b.isPlay&&(d.is(":focus")?(b.autoPlayClear(),b.paused=!0):(b.paused=!1,b.autoPlay()))},0)})},a.fn.slick=function(){var f,g,a=this,c=arguments[0],d=Array.prototype.slice.call(arguments,1),e=a.length;for(f=0;e>f;f++)if("object"==typeof c||"undefined"==typeof c?a[f].slick=new b(a[f],c):g=a[f].slick[c].apply(a[f].slick,d),"undefined"!=typeof g)return g;return a}});
vendor: 144,231 bytes, lines 424-5991
424
425// ==================================================
426// fancyBox v3.5.7
427//
428// Licensed GPLv3 for open source use
429// or fancyBox Commercial License for commercial use
430//
431// http://fancyapps.com/fancybox/
432// Copyright 2019 fancyApps
433//
434// ==================================================
435(function (window, document, $, undefined) {
436	"use strict";
437
438	window.console = window.console || {
439		info: function (stuff) {}
440	};
441
442	// If there's no jQuery, fancyBox can't work
443	// =========================================
444
445	if (!$) {
446		return;
447	}
448
449	// Check if fancyBox is already initialized
450	// ========================================
451
452	if ($.fn.fancybox) {
453		console.info("fancyBox already initialized");
454
455		return;
456	}
457
458	// Private default settings
459	// ========================
460
461	var defaults = {
462		// Close existing modals
463		// Set this to false if you do not need to stack multiple instances
464		closeExisting: false,
465
466		// Enable infinite gallery navigation
467		loop: false,
468
469		// Horizontal space between slides
470		gutter: 50,
471
472		// Enable keyboard navigation
473		keyboard: true,
474
475		// Should allow caption to overlap the content
476		preventCaptionOverlap: true,
477
478		// Should display navigation arrows at the screen edges
479		arrows: true,
480
481		// Should display counter at the top left corner
482		infobar: true,
483
484		// Should display close button (using `btnTpl.smallBtn` template) over the content
485		// Can be true, false, "auto"
486		// If "auto" - will be automatically enabled for "html", "inline" or "ajax" items
487		smallBtn: "auto",
488
489		// Should display toolbar (buttons at the top)
490		// Can be true, false, "auto"
491		// If "auto" - will be automatically hidden if "smallBtn" is enabled
492		toolbar: "auto",
493
494		// What buttons should appear in the top right corner.
495		// Buttons will be created using templates from `btnTpl` option
496		// and they will be placed into toolbar (class="fancybox-toolbar"` element)
497		buttons: [
498			"zoom",
499			//"share",
500			"slideShow",
501			//"fullScreen",
502			//"download",
503			"thumbs",
504			"close"
505		],
506
507		// Detect "idle" time in seconds
508		idleTime: 3,
509
510		// Disable right-click and use simple image protection for images
511		protect: false,
512
513		// Shortcut to make content "modal" - disable keyboard navigtion, hide buttons, etc
514		modal: false,
515
516		image: {
517			// Wait for images to load before displaying
518			//   true  - wait for image to load and then display;
519			//   false - display thumbnail and load the full-sized image over top,
520			//           requires predefined image dimensions (`data-width` and `data-height` attributes)
521			preload: false
522		},
523
524		ajax: {
525			// Object containing settings for ajax request
526			settings: {
527				// This helps to indicate that request comes from the modal
528				// Feel free to change naming
529				data: {
530					fancybox: true
531				}
532			}
533		},
534
535		iframe: {
536			// Iframe template
537			tpl: '<iframe id="fancybox-frame{rnd}" name="fancybox-frame{rnd}" class="fancybox-iframe" allowfullscreen="allowfullscreen" allow="autoplay; fullscreen" src=""></iframe>',
538
539			// Preload iframe before displaying it
540			// This allows to calculate iframe content width and height
541			// (note: Due to "Same Origin Policy", you can't get cross domain data).
542			preload: true,
543
544			// Custom CSS styling for iframe wrapping element
545			// You can use this to set custom iframe dimensions
546			css: {},
547
548			// Iframe tag attributes
549			attr: {
550				scrolling: "auto"
551			}
552		},
553
554		// For HTML5 video only
555		video: {
556			tpl: '<video class="fancybox-video" controls controlsList="nodownload" poster="{{poster}}">' +
557				'<source src="{{src}}" type="{{format}}" />' +
558				'Sorry, your browser doesn\'t support embedded videos, <a href="{{src}}">download</a> and watch with your favorite video player!' +
559				"</video>",
560			format: "", // custom video format
561			autoStart: true
562		},
563
564		// Default content type if cannot be detected automatically
565		defaultType: "image",
566
567		// Open/close animation type
568		// Possible values:
569		//   false            - disable
570		//   "zoom"           - zoom images from/to thumbnail
571		//   "fade"
572		//   "zoom-in-out"
573		//
574		animationEffect: "zoom",
575
576		// Duration in ms for open/close animation
577		animationDuration: 366,
578
579		// Should image change opacity while zooming
580		// If opacity is "auto", then opacity will be changed if image and thumbnail have different aspect ratios
581		zoomOpacity: "auto",
582
583		// Transition effect between slides
584		//
585		// Possible values:
586		//   false            - disable
587		//   "fade'
588		//   "slide'
589		//   "circular'
590		//   "tube'
591		//   "zoom-in-out'
592		//   "rotate'
593		//
594		transitionEffect: "fade",
595
596		// Duration in ms for transition animation
597		transitionDuration: 366,
598
599		// Custom CSS class for slide element
600		slideClass: "",
601
602		// Custom CSS class for layout
603		baseClass: "",
604
605		// Base template for layout
606		baseTpl: '<div class="fancybox-container" role="dialog" tabindex="-1">' +
607			'<div class="fancybox-bg"></div>' +
608			'<div class="fancybox-inner">' +
609			'<div class="fancybox-infobar"><span data-fancybox-index></span>&nbsp;/&nbsp;<span data-fancybox-count></span></div>' +
610			'<div class="fancybox-toolbar">{{buttons}}</div>' +
611			'<div class="fancybox-navigation">{{arrows}}</div>' +
612			'<div class="fancybox-stage"></div>' +
613			'<div class="fancybox-caption"><div class="fancybox-caption__body"></div></div>' +
614			"</div>" +
615			"</div>",
616
617		// Loading indicator template
618		spinnerTpl: '<div class="fancybox-loading"></div>',
619
620		// Error message template
621		errorTpl: '<div class="fancybox-error"><p>{{ERROR}}</p></div>',
622
623		btnTpl: {
624			download: '<a download data-fancybox-download class="fancybox-button fancybox-button--download" title="{{DOWNLOAD}}" href="javascript:;">' +
625				'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18.62 17.09V19H5.38v-1.91zm-2.97-6.96L17 11.45l-5 4.87-5-4.87 1.36-1.32 2.68 2.64V5h1.92v7.77z"/></svg>' +
626				"</a>",
627
628			zoom: '<button data-fancybox-zoom class="fancybox-button fancybox-button--zoom" title="{{ZOOM}}">' +
629				'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18.7 17.3l-3-3a5.9 5.9 0 0 0-.6-7.6 5.9 5.9 0 0 0-8.4 0 5.9 5.9 0 0 0 0 8.4 5.9 5.9 0 0 0 7.7.7l3 3a1 1 0 0 0 1.3 0c.4-.5.4-1 0-1.5zM8.1 13.8a4 4 0 0 1 0-5.7 4 4 0 0 1 5.7 0 4 4 0 0 1 0 5.7 4 4 0 0 1-5.7 0z"/></svg>' +
630				"</button>",
631
632			close: '<button data-fancybox-close class="fancybox-button fancybox-button--close" title="{{CLOSE}}">' +
633				'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 10.6L6.6 5.2 5.2 6.6l5.4 5.4-5.4 5.4 1.4 1.4 5.4-5.4 5.4 5.4 1.4-1.4-5.4-5.4 5.4-5.4-1.4-1.4-5.4 5.4z"/></svg>' +
634				"</button>",
635
636			// Arrows
637			arrowLeft: '<button data-fancybox-prev class="fancybox-button fancybox-button--arrow_left" title="{{PREV}}">' +
638				'<div><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M11.28 15.7l-1.34 1.37L5 12l4.94-5.07 1.34 1.38-2.68 2.72H19v1.94H8.6z"/></svg></div>' +
639				"</button>",
640
641			arrowRight: '<button data-fancybox-next class="fancybox-button fancybox-button--arrow_right" title="{{NEXT}}">' +
642				'<div><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M15.4 12.97l-2.68 2.72 1.34 1.38L19 12l-4.94-5.07-1.34 1.38 2.68 2.72H5v1.94z"/></svg></div>' +
643				"</button>",
644
645			// This small close button will be appended to your html/inline/ajax content by default,
646			// if "smallBtn" option is not set to false
647			smallBtn: '<button type="button" data-fancybox-close class="fancybox-button fancybox-close-small" title="{{CLOSE}}">' +
648				'<svg xmlns="http://www.w3.org/2000/svg" version="1" viewBox="0 0 24 24"><path d="M13 12l5-5-1-1-5 5-5-5-1 1 5 5-5 5 1 1 5-5 5 5 1-1z"/></svg>' +
649				"</button>"
650		},
651
652		// Container is injected into this element
653		parentEl: "body",
654
655		// Hide browser vertical scrollbars; use at your own risk
656		hideScrollbar: true,
657
658		// Focus handling
659		// ==============
660
661		// Try to focus on the first focusable element after opening
662		autoFocus: true,
663
664		// Put focus back to active element after closing
665		backFocus: true,
666
667		// Do not let user to focus on element outside modal content
668		trapFocus: true,
669
670		// Module specific options
671		// =======================
672
673		fullScreen: {
674			autoStart: false
675		},
676
677		// Set `touch: false` to disable panning/swiping
678		touch: {
679			vertical: true, // Allow to drag content vertically
680			momentum: true // Continue movement after releasing mouse/touch when panning
681		},
682
683		// Hash value when initializing manually,
684		// set `false` to disable hash change
685		hash: null,
686
687		// Customize or add new media types
688		// Example:
689		/*
690      media : {
691        youtube : {
692          params : {
693            autoplay : 0
694          }
695        }
696      }
697    */
698		media: {},
699
700		slideShow: {
701			autoStart: false,
702			speed: 3000
703		},
704
705		thumbs: {
706			autoStart: false, // Display thumbnails on opening
707			hideOnClose: true, // Hide thumbnail grid when closing animation starts
708			parentEl: ".fancybox-container", // Container is injected into this element
709			axis: "y" // Vertical (y) or horizontal (x) scrolling
710		},
711
712		// Use mousewheel to navigate gallery
713		// If 'auto' - enabled for images only
714		wheel: "auto",
715
716		// Callbacks
717		//==========
718
719		// See Documentation/API/Events for more information
720		// Example:
721		/*
722      afterShow: function( instance, current ) {
723        console.info( 'Clicked element:' );
724        console.info( current.opts.$orig );
725      }
726    */
727
728		onInit: $.noop, // When instance has been initialized
729
730		beforeLoad: $.noop, // Before the content of a slide is being loaded
731		afterLoad: $.noop, // When the content of a slide is done loading
732
733		beforeShow: $.noop, // Before open animation starts
734		afterShow: $.noop, // When content is done loading and animating
735
736		beforeClose: $.noop, // Before the instance attempts to close. Return false to cancel the close.
737		afterClose: $.noop, // After instance has been closed
738
739		onActivate: $.noop, // When instance is brought to front
740		onDeactivate: $.noop, // When other instance has been activated
741
742		// Interaction
743		// ===========
744
745		// Use options below to customize taken action when user clicks or double clicks on the fancyBox area,
746		// each option can be string or method that returns value.
747		//
748		// Possible values:
749		//   "close"           - close instance
750		//   "next"            - move to next gallery item
751		//   "nextOrClose"     - move to next gallery item or close if gallery has only one item
752		//   "toggleControls"  - show/hide controls
753		//   "zoom"            - zoom image (if loaded)
754		//   false             - do nothing
755
756		// Clicked on the content
757		clickContent: function (current, event) {
758			return current.type === "image" ? "zoom" : false;
759		},
760
761		// Clicked on the slide
762		clickSlide: "close",
763
764		// Clicked on the background (backdrop) element;
765		// if you have not changed the layout, then most likely you need to use `clickSlide` option
766		clickOutside: "close",
767
768		// Same as previous two, but for double click
769		dblclickContent: false,
770		dblclickSlide: false,
771		dblclickOutside: false,
772
773		// Custom options when mobile device is detected
774		// =============================================
775
776		mobile: {
777			preventCaptionOverlap: false,
778			idleTime: false,
779			clickContent: function (current, event) {
780				return current.type === "image" ? "toggleControls" : false;
781			},
782			clickSlide: function (current, event) {
783				return current.type === "image" ? "toggleControls" : "close";
784			},
785			dblclickContent: function (current, event) {
786				return current.type === "image" ? "zoom" : false;
787			},
788			dblclickSlide: function (current, event) {
789				return current.type === "image" ? "zoom" : false;
790			}
791		},
792
793		// Internationalization
794		// ====================
795
796		lang: "en",
797		i18n: {
798			en: {
799				CLOSE: "Close",
800				NEXT: "Next",
801				PREV: "Previous",
802				ERROR: "The requested content cannot be loaded. <br/> Please try again later.",
803				PLAY_START: "Start slideshow",
804				PLAY_STOP: "Pause slideshow",
805				FULL_SCREEN: "Full screen",
806				THUMBS: "Thumbnails",
807				DOWNLOAD: "Download",
808				SHARE: "Share",
809				ZOOM: "Zoom"
810			},
811			de: {
812				CLOSE: "Schlie&szlig;en",
813				NEXT: "Weiter",
814				PREV: "Zur&uuml;ck",
815				ERROR: "Die angeforderten Daten konnten nicht geladen werden. <br/> Bitte versuchen Sie es sp&auml;ter nochmal.",
816				PLAY_START: "Diaschau starten",
817				PLAY_STOP: "Diaschau beenden",
818				FULL_SCREEN: "Vollbild",
819				THUMBS: "Vorschaubilder",
820				DOWNLOAD: "Herunterladen",
821				SHARE: "Teilen",
822				ZOOM: "Vergr&ouml;&szlig;ern"
823			}
824		}
825	};
826
827	// Few useful variables and methods
828	// ================================
829
830	var $W = $(window);
831	var $D = $(document);
832
833	var called = 0;
834
835	// Check if an object is a jQuery object and not a native JavaScript object
836	// ========================================================================
837	var isQuery = function (obj) {
838		return obj && obj.hasOwnProperty && obj instanceof $;
839	};
840
841	// Handle multiple browsers for "requestAnimationFrame" and "cancelAnimationFrame"
842	// ===============================================================================
843	var requestAFrame = (function () {
844		return (
845			window.requestAnimationFrame ||
846			window.webkitRequestAnimationFrame ||
847			window.mozRequestAnimationFrame ||
848			window.oRequestAnimationFrame ||
849			// if all else fails, use setTimeout
850			function (callback) {
851				return window.setTimeout(callback, 1000 / 60);
852			}
853		);
854	})();
855
856	var cancelAFrame = (function () {
857		return (
858			window.cancelAnimationFrame ||
859			window.webkitCancelAnimationFrame ||
860			window.mozCancelAnimationFrame ||
861			window.oCancelAnimationFrame ||
862			function (id) {
863				window.clearTimeout(id);
864			}
865		);
866	})();
867
868	// Detect the supported transition-end event property name
869	// =======================================================
870	var transitionEnd = (function () {
871		var el = document.createElement("fakeelement"),
872			t;
873
874		var transitions = {
875			transition: "transitionend",
876			OTransition: "oTransitionEnd",
877			MozTransition: "transitionend",
878			WebkitTransition: "webkitTransitionEnd"
879		};
880
881		for (t in transitions) {
882			if (el.style[t] !== undefined) {
883				return transitions[t];
884			}
885		}
886
887		return "transitionend";
888	})();
889
890	// Force redraw on an element.
891	// This helps in cases where the browser doesn't redraw an updated element properly
892	// ================================================================================
893	var forceRedraw = function ($el) {
894		return $el && $el.length && $el[0].offsetHeight;
895	};
896
897	// Exclude array (`buttons`) options from deep merging
898	// ===================================================
899	var mergeOpts = function (opts1, opts2) {
900		var rez = $.extend(true, {}, opts1, opts2);
901
902		$.each(opts2, function (key, value) {
903			if ($.isArray(value)) {
904				rez[key] = value;
905			}
906		});
907
908		return rez;
909	};
910
911	// How much of an element is visible in viewport
912	// =============================================
913
914	var inViewport = function (elem) {
915		var elemCenter, rez;
916
917		if (!elem || elem.ownerDocument !== document) {
918			return false;
919		}
920
921		$(".fancybox-container").css("pointer-events", "none");
922
923		elemCenter = {
924			x: elem.getBoundingClientRect().left + elem.offsetWidth / 2,
925			y: elem.getBoundingClientRect().top + elem.offsetHeight / 2
926		};
927
928		rez = document.elementFromPoint(elemCenter.x, elemCenter.y) === elem;
929
930		$(".fancybox-container").css("pointer-events", "");
931
932		return rez;
933	};
934
935	// Class definition
936	// ================
937
938	var FancyBox = function (content, opts, index) {
939		var self = this;
940
941		self.opts = mergeOpts({
942			index: index
943		}, $.fancybox.defaults);
944
945		if ($.isPlainObject(opts)) {
946			self.opts = mergeOpts(self.opts, opts);
947		}
948
949		if ($.fancybox.isMobile) {
950			self.opts = mergeOpts(self.opts, self.opts.mobile);
951		}
952
953		self.id = self.opts.id || ++called;
954
955		self.currIndex = parseInt(self.opts.index, 10) || 0;
956		self.prevIndex = null;
957
958		self.prevPos = null;
959		self.currPos = 0;
960
961		self.firstRun = true;
962
963		// All group items
964		self.group = [];
965
966		// Existing slides (for current, next and previous gallery items)
967		self.slides = {};
968
969		// Create group elements
970		self.addContent(content);
971
972		if (!self.group.length) {
973			return;
974		}
975
976		self.init();
977	};
978
979	$.extend(FancyBox.prototype, {
980		// Create DOM structure
981		// ====================
982
983		init: function () {
984			var self = this,
985				firstItem = self.group[self.currIndex],
986				firstItemOpts = firstItem.opts,
987				$container,
988				buttonStr;
989
990			if (firstItemOpts.closeExisting) {
991				$.fancybox.close(true);
992			}
993
994			// Hide scrollbars
995			// ===============
996
997			$("body").addClass("fancybox-active");
998
999			if (
1000				!$.fancybox.getInstance() &&
1001				firstItemOpts.hideScrollbar !== false &&
1002				!$.fancybox.isMobile &&
1003				document.body.scrollHeight > window.innerHeight
1004			) {
1005				$("head").append(
1006					'<style id="fancybox-style-noscroll" type="text/css">.compensate-for-scrollbar{margin-right:' +
1007					(window.innerWidth - document.documentElement.clientWidth) +
1008					"px;}</style>"
1009				);
1010
1011				$("body").addClass("compensate-for-scrollbar");
1012			}
1013
1014			// Build html markup and set references
1015			// ====================================
1016
1017			// Build html code for buttons and insert into main template
1018			buttonStr = "";
1019
1020			$.each(firstItemOpts.buttons, function (index, value) {
1021				buttonStr += firstItemOpts.btnTpl[value] || "";
1022			});
1023
1024			// Create markup from base template, it will be initially hidden to
1025			// avoid unnecessary work like painting while initializing is not complete
1026			$container = $(
1027				self.translate(
1028					self,
1029					firstItemOpts.baseTpl
1030						.replace("{{buttons}}", buttonStr)
1031						.replace("{{arrows}}", firstItemOpts.btnTpl.arrowLeft + firstItemOpts.btnTpl.arrowRight)
1032				)
1033			)
1034				.attr("id", "fancybox-container-" + self.id)
1035				.addClass(firstItemOpts.baseClass)
1036				.data("FancyBox", self)
1037				.appendTo(firstItemOpts.parentEl);
1038
1039			// Create object holding references to jQuery wrapped nodes
1040			self.$refs = {
1041				container: $container
1042			};
1043
1044			["bg", "inner", "infobar", "toolbar", "stage", "caption", "navigation"].forEach(function (item) {
1045				self.$refs[item] = $container.find(".fancybox-" + item);
1046			});
1047
1048			self.trigger("onInit");
1049
1050			// Enable events, deactive previous instances
1051			self.activate();
1052
1053			// Build slides, load and reveal content
1054			self.jumpTo(self.currIndex);
1055		},
1056
1057		// Simple i18n support - replaces object keys found in template
1058		// with corresponding values
1059		// ============================================================
1060
1061		translate: function (obj, str) {
1062			var arr = obj.opts.i18n[obj.opts.lang] || obj.opts.i18n.en;
1063
1064			return str.replace(/\{\{(\w+)\}\}/g, function (match, n) {
1065				return arr[n] === undefined ? match : arr[n];
1066			});
1067		},
1068
1069		// Populate current group with fresh content
1070		// Check if each object has valid type and content
1071		// ===============================================
1072
1073		addContent: function (content) {
1074			var self = this,
1075				items = $.makeArray(content),
1076				thumbs;
1077
1078			$.each(items, function (i, item) {
1079				var obj = {},
1080					opts = {},
1081					$item,
1082					type,
1083					found,
1084					src,
1085					srcParts;
1086
1087				// Step 1 - Make sure we have an object
1088				// ====================================
1089
1090				if ($.isPlainObject(item)) {
1091					// We probably have manual usage here, something like
1092					// $.fancybox.open( [ { src : "image.jpg", type : "image" } ] )
1093
1094					obj = item;
1095					opts = item.opts || item;
1096				} else if ($.type(item) === "object" && $(item).length) {
1097					// Here we probably have jQuery collection returned by some selector
1098					$item = $(item);
1099
1100					// Support attributes like `data-options='{"touch" : false}'` and `data-touch='false'`
1101					opts = $item.data() || {};
1102					opts = $.extend(true, {}, opts, opts.options);
1103
1104					// Here we store clicked element
1105					opts.$orig = $item;
1106
1107					obj.src = self.opts.src || opts.src || $item.attr("href");
1108
1109					// Assume that simple syntax is used, for example:
1110					//   `$.fancybox.open( $("#test"), {} );`
1111					if (!obj.type && !obj.src) {
1112						obj.type = "inline";
1113						obj.src = item;
1114					}
1115				} else {
1116					// Assume we have a simple html code, for example:
1117					//   $.fancybox.open( '<div><h1>Hi!</h1></div>' );
1118					obj = {
1119						type: "html",
1120						src: item + ""
1121					};
1122				}
1123
1124				// Each gallery object has full collection of options
1125				obj.opts = $.extend(true, {}, self.opts, opts);
1126
1127				// Do not merge buttons array
1128				if ($.isArray(opts.buttons)) {
1129					obj.opts.buttons = opts.buttons;
1130				}
1131
1132				if ($.fancybox.isMobile && obj.opts.mobile) {
1133					obj.opts = mergeOpts(obj.opts, obj.opts.mobile);
1134				}
1135
1136				// Step 2 - Make sure we have content type, if not - try to guess
1137				// ==============================================================
1138
1139				type = obj.type || obj.opts.type;
1140				src = obj.src || "";
1141
1142				if (!type && src) {
1143					if ((found = src.match(/\.(mp4|mov|ogv|webm)((\?|#).*)?$/i))) {
1144						type = "video";
1145
1146						if (!obj.opts.video.format) {
1147							obj.opts.video.format = "video/" + (found[1] === "ogv" ? "ogg" : found[1]);
1148						}
1149					} else if (src.match(/(^data:image\/[a-z0-9+\/=]*,)|(\.(jp(e|g|eg)|gif|png|bmp|webp|svg|ico)((\?|#).*)?$)/i)) {
1150						type = "image";
1151					} else if (src.match(/\.(pdf)((\?|#).*)?$/i)) {
1152						type = "iframe";
1153						obj = $.extend(true, obj, {
1154							contentType: "pdf",
1155							opts: {
1156								iframe: {
1157									preload: false
1158								}
1159							}
1160						});
1161					} else if (src.charAt(0) === "#") {
1162						type = "inline";
1163					}
1164				}
1165
1166				if (type) {
1167					obj.type = type;
1168				} else {
1169					self.trigger("objectNeedsType", obj);
1170				}
1171
1172				if (!obj.contentType) {
1173					obj.contentType = $.inArray(obj.type, ["html", "inline", "ajax"]) > -1 ? "html" : obj.type;
1174				}
1175
1176				// Step 3 - Some adjustments
1177				// =========================
1178
1179				obj.index = self.group.length;
1180
1181				if (obj.opts.smallBtn == "auto") {
1182					obj.opts.smallBtn = $.inArray(obj.type, ["html", "inline", "ajax"]) > -1;
1183				}
1184
1185				if (obj.opts.toolbar === "auto") {
1186					obj.opts.toolbar = !obj.opts.smallBtn;
1187				}
1188
1189				// Find thumbnail image, check if exists and if is in the viewport
1190				obj.$thumb = obj.opts.$thumb || null;
1191
1192				if (obj.opts.$trigger && obj.index === self.opts.index) {
1193					obj.$thumb = obj.opts.$trigger.find("img:first");
1194
1195					if (obj.$thumb.length) {
1196						obj.opts.$orig = obj.opts.$trigger;
1197					}
1198				}
1199
1200				if (!(obj.$thumb && obj.$thumb.length) && obj.opts.$orig) {
1201					obj.$thumb = obj.opts.$orig.find("img:first");
1202				}
1203
1204				if (obj.$thumb && !obj.$thumb.length) {
1205					obj.$thumb = null;
1206				}
1207
1208				obj.thumb = obj.opts.thumb || (obj.$thumb ? obj.$thumb[0].src : null);
1209
1210				// "caption" is a "special" option, it can be used to customize caption per gallery item
1211				if ($.type(obj.opts.caption) === "function") {
1212					obj.opts.caption = obj.opts.caption.apply(item, [self, obj]);
1213				}
1214
1215				if ($.type(self.opts.caption) === "function") {
1216					obj.opts.caption = self.opts.caption.apply(item, [self, obj]);
1217				}
1218
1219				// Make sure we have caption as a string or jQuery object
1220				if (!(obj.opts.caption instanceof $)) {
1221					obj.opts.caption = obj.opts.caption === undefined ? "" : obj.opts.caption + "";
1222				}
1223
1224				// Check if url contains "filter" used to filter the content
1225				// Example: "ajax.html #something"
1226				if (obj.type === "ajax") {
1227					srcParts = src.split(/\s+/, 2);
1228
1229					if (srcParts.length > 1) {
1230						obj.src = srcParts.shift();
1231
1232						obj.opts.filter = srcParts.shift();
1233					}
1234				}
1235
1236				// Hide all buttons and disable interactivity for modal items
1237				if (obj.opts.modal) {
1238					obj.opts = $.extend(true, obj.opts, {
1239						trapFocus: true,
1240						// Remove buttons
1241						infobar: 0,
1242						toolbar: 0,
1243
1244						smallBtn: 0,
1245
1246						// Disable keyboard navigation
1247						keyboard: 0,
1248
1249						// Disable some modules
1250						slideShow: 0,
1251						fullScreen: 0,
1252						thumbs: 0,
1253						touch: 0,
1254
1255						// Disable click event handlers
1256						clickContent: false,
1257						clickSlide: false,
1258						clickOutside: false,
1259						dblclickContent: false,
1260						dblclickSlide: false,
1261						dblclickOutside: false
1262					});
1263				}
1264
1265				// Step 4 - Add processed object to group
1266				// ======================================
1267
1268				self.group.push(obj);
1269			});
1270
1271			// Update controls if gallery is already opened
1272			if (Object.keys(self.slides).length) {
1273				self.updateControls();
1274
1275				// Update thumbnails, if needed
1276				thumbs = self.Thumbs;
1277
1278				if (thumbs && thumbs.isActive) {
1279					thumbs.create();
1280
1281					thumbs.focus();
1282				}
1283			}
1284		},
1285
1286		// Attach an event handler functions for:
1287		//   - navigation buttons
1288		//   - browser scrolling, resizing;
1289		//   - focusing
1290		//   - keyboard
1291		//   - detecting inactivity
1292		// ======================================
1293
1294		addEvents: function () {
1295			var self = this;
1296
1297			self.removeEvents();
1298
1299			// Make navigation elements clickable
1300			// ==================================
1301
1302			self.$refs.container
1303				.on("click.fb-close", "[data-fancybox-close]", function (e) {
1304					e.stopPropagation();
1305					e.preventDefault();
1306
1307					self.close(e);
1308				})
1309				.on("touchstart.fb-prev click.fb-prev", "[data-fancybox-prev]", function (e) {
1310					e.stopPropagation();
1311					e.preventDefault();
1312
1313					self.previous();
1314				})
1315				.on("touchstart.fb-next click.fb-next", "[data-fancybox-next]", function (e) {
1316					e.stopPropagation();
1317					e.preventDefault();
1318
1319					self.next();
1320				})
1321				.on("click.fb", "[data-fancybox-zoom]", function (e) {
1322					// Click handler for zoom button
1323					self[self.isScaledDown() ? "scaleToActual" : "scaleToFit"]();
1324				});
1325
1326			// Handle page scrolling and browser resizing
1327			// ==========================================
1328
1329			$W.on("orientationchange.fb resize.fb", function (e) {
1330				if (e && e.originalEvent && e.originalEvent.type === "resize") {
1331					if (self.requestId) {
1332						cancelAFrame(self.requestId);
1333					}
1334
1335					self.requestId = requestAFrame(function () {
1336						self.update(e);
1337					});
1338				} else {
1339					if (self.current && self.current.type === "iframe") {
1340						self.$refs.stage.hide();
1341					}
1342
1343					setTimeout(
1344						function () {
1345							self.$refs.stage.show();
1346
1347							self.update(e);
1348						},
1349						$.fancybox.isMobile ? 600 : 250
1350					);
1351				}
1352			});
1353
1354			$D.on("keydown.fb", function (e) {
1355				var instance = $.fancybox ? $.fancybox.getInstance() : null,
1356					current = instance.current,
1357					keycode = e.keyCode || e.which;
1358
1359				// Trap keyboard focus inside of the modal
1360				// =======================================
1361
1362				if (keycode == 9) {
1363					if (current.opts.trapFocus) {
1364						self.focus(e);
1365					}
1366
1367					return;
1368				}
1369
1370				// Enable keyboard navigation
1371				// ==========================
1372
1373				if (!current.opts.keyboard || e.ctrlKey || e.altKey || e.shiftKey || $(e.target).is("input,textarea,video,audio,select")) {
1374					return;
1375				}
1376
1377				// Backspace and Esc keys
1378				if (keycode === 8 || keycode === 27) {
1379					e.preventDefault();
1380
1381					self.close(e);
1382
1383					return;
1384				}
1385
1386				// Left arrow and Up arrow
1387				if (keycode === 37 || keycode === 38) {
1388					e.preventDefault();
1389
1390					self.previous();
1391
1392					return;
1393				}
1394
1395				// Righ arrow and Down arrow
1396				if (keycode === 39 || keycode === 40) {
1397					e.preventDefault();
1398
1399					self.next();
1400
1401					return;
1402				}
1403
1404				self.trigger("afterKeydown", e, keycode);
1405			});
1406
1407			// Hide controls after some inactivity period
1408			if (self.group[self.currIndex].opts.idleTime) {
1409				self.idleSecondsCounter = 0;
1410
1411				$D.on(
1412					"mousemove.fb-idle mouseleave.fb-idle mousedown.fb-idle touchstart.fb-idle touchmove.fb-idle scroll.fb-idle keydown.fb-idle",
1413					function (e) {
1414						self.idleSecondsCounter = 0;
1415
1416						if (self.isIdle) {
1417							self.showControls();
1418						}
1419
1420						self.isIdle = false;
1421					}
1422				);
1423
1424				self.idleInterval = window.setInterval(function () {
1425					self.idleSecondsCounter++;
1426
1427					if (self.idleSecondsCounter >= self.group[self.currIndex].opts.idleTime && !self.isDragging) {
1428						self.isIdle = true;
1429						self.idleSecondsCounter = 0;
1430
1431						self.hideControls();
1432					}
1433				}, 1000);
1434			}
1435		},
1436
1437		// Remove events added by the core
1438		// ===============================
1439
1440		removeEvents: function () {
1441			var self = this;
1442
1443			$W.off("orientationchange.fb resize.fb");
1444			$D.off("keydown.fb .fb-idle");
1445
1446			this.$refs.container.off(".fb-close .fb-prev .fb-next");
1447
1448			if (self.idleInterval) {
1449				window.clearInterval(self.idleInterval);
1450
1451				self.idleInterval = null;
1452			}
1453		},
1454
1455		// Change to previous gallery item
1456		// ===============================
1457
1458		previous: function (duration) {
1459			return this.jumpTo(this.currPos - 1, duration);
1460		},
1461
1462		// Change to next gallery item
1463		// ===========================
1464
1465		next: function (duration) {
1466			return this.jumpTo(this.currPos + 1, duration);
1467		},
1468
1469		// Switch to selected gallery item
1470		// ===============================
1471
1472		jumpTo: function (pos, duration) {
1473			var self = this,
1474				groupLen = self.group.length,
1475				firstRun,
1476				isMoved,
1477				loop,
1478				current,
1479				previous,
1480				slidePos,
1481				stagePos,
1482				prop,
1483				diff;
1484
1485			if (self.isDragging || self.isClosing || (self.isAnimating && self.firstRun)) {
1486				return;
1487			}
1488
1489			// Should loop?
1490			pos = parseInt(pos, 10);
1491			loop = self.current ? self.current.opts.loop : self.opts.loop;
1492
1493			if (!loop && (pos < 0 || pos >= groupLen)) {
1494				return false;
1495			}
1496
1497			// Check if opening for the first time; this helps to speed things up
1498			firstRun = self.firstRun = !Object.keys(self.slides).length;
1499
1500			// Create slides
1501			previous = self.current;
1502
1503			self.prevIndex = self.currIndex;
1504			self.prevPos = self.currPos;
1505
1506			current = self.createSlide(pos);
1507
1508			if (groupLen > 1) {
1509				if (loop || current.index < groupLen - 1) {
1510					self.createSlide(pos + 1);
1511				}
1512
1513				if (loop || current.index > 0) {
1514					self.createSlide(pos - 1);
1515				}
1516			}
1517
1518			self.current = current;
1519			self.currIndex = current.index;
1520			self.currPos = current.pos;
1521
1522			self.trigger("beforeShow", firstRun);
1523
1524			self.updateControls();
1525
1526			// Validate duration length
1527			current.forcedDuration = undefined;
1528
1529			if ($.isNumeric(duration)) {
1530				current.forcedDuration = duration;
1531			} else {
1532				duration = current.opts[firstRun ? "animationDuration" : "transitionDuration"];
1533			}
1534
1535			duration = parseInt(duration, 10);
1536
1537			// Check if user has swiped the slides or if still animating
1538			isMoved = self.isMoved(current);
1539
1540			// Make sure current slide is visible
1541			current.$slide.addClass("fancybox-slide--current");
1542
1543			// Fresh start - reveal container, current slide and start loading content
1544			if (firstRun) {
1545				if (current.opts.animationEffect && duration) {
1546					self.$refs.container.css("transition-duration", duration + "ms");
1547				}
1548
1549				self.$refs.container.addClass("fancybox-is-open").trigger("focus");
1550
1551				// Attempt to load content into slide
1552				// This will later call `afterLoad` -> `revealContent`
1553				self.loadSlide(current);
1554
1555				self.preload("image");
1556
1557				return;
1558			}
1559
1560			// Get actual slide/stage positions (before cleaning up)
1561			slidePos = $.fancybox.getTranslate(previous.$slide);
1562			stagePos = $.fancybox.getTranslate(self.$refs.stage);
1563
1564			// Clean up all slides
1565			$.each(self.slides, function (index, slide) {
1566				$.fancybox.stop(slide.$slide, true);
1567			});
1568
1569			if (previous.pos !== current.pos) {
1570				previous.isComplete = false;
1571			}
1572
1573			previous.$slide.removeClass("fancybox-slide--complete fancybox-slide--current");
1574
1575			// If slides are out of place, then animate them to correct position
1576			if (isMoved) {
1577				// Calculate horizontal swipe distance
1578				diff = slidePos.left - (previous.pos * slidePos.width + previous.pos * previous.opts.gutter);
1579
1580				$.each(self.slides, function (index, slide) {
1581					slide.$slide.removeClass("fancybox-animated").removeClass(function (index, className) {
1582						return (className.match(/(^|\s)fancybox-fx-\S+/g) || []).join(" ");
1583					});
1584
1585					// Make sure that each slide is in equal distance
1586					// This is mostly needed for freshly added slides, because they are not yet positioned
1587					var leftPos = slide.pos * slidePos.width + slide.pos * slide.opts.gutter;
1588
1589					$.fancybox.setTranslate(slide.$slide, {
1590						top: 0,
1591						left: leftPos - stagePos.left + diff
1592					});
1593
1594					if (slide.pos !== current.pos) {
1595						slide.$slide.addClass("fancybox-slide--" + (slide.pos > current.pos ? "next" : "previous"));
1596					}
1597
1598					// Redraw to make sure that transition will start
1599					forceRedraw(slide.$slide);
1600
1601					// Animate the slide
1602					$.fancybox.animate(
1603						slide.$slide, {
1604							top: 0,
1605							left: (slide.pos - current.pos) * slidePos.width + (slide.pos - current.pos) * slide.opts.gutter
1606						},
1607						duration,
1608						function () {
1609							slide.$slide
1610								.css({
1611									transform: "",
1612									opacity: ""
1613								})
1614								.removeClass("fancybox-slide--next fancybox-slide--previous");
1615
1616							if (slide.pos === self.currPos) {
1617								self.complete();
1618							}
1619						}
1620					);
1621				});
1622			} else if (duration && current.opts.transitionEffect) {
1623				// Set transition effect for previously active slide
1624				prop = "fancybox-animated fancybox-fx-" + current.opts.transitionEffect;
1625
1626				previous.$slide.addClass("fancybox-slide--" + (previous.pos > current.pos ? "next" : "previous"));
1627
1628				$.fancybox.animate(
1629					previous.$slide,
1630					prop,
1631					duration,
1632					function () {
1633						previous.$slide.removeClass(prop).removeClass("fancybox-slide--next fancybox-slide--previous");
1634					},
1635					false
1636				);
1637			}
1638
1639			if (current.isLoaded) {
1640				self.revealContent(current);
1641			} else {
1642				self.loadSlide(current);
1643			}
1644
1645			self.preload("image");
1646		},
1647
1648		// Create new "slide" element
1649		// These are gallery items  that are actually added to DOM
1650		// =======================================================
1651
1652		createSlide: function (pos) {
1653			var self = this,
1654				$slide,
1655				index;
1656
1657			index = pos % self.group.length;
1658			index = index < 0 ? self.group.length + index : index;
1659
1660			if (!self.slides[pos] && self.group[index]) {
1661				$slide = $('<div class="fancybox-slide"></div>').appendTo(self.$refs.stage);
1662
1663				self.slides[pos] = $.extend(true, {}, self.group[index], {
1664					pos: pos,
1665					$slide: $slide,
1666					isLoaded: false
1667				});
1668
1669				self.updateSlide(self.slides[pos]);
1670			}
1671
1672			return self.slides[pos];
1673		},
1674
1675		// Scale image to the actual size of the image;
1676		// x and y values should be relative to the slide
1677		// ==============================================
1678
1679		scaleToActual: function (x, y, duration) {
1680			var self = this,
1681				current = self.current,
1682				$content = current.$content,
1683				canvasWidth = $.fancybox.getTranslate(current.$slide).width,
1684				canvasHeight = $.fancybox.getTranslate(current.$slide).height,
1685				newImgWidth = current.width,
1686				newImgHeight = current.height,
1687				imgPos,
1688				posX,
1689				posY,
1690				scaleX,
1691				scaleY;
1692
1693			if (self.isAnimating || self.isMoved() || !$content || !(current.type == "image" && current.isLoaded && !current.hasError)) {
1694				return;
1695			}
1696
1697			self.isAnimating = true;
1698
1699			$.fancybox.stop($content);
1700
1701			x = x === undefined ? canvasWidth * 0.5 : x;
1702			y = y === undefined ? canvasHeight * 0.5 : y;
1703
1704			imgPos = $.fancybox.getTranslate($content);
1705
1706			imgPos.top -= $.fancybox.getTranslate(current.$slide).top;
1707			imgPos.left -= $.fancybox.getTranslate(current.$slide).left;
1708
1709			scaleX = newImgWidth / imgPos.width;
1710			scaleY = newImgHeight / imgPos.height;
1711
1712			// Get center position for original image
1713			posX = canvasWidth * 0.5 - newImgWidth * 0.5;
1714			posY = canvasHeight * 0.5 - newImgHeight * 0.5;
1715
1716			// Make sure image does not move away from edges
1717			if (newImgWidth > canvasWidth) {
1718				posX = imgPos.left * scaleX - (x * scaleX - x);
1719
1720				if (posX > 0) {
1721					posX = 0;
1722				}
1723
1724				if (posX < canvasWidth - newImgWidth) {
1725					posX = canvasWidth - newImgWidth;
1726				}
1727			}
1728
1729			if (newImgHeight > canvasHeight) {
1730				posY = imgPos.top * scaleY - (y * scaleY - y);
1731
1732				if (posY > 0) {
1733					posY = 0;
1734				}
1735
1736				if (posY < canvasHeight - newImgHeight) {
1737					posY = canvasHeight - newImgHeight;
1738				}
1739			}
1740
1741			self.updateCursor(newImgWidth, newImgHeight);
1742
1743			$.fancybox.animate(
1744				$content, {
1745					top: posY,
1746					left: posX,
1747					scaleX: scaleX,
1748					scaleY: scaleY
1749				},
1750				duration || 366,
1751				function () {
1752					self.isAnimating = false;
1753				}
1754			);
1755
1756			// Stop slideshow
1757			if (self.SlideShow && self.SlideShow.isActive) {
1758				self.SlideShow.stop();
1759			}
1760		},
1761
1762		// Scale image to fit inside parent element
1763		// ========================================
1764
1765		scaleToFit: function (duration) {
1766			var self = this,
1767				current = self.current,
1768				$content = current.$content,
1769				end;
1770
1771			if (self.isAnimating || self.isMoved() || !$content || !(current.type == "image" && current.isLoaded && !current.hasError)) {
1772				return;
1773			}
1774
1775			self.isAnimating = true;
1776
1777			$.fancybox.stop($content);
1778
1779			end = self.getFitPos(current);
1780
1781			self.updateCursor(end.width, end.height);
1782
1783			$.fancybox.animate(
1784				$content, {
1785					top: end.top,
1786					left: end.left,
1787					scaleX: end.width / $content.width(),
1788					scaleY: end.height / $content.height()
1789				},
1790				duration || 366,
1791				function () {
1792					self.isAnimating = false;
1793				}
1794			);
1795		},
1796
1797		// Calculate image size to fit inside viewport
1798		// ===========================================
1799
1800		getFitPos: function (slide) {
1801			var self = this,
1802				$content = slide.$content,
1803				$slide = slide.$slide,
1804				width = slide.width || slide.opts.width,
1805				height = slide.height || slide.opts.height,
1806				maxWidth,
1807				maxHeight,
1808				minRatio,
1809				aspectRatio,
1810				rez = {};
1811
1812			if (!slide.isLoaded || !$content || !$content.length) {
1813				return false;
1814			}
1815
1816			maxWidth = $.fancybox.getTranslate(self.$refs.stage).width;
1817			maxHeight = $.fancybox.getTranslate(self.$refs.stage).height;
1818
1819			maxWidth -=
1820				parseFloat($slide.css("paddingLeft")) +
1821				parseFloat($slide.css("paddingRight")) +
1822				parseFloat($content.css("marginLeft")) +
1823				parseFloat($content.css("marginRight"));
1824
1825			maxHeight -=
1826				parseFloat($slide.css("paddingTop")) +
1827				parseFloat($slide.css("paddingBottom")) +
1828				parseFloat($content.css("marginTop")) +
1829				parseFloat($content.css("marginBottom"));
1830
1831			if (!width || !height) {
1832				width = maxWidth;
1833				height = maxHeight;
1834			}
1835
1836			minRatio = Math.min(1, maxWidth / width, maxHeight / height);
1837
1838			width = minRatio * width;
1839			height = minRatio * height;
1840
1841			// Adjust width/height to precisely fit into container
1842			if (width > maxWidth - 0.5) {
1843				width = maxWidth;
1844			}
1845
1846			if (height > maxHeight - 0.5) {
1847				height = maxHeight;
1848			}
1849
1850			if (slide.type === "image") {
1851				rez.top = Math.floor((maxHeight - height) * 0.5) + parseFloat($slide.css("paddingTop"));
1852				rez.left = Math.floor((maxWidth - width) * 0.5) + parseFloat($slide.css("paddingLeft"));
1853			} else if (slide.contentType === "video") {
1854				// Force aspect ratio for the video
1855				// "I say the whole world must learn of our peaceful ways… by force!"
1856				aspectRatio = slide.opts.width && slide.opts.height ? width / height : slide.opts.ratio || 16 / 9;
1857
1858				if (height > width / aspectRatio) {
1859					height = width / aspectRatio;
1860				} else if (width > height * aspectRatio) {
1861					width = height * aspectRatio;
1862				}
1863			}
1864
1865			rez.width = width;
1866			rez.height = height;
1867
1868			return rez;
1869		},
1870
1871		// Update content size and position for all slides
1872		// ==============================================
1873
1874		update: function (e) {
1875			var self = this;
1876
1877			$.each(self.slides, function (key, slide) {
1878				self.updateSlide(slide, e);
1879			});
1880		},
1881
1882		// Update slide content position and size
1883		// ======================================
1884
1885		updateSlide: function (slide, e) {
1886			var self = this,
1887				$content = slide && slide.$content,
1888				width = slide.width || slide.opts.width,
1889				height = slide.height || slide.opts.height,
1890				$slide = slide.$slide;
1891
1892			// First, prevent caption overlap, if needed
1893			self.adjustCaption(slide);
1894
1895			// Then resize content to fit inside the slide
1896			if ($content && (width || height || slide.contentType === "video") && !slide.hasError) {
1897				$.fancybox.stop($content);
1898
1899				$.fancybox.setTranslate($content, self.getFitPos(slide));
1900
1901				if (slide.pos === self.currPos) {
1902					self.isAnimating = false;
1903
1904					self.updateCursor();
1905				}
1906			}
1907
1908			// Then some adjustments
1909			self.adjustLayout(slide);
1910
1911			if ($slide.length) {
1912				$slide.trigger("refresh");
1913
1914				if (slide.pos === self.currPos) {
1915					self.$refs.toolbar
1916						.add(self.$refs.navigation.find(".fancybox-button--arrow_right"))
1917						.toggleClass("compensate-for-scrollbar", $slide.get(0).scrollHeight > $slide.get(0).clientHeight);
1918				}
1919			}
1920
1921			self.trigger("onUpdate", slide, e);
1922		},
1923
1924		// Horizontally center slide
1925		// =========================
1926
1927		centerSlide: function (duration) {
1928			var self = this,
1929				current = self.current,
1930				$slide = current.$slide;
1931
1932			if (self.isClosing || !current) {
1933				return;
1934			}
1935
1936			$slide.siblings().css({
1937				transform: "",
1938				opacity: ""
1939			});
1940
1941			$slide
1942				.parent()
1943				.children()
1944				.removeClass("fancybox-slide--previous fancybox-slide--next");
1945
1946			$.fancybox.animate(
1947				$slide, {
1948					top: 0,
1949					left: 0,
1950					opacity: 1
1951				},
1952				duration === undefined ? 0 : duration,
1953				function () {
1954					// Clean up
1955					$slide.css({
1956						transform: "",
1957						opacity: ""
1958					});
1959
1960					if (!current.isComplete) {
1961						self.complete();
1962					}
1963				},
1964				false
1965			);
1966		},
1967
1968		// Check if current slide is moved (swiped)
1969		// ========================================
1970
1971		isMoved: function (slide) {
1972			var current = slide || this.current,
1973				slidePos,
1974				stagePos;
1975
1976			if (!current) {
1977				return false;
1978			}
1979
1980			stagePos = $.fancybox.getTranslate(this.$refs.stage);
1981			slidePos = $.fancybox.getTranslate(current.$slide);
1982
1983			return (
1984				!current.$slide.hasClass("fancybox-animated") &&
1985				(Math.abs(slidePos.top - stagePos.top) > 0.5 || Math.abs(slidePos.left - stagePos.left) > 0.5)
1986			);
1987		},
1988
1989		// Update cursor style depending if content can be zoomed
1990		// ======================================================
1991
1992		updateCursor: function (nextWidth, nextHeight) {
1993			var self = this,
1994				current = self.current,
1995				$container = self.$refs.container,
1996				canPan,
1997				isZoomable;
1998
1999			if (!current || self.isClosing || !self.Guestures) {
2000				return;
2001			}
2002
2003			$container.removeClass("fancybox-is-zoomable fancybox-can-zoomIn fancybox-can-zoomOut fancybox-can-swipe fancybox-can-pan");
2004
2005			canPan = self.canPan(nextWidth, nextHeight);
2006
2007			isZoomable = canPan ? true : self.isZoomable();
2008
2009			$container.toggleClass("fancybox-is-zoomable", isZoomable);
2010
2011			$("[data-fancybox-zoom]").prop("disabled", !isZoomable);
2012
2013			if (canPan) {
2014				$container.addClass("fancybox-can-pan");
2015			} else if (
2016				isZoomable &&
2017				(current.opts.clickContent === "zoom" || ($.isFunction(current.opts.clickContent) && current.opts.clickContent(current) == "zoom"))
2018			) {
2019				$container.addClass("fancybox-can-zoomIn");
2020			} else if (current.opts.touch && (current.opts.touch.vertical || self.group.length > 1) && current.contentType !== "video") {
2021				$container.addClass("fancybox-can-swipe");
2022			}
2023		},
2024
2025		// Check if current slide is zoomable
2026		// ==================================
2027
2028		isZoomable: function () {
2029			var self = this,
2030				current = self.current,
2031				fitPos;
2032
2033			// Assume that slide is zoomable if:
2034			//   - image is still loading
2035			//   - actual size of the image is smaller than available area
2036			if (current && !self.isClosing && current.type === "image" && !current.hasError) {
2037				if (!current.isLoaded) {
2038					return true;
2039				}
2040
2041				fitPos = self.getFitPos(current);
2042
2043				if (fitPos && (current.width > fitPos.width || current.height > fitPos.height)) {
2044					return true;
2045				}
2046			}
2047
2048			return false;
2049		},
2050
2051		// Check if current image dimensions are smaller than actual
2052		// =========================================================
2053
2054		isScaledDown: function (nextWidth, nextHeight) {
2055			var self = this,
2056				rez = false,
2057				current = self.current,
2058				$content = current.$content;
2059
2060			if (nextWidth !== undefined && nextHeight !== undefined) {
2061				rez = nextWidth < current.width && nextHeight < current.height;
2062			} else if ($content) {
2063				rez = $.fancybox.getTranslate($content);
2064				rez = rez.width < current.width && rez.height < current.height;
2065			}
2066
2067			return rez;
2068		},
2069
2070		// Check if image dimensions exceed parent element
2071		// ===============================================
2072
2073		canPan: function (nextWidth, nextHeight) {
2074			var self = this,
2075				current = self.current,
2076				pos = null,
2077				rez = false;
2078
2079			if (current.type === "image" && (current.isComplete || (nextWidth && nextHeight)) && !current.hasError) {
2080				rez = self.getFitPos(current);
2081
2082				if (nextWidth !== undefined && nextHeight !== undefined) {
2083					pos = {
2084						width: nextWidth,
2085						height: nextHeight
2086					};
2087				} else if (current.isComplete) {
2088					pos = $.fancybox.getTranslate(current.$content);
2089				}
2090
2091				if (pos && rez) {
2092					rez = Math.abs(pos.width - rez.width) > 1.5 || Math.abs(pos.height - rez.height) > 1.5;
2093				}
2094			}
2095
2096			return rez;
2097		},
2098
2099		// Load content into the slide
2100		// ===========================
2101
2102		loadSlide: function (slide) {
2103			var self = this,
2104				type,
2105				$slide,
2106				ajaxLoad;
2107
2108			if (slide.isLoading || slide.isLoaded) {
2109				return;
2110			}
2111
2112			slide.isLoading = true;
2113
2114			if (self.trigger("beforeLoad", slide) === false) {
2115				slide.isLoading = false;
2116
2117				return false;
2118			}
2119
2120			type = slide.type;
2121			$slide = slide.$slide;
2122
2123			$slide
2124				.off("refresh")
2125				.trigger("onReset")
2126				.addClass(slide.opts.slideClass);
2127
2128			// Create content depending on the type
2129			switch (type) {
2130				case "image":
2131					self.setImage(slide);
2132
2133					break;
2134
2135				case "iframe":
2136					self.setIframe(slide);
2137
2138					break;
2139
2140				case "html":
2141					self.setContent(slide, slide.src || slide.content);
2142
2143					break;
2144
2145				case "video":
2146					self.setContent(
2147						slide,
2148						slide.opts.video.tpl
2149							.replace(/\{\{src\}\}/gi, slide.src)
2150							.replace("{{format}}", slide.opts.videoFormat || slide.opts.video.format || "")
2151							.replace("{{poster}}", slide.thumb || "")
2152					);
2153
2154					break;
2155
2156				case "inline":
2157					if ($(slide.src).length) {
2158						self.setContent(slide, $(slide.src));
2159					} else {
2160						self.setError(slide);
2161					}
2162
2163					break;
2164
2165				case "ajax":
2166					self.showLoading(slide);
2167
2168					ajaxLoad = $.ajax(
2169						$.extend({}, slide.opts.ajax.settings, {
2170							url: slide.src,
2171							success: function (data, textStatus) {
2172								if (textStatus === "success") {
2173									self.setContent(slide, data);
2174								}
2175							},
2176							error: function (jqXHR, textStatus) {
2177								if (jqXHR && textStatus !== "abort") {
2178									self.setError(slide);
2179								}
2180							}
2181						})
2182					);
2183
2184					$slide.one("onReset", function () {
2185						ajaxLoad.abort();
2186					});
2187
2188					break;
2189
2190				default:
2191					self.setError(slide);
2192
2193					break;
2194			}
2195
2196			return true;
2197		},
2198
2199		// Use thumbnail image, if possible
2200		// ================================
2201
2202		setImage: function (slide) {
2203			var self = this,
2204				ghost;
2205
2206			// Check if need to show loading icon
2207			setTimeout(function () {
2208				var $img = slide.$image;
2209
2210				if (!self.isClosing && slide.isLoading && (!$img || !$img.length || !$img[0].complete) && !slide.hasError) {
2211					self.showLoading(slide);
2212				}
2213			}, 50);
2214
2215			//Check if image has srcset
2216			self.checkSrcset(slide);
2217
2218			// This will be wrapper containing both ghost and actual image
2219			slide.$content = $('<div class="fancybox-content"></div>')
2220				.addClass("fancybox-is-hidden")
2221				.appendTo(slide.$slide.addClass("fancybox-slide--image"));
2222
2223			// If we have a thumbnail, we can display it while actual image is loading
2224			// Users will not stare at black screen and actual image will appear gradually
2225			if (slide.opts.preload !== false && slide.opts.width && slide.opts.height && slide.thumb) {
2226				slide.width = slide.opts.width;
2227				slide.height = slide.opts.height;
2228
2229				ghost = document.createElement("img");
2230
2231				ghost.onerror = function () {
2232					$(this).remove();
2233
2234					slide.$ghost = null;
2235				};
2236
2237				ghost.onload = function () {
2238					self.afterLoad(slide);
2239				};
2240
2241				slide.$ghost = $(ghost)
2242					.addClass("fancybox-image")
2243					.appendTo(slide.$content)
2244					.attr("src", slide.thumb);
2245			}
2246
2247			// Start loading actual image
2248			self.setBigImage(slide);
2249		},
2250
2251		// Check if image has srcset and get the source
2252		// ============================================
2253		checkSrcset: function (slide) {
2254			var srcset = slide.opts.srcset || slide.opts.image.srcset,
2255				found,
2256				temp,
2257				pxRatio,
2258				windowWidth;
2259
2260			// If we have "srcset", then we need to find first matching "src" value.
2261			// This is necessary, because when you set an src attribute, the browser will preload the image
2262			// before any javascript or even CSS is applied.
2263			if (srcset) {
2264				pxRatio = window.devicePixelRatio || 1;
2265				windowWidth = window.innerWidth * pxRatio;
2266
2267				temp = srcset.split(",").map(function (el) {
2268					var ret = {};
2269
2270					el.trim()
2271						.split(/\s+/)
2272						.forEach(function (el, i) {
2273							var value = parseInt(el.substring(0, el.length - 1), 10);
2274
2275							if (i === 0) {
2276								return (ret.url = el);
2277							}
2278
2279							if (value) {
2280								ret.value = value;
2281								ret.postfix = el[el.length - 1];
2282							}
2283						});
2284
2285					return ret;
2286				});
2287
2288				// Sort by value
2289				temp.sort(function (a, b) {
2290					return a.value - b.value;
2291				});
2292
2293				// Ok, now we have an array of all srcset values
2294				for (var j = 0; j < temp.length; j++) {
2295					var el = temp[j];
2296
2297					if ((el.postfix === "w" && el.value >= windowWidth) || (el.postfix === "x" && el.value >= pxRatio)) {
2298						found = el;
2299						break;
2300					}
2301				}
2302
2303				// If not found, take the last one
2304				if (!found && temp.length) {
2305					found = temp[temp.length - 1];
2306				}
2307
2308				if (found) {
2309					slide.src = found.url;
2310
2311					// If we have default width/height values, we can calculate height for matching source
2312					if (slide.width && slide.height && found.postfix == "w") {
2313						slide.height = (slide.width / slide.height) * found.value;
2314						slide.width = found.value;
2315					}
2316
2317					slide.opts.srcset = srcset;
2318				}
2319			}
2320		},
2321
2322		// Create full-size image
2323		// ======================
2324
2325		setBigImage: function (slide) {
2326			var self = this,
2327				img = document.createElement("img"),
2328				$img = $(img);
2329
2330			slide.$image = $img
2331				.one("error", function () {
2332					self.setError(slide);
2333				})
2334				.one("load", function () {
2335					var sizes;
2336
2337					if (!slide.$ghost) {
2338						self.resolveImageSlideSize(slide, this.naturalWidth, this.naturalHeight);
2339
2340						self.afterLoad(slide);
2341					}
2342
2343					if (self.isClosing) {
2344						return;
2345					}
2346
2347					if (slide.opts.srcset) {
2348						sizes = slide.opts.sizes;
2349
2350						if (!sizes || sizes === "auto") {
2351							sizes =
2352								(slide.width / slide.height > 1 && $W.width() / $W.height() > 1 ? "100" : Math.round((slide.width / slide.height) * 100)) +
2353								"vw";
2354						}
2355
2356						$img.attr("sizes", sizes).attr("srcset", slide.opts.srcset);
2357					}
2358
2359					// Hide temporary image after some delay
2360					if (slide.$ghost) {
2361						setTimeout(function () {
2362							if (slide.$ghost && !self.isClosing) {
2363								slide.$ghost.hide();
2364							}
2365						}, Math.min(300, Math.max(1000, slide.height / 1600)));
2366					}
2367
2368					self.hideLoading(slide);
2369				})
2370				.addClass("fancybox-image")
2371				.attr("src", slide.src)
2372				.appendTo(slide.$content);
2373
2374			if ((img.complete || img.readyState == "complete") && $img.naturalWidth && $img.naturalHeight) {
2375				$img.trigger("load");
2376			} else if (img.error) {
2377				$img.trigger("error");
2378			}
2379		},
2380
2381		// Computes the slide size from image size and maxWidth/maxHeight
2382		// ==============================================================
2383
2384		resolveImageSlideSize: function (slide, imgWidth, imgHeight) {
2385			var maxWidth = parseInt(slide.opts.width, 10),
2386				maxHeight = parseInt(slide.opts.height, 10);
2387
2388			// Sets the default values from the image
2389			slide.width = imgWidth;
2390			slide.height = imgHeight;
2391
2392			if (maxWidth > 0) {
2393				slide.width = maxWidth;
2394				slide.height = Math.floor((maxWidth * imgHeight) / imgWidth);
2395			}
2396
2397			if (maxHeight > 0) {
2398				slide.width = Math.floor((maxHeight * imgWidth) / imgHeight);
2399				slide.height = maxHeight;
2400			}
2401		},
2402
2403		// Create iframe wrapper, iframe and bindings
2404		// ==========================================
2405
2406		setIframe: function (slide) {
2407			var self = this,
2408				opts = slide.opts.iframe,
2409				$slide = slide.$slide,
2410				$iframe;
2411
2412			slide.$content = $('<div class="fancybox-content' + (opts.preload ? " fancybox-is-hidden" : "") + '"></div>')
2413				.css(opts.css)
2414				.appendTo($slide);
2415
2416			$slide.addClass("fancybox-slide--" + slide.contentType);
2417
2418			slide.$iframe = $iframe = $(opts.tpl.replace(/\{rnd\}/g, new Date().getTime()))
2419				.attr(opts.attr)
2420				.appendTo(slide.$content);
2421
2422			if (opts.preload) {
2423				self.showLoading(slide);
2424
2425				// Unfortunately, it is not always possible to determine if iframe is successfully loaded
2426				// (due to browser security policy)
2427
2428				$iframe.on("load.fb error.fb", function (e) {
2429					this.isReady = 1;
2430
2431					slide.$slide.trigger("refresh");
2432
2433					self.afterLoad(slide);
2434				});
2435
2436				// Recalculate iframe content size
2437				// ===============================
2438
2439				$slide.on("refresh.fb", function () {
2440					var $content = slide.$content,
2441						frameWidth = opts.css.width,
2442						frameHeight = opts.css.height,
2443						$contents,
2444						$body;
2445
2446					if ($iframe[0].isReady !== 1) {
2447						return;
2448					}
2449
2450					try {
2451						$contents = $iframe.contents();
2452						$body = $contents.find("body");
2453					} catch (ignore) {}
2454
2455					// Calculate content dimensions, if it is accessible
2456					if ($body && $body.length && $body.children().length) {
2457						// Avoid scrolling to top (if multiple instances)
2458						$slide.css("overflow", "visible");
2459
2460						$content.css({
2461							width: "100%",
2462							"max-width": "100%",
2463							height: "9999px"
2464						});
2465
2466						if (frameWidth === undefined) {
2467							frameWidth = Math.ceil(Math.max($body[0].clientWidth, $body.outerWidth(true)));
2468						}
2469
2470						$content.css("width", frameWidth ? frameWidth : "").css("max-width", "");
2471
2472						if (frameHeight === undefined) {
2473							frameHeight = Math.ceil(Math.max($body[0].clientHeight, $body.outerHeight(true)));
2474						}
2475
2476						$content.css("height", frameHeight ? frameHeight : "");
2477
2478						$slide.css("overflow", "auto");
2479					}
2480
2481					$content.removeClass("fancybox-is-hidden");
2482				});
2483			} else {
2484				self.afterLoad(slide);
2485			}
2486
2487			$iframe.attr("src", slide.src);
2488
2489			// Remove iframe if closing or changing gallery item
2490			$slide.one("onReset", function () {
2491				// This helps IE not to throw errors when closing
2492				try {
2493					$(this)
2494						.find("iframe")
2495						.hide()
2496						.unbind()
2497						.attr("src", "//about:blank");
2498				} catch (ignore) {}
2499
2500				$(this)
2501					.off("refresh.fb")
2502					.empty();
2503
2504				slide.isLoaded = false;
2505				slide.isRevealed = false;
2506			});
2507		},
2508
2509		// Wrap and append content to the slide
2510		// ======================================
2511
2512		setContent: function (slide, content) {
2513			var self = this;
2514
2515			if (self.isClosing) {
2516				return;
2517			}
2518
2519			self.hideLoading(slide);
2520
2521			if (slide.$content) {
2522				$.fancybox.stop(slide.$content);
2523			}
2524
2525			slide.$slide.empty();
2526
2527			// If content is a jQuery object, then it will be moved to the slide.
2528			// The placeholder is created so we will know where to put it back.
2529			if (isQuery(content) && content.parent().length) {
2530				// Make sure content is not already moved to fancyBox
2531				if (content.hasClass("fancybox-content") || content.parent().hasClass("fancybox-content")) {
2532					content.parents(".fancybox-slide").trigger("onReset");
2533				}
2534
2535				// Create temporary element marking original place of the content
2536				slide.$placeholder = $("<div>")
2537					.hide()
2538					.insertAfter(content);
2539
2540				// Make sure content is visible
2541				content.css("display", "inline-block");
2542			} else if (!slide.hasError) {
2543				// If content is just a plain text, try to convert it to html
2544				if ($.type(content) === "string") {
2545					content = $("<div>")
2546						.append($.trim(content))
2547						.contents();
2548				}
2549
2550				// If "filter" option is provided, then filter content
2551				if (slide.opts.filter) {
2552					content = $("<div>")
2553						.html(content)
2554						.find(slide.opts.filter);
2555				}
2556			}
2557
2558			slide.$slide.one("onReset", function () {
2559				// Pause all html5 video/audio
2560				$(this)
2561					.find("video,audio")
2562					.trigger("pause");
2563
2564				// Put content back
2565				if (slide.$placeholder) {
2566					slide.$placeholder.after(content.removeClass("fancybox-content").hide()).remove();
2567
2568					slide.$placeholder = null;
2569				}
2570
2571				// Remove custom close button
2572				if (slide.$smallBtn) {
2573					slide.$smallBtn.remove();
2574
2575					slide.$smallBtn = null;
2576				}
2577
2578				// Remove content and mark slide as not loaded
2579				if (!slide.hasError) {
2580					$(this).empty();
2581
2582					slide.isLoaded = false;
2583					slide.isRevealed = false;
2584				}
2585			});
2586
2587			$(content).appendTo(slide.$slide);
2588
2589			if ($(content).is("video,audio")) {
2590				$(content).addClass("fancybox-video");
2591
2592				$(content).wrap("<div></div>");
2593
2594				slide.contentType = "video";
2595
2596				slide.opts.width = slide.opts.width || $(content).attr("width");
2597				slide.opts.height = slide.opts.height || $(content).attr("height");
2598			}
2599
2600			slide.$content = slide.$slide
2601				.children()
2602				.filter("div,form,main,video,audio,article,.fancybox-content")
2603				.first();
2604
2605			slide.$content.siblings().hide();
2606
2607			// Re-check if there is a valid content
2608			// (in some cases, ajax response can contain various elements or plain text)
2609			if (!slide.$content.length) {
2610				slide.$content = slide.$slide
2611					.wrapInner("<div></div>")
2612					.children()
2613					.first();
2614			}
2615
2616			slide.$content.addClass("fancybox-content");
2617
2618			slide.$slide.addClass("fancybox-slide--" + slide.contentType);
2619
2620			self.afterLoad(slide);
2621		},
2622
2623		// Display error message
2624		// =====================
2625
2626		setError: function (slide) {
2627			slide.hasError = true;
2628
2629			slide.$slide
2630				.trigger("onReset")
2631				.removeClass("fancybox-slide--" + slide.contentType)
2632				.addClass("fancybox-slide--error");
2633
2634			slide.contentType = "html";
2635
2636			this.setContent(slide, this.translate(slide, slide.opts.errorTpl));
2637
2638			if (slide.pos === this.currPos) {
2639				this.isAnimating = false;
2640			}
2641		},
2642
2643		// Show loading icon inside the slide
2644		// ==================================
2645
2646		showLoading: function (slide) {
2647			var self = this;
2648
2649			slide = slide || self.current;
2650
2651			if (slide && !slide.$spinner) {
2652				slide.$spinner = $(self.translate(self, self.opts.spinnerTpl))
2653					.appendTo(slide.$slide)
2654					.hide()
2655					.fadeIn("fast");
2656			}
2657		},
2658
2659		// Remove loading icon from the slide
2660		// ==================================
2661
2662		hideLoading: function (slide) {
2663			var self = this;
2664
2665			slide = slide || self.current;
2666
2667			if (slide && slide.$spinner) {
2668				slide.$spinner.stop().remove();
2669
2670				delete slide.$spinner;
2671			}
2672		},
2673
2674		// Adjustments after slide content has been loaded
2675		// ===============================================
2676
2677		afterLoad: function (slide) {
2678			var self = this;
2679
2680			if (self.isClosing) {
2681				return;
2682			}
2683
2684			slide.isLoading = false;
2685			slide.isLoaded = true;
2686
2687			self.trigger("afterLoad", slide);
2688
2689			self.hideLoading(slide);
2690
2691			// Add small close button
2692			if (slide.opts.smallBtn && (!slide.$smallBtn || !slide.$smallBtn.length)) {
2693				slide.$smallBtn = $(self.translate(slide, slide.opts.btnTpl.smallBtn)).appendTo(slide.$content);
2694			}
2695
2696			// Disable right click
2697			if (slide.opts.protect && slide.$content && !slide.hasError) {
2698				slide.$content.on("contextmenu.fb", function (e) {
2699					if (e.button == 2) {
2700						e.preventDefault();
2701					}
2702
2703					return true;
2704				});
2705
2706				// Add fake element on top of the image
2707				// This makes a bit harder for user to select image
2708				if (slide.type === "image") {
2709					$('<div class="fancybox-spaceball"></div>').appendTo(slide.$content);
2710				}
2711			}
2712
2713			self.adjustCaption(slide);
2714
2715			self.adjustLayout(slide);
2716
2717			if (slide.pos === self.currPos) {
2718				self.updateCursor();
2719			}
2720
2721			self.revealContent(slide);
2722		},
2723
2724		// Prevent caption overlap,
2725		// fix css inconsistency across browsers
2726		// =====================================
2727
2728		adjustCaption: function (slide) {
2729			var self = this,
2730				current = slide || self.current,
2731				caption = current.opts.caption,
2732				preventOverlap = current.opts.preventCaptionOverlap,
2733				$caption = self.$refs.caption,
2734				$clone,
2735				captionH = false;
2736
2737			$caption.toggleClass("fancybox-caption--separate", preventOverlap);
2738
2739			if (preventOverlap && caption && caption.length) {
2740				if (current.pos !== self.currPos) {
2741					$clone = $caption.clone().appendTo($caption.parent());
2742
2743					$clone
2744						.children()
2745						.eq(0)
2746						.empty()
2747						.html(caption);
2748
2749					captionH = $clone.outerHeight(true);
2750
2751					$clone.empty().remove();
2752				} else if (self.$caption) {
2753					captionH = self.$caption.outerHeight(true);
2754				}
2755
2756				current.$slide.css("padding-bottom", captionH || "");
2757			}
2758		},
2759
2760		// Simple hack to fix inconsistency across browsers, described here (affects Edge, too):
2761		// https://bugzilla.mozilla.org/show_bug.cgi?id=748518
2762		// ====================================================================================
2763
2764		adjustLayout: function (slide) {
2765			var self = this,
2766				current = slide || self.current,
2767				scrollHeight,
2768				marginBottom,
2769				inlinePadding,
2770				actualPadding;
2771
2772			if (current.isLoaded && current.opts.disableLayoutFix !== true) {
2773				current.$content.css("margin-bottom", "");
2774
2775				// If we would always set margin-bottom for the content,
2776				// then it would potentially break vertical align
2777				if (current.$content.outerHeight() > current.$slide.height() + 0.5) {
2778					inlinePadding = current.$slide[0].style["padding-bottom"];
2779					actualPadding = current.$slide.css("padding-bottom");
2780
2781					if (parseFloat(actualPadding) > 0) {
2782						scrollHeight = current.$slide[0].scrollHeight;
2783
2784						current.$slide.css("padding-bottom", 0);
2785
2786						if (Math.abs(scrollHeight - current.$slide[0].scrollHeight) < 1) {
2787							marginBottom = actualPadding;
2788						}
2789
2790						current.$slide.css("padding-bottom", inlinePadding);
2791					}
2792				}
2793
2794				current.$content.css("margin-bottom", marginBottom);
2795			}
2796		},
2797
2798		// Make content visible
2799		// This method is called right after content has been loaded or
2800		// user navigates gallery and transition should start
2801		// ============================================================
2802
2803		revealContent: function (slide) {
2804			var self = this,
2805				$slide = slide.$slide,
2806				end = false,
2807				start = false,
2808				isMoved = self.isMoved(slide),
2809				isRevealed = slide.isRevealed,
2810				effect,
2811				effectClassName,
2812				duration,
2813				opacity;
2814
2815			slide.isRevealed = true;
2816
2817			effect = slide.opts[self.firstRun ? "animationEffect" : "transitionEffect"];
2818			duration = slide.opts[self.firstRun ? "animationDuration" : "transitionDuration"];
2819
2820			duration = parseInt(slide.forcedDuration === undefined ? duration : slide.forcedDuration, 10);
2821
2822			if (isMoved || slide.pos !== self.currPos || !duration) {
2823				effect = false;
2824			}
2825
2826			// Check if can zoom
2827			if (effect === "zoom") {
2828				if (slide.pos === self.currPos && duration && slide.type === "image" && !slide.hasError && (start = self.getThumbPos(slide))) {
2829					end = self.getFitPos(slide);
2830				} else {
2831					effect = "fade";
2832				}
2833			}
2834
2835			// Zoom animation
2836			// ==============
2837			if (effect === "zoom") {
2838				self.isAnimating = true;
2839
2840				end.scaleX = end.width / start.width;
2841				end.scaleY = end.height / start.height;
2842
2843				// Check if we need to animate opacity
2844				opacity = slide.opts.zoomOpacity;
2845
2846				if (opacity == "auto") {
2847					opacity = Math.abs(slide.width / slide.height - start.width / start.height) > 0.1;
2848				}
2849
2850				if (opacity) {
2851					start.opacity = 0.1;
2852					end.opacity = 1;
2853				}
2854
2855				// Draw image at start position
2856				$.fancybox.setTranslate(slide.$content.removeClass("fancybox-is-hidden"), start);
2857
2858				forceRedraw(slide.$content);
2859
2860				// Start animation
2861				$.fancybox.animate(slide.$content, end, duration, function () {
2862					self.isAnimating = false;
2863
2864					self.complete();
2865				});
2866
2867				return;
2868			}
2869
2870			self.updateSlide(slide);
2871
2872			// Simply show content if no effect
2873			// ================================
2874			if (!effect) {
2875				slide.$content.removeClass("fancybox-is-hidden");
2876
2877				if (!isRevealed && isMoved && slide.type === "image" && !slide.hasError) {
2878					slide.$content.hide().fadeIn("fast");
2879				}
2880
2881				if (slide.pos === self.currPos) {
2882					self.complete();
2883				}
2884
2885				return;
2886			}
2887
2888			// Prepare for CSS transiton
2889			// =========================
2890			$.fancybox.stop($slide);
2891
2892			//effectClassName = "fancybox-animated fancybox-slide--" + (slide.pos >= self.prevPos ? "next" : "previous") + " fancybox-fx-" + effect;
2893			effectClassName = "fancybox-slide--" + (slide.pos >= self.prevPos ? "next" : "previous") + " fancybox-animated fancybox-fx-" + effect;
2894
2895			$slide.addClass(effectClassName).removeClass("fancybox-slide--current"); //.addClass(effectClassName);
2896
2897			slide.$content.removeClass("fancybox-is-hidden");
2898
2899			// Force reflow
2900			forceRedraw($slide);
2901
2902			if (slide.type !== "image") {
2903				slide.$content.hide().show(0);
2904			}
2905
2906			$.fancybox.animate(
2907				$slide,
2908				"fancybox-slide--current",
2909				duration,
2910				function () {
2911					$slide.removeClass(effectClassName).css({
2912						transform: "",
2913						opacity: ""
2914					});
2915
2916					if (slide.pos === self.currPos) {
2917						self.complete();
2918					}
2919				},
2920				true
2921			);
2922		},
2923
2924		// Check if we can and have to zoom from thumbnail
2925		//================================================
2926
2927		getThumbPos: function (slide) {
2928			var rez = false,
2929				$thumb = slide.$thumb,
2930				thumbPos,
2931				btw,
2932				brw,
2933				bbw,
2934				blw;
2935
2936			if (!$thumb || !inViewport($thumb[0])) {
2937				return false;
2938			}
2939
2940			thumbPos = $.fancybox.getTranslate($thumb);
2941
2942			btw = parseFloat($thumb.css("border-top-width") || 0);
2943			brw = parseFloat($thumb.css("border-right-width") || 0);
2944			bbw = parseFloat($thumb.css("border-bottom-width") || 0);
2945			blw = parseFloat($thumb.css("border-left-width") || 0);
2946
2947			rez = {
2948				top: thumbPos.top + btw,
2949				left: thumbPos.left + blw,
2950				width: thumbPos.width - brw - blw,
2951				height: thumbPos.height - btw - bbw,
2952				scaleX: 1,
2953				scaleY: 1
2954			};
2955
2956			return thumbPos.width > 0 && thumbPos.height > 0 ? rez : false;
2957		},
2958
2959		// Final adjustments after current gallery item is moved to position
2960		// and it`s content is loaded
2961		// ==================================================================
2962
2963		complete: function () {
2964			var self = this,
2965				current = self.current,
2966				slides = {},
2967				$el;
2968
2969			if (self.isMoved() || !current.isLoaded) {
2970				return;
2971			}
2972
2973			if (!current.isComplete) {
2974				current.isComplete = true;
2975
2976				current.$slide.siblings().trigger("onReset");
2977
2978				self.preload("inline");
2979
2980				// Trigger any CSS transiton inside the slide
2981				forceRedraw(current.$slide);
2982
2983				current.$slide.addClass("fancybox-slide--complete");
2984
2985				// Remove unnecessary slides
2986				$.each(self.slides, function (key, slide) {
2987					if (slide.pos >= self.currPos - 1 && slide.pos <= self.currPos + 1) {
2988						slides[slide.pos] = slide;
2989					} else if (slide) {
2990						$.fancybox.stop(slide.$slide);
2991
2992						slide.$slide.off().remove();
2993					}
2994				});
2995
2996				self.slides = slides;
2997			}
2998
2999			self.isAnimating = false;
3000
3001			self.updateCursor();
3002
3003			self.trigger("afterShow");
3004
3005			// Autoplay first html5 video/audio
3006			if (!!current.opts.video.autoStart) {
3007				current.$slide
3008					.find("video,audio")
3009					.filter(":visible:first")
3010					.trigger("play")
3011					.one("ended", function () {
3012						if (Document.exitFullscreen) {
3013							Document.exitFullscreen();
3014						} else if (this.webkitExitFullscreen) {
3015							this.webkitExitFullscreen();
3016						}
3017
3018						self.next();
3019					});
3020			}
3021
3022			// Try to focus on the first focusable element
3023			if (current.opts.autoFocus && current.contentType === "html") {
3024				// Look for the first input with autofocus attribute
3025				$el = current.$content.find("input[autofocus]:enabled:visible:first");
3026
3027				if ($el.length) {
3028					$el.trigger("focus");
3029				} else {
3030					self.focus(null, true);
3031				}
3032			}
3033
3034			// Avoid jumping
3035			current.$slide.scrollTop(0).scrollLeft(0);
3036		},
3037
3038		// Preload next and previous slides
3039		// ================================
3040
3041		preload: function (type) {
3042			var self = this,
3043				prev,
3044				next;
3045
3046			if (self.group.length < 2) {
3047				return;
3048			}
3049
3050			next = self.slides[self.currPos + 1];
3051			prev = self.slides[self.currPos - 1];
3052
3053			if (prev && prev.type === type) {
3054				self.loadSlide(prev);
3055			}
3056
3057			if (next && next.type === type) {
3058				self.loadSlide(next);
3059			}
3060		},
3061
3062		// Try to find and focus on the first focusable element
3063		// ====================================================
3064
3065		focus: function (e, firstRun) {
3066			var self = this,
3067				focusableStr = [
3068					"a[href]",
3069					"area[href]",
3070					'input:not([disabled]):not([type="hidden"]):not([aria-hidden])',
3071					"select:not([disabled]):not([aria-hidden])",
3072					"textarea:not([disabled]):not([aria-hidden])",
3073					"button:not([disabled]):not([aria-hidden])",
3074					"iframe",
3075					"object",
3076					"embed",
3077					"video",
3078					"audio",
3079					"[contenteditable]",
3080					'[tabindex]:not([tabindex^="-"])'
3081				].join(","),
3082				focusableItems,
3083				focusedItemIndex;
3084
3085			if (self.isClosing) {
3086				return;
3087			}
3088
3089			if (e || !self.current || !self.current.isComplete) {
3090				// Focus on any element inside fancybox
3091				focusableItems = self.$refs.container.find("*:visible");
3092			} else {
3093				// Focus inside current slide
3094				focusableItems = self.current.$slide.find("*:visible" + (firstRun ? ":not(.fancybox-close-small)" : ""));
3095			}
3096
3097			focusableItems = focusableItems.filter(focusableStr).filter(function () {
3098				return $(this).css("visibility") !== "hidden" && !$(this).hasClass("disabled");
3099			});
3100
3101			if (focusableItems.length) {
3102				focusedItemIndex = focusableItems.index(document.activeElement);
3103
3104				if (e && e.shiftKey) {
3105					// Back tab
3106					if (focusedItemIndex < 0 || focusedItemIndex == 0) {
3107						e.preventDefault();
3108
3109						focusableItems.eq(focusableItems.length - 1).trigger("focus");
3110					}
3111				} else {
3112					// Outside or Forward tab
3113					if (focusedItemIndex < 0 || focusedItemIndex == focusableItems.length - 1) {
3114						if (e) {
3115							e.preventDefault();
3116						}
3117
3118						focusableItems.eq(0).trigger("focus");
3119					}
3120				}
3121			} else {
3122				self.$refs.container.trigger("focus");
3123			}
3124		},
3125
3126		// Activates current instance - brings container to the front and enables keyboard,
3127		// notifies other instances about deactivating
3128		// =================================================================================
3129
3130		activate: function () {
3131			var self = this;
3132
3133			// Deactivate all instances
3134			$(".fancybox-container").each(function () {
3135				var instance = $(this).data("FancyBox");
3136
3137				// Skip self and closing instances
3138				if (instance && instance.id !== self.id && !instance.isClosing) {
3139					instance.trigger("onDeactivate");
3140
3141					instance.removeEvents();
3142
3143					instance.isVisible = false;
3144				}
3145			});
3146
3147			self.isVisible = true;
3148
3149			if (self.current || self.isIdle) {
3150				self.update();
3151
3152				self.updateControls();
3153			}
3154
3155			self.trigger("onActivate");
3156
3157			self.addEvents();
3158		},
3159
3160		// Start closing procedure
3161		// This will start "zoom-out" animation if needed and clean everything up afterwards
3162		// =================================================================================
3163
3164		close: function (e, d) {
3165			var self = this,
3166				current = self.current,
3167				effect,
3168				duration,
3169				$content,
3170				domRect,
3171				opacity,
3172				start,
3173				end;
3174
3175			var done = function () {
3176				self.cleanUp(e);
3177			};
3178
3179			if (self.isClosing) {
3180				return false;
3181			}
3182
3183			self.isClosing = true;
3184
3185			// If beforeClose callback prevents closing, make sure content is centered
3186			if (self.trigger("beforeClose", e) === false) {
3187				self.isClosing = false;
3188
3189				requestAFrame(function () {
3190					self.update();
3191				});
3192
3193				return false;
3194			}
3195
3196			// Remove all events
3197			// If there are multiple instances, they will be set again by "activate" method
3198			self.removeEvents();
3199
3200			$content = current.$content;
3201			effect = current.opts.animationEffect;
3202			duration = $.isNumeric(d) ? d : effect ? current.opts.animationDuration : 0;
3203
3204			current.$slide.removeClass("fancybox-slide--complete fancybox-slide--next fancybox-slide--previous fancybox-animated");
3205
3206			if (e !== true) {
3207				$.fancybox.stop(current.$slide);
3208			} else {
3209				effect = false;
3210			}
3211
3212			// Remove other slides
3213			current.$slide
3214				.siblings()
3215				.trigger("onReset")
3216				.remove();
3217
3218			// Trigger animations
3219			if (duration) {
3220				self.$refs.container
3221					.removeClass("fancybox-is-open")
3222					.addClass("fancybox-is-closing")
3223					.css("transition-duration", duration + "ms");
3224			}
3225
3226			// Clean up
3227			self.hideLoading(current);
3228
3229			self.hideControls(true);
3230
3231			self.updateCursor();
3232
3233			// Check if possible to zoom-out
3234			if (
3235				effect === "zoom" &&
3236				!($content && duration && current.type === "image" && !self.isMoved() && !current.hasError && (end = self.getThumbPos(current)))
3237			) {
3238				effect = "fade";
3239			}
3240
3241			if (effect === "zoom") {
3242				$.fancybox.stop($content);
3243
3244				domRect = $.fancybox.getTranslate($content);
3245
3246				start = {
3247					top: domRect.top,
3248					left: domRect.left,
3249					scaleX: domRect.width / end.width,
3250					scaleY: domRect.height / end.height,
3251					width: end.width,
3252					height: end.height
3253				};
3254
3255				// Check if we need to animate opacity
3256				opacity = current.opts.zoomOpacity;
3257
3258				if (opacity == "auto") {
3259					opacity = Math.abs(current.width / current.height - end.width / end.height) > 0.1;
3260				}
3261
3262				if (opacity) {
3263					end.opacity = 0;
3264				}
3265
3266				$.fancybox.setTranslate($content, start);
3267
3268				forceRedraw($content);
3269
3270				$.fancybox.animate($content, end, duration, done);
3271
3272				return true;
3273			}
3274
3275			if (effect && duration) {
3276				$.fancybox.animate(
3277					current.$slide.addClass("fancybox-slide--previous").removeClass("fancybox-slide--current"),
3278					"fancybox-animated fancybox-fx-" + effect,
3279					duration,
3280					done
3281				);
3282			} else {
3283				// If skip animation
3284				if (e === true) {
3285					setTimeout(done, duration);
3286				} else {
3287					done();
3288				}
3289			}
3290
3291			return true;
3292		},
3293
3294		// Final adjustments after removing the instance
3295		// =============================================
3296
3297		cleanUp: function (e) {
3298			var self = this,
3299				instance,
3300				$focus = self.current.opts.$orig,
3301				x,
3302				y;
3303
3304			self.current.$slide.trigger("onReset");
3305
3306			self.$refs.container.empty().remove();
3307
3308			self.trigger("afterClose", e);
3309
3310			// Place back focus
3311			if (!!self.current.opts.backFocus) {
3312				if (!$focus || !$focus.length || !$focus.is(":visible")) {
3313					$focus = self.$trigger;
3314				}
3315
3316				if ($focus && $focus.length) {
3317					x = window.scrollX;
3318					y = window.scrollY;
3319
3320					$focus.trigger("focus");
3321
3322					$("html, body")
3323						.scrollTop(y)
3324						.scrollLeft(x);
3325				}
3326			}
3327
3328			self.current = null;
3329
3330			// Check if there are other instances
3331			instance = $.fancybox.getInstance();
3332
3333			if (instance) {
3334				instance.activate();
3335			} else {
3336				$("body").removeClass("fancybox-active compensate-for-scrollbar");
3337
3338				$("#fancybox-style-noscroll").remove();
3339			}
3340		},
3341
3342		// Call callback and trigger an event
3343		// ==================================
3344
3345		trigger: function (name, slide) {
3346			var args = Array.prototype.slice.call(arguments, 1),
3347				self = this,
3348				obj = slide && slide.opts ? slide : self.current,
3349				rez;
3350
3351			if (obj) {
3352				args.unshift(obj);
3353			} else {
3354				obj = self;
3355			}
3356
3357			args.unshift(self);
3358
3359			if ($.isFunction(obj.opts[name])) {
3360				rez = obj.opts[name].apply(obj, args);
3361			}
3362
3363			if (rez === false) {
3364				return rez;
3365			}
3366
3367			if (name === "afterClose" || !self.$refs) {
3368				$D.trigger(name + ".fb", args);
3369			} else {
3370				self.$refs.container.trigger(name + ".fb", args);
3371			}
3372		},
3373
3374		// Update infobar values, navigation button states and reveal caption
3375		// ==================================================================
3376
3377		updateControls: function () {
3378			var self = this,
3379				current = self.current,
3380				index = current.index,
3381				$container = self.$refs.container,
3382				$caption = self.$refs.caption,
3383				caption = current.opts.caption;
3384
3385			// Recalculate content dimensions
3386			current.$slide.trigger("refresh");
3387
3388			// Set caption
3389			if (caption && caption.length) {
3390				self.$caption = $caption;
3391
3392				$caption
3393					.children()
3394					.eq(0)
3395					.html(caption);
3396			} else {
3397				self.$caption = null;
3398			}
3399
3400			if (!self.hasHiddenControls && !self.isIdle) {
3401				self.showControls();
3402			}
3403
3404			// Update info and navigation elements
3405			$container.find("[data-fancybox-count]").html(self.group.length);
3406			$container.find("[data-fancybox-index]").html(index + 1);
3407
3408			$container.find("[data-fancybox-prev]").prop("disabled", !current.opts.loop && index <= 0);
3409			$container.find("[data-fancybox-next]").prop("disabled", !current.opts.loop && index >= self.group.length - 1);
3410
3411			if (current.type === "image") {
3412				// Re-enable buttons; update download button source
3413				$container
3414					.find("[data-fancybox-zoom]")
3415					.show()
3416					.end()
3417					.find("[data-fancybox-download]")
3418					.attr("href", current.opts.image.src || current.src)
3419					.show();
3420			} else if (current.opts.toolbar) {
3421				$container.find("[data-fancybox-download],[data-fancybox-zoom]").hide();
3422			}
3423
3424			// Make sure focus is not on disabled button/element
3425			if ($(document.activeElement).is(":hidden,[disabled]")) {
3426				self.$refs.container.trigger("focus");
3427			}
3428		},
3429
3430		// Hide toolbar and caption
3431		// ========================
3432
3433		hideControls: function (andCaption) {
3434			var self = this,
3435				arr = ["infobar", "toolbar", "nav"];
3436
3437			if (andCaption || !self.current.opts.preventCaptionOverlap) {
3438				arr.push("caption");
3439			}
3440
3441			this.$refs.container.removeClass(
3442				arr
3443					.map(function (i) {
3444						return "fancybox-show-" + i;
3445					})
3446					.join(" ")
3447			);
3448
3449			this.hasHiddenControls = true;
3450		},
3451
3452		showControls: function () {
3453			var self = this,
3454				opts = self.current ? self.current.opts : self.opts,
3455				$container = self.$refs.container;
3456
3457			self.hasHiddenControls = false;
3458			self.idleSecondsCounter = 0;
3459
3460			$container
3461				.toggleClass("fancybox-show-toolbar", !!(opts.toolbar && opts.buttons))
3462				.toggleClass("fancybox-show-infobar", !!(opts.infobar && self.group.length > 1))
3463				.toggleClass("fancybox-show-caption", !!self.$caption)
3464				.toggleClass("fancybox-show-nav", !!(opts.arrows && self.group.length > 1))
3465				.toggleClass("fancybox-is-modal", !!opts.modal);
3466		},
3467
3468		// Toggle toolbar and caption
3469		// ==========================
3470
3471		toggleControls: function () {
3472			if (this.hasHiddenControls) {
3473				this.showControls();
3474			} else {
3475				this.hideControls();
3476			}
3477		}
3478	});
3479
3480	$.fancybox = {
3481		version: "3.5.7",
3482		defaults: defaults,
3483
3484		// Get current instance and execute a command.
3485		//
3486		// Examples of usage:
3487		//
3488		//   $instance = $.fancybox.getInstance();
3489		//   $.fancybox.getInstance().jumpTo( 1 );
3490		//   $.fancybox.getInstance( 'jumpTo', 1 );
3491		//   $.fancybox.getInstance( function() {
3492		//       console.info( this.currIndex );
3493		//   });
3494		// ======================================================
3495
3496		getInstance: function (command) {
3497			var instance = $('.fancybox-container:not(".fancybox-is-closing"):last').data("FancyBox"),
3498				args = Array.prototype.slice.call(arguments, 1);
3499
3500			if (instance instanceof FancyBox) {
3501				if ($.type(command) === "string") {
3502					instance[command].apply(instance, args);
3503				} else if ($.type(command) === "function") {
3504					command.apply(instance, args);
3505				}
3506
3507				return instance;
3508			}
3509
3510			return false;
3511		},
3512
3513		// Create new instance
3514		// ===================
3515
3516		open: function (items, opts, index) {
3517			return new FancyBox(items, opts, index);
3518		},
3519
3520		// Close current or all instances
3521		// ==============================
3522
3523		close: function (all) {
3524			var instance = this.getInstance();
3525
3526			if (instance) {
3527				instance.close();
3528
3529				// Try to find and close next instance
3530				if (all === true) {
3531					this.close(all);
3532				}
3533			}
3534		},
3535
3536		// Close all instances and unbind all events
3537		// =========================================
3538
3539		destroy: function () {
3540			this.close(true);
3541
3542			$D.add("body").off("click.fb-start", "**");
3543		},
3544
3545		// Try to detect mobile devices
3546		// ============================
3547
3548		isMobile: /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent),
3549
3550		// Detect if 'translate3d' support is available
3551		// ============================================
3552
3553		use3d: (function () {
3554			var div = document.createElement("div");
3555
3556			return (
3557				window.getComputedStyle &&
3558				window.getComputedStyle(div) &&
3559				window.getComputedStyle(div).getPropertyValue("transform") &&
3560				!(document.documentMode && document.documentMode < 11)
3561			);
3562		})(),
3563
3564		// Helper function to get current visual state of an element
3565		// returns array[ top, left, horizontal-scale, vertical-scale, opacity ]
3566		// =====================================================================
3567
3568		getTranslate: function ($el) {
3569			var domRect;
3570
3571			if (!$el || !$el.length) {
3572				return false;
3573			}
3574
3575			domRect = $el[0].getBoundingClientRect();
3576
3577			return {
3578				top: domRect.top || 0,
3579				left: domRect.left || 0,
3580				width: domRect.width,
3581				height: domRect.height,
3582				opacity: parseFloat($el.css("opacity"))
3583			};
3584		},
3585
3586		// Shortcut for setting "translate3d" properties for element
3587		// Can set be used to set opacity, too
3588		// ========================================================
3589
3590		setTranslate: function ($el, props) {
3591			var str = "",
3592				css = {};
3593
3594			if (!$el || !props) {
3595				return;
3596			}
3597
3598			if (props.left !== undefined || props.top !== undefined) {
3599				str =
3600					(props.left === undefined ? $el.position().left : props.left) +
3601					"px, " +
3602					(props.top === undefined ? $el.position().top : props.top) +
3603					"px";
3604
3605				if (this.use3d) {
3606					str = "translate3d(" + str + ", 0px)";
3607				} else {
3608					str = "translate(" + str + ")";
3609				}
3610			}
3611
3612			if (props.scaleX !== undefined && props.scaleY !== undefined) {
3613				str += " scale(" + props.scaleX + ", " + props.scaleY + ")";
3614			} else if (props.scaleX !== undefined) {
3615				str += " scaleX(" + props.scaleX + ")";
3616			}
3617
3618			if (str.length) {
3619				css.transform = str;
3620			}
3621
3622			if (props.opacity !== undefined) {
3623				css.opacity = props.opacity;
3624			}
3625
3626			if (props.width !== undefined) {
3627				css.width = props.width;
3628			}
3629
3630			if (props.height !== undefined) {
3631				css.height = props.height;
3632			}
3633
3634			return $el.css(css);
3635		},
3636
3637		// Simple CSS transition handler
3638		// =============================
3639
3640		animate: function ($el, to, duration, callback, leaveAnimationName) {
3641			var self = this,
3642				from;
3643
3644			if ($.isFunction(duration)) {
3645				callback = duration;
3646				duration = null;
3647			}
3648
3649			self.stop($el);
3650
3651			from = self.getTranslate($el);
3652
3653			$el.on(transitionEnd, function (e) {
3654				// Skip events from child elements and z-index change
3655				if (e && e.originalEvent && (!$el.is(e.originalEvent.target) || e.originalEvent.propertyName == "z-index")) {
3656					return;
3657				}
3658
3659				self.stop($el);
3660
3661				if ($.isNumeric(duration)) {
3662					$el.css("transition-duration", "");
3663				}
3664
3665				if ($.isPlainObject(to)) {
3666					if (to.scaleX !== undefined && to.scaleY !== undefined) {
3667						self.setTranslate($el, {
3668							top: to.top,
3669							left: to.left,
3670							width: from.width * to.scaleX,
3671							height: from.height * to.scaleY,
3672							scaleX: 1,
3673							scaleY: 1
3674						});
3675					}
3676				} else if (leaveAnimationName !== true) {
3677					$el.removeClass(to);
3678				}
3679
3680				if ($.isFunction(callback)) {
3681					callback(e);
3682				}
3683			});
3684
3685			if ($.isNumeric(duration)) {
3686				$el.css("transition-duration", duration + "ms");
3687			}
3688
3689			// Start animation by changing CSS properties or class name
3690			if ($.isPlainObject(to)) {
3691				if (to.scaleX !== undefined && to.scaleY !== undefined) {
3692					delete to.width;
3693					delete to.height;
3694
3695					if ($el.parent().hasClass("fancybox-slide--image")) {
3696						$el.parent().addClass("fancybox-is-scaling");
3697					}
3698				}
3699
3700				$.fancybox.setTranslate($el, to);
3701			} else {
3702				$el.addClass(to);
3703			}
3704
3705			// Make sure that `transitionend` callback gets fired
3706			$el.data(
3707				"timer",
3708				setTimeout(function () {
3709					$el.trigger(transitionEnd);
3710				}, duration + 33)
3711			);
3712		},
3713
3714		stop: function ($el, callCallback) {
3715			if ($el && $el.length) {
3716				clearTimeout($el.data("timer"));
3717
3718				if (callCallback) {
3719					$el.trigger(transitionEnd);
3720				}
3721
3722				$el.off(transitionEnd).css("transition-duration", "");
3723
3724				$el.parent().removeClass("fancybox-is-scaling");
3725			}
3726		}
3727	};
3728
3729	// Default click handler for "fancyboxed" links
3730	// ============================================
3731
3732	function _run(e, opts) {
3733		var items = [],
3734			index = 0,
3735			$target,
3736			value,
3737			instance;
3738
3739		// Avoid opening multiple times
3740		if (e && e.isDefaultPrevented()) {
3741			return;
3742		}
3743
3744		e.preventDefault();
3745
3746		opts = opts || {};
3747
3748		if (e && e.data) {
3749			opts = mergeOpts(e.data.options, opts);
3750		}
3751
3752		$target = opts.$target || $(e.currentTarget).trigger("blur");
3753		instance = $.fancybox.getInstance();
3754
3755		if (instance && instance.$trigger && instance.$trigger.is($target)) {
3756			return;
3757		}
3758
3759		if (opts.selector) {
3760			items = $(opts.selector);
3761		} else {
3762			// Get all related items and find index for clicked one
3763			value = $target.attr("data-fancybox") || "";
3764
3765			if (value) {
3766				items = e.data ? e.data.items : [];
3767				items = items.length ? items.filter('[data-fancybox="' + value + '"]') : $('[data-fancybox="' + value + '"]');
3768			} else {
3769				items = [$target];
3770			}
3771		}
3772
3773		index = $(items).index($target);
3774
3775		// Sometimes current item can not be found
3776		if (index < 0) {
3777			index = 0;
3778		}
3779
3780		instance = $.fancybox.open(items, opts, index);
3781
3782		// Save last active element
3783		instance.$trigger = $target;
3784	}
3785
3786	// Create a jQuery plugin
3787	// ======================
3788
3789	$.fn.fancybox = function (options) {
3790		var selector;
3791
3792		options = options || {};
3793		selector = options.selector || false;
3794
3795		if (selector) {
3796			// Use body element instead of document so it executes first
3797			$("body")
3798				.off("click.fb-start", selector)
3799				.on("click.fb-start", selector, {
3800					options: options
3801				}, _run);
3802		} else {
3803			this.off("click.fb-start").on(
3804				"click.fb-start", {
3805					items: this,
3806					options: options
3807				},
3808				_run
3809			);
3810		}
3811
3812		return this;
3813	};
3814
3815	// Self initializing plugin for all elements having `data-fancybox` attribute
3816	// ==========================================================================
3817
3818	$D.on("click.fb-start", "[data-fancybox]", _run);
3819
3820	// Enable "trigger elements"
3821	// =========================
3822
3823	$D.on("click.fb-start", "[data-fancybox-trigger]", function (e) {
3824		$('[data-fancybox="' + $(this).attr("data-fancybox-trigger") + '"]')
3825			.eq($(this).attr("data-fancybox-index") || 0)
3826			.trigger("click.fb-start", {
3827				$trigger: $(this)
3828			});
3829	});
3830
3831	// Track focus event for better accessibility styling
3832	// ==================================================
3833	(function () {
3834		var buttonStr = ".fancybox-button",
3835			focusStr = "fancybox-focus",
3836			$pressed = null;
3837
3838		$D.on("mousedown mouseup focus blur", buttonStr, function (e) {
3839			switch (e.type) {
3840				case "mousedown":
3841					$pressed = $(this);
3842					break;
3843				case "mouseup":
3844					$pressed = null;
3845					break;
3846				case "focusin":
3847					$(buttonStr).removeClass(focusStr);
3848
3849					if (!$(this).is($pressed) && !$(this).is("[disabled]")) {
3850						$(this).addClass(focusStr);
3851					}
3852					break;
3853				case "focusout":
3854					$(buttonStr).removeClass(focusStr);
3855					break;
3856			}
3857		});
3858	})();
3859})(window, document, jQuery);
3860// ==========================================================================
3861//
3862// Media
3863// Adds additional media type support
3864//
3865// ==========================================================================
3866(function ($) {
3867	"use strict";
3868
3869	// Object containing properties for each media type
3870	var defaults = {
3871		youtube: {
3872			matcher: /(youtube\.com|youtu\.be|youtube\-nocookie\.com)\/(watch\?(.*&)?v=|v\/|u\/|embed\/?)?(videoseries\?list=(.*)|[\w-]{11}|\?listType=(.*)&list=(.*))(.*)/i,
3873			params: {
3874				autoplay: 1,
3875				autohide: 1,
3876				fs: 1,
3877				rel: 0,
3878				hd: 1,
3879				wmode: "transparent",
3880				enablejsapi: 1,
3881				html5: 1
3882			},
3883			paramPlace: 8,
3884			type: "iframe",
3885			url: "https://www.youtube-nocookie.com/embed/$4",
3886			thumb: "https://img.youtube.com/vi/$4/hqdefault.jpg"
3887		},
3888
3889		vimeo: {
3890			matcher: /^.+vimeo.com\/(.*\/)?([\d]+)(.*)?/,
3891			params: {
3892				autoplay: 1,
3893				hd: 1,
3894				show_title: 1,
3895				show_byline: 1,
3896				show_portrait: 0,
3897				fullscreen: 1
3898			},
3899			paramPlace: 3,
3900			type: "iframe",
3901			url: "//player.vimeo.com/video/$2"
3902		},
3903
3904		instagram: {
3905			matcher: /(instagr\.am|instagram\.com)\/p\/([a-zA-Z0-9_\-]+)\/?/i,
3906			type: "image",
3907			url: "//$1/p/$2/media/?size=l"
3908		},
3909
3910		// Examples:
3911		// http://maps.google.com/?ll=48.857995,2.294297&spn=0.007666,0.021136&t=m&z=16
3912		// https://www.google.com/maps/@37.7852006,-122.4146355,14.65z
3913		// https://www.google.com/maps/@52.2111123,2.9237542,6.61z?hl=en
3914		// https://www.google.com/maps/place/Googleplex/@37.4220041,-122.0833494,17z/data=!4m5!3m4!1s0x0:0x6c296c66619367e0!8m2!3d37.4219998!4d-122.0840572
3915		gmap_place: {
3916			matcher: /(maps\.)?google\.([a-z]{2,3}(\.[a-z]{2})?)\/(((maps\/(place\/(.*)\/)?\@(.*),(\d+.?\d+?)z))|(\?ll=))(.*)?/i,
3917			type: "iframe",
3918			url: function (rez) {
3919				return (
3920					"//maps.google." +
3921					rez[2] +
3922					"/?ll=" +
3923					(rez[9] ? rez[9] + "&z=" + Math.floor(rez[10]) + (rez[12] ? rez[12].replace(/^\//, "&") : "") : rez[12] + "").replace(/\?/, "&") +
3924					"&output=" +
3925					(rez[12] && rez[12].indexOf("layer=c") > 0 ? "svembed" : "embed")
3926				);
3927			}
3928		},
3929
3930		// Examples:
3931		// https://www.google.com/maps/search/Empire+State+Building/
3932		// https://www.google.com/maps/search/?api=1&query=centurylink+field
3933		// https://www.google.com/maps/search/?api=1&query=47.5951518,-122.3316393
3934		gmap_search: {
3935			matcher: /(maps\.)?google\.([a-z]{2,3}(\.[a-z]{2})?)\/(maps\/search\/)(.*)/i,
3936			type: "iframe",
3937			url: function (rez) {
3938				return "//maps.google." + rez[2] + "/maps?q=" + rez[5].replace("query=", "q=").replace("api=1", "") + "&output=embed";
3939			}
3940		}
3941	};
3942
3943	// Formats matching url to final form
3944	var format = function (url, rez, params) {
3945		if (!url) {
3946			return;
3947		}
3948
3949		params = params || "";
3950
3951		if ($.type(params) === "object") {
3952			params = $.param(params, true);
3953		}
3954
3955		$.each(rez, function (key, value) {
3956			url = url.replace("$" + key, value || "");
3957		});
3958
3959		if (params.length) {
3960			url += (url.indexOf("?") > 0 ? "&" : "?") + params;
3961		}
3962
3963		return url;
3964	};
3965
3966	$(document).on("objectNeedsType.fb", function (e, instance, item) {
3967		var url = item.src || "",
3968			type = false,
3969			media,
3970			thumb,
3971			rez,
3972			params,
3973			urlParams,
3974			paramObj,
3975			provider;
3976
3977		media = $.extend(true, {}, defaults, item.opts.media);
3978
3979		// Look for any matching media type
3980		$.each(media, function (providerName, providerOpts) {
3981			rez = url.match(providerOpts.matcher);
3982
3983			if (!rez) {
3984				return;
3985			}
3986
3987			type = providerOpts.type;
3988			provider = providerName;
3989			paramObj = {};
3990
3991			if (providerOpts.paramPlace && rez[providerOpts.paramPlace]) {
3992				urlParams = rez[providerOpts.paramPlace];
3993
3994				if (urlParams[0] == "?") {
3995					urlParams = urlParams.substring(1);
3996				}
3997
3998				urlParams = urlParams.split("&");
3999
4000				for (var m = 0; m < urlParams.length; ++m) {
4001					var p = urlParams[m].split("=", 2);
4002
4003					if (p.length == 2) {
4004						paramObj[p[0]] = decodeURIComponent(p[1].replace(/\+/g, " "));
4005					}
4006				}
4007			}
4008
4009			params = $.extend(true, {}, providerOpts.params, item.opts[providerName], paramObj);
4010
4011			url =
4012				$.type(providerOpts.url) === "function" ? providerOpts.url.call(this, rez, params, item) : format(providerOpts.url, rez, params);
4013
4014			thumb =
4015				$.type(providerOpts.thumb) === "function" ? providerOpts.thumb.call(this, rez, params, item) : format(providerOpts.thumb, rez);
4016
4017			if (providerName === "youtube") {
4018				url = url.replace(/&t=((\d+)m)?(\d+)s/, function (match, p1, m, s) {
4019					return "&start=" + ((m ? parseInt(m, 10) * 60 : 0) + parseInt(s, 10));
4020				});
4021			} else if (providerName === "vimeo") {
4022				url = url.replace("&%23", "#");
4023			}
4024
4025			return false;
4026		});
4027
4028		// If it is found, then change content type and update the url
4029
4030		if (type) {
4031			if (!item.opts.thumb && !(item.opts.$thumb && item.opts.$thumb.length)) {
4032				item.opts.thumb = thumb;
4033			}
4034
4035			if (type === "iframe") {
4036				item.opts = $.extend(true, item.opts, {
4037					iframe: {
4038						preload: false,
4039						attr: {
4040							scrolling: "no"
4041						}
4042					}
4043				});
4044			}
4045
4046			$.extend(item, {
4047				type: type,
4048				src: url,
4049				origSrc: item.src,
4050				contentSource: provider,
4051				contentType: type === "image" ? "image" : provider == "gmap_place" || provider == "gmap_search" ? "map" : "video"
4052			});
4053		} else if (url) {
4054			item.type = item.opts.defaultType;
4055		}
4056	});
4057
4058	// Load YouTube/Video API on request to detect when video finished playing
4059	var VideoAPILoader = {
4060		youtube: {
4061			src: "https://www.youtube.com/iframe_api",
4062			class: "YT",
4063			loading: false,
4064			loaded: false
4065		},
4066
4067		vimeo: {
4068			src: "https://player.vimeo.com/api/player.js",
4069			class: "Vimeo",
4070			loading: false,
4071			loaded: false
4072		},
4073
4074		load: function (vendor) {
4075			var _this = this,
4076				script;
4077
4078			if (this[vendor].loaded) {
4079				setTimeout(function () {
4080					_this.done(vendor);
4081				});
4082				return;
4083			}
4084
4085			if (this[vendor].loading) {
4086				return;
4087			}
4088
4089			this[vendor].loading = true;
4090
4091			script = document.createElement("script");
4092			script.type = "text/javascript";
4093			script.src = this[vendor].src;
4094
4095			if (vendor === "youtube") {
4096				window.onYouTubeIframeAPIReady = function () {
4097					_this[vendor].loaded = true;
4098					_this.done(vendor);
4099				};
4100			} else {
4101				script.onload = function () {
4102					_this[vendor].loaded = true;
4103					_this.done(vendor);
4104				};
4105			}
4106
4107			document.body.appendChild(script);
4108		},
4109		done: function (vendor) {
4110			var instance, $el, player;
4111
4112			if (vendor === "youtube") {
4113				delete window.onYouTubeIframeAPIReady;
4114			}
4115
4116			instance = $.fancybox.getInstance();
4117
4118			if (instance) {
4119				$el = instance.current.$content.find("iframe");
4120
4121				if (vendor === "youtube" && YT !== undefined && YT) {
4122					player = new YT.Player($el.attr("id"), {
4123						events: {
4124							onStateChange: function (e) {
4125								if (e.data == 0) {
4126									instance.next();
4127								}
4128							}
4129						}
4130					});
4131				} else if (vendor === "vimeo" && Vimeo !== undefined && Vimeo) {
4132					player = new Vimeo.Player($el);
4133
4134					player.on("ended", function () {
4135						instance.next();
4136					});
4137				}
4138			}
4139		}
4140	};
4141
4142	$(document).on({
4143		"afterShow.fb": function (e, instance, current) {
4144			if (instance.group.length > 1 && (current.contentSource === "youtube" || current.contentSource === "vimeo")) {
4145				VideoAPILoader.load(current.contentSource);
4146			}
4147		}
4148	});
4149})(jQuery);
4150// ==========================================================================
4151//
4152// Guestures
4153// Adds touch guestures, handles click and tap events
4154//
4155// ==========================================================================
4156(function (window, document, $) {
4157	"use strict";
4158
4159	var requestAFrame = (function () {
4160		return (
4161			window.requestAnimationFrame ||
4162			window.webkitRequestAnimationFrame ||
4163			window.mozRequestAnimationFrame ||
4164			window.oRequestAnimationFrame ||
4165			// if all else fails, use setTimeout
4166			function (callback) {
4167				return window.setTimeout(callback, 1000 / 60);
4168			}
4169		);
4170	})();
4171
4172	var cancelAFrame = (function () {
4173		return (
4174			window.cancelAnimationFrame ||
4175			window.webkitCancelAnimationFrame ||
4176			window.mozCancelAnimationFrame ||
4177			window.oCancelAnimationFrame ||
4178			function (id) {
4179				window.clearTimeout(id);
4180			}
4181		);
4182	})();
4183
4184	var getPointerXY = function (e) {
4185		var result = [];
4186
4187		e = e.originalEvent || e || window.e;
4188		e = e.touches && e.touches.length ? e.touches : e.changedTouches && e.changedTouches.length ? e.changedTouches : [e];
4189
4190		for (var key in e) {
4191			if (e[key].pageX) {
4192				result.push({
4193					x: e[key].pageX,
4194					y: e[key].pageY
4195				});
4196			} else if (e[key].clientX) {
4197				result.push({
4198					x: e[key].clientX,
4199					y: e[key].clientY
4200				});
4201			}
4202		}
4203
4204		return result;
4205	};
4206
4207	var distance = function (point2, point1, what) {
4208		if (!point1 || !point2) {
4209			return 0;
4210		}
4211
4212		if (what === "x") {
4213			return point2.x - point1.x;
4214		} else if (what === "y") {
4215			return point2.y - point1.y;
4216		}
4217
4218		return Math.sqrt(Math.pow(point2.x - point1.x, 2) + Math.pow(point2.y - point1.y, 2));
4219	};
4220
4221	var isClickable = function ($el) {
4222		if (
4223			$el.is('a,area,button,[role="button"],input,label,select,summary,textarea,video,audio,iframe') ||
4224			$.isFunction($el.get(0).onclick) ||
4225			$el.data("selectable")
4226		) {
4227			return true;
4228		}
4229
4230		// Check for attributes like data-fancybox-next or data-fancybox-close
4231		for (var i = 0, atts = $el[0].attributes, n = atts.length; i < n; i++) {
4232			if (atts[i].nodeName.substr(0, 14) === "data-fancybox-") {
4233				return true;
4234			}
4235		}
4236
4237		return false;
4238	};
4239
4240	var hasScrollbars = function (el) {
4241		var overflowY = window.getComputedStyle(el)["overflow-y"],
4242			overflowX = window.getComputedStyle(el)["overflow-x"],
4243			vertical = (overflowY === "scroll" || overflowY === "auto") && el.scrollHeight > el.clientHeight,
4244			horizontal = (overflowX === "scroll" || overflowX === "auto") && el.scrollWidth > el.clientWidth;
4245
4246		return vertical || horizontal;
4247	};
4248
4249	var isScrollable = function ($el) {
4250		var rez = false;
4251
4252		while (true) {
4253			rez = hasScrollbars($el.get(0));
4254
4255			if (rez) {
4256				break;
4257			}
4258
4259			$el = $el.parent();
4260
4261			if (!$el.length || $el.hasClass("fancybox-stage") || $el.is("body")) {
4262				break;
4263			}
4264		}
4265
4266		return rez;
4267	};
4268
4269	var Guestures = function (instance) {
4270		var self = this;
4271
4272		self.instance = instance;
4273
4274		self.$bg = instance.$refs.bg;
4275		self.$stage = instance.$refs.stage;
4276		self.$container = instance.$refs.container;
4277
4278		self.destroy();
4279
4280		self.$container.on("touchstart.fb.touch mousedown.fb.touch", $.proxy(self, "ontouchstart"));
4281	};
4282
4283	Guestures.prototype.destroy = function () {
4284		var self = this;
4285
4286		self.$container.off(".fb.touch");
4287
4288		$(document).off(".fb.touch");
4289
4290		if (self.requestId) {
4291			cancelAFrame(self.requestId);
4292			self.requestId = null;
4293		}
4294
4295		if (self.tapped) {
4296			clearTimeout(self.tapped);
4297			self.tapped = null;
4298		}
4299	};
4300
4301	Guestures.prototype.ontouchstart = function (e) {
4302		var self = this,
4303			$target = $(e.target),
4304			instance = self.instance,
4305			current = instance.current,
4306			$slide = current.$slide,
4307			$content = current.$content,
4308			isTouchDevice = e.type == "touchstart";
4309
4310		// Do not respond to both (touch and mouse) events
4311		if (isTouchDevice) {
4312			self.$container.off("mousedown.fb.touch");
4313		}
4314
4315		// Ignore right click
4316		if (e.originalEvent && e.originalEvent.button == 2) {
4317			return;
4318		}
4319
4320		// Ignore taping on links, buttons, input elements
4321		if (!$slide.length || !$target.length || isClickable($target) || isClickable($target.parent())) {
4322			return;
4323		}
4324		// Ignore clicks on the scrollbar
4325		if (!$target.is("img") && e.originalEvent.clientX > $target[0].clientWidth + $target.offset().left) {
4326			return;
4327		}
4328
4329		// Ignore clicks while zooming or closing
4330		if (!current || instance.isAnimating || current.$slide.hasClass("fancybox-animated")) {
4331			e.stopPropagation();
4332			e.preventDefault();
4333
4334			return;
4335		}
4336
4337		self.realPoints = self.startPoints = getPointerXY(e);
4338
4339		if (!self.startPoints.length) {
4340			return;
4341		}
4342
4343		// Allow other scripts to catch touch event if "touch" is set to false
4344		if (current.touch) {
4345			e.stopPropagation();
4346		}
4347
4348		self.startEvent = e;
4349
4350		self.canTap = true;
4351		self.$target = $target;
4352		self.$content = $content;
4353		self.opts = current.opts.touch;
4354
4355		self.isPanning = false;
4356		self.isSwiping = false;
4357		self.isZooming = false;
4358		self.isScrolling = false;
4359		self.canPan = instance.canPan();
4360
4361		self.startTime = new Date().getTime();
4362		self.distanceX = self.distanceY = self.distance = 0;
4363
4364		self.canvasWidth = Math.round($slide[0].clientWidth);
4365		self.canvasHeight = Math.round($slide[0].clientHeight);
4366
4367		self.contentLastPos = null;
4368		self.contentStartPos = $.fancybox.getTranslate(self.$content) || {
4369			top: 0,
4370			left: 0
4371		};
4372		self.sliderStartPos = $.fancybox.getTranslate($slide);
4373
4374		// Since position will be absolute, but we need to make it relative to the stage
4375		self.stagePos = $.fancybox.getTranslate(instance.$refs.stage);
4376
4377		self.sliderStartPos.top -= self.stagePos.top;
4378		self.sliderStartPos.left -= self.stagePos.left;
4379
4380		self.contentStartPos.top -= self.stagePos.top;
4381		self.contentStartPos.left -= self.stagePos.left;
4382
4383		$(document)
4384			.off(".fb.touch")
4385			.on(isTouchDevice ? "touchend.fb.touch touchcancel.fb.touch" : "mouseup.fb.touch mouseleave.fb.touch", $.proxy(self, "ontouchend"))
4386			.on(isTouchDevice ? "touchmove.fb.touch" : "mousemove.fb.touch", $.proxy(self, "ontouchmove"));
4387
4388		if ($.fancybox.isMobile) {
4389			document.addEventListener("scroll", self.onscroll, true);
4390		}
4391
4392		// Skip if clicked outside the sliding area
4393		if (!(self.opts || self.canPan) || !($target.is(self.$stage) || self.$stage.find($target).length)) {
4394			if ($target.is(".fancybox-image")) {
4395				e.preventDefault();
4396			}
4397
4398			if (!($.fancybox.isMobile && $target.parents(".fancybox-caption").length)) {
4399				return;
4400			}
4401		}
4402
4403		self.isScrollable = isScrollable($target) || isScrollable($target.parent());
4404
4405		// Check if element is scrollable and try to prevent default behavior (scrolling)
4406		if (!($.fancybox.isMobile && self.isScrollable)) {
4407			e.preventDefault();
4408		}
4409
4410		// One finger or mouse click - swipe or pan an image
4411		if (self.startPoints.length === 1 || current.hasError) {
4412			if (self.canPan) {
4413				$.fancybox.stop(self.$content);
4414
4415				self.isPanning = true;
4416			} else {
4417				self.isSwiping = true;
4418			}
4419
4420			self.$container.addClass("fancybox-is-grabbing");
4421		}
4422
4423		// Two fingers - zoom image
4424		if (self.startPoints.length === 2 && current.type === "image" && (current.isLoaded || current.$ghost)) {
4425			self.canTap = false;
4426			self.isSwiping = false;
4427			self.isPanning = false;
4428
4429			self.isZooming = true;
4430
4431			$.fancybox.stop(self.$content);
4432
4433			self.centerPointStartX = (self.startPoints[0].x + self.startPoints[1].x) * 0.5 - $(window).scrollLeft();
4434			self.centerPointStartY = (self.startPoints[0].y + self.startPoints[1].y) * 0.5 - $(window).scrollTop();
4435
4436			self.percentageOfImageAtPinchPointX = (self.centerPointStartX - self.contentStartPos.left) / self.contentStartPos.width;
4437			self.percentageOfImageAtPinchPointY = (self.centerPointStartY - self.contentStartPos.top) / self.contentStartPos.height;
4438
4439			self.startDistanceBetweenFingers = distance(self.startPoints[0], self.startPoints[1]);
4440		}
4441	};
4442
4443	Guestures.prototype.onscroll = function (e) {
4444		var self = this;
4445
4446		self.isScrolling = true;
4447
4448		document.removeEventListener("scroll", self.onscroll, true);
4449	};
4450
4451	Guestures.prototype.ontouchmove = function (e) {
4452		var self = this;
4453
4454		// Make sure user has not released over iframe or disabled element
4455		if (e.originalEvent.buttons !== undefined && e.originalEvent.buttons === 0) {
4456			self.ontouchend(e);
4457			return;
4458		}
4459
4460		if (self.isScrolling) {
4461			self.canTap = false;
4462			return;
4463		}
4464
4465		self.newPoints = getPointerXY(e);
4466
4467		if (!(self.opts || self.canPan) || !self.newPoints.length || !self.newPoints.length) {
4468			return;
4469		}
4470
4471		if (!(self.isSwiping && self.isSwiping === true)) {
4472			e.preventDefault();
4473		}
4474
4475		self.distanceX = distance(self.newPoints[0], self.startPoints[0], "x");
4476		self.distanceY = distance(self.newPoints[0], self.startPoints[0], "y");
4477
4478		self.distance = distance(self.newPoints[0], self.startPoints[0]);
4479
4480		// Skip false ontouchmove events (Chrome)
4481		if (self.distance > 0) {
4482			if (self.isSwiping) {
4483				self.onSwipe(e);
4484			} else if (self.isPanning) {
4485				self.onPan();
4486			} else if (self.isZooming) {
4487				self.onZoom();
4488			}
4489		}
4490	};
4491
4492	Guestures.prototype.onSwipe = function (e) {
4493		var self = this,
4494			instance = self.instance,
4495			swiping = self.isSwiping,
4496			left = self.sliderStartPos.left || 0,
4497			angle;
4498
4499		// If direction is not yet determined
4500		if (swiping === true) {
4501			// We need at least 10px distance to correctly calculate an angle
4502			if (Math.abs(self.distance) > 10) {
4503				self.canTap = false;
4504
4505				if (instance.group.length < 2 && self.opts.vertical) {
4506					self.isSwiping = "y";
4507				} else if (instance.isDragging || self.opts.vertical === false || (self.opts.vertical === "auto" && $(window).width() > 800)) {
4508					self.isSwiping = "x";
4509				} else {
4510					angle = Math.abs((Math.atan2(self.distanceY, self.distanceX) * 180) / Math.PI);
4511
4512					self.isSwiping = angle > 45 && angle < 135 ? "y" : "x";
4513				}
4514
4515				if (self.isSwiping === "y" && $.fancybox.isMobile && self.isScrollable) {
4516					self.isScrolling = true;
4517
4518					return;
4519				}
4520
4521				instance.isDragging = self.isSwiping;
4522
4523				// Reset points to avoid jumping, because we dropped first swipes to calculate the angle
4524				self.startPoints = self.newPoints;
4525
4526				$.each(instance.slides, function (index, slide) {
4527					var slidePos, stagePos;
4528
4529					$.fancybox.stop(slide.$slide);
4530
4531					slidePos = $.fancybox.getTranslate(slide.$slide);
4532					stagePos = $.fancybox.getTranslate(instance.$refs.stage);
4533
4534					slide.$slide
4535						.css({
4536							transform: "",
4537							opacity: "",
4538							"transition-duration": ""
4539						})
4540						.removeClass("fancybox-animated")
4541						.removeClass(function (index, className) {
4542							return (className.match(/(^|\s)fancybox-fx-\S+/g) || []).join(" ");
4543						});
4544
4545					if (slide.pos === instance.current.pos) {
4546						self.sliderStartPos.top = slidePos.top - stagePos.top;
4547						self.sliderStartPos.left = slidePos.left - stagePos.left;
4548					}
4549
4550					$.fancybox.setTranslate(slide.$slide, {
4551						top: slidePos.top - stagePos.top,
4552						left: slidePos.left - stagePos.left
4553					});
4554				});
4555
4556				// Stop slideshow
4557				if (instance.SlideShow && instance.SlideShow.isActive) {
4558					instance.SlideShow.stop();
4559				}
4560			}
4561
4562			return;
4563		}
4564
4565		// Sticky edges
4566		if (swiping == "x") {
4567			if (
4568				self.distanceX > 0 &&
4569				(self.instance.group.length < 2 || (self.instance.current.index === 0 && !self.instance.current.opts.loop))
4570			) {
4571				left = left + Math.pow(self.distanceX, 0.8);
4572			} else if (
4573				self.distanceX < 0 &&
4574				(self.instance.group.length < 2 ||
4575					(self.instance.current.index === self.instance.group.length - 1 && !self.instance.current.opts.loop))
4576			) {
4577				left = left - Math.pow(-self.distanceX, 0.8);
4578			} else {
4579				left = left + self.distanceX;
4580			}
4581		}
4582
4583		self.sliderLastPos = {
4584			top: swiping == "x" ? 0 : self.sliderStartPos.top + self.distanceY,
4585			left: left
4586		};
4587
4588		if (self.requestId) {
4589			cancelAFrame(self.requestId);
4590
4591			self.requestId = null;
4592		}
4593
4594		self.requestId = requestAFrame(function () {
4595			if (self.sliderLastPos) {
4596				$.each(self.instance.slides, function (index, slide) {
4597					var pos = slide.pos - self.instance.currPos;
4598
4599					$.fancybox.setTranslate(slide.$slide, {
4600						top: self.sliderLastPos.top,
4601						left: self.sliderLastPos.left + pos * self.canvasWidth + pos * slide.opts.gutter
4602					});
4603				});
4604
4605				self.$container.addClass("fancybox-is-sliding");
4606			}
4607		});
4608	};
4609
4610	Guestures.prototype.onPan = function () {
4611		var self = this;
4612
4613		// Prevent accidental movement (sometimes, when tapping casually, finger can move a bit)
4614		if (distance(self.newPoints[0], self.realPoints[0]) < ($.fancybox.isMobile ? 10 : 5)) {
4615			self.startPoints = self.newPoints;
4616			return;
4617		}
4618
4619		self.canTap = false;
4620
4621		self.contentLastPos = self.limitMovement();
4622
4623		if (self.requestId) {
4624			cancelAFrame(self.requestId);
4625		}
4626
4627		self.requestId = requestAFrame(function () {
4628			$.fancybox.setTranslate(self.$content, self.contentLastPos);
4629		});
4630	};
4631
4632	// Make panning sticky to the edges
4633	Guestures.prototype.limitMovement = function () {
4634		var self = this;
4635
4636		var canvasWidth = self.canvasWidth;
4637		var canvasHeight = self.canvasHeight;
4638
4639		var distanceX = self.distanceX;
4640		var distanceY = self.distanceY;
4641
4642		var contentStartPos = self.contentStartPos;
4643
4644		var currentOffsetX = contentStartPos.left;
4645		var currentOffsetY = contentStartPos.top;
4646
4647		var currentWidth = contentStartPos.width;
4648		var currentHeight = contentStartPos.height;
4649
4650		var minTranslateX, minTranslateY, maxTranslateX, maxTranslateY, newOffsetX, newOffsetY;
4651
4652		if (currentWidth > canvasWidth) {
4653			newOffsetX = currentOffsetX + distanceX;
4654		} else {
4655			newOffsetX = currentOffsetX;
4656		}
4657
4658		newOffsetY = currentOffsetY + distanceY;
4659
4660		// Slow down proportionally to traveled distance
4661		minTranslateX = Math.max(0, canvasWidth * 0.5 - currentWidth * 0.5);
4662		minTranslateY = Math.max(0, canvasHeight * 0.5 - currentHeight * 0.5);
4663
4664		maxTranslateX = Math.min(canvasWidth - currentWidth, canvasWidth * 0.5 - currentWidth * 0.5);
4665		maxTranslateY = Math.min(canvasHeight - currentHeight, canvasHeight * 0.5 - currentHeight * 0.5);
4666
4667		//   ->
4668		if (distanceX > 0 && newOffsetX > minTranslateX) {
4669			newOffsetX = minTranslateX - 1 + Math.pow(-minTranslateX + currentOffsetX + distanceX, 0.8) || 0;
4670		}
4671
4672		//    <-
4673		if (distanceX < 0 && newOffsetX < maxTranslateX) {
4674			newOffsetX = maxTranslateX + 1 - Math.pow(maxTranslateX - currentOffsetX - distanceX, 0.8) || 0;
4675		}
4676
4677		//   \/
4678		if (distanceY > 0 && newOffsetY > minTranslateY) {
4679			newOffsetY = minTranslateY - 1 + Math.pow(-minTranslateY + currentOffsetY + distanceY, 0.8) || 0;
4680		}
4681
4682		//   /\
4683		if (distanceY < 0 && newOffsetY < maxTranslateY) {
4684			newOffsetY = maxTranslateY + 1 - Math.pow(maxTranslateY - currentOffsetY - distanceY, 0.8) || 0;
4685		}
4686
4687		return {
4688			top: newOffsetY,
4689			left: newOffsetX
4690		};
4691	};
4692
4693	Guestures.prototype.limitPosition = function (newOffsetX, newOffsetY, newWidth, newHeight) {
4694		var self = this;
4695
4696		var canvasWidth = self.canvasWidth;
4697		var canvasHeight = self.canvasHeight;
4698
4699		if (newWidth > canvasWidth) {
4700			newOffsetX = newOffsetX > 0 ? 0 : newOffsetX;
4701			newOffsetX = newOffsetX < canvasWidth - newWidth ? canvasWidth - newWidth : newOffsetX;
4702		} else {
4703			// Center horizontally
4704			newOffsetX = Math.max(0, canvasWidth / 2 - newWidth / 2);
4705		}
4706
4707		if (newHeight > canvasHeight) {
4708			newOffsetY = newOffsetY > 0 ? 0 : newOffsetY;
4709			newOffsetY = newOffsetY < canvasHeight - newHeight ? canvasHeight - newHeight : newOffsetY;
4710		} else {
4711			// Center vertically
4712			newOffsetY = Math.max(0, canvasHeight / 2 - newHeight / 2);
4713		}
4714
4715		return {
4716			top: newOffsetY,
4717			left: newOffsetX
4718		};
4719	};
4720
4721	Guestures.prototype.onZoom = function () {
4722		var self = this;
4723
4724		// Calculate current distance between points to get pinch ratio and new width and height
4725		var contentStartPos = self.contentStartPos;
4726
4727		var currentWidth = contentStartPos.width;
4728		var currentHeight = contentStartPos.height;
4729
4730		var currentOffsetX = contentStartPos.left;
4731		var currentOffsetY = contentStartPos.top;
4732
4733		var endDistanceBetweenFingers = distance(self.newPoints[0], self.newPoints[1]);
4734
4735		var pinchRatio = endDistanceBetweenFingers / self.startDistanceBetweenFingers;
4736
4737		var newWidth = Math.floor(currentWidth * pinchRatio);
4738		var newHeight = Math.floor(currentHeight * pinchRatio);
4739
4740		// This is the translation due to pinch-zooming
4741		var translateFromZoomingX = (currentWidth - newWidth) * self.percentageOfImageAtPinchPointX;
4742		var translateFromZoomingY = (currentHeight - newHeight) * self.percentageOfImageAtPinchPointY;
4743
4744		// Point between the two touches
4745		var centerPointEndX = (self.newPoints[0].x + self.newPoints[1].x) / 2 - $(window).scrollLeft();
4746		var centerPointEndY = (self.newPoints[0].y + self.newPoints[1].y) / 2 - $(window).scrollTop();
4747
4748		// And this is the translation due to translation of the centerpoint
4749		// between the two fingers
4750		var translateFromTranslatingX = centerPointEndX - self.centerPointStartX;
4751		var translateFromTranslatingY = centerPointEndY - self.centerPointStartY;
4752
4753		// The new offset is the old/current one plus the total translation
4754		var newOffsetX = currentOffsetX + (translateFromZoomingX + translateFromTranslatingX);
4755		var newOffsetY = currentOffsetY + (translateFromZoomingY + translateFromTranslatingY);
4756
4757		var newPos = {
4758			top: newOffsetY,
4759			left: newOffsetX,
4760			scaleX: pinchRatio,
4761			scaleY: pinchRatio
4762		};
4763
4764		self.canTap = false;
4765
4766		self.newWidth = newWidth;
4767		self.newHeight = newHeight;
4768
4769		self.contentLastPos = newPos;
4770
4771		if (self.requestId) {
4772			cancelAFrame(self.requestId);
4773		}
4774
4775		self.requestId = requestAFrame(function () {
4776			$.fancybox.setTranslate(self.$content, self.contentLastPos);
4777		});
4778	};
4779
4780	Guestures.prototype.ontouchend = function (e) {
4781		var self = this;
4782
4783		var swiping = self.isSwiping;
4784		var panning = self.isPanning;
4785		var zooming = self.isZooming;
4786		var scrolling = self.isScrolling;
4787
4788		self.endPoints = getPointerXY(e);
4789		self.dMs = Math.max(new Date().getTime() - self.startTime, 1);
4790
4791		self.$container.removeClass("fancybox-is-grabbing");
4792
4793		$(document).off(".fb.touch");
4794
4795		document.removeEventListener("scroll", self.onscroll, true);
4796
4797		if (self.requestId) {
4798			cancelAFrame(self.requestId);
4799
4800			self.requestId = null;
4801		}
4802
4803		self.isSwiping = false;
4804		self.isPanning = false;
4805		self.isZooming = false;
4806		self.isScrolling = false;
4807
4808		self.instance.isDragging = false;
4809
4810		if (self.canTap) {
4811			return self.onTap(e);
4812		}
4813
4814		self.speed = 100;
4815
4816		// Speed in px/ms
4817		self.velocityX = (self.distanceX / self.dMs) * 0.5;
4818		self.velocityY = (self.distanceY / self.dMs) * 0.5;
4819
4820		if (panning) {
4821			self.endPanning();
4822		} else if (zooming) {
4823			self.endZooming();
4824		} else {
4825			self.endSwiping(swiping, scrolling);
4826		}
4827
4828		return;
4829	};
4830
4831	Guestures.prototype.endSwiping = function (swiping, scrolling) {
4832		var self = this,
4833			ret = false,
4834			len = self.instance.group.length,
4835			distanceX = Math.abs(self.distanceX),
4836			canAdvance = swiping == "x" && len > 1 && ((self.dMs > 130 && distanceX > 10) || distanceX > 50),
4837			speedX = 300;
4838
4839		self.sliderLastPos = null;
4840
4841		// Close if swiped vertically / navigate if horizontally
4842		if (swiping == "y" && !scrolling && Math.abs(self.distanceY) > 50) {
4843			// Continue vertical movement
4844			$.fancybox.animate(
4845				self.instance.current.$slide, {
4846					top: self.sliderStartPos.top + self.distanceY + self.velocityY * 150,
4847					opacity: 0
4848				},
4849				200
4850			);
4851			ret = self.instance.close(true, 250);
4852		} else if (canAdvance && self.distanceX > 0) {
4853			ret = self.instance.previous(speedX);
4854		} else if (canAdvance && self.distanceX < 0) {
4855			ret = self.instance.next(speedX);
4856		}
4857
4858		if (ret === false && (swiping == "x" || swiping == "y")) {
4859			self.instance.centerSlide(200);
4860		}
4861
4862		self.$container.removeClass("fancybox-is-sliding");
4863	};
4864
4865	// Limit panning from edges
4866	// ========================
4867	Guestures.prototype.endPanning = function () {
4868		var self = this,
4869			newOffsetX,
4870			newOffsetY,
4871			newPos;
4872
4873		if (!self.contentLastPos) {
4874			return;
4875		}
4876
4877		if (self.opts.momentum === false || self.dMs > 350) {
4878			newOffsetX = self.contentLastPos.left;
4879			newOffsetY = self.contentLastPos.top;
4880		} else {
4881			// Continue movement
4882			newOffsetX = self.contentLastPos.left + self.velocityX * 500;
4883			newOffsetY = self.contentLastPos.top + self.velocityY * 500;
4884		}
4885
4886		newPos = self.limitPosition(newOffsetX, newOffsetY, self.contentStartPos.width, self.contentStartPos.height);
4887
4888		newPos.width = self.contentStartPos.width;
4889		newPos.height = self.contentStartPos.height;
4890
4891		$.fancybox.animate(self.$content, newPos, 366);
4892	};
4893
4894	Guestures.prototype.endZooming = function () {
4895		var self = this;
4896
4897		var current = self.instance.current;
4898
4899		var newOffsetX, newOffsetY, newPos, reset;
4900
4901		var newWidth = self.newWidth;
4902		var newHeight = self.newHeight;
4903
4904		if (!self.contentLastPos) {
4905			return;
4906		}
4907
4908		newOffsetX = self.contentLastPos.left;
4909		newOffsetY = self.contentLastPos.top;
4910
4911		reset = {
4912			top: newOffsetY,
4913			left: newOffsetX,
4914			width: newWidth,
4915			height: newHeight,
4916			scaleX: 1,
4917			scaleY: 1
4918		};
4919
4920		// Reset scalex/scaleY values; this helps for perfomance and does not break animation
4921		$.fancybox.setTranslate(self.$content, reset);
4922
4923		if (newWidth < self.canvasWidth && newHeight < self.canvasHeight) {
4924			self.instance.scaleToFit(150);
4925		} else if (newWidth > current.width || newHeight > current.height) {
4926			self.instance.scaleToActual(self.centerPointStartX, self.centerPointStartY, 150);
4927		} else {
4928			newPos = self.limitPosition(newOffsetX, newOffsetY, newWidth, newHeight);
4929
4930			$.fancybox.animate(self.$content, newPos, 150);
4931		}
4932	};
4933
4934	Guestures.prototype.onTap = function (e) {
4935		var self = this;
4936		var $target = $(e.target);
4937
4938		var instance = self.instance;
4939		var current = instance.current;
4940
4941		var endPoints = (e && getPointerXY(e)) || self.startPoints;
4942
4943		var tapX = endPoints[0] ? endPoints[0].x - $(window).scrollLeft() - self.stagePos.left : 0;
4944		var tapY = endPoints[0] ? endPoints[0].y - $(window).scrollTop() - self.stagePos.top : 0;
4945
4946		var where;
4947
4948		var process = function (prefix) {
4949			var action = current.opts[prefix];
4950
4951			if ($.isFunction(action)) {
4952				action = action.apply(instance, [current, e]);
4953			}
4954
4955			if (!action) {
4956				return;
4957			}
4958
4959			switch (action) {
4960				case "close":
4961					instance.close(self.startEvent);
4962
4963					break;
4964
4965				case "toggleControls":
4966					instance.toggleControls();
4967
4968					break;
4969
4970				case "next":
4971					instance.next();
4972
4973					break;
4974
4975				case "nextOrClose":
4976					if (instance.group.length > 1) {
4977						instance.next();
4978					} else {
4979						instance.close(self.startEvent);
4980					}
4981
4982					break;
4983
4984				case "zoom":
4985					if (current.type == "image" && (current.isLoaded || current.$ghost)) {
4986						if (instance.canPan()) {
4987							instance.scaleToFit();
4988						} else if (instance.isScaledDown()) {
4989							instance.scaleToActual(tapX, tapY);
4990						} else if (instance.group.length < 2) {
4991							instance.close(self.startEvent);
4992						}
4993					}
4994
4995					break;
4996			}
4997		};
4998
4999		// Ignore right click
5000		if (e.originalEvent && e.originalEvent.button == 2) {
5001			return;
5002		}
5003
5004		// Skip if clicked on the scrollbar
5005		if (!$target.is("img") && tapX > $target[0].clientWidth + $target.offset().left) {
5006			return;
5007		}
5008
5009		// Check where is clicked
5010		if ($target.is(".fancybox-bg,.fancybox-inner,.fancybox-outer,.fancybox-container")) {
5011			where = "Outside";
5012		} else if ($target.is(".fancybox-slide")) {
5013			where = "Slide";
5014		} else if (
5015			instance.current.$content &&
5016			instance.current.$content
5017				.find($target)
5018				.addBack()
5019				.filter($target).length
5020		) {
5021			where = "Content";
5022		} else {
5023			return;
5024		}
5025
5026		// Check if this is a double tap
5027		if (self.tapped) {
5028			// Stop previously created single tap
5029			clearTimeout(self.tapped);
5030			self.tapped = null;
5031
5032			// Skip if distance between taps is too big
5033			if (Math.abs(tapX - self.tapX) > 50 || Math.abs(tapY - self.tapY) > 50) {
5034				return this;
5035			}
5036
5037			// OK, now we assume that this is a double-tap
5038			process("dblclick" + where);
5039		} else {
5040			// Single tap will be processed if user has not clicked second time within 300ms
5041			// or there is no need to wait for double-tap
5042			self.tapX = tapX;
5043			self.tapY = tapY;
5044
5045			if (current.opts["dblclick" + where] && current.opts["dblclick" + where] !== current.opts["click" + where]) {
5046				self.tapped = setTimeout(function () {
5047					self.tapped = null;
5048
5049					if (!instance.isAnimating) {
5050						process("click" + where);
5051					}
5052				}, 500);
5053			} else {
5054				process("click" + where);
5055			}
5056		}
5057
5058		return this;
5059	};
5060
5061	$(document)
5062		.on("onActivate.fb", function (e, instance) {
5063			if (instance && !instance.Guestures) {
5064				instance.Guestures = new Guestures(instance);
5065			}
5066		})
5067		.on("beforeClose.fb", function (e, instance) {
5068			if (instance && instance.Guestures) {
5069				instance.Guestures.destroy();
5070			}
5071		});
5072})(window, document, jQuery);
5073// ==========================================================================
5074//
5075// SlideShow
5076// Enables slideshow functionality
5077//
5078// Example of usage:
5079// $.fancybox.getInstance().SlideShow.start()
5080//
5081// ==========================================================================
5082(function (document, $) {
5083	"use strict";
5084
5085	$.extend(true, $.fancybox.defaults, {
5086		btnTpl: {
5087			slideShow: '<button data-fancybox-play class="fancybox-button fancybox-button--play" title="{{PLAY_START}}">' +
5088				'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M6.5 5.4v13.2l11-6.6z"/></svg>' +
5089				'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M8.33 5.75h2.2v12.5h-2.2V5.75zm5.15 0h2.2v12.5h-2.2V5.75z"/></svg>' +
5090				"</button>"
5091		},
5092		slideShow: {
5093			autoStart: false,
5094			speed: 3000,
5095			progress: true
5096		}
5097	});
5098
5099	var SlideShow = function (instance) {
5100		this.instance = instance;
5101		this.init();
5102	};
5103
5104	$.extend(SlideShow.prototype, {
5105		timer: null,
5106		isActive: false,
5107		$button: null,
5108
5109		init: function () {
5110			var self = this,
5111				instance = self.instance,
5112				opts = instance.group[instance.currIndex].opts.slideShow;
5113
5114			self.$button = instance.$refs.toolbar.find("[data-fancybox-play]").on("click", function () {
5115				self.toggle();
5116			});
5117
5118			if (instance.group.length < 2 || !opts) {
5119				self.$button.hide();
5120			} else if (opts.progress) {
5121				self.$progress = $('<div class="fancybox-progress"></div>').appendTo(instance.$refs.inner);
5122			}
5123		},
5124
5125		set: function (force) {
5126			var self = this,
5127				instance = self.instance,
5128				current = instance.current;
5129
5130			// Check if reached last element
5131			if (current && (force === true || current.opts.loop || instance.currIndex < instance.group.length - 1)) {
5132				if (self.isActive && current.contentType !== "video") {
5133					if (self.$progress) {
5134						$.fancybox.animate(self.$progress.show(), {
5135							scaleX: 1
5136						}, current.opts.slideShow.speed);
5137					}
5138
5139					self.timer = setTimeout(function () {
5140						if (!instance.current.opts.loop && instance.current.index == instance.group.length - 1) {
5141							instance.jumpTo(0);
5142						} else {
5143							instance.next();
5144						}
5145					}, current.opts.slideShow.speed);
5146				}
5147			} else {
5148				self.stop();
5149				instance.idleSecondsCounter = 0;
5150				instance.showControls();
5151			}
5152		},
5153
5154		clear: function () {
5155			var self = this;
5156
5157			clearTimeout(self.timer);
5158
5159			self.timer = null;
5160
5161			if (self.$progress) {
5162				self.$progress.removeAttr("style").hide();
5163			}
5164		},
5165
5166		start: function () {
5167			var self = this,
5168				current = self.instance.current;
5169
5170			if (current) {
5171				self.$button
5172					.attr("title", (current.opts.i18n[current.opts.lang] || current.opts.i18n.en).PLAY_STOP)
5173					.removeClass("fancybox-button--play")
5174					.addClass("fancybox-button--pause");
5175
5176				self.isActive = true;
5177
5178				if (current.isComplete) {
5179					self.set(true);
5180				}
5181
5182				self.instance.trigger("onSlideShowChange", true);
5183			}
5184		},
5185
5186		stop: function () {
5187			var self = this,
5188				current = self.instance.current;
5189
5190			self.clear();
5191
5192			self.$button
5193				.attr("title", (current.opts.i18n[current.opts.lang] || current.opts.i18n.en).PLAY_START)
5194				.removeClass("fancybox-button--pause")
5195				.addClass("fancybox-button--play");
5196
5197			self.isActive = false;
5198
5199			self.instance.trigger("onSlideShowChange", false);
5200
5201			if (self.$progress) {
5202				self.$progress.removeAttr("style").hide();
5203			}
5204		},
5205
5206		toggle: function () {
5207			var self = this;
5208
5209			if (self.isActive) {
5210				self.stop();
5211			} else {
5212				self.start();
5213			}
5214		}
5215	});
5216
5217	$(document).on({
5218		"onInit.fb": function (e, instance) {
5219			if (instance && !instance.SlideShow) {
5220				instance.SlideShow = new SlideShow(instance);
5221			}
5222		},
5223
5224		"beforeShow.fb": function (e, instance, current, firstRun) {
5225			var SlideShow = instance && instance.SlideShow;
5226
5227			if (firstRun) {
5228				if (SlideShow && current.opts.slideShow.autoStart) {
5229					SlideShow.start();
5230				}
5231			} else if (SlideShow && SlideShow.isActive) {
5232				SlideShow.clear();
5233			}
5234		},
5235
5236		"afterShow.fb": function (e, instance, current) {
5237			var SlideShow = instance && instance.SlideShow;
5238
5239			if (SlideShow && SlideShow.isActive) {
5240				SlideShow.set();
5241			}
5242		},
5243
5244		"afterKeydown.fb": function (e, instance, current, keypress, keycode) {
5245			var SlideShow = instance && instance.SlideShow;
5246
5247			// "P" or Spacebar
5248			if (SlideShow && current.opts.slideShow && (keycode === 80 || keycode === 32) && !$(document.activeElement).is("button,a,input")) {
5249				keypress.preventDefault();
5250
5251				SlideShow.toggle();
5252			}
5253		},
5254
5255		"beforeClose.fb onDeactivate.fb": function (e, instance) {
5256			var SlideShow = instance && instance.SlideShow;
5257
5258			if (SlideShow) {
5259				SlideShow.stop();
5260			}
5261		}
5262	});
5263
5264	// Page Visibility API to pause slideshow when window is not active
5265	$(document).on("visibilitychange", function () {
5266		var instance = $.fancybox.getInstance(),
5267			SlideShow = instance && instance.SlideShow;
5268
5269		if (SlideShow && SlideShow.isActive) {
5270			if (document.hidden) {
5271				SlideShow.clear();
5272			} else {
5273				SlideShow.set();
5274			}
5275		}
5276	});
5277})(document, jQuery);
5278// ==========================================================================
5279//
5280// FullScreen
5281// Adds fullscreen functionality
5282//
5283// ==========================================================================
5284(function (document, $) {
5285	"use strict";
5286
5287	// Collection of methods supported by user browser
5288	var fn = (function () {
5289		var fnMap = [
5290			["requestFullscreen", "exitFullscreen", "fullscreenElement", "fullscreenEnabled", "fullscreenchange", "fullscreenerror"],
5291			// new WebKit
5292			[
5293				"webkitRequestFullscreen",
5294				"webkitExitFullscreen",
5295				"webkitFullscreenElement",
5296				"webkitFullscreenEnabled",
5297				"webkitfullscreenchange",
5298				"webkitfullscreenerror"
5299			],
5300			// old WebKit (Safari 5.1)
5301			[
5302				"webkitRequestFullScreen",
5303				"webkitCancelFullScreen",
5304				"webkitCurrentFullScreenElement",
5305				"webkitCancelFullScreen",
5306				"webkitfullscreenchange",
5307				"webkitfullscreenerror"
5308			],
5309			[
5310				"mozRequestFullScreen",
5311				"mozCancelFullScreen",
5312				"mozFullScreenElement",
5313				"mozFullScreenEnabled",
5314				"mozfullscreenchange",
5315				"mozfullscreenerror"
5316			],
5317			["msRequestFullscreen", "msExitFullscreen", "msFullscreenElement", "msFullscreenEnabled", "MSFullscreenChange", "MSFullscreenError"]
5318		];
5319
5320		var ret = {};
5321
5322		for (var i = 0; i < fnMap.length; i++) {
5323			var val = fnMap[i];
5324
5325			if (val && val[1] in document) {
5326				for (var j = 0; j < val.length; j++) {
5327					ret[fnMap[0][j]] = val[j];
5328				}
5329
5330				return ret;
5331			}
5332		}
5333
5334		return false;
5335	})();
5336
5337	if (fn) {
5338		var FullScreen = {
5339			request: function (elem) {
5340				elem = elem || document.documentElement;
5341
5342				elem[fn.requestFullscreen](elem.ALLOW_KEYBOARD_INPUT);
5343			},
5344			exit: function () {
5345				document[fn.exitFullscreen]();
5346			},
5347			toggle: function (elem) {
5348				elem = elem || document.documentElement;
5349
5350				if (this.isFullscreen()) {
5351					this.exit();
5352				} else {
5353					this.request(elem);
5354				}
5355			},
5356			isFullscreen: function () {
5357				return Boolean(document[fn.fullscreenElement]);
5358			},
5359			enabled: function () {
5360				return Boolean(document[fn.fullscreenEnabled]);
5361			}
5362		};
5363
5364		$.extend(true, $.fancybox.defaults, {
5365			btnTpl: {
5366				fullScreen: '<button data-fancybox-fullscreen class="fancybox-button fancybox-button--fsenter" title="{{FULL_SCREEN}}">' +
5367					'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"/></svg>' +
5368					'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M5 16h3v3h2v-5H5zm3-8H5v2h5V5H8zm6 11h2v-3h3v-2h-5zm2-11V5h-2v5h5V8z"/></svg>' +
5369					"</button>"
5370			},
5371			fullScreen: {
5372				autoStart: false
5373			}
5374		});
5375
5376		$(document).on(fn.fullscreenchange, function () {
5377			var isFullscreen = FullScreen.isFullscreen(),
5378				instance = $.fancybox.getInstance();
5379
5380			if (instance) {
5381				// If image is zooming, then force to stop and reposition properly
5382				if (instance.current && instance.current.type === "image" && instance.isAnimating) {
5383					instance.isAnimating = false;
5384
5385					instance.update(true, true, 0);
5386
5387					if (!instance.isComplete) {
5388						instance.complete();
5389					}
5390				}
5391
5392				instance.trigger("onFullscreenChange", isFullscreen);
5393
5394				instance.$refs.container.toggleClass("fancybox-is-fullscreen", isFullscreen);
5395
5396				instance.$refs.toolbar
5397					.find("[data-fancybox-fullscreen]")
5398					.toggleClass("fancybox-button--fsenter", !isFullscreen)
5399					.toggleClass("fancybox-button--fsexit", isFullscreen);
5400			}
5401		});
5402	}
5403
5404	$(document).on({
5405		"onInit.fb": function (e, instance) {
5406			var $container;
5407
5408			if (!fn) {
5409				instance.$refs.toolbar.find("[data-fancybox-fullscreen]").remove();
5410
5411				return;
5412			}
5413
5414			if (instance && instance.group[instance.currIndex].opts.fullScreen) {
5415				$container = instance.$refs.container;
5416
5417				$container.on("click.fb-fullscreen", "[data-fancybox-fullscreen]", function (e) {
5418					e.stopPropagation();
5419					e.preventDefault();
5420
5421					FullScreen.toggle();
5422				});
5423
5424				if (instance.opts.fullScreen && instance.opts.fullScreen.autoStart === true) {
5425					FullScreen.request();
5426				}
5427
5428				// Expose API
5429				instance.FullScreen = FullScreen;
5430			} else if (instance) {
5431				instance.$refs.toolbar.find("[data-fancybox-fullscreen]").hide();
5432			}
5433		},
5434
5435		"afterKeydown.fb": function (e, instance, current, keypress, keycode) {
5436			// "F"
5437			if (instance && instance.FullScreen && keycode === 70) {
5438				keypress.preventDefault();
5439
5440				instance.FullScreen.toggle();
5441			}
5442		},
5443
5444		"beforeClose.fb": function (e, instance) {
5445			if (instance && instance.FullScreen && instance.$refs.container.hasClass("fancybox-is-fullscreen")) {
5446				FullScreen.exit();
5447			}
5448		}
5449	});
5450})(document, jQuery);
5451// ==========================================================================
5452//
5453// Thumbs
5454// Displays thumbnails in a grid
5455//
5456// ==========================================================================
5457(function (document, $) {
5458	"use strict";
5459
5460	var CLASS = "fancybox-thumbs",
5461		CLASS_ACTIVE = CLASS + "-active";
5462
5463	// Make sure there are default values
5464	$.fancybox.defaults = $.extend(
5465		true, {
5466			btnTpl: {
5467				thumbs: '<button data-fancybox-thumbs class="fancybox-button fancybox-button--thumbs" title="{{THUMBS}}">' +
5468					'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M14.59 14.59h3.76v3.76h-3.76v-3.76zm-4.47 0h3.76v3.76h-3.76v-3.76zm-4.47 0h3.76v3.76H5.65v-3.76zm8.94-4.47h3.76v3.76h-3.76v-3.76zm-4.47 0h3.76v3.76h-3.76v-3.76zm-4.47 0h3.76v3.76H5.65v-3.76zm8.94-4.47h3.76v3.76h-3.76V5.65zm-4.47 0h3.76v3.76h-3.76V5.65zm-4.47 0h3.76v3.76H5.65V5.65z"/></svg>' +
5469					"</button>"
5470			},
5471			thumbs: {
5472				autoStart: false, // Display thumbnails on opening
5473				hideOnClose: true, // Hide thumbnail grid when closing animation starts
5474				parentEl: ".fancybox-container", // Container is injected into this element
5475				axis: "y" // Vertical (y) or horizontal (x) scrolling
5476			}
5477		},
5478		$.fancybox.defaults
5479	);
5480
5481	var FancyThumbs = function (instance) {
5482		this.init(instance);
5483	};
5484
5485	$.extend(FancyThumbs.prototype, {
5486		$button: null,
5487		$grid: null,
5488		$list: null,
5489		isVisible: false,
5490		isActive: false,
5491
5492		init: function (instance) {
5493			var self = this,
5494				group = instance.group,
5495				enabled = 0;
5496
5497			self.instance = instance;
5498			self.opts = group[instance.currIndex].opts.thumbs;
5499
5500			instance.Thumbs = self;
5501
5502			self.$button = instance.$refs.toolbar.find("[data-fancybox-thumbs]");
5503
5504			// Enable thumbs if at least two group items have thumbnails
5505			for (var i = 0, len = group.length; i < len; i++) {
5506				if (group[i].thumb) {
5507					enabled++;
5508				}
5509
5510				if (enabled > 1) {
5511					break;
5512				}
5513			}
5514
5515			if (enabled > 1 && !!self.opts) {
5516				self.$button.removeAttr("style").on("click", function () {
5517					self.toggle();
5518				});
5519
5520				self.isActive = true;
5521			} else {
5522				self.$button.hide();
5523			}
5524		},
5525
5526		create: function () {
5527			var self = this,
5528				instance = self.instance,
5529				parentEl = self.opts.parentEl,
5530				list = [],
5531				src;
5532
5533			if (!self.$grid) {
5534				// Create main element
5535				self.$grid = $('<div class="' + CLASS + " " + CLASS + "-" + self.opts.axis + '"></div>').appendTo(
5536					instance.$refs.container
5537						.find(parentEl)
5538						.addBack()
5539						.filter(parentEl)
5540				);
5541
5542				// Add "click" event that performs gallery navigation
5543				self.$grid.on("click", "a", function () {
5544					instance.jumpTo($(this).attr("data-index"));
5545				});
5546			}
5547
5548			// Build the list
5549			if (!self.$list) {
5550				self.$list = $('<div class="' + CLASS + '__list">').appendTo(self.$grid);
5551			}
5552
5553			$.each(instance.group, function (i, item) {
5554				src = item.thumb;
5555
5556				if (!src && item.type === "image") {
5557					src = item.src;
5558				}
5559
5560				list.push(
5561					'<a href="javascript:;" tabindex="0" data-index="' +
5562					i +
5563					'"' +
5564					(src && src.length ? ' style="background-image:url(' + src + ')"' : 'class="fancybox-thumbs-missing"') +
5565					"></a>"
5566				);
5567			});
5568
5569			self.$list[0].innerHTML = list.join("");
5570
5571			if (self.opts.axis === "x") {
5572				// Set fixed width for list element to enable horizontal scrolling
5573				self.$list.width(
5574					parseInt(self.$grid.css("padding-right"), 10) +
5575					instance.group.length *
5576					self.$list
5577						.children()
5578						.eq(0)
5579						.outerWidth(true)
5580				);
5581			}
5582		},
5583
5584		focus: function (duration) {
5585			var self = this,
5586				$list = self.$list,
5587				$grid = self.$grid,
5588				thumb,
5589				thumbPos;
5590
5591			if (!self.instance.current) {
5592				return;
5593			}
5594
5595			thumb = $list
5596				.children()
5597				.removeClass(CLASS_ACTIVE)
5598				.filter('[data-index="' + self.instance.current.index + '"]')
5599				.addClass(CLASS_ACTIVE);
5600
5601			thumbPos = thumb.position();
5602
5603			// Check if need to scroll to make current thumb visible
5604			if (self.opts.axis === "y" && (thumbPos.top < 0 || thumbPos.top > $list.height() - thumb.outerHeight())) {
5605				$list.stop().animate({
5606						scrollTop: $list.scrollTop() + thumbPos.top
5607					},
5608					duration
5609				);
5610			} else if (
5611				self.opts.axis === "x" &&
5612				(thumbPos.left < $grid.scrollLeft() || thumbPos.left > $grid.scrollLeft() + ($grid.width() - thumb.outerWidth()))
5613			) {
5614				$list
5615					.parent()
5616					.stop()
5617					.animate({
5618							scrollLeft: thumbPos.left
5619						},
5620						duration
5621					);
5622			}
5623		},
5624
5625		update: function () {
5626			var that = this;
5627			that.instance.$refs.container.toggleClass("fancybox-show-thumbs", this.isVisible);
5628
5629			if (that.isVisible) {
5630				if (!that.$grid) {
5631					that.create();
5632				}
5633
5634				that.instance.trigger("onThumbsShow");
5635
5636				that.focus(0);
5637			} else if (that.$grid) {
5638				that.instance.trigger("onThumbsHide");
5639			}
5640
5641			// Update content position
5642			that.instance.update();
5643		},
5644
5645		hide: function () {
5646			this.isVisible = false;
5647			this.update();
5648		},
5649
5650		show: function () {
5651			this.isVisible = true;
5652			this.update();
5653		},
5654
5655		toggle: function () {
5656			this.isVisible = !this.isVisible;
5657			this.update();
5658		}
5659	});
5660
5661	$(document).on({
5662		"onInit.fb": function (e, instance) {
5663			var Thumbs;
5664
5665			if (instance && !instance.Thumbs) {
5666				Thumbs = new FancyThumbs(instance);
5667
5668				if (Thumbs.isActive && Thumbs.opts.autoStart === true) {
5669					Thumbs.show();
5670				}
5671			}
5672		},
5673
5674		"beforeShow.fb": function (e, instance, item, firstRun) {
5675			var Thumbs = instance && instance.Thumbs;
5676
5677			if (Thumbs && Thumbs.isVisible) {
5678				Thumbs.focus(firstRun ? 0 : 250);
5679			}
5680		},
5681
5682		"afterKeydown.fb": function (e, instance, current, keypress, keycode) {
5683			var Thumbs = instance && instance.Thumbs;
5684
5685			// "G"
5686			if (Thumbs && Thumbs.isActive && keycode === 71) {
5687				keypress.preventDefault();
5688
5689				Thumbs.toggle();
5690			}
5691		},
5692
5693		"beforeClose.fb": function (e, instance) {
5694			var Thumbs = instance && instance.Thumbs;
5695
5696			if (Thumbs && Thumbs.isVisible && Thumbs.opts.hideOnClose !== false) {
5697				Thumbs.$grid.hide();
5698			}
5699		}
5700	});
5701})(document, jQuery);
5702//// ==========================================================================
5703//
5704// Share
5705// Displays simple form for sharing current url
5706//
5707// ==========================================================================
5708(function (document, $) {
5709	"use strict";
5710
5711	$.extend(true, $.fancybox.defaults, {
5712		btnTpl: {
5713			share: '<button data-fancybox-share class="fancybox-button fancybox-button--share" title="{{SHARE}}">' +
5714				'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M2.55 19c1.4-8.4 9.1-9.8 11.9-9.8V5l7 7-7 6.3v-3.5c-2.8 0-10.5 2.1-11.9 4.2z"/></svg>' +
5715				"</button>"
5716		},
5717		share: {
5718			url: function (instance, item) {
5719				return (
5720					(!instance.currentHash && !(item.type === "inline" || item.type === "html") ? item.origSrc || item.src : false) || window.location
5721				);
5722			},
5723			tpl: '<div class="fancybox-share">' +
5724				"<h1>{{SHARE}}</h1>" +
5725				"<p>" +
5726				'<a class="fancybox-share__button fancybox-share__button--fb" href="https://www.facebook.com/sharer/sharer.php?u={{url}}">' +
5727				'<svg viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg"><path d="m287 456v-299c0-21 6-35 35-35h38v-63c-7-1-29-3-55-3-54 0-91 33-91 94v306m143-254h-205v72h196" /></svg>' +
5728				"<span>Facebook</span>" +
5729				"</a>" +
5730				'<a class="fancybox-share__button fancybox-share__button--tw" href="https://twitter.com/intent/tweet?url={{url}}&text={{descr}}">' +
5731				'<svg viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg"><path d="m456 133c-14 7-31 11-47 13 17-10 30-27 37-46-15 10-34 16-52 20-61-62-157-7-141 75-68-3-129-35-169-85-22 37-11 86 26 109-13 0-26-4-37-9 0 39 28 72 65 80-12 3-25 4-37 2 10 33 41 57 77 57-42 30-77 38-122 34 170 111 378-32 359-208 16-11 30-25 41-42z" /></svg>' +
5732				"<span>Twitter</span>" +
5733				"</a>" +
5734				'<a class="fancybox-share__button fancybox-share__button--pt" href="https://www.pinterest.com/pin/create/button/?url={{url}}&description={{descr}}&media={{media}}">' +
5735				'<svg viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg"><path d="m265 56c-109 0-164 78-164 144 0 39 15 74 47 87 5 2 10 0 12-5l4-19c2-6 1-8-3-13-9-11-15-25-15-45 0-58 43-110 113-110 62 0 96 38 96 88 0 67-30 122-73 122-24 0-42-19-36-44 6-29 20-60 20-81 0-19-10-35-31-35-25 0-44 26-44 60 0 21 7 36 7 36l-30 125c-8 37-1 83 0 87 0 3 4 4 5 2 2-3 32-39 42-75l16-64c8 16 31 29 56 29 74 0 124-67 124-157 0-69-58-132-146-132z" fill="#fff"/></svg>' +
5736				"<span>Pinterest</span>" +
5737				"</a>" +
5738				"</p>" +
5739				'<p><input class="fancybox-share__input" type="text" value="{{url_raw}}" onclick="select()" /></p>' +
5740				"</div>"
5741		}
5742	});
5743
5744	function escapeHtml(string) {
5745		var entityMap = {
5746			"&": "&amp;",
5747			"<": "&lt;",
5748			">": "&gt;",
5749			'"': "&quot;",
5750			"'": "&#39;",
5751			"/": "&#x2F;",
5752			"`": "&#x60;",
5753			"=": "&#x3D;"
5754		};
5755
5756		return String(string).replace(/[&<>"'`=\/]/g, function (s) {
5757			return entityMap[s];
5758		});
5759	}
5760
5761	$(document).on("click", "[data-fancybox-share]", function () {
5762		var instance = $.fancybox.getInstance(),
5763			current = instance.current || null,
5764			url,
5765			tpl;
5766
5767		if (!current) {
5768			return;
5769		}
5770
5771		if ($.type(current.opts.share.url) === "function") {
5772			url = current.opts.share.url.apply(current, [instance, current]);
5773		}
5774
5775		tpl = current.opts.share.tpl
5776			.replace(/\{\{media\}\}/g, current.type === "image" ? encodeURIComponent(current.src) : "")
5777			.replace(/\{\{url\}\}/g, encodeURIComponent(url))
5778			.replace(/\{\{url_raw\}\}/g, escapeHtml(url))
5779			.replace(/\{\{descr\}\}/g, instance.$caption ? encodeURIComponent(instance.$caption.text()) : "");
5780
5781		$.fancybox.open({
5782			src: instance.translate(instance, tpl),
5783			type: "html",
5784			opts: {
5785				touch: false,
5786				animationEffect: false,
5787				afterLoad: function (shareInstance, shareCurrent) {
5788					// Close self if parent instance is closing
5789					instance.$refs.container.one("beforeClose.fb", function () {
5790						shareInstance.close(null, 0);
5791					});
5792
5793					// Opening links in a popup window
5794					shareCurrent.$content.find(".fancybox-share__button").click(function () {
5795						window.open(this.href, "Share", "width=550, height=450");
5796						return false;
5797					});
5798				},
5799				mobile: {
5800					autoFocus: false
5801				}
5802			}
5803		});
5804	});
5805})(document, jQuery);
5806// ==========================================================================
5807//
5808// Hash
5809// Enables linking to each modal
5810//
5811// ==========================================================================
5812(function (window, document, $) {
5813	"use strict";
5814
5815	// Simple $.escapeSelector polyfill (for jQuery prior v3)
5816	if (!$.escapeSelector) {
5817		$.escapeSelector = function (sel) {
5818			var rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g;
5819			var fcssescape = function (ch, asCodePoint) {
5820				if (asCodePoint) {
5821					// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
5822					if (ch === "\0") {
5823						return "\uFFFD";
5824					}
5825
5826					// Control characters and (dependent upon position) numbers get escaped as code points
5827					return ch.slice(0, -1) + "\\" + ch.charCodeAt(ch.length - 1).toString(16) + " ";
5828				}
5829
5830				// Other potentially-special ASCII characters get backslash-escaped
5831				return "\\" + ch;
5832			};
5833
5834			return (sel + "").replace(rcssescape, fcssescape);
5835		};
5836	}
5837
5838	// Get info about gallery name and current index from url
5839	function parseUrl() {
5840		var hash = window.location.hash.substr(1),
5841			rez = hash.split("-"),
5842			index = rez.length > 1 && /^\+?\d+$/.test(rez[rez.length - 1]) ? parseInt(rez.pop(-1), 10) || 1 : 1,
5843			gallery = rez.join("-");
5844
5845		return {
5846			hash: hash,
5847			/* Index is starting from 1 */
5848			index: index < 1 ? 1 : index,
5849			gallery: gallery
5850		};
5851	}
5852
5853	// Trigger click evnt on links to open new fancyBox instance
5854	function triggerFromUrl(url) {
5855		if (url.gallery !== "") {
5856			// If we can find element matching 'data-fancybox' atribute,
5857			// then triggering click event should start fancyBox
5858			$("[data-fancybox='" + $.escapeSelector(url.gallery) + "']")
5859				.eq(url.index - 1)
5860				.focus()
5861				.trigger("click.fb-start");
5862		}
5863	}
5864
5865	// Get gallery name from current instance
5866	function getGalleryID(instance) {
5867		var opts, ret;
5868
5869		if (!instance) {
5870			return false;
5871		}
5872
5873		opts = instance.current ? instance.current.opts : instance.opts;
5874		ret = opts.hash || (opts.$orig ? opts.$orig.data("fancybox") || opts.$orig.data("fancybox-trigger") : "");
5875
5876		return ret === "" ? false : ret;
5877	}
5878
5879	// Start when DOM becomes ready
5880	$(function () {
5881		// Check if user has disabled this module
5882		if ($.fancybox.defaults.hash === false) {
5883			return;
5884		}
5885
5886		// Update hash when opening/closing fancyBox
5887		$(document).on({
5888			"onInit.fb": function (e, instance) {
5889				var url, gallery;
5890
5891				if (instance.group[instance.currIndex].opts.hash === false) {
5892					return;
5893				}
5894
5895				url = parseUrl();
5896				gallery = getGalleryID(instance);
5897
5898				// Make sure gallery start index matches index from hash
5899				if (gallery && url.gallery && gallery == url.gallery) {
5900					instance.currIndex = url.index - 1;
5901				}
5902			},
5903
5904			"beforeShow.fb": function (e, instance, current, firstRun) {
5905				var gallery;
5906
5907				if (!current || current.opts.hash === false) {
5908					return;
5909				}
5910
5911				// Check if need to update window hash
5912				gallery = getGalleryID(instance);
5913
5914				if (!gallery) {
5915					return;
5916				}
5917
5918				// Variable containing last hash value set by fancyBox
5919				// It will be used to determine if fancyBox needs to close after hash change is detected
5920				instance.currentHash = gallery + (instance.group.length > 1 ? "-" + (current.index + 1) : "");
5921
5922				// If current hash is the same (this instance most likely is opened by hashchange), then do nothing
5923				if (window.location.hash === "#" + instance.currentHash) {
5924					return;
5925				}
5926
5927				if (firstRun && !instance.origHash) {
5928					instance.origHash = window.location.hash;
5929				}
5930
5931				if (instance.hashTimer) {
5932					clearTimeout(instance.hashTimer);
5933				}
5934
5935				// Update hash
5936				instance.hashTimer = setTimeout(function () {
5937					if ("replaceState" in window.history) {
5938						window.history[firstRun ? "pushState" : "replaceState"]({},
5939							document.title,
5940							window.location.pathname + window.location.search + "#" + instance.currentHash
5941						);
5942
5943						if (firstRun) {
5944							instance.hasCreatedHistory = true;
5945						}
5946					} else {
5947						window.location.hash = instance.currentHash;
5948					}
5949
5950					instance.hashTimer = null;
5951				}, 300);
5952			},
5953
5954			"beforeClose.fb": function (e, instance, current) {
5955				if (!current || current.opts.hash === false) {
5956					return;
5957				}
5958
5959				clearTimeout(instance.hashTimer);
5960
5961				// Goto previous history entry
5962				if (instance.currentHash && instance.hasCreatedHistory) {
5963					window.history.back();
5964				} else if (instance.currentHash) {
5965					if ("replaceState" in window.history) {
5966						window.history.replaceState({}, document.title, window.location.pathname + window.location.search + (instance.origHash || ""));
5967					} else {
5968						window.location.hash = instance.origHash;
5969					}
5970				}
5971
5972				instance.currentHash = null;
5973			}
5974		});
5975
5976		// Check if need to start/close after url has changed
5977		$(window).on("hashchange.fb", function () {
5978			var url = parseUrl(),
5979				fb = null;
5980
5981			// Find last fancyBox instance that has "hash"
5982			$.each(
5983				$(".fancybox-container")
5984					.get()
5985					.reverse(),
5986				function (index, value) {
5987					var tmp = $(value).data("FancyBox");
5988
5989					if (tmp && tmp.currentHash) {
5990						fb = tmp;
5991						return false;
5992					}
5993				}
5994			);
5995
5996			if (fb) {
5997				// Now, compare hash values
5998				if (fb.currentHash !== url.gallery + "-" + url.index && !(url.index === 1 && fb.currentHash == url.gallery)) {
5999					fb.currentHash = null;
6000
6001					fb.close();
6002				}
6003			} else if (url.gallery !== "") {
6004				triggerFromUrl(url);
6005			}
6006		});
6007
6008		// Check current hash and trigger click event on matching element to start fancyBox, if needed
6009		setTimeout(function () {
6010			if (!$.fancybox.getInstance()) {
6011				triggerFromUrl(parseUrl());
6012			}
6013		}, 50);
6014	});
6015})(window, document, jQuery);
6016// ==========================================================================
6017//
6018// Wheel
6019// Basic mouse weheel support for gallery navigation
6020//
6021// ==========================================================================
6022(function (document, $) {
6023	"use strict";
6024
6025	var prevTime = new Date().getTime();
6026
6027	$(document).on({
6028		"onInit.fb": function (e, instance, current) {
6029			instance.$refs.stage.on("mousewheel DOMMouseScroll wheel MozMousePixelScroll", function (e) {
6030				var current = instance.current,
6031					currTime = new Date().getTime();
6032
6033				if (instance.group.length < 2 || current.opts.wheel === false || (current.opts.wheel === "auto" && current.type !== "image")) {
6034					return;
6035				}
6036
6037				e.preventDefault();
6038				e.stopPropagation();
6039
6040				if (current.$slide.hasClass("fancybox-animated")) {
6041					return;
6042				}
6043
6044				e = e.originalEvent || e;
6045
6046				if (currTime - prevTime < 250) {
6047					return;
6048				}
6049
6050				prevTime = currTime;
6051
6052				instance[(-e.deltaY || -e.deltaX || e.wheelDelta || -e.detail) < 0 ? "next" : "previous"]();
6053			});
6054		}
6055	});
6056})(document, jQuery);
6057
6058// Generated by CoffeeScript 1.12.4
6059
6060/** @preserve OverlappingMarkerSpiderfier
6061https://github.com/jawj/OverlappingMarkerSpiderfier
6062Copyright (c) 2011 - 2013 George MacKerron
6063Released under the MIT licence: http://opensource.org/licenses/mit-license
6064Note: The Google Maps API v3 must be included *before* this code
6065 */
6066
6067(function() {
6068  var ref,
6069    hasProp = {}.hasOwnProperty,
6070    slice = [].slice;
6071
6072  if (((ref = this['google']) != null ? ref['maps'] : void 0) == null) {
6073    return;
6074  }
6075
6076  this['OverlappingMarkerSpiderfier'] = (function() {
6077    var ge, gm, j, lcH, lcU, len, mt, p, ref1, twoPi, x;
6078
6079    p = _Class.prototype;
6080
6081    ref1 = [_Class, p];
6082    for (j = 0, len = ref1.length; j < len; j++) {
6083      x = ref1[j];
6084      x['VERSION'] = '0.3.3';
6085    }
6086
6087    gm = google.maps;
6088
6089    ge = gm.event;
6090
6091    mt = gm.MapTypeId;
6092
6093    twoPi = Math.PI * 2;
6094
6095    p['keepSpiderfied'] = false;
6096
6097    p['markersWontHide'] = false;
6098
6099    p['markersWontMove'] = false;
6100
6101    p['nearbyDistance'] = 20;
6102
6103    p['circleSpiralSwitchover'] = 9;
6104
6105    p['circleFootSeparation'] = 23;
6106
6107    p['circleStartAngle'] = twoPi / 12;
6108
6109    p['spiralFootSeparation'] = 26;
6110
6111    p['spiralLengthStart'] = 11;
6112
6113    p['spiralLengthFactor'] = 4;
6114
6115    p['spiderfiedZIndex'] = 1000;
6116
6117    p['usualLegZIndex'] = 10;
6118
6119    p['highlightedLegZIndex'] = 20;
6120
6121    p['legWeight'] = 1.5;
6122
6123    p['legColors'] = {
6124      'usual': {},
6125      'highlighted': {}
6126    };
6127
6128    lcU = p['legColors']['usual'];
6129
6130    lcH = p['legColors']['highlighted'];
6131
6132    lcU[mt.HYBRID] = lcU[mt.SATELLITE] = '#fff';
6133
6134    lcH[mt.HYBRID] = lcH[mt.SATELLITE] = '#f00';
6135
6136    lcU[mt.TERRAIN] = lcU[mt.ROADMAP] = '#444';
6137
6138    lcH[mt.TERRAIN] = lcH[mt.ROADMAP] = '#f00';
6139
6140    function _Class(map1, opts) {
6141      var e, k, l, len1, ref2, v;
6142      this.map = map1;
6143      if (opts == null) {
6144        opts = {};
6145      }
6146      for (k in opts) {
6147        if (!hasProp.call(opts, k)) continue;
6148        v = opts[k];
6149        this[k] = v;
6150      }
6151      this.projHelper = new this.constructor.ProjHelper(this.map);
6152      this.initMarkerArrays();
6153      this.listeners = {};
6154      ref2 = ['click', 'zoom_changed', 'maptypeid_changed'];
6155      for (l = 0, len1 = ref2.length; l < len1; l++) {
6156        e = ref2[l];
6157        ge.addListener(this.map, e, (function(_this) {
6158          return function() {
6159            return _this['unspiderfy']();
6160          };
6161        })(this));
6162      }
6163    }
6164
6165    p.initMarkerArrays = function() {
6166      this.markers = [];
6167      return this.markerListenerRefs = [];
6168    };
6169
6170    p['addMarker'] = function(marker) {
6171      var listenerRefs;
6172      if (marker['_oms'] != null) {
6173        return this;
6174      }
6175      marker['_oms'] = true;
6176      listenerRefs = [
6177        ge.addListener(marker, 'click', (function(_this) {
6178          return function(event) {
6179            return _this.spiderListener(marker, event);
6180          };
6181        })(this))
6182      ];
6183      if (!this['markersWontHide']) {
6184        listenerRefs.push(ge.addListener(marker, 'visible_changed', (function(_this) {
6185          return function() {
6186            return _this.markerChangeListener(marker, false);
6187          };
6188        })(this)));
6189      }
6190      if (!this['markersWontMove']) {
6191        listenerRefs.push(ge.addListener(marker, 'position_changed', (function(_this) {
6192          return function() {
6193            return _this.markerChangeListener(marker, true);
6194          };
6195        })(this)));
6196      }
6197      this.markerListenerRefs.push(listenerRefs);
6198      this.markers.push(marker);
6199      return this;
6200    };
6201
6202    p.markerChangeListener = function(marker, positionChanged) {
6203      if ((marker['_omsData'] != null) && (positionChanged || !marker.getVisible()) && !((this.spiderfying != null) || (this.unspiderfying != null))) {
6204        return this['unspiderfy'](positionChanged ? marker : null);
6205      }
6206    };
6207
6208    p['getMarkers'] = function() {
6209      return this.markers.slice(0);
6210    };
6211
6212    p['removeMarker'] = function(marker) {
6213      var i, l, len1, listenerRef, listenerRefs;
6214      if (marker['_omsData'] != null) {
6215        this['unspiderfy']();
6216      }
6217      i = this.arrIndexOf(this.markers, marker);
6218      if (i < 0) {
6219        return this;
6220      }
6221      listenerRefs = this.markerListenerRefs.splice(i, 1)[0];
6222      for (l = 0, len1 = listenerRefs.length; l < len1; l++) {
6223        listenerRef = listenerRefs[l];
6224        ge.removeListener(listenerRef);
6225      }
6226      delete marker['_oms'];
6227      this.markers.splice(i, 1);
6228      return this;
6229    };
6230
6231    p['clearMarkers'] = function() {
6232      var i, l, len1, len2, listenerRef, listenerRefs, marker, n, ref2;
6233      this['unspiderfy']();
6234      ref2 = this.markers;
6235      for (i = l = 0, len1 = ref2.length; l < len1; i = ++l) {
vendor: 11,498 bytes, lines 6236-6562
6236        marker = ref2[i];
6237        listenerRefs = this.markerListenerRefs[i];
6238        for (n = 0, len2 = listenerRefs.length; n < len2; n++) {
6239          listenerRef = listenerRefs[n];
6240          ge.removeListener(listenerRef);
6241        }
6242        delete marker['_oms'];
6243      }
6244      this.initMarkerArrays();
6245      return this;
6246    };
6247
6248    p['addListener'] = function(event, func) {
6249      var base;
6250      ((base = this.listeners)[event] != null ? base[event] : base[event] = []).push(func);
6251      return this;
6252    };
6253
6254    p['removeListener'] = function(event, func) {
6255      var i;
6256      i = this.arrIndexOf(this.listeners[event], func);
6257      if (!(i < 0)) {
6258        this.listeners[event].splice(i, 1);
6259      }
6260      return this;
6261    };
6262
6263    p['clearListeners'] = function(event) {
6264      this.listeners[event] = [];
6265      return this;
6266    };
6267
6268    p.trigger = function() {
6269      var args, event, func, l, len1, ref2, ref3, results;
6270      event = arguments[0], args = 2 <= arguments.length ? slice.call(arguments, 1) : [];
6271      ref3 = (ref2 = this.listeners[event]) != null ? ref2 : [];
6272      results = [];
6273      for (l = 0, len1 = ref3.length; l < len1; l++) {
6274        func = ref3[l];
6275        results.push(func.apply(null, args));
6276      }
6277      return results;
6278    };
6279
6280    p.generatePtsCircle = function(count, centerPt) {
6281      var angle, angleStep, circumference, i, l, legLength, ref2, results;
6282      circumference = this['circleFootSeparation'] * (2 + count);
6283      legLength = circumference / twoPi;
6284      angleStep = twoPi / count;
6285      results = [];
6286      for (i = l = 0, ref2 = count; 0 <= ref2 ? l < ref2 : l > ref2; i = 0 <= ref2 ? ++l : --l) {
6287        angle = this['circleStartAngle'] + i * angleStep;
6288        results.push(new gm.Point(centerPt.x + legLength * Math.cos(angle), centerPt.y + legLength * Math.sin(angle)));
6289      }
6290      return results;
6291    };
6292
6293    p.generatePtsSpiral = function(count, centerPt) {
6294      var angle, i, l, legLength, pt, ref2, results;
6295      legLength = this['spiralLengthStart'];
6296      angle = 0;
6297      results = [];
6298      for (i = l = 0, ref2 = count; 0 <= ref2 ? l < ref2 : l > ref2; i = 0 <= ref2 ? ++l : --l) {
6299        angle += this['spiralFootSeparation'] / legLength + i * 0.0005;
6300        pt = new gm.Point(centerPt.x + legLength * Math.cos(angle), centerPt.y + legLength * Math.sin(angle));
6301        legLength += twoPi * this['spiralLengthFactor'] / angle;
6302        results.push(pt);
6303      }
6304      return results;
6305    };
6306
6307    p.spiderListener = function(marker, event) {
6308      var l, len1, m, mPt, markerPt, markerSpiderfied, nDist, nearbyMarkerData, nonNearbyMarkers, pxSq, ref2;
6309      markerSpiderfied = marker['_omsData'] != null;
6310      if (!(markerSpiderfied && this['keepSpiderfied'])) {
6311        this['unspiderfy']();
6312      }
6313      if (markerSpiderfied || this.map.getStreetView().getVisible() || this.map.getMapTypeId() === 'GoogleEarthAPI') {
6314        return this.trigger('click', marker, event);
6315      } else {
6316        nearbyMarkerData = [];
6317        nonNearbyMarkers = [];
6318        nDist = this['nearbyDistance'];
6319        pxSq = nDist * nDist;
6320        markerPt = this.llToPt(marker.position);
6321        ref2 = this.markers;
6322        for (l = 0, len1 = ref2.length; l < len1; l++) {
6323          m = ref2[l];
6324          if (!((m.map != null) && m.getVisible())) {
6325            continue;
6326          }
6327          mPt = this.llToPt(m.position);
6328          if (this.ptDistanceSq(mPt, markerPt) < pxSq) {
6329            nearbyMarkerData.push({
6330              marker: m,
6331              markerPt: mPt
6332            });
6333          } else {
6334            nonNearbyMarkers.push(m);
6335          }
6336        }
6337        if (nearbyMarkerData.length === 1) {
6338          return this.trigger('click', marker, event);
6339        } else {
6340          return this.spiderfy(nearbyMarkerData, nonNearbyMarkers);
6341        }
6342      }
6343    };
6344
6345    p['markersNearMarker'] = function(marker, firstOnly) {
6346      var l, len1, m, mPt, markerPt, markers, nDist, pxSq, ref2, ref3, ref4;
6347      if (firstOnly == null) {
6348        firstOnly = false;
6349      }
6350      if (this.projHelper.getProjection() == null) {
6351        throw "Must wait for 'idle' event on map before calling markersNearMarker";
6352      }
6353      nDist = this['nearbyDistance'];
6354      pxSq = nDist * nDist;
6355      markerPt = this.llToPt(marker.position);
6356      markers = [];
6357      ref2 = this.markers;
6358      for (l = 0, len1 = ref2.length; l < len1; l++) {
6359        m = ref2[l];
6360        if (m === marker || (m.map == null) || !m.getVisible()) {
6361          continue;
6362        }
6363        mPt = this.llToPt((ref3 = (ref4 = m['_omsData']) != null ? ref4.usualPosition : void 0) != null ? ref3 : m.position);
6364        if (this.ptDistanceSq(mPt, markerPt) < pxSq) {
6365          markers.push(m);
6366          if (firstOnly) {
6367            break;
6368          }
6369        }
6370      }
6371      return markers;
6372    };
6373
6374    p['markersNearAnyOtherMarker'] = function() {
6375      var i, i1, i2, l, len1, len2, len3, m, m1, m1Data, m2, m2Data, mData, n, nDist, pxSq, q, ref2, ref3, ref4, results;
6376      if (this.projHelper.getProjection() == null) {
6377        throw "Must wait for 'idle' event on map before calling markersNearAnyOtherMarker";
6378      }
6379      nDist = this['nearbyDistance'];
6380      pxSq = nDist * nDist;
6381      mData = (function() {
6382        var l, len1, ref2, ref3, ref4, results;
6383        ref2 = this.markers;
6384        results = [];
6385        for (l = 0, len1 = ref2.length; l < len1; l++) {
6386          m = ref2[l];
6387          results.push({
6388            pt: this.llToPt((ref3 = (ref4 = m['_omsData']) != null ? ref4.usualPosition : void 0) != null ? ref3 : m.position),
6389            willSpiderfy: false
6390          });
6391        }
6392        return results;
6393      }).call(this);
6394      ref2 = this.markers;
6395      for (i1 = l = 0, len1 = ref2.length; l < len1; i1 = ++l) {
6396        m1 = ref2[i1];
6397        if (!((m1.map != null) && m1.getVisible())) {
6398          continue;
6399        }
6400        m1Data = mData[i1];
6401        if (m1Data.willSpiderfy) {
6402          continue;
6403        }
6404        ref3 = this.markers;
6405        for (i2 = n = 0, len2 = ref3.length; n < len2; i2 = ++n) {
6406          m2 = ref3[i2];
6407          if (i2 === i1) {
6408            continue;
6409          }
6410          if (!((m2.map != null) && m2.getVisible())) {
6411            continue;
6412          }
6413          m2Data = mData[i2];
6414          if (i2 < i1 && !m2Data.willSpiderfy) {
6415            continue;
6416          }
6417          if (this.ptDistanceSq(m1Data.pt, m2Data.pt) < pxSq) {
6418            m1Data.willSpiderfy = m2Data.willSpiderfy = true;
6419            break;
6420          }
6421        }
6422      }
6423      ref4 = this.markers;
6424      results = [];
6425      for (i = q = 0, len3 = ref4.length; q < len3; i = ++q) {
6426        m = ref4[i];
6427        if (mData[i].willSpiderfy) {
6428          results.push(m);
6429        }
6430      }
6431      return results;
6432    };
6433
6434    p.makeHighlightListenerFuncs = function(marker) {
6435      return {
6436        highlight: (function(_this) {
6437          return function() {
6438            return marker['_omsData'].leg.setOptions({
6439              strokeColor: _this['legColors']['highlighted'][_this.map.mapTypeId],
6440              zIndex: _this['highlightedLegZIndex']
6441            });
6442          };
6443        })(this),
6444        unhighlight: (function(_this) {
6445          return function() {
6446            return marker['_omsData'].leg.setOptions({
6447              strokeColor: _this['legColors']['usual'][_this.map.mapTypeId],
6448              zIndex: _this['usualLegZIndex']
6449            });
6450          };
6451        })(this)
6452      };
6453    };
6454
6455    p.spiderfy = function(markerData, nonNearbyMarkers) {
6456      var bodyPt, footLl, footPt, footPts, highlightListenerFuncs, leg, marker, md, nearestMarkerDatum, numFeet, spiderfiedMarkers;
6457      this.spiderfying = true;
6458      numFeet = markerData.length;
6459      bodyPt = this.ptAverage((function() {
6460        var l, len1, results;
6461        results = [];
6462        for (l = 0, len1 = markerData.length; l < len1; l++) {
6463          md = markerData[l];
6464          results.push(md.markerPt);
6465        }
6466        return results;
6467      })());
6468      footPts = numFeet >= this['circleSpiralSwitchover'] ? this.generatePtsSpiral(numFeet, bodyPt).reverse() : this.generatePtsCircle(numFeet, bodyPt);
6469      spiderfiedMarkers = (function() {
6470        var l, len1, results;
6471        results = [];
6472        for (l = 0, len1 = footPts.length; l < len1; l++) {
6473          footPt = footPts[l];
6474          footLl = this.ptToLl(footPt);
6475          nearestMarkerDatum = this.minExtract(markerData, (function(_this) {
6476            return function(md) {
6477              return _this.ptDistanceSq(md.markerPt, footPt);
6478            };
6479          })(this));
6480          marker = nearestMarkerDatum.marker;
6481          leg = new gm.Polyline({
6482            map: this.map,
6483            path: [marker.position, footLl],
6484            strokeColor: this['legColors']['usual'][this.map.mapTypeId],
6485            strokeWeight: this['legWeight'],
6486            zIndex: this['usualLegZIndex']
6487          });
6488          marker['_omsData'] = {
6489            usualPosition: marker.position,
6490            leg: leg
6491          };
6492          if (this['legColors']['highlighted'][this.map.mapTypeId] !== this['legColors']['usual'][this.map.mapTypeId]) {
6493            highlightListenerFuncs = this.makeHighlightListenerFuncs(marker);
6494            marker['_omsData'].hightlightListeners = {
6495              highlight: ge.addListener(marker, 'mouseover', highlightListenerFuncs.highlight),
6496              unhighlight: ge.addListener(marker, 'mouseout', highlightListenerFuncs.unhighlight)
6497            };
6498          }
6499          marker.setPosition(footLl);
6500          marker.setZIndex(Math.round(this['spiderfiedZIndex'] + footPt.y));
6501          results.push(marker);
6502        }
6503        return results;
6504      }).call(this);
6505      delete this.spiderfying;
6506      this.spiderfied = true;
6507      return this.trigger('spiderfy', spiderfiedMarkers, nonNearbyMarkers);
6508    };
6509
6510    p['unspiderfy'] = function(markerNotToMove) {
6511      var l, len1, listeners, marker, nonNearbyMarkers, ref2, unspiderfiedMarkers;
6512      if (markerNotToMove == null) {
6513        markerNotToMove = null;
6514      }
6515      if (this.spiderfied == null) {
6516        return this;
6517      }
6518      this.unspiderfying = true;
6519      unspiderfiedMarkers = [];
6520      nonNearbyMarkers = [];
6521      ref2 = this.markers;
6522      for (l = 0, len1 = ref2.length; l < len1; l++) {
6523        marker = ref2[l];
6524        if (marker['_omsData'] != null) {
6525          marker['_omsData'].leg.setMap(null);
6526          if (marker !== markerNotToMove) {
6527            marker.setPosition(marker['_omsData'].usualPosition);
6528          }
6529          marker.setZIndex(null);
6530          listeners = marker['_omsData'].hightlightListeners;
6531          if (listeners != null) {
6532            ge.removeListener(listeners.highlight);
6533            ge.removeListener(listeners.unhighlight);
6534          }
6535          delete marker['_omsData'];
6536          unspiderfiedMarkers.push(marker);
6537        } else {
6538          nonNearbyMarkers.push(marker);
6539        }
6540      }
6541      delete this.unspiderfying;
6542      delete this.spiderfied;
6543      this.trigger('unspiderfy', unspiderfiedMarkers, nonNearbyMarkers);
6544      return this;
6545    };
6546
6547    p.ptDistanceSq = function(pt1, pt2) {
6548      var dx, dy;
6549      dx = pt1.x - pt2.x;
6550      dy = pt1.y - pt2.y;
6551      return dx * dx + dy * dy;
6552    };
6553
6554    p.ptAverage = function(pts) {
6555      var l, len1, numPts, pt, sumX, sumY;
6556      sumX = sumY = 0;
6557      for (l = 0, len1 = pts.length; l < len1; l++) {
6558        pt = pts[l];
6559        sumX += pt.x;
6560        sumY += pt.y;
6561      }
6562      numPts = pts.length;
6563      return new gm.Point(sumX / numPts, sumY / numPts);
6564    };
6565
6566    p.llToPt = function(ll) {
6567      return this.projHelper.getProjection().fromLatLngToDivPixel(ll);
6568    };
6569
6570    p.ptToLl = function(pt) {
6571      return this.projHelper.getProjection().fromDivPixelToLatLng(pt);
6572    };
6573
6574    p.minExtract = function(set, func) {
6575      var bestIndex, bestVal, index, item, l, len1, val;
6576      for (index = l = 0, len1 = set.length; l < len1; index = ++l) {
6577        item = set[index];
6578        val = func(item);
6579        if ((typeof bestIndex === "undefined" || bestIndex === null) || val < bestVal) {
6580          bestVal = val;
6581          bestIndex = index;
6582        }
6583      }
6584      return set.splice(bestIndex, 1)[0];
6585    };
6586
6587    p.arrIndexOf = function(arr, obj) {
6588      var i, l, len1, o;
6589      if (arr.indexOf != null) {
6590        return arr.indexOf(obj);
6591      }
6592      for (i = l = 0, len1 = arr.length; l < len1; i = ++l) {
6593        o = arr[i];
6594        if (o === obj) {
6595          return i;
6596        }
6597      }
6598      return -1;
6599    };
6600
6601    _Class.ProjHelper = function(map) {
6602      return this.setMap(map);
6603    };
6604
6605    _Class.ProjHelper.prototype = new gm.OverlayView();
6606
6607    _Class.ProjHelper.prototype['draw'] = function() {};
6608
6609    return _Class;
6610
6611  })();
6612
6613}).call(this);
6614
6615var $ = jQuery.noConflict();
6616
6617$(document).foundation();
6618
6619var $homepageSlider = $('.homepage-slider');
6620
6621$(document).ready(function () {
6622	if($homepageSlider.length) {
6623		$homepageSlider.slick({
6624			arrows: true,
6625			dots: true,
6626			autoplay: true,
6627			autoplaySpeed: 6000,
6628			fade: true
6629		});
6630	}
6631
6632	// gallery slider
6633	var $gallerySlider = $('.gallery-widget-slider');
6634
6635	$gallerySlider.on('init', function(slick){
6636		var $slides = $gallerySlider.find('.slick-slide').not('.slick-cloned'),
6637			slidesNumber = $slides.length; // for some reason it receives 2 active slides
6638		$('.slides-counter').find('.current-slide-number').html('1');
6639		$('.slides-counter').find('.total-slides').append(' of ' + slidesNumber);
6640	});
6641
6642	$gallerySlider.on('afterChange', function(slick, currentSlide, nextSlide){
6643		$('.slides-counter').find('.current-slide-number').html(currentSlide.currentSlide + 1);
6644	});
6645
6646	if($gallerySlider.length) {
6647		var slickGallerySlider = $gallerySlider.slick({
6648			arrows: true,
6649			dots: false,
6650			adaptiveHeight: true,
6651			prevArrow: '<button type="button" class="gallery-slider-prev">&lsaquo;</button>',
6652			nextArrow: '<button type="button" class="gallery-slider-next">&rsaquo;</button>',
6653			appendArrows: $('.gallery-slider-nav'),
6654		});
6655	}
6656
6657	$('.fancybox').fancybox();
6658
6659	$.fn.almComplete = function(alm){
6660		setTimeout(function () {
6661			new Foundation.Equalizer($('#page, #single-post'), {
6662				'data-equalize-on' : 'medium'
6663			});
6664		}, 300);
6665	};
6666
6667	/* make the mobile menu parent items links accessible */
6668
6669	// disable prevent default
6670	$('#mobile-menu .is-accordion-submenu-parent > a').unbind('click');
6671
6672	$('#mobile-menu .is-accordion-submenu-parent > a .dropdown-arrow').click(function (e) {
6673		e.preventDefault();
6674		e.stopPropagation();
6675
6676		$(this).toggleClass('is-opened');
6677
6678		if($(this).hasClass('is-opened')) {
6679			$(document).trigger('down.zf.accordionMenu');
6680		} else {
6681			$(document).trigger('up.zf.accordionMenu');
6682		}
6683
6684		$(this).closest('.is-accordion-submenu-parent').find('.is-accordion-submenu').slideToggle();
6685	});
6686
6687	// disable current year on archives page
6688
6689	if($('body').hasClass('archive') && $('body').hasClass('date')) {
6690		var currentArchive = window.location.href,
6691			$archiveList = $('.archive-list');
6692
6693		$archiveList.find("a[href='" + currentArchive + "']")
6694			.addClass('disabled-link')
6695			.click(function (e) {
6696				e.preventDefault();
6697			});
6698	}
6699});
6700
6701$(window).load(function () {
6702	// make the content and sidebar height equal
6703	setTimeout(function () {
6704		var elem = new Foundation.Equalizer($('#page, #single-post'), {
6705			'data-equalize-on' : 'medium'
6706		});
6707	}, 0);
6708
6709	$(document).on('change.zf.tabs down.zf.accordion up.zf.accordion down.zf.accordionMenu up.zf.accordionMenu', function () {
6710		new Foundation.Equalizer($('#page, #single-post'), {
6711			'data-equalize-on' : 'medium'
6712		});
6713	});
6714});
6715
6716// tribe events tooltips for the mini calendar
6717
6718var $eventsWidget = $( '.events-widget' );
6719
6720$eventsWidget.on( 'mouseenter', '.parish-tooltips',function() {
6721
6722	var bottomPad = 0,
6723		$this = $( this ),
6724		$body = $( 'body' ),
6725		$tip;
6726
6727	if ( $body.hasClass( 'events-gridview' ) ) { // Cal View Tooltips
6728		bottomPad = $this.find( 'a' ).outerHeight() + 18;
6729	}
6730	else if ( $body.is( '.single-tribe_events, .events-list, .tribe-events-day' ) ) { // Single/List View Recurring Tooltips
6731		bottomPad = $this.outerHeight() + 12;
6732	}
6733	else if ( $body.is( '.tribe-events-photo' ) ) { // Photo View
6734		bottomPad = $this.outerHeight() + 10;
6735	}
6736
6737	// Widget Tooltips
6738	if ( $this.parents( '.tribe-events-calendar-widget' ).length ) {
6739		bottomPad = $this.outerHeight() - 6;
6740	}
6741	if ( ! $body.hasClass( 'tribe-events-week' ) ) {
6742		$tip = $this.find( '.tribe-events-tooltip' );
6743
6744		if ( ! $tip.length ) {
6745			var data = $this.data( 'tribejson' );
6746
6747			if( ! data.hasOwnProperty('eventId') ) {
6748				return;
6749			}
6750
6751			if ( typeof data == 'string' ) {
6752				data = $.parseJSON( data );
6753			}
6754
6755			$this.append( tribe_tmpl( 'tribe_tmpl_tooltip', data ) );
6756
6757			// add links to tooltips
6758
6759			if( data.hasOwnProperty('permalink') ) {
6760				var $title = $(this).find('.entry-title'),
6761					titleText = $title.text(),
6762					link = data.permalink;
6763
6764				$title.html('<a href="' + link + '">' + titleText + '</a>');
6765			}
6766
6767			$tip = $this.find( '.tribe-events-tooltip' );
6768
6769			$tip.css( 'bottom', bottomPad ).show();
6770		}
6771		else {
6772			$tip.css( 'bottom', bottomPad ).show();
6773		}
6774	}
6775
6776} ).on( 'mouseleave', '.parish-tooltips', function() {
6777	$( this ).find( '.tribe-events-tooltip' ).stop( true, false ).fadeOut( 200 );
6778} );
6779
6780//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZvdW5kYXRpb24ubWluLmpzIiwibW90aW9uLXVpLmpzIiwid2hhdC1pbnB1dC5qcyIsInNsaWNrLm1pbi5qcyIsImpxdWVyeS5mYW5jeWJveC5qcyIsIm9tcy5qcyIsImFwcC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDekdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUN2U0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD
6780QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB
6780QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNoZ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUM1aUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJmb3VuZGF0aW9uLmpzIiwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKX1mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2sodCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpfWZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayh0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIil9ZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKX1mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2sodCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpfWZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayh0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIil9ZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKX1mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2sodCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpfWZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayh0LGUpe2lm
6780KCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIil9ZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKX1mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2sodCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpfWZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayh0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIil9ZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKX1mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2sodCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpfWZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayh0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIil9ZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKX1mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2sodCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpfWZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayh0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIil9ZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKX0hZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gZSh0KXtpZih2b2lkIDA9PT1GdW5jdGlvbi5wcm90b3R5cGUubmFtZSl7dmFyIGU9L2Z1bmN0aW9uXFxzKFteKF17MSx9KVxcKC8saT1lLmV4ZWModC50b1N0cmluZygpKTtyZXR1cm4gaSYmaS5sZW5ndGg+MT9pWzFdLnRyaW0oKTpcIlwifXJldHVybiB2b2lkIDA9PT10LnByb3RvdHlwZT90LmNvbnN0cnVjdG9yLm5hbWU6dC5wcm90b3R5cGUuY29uc3RydWN0b3IubmFtZX1mdW5jdGlvbiBpKHQpe3JldHVybi90cnVlLy50ZXN0KHQpPyEwOi9mYWxzZS8udGVzdCh0KT8hMTppc05hTigxKnQpP3Q6cGFyc2VGbG9hdCh0KX1mdW5jdGlvbiBuKHQpe3JldHVybiB0LnJlcGxhY2UoLyhbYS16XSkoW0EtWl0pL2csXCIkMS0kMlwiKS50b0xvd2VyQ2FzZSgpfXZhciBzPVwiNi4yLjFcIixvPXt2ZXJzaW9uOnMsX3BsdWdpbnM6e30sX3V1aWRzOltdLHJ0bDpmdW5jdGlvbigpe3JldHVyblwicnRsXCI9PT10KFwiaHRtbFwiKS5hdHRyKFwiZGlyXCIpfSxwbHVnaW46ZnVuY3Rpb24odCxpKXt2YXIgcz1pfHxlKHQpLG89bihzKTt0aGlzLl9wbHVnaW5zW29dPXRoaXNbc109dH0scmVnaXN0ZXJQbHVnaW46ZnVuY3Rpb24odCxpKXt2YXIgcz1pP24oaSk6ZSh0LmNvbnN0cnVjdG9yKS50b0xvd2VyQ2FzZSgpO3QudXVpZD10aGlzLkdldFlvRGlnaXRzKDYscyksdC4kZWxlbWVudC5hdHRyKFwiZGF0YS1cIitzKXx8dC4kZWxlbWVudC5hdHRyKFwiZGF0YS1cIitzLHQudXVpZCksdC4kZWxlbWVudC5kYXRhKFwiemZQbHVnaW5cIil8fHQuJGVsZW1lbnQuZGF0YShcInpmUGx1Z2luXCIsdCksdC4kZWxlbWVudC50cmlnZ2VyKFwiaW5pdC56Zi5cIitzKSx0aGlzLl91dWlkcy5wdXNoKHQudXVpZCl9LHVucmVnaXN0ZXJQbHVnaW46ZnVuY3Rpb24odCl7dmFyIGk9bihlKHQuJGVsZW1lbnQuZGF0YShcInpmUGx1Z2luXCIpLmNvbnN0cnVjdG9yKSk7dGhpcy5fdXVpZHMuc3BsaWNlKHRoaXMuX3V1aWRzLmluZGV4T2YodC51dWlkKSwxKSx0LiRlbGVtZW50LnJlbW92ZUF0dHIoXCJkYXRhLVwiK2kpLnJlbW92ZURhdGEoXCJ6ZlBsdWdpblwiKS50cmlnZ2VyKFwiZGVzdHJveWVkLnpmLlwiK2kpO2Zvcih2YXIgcyBpbiB0KXRbc109bnVsbH0scmVJbml0OmZ1bmN0aW9uKGUpe3ZhciBpPWUgaW5zdGFuY2VvZiB0O3RyeXtpZihpKWUuZWFjaChmdW5jdGlvbigpe3QodGhpcykuZGF0YShcInpmUGx1Z2luXCIpLl9pbml0KCl9KTtlbHNle3ZhciBzPXR5cGVvZiBlLG89dGhpcyxhPXtvYmplY3Q6ZnVuY3Rpb24oZSl7ZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2U9bihlKSx0KFwiW2RhdGEtXCIrZStcIl1cIikuZm91bmRhdGlvbihcIl9pbml0XCIpfSl9LHN0cmluZzpmdW5jdGlvbigpe2U9bihlKSx0KFwiW2RhdGEtXCIrZStcIl1cIikuZm91bmRhdGlvbihcIl9pbml0XCIpfSx1bmRlZmluZWQ6ZnVuY3Rpb24oKXt0aGlzLm9iamVjdChPYmplY3Qua2V5cyhvLl9wbHVnaW5zKSl9fTthW3NdKGUpfX1jYXRjaChyKXtjb25zb2xlLmVycm9yKHIpfWZpbmFsbHl7cmV0dXJuIGV9fSxHZXRZb0RpZ2l0czpmdW5jdGlvbih0LGUpe3JldHVybiB0PXR8fDYsTWF0aC5yb3VuZChNYXRoLnBvdygzNix0KzEpLU1hdGgucmFuZG9tKCkqTWF0aC5wb3coMzYsdCkpLnRvU3RyaW5nKDM2KS5zbGljZSgxKSsoZT9cIi1cIitlOlwiXCIpfSxyZWZsb3c6ZnVuY3Rpb24oZSxuKXtcInVuZGVmaW5lZFwiPT10eXBlb2Ygbj9uPU9iamVjdC5rZXlzKHRoaXMuX3BsdWdpbnMpOlwic3RyaW5nXCI9PXR5cGVvZiBuJiYobj1bbl0pO3ZhciBzPXRoaXM7dC5lYWNoKG4sZnVuY3Rpb24obixvKXt2YXIgYT1zLl9wbHVnaW5zW29dLHI9dChlKS5maW5kKFwiW2RhdGEtXCIrbytcIl1cIikuYWRkQmFjayhcIltkYXRhLVwiK28rXCJdXCIpO3IuZWFjaChmdW5jdGlvbigpe3ZhciBlPXQodGhpcyksbj17fTtpZihlLmRhdGEoXCJ6ZlBsdWdpblwiKSlyZXR1cm4gdm9pZCBjb25zb2xlLndhcm4oXCJUcmllZCB0byBpbml0aWFsaXplIFwiK28rXCIgb24gYW4gZWxlbWVudCB0aGF0IGFscmVhZHkgaGFzIGEgRm91bmRhdGlvbiBwbHVnaW4uXCIpO2lmKGUuYXR0cihcImRhdGEtb3B0aW9uc1wiKSl7ZS5hdHRyKFwiZGF0YS1vcHRpb25zXCIpLnNwbGl0KFwiO1wiKS5mb3JFYWNoKGZ1bmN0aW9uKHQsZSl7dmFyIHM9dC5zcGxpdChcIjpcIikubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB0LnRyaW0oKX0pO3NbMF0mJihuW3NbMF1dPWkoc1sxXSkpfSl9dHJ5e2UuZGF0YShcInpmUGx1Z2luXCIsbmV3IGEodCh0aGlzKSxuKSl9Y2F0Y2gocyl7Y29uc29sZS5lcnJvcihzKX1maW5hbGx5e3JldHVybn19KX0pfSxnZXRGbk5hbWU6ZSx0cmFuc2l0aW9uZW5kOmZ1bmN0aW9uKHQpe3ZhciBlLGk9e3RyYW5zaXRpb246XCJ0cmFuc2l0aW9uZW5kXCIsV2Via2l0VHJhbnNpdGlvbjpcIndlYmtpdFRyYW5zaXRpb25FbmRcIixNb3pUcmFuc2l0aW9uOlwidHJhbnNpdGlvbmVuZFwiLE9UcmFuc2l0aW9uOlwib3RyYW5zaXRpb25lbmRcIn0sbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO2Zvcih2YXIgcyBpbiBpKVwidW5kZWZpbmVkXCIhPXR5cGVvZiBuLnN0eWxlW3NdJiYoZT1pW3NdKTtyZXR1cm4gZT9lOihlPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt0LnRyaWdnZXJIYW5kbGVyKFwidHJhbnNpdGlvbmVuZFwiLFt0XSl9LDEpLFwidHJhbnNpdGlvbmVuZFwiKX19O28udXRpbD17dGhyb3R0bGU6ZnVuY3Rpb24odCxlKXt2YXIgaT1udWxsO3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXRoaXMscz1hcmd1bWVudHM7bnVsbD09PWkmJihpPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt0LmFwcGx5KG4scyksaT1udWxsfSxlKSl9fX07dmFyIGE9ZnVuY3Rpb24oaSl7dmFyIG49dHlwZW9mIGkscz10KFwibWV0YS5mb3VuZGF0aW9uLW1xXCIpLGE9dChcIi5uby1qc1wiKTtpZihzLmxlbmd0aHx8dCgnPG1ldGEgY2xhc3M9XCJmb3VuZGF0aW9uLW1xXCI+JykuYXBwZW5kVG8oZG9jdW1lbnQuaGVhZCksYS5sZW5ndGgmJmEucmVtb3ZlQ2xhc3MoXCJuby1qc1wiKSxcInVuZGVmaW5lZFwiPT09bilvLk1lZGlhUXVlcnkuX2luaXQoKSxvLnJlZmxvdyh0aGlzKTtlbHNle2lmKFwic3RyaW5nXCIhPT1uKXRocm93IG5ldyBUeXBlRXJyb3IoXCJXZSdyZSBzb3JyeSwgXCIrbitcIiBpcyBub3QgYSB2YWxpZCBwYXJhbWV0ZXIuIFlvdSBtdXN0IHVzZSBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIG1ldGhvZCB5b3Ugd2lzaCB0byBpbnZva2UuXCIpO3ZhciByPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSxsPXRoaXMuZGF0YShcInpmUGx1Z2luXCIpO2lmKHZvaWQgMD09PWx8fHZvaWQgMD09PWxbaV0pdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwiV2UncmUgc29ycnksICdcIitpK1wiJyBpcyBub3QgYW4gYXZhaWxhYmxlIG1ldGhvZCBmb3IgXCIrKGw/ZShsKTpcInRoaXMgZWxlbWVudFwiKStcIi5cIik7MT09PXRoaXMubGVuZ3RoP2xbaV0uYXBwbHkobCxyKTp0aGlzLmVhY2goZnVuY3Rpb24oZSxuKXtsW2ldLmFwcGx5KHQobikuZGF0YShcInpmUGx1Z2luXCIpLHIpfSl9cmV0dXJuIHRoaXN9O3dpbmRvdy5Gb3VuZGF0aW9uPW8sdC5mbi5mb3VuZGF0aW9uPWEsZnVuY3Rpb24oKXtEYXRlLm5vdyYmd2luZG93LkRhdGUubm93fHwod2luZG93LkRhdGUubm93PURhdGUubm93PWZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBEYXRlKS5nZXRUaW1lKCl9KTtmb3IodmFyIHQ9W1wid2Via2l0XCIsXCJtb3pcIl0sZT0wO2U8dC5sZW5ndGgmJiF3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lOysrZSl7dmFyIGk9dFtlXTt3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lPXdpbmRvd1tpK1wiUmVxdWVzdEFuaW1hdGlvbkZyYW1lXCJdLHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZT13aW5kb3dbaStcIkNhbmNlbEFuaW1hdGlvbkZyYW1lXCJdfHx3aW5kb3dbaStcIkNhbmNlbFJlcXVlc3RBbmltYXRpb25GcmFtZVwiXX1pZigvaVAoYWR8aG9uZXxvZCkuKk9TIDYvLnRlc3Qod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpfHwhd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZXx8IXdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSl7dmFyIG49MDt3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lPWZ1bmN0aW9uKHQpe3ZhciBlPURhdGUubm93KCksaT1NYXRoLm1heChuKzE2LGUpO3JldHVybiBzZXRUaW
67801lb3V0KGZ1bmN0aW9uKCl7dChuPWkpfSxpLWUpfSx3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWU9Y2xlYXJUaW1lb3V0fXdpbmRvdy5wZXJmb3JtYW5jZSYmd2luZG93LnBlcmZvcm1hbmNlLm5vd3x8KHdpbmRvdy5wZXJmb3JtYW5jZT17c3RhcnQ6RGF0ZS5ub3coKSxub3c6ZnVuY3Rpb24oKXtyZXR1cm4gRGF0ZS5ub3coKS10aGlzLnN0YXJ0fX0pfSgpLEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kfHwoRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQ9ZnVuY3Rpb24odCl7aWYoXCJmdW5jdGlvblwiIT10eXBlb2YgdGhpcyl0aHJvdyBuZXcgVHlwZUVycm9yKFwiRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQgLSB3aGF0IGlzIHRyeWluZyB0byBiZSBib3VuZCBpcyBub3QgY2FsbGFibGVcIik7dmFyIGU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpLGk9dGhpcyxuPWZ1bmN0aW9uKCl7fSxzPWZ1bmN0aW9uKCl7cmV0dXJuIGkuYXBwbHkodGhpcyBpbnN0YW5jZW9mIG4/dGhpczp0LGUuY29uY2F0KEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykpKX07cmV0dXJuIHRoaXMucHJvdG90eXBlJiYobi5wcm90b3R5cGU9dGhpcy5wcm90b3R5cGUpLHMucHJvdG90eXBlPW5ldyBuLHN9KX0oalF1ZXJ5KSwhZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0KXt2YXIgZT17fTtyZXR1cm5cInN0cmluZ1wiIT10eXBlb2YgdD9lOih0PXQudHJpbSgpLnNsaWNlKDEsLTEpKT9lPXQuc3BsaXQoXCImXCIpLnJlZHVjZShmdW5jdGlvbih0LGUpe3ZhciBpPWUucmVwbGFjZSgvXFwrL2csXCIgXCIpLnNwbGl0KFwiPVwiKSxuPWlbMF0scz1pWzFdO3JldHVybiBuPWRlY29kZVVSSUNvbXBvbmVudChuKSxzPXZvaWQgMD09PXM/bnVsbDpkZWNvZGVVUklDb21wb25lbnQocyksdC5oYXNPd25Qcm9wZXJ0eShuKT9BcnJheS5pc0FycmF5KHRbbl0pP3Rbbl0ucHVzaChzKTp0W25dPVt0W25dLHNdOnRbbl09cyx0fSx7fSk6ZX12YXIgaT17cXVlcmllczpbXSxjdXJyZW50OlwiXCIsX2luaXQ6ZnVuY3Rpb24oKXt2YXIgaSxuPXRoaXMscz10KFwiLmZvdW5kYXRpb24tbXFcIikuY3NzKFwiZm9udC1mYW1pbHlcIik7aT1lKHMpO2Zvcih2YXIgbyBpbiBpKW4ucXVlcmllcy5wdXNoKHtuYW1lOm8sdmFsdWU6XCJvbmx5IHNjcmVlbiBhbmQgKG1pbi13aWR0aDogXCIraVtvXStcIilcIn0pO3RoaXMuY3VycmVudD10aGlzLl9nZXRDdXJyZW50U2l6ZSgpLHRoaXMuX3dhdGNoZXIoKX0sYXRMZWFzdDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldCh0KTtyZXR1cm4gZT93aW5kb3cubWF0Y2hNZWRpYShlKS5tYXRjaGVzOiExfSxnZXQ6ZnVuY3Rpb24odCl7Zm9yKHZhciBlIGluIHRoaXMucXVlcmllcyl7dmFyIGk9dGhpcy5xdWVyaWVzW2VdO2lmKHQ9PT1pLm5hbWUpcmV0dXJuIGkudmFsdWV9cmV0dXJuIG51bGx9LF9nZXRDdXJyZW50U2l6ZTpmdW5jdGlvbigpe2Zvcih2YXIgdCxlPTA7ZTx0aGlzLnF1ZXJpZXMubGVuZ3RoO2UrKyl7dmFyIGk9dGhpcy5xdWVyaWVzW2VdO3dpbmRvdy5tYXRjaE1lZGlhKGkudmFsdWUpLm1hdGNoZXMmJih0PWkpfXJldHVyblwib2JqZWN0XCI9PXR5cGVvZiB0P3QubmFtZTp0fSxfd2F0Y2hlcjpmdW5jdGlvbigpe3ZhciBlPXRoaXM7dCh3aW5kb3cpLm9uKFwicmVzaXplLnpmLm1lZGlhcXVlcnlcIixmdW5jdGlvbigpe3ZhciBpPWUuX2dldEN1cnJlbnRTaXplKCk7aSE9PWUuY3VycmVudCYmKHQod2luZG93KS50cmlnZ2VyKFwiY2hhbmdlZC56Zi5tZWRpYXF1ZXJ5XCIsW2ksZS5jdXJyZW50XSksZS5jdXJyZW50PWkpfSl9fTtGb3VuZGF0aW9uLk1lZGlhUXVlcnk9aSx3aW5kb3cubWF0Y2hNZWRpYXx8KHdpbmRvdy5tYXRjaE1lZGlhPWZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7dmFyIHQ9d2luZG93LnN0eWxlTWVkaWF8fHdpbmRvdy5tZWRpYTtpZighdCl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpLGk9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJzY3JpcHRcIilbMF0sbj1udWxsO2UudHlwZT1cInRleHQvY3NzXCIsZS5pZD1cIm1hdGNobWVkaWFqcy10ZXN0XCIsaS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlLGkpLG49XCJnZXRDb21wdXRlZFN0eWxlXCJpbiB3aW5kb3cmJndpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGUsbnVsbCl8fGUuY3VycmVudFN0eWxlLHQ9e21hdGNoTWVkaXVtOmZ1bmN0aW9uKHQpe3ZhciBpPVwiQG1lZGlhIFwiK3QrXCJ7ICNtYXRjaG1lZGlhanMtdGVzdCB7IHdpZHRoOiAxcHg7IH0gfVwiO3JldHVybiBlLnN0eWxlU2hlZXQ/ZS5zdHlsZVNoZWV0LmNzc1RleHQ9aTplLnRleHRDb250ZW50PWksXCIxcHhcIj09PW4ud2lkdGh9fX1yZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJue21hdGNoZXM6dC5tYXRjaE1lZGl1bShlfHxcImFsbFwiKSxtZWRpYTplfHxcImFsbFwifX19KCkpLEZvdW5kYXRpb24uTWVkaWFRdWVyeT1pfShqUXVlcnkpLCFmdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQpe3ZhciBlPXt9O2Zvcih2YXIgaSBpbiB0KWVbdFtpXV09dFtpXTtyZXR1cm4gZX12YXIgaT17OTpcIlRBQlwiLDEzOlwiRU5URVJcIiwyNzpcIkVTQ0FQRVwiLDMyOlwiU1BBQ0VcIiwzNzpcIkFSUk9XX0xFRlRcIiwzODpcIkFSUk9XX1VQXCIsMzk6XCJBUlJPV19SSUdIVFwiLDQwOlwiQVJST1dfRE9XTlwifSxuPXt9LHM9e2tleXM6ZShpKSxwYXJzZUtleTpmdW5jdGlvbih0KXt2YXIgZT1pW3Qud2hpY2h8fHQua2V5Q29kZV18fFN0cmluZy5mcm9tQ2hhckNvZGUodC53aGljaCkudG9VcHBlckNhc2UoKTtyZXR1cm4gdC5zaGlmdEtleSYmKGU9XCJTSElGVF9cIitlKSx0LmN0cmxLZXkmJihlPVwiQ1RSTF9cIitlKSx0LmFsdEtleSYmKGU9XCJBTFRfXCIrZSksZX0saGFuZGxlS2V5OmZ1bmN0aW9uKGUsaSxzKXt2YXIgbyxhLHIsbD1uW2ldLHU9dGhpcy5wYXJzZUtleShlKTtyZXR1cm4gbD8obz1cInVuZGVmaW5lZFwiPT10eXBlb2YgbC5sdHI/bDpGb3VuZGF0aW9uLnJ0bCgpP3QuZXh0ZW5kKHt9LGwubHRyLGwucnRsKTp0LmV4dGVuZCh7fSxsLnJ0bCxsLmx0ciksYT1vW3VdLHI9c1thXSx2b2lkKHImJlwiZnVuY3Rpb25cIj09dHlwZW9mIHI/KHIuYXBwbHkoKSwocy5
6780oYW5kbGVkfHxcImZ1bmN0aW9uXCI9PXR5cGVvZiBzLmhhbmRsZWQpJiZzLmhhbmRsZWQuYXBwbHkoKSk6KHMudW5oYW5kbGVkfHxcImZ1bmN0aW9uXCI9PXR5cGVvZiBzLnVuaGFuZGxlZCkmJnMudW5oYW5kbGVkLmFwcGx5KCkpKTpjb25zb2xlLndhcm4oXCJDb21wb25lbnQgbm90IGRlZmluZWQhXCIpfSxmaW5kRm9jdXNhYmxlOmZ1bmN0aW9uKGUpe3JldHVybiBlLmZpbmQoXCJhW2hyZWZdLCBhcmVhW2hyZWZdLCBpbnB1dDpub3QoW2Rpc2FibGVkXSksIHNlbGVjdDpub3QoW2Rpc2FibGVkXSksIHRleHRhcmVhOm5vdChbZGlzYWJsZWRdKSwgYnV0dG9uOm5vdChbZGlzYWJsZWRdKSwgaWZyYW1lLCBvYmplY3QsIGVtYmVkLCAqW3RhYmluZGV4XSwgKltjb250ZW50ZWRpdGFibGVdXCIpLmZpbHRlcihmdW5jdGlvbigpe3JldHVybiB0KHRoaXMpLmlzKFwiOnZpc2libGVcIikmJiEodCh0aGlzKS5hdHRyKFwidGFiaW5kZXhcIik8MCl9KX0scmVnaXN0ZXI6ZnVuY3Rpb24odCxlKXtuW3RdPWV9fTtGb3VuZGF0aW9uLktleWJvYXJkPXN9KGpRdWVyeSksIWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxlLGkpe2Z1bmN0aW9uIG4ocil7YXx8KGE9d2luZG93LnBlcmZvcm1hbmNlLm5vdygpKSxvPXItYSxpLmFwcGx5KGUpLHQ+bz9zPXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUobixlKTood2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHMpLGUudHJpZ2dlcihcImZpbmlzaGVkLnpmLmFuaW1hdGVcIixbZV0pLnRyaWdnZXJIYW5kbGVyKFwiZmluaXNoZWQuemYuYW5pbWF0ZVwiLFtlXSkpfXZhciBzLG8sYT1udWxsO3M9d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShuKX1mdW5jdGlvbiBpKGUsaSxvLGEpe2Z1bmN0aW9uIHIoKXtlfHxpLmhpZGUoKSxsKCksYSYmYS5hcHBseShpKX1mdW5jdGlvbiBsKCl7aVswXS5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb249MCxpLnJlbW92ZUNsYXNzKHUrXCIgXCIrZCtcIiBcIitvKX1pZihpPXQoaSkuZXEoMCksaS5sZW5ndGgpe3ZhciB1PWU/blswXTpuWzFdLGQ9ZT9zWzBdOnNbMV07bCgpLGkuYWRkQ2xhc3MobykuY3NzKFwidHJhbnNpdGlvblwiLFwibm9uZVwiKSxyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXtpLmFkZENsYXNzKHUpLGUmJmkuc2hvdygpfSkscmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7aVswXS5vZmZzZXRXaWR0aCxpLmNzcyhcInRyYW5zaXRpb25cIixcIlwiKS5hZGRDbGFzcyhkKX0pLGkub25lKEZvdW5kYXRpb24udHJhbnNpdGlvbmVuZChpKSxyKX19dmFyIG49W1wibXVpLWVudGVyXCIsXCJtdWktbGVhdmVcIl0scz1bXCJtdWktZW50ZXItYWN0aXZlXCIsXCJtdWktbGVhdmUtYWN0aXZlXCJdLG89e2FuaW1hdGVJbjpmdW5jdGlvbih0LGUsbil7aSghMCx0LGUsbil9LGFuaW1hdGVPdXQ6ZnVuY3Rpb24odCxlLG4pe2koITEsdCxlLG4pfX07Rm91bmRhdGlvbi5Nb3ZlPWUsRm91bmRhdGlvbi5Nb3Rpb249b30oalF1ZXJ5KSwhZnVuY3Rpb24odCl7dmFyIGU9e0ZlYXRoZXI6ZnVuY3Rpb24oZSl7dmFyIGk9YXJndW1lbnRzLmxlbmd0aDw9MXx8dm9pZCAwPT09YXJndW1lbnRzWzFdP1wiemZcIjphcmd1bWVudHNbMV07ZS5hdHRyKFwicm9sZVwiLFwibWVudWJhclwiKTt2YXIgbj1lLmZpbmQoXCJsaVwiKS5hdHRyKHtyb2xlOlwibWVudWl0ZW1cIn0pLHM9XCJpcy1cIitpK1wiLXN1Ym1lbnVcIixvPXMrXCItaXRlbVwiLGE9XCJpcy1cIitpK1wiLXN1Ym1lbnUtcGFyZW50XCI7ZS5maW5kKFwiYTpmaXJzdFwiKS5hdHRyKFwidGFiaW5kZXhcIiwwKSxuLmVhY2goZnVuY3Rpb24oKXt2YXIgZT10KHRoaXMpLGk9ZS5jaGlsZHJlbihcInVsXCIpO2kubGVuZ3RoJiYoZS5hZGRDbGFzcyhhKS5hdHRyKHtcImFyaWEtaGFzcG9wdXBcIjohMCxcImFyaWEtZXhwYW5kZWRcIjohMSxcImFyaWEtbGFiZWxcIjplLmNoaWxkcmVuKFwiYTpmaXJzdFwiKS50ZXh0KCl9KSxpLmFkZENsYXNzKFwic3VibWVudSBcIitzKS5hdHRyKHtcImRhdGEtc3VibWVudVwiOlwiXCIsXCJhcmlhLWhpZGRlblwiOiEwLHJvbGU6XCJtZW51XCJ9KSksZS5wYXJlbnQoXCJbZGF0YS1zdWJtZW51XVwiKS5sZW5ndGgmJmUuYWRkQ2xhc3MoXCJpcy1zdWJtZW51LWl0ZW0gXCIrbyl9KX0sQnVybjpmdW5jdGlvbih0LGUpe3ZhciBpPSh0LmZpbmQoXCJsaVwiKS5yZW1vdmVBdHRyKFwidGFiaW5kZXhcIiksXCJpcy1cIitlK1wiLXN1Ym1lbnVcIiksbj1pK1wiLWl0ZW1cIixzPVwiaXMtXCIrZStcIi1zdWJtZW51LXBhcmVudFwiO3QuZmluZChcIipcIikucmVtb3ZlQ2xhc3MoaStcIiBcIituK1wiIFwiK3MrXCIgaXMtc3VibWVudS1pdGVtIHN1Ym1lbnUgaXMtYWN0aXZlXCIpLnJlbW92ZUF0dHIoXCJkYXRhLXN1Ym1lbnVcIikuY3NzKFwiZGlzcGxheVwiLFwiXCIpfX07Rm91bmRhdGlvbi5OZXN0PWV9KGpRdWVyeSksIWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxlLG4scyl7dmFyIG8sYSxyLGwsdT1pKHQpO2lmKGUpe3ZhciBkPWkoZSk7YT11Lm9mZnNldC50b3ArdS5oZWlnaHQ8PWQuaGVpZ2h0K2Qub2Zmc2V0LnRvcCxvPXUub2Zmc2V0LnRvcD49ZC5vZmZzZXQudG9wLHI9dS5vZmZzZXQubGVmdD49ZC5vZmZzZXQubGVmdCxsPXUub2Zmc2V0LmxlZnQrdS53aWR0aDw9ZC53aWR0aH1lbHNlIGE9dS5vZmZzZXQudG9wK3UuaGVpZ2h0PD11LndpbmRvd0RpbXMuaGVpZ2h0K3Uud2luZG93RGltcy5vZmZzZXQudG9wLG89dS5vZmZzZXQudG9wPj11LndpbmRvd0RpbXMub2Zmc2V0LnRvcCxyPXUub2Zmc2V0LmxlZnQ+PXUud2luZG93RGltcy5vZmZzZXQubGVmdCxsPXUub2Zmc2V0LmxlZnQrdS53aWR0aDw9dS53aW5kb3dEaW1zLndpZHRoO3ZhciBoPVthLG8scixsXTtyZXR1cm4gbj9yPT09bD09ITA6cz9vPT09YT09ITA6LTE9PT1oLmluZGV4T2YoITEpfWZ1bmN0aW9uIGkodCxlKXtpZih0PXQubGVuZ3RoP3RbMF06dCx0PT09d2luZG93fHx0PT09ZG9jdW1lbnQpdGhyb3cgbmV3IEVycm9yKFwiSSdtIHNvcnJ5LCBEYXZlLiBJJ20gYWZyYWlkIEkgY2FuJ3QgZG8gdGhhdC5cIik7dmFyIGk9dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxuPXQucGFyZW50Tm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxzPWRvY3VtZW50LmJvZHkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbz13aW5kb3cucGFnZVlPZmZzZXQsYT13aW5kb3cucGFnZVhPZmZzZXQ7cmV0dXJue3dpZHRoOmkud2lkdGgsaGVpZ2h0OmkuaGVpZ2h0LG9mZnNldDp7dG9wOmkudG9wK28sbGVmdDppLmxlZnQrYX0scGFyZW50RGltczp7d2lkdGg6bi53aWR0aCxoZWlnaHQ6bi5oZWlnaHQsb2Zmc2V0Ont0b3A6bi50b3ArbyxsZWZ0Om4ubGVmdCthfX0sd2luZG93RGltczp7d2lkdGg6cy53aWR0aCxoZWlnaHQ6cy5oZWlnaHQsb2Zmc2V0Ont0b3A6byxsZWZ0OmF9fX19ZnVuY3Rpb24gbih0LGUsbixzLG8sYSl7dmFyIHI9aSh0KSxsPWU/aShlKTpudWxsO3N3aXRjaC
6780huKXtjYXNlXCJ0b3BcIjpyZXR1cm57bGVmdDpGb3VuZGF0aW9uLnJ0bCgpP2wub2Zmc2V0LmxlZnQtci53aWR0aCtsLndpZHRoOmwub2Zmc2V0LmxlZnQsdG9wOmwub2Zmc2V0LnRvcC0oci5oZWlnaHQrcyl9O2Nhc2VcImxlZnRcIjpyZXR1cm57bGVmdDpsLm9mZnNldC5sZWZ0LShyLndpZHRoK28pLHRvcDpsLm9mZnNldC50b3B9O2Nhc2VcInJpZ2h0XCI6cmV0dXJue2xlZnQ6bC5vZmZzZXQubGVmdCtsLndpZHRoK28sdG9wOmwub2Zmc2V0LnRvcH07Y2FzZVwiY2VudGVyIHRvcFwiOnJldHVybntsZWZ0Omwub2Zmc2V0LmxlZnQrbC53aWR0aC8yLXIud2lkdGgvMix0b3A6bC5vZmZzZXQudG9wLShyLmhlaWdodCtzKX07Y2FzZVwiY2VudGVyIGJvdHRvbVwiOnJldHVybntsZWZ0OmE/bzpsLm9mZnNldC5sZWZ0K2wud2lkdGgvMi1yLndpZHRoLzIsdG9wOmwub2Zmc2V0LnRvcCtsLmhlaWdodCtzfTtjYXNlXCJjZW50ZXIgbGVmdFwiOnJldHVybntsZWZ0Omwub2Zmc2V0LmxlZnQtKHIud2lkdGgrbyksdG9wOmwub2Zmc2V0LnRvcCtsLmhlaWdodC8yLXIuaGVpZ2h0LzJ9O2Nhc2VcImNlbnRlciByaWdodFwiOnJldHVybntsZWZ0Omwub2Zmc2V0LmxlZnQrbC53aWR0aCtvKzEsdG9wOmwub2Zmc2V0LnRvcCtsLmhlaWdodC8yLXIuaGVpZ2h0LzJ9O2Nhc2VcImNlbnRlclwiOnJldHVybntsZWZ0OnIud2luZG93RGltcy5vZmZzZXQubGVmdCtyLndpbmRvd0RpbXMud2lkdGgvMi1yLndpZHRoLzIsdG9wOnIud2luZG93RGltcy5vZmZzZXQudG9wK3Iud2luZG93RGltcy5oZWlnaHQvMi1yLmhlaWdodC8yfTtjYXNlXCJyZXZlYWxcIjpyZXR1cm57bGVmdDooci53aW5kb3dEaW1zLndpZHRoLXIud2lkdGgpLzIsdG9wOnIud2luZG93RGltcy5vZmZzZXQudG9wK3N9O2Nhc2VcInJldmVhbCBmdWxsXCI6cmV0dXJue2xlZnQ6ci53aW5kb3dEaW1zLm9mZnNldC5sZWZ0LHRvcDpyLndpbmRvd0RpbXMub2Zmc2V0LnRvcH07Y2FzZVwibGVmdCBib3R0b21cIjpyZXR1cm57bGVmdDpsLm9mZnNldC5sZWZ0LShyLndpZHRoK28pLHRvcDpsLm9mZnNldC50b3ArbC5oZWlnaHR9O2Nhc2VcInJpZ2h0IGJvdHRvbVwiOnJldHVybntsZWZ0Omwub2Zmc2V0LmxlZnQrbC53aWR0aCtvLXIud2lkdGgsdG9wOmwub2Zmc2V0LnRvcCtsLmhlaWdodH07ZGVmYXVsdDpyZXR1cm57bGVmdDpGb3VuZGF0aW9uLnJ0bCgpP2wub2Zmc2V0LmxlZnQtci53aWR0aCtsLndpZHRoOmwub2Zmc2V0LmxlZnQsdG9wOmwub2Zmc2V0LnRvcCtsLmhlaWdodCtzfX19Rm91bmRhdGlvbi5Cb3g9e0ltTm90VG91Y2hpbmdZb3U6ZSxHZXREaW1lbnNpb25zOmksR2V0T2Zmc2V0czpufX0oalF1ZXJ5KSwhZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe28oKSxuKCkscygpLGkoKX1mdW5jdGlvbiBpKGUpe3ZhciBpPXQoXCJbZGF0YS15ZXRpLWJveF1cIiksbj1bXCJkcm9wZG93blwiLFwidG9vbHRpcFwiLFwicmV2ZWFsXCJdO2lmKGUmJihcInN0cmluZ1wiPT10eXBlb2YgZT9uLnB1c2goZSk6XCJvYmplY3RcIj09dHlwZW9mIGUmJlwic3RyaW5nXCI9PXR5cGVvZiBlWzBdP24uY29uY2F0KGUpOmNvbnNvbGUuZXJyb3IoXCJQbHVnaW4gbmFtZXMgbXVzdCBiZSBzdHJpbmdzXCIpKSxpLmxlbmd0aCl7dmFyIHM9bi5tYXAoZnVuY3Rpb24odCl7cmV0dXJuXCJjbG9zZW1lLnpmLlwiK3R9KS5qb2luKFwiIFwiKTt0KHdpbmRvdykub2ZmKHMpLm9uKHMsZnVuY3Rpb24oZSxpKXt2YXIgbj1lLm5hbWVzcGFjZS5zcGxpdChcIi5cIilbMF0scz10KFwiW2RhdGEtXCIrbitcIl1cIikubm90KCdbZGF0YS15ZXRpLWJveD1cIicraSsnXCJdJyk7cy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGU9dCh0aGlzKTtlLnRyaWdnZXJIYW5kbGVyKFwiY2xvc2UuemYudHJpZ2dlclwiLFtlXSl9KX0pfX1mdW5jdGlvbiBuKGUpe3ZhciBpPXZvaWQgMCxuPXQoXCJbZGF0YS1yZXNpemVdXCIpO24ubGVuZ3RoJiZ0KHdpbmRvdykub2ZmKFwicmVzaXplLnpmLnRyaWdnZXJcIikub24oXCJyZXNpemUuemYudHJpZ2dlclwiLGZ1bmN0aW9uKHMpe2kmJmNsZWFyVGltZW91dChpKSxpPXNldFRpbWVvdXQoZnVuY3Rpb24oKXthfHxuLmVhY2goZnVuY3Rpb24oKXt0KHRoaXMpLnRyaWdnZXJIYW5kbGVyKFwicmVzaXplbWUuemYudHJpZ2dlclwiKX0pLG4uYXR0cihcImRhdGEtZXZlbnRzXCIsXCJyZXNpemVcIil9LGV8fDEwKX0pfWZ1bmN0aW9uIHMoZSl7dmFyIGk9dm9pZCAwLG49dChcIltkYXRhLXNjcm9sbF1cIik7bi5sZW5ndGgmJnQod2luZG93KS5vZmYoXCJzY3JvbGwuemYudHJpZ2dlclwiKS5vbihcInNjcm9sbC56Zi50cmlnZ2VyXCIsZnVuY3Rpb24ocyl7aSYmY2xlYXJUaW1lb3V0KGkpLGk9c2V0VGltZW91dChmdW5jdGlvbigpe2F8fG4uZWFjaChmdW5jdGlvbigpe3QodGhpcykudHJpZ2dlckhhbmRsZXIoXCJzY3JvbGxtZS56Zi50cmlnZ2VyXCIpfSksbi5hdHRyKFwiZGF0YS1ldmVudHNcIixcInNjcm9sbFwiKX0sZXx8MTApfSl9ZnVuY3Rpb24gbygpe2lmKCFhKXJldHVybiExO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbZGF0YS1yZXNpemVdLCBbZGF0YS1zY3JvbGxdLCBbZGF0YS1tdXRhdGVdXCIpLGk9ZnVuY3Rpb24oZSl7dmFyIGk9dChlWzBdLnRhcmdldCk7c3dpdGNoKGkuYXR0cihcImRhdGEtZXZlbnRzXCIpKXtjYXNlXCJyZXNpemVcIjppLnRyaWdnZXJIYW5kbGVyKFwicmVzaXplbWUuemYudHJpZ2dlclwiLFtpXSk7YnJlYWs7Y2FzZVwic2Nyb2xsXCI6aS50cmlnZ2VySGFuZGxlcihcInNjcm9sbG1lLnpmLnRyaWdnZXJcIixbaSx3aW5kb3cucGFnZVlPZmZzZXRdKTticmVhaztkZWZhdWx0OnJldHVybiExfX07aWYoZS5sZW5ndGgpZm9yKHZhciBuPTA7bjw9ZS5sZW5ndGgtMTtuKyspe3ZhciBzPW5ldyBhKGkpO3Mub2JzZXJ2ZShlW25dLHthdHRyaWJ1dGVzOiEwLGNoaWxkTGlzdDohMSxjaGFyYWN0ZXJEYXRhOiExLHN1YnRyZWU6ITEsYXR0cmlidXRlRmlsdGVyOltcImRhdGEtZXZlbnRzXCJdfSl9fXZhciBhPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtcIldlYktpdFwiLFwiTW96XCIsXCJPXCIsXCJNc1wiLFwiXCJdLGU9MDtlPHQubGVuZ3RoO2UrKylpZih0W2VdK1wiTXV0YXRpb25PYnNlcnZlclwiaW4gd2luZG93KXJldHVybi
6780B3aW5kb3dbdFtlXStcIk11dGF0aW9uT2JzZXJ2ZXJcIl07cmV0dXJuITF9KCkscj1mdW5jdGlvbihlLGkpe2UuZGF0YShpKS5zcGxpdChcIiBcIikuZm9yRWFjaChmdW5jdGlvbihuKXt0KFwiI1wiK24pW1wiY2xvc2VcIj09PWk/XCJ0cmlnZ2VyXCI6XCJ0cmlnZ2VySGFuZGxlclwiXShpK1wiLnpmLnRyaWdnZXJcIixbZV0pfSl9O3QoZG9jdW1lbnQpLm9uKFwiY2xpY2suemYudHJpZ2dlclwiLFwiW2RhdGEtb3Blbl1cIixmdW5jdGlvbigpe3IodCh0aGlzKSxcIm9wZW5cIil9KSx0KGRvY3VtZW50KS5vbihcImNsaWNrLnpmLnRyaWdnZXJcIixcIltkYXRhLWNsb3NlXVwiLGZ1bmN0aW9uKCl7dmFyIGU9dCh0aGlzKS5kYXRhKFwiY2xvc2VcIik7ZT9yKHQodGhpcyksXCJjbG9zZVwiKTp0KHRoaXMpLnRyaWdnZXIoXCJjbG9zZS56Zi50cmlnZ2VyXCIpfSksdChkb2N1bWVudCkub24oXCJjbGljay56Zi50cmlnZ2VyXCIsXCJbZGF0YS10b2dnbGVdXCIsZnVuY3Rpb24oKXtyKHQodGhpcyksXCJ0b2dnbGVcIil9KSx0KGRvY3VtZW50KS5vbihcImNsb3NlLnpmLnRyaWdnZXJcIixcIltkYXRhLWNsb3NhYmxlXVwiLGZ1bmN0aW9uKGUpe2Uuc3RvcFByb3BhZ2F0aW9uKCk7dmFyIGk9dCh0aGlzKS5kYXRhKFwiY2xvc2FibGVcIik7XCJcIiE9PWk/Rm91bmRhdGlvbi5Nb3Rpb24uYW5pbWF0ZU91dCh0KHRoaXMpLGksZnVuY3Rpb24oKXt0KHRoaXMpLnRyaWdnZXIoXCJjbG9zZWQuemZcIil9KTp0KHRoaXMpLmZhZGVPdXQoKS50cmlnZ2VyKFwiY2xvc2VkLnpmXCIpfSksdChkb2N1bWVudCkub24oXCJmb2N1cy56Zi50cmlnZ2VyIGJsdXIuemYudHJpZ2dlclwiLFwiW2RhdGEtdG9nZ2xlLWZvY3VzXVwiLGZ1bmN0aW9uKCl7dmFyIGU9dCh0aGlzKS5kYXRhKFwidG9nZ2xlLWZvY3VzXCIpO3QoXCIjXCIrZSkudHJpZ2dlckhhbmRsZXIoXCJ0b2dnbGUuemYudHJpZ2dlclwiLFt0KHRoaXMpXSl9KSx0K
6780HdpbmRvdykubG9hZChmdW5jdGlvbigpe2UoKX0pLEZvdW5kYXRpb24uSUhlYXJZb3U9ZX0oalF1ZXJ5KSwhZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0LGUsaSl7dmFyIG4scyxvPXRoaXMsYT1lLmR1cmF0aW9uLHI9T2JqZWN0LmtleXModC5kYXRhKCkpWzBdfHxcInRpbWVyXCIsbD0tMTt0aGlzLmlzUGF1c2VkPSExLHRoaXMucmVzdGFydD1mdW5jdGlvbigpe2w9LTEsY2xlYXJUaW1lb3V0KHMpLHRoaXMuc3RhcnQoKX0sdGhpcy5zdGFydD1mdW5jdGlvbigpe3RoaXMuaXNQYXVzZWQ9ITEsY2xlYXJUaW1lb3V0KHMpLGw9MD49bD9hOmwsdC5kYXRhKFwicGF1c2VkXCIsITEpLG49RGF0ZS5ub3coKSxzPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmluZmluaXRlJiZvLnJlc3RhcnQoKSxpKCl9LGwpLHQudHJpZ2dlcihcInRpbWVyc3RhcnQuemYuXCIrcil9LHRoaXMucGF1c2U9ZnVuY3Rpb24oKXt0aGlzLmlzUGF1c2VkPSEwLGNsZWFyVGltZW91dChzKSx0LmRhdGEoXCJwYXVzZWRcIiwhMCk7dmFyIGU9RGF0ZS5ub3coKTtsLT1lLW4sdC50cmlnZ2VyKFwidGltZXJwYXVzZWQuemYuXCIrcil9fWZ1bmN0aW9uIGkoZSxpKXtmdW5jdGlvbiBuKCl7cy0tLDA9PT1zJiZpKCl9dmFyIHM9ZS5sZW5ndGg7MD09PXMmJmkoKSxlLmVhY2goZnVuY3Rpb24oKXt0aGlzLmNvbXBsZXRlP24oKTpcInVuZGVmaW5lZFwiIT10eXBlb2YgdGhpcy5uYXR1cmFsV2lkdGgmJnRoaXMubmF0dXJhbFdpZHRoPjA/bigpOnQodGhpcykub25lKFwibG9hZFwiLGZ1bmN0aW9uKCl7bigpfSl9KX1Gb3VuZGF0aW9uLlRpbWVyPWUsRm91bmRhdGlvbi5vbkltYWdlc0xvYWRlZD1pfShqUXVlcnkpLGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0b3VjaG1vdmVcIixpKSx0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0b3VjaGVuZFwiLGUpLHU9ITF9ZnVuY3Rpb24gaShpKXtpZih0LnNwb3RTd2lwZS5wcmV2ZW50RGVmYXVsdCYmaS5wcmV2ZW50RGVmYXVsdCgpLHUpe3ZhciBuLHM9aS50b3VjaGVzWzBdLnBhZ2VYLGE9KGkudG91Y2hlc1swXS5wYWdlWSxvLXMpO2w9KG5ldyBEYXRlKS5nZXRUaW1lKCktcixNYXRoLmFicyhhKT49dC5zcG90U3dpcGUubW92ZVRocmVzaG9sZCYmbDw9dC5zcG90U3dpcGUudGltZVRocmVzaG9sZCYmKG49YT4wP1wibGVmdFwiOlwicmlnaHRcIiksbiYmKGkucHJldmVudERlZmF1bHQoKSxlLmNhbGwodGhpcyksdCh0aGlzKS50cmlnZ2VyKFwic3dpcGVcIixuKS50cmlnZ2VyKFwic3dpcGVcIituKSl9fWZ1bmN0aW9uIG4odCl7MT09dC50b3VjaGVzLmxlbmd0aCYmKG89dC50b3VjaGVzWzBdLnBhZ2VYLGE9dC50b3VjaGVzWzBdLnBhZ2VZLHU9ITAscj0obmV3IERhdGUpLmdldFRpbWUoKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaG1vdmVcIixpLCExKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaGVuZFwiLGUsITEpKX1mdW5jdGlvbiBzKCl7dGhpcy5hZGRFdmVudExpc3RlbmVyJiZ0aGlzLmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaHN0YXJ0XCIsbiwhMSl9dC5zcG90U3dpcGU9e3ZlcnNpb246XCIxLjAuMFwiLGVuYWJsZWQ6XCJvbnRvdWNoc3RhcnRcImluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxwcmV2ZW50RGVmYXVsdDohMSxtb3ZlVGhyZXNob2xkOjc1LHRpbWVUaHJlc2hvbGQ6MjAwfTt2YXIgbyxhLHIsbCx1PSExO3QuZXZlbnQuc3BlY2lhbC5zd2lwZT17c2V0dXA6c30sdC5lYWNoKFtcImxlZnRcIixcInVwXCIsXCJkb3duXCIsXCJyaWdodFwiXSxmdW5jdGlvbigpe3QuZXZlbnQuc3BlY2lhbFtcInN3aXBlXCIrdGhpc109e3NldHVwOmZ1bmN0aW9uKCl7dCh0aGlzKS5vbihcInN3aXBlXCIsdC5ub29wKX19fSl9KGpRdWVyeSksIWZ1bmN0aW9uKHQpe3QuZm4uYWRkVG91Y2g9ZnVuY3Rpb24oKXt0aGlzLmVhY2goZnVuY3Rpb24oaSxuKXt0KG4pLmJpbmQoXCJ0b3VjaHN0YXJ0IHRvdWNobW92ZSB0b3VjaGVuZCB0b3VjaGNhbmNlbFwiLGZ1bmN0aW9uKCl7ZShldmVudCl9KX0pO3ZhciBlPWZ1bmN0aW9uKHQpe3ZhciBlLGk9dC5jaGFuZ2VkVG91Y2hlcyxuPWlbMF0scz17dG91Y2hzdGFydDpcIm1vdXNlZG93blwiLHRvdWNobW92ZTpcIm1vdXNlbW92ZVwiLHRvdWNoZW5kOlwibW91c2V1cFwifSxvPXNbdC50eXBlXTtcIk1vdXNlRXZlbnRcImluIHdpbmRvdyYmXCJmdW5jdGlvblwiPT10eXBlb2Ygd2luZG93Lk1vdXNlRXZlbnQ/ZT13aW5kb3cuTW91c2VFdmVudChvLHtidWJibGVzOiEwLGNhbmNlbGFibG
6780U6ITAsc2NyZWVuWDpuLnNjcmVlblgsc2NyZWVuWTpuLnNjcmVlblksY2xpZW50WDpuLmNsaWVudFgsY2xpZW50WTpuLmNsaWVudFl9KTooZT1kb2N1bWVudC5jcmVhdGVFdmVudChcIk1vdXNlRXZlbnRcIiksZS5pbml0TW91c2VFdmVudChvLCEwLCEwLHdpbmRvdywxLG4uc2NyZWVuWCxuLnNjcmVlblksbi5jbGllbnRYLG4uY2xpZW50WSwhMSwhMSwhMSwhMSwwLG51bGwpKSxuLnRhcmdldC5kaXNwYXRjaEV2ZW50KGUpfX19KGpRdWVyeSk7dmFyIF9jcmVhdGVDbGFzcz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXtmb3IodmFyIGk9MDtpPGUubGVuZ3RoO2krKyl7dmFyIG49ZVtpXTtuLmVudW1lcmFibGU9bi5lbnVtZXJhYmxlfHwhMSxuLmNvbmZpZ3VyYWJsZT0hMCxcInZhbHVlXCJpbiBuJiYobi53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsbi5rZXksbil9fXJldHVybiBmdW5jdGlvbihlLGksbil7cmV0dXJuIGkmJnQoZS5wcm90b3R5cGUsaSksbiYmdChlLG4pLGV9fSgpOyFmdW5jdGlvbih0KXt2YXIgZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoaSl7dmFyIG49YXJndW1lbnRzLmxlbmd0aDw9MXx8dm9pZCAwPT09YXJndW1lbnRzWzFdP3t9OmFyZ3VtZW50c1sxXTtfY2xhc3NDYWxsQ2hlY2sodGhpcyxlKSx0aGlzLiRlbGVtZW50PWksdGhpcy5vcHRpb25zPXQuZXh0ZW5kKHt9LGUuZGVmYXVsdHMsdGhpcy4kZWxlbWVudC5kYXRhKCksbiksdGhpcy5faW5pdCgpLEZvdW5kYXRpb24ucmVnaXN0ZXJQbHVnaW4odGhpcyxcIkFiaWRlXCIpfXJldHVybiBfY3JlYXRlQ2xhc3MoZSxbe2tleTpcIl9pbml0XCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLiRpbnB1dHM9dGhpcy4kZWxlbWVudC5maW5kKFwiaW5wdXQsIHRleHRhcmVhLCBzZWxlY3RcIikubm90KFwiW2RhdGEtYWJpZGUtaWdub3JlXVwiKSx0aGlzLl9ldmVudHMoKX19LHtrZXk6XCJfZXZlbnRzXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMuJGVsZW1lbnQub2ZmKFwiLmFiaWRlXCIpLm9uKFwicmVzZXQuemYuYWJpZGVcIixmdW5jdGlvbigpe2UucmVzZXRGb3JtKCl9KS5vbihcInN1Ym1pdC56Zi5hYmlkZVwiLGZ1bmN0aW9uKCl7cmV0dXJuIGUudmFsaWRhdGVGb3JtKCl9KSxcImZpZWxkQ2hhbmdlXCI9PT10aGlzLm9wdGlvbnMudmFsaWRhdGVPbiYmdGhpcy4kaW5wdXRzLm9mZihcImNoYW5nZS56Zi5hYmlkZVwiKS5vbihcImNoYW5nZS56Zi5hYmlkZVwiLGZ1bmN0aW9uKGkpe2UudmFsaWRhdGVJbnB1dCh0KGkudGFyZ2V0KSl9KSx0aGlzLm9wdGlvbnMubGl2ZVZhbGlkYXRlJiZ0aGlzLiRpbnB1dHMub2ZmKFwiaW5wdXQuemYuYWJpZGVcIikub24oXCJpbnB1dC56Zi5hYmlkZVwiLGZ1bmN0aW9uKGkpe2UudmFsaWRhdGVJbnB1dCh0KGkudGFyZ2V0KSl9KX19LHtrZXk6XCJfcmVmbG93XCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLl9pbml0KCl9fSx7a2V5OlwicmVxdWlyZWRDaGVja1wiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKCF0LmF0dHIoXCJyZXF1aXJlZFwiKSlyZXR1cm4hMDt2YXIgZT0hMDtzd2l0Y2godFswXS50eXBlKXtjYXNlXCJzZWxlY3RcIjpjYXNlXCJzZWxlY3Qtb25lXCI6Y2FzZVwic2VsZWN0LW11bHRpcGxlXCI6dmFyIGk9dC5maW5kKFwib3B0aW9uOnNlbGVjdGVkXCIpO2kubGVuZ3RoJiZpLnZhbCgpfHwoZT0hMSk7YnJlYWs7ZGVmYXVsdDp0LnZhbCgpJiZ0LnZhbCgpLmxlbmd0aHx8KGU9ITEpfXJldHVybiBlfX0se2tleTpcImZpbmRGb3JtRXJyb3JcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10LnNpYmxpbmdzKHRoaXMub3B0aW9ucy5mb3JtRXJyb3JTZWxlY3Rvcik7cmV0dXJuIGUubGVuZ3RofHwoZT10LnBhcmVudCgpLmZpbmQodGhpcy5vcHRpb25zLmZvcm1FcnJvclNlbGVjdG9yKSksZX19LHtrZXk6XCJmaW5kTGFiZWxcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10WzBdLmlkLGk9dGhpcy4kZWxlbWVudC5maW5kKCdsYWJlbFtmb3I9XCInK2UrJ1wiXScpO3JldHVybiBpLmxlbmd0aD9pOnQuY2xvc2VzdChcImxhYmVsXCIpfX0se2tleTpcImZpbmRSYWRpb0xhYmVsc1wiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciBpPXRoaXMsbj1lLm1hcChmdW5jdGlvbihlLG4pe3ZhciBzPW4uaWQsbz1pLiRlbGVtZW50LmZpbmQoJ2xhYmVsW2Zvcj1cIicrcysnXCJdJyk7cmV0dXJuIG8ubGVuZ3RofHwobz10KG4pLmNsb3Nlc3QoXCJsYWJlbFwiKSksb1swXX0pO3JldHVybiB0KG4pfX0se2tleTpcImFkZEVycm9yQ2xhc3Nlc1wiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZmluZExhYmVsKHQpLGk9dGhpcy5maW5kRm9ybUVycm9yKHQpO2UubGVuZ3RoJiZlLmFkZENsYXNzKHRoaXMub3B0aW9ucy5sYWJlbEVycm9yQ2xhc3MpLGkubGVuZ3RoJiZpLmFkZENsYXNzKHRoaXMub3B0aW9ucy5mb3JtRXJyb3JDbGFzcyksdC5hZGRDbGFzcyh0aGlzLm9wdGlvbnMuaW5wdXRFcnJvckNsYXNzKS5hdHRyKFwiZGF0YS1pbnZhbGlkXCIsXCJcIil9fSx7a2V5OlwicmVtb3ZlUmFkaW9FcnJvckNsYXNzZXNcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLiRlbGVtZW50LmZpbmQoJzpyYWRpb1tuYW1lPVwiJyt0KydcIl0nKSxpPXRoaXMuZmluZFJhZGlvTGFiZWxzKGUpLG49dGhpcy5maW5kRm9ybUVycm9yKGUpO2kubGVuZ3RoJiZpLnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5sYWJlbEVycm9yQ2xhc3MpLG4ubGVuZ3RoJiZuLnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5mb3JtRXJyb3JDbGFzcyksZS5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMuaW5wdXRFcnJvckNsYXNzKS5yZW1vdmVBdHRyKFwiZGF0YS1pbnZhbGlkXCIpfX0se2tleTpcInJlbW92ZUVycm9yQ2xhc3Nlc1wiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKFwicmFkaW9cIj09dFswXS50eXBlKXJldHVybi
6780B0aGlzLnJlbW92ZVJhZGlvRXJyb3JDbGFzc2VzKHQuYXR0cihcIm5hbWVcIikpO3ZhciBlPXRoaXMuZmluZExhYmVsKHQpLGk9dGhpcy5maW5kRm9ybUVycm9yKHQpO2UubGVuZ3RoJiZlLnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5sYWJlbEVycm9yQ2xhc3MpLGkubGVuZ3RoJiZpLnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5mb3JtRXJyb3JDbGFzcyksdC5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMuaW5wdXRFcnJvckNsYXNzKS5yZW1vdmVBdHRyKFwiZGF0YS1pbnZhbGlkXCIpfX0se2tleTpcInZhbGlkYXRlSW5wdXRcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLnJlcXVpcmVkQ2hlY2sodCksaT0hMSxuPSEwLHM9dC5hdHRyKFwiZGF0YS12YWxpZGF0b3JcIiksbz0hMDtzd2l0Y2godFswXS50eXBlKXtjYXNlXCJyYWRpb1wiOmk9dGhpcy52YWxpZGF0ZVJhZGlvKHQuYXR0cihcIm5hbWVcIikpO2JyZWFrO2Nhc2VcImNoZWNrYm94XCI6aT1lO2JyZWFrO2Nhc2VcInNlbGVjdFwiOmNhc2VcInNlbGVjdC1vbmVcIjpjYXNlXCJzZWxlY3QtbXVsdGlwbGVcIjppPWU7YnJlYWs7ZGVmYXVsdDppPXRoaXMudmFsaWRhdGVUZXh0KHQpfXMmJihuPXRoaXMubWF0Y2hWYWxpZGF0aW9uKHQscyx0LmF0dHIoXCJyZXF1aXJlZFwiKSkpLHQuYXR0cihcImRhdGEtZXF1YWx0b1wiKSYmKG89dGhpcy5vcHRpb25zLnZhbGlkYXRvcnMuZXF1YWxUbyh0KSk7dmFyIGE9LTE9PT1bZSxpLG4sb10uaW5kZXhPZighMSkscj0oYT9cInZhbGlkXCI6XCJpbnZhbGlkXCIpK1wiLnpmLmFiaWRlXCI7cmV0dXJuIHRoaXNbYT9cInJlbW92ZUVycm9yQ2xhc3Nlc1wiOlwiYWRkRXJyb3JDbGFzc2VzXCJdKHQpLHQud
6780HJpZ2dlcihyLFt0XSksYX19LHtrZXk6XCJ2YWxpZGF0ZUZvcm1cIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPVtdLGk9dGhpczt0aGlzLiRpbnB1dHMuZWFjaChmdW5jdGlvbigpe2UucHVzaChpLnZhbGlkYXRlSW5wdXQodCh0aGlzKSkpfSk7dmFyIG49LTE9PT1lLmluZGV4T2YoITEpO3JldHVybiB0aGlzLiRlbGVtZW50LmZpbmQoXCJbZGF0YS1hYmlkZS1lcnJvcl1cIikuY3NzKFwiZGlzcGxheVwiLG4/XCJub25lXCI6XCJibG9ja1wiKSx0aGlzLiRlbGVtZW50LnRyaWdnZXIoKG4/XCJmb3JtdmFsaWRcIjpcImZvcm1pbnZhbGlkXCIpK1wiLnpmLmFiaWRlXCIsW3RoaXMuJGVsZW1lbnRdKSxufX0se2tleTpcInZhbGlkYXRlVGV4dFwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7ZT1lfHx0LmF0dHIoXCJwYXR0ZXJuXCIpfHx0LmF0dHIoXCJ0eXBlXCIpO3ZhciBpPXQudmFsKCksbj0hMTtyZXR1cm4gaS5sZW5ndGg/bj10aGlzLm9wdGlvbnMucGF0dGVybnMuaGFzT3duUHJvcGVydHkoZSk/dGhpcy5vcHRpb25zLnBhdHRlcm5zW2VdLnRlc3QoaSk6ZSE9PXQuYXR0cihcInR5cGVcIik/bmV3IFJlZ0V4cChlKS50ZXN0KGkpOiEwOnQucHJvcChcInJlcXVpcmVkXCIpfHwobj0hMCksbn19LHtrZXk6XCJ2YWxpZGF0ZVJhZGlvXCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIGk9dGhpcy4kZWxlbWVudC5maW5kKCc6cmFkaW9bbmFtZT1cIicrZSsnXCJdJyksbj0hMTtyZXR1cm4gdm9pZCAwPT09aS5hdHRyKFwicmVxdWlyZWRcIikmJihuPSEwKSxpLmVhY2goZnVuY3Rpb24oZSxpKXt0KGkpLnByb3AoXCJjaGVja2VkXCIpJiYobj0hMCl9KSxufX0se2tleTpcIm1hdGNoVmFsaWRhdGlvblwiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbj10aGlzO2k9ISFpO3ZhciBzPWUuc3BsaXQoXCIgXCIpLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gbi5vcHRpb25zLnZhbGlkYXRvcnNbZV0odCxpLHQucGFyZW50KCkpfSk7cmV0dXJuLTE9PT1zLmluZGV4T2YoITEpfX0se2tleTpcInJlc2V0Rm9ybVwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy4kZWxlbWVudCxpPXRoaXMub3B0aW9uczt0KFwiLlwiK2kubGFiZWxFcnJvckNsYXNzLGUpLm5vdChcInNtYWxsXCIpLnJlbW92ZUNsYXNzKGkubGFiZWxFcnJvckNsYXNzKSx0KFwiLlwiK2kuaW5wdXRFcnJvckNsYXNzLGUpLm5vdChcInNtYWxsXCIpLnJlbW92ZUNsYXNzKGkuaW5wdXRFcnJvckNsYXNzKSx0KGkuZm9ybUVycm9yU2VsZWN0b3IrXCIuXCIraS5mb3JtRXJyb3JDbGFzcykucmVtb3ZlQ2xhc3MoaS5mb3JtRXJyb3JDbGFzcyksZS5maW5kKFwiW2RhdGEtYWJpZGUtZXJyb3JdXCIpLmNzcyhcImRpc3BsYXlcIixcIm5vbmVcIiksdChcIjppbnB1dFwiLGUpLm5vdChcIjpidXR0b24sIDpzdWJtaXQsIDpyZXNldCwgOmhpZGRlbiwgW2RhdGEtYWJpZGUtaWdub3JlXVwiKS52YWwoXCJcIikucmVtb3ZlQXR0cihcImRhdGEtaW52YWxpZFwiKSxlLnRyaWdnZXIoXCJmb3JtcmVzZXQuemYuYWJpZGVcIixbZV0pfX0se2tleTpcImRlc3Ryb3lcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy4kZWxlbWVudC5vZmYoXCIuYWJpZGVcIikuZmluZChcIltkYXRhLWFiaWRlLWVycm9yXVwiKS5jc3MoXCJkaXNwbGF5XCIsXCJub25lXCIpLHRoaXMuJGlucHV0cy5vZmYoXCIuYWJpZGVcIikuZWFjaChmdW5jdGlvbigpe2UucmVtb3ZlRXJyb3JDbGFzc2VzKHQodGhpcykpfSksRm91bmRhdGlvbi51bnJlZ2lzdGVyUGx1Z2luKHRoaXMpfX1dKSxlfSgpO2UuZGVmYXVsdHM9e3ZhbGlkYXRlT246XCJmaWVsZENoYW5nZVwiLGxhYmVsRXJyb3JDbGFzczpcImlzLWludmFsaWQtbGFiZWxcIixpbnB1dEVycm9yQ2xhc3M6XCJpcy1pbnZhbGlkLWlucHV0XCIsZm9ybUVycm9yU2VsZWN0b3I6XCIuZm9ybS1lcnJvclwiLGZvcm1FcnJvckNsYXNzOlwiaXMtdmlzaWJsZVwiLGxpdmVWYWxpZGF0ZTohMSxwYXR0ZXJuczp7YWxwaGE6L15bYS16QS1aXSskLyxhbHBoYV9udW1lcmljOi9eW2EtekEtWjAtOV0rJC8saW50ZWdlcjovXlstK10/XFxkKyQvLG51bWJlcjovXlstK10/XFxkKig/OltcXC5cXCxdXFxkKyk/JC8sY2FyZDovXig/OjRbMC05XXsxMn0oPzpbMC05XXszfSk/fDVbMS01XVswLTldezE0fXw2KD86MDExfDVbMC05XVswLTldKVswLTldezEyfXwzWzQ3XVswLTldezEzfXwzKD86MFswLTVdfFs2OF1bMC05XSlbMC05XXsxMX18KD86MjEzMXwxODAwfDM1XFxkezN9KVxcZHsxMX0pJC8sY3Z2Oi9eKFswLTldKXszLDR9JC8sZW1haWw6L15bYS16QS1aMC05LiEjJCUmJyorXFwvPT9eX2B7fH1+LV0rQFthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPyg/OlxcLlthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPykrJC8sdXJsOi9eKGh0dHBzP3xmdHB8ZmlsZXxzc2gpOlxcL1xcLygoKChbYS16QS1aXXxcXGR8LXxcXC58X3x+fFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKXwoJVtcXGRhLWZdezJ9KXxbIVxcJCYnXFwoXFwpXFwqXFwrLDs9XXw6KSpAKT8oKChcXGR8WzEtOV1cXGR8MVxcZFxcZHwyWzAtNF1cXGR8MjVbMC01XSlcXC4oXFxkfFsxLTldXFxkfDFcXGRcXGR8MlswLTRdXFxkfDI1WzAtNV0pXFwuKFxcZHxbMS05XVxcZHwxXFxkXFxkfDJbMC00XVxcZHwyNVswLTVdKVxcLihcXGR8WzEtOV1cXGR8MVxcZFxcZHwyWzAtNF1cXGR8MjVbMC01XSkpfCgoKFthLXpBLVpdfFxcZHxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSl8KChbYS16QS1aXXxcXGR8W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKFthLXpBLVpdfFxcZHwtfFxcLnxffH58W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKihbYS16QS1aXXxcXGR8W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKSlcXC4pKygoW2EtekEtWl18W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pfCgoW2EtekEtWl18W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKFthLXpBLVpdfFxcZHwtfFxcLnxffH58W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKihbYS16QS1aXXxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSkpKVxcLj8pKDpcXGQqKT8pKFxcLygoKFthLXpBLVpdfFxcZHwtfFxcLnxffH58W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pfCglW1xcZGEtZl17Mn0pfFshXFwkJidcXChcXClcXCpcXCssOz1dfDp8QCkrKFxcLygoW2EtekEtWl18XFxkfC18XFwufF98fnxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSl8KCVbXFxkYS1mXXsyfSl8WyFcXCQmJ1xcKFxcKVxcKlxcKyw7PV18OnxAKSopKik/KT8oXFw/KCgoW2EtekEtWl18XFxkfC18XFwufF98fnxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSl8KCVbXFxkYS1mXXsyfSl8WyFcXCQmJ1xcKFxcKVxcKlxcKyw7PV18OnxAKXxbXFx1RTAwMC1cXHVGOEZGXXxcXC98XFw/KSopPyhcXCMoKChbYS16QS1aXXxcXGR8LXxcXC58X3x+fFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRU
6780ZdKXwoJVtcXGRhLWZdezJ9KXxbIVxcJCYnXFwoXFwpXFwqXFwrLDs9XXw6fEApfFxcL3xcXD8pKik/JC8sZG9tYWluOi9eKFthLXpBLVowLTldKFthLXpBLVowLTlcXC1dezAsNjF9W2EtekEtWjAtOV0pP1xcLikrW2EtekEtWl17Miw4fSQvLGRhdGV0aW1lOi9eKFswLTJdWzAtOV17M30pXFwtKFswLTFdWzAtOV0pXFwtKFswLTNdWzAtOV0pVChbMC01XVswLTldKVxcOihbMC01XVswLTldKVxcOihbMC01XVswLTldKShafChbXFwtXFwrXShbMC0xXVswLTldKVxcOjAwKSkkLyxkYXRlOi8oPzoxOXwyMClbMC05XXsyfS0oPzooPzowWzEtOV18MVswLTJdKS0oPzowWzEtOV18MVswLTldfDJbMC05XSl8KD86KD8hMDIpKD86MFsxLTldfDFbMC0yXSktKD86MzApKXwoPzooPzowWzEzNTc4XXwxWzAyXSktMzEpKSQvLHRpbWU6L14oMFswLTldfDFbMC05XXwyWzAtM10pKDpbMC01XVswLTldKXsyfSQvLGRhdGVJU086L15cXGR7NH1bXFwvXFwtXVxcZHsxLDJ9W1xcL1xcLV1cXGR7MSwyfSQvLG1vbnRoX2RheV95ZWFyOi9eKDBbMS05XXwxWzAxMl0pWy0gXFwvLl0oMFsxLTldfFsxMl1bMC05XXwzWzAxXSlbLSBcXC8uXVxcZHs0fSQvLGRheV9tb250aF95ZWFyOi9eKDBbMS05XXxbMTJdWzAtOV18M1swMV0pWy0gXFwvLl0oMFsxLTldfDFbMDEyXSlbLSBcXC8uXVxcZHs0fSQvLGNvbG9yOi9eIz8oW2EtZkEtRjAtOV17Nn18W2EtZkEtRjAtOV17M30pJC99LHZhbGlkYXRvcnM6e2VxdWFsVG86ZnVuY3Rpb24oZSxpLG4pe3JldHVybiB0KFwiI1wiK2UuYXR0cihcImRhdGEtZXF1YWx0b1wiKSkudmFsKCk9PT1lLnZhbCgpfX19LEZvdW5kYXRpb24ucGx1Z2luKGUsXCJBYmlkZVwiKX0oalF1ZXJ5KTt2YXIgX2NyZWF0ZUNsYXNzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKXt2YXIgbj1lW2ldO24uZW51bWVyYWJsZT1uLmVudW1lcmFibGV8fCExLG4uY29uZmlndXJhYmxlPSEwLFwidmFsdWVcImluIG4mJihuLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxuLmtleSxuKX19cmV0dXJuIGZ1bmN0aW9uKGUsaSxuKXtyZXR1cm4gaSYmdChlLnByb3RvdHlwZSxpKSxuJiZ0KGUsbiksZX19KCk7IWZ1bmN0aW9uKHQpe3ZhciBlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShpLG4pe19jbGFzc0NhbGxDaGVjayh0aGlzLGUpLHRoaXMuJGVsZW1lbnQ9aSx0aGlzLm9wdGlvbnM9dC5leHRlbmQoe30sZS5kZWZhdWx0cyx0aGlzLiRlbGVtZW50LmRhdGEoKSxuKSx0aGlzLl9pbml0KCksRm91bmRhdGlvbi5yZWdpc3RlclBsdWdpbih0aGlzLFwiQWNjb3JkaW9uXCIpLEZvdW5kYXRpb24uS2V5Ym9hcmQucmVnaXN0ZXIoXCJBY2NvcmRpb25cIix7RU5URVI6XCJ0b2dnbGVcIixTUEFDRTpcInRvZ2dsZVwiLEFSUk9XX0RPV046XCJuZXh0XCIsQVJST1dfVVA6XCJwcmV2aW91c1wifSl9cmV0dXJuIF9jcmVhdGVDbGFzcyhlLFt7a2V5OlwiX2luaXRcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuJGVsZW1lbnQuYXR0cihcInJvbGVcIixcInRhYmxpc3RcIiksdGhpcy4kdGFicz10aGlzLiRlbGVtZW50LmNoaWxkcmVuKFwibGksIFtkYXRhLWFjY29yZGlvbi1pdGVtXVwiKSx0aGlzLiR0YWJzLmVhY2goZnVuY3Rpb24oZSxpKXt2YXIgbj10KGkpLHM9bi5jaGlsZHJlbihcIltkYXRhLXRhYi1jb250ZW50XVwiKSxvPXNbMF0uaWR8fEZvdW5kYXRpb24uR2V0WW9EaWdpdHMoNixcImFjY29yZGlvblwiKSxhPWkuaWR8fG8rXCItbGFiZWxcIjtuLmZpbmQoXCJhOmZpcnN0XCIpLmF0dHIoe1wiYXJpYS1jb250cm9sc1wiOm8scm9sZTpcInRhYlwiLGlkOmEsXCJhcmlhLWV4cGFuZGVkXCI6ITEsXCJhcmlhLXNlbGVjdGVkXCI6ITF9KSxzLmF0dHIoe3JvbGU6XCJ0YWJwYW5lbFwiLFwiYXJpYS1sYWJlbGxlZGJ5XCI6YSxcImFyaWEtaGlkZGVuXCI6ITAsaWQ6b30pfSk7dmFyIGU9dGhpcy4kZWxlbWVudC5maW5kKFwiLmlzLWFjdGl2ZVwiKS5jaGlsZHJlbihcIltkYXRhLXRhYi1jb250ZW50XVwiKTtlLmxlbmd0aCYmdGhpcy5kb3duKGUsITApLHRoaXMuX2V2ZW50cygpfX0se2tleTpcIl9ldmVudHNcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy4kdGFicy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGk9dCh0aGlzKSxuPWkuY2hpbGRyZW4oXCJbZGF0YS10YWItY29udGVudF1cIik7bi5sZW5ndGgmJmkuY2hpbGRyZW4oXCJhXCIpLm9mZihcImNsaWNrLnpmLmFjY29yZGlvbiBrZXlkb3duLnpmLmFjY29yZGlvblwiKS5vbihcImNsaWNrLnpmLmFjY29yZGlvblwiLGZ1bmN0aW9uKHQpe3QucHJldmVudERlZmF1bHQoKSxpLmhhc0NsYXNzKFwiaXMtYWN0aXZlXCIpPyhlLm9wdGlvbnMuYWxsb3dBbGxDbG9zZWR8fGkuc2libGluZ3MoKS5oYXNDbGFzcyhcImlzLWFjdGl2ZVwiKSkmJmUudXAobik6ZS5kb3duKG4pfSkub24oXCJrZXlkb3duLnpmLmFjY29yZGlvblwiLGZ1bmN0aW9uKHQpe0ZvdW5kYXRpb24uS2V5Ym9hcmQuaGFuZGxlS2V5KHQsXCJBY2NvcmRpb25cIix7dG9nZ2xlOmZ1bmN0aW9uKCl7ZS50b2dnbGUobil9LG5leHQ6ZnVuY3Rpb24oKXt2YXIgdD1pLm5leHQoKS5maW5kKFwiYVwiKS5mb2N1cygpO2Uub3B0aW9ucy5tdWx0aUV4cGFuZHx8dC50cmlnZ2VyKFwiY2xpY2suemYuYWNjb3JkaW9uXCIpfSxwcmV2aW91czpmdW5jdGlvbigpe3ZhciB0PWkucHJldigpLmZpbmQoXCJhXCIpLmZvY3VzKCk7ZS5vcHRpb25zLm11bHRpRXhwYW5kfHx0LnRyaWdnZXIoXCJjbGljay56Zi5hY2NvcmRpb25cIil9LGhhbmRsZWQ6ZnVuY3Rpb24oKXt0LnByZXZlbnREZWZhdWx0KCksdC5zdG9wUHJvcGFnYXRpb24oKX19KX0pfSl9fSx7a2V5OlwidG9nZ2xlXCIsdmFsdWU6ZnVuY3Rpb24odCl7aWYodC5wYXJlbnQoKS5oYXNDbGFzcyhcImlzLWFjdGl2ZVwiKSl7aWYoIXRoaXMub3B0aW9ucy5hbGxvd0FsbENsb3NlZCYmIXQucGFyZW50KCkuc2libGluZ3MoKS5oYXNDbGFzcyhcImlzLWFjdGl2ZVwiKSlyZXR1cm47dGhpcy51cCh0KX1lbHNlIHRoaXMuZG93bih0KX19LHtrZXk6XCJkb3duXCIsdmFsdWU6ZnVuY3Rpb24oZSxpKXt2YXIgbj10aGlzO2lmKCF0aGlzLm9wdGlvbnMubXVsdGlFeHBhbmQmJiFpKXt2YXIgcz10aGlzLiRlbGVtZW50LmNoaWxkcmVuKFwiLmlzLWFjdGl2ZVwiKS5jaGlsZHJlbihcIltkYXRhLXRhYi1jb250ZW50XVwiKTtzLmxlbmd0aCYmdGhpcy51cChzKX1lLmF0dHIoXCJhcmlhLWhpZGRlblwiLCExKS5wYXJlbnQoXCJbZGF0YS10YWItY29udGVudF1cIikuYWRkQmFjaygpLnBhcmVudCgpLmFkZENsYXNzKFwiaXMtYWN0aXZlXCIpLGUuc2xpZGVEb3duKHRoaXMub3B0aW9ucy5zbGlkZVNwZWVkLGZ1bmN0aW9uKCl7bi4kZWxlbWVudC50cmlnZ2VyKFwiZG93bi56Zi5hY2NvcmRpb25cIixbZV0pfSksdChcIiNcIitlLmF0dHIoXCJhcmlhLWxhYmVsbGVkYnlcIikpLmF0dHIoe1wiYXJpYS1leHBhbmRlZFwiOiEwLFwiYXJpYS1zZWxlY3RlZFwiOiEwfSl9fSx7a2V5OlwidXBcIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgaT1lLnBhcmVudCgpLnNpYmxpbmdzKCksbj10aGlzLHM9dGhpcy5vcHRpb25zLm11bHRpRXhwYW5kP2kuaGFzQ2xhc3MoXCJpcy1hY3RpdmVcIik6ZS5wYXJlbnQoKS5oYXNDbGFzcyhcImlzLWFjdGl2ZVwiKTsodGhpcy5vcHRpb25zLmFsbG93QWxsQ2xvc2VkfHxzKSYmKGUuc2xpZGVVcChuLm9wdGlvbnMuc2xpZGVTcGVlZCxmdW5jdGlvbigpe24uJGVsZW1lbnQudHJpZ2dlcihcInVwLnpmLmFjY29yZGlvblwiLFtlXSl9KSxlLmF0dHIoXCJhcmlhLWhpZGRlblwiLCEwKS5wYXJlbnQoKS5yZW1vdmVDbGFzcyhcImlzLWFjdGl2ZVwiKSx0KFwiI1wiK2UuYXR0cihcImFyaWEtbGFiZWxsZWRieVwiKSkuYXR0cih7XCJhcmlhLWV4cGFuZGVkXCI6ITEsXCJhcmlhLXNlbGVjdGVkXCI6ITF9KSl9fSx7a2V5OlwiZGVzdHJveVwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy4kZWxlbWVudC5maW5kKFwiW2RhdGEtdGFiLWNvbnRlbn
6780RdXCIpLnNsaWRlVXAoMCkuY3NzKFwiZGlzcGxheVwiLFwiXCIpLHRoaXMuJGVsZW1lbnQuZmluZChcImFcIikub2ZmKFwiLnpmLmFjY29yZGlvblwiKSxGb3VuZGF0aW9uLnVucmVnaXN0ZXJQbHVnaW4odGhpcyl9fV0pLGV9KCk7ZS5kZWZhdWx0cz17c2xpZGVTcGVlZDoyNTAsbXVsdGlFeHBhbmQ6ITEsYWxsb3dBbGxDbG9zZWQ6ITF9LEZvdW5kYXRpb24ucGx1Z2luKGUsXCJBY2NvcmRpb25cIil9KGpRdWVyeSk7dmFyIF9jcmVhdGVDbGFzcz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXtmb3IodmFyIGk9MDtpPGUubGVuZ3RoO2krKyl7dmFyIG49ZVtpXTtuLmVudW1lcmFibGU9bi5lbnVtZXJhYmxlfHwhMSxuLmNvbmZpZ3VyYWJsZT0hMCxcInZhbHVlXCJpbiBuJiYobi53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsbi5rZXksbil9fXJldHVybiBmdW5jdGlvbihlLGksbil7cmV0dXJuIGkmJnQoZS5wcm90b3R5cGUsaSksbiYmdChlLG4pLGV9fSgpOyFmdW5jdGlvbih0KXt2YXIgZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoaSxuKXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxlKSx0aGlzLiRlbGVtZW50PWksdGhpcy5vcHRpb25zPXQuZXh0ZW5kKHt9LGUuZGVmYXVsdHMsdGhpcy4kZWxlbWVudC5kYXRhKCksbiksRm91bmRhdGlvbi5OZXN0LkZlYXRoZXIodGhpcy4kZWxlbWVudCxcImFjY29yZGlvblwiKSx0aGlzLl9pbml0KCksRm91bmRhdGlvbi5yZWdpc3RlclBsdWdpbih0aGlzLFwiQWNjb3JkaW9uTWVudVwiKSxGb3VuZGF0aW9uLktleWJvYXJkLnJlZ2lzdGVyKFwiQWNjb3JkaW9uTWVudVwiLHtFTlRFUjpcInRvZ2dsZVwiLFNQQUNFOlwidG9nZ2xlXCIsQVJST1dfUklHSFQ6XCJvcGVuXCIsQVJST1dfVVA6XCJ1cFwiLEFSUk9XX0RPV046XCJkb3duXCIsQVJST1dfTEVGVDpcImNsb3NlXCIsRVNDQVBFOlwiY2xvc2VBbGxcIixUQUI6XCJkb3duXCIsU0hJRlRfVEFCOlwidXBcIn0pfXJldHVybiBfY3JlYXRlQ2xhc3MoZSxbe2tleTpcIl9pbml0XCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLiRlbGVtZW50LmZpbmQoXCJbZGF0YS1zdWJtZW51XVwiKS5ub3QoXCIuaXMtYWN0aXZlXCIpLnNsaWRlVXAoMCksdGhpcy4kZWxlbWVudC5hdHRyKHtyb2xlOlwidGFibGlzdFwiLFwiYXJpYS1tdWx0aXNlbGVjdGFibGVcIjp0aGlzLm9wdGlvbnMubXVsdGlPcGVufSksdGhpcy4kbWVudUxpbmtzPXRoaXMuJGVsZW1lbnQuZmluZChcIi5pcy1hY2NvcmRpb24tc3VibWVudS1wYXJlbnRcIiksdGhpcy4kbWVudUxpbmtzLmVhY2goZnVuY3Rpb24oKXt2YXIgZT10aGlzLmlkfHxGb3VuZGF0aW9uLkdldFlvRGlnaXRzKDYsXCJhY2MtbWVudS1saW5rXCIpLGk9dCh0aGlzKSxuPWkuY2hpbGRyZW4oXCJbZGF0YS1zdWJtZW51XVwiKSxzPW5bMF0uaWR8fEZvdW5kYXRpb24uR2V0WW9EaWdpdHMoNixcImFjYy1tZW51XCIpLG89bi5oYXNDbGFzcyhcImlzLWFjdGl2ZVwiKTtpLmF0dHIoe1wiYXJpYS1jb250cm9sc1wiOnMsXCJhcmlhLWV4cGFuZGVkXCI6byxyb2xlOlwidGFiXCIsaWQ6ZX0pLG4uYXR0cih7XCJhcmlhLWxhYmVsbGVkYnlcIjplLFwiYXJpYS1oaWRkZW5cIjohbyxyb2xlOlwidGFicGFuZWxcIixpZDpzfSl9KTt2YXIgZT10aGlzLiRlbGVtZW50LmZpbmQoXCIuaXMtYWN0aXZlXCIpO2lmKGUubGVuZ3RoKXt2YXIgaT10aGlzO2UuZWFjaChmdW5jdGlvbigpe2kuZG93bih0KHRoaXMpKX0pfXRoaXMuX2V2ZW50cygpfX0se2tleTpcIl9ldmVudHNcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy4kZWxlbWVudC5maW5kKFwibGlcIikuZWFjaChmdW5jdGlvbigpe3ZhciBpPXQodGhpcykuY2hpbGRyZW4oXCJbZGF0YS1zdWJtZW51XVwiKTtpLmxlbmd0aCYmdCh0aGlzKS5jaGlsZHJlbihcImFcIikub2ZmKFwiY2xpY2suemYuYWNjb3JkaW9uTWVudVwiKS5vbihcImNsaWNrLnpmLmFjY29yZGlvbk1lbnVcIixmdW5jdGlvbih0KXt0LnByZXZlbnREZWZhdWx0KCksZS50b2dnbGUoaSl9KX0pLm9uKFwia2V5ZG93bi56Zi5hY2NvcmRpb25tZW51XCIsZnVuY3Rpb24oaSl7dmFyIG4scyxvPXQodGhpcyksYT1vLnBhcmVudChcInVsXCIpLmNoaWxkcmVuKFwibGlcIikscj1vLmNoaWxkcmVuKFwiW2RhdGEtc3VibWVudV1cIik7YS5lYWNoKGZ1bmN0aW9uKGUpe3JldHVybiB0KHRoaXMpLmlzKG8pPyhuPWEuZXEoTWF0aC5tYXgoMCxlLTEpKS5maW5kKFwiYVwiKS5maXJzdCgpLHM9YS5lcShNYXRoLm1pbihlKzEsYS5sZW5ndGgtMSkpLmZpbmQoXCJhXCIpLmZpcnN0KCksdCh0aGlzKS5jaGlsZHJlbihcIltkYXRhLXN1Ym1lbnVdOnZpc2libGVcIikubGVuZ3RoJiYocz1vLmZpbmQoXCJsaTpmaXJzdC1jaGlsZFwiKS5maW5kKFwiYVwiKS5maXJzdCgpKSx0KHRoaXMpLmlzKFwiOmZpcnN0LWNoaWxkXCIpP249by5wYXJlbnRzKFwibGlcIikuZmlyc3QoKS5maW5kKFwiYVwiKS5maXJzdCgpOm4uY2hpbGRyZW4oXCJbZGF0YS1zdWJtZW51XTp2aXNpYmxlXCIpLmxlbmd0aCYmKG49bi5maW5kKFwibGk6bGFzdC1jaGlsZFwiKS5maW5kKFwiYVwiKS5maXJzdCgpKSx2b2lkKHQodGhpcykuaXMoXCI6bGFzdC1jaGlsZFwiKSYmKHM9by5wYXJlbnRzKFwibGlcIikuZmlyc3QoKS5uZXh0KFwibGlcIikuZmluZChcImFcIikuZmlyc3QoKSkpKTp2b2lkIDA7XG59KSxGb3VuZGF0aW9uLktleWJvYXJkLmhhbmRsZUtleShpLFwiQWNjb3JkaW9uTWVudVwiLHtvcGVuOmZ1bmN0aW9uKCl7ci5pcyhcIjpoaWRkZW5cIikmJihlLmRvd24ociksci5maW5kKFwibGlcIikuZmlyc3QoKS5maW5kKFwiYVwiKS5maXJzdCgpLmZvY3VzKCkpfSxjbG9zZTpmdW5jdGlvbigpe3IubGVuZ3RoJiYhci5pcyhcIjpoaWRkZW5cIik/ZS51cChyKTpvLnBhcmVudChcIltkYXRhLXN1Ym1lbnVdXCIpLmxlbmd0aCYmKGUudXAoby5wYXJlbnQoXCJbZGF0YS1zdWJtZW51XVwiKSksby5wYXJlbnRzKFwibGlcIikuZmlyc3QoKS5maW5kKFwiYVwiKS5maXJzdCgpLmZvY3VzKCkpfSx1cDpmdW5jdGlvbigpe24uYXR0cihcInRhYmluZGV4XCIsLTEpLmZvY3VzKCksaS5wcmV2ZW50RGVmYXVsdCgpfSxkb3duOmZ1bmN0aW9uKCl7cy5hdHRyKFwidGFiaW5kZX
6780hcIiwtMSkuZm9jdXMoKSxpLnByZXZlbnREZWZhdWx0KCl9LHRvZ2dsZTpmdW5jdGlvbigpe28uY2hpbGRyZW4oXCJbZGF0YS1zdWJtZW51XVwiKS5sZW5ndGgmJmUudG9nZ2xlKG8uY2hpbGRyZW4oXCJbZGF0YS1zdWJtZW51XVwiKSl9LGNsb3NlQWxsOmZ1bmN0aW9uKCl7ZS5oaWRlQWxsKCl9LGhhbmRsZWQ6ZnVuY3Rpb24oKXtpLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfX0pfSl9fSx7a2V5OlwiaGlkZUFsbFwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy4kZWxlbWVudC5maW5kKFwiW2RhdGEtc3VibWVudV1cIikuc2xpZGVVcCh0aGlzLm9wdGlvbnMuc2xpZGVTcGVlZCl9fSx7a2V5OlwidG9nZ2xlXCIsdmFsdWU6ZnVuY3Rpb24odCl7dC5pcyhcIjphbmltYXRlZFwiKXx8KHQuaXMoXCI6aGlkZGVuXCIpP3RoaXMuZG93bih0KTp0aGlzLnVwKHQpKX19LHtrZXk6XCJkb3duXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpczt0aGlzLm9wdGlvbnMubXVsdGlPcGVufHx0aGlzLnVwKHRoaXMuJGVsZW1lbnQuZmluZChcIi5pcy1hY3RpdmVcIikubm90KHQucGFyZW50c1VudGlsKHRoaXMuJGVsZW1lbnQpLmFkZCh0KSkpLHQuYWRkQ2xhc3MoXCJpcy1hY3RpdmVcIikuYXR0cih7XCJhcmlhLWhpZGRlblwiOiExfSkucGFyZW50KFwiLmlzLWFjY29yZGlvbi1zdWJtZW51LXBhcmVudFwiKS5hdHRyKHtcImFyaWEtZXhwYW5kZWRcIjohMH0pLEZvdW5kYXRpb24uTW92ZSh0aGlzLm9wdGlvbnMuc2xpZGVTcGVlZCx0LGZ1bmN0aW9uKCl7dC5zbGlkZURvd24oZS5vcHRpb25zLnNsaWRlU3BlZWQsZnVuY3Rpb24oKXtlLiRlbGVtZW50LnRyaWdnZXIoXCJkb3duLnpmLmFjY29yZGlvbk1lbnVcIixbdF0pfSl9KX19LHtrZXk6XCJ1cFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7Rm91bmRhdGlvbi5Nb3ZlKHRoaXMub3B0aW9ucy5zbGlkZVNwZWVkLHQsZnVuY3Rpb24oKXt0LnNsaWRlVXAoZS5vcHRpb25zLnNsaWRlU3BlZWQsZnVuY3Rpb24oKXtlLiRlbGVtZW50LnRyaWdnZXIoXCJ1cC56Zi5hY2NvcmRpb25NZW51XCIsW3RdKX0pfSk7dmFyIGk9dC5maW5kKFwiW2RhdGEtc3VibWVudV1cIikuc2xpZGVVcCgwKS5hZGRCYWNrKCkuYXR0cihcImFyaWEtaGlkZGVuXCIsITApO2kucGFyZW50KFwiLmlzLWFjY29yZGlvbi1zdWJtZW51LXBhcmVudFwiKS5hdHRyKFwiYXJpYS1leHBhbmRlZFwiLCExKX19LHtrZXk6XCJkZXN0cm95XCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLiRlbGVtZW50LmZpbmQoXCJbZGF0YS1zdWJtZW51XVwiKS5zbGlkZURvd24oMCkuY3NzKFwiZGlzcGxheVwiLFwiXCIpLHRoaXMuJGVsZW1lbnQuZmluZChcImFcIikub2ZmKFwiY2xpY2suemYuYWNjb3JkaW9uTWVudVwiKSxGb3VuZGF0aW9uLk5lc3QuQnVybih0aGlzLiRlbGVtZW50LFwiYWNjb3JkaW9uXCIpLEZvdW5kYXRpb24udW5yZWdpc3RlclBsdWdpbih0aGlzKX19XSksZX0oKTtlLmRlZmF1bHRzPXtzbGlkZVNwZWVkOjI1MCxtdWx0aU9wZW46ITB9LEZvdW5kYXRpb24ucGx1Z2luKGUsXCJBY2NvcmRpb25NZW51XCIpfShqUXVlcnkpO3ZhciBfY3JlYXRlQ2xhc3M9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBuPWVbaV07bi5lbnVtZXJhYmxlPW4uZW51bWVyYWJsZXx8ITEsbi5jb25maWd1cmFibGU9ITAsXCJ2YWx1ZVwiaW4gbiYmKG4ud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG4ua2V5LG4pfX1yZXR1cm4gZnVuY3Rpb24oZSxpLG4pe3JldHVybiBpJiZ0KGUucHJvdG90eXBlLGkpLG4mJnQoZSxuKSxlfX0oKTshZnVuY3Rpb24odCl7dmFyIGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGksbil7X2NsYXNzQ2FsbENoZWNrKHRoaXMsZSksdGhpcy4kZWxlbWVudD1pLHRoaXMub3B0aW9ucz10LmV4dGVuZCh7fSxlLmRlZmF1bHRzLHRoaXMuJGVsZW1lbnQuZGF0YSgpLG4pLEZvdW5kYXRpb24uTmVzdC5GZWF0aGVyKHRoaXMuJGVsZW1lbnQsXCJkcmlsbGRvd25cIiksdGhpcy5faW5pdCgpLEZvdW5kYXRpb24ucmVnaXN0ZXJQbHVnaW4odGhpcyxcIkRyaWxsZG93blwiKSxGb3VuZGF0aW9uLktleWJvYXJkLnJlZ2lzdGVyKFwiRHJpbGxkb3duXCIse0VOVEVSOlwib3BlblwiLFNQQUNFOlwib3BlblwiLEFSUk9XX1JJR0hUOlwibmV4dFwiLEFSUk9XX1VQOlwidXBcIixBUlJPV19ET1dOOlwiZG93blwiLEFSUk9XX0xFRlQ6XCJwcmV2aW91c1wiLEVTQ0FQRTpcImNsb3NlXCIsVEFCOlwiZG93blwiLFNISUZUX1RBQjpcInVwXCJ9KX1yZXR1cm4gX2NyZWF0ZUNsYXNzKGUsW3trZXk6XCJfaW5pdFwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy4kc3VibWVudUFuY2hvcnM9dGhpcy4kZWxlbWVudC5maW5kKFwibGkuaXMtZHJpbGxkb3duLXN1Ym1lbnUtcGFyZW50XCIpLmNoaWxkcmVuKFwiYVwiKSx0aGlzLiRzdWJtZW51cz10aGlzLiRzdWJtZW51QW5jaG9ycy5wYXJlbnQoXCJsaVwiKS5jaGlsZHJlbihcIltkYXRhLXN1Ym1lbnVdXCIpLHRoaXMuJG1lbnVJdGVtcz10aGlzLiRlbGVtZW50LmZpbmQoXCJsaVwiKS5ub3QoXCIuanMtZHJpbGxkb3duLWJhY2tcIikuYXR0cihcInJvbGVcIixcIm1lbnVpdGVtXCIpLmZpbmQoXCJhXCIpLHRoaXMuX3ByZXBhcmVNZW51KCksdGhpcy5fa2V5Ym9hcmRFdmVudHMoKX19LHtrZXk6XCJfcHJlcGFyZU1lbnVcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy4kc3VibWVudUFuY2hvcnMuZWFjaChmdW5jdGlvbigpe3ZhciBpPXQodGhpcyksbj1pLmZpbmQoXCJhOmZpcnN0XCIpO2Uub3B0aW9ucy5wYXJlbnRMaW5rJiZuLmNsb25lKCkucHJlcGVuZFRvKGkuY2hpbGRyZW4oXCJbZGF0YS1zdWJtZW51XVwiKSkud3JhcCgnPGxpIGNsYXNzPVwiaXMtc3VibWVudS1wYXJlbnQtaXRlbSBpcy1zdWJtZW51LWl0ZW0gaXMtZHJpbGxkb3duLXN1Ym1lbnUtaXRlbVwiIHJvbGU9XCJtZW51LWl0ZW1cIj48L2xpPicpLG4uZGF0YShcInNhdmVkSHJlZlwiLG4uYXR0cihcImhyZWZcIikpLnJlbW92ZUF0dHIoXCJocmVmXCIpLGkuY2hpbGRyZW4oXCJbZGF0YS1zdWJtZW51XVwiKS5hdHRyKHtcImFyaWEtaGlkZGVuXCI6ITAsdGFiaW5kZXg6MCxyb2xlOlwibWVudVwifSksZS5fZXZlbnRzKGkpfSksdGhpcy4kc3VibWVudXMuZWFjaChmdW5jdGlvbigpe3ZhciBpPXQodGhpcyksbj1pLmZpbmQoXCIuanMtZHJpbGxkb3duLWJhY2tcIik7bi5sZW5ndGh8fGkucHJlcGVuZChlLm9wdGlvbnMuYmFja0J1dHRvbiksZS5fYmFjayhpKX0pLHRoaXMuJGVsZW1lbnQucGFyZW50KCkuaGFzQ2xhc3MoXCJpcy1kcmlsbGRvd25cIil8fCh0aGlzLiR3cmFwcGVyPXQodGhpcy5vcHRpb25zLndyYXBwZXIpLmFkZENsYXNzKFwiaXMtZHJpbGxkb3duXCIpLmNzcyh0aGlzLl9nZXRNYXhEaW1zKCkpLHRoaXMuJGVsZW1lbnQud3JhcCh0aGlzLiR3cmFwcGVyKSl9fSx7a2V5OlwiX2V2ZW50c1wiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciBpPXRoaXM7ZS5vZmYoXCJjbGljay56Zi5kcmlsbGRvd25cIikub24oXCJjbGljay56Zi5kcmlsbGRvd25cIixmdW5jdGlvbihuKXtpZih0KG4udGFyZ2V0KS5wYXJlbnRzVW50aWwoXCJ1bFwiLFwibGlcIikuaGFzQ2xhc3MoXCJpcy1kcmlsbGRvd24tc3VibWVudS1wYXJlbnRcIikmJihuLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLG4ucHJldmVudERlZmF1bHQoKSksaS5fc2hvdyhlLnBhcmVudChcImxpXCIpKSxpLm9wdGlvbnMuY2xvc2VPbkNsaWNrKXt2YXIgcz10KFwiYm9keVwiKS5ub3QoaS4kd3JhcHBlcik7cy5vZmYoXCIuemYuZHJpbGxkb3duXCIpLm9uKFwiY2xpY2suemYuZHJpbGxkb3duXCIsZnVuY3Rpb24odCl7dC5wcmV2ZW50RGVmYXVsdCgpLGkuX2hpZGVBbGwoKSxzLm9mZihcIi56Zi5kcmlsbGRvd25cIil9KX19KX19LHtrZXk6XCJfa2V5Ym9hcmRFdmVudHNcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXR
6780oaXM7dGhpcy4kbWVudUl0ZW1zLmFkZCh0aGlzLiRlbGVtZW50LmZpbmQoXCIuanMtZHJpbGxkb3duLWJhY2sgPiBhXCIpKS5vbihcImtleWRvd24uemYuZHJpbGxkb3duXCIsZnVuY3Rpb24oaSl7dmFyIG4scyxvPXQodGhpcyksYT1vLnBhcmVudChcImxpXCIpLnBhcmVudChcInVsXCIpLmNoaWxkcmVuKFwibGlcIikuY2hpbGRyZW4oXCJhXCIpO2EuZWFjaChmdW5jdGlvbihlKXtyZXR1cm4gdCh0aGlzKS5pcyhvKT8obj1hLmVxKE1hdGgubWF4KDAsZS0xKSksdm9pZChzPWEuZXEoTWF0aC5taW4oZSsxLGEubGVuZ3RoLTEpKSkpOnZvaWQgMH0pLEZvdW5kYXRpb24uS2V5Ym9hcmQuaGFuZGxlS2V5KGksXCJEcmlsbGRvd25cIix7bmV4dDpmdW5jdGlvbigpe28uaXMoZS4kc3VibWVudUFuY2hvcnMpJiYoZS5fc2hvdyhvLnBhcmVudChcImxpXCIpKSxvLnBhcmVudChcImxpXCIpLm9uZShGb3VuZGF0aW9uLnRyYW5zaXRpb25lbmQobyksZnVuY3Rpb24oKXtvLnBhcmVudChcImxpXCIpLmZpbmQoXCJ1bCBsaSBhXCIpLmZpbHRlcihlLiRtZW51SXRlbXMpLmZpcnN0KCkuZm9jdXMoKX0pLGkucHJldmVudERlZmF1bHQoKSl9LHByZXZpb3VzOmZ1bmN0aW9uKCl7ZS5faGlkZShvLnBhcmVudChcImxpXCIpLnBhcmVudChcInVsXCIpKSxvLnBhcmVudChcImxpXCIpLnBhcmVudChcInVsXCIpLm9uZShGb3VuZGF0aW9uLnRyYW5zaXRpb25lbmQobyksZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7by5wYXJlbnQoXCJsaVwiKS5wYXJlbnQoXCJ1bFwiKS5wYXJlbnQoXCJsaVwiKS5jaGlsZHJlbihcImFcIikuZmlyc3QoKS5mb2N1cygpfSwxKX0pLGkucHJldmVudERlZmF1bHQoKX0sdXA6ZnVuY3Rpb24oKXtuLmZvY3VzKCksaS5wcmV2ZW50RGVmYXVsdCgpfSxkb3duOmZ1bmN0aW9uKCl7cy5mb2N1cygpLGkucHJldmVudERlZmF1bHQoKX0sY2xvc2U6ZnVuY3Rpb24oKXtlLl9iYWNrKCl9LG9wZW46ZnVuY3Rpb24oKXtvLmlzKGUuJG1lbnVJdGVtcyk/by5pcyhlLiRzdWJtZW51QW5jaG9ycykmJihlLl9zaG93KG8ucGFyZW50KFwibGlcIikpLG8ucGFyZW50KFwibGlcIikub25lKEZvdW5kYXRpb24udHJhbnNpdGlvbmVuZChvKSxmdW5jdGlvbigpe28ucGFyZW50KFwibGlcIikuZmluZChcInVsIGxpIGFcIikuZmlsdGVyKGUuJG1lbnVJdGVtcykuZmlyc3QoKS5mb2N1cygpfSksaS5wcmV2ZW50RGVmYXVsdCgpKTooZS5faGlkZShvLnBhcmVudChcImxpXCIpLnBhcmVudChcInVsXCIpKSxvLnBhcmVudChcImxpXCIpLnBhcmVudChcInVsXCIpLm9uZShGb3VuZGF0aW9uLnRyYW5zaXRpb25lbmQobyksZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7by5wYXJlbnQoXCJsaVwiKS5wYXJlbnQoXCJ1bFwiKS5wYXJlbnQoXCJsaVwiKS5jaGlsZHJlbihcImFcIikuZmlyc3QoKS5mb2N1cygpfSwxKX0pLGkucHJldmVudERlZmF1bHQoKSl9LGhhbmRsZWQ6ZnVuY3Rpb24oKXtpLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfX0pfSl9fSx7a2V5OlwiX2hpZGVBbGxcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuJGVsZW1lbnQuZmluZChcIi5pcy1kcmlsbGRvd24tc3VibWVudS5pcy1hY3RpdmVcIikuYWRkQ2xhc3MoXCJpcy1jbG9zaW5nXCIpO3Qub25lKEZvdW5kYXRpb24udHJhbnNpdGlvbmVuZCh0KSxmdW5jdGlvbihlKXt0LnJlbW92ZUNsYXNzKFwiaXMtYWN0aXZlIGlzLWNsb3NpbmdcIil9KSx0aGlzLiRlbGVtZW50LnRyaWdnZXIoXCJjbG9zZWQuemYuZHJpbGxkb3duXCIpfX0se2tleTpcIl9iYWNrXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpczt0Lm9mZihcImNsaWNrLnpmLmRyaWxsZG93blwiKSx0LmNoaWxkcmVuKFwiLmpzLWRyaWxsZG93bi1iYWNrXCIpLm9uKFwiY2xpY2suemYuZHJpbGxkb3duXCIsZnVuY3Rpb24oaSl7aS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSxlLl9oaWRlKHQpfSl9fSx7a2V5OlwiX21lbnVMaW5rRXZlbnRzXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuJG1lbnVJdGVtcy5ub3QoXCIuaXMtZHJpbGxkb3duLXN1Ym1lbnUtcGFyZW50XCIpLm9mZihcImNsaWNrLnpmLmRyaWxsZG93blwiKS5vbihcImNsaWNrLnpmLmRyaWxsZG93blwiLGZ1bmN0aW9uKGUpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0Ll9oaWRlQWxsKCl9LDApfSl9fSx7a2V5OlwiX3Nob3dcIix2YWx1ZTpmdW5jdGlvbih0KXt0LmNoaWxkcmVuKFwiW2RhdGEtc3VibWVudV1cIikuYWRkQ2xhc3MoXCJpcy1hY3RpdmVcIiksdGhpcy4kZWxlbWVudC50cmlnZ2VyKFwib3Blbi56Zi5kcmlsbGRvd25cIixbdF0pfX0se2tleTpcIl9oaWRlXCIsdmFsdWU6ZnVuY3Rpb24odCl7dC5hZGRDbGFzcyhcImlzLWNsb3NpbmdcIikub25lKEZvdW5kYXRpb24udHJhbnNpdGlvbmVuZCh0KSxmdW5jdGlvbigpe3QucmVtb3ZlQ2xhc3MoXCJpcy1hY3RpdmUgaXMtY2xvc2luZ1wiKSx0LmJsdXIoKX0pLHQudHJpZ2dlcihcImhpZGUuemYuZHJpbGxkb3duXCIsW3RdKX19LHtrZXk6XCJfZ2V0TWF4RGltc1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9MCxpPXt9O3JldHVybiB0aGlzLiRzdWJtZW51cy5hZGQodGhpcy4kZWxlbWVudCkuZWFjaChmdW5jdGlvbigpe3ZhciBpPXQodGhpcykuY2hpbGRyZW4oXCJsaVwiKS5sZW5ndGg7ZT1pPmU/aTplfSksaVtcIm1pbi1oZWlnaHRcIl09ZSp0aGlzLiRtZW51SXRlbXNbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0K1wicHhcIixpW1wibWF4LXdpZHRoXCJdPXRoaXMuJGVsZW1lbnRbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGgrXCJweFwiLGl9fSx7a2V5OlwiZGVzdHJveVwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5faGlkZUFsbCgpLEZvdW5kYXRpb24uTmVzdC5CdXJuKHRoaXMuJGVsZW1lbnQsXCJkcmlsbGRvd25cIiksdGhpcy4kZWxlbWVudC51bndyYXAoKS5maW5kKFwiLmpzLWRyaWxsZG93bi1iYWNrLCAuaXMtc3VibWVudS1wYXJlbnQtaXRlbVwiKS5yZW1vdmUoKS5lbmQoKS5maW5kKFwiLmlzLWFjdGl2ZSwgLmlzLWNsb3NpbmcsIC5pcy1kcmlsbGRvd24tc3VibWVudVwiKS5yZW1vdmVDbGFzcyhcImlzLWFjdGl2ZSBpcy1jbG9zaW5nIGlzLWRyaWxsZG93bi1zdWJtZW51XCIpLmVuZCgpLmZpbmQoXCJbZGF0YS1zdWJtZW51XVwiKS5yZW1vdmVBdHRyKFwiYXJpYS1oaWRkZW4gdGFiaW5kZXggcm9sZVwiKS5vZmYoXCIuemYuZHJpbGxkb3duXCIpLmVuZCgpLm9mZihcInpmLmRyaWxsZG93blwiKSx0aGlzLiRlbGVtZW50LmZpbmQoXCJhXCIpLmVhY2goZnVuY3Rpb24oKXt2YXIgZT10KHRoaXMpO2UuZGF0YShcInNhdmVkSHJlZlwiKSYmZS5hdHRyKFwiaHJlZlwiLGUuZGF0YShcInNhdmVkSHJlZlwiKSkucmVtb3ZlRGF0YShcInNhdmVkSHJlZlwiKX0pLEZvdW5kYXRpb24udW5yZWdpc3RlclBsdWdpbih0aGlzKX19XSksZX0oKTtlLmRlZmF1bHRzPXtiYWNrQnV0dG9uOic8bGkgY2xhc3M9XCJqcy1kcmlsbGRvd24tYmFja1wiPjxhIHRhYmluZGV4PVwiMFwiPkJhY2s8L2E+PC9saT4nLHdyYXBwZXI6XCI8ZGl2PjwvZGl2PlwiLHBhcmVudExpbms6ITEsY2xvc2VPbkNsaWNrOiExfSxGb3VuZGF0aW9uLnBsdWdpbihlLFwiRHJpbGxkb3duXCIpfShqUXVlcnkpO3ZhciBfY3JlYXRlQ2xhc3M9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBuPWVbaV07bi5lbnVtZXJhYmxlPW4uZW51bWVyYWJsZXx8ITEsbi5jb25maWd1cmFibGU9ITAsXCJ2YWx1ZVwiaW4gbiYmKG4ud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG4ua2V5LG4pfX1yZXR1cm4gZnVuY3Rpb24oZSxpLG4pe3JldHVybiBpJiZ0KGUucHJvdG90eXBlLGkpLG4mJnQoZSxuKSxlfX0oKTshZnVuY3Rpb24odCl7dmFyIGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGksbil7X2NsYXNzQ2FsbENoZWNrKHRoaXMsZSksdGhpcy4kZWxlbWVudD1pLHRoaXMub3B0aW9ucz10LmV4dGVuZCh7fSxlLmRlZmF1bHRzLHRoaXMuJGVsZW1lbnQuZGF0YSgpLG4pLHRoaXMuX2luaXQoKSxGb3VuZGF0aW9uLnJlZ2lzdGVyUGx1Z2luKHRoaXMsXCJEcm9wZG93blwiKSxGb3VuZGF0aW9uLktleWJvYXJkLnJlZ2lzdGVyKFwiRHJvcGRvd25cIix7RU5URVI6XCJvcGVuXCIsU1BBQ0U6XCJvcGVuXCIsRVNDQVBFOlwiY2xvc2VcIixUQUI6XCJ0YWJfZm9yd2FyZFwiLFNISUZUX1RBQjpcInRhYl9iYWNrd2FyZFwifSl9cmV0dXJuIF9jcmVhdGVDbGFzcyhlLFt7a2V5OlwiX2luaXRcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXR
6780oaXMuJGVsZW1lbnQuYXR0cihcImlkXCIpO3RoaXMuJGFuY2hvcj10KCdbZGF0YS10b2dnbGU9XCInK2UrJ1wiXScpfHx0KCdbZGF0YS1vcGVuPVwiJytlKydcIl0nKSx0aGlzLiRhbmNob3IuYXR0cih7XCJhcmlhLWNvbnRyb2xzXCI6ZSxcImRhdGEtaXMtZm9jdXNcIjohMSxcImRhdGEteWV0aS1ib3hcIjplLFwiYXJpYS1oYXNwb3B1cFwiOiEwLFwiYXJpYS1leHBhbmRlZFwiOiExfSksdGhpcy5vcHRpb25zLnBvc2l0aW9uQ2xhc3M9dGhpcy5nZXRQb3NpdGlvbkNsYXNzKCksdGhpcy5jb3VudGVyPTQsdGhpcy51c2VkUG9zaXRpb25zPVtdLHRoaXMuJGVsZW1lbnQuYXR0cih7XCJhcmlhLWhpZGRlblwiOlwidHJ1ZVwiLFwiZGF0YS15ZXRpLWJveFwiOmUsXCJkYXRhLXJlc2l6ZVwiOmUsXCJhcmlhLWxhYmVsbGVkYnlcIjp0aGlzLiRhbmNob3JbMF0uaWR8fEZvdW5kYXRpb24uR2V0WW9EaWdpdHMoNixcImRkLWFuY2hvclwiKX0pLHRoaXMuX2V2ZW50cygpfX0se2tleTpcImdldFBvc2l0aW9uQ2xhc3NcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuJGVsZW1lbnRbMF0uY2xhc3NOYW1lLm1hdGNoKC8odG9wfGxlZnR8cmlnaHR8Ym90dG9tKS9nKTt0PXQ/dFswXTpcIlwiO3ZhciBlPS9mbG9hdC0oLispXFxzLy5leGVjKHRoaXMuJGFuY2hvclswXS5jbGFzc05hbWUpO2U9ZT9lWzFdOlwiXCI7dmFyIGk9ZT9lK1wiIFwiK3Q6dDtyZXR1cm4gaX19LHtrZXk6XCJfcmVwb3NpdGlvblwiLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMudXNlZFBvc2l0aW9ucy5wdXNoKHQ/dDpcImJvdHRvbVwiKSwhdCYmdGhpcy51c2VkUG9zaXRpb25zLmluZGV4T2YoXCJ0b3BcIik8MD90aGlzLiRlbGVtZW50LmFkZENsYXNzKFwidG9wXCIpOlwidG9wXCI9PT10JiZ0aGlzLnVzZWRQb3NpdGlvbnMuaW5kZXhPZihcImJvdHRvbVwiKTwwP3RoaXMuJGVsZW1lbnQucmVtb3ZlQ2xhc3ModCk6XCJsZWZ0XCI9PT10JiZ0aGlzLnVzZWRQb3NpdGlvbnMuaW5kZXhPZihcInJpZ2h0XCIpPDA/dGhpcy4kZWxlbWVudC5yZW1vdmVDbGFzcyh0KS5hZGRDbGFzcyhcInJpZ2h0XCIpOlwicmlnaHRcIj09PXQmJnRoaXMudXNlZFBvc2l0aW9ucy5pbmRleE9mKFwibGVmdFwiKTwwP3RoaXMuJGVsZW1lbnQucmVtb3ZlQ2xhc3ModCkuYWRkQ2xhc3MoXCJsZWZ0XCIpOiF0JiZ0aGlzLnVzZWRQb3NpdGlvbnMuaW5kZXhPZihcInRvcFwiKT4tMSYmdGhpcy51c2VkUG9zaXRpb25zLmluZGV4T2YoXCJsZWZ0XCIpPDA/dGhpcy4kZWxlbWVudC5hZGRDbGFzcyhcImxlZnRcIik6XCJ0b3BcIj09PXQmJnRoaXMudXNlZFBvc2l0aW9ucy5pbmRleE9mKFwiYm90dG9tXCIpPi0xJiZ0aGlzLnVzZWRQb3NpdGlvbnMuaW5kZXhPZihcImxlZnRcIik8MD90aGlzLiRlbGVtZW50LnJlbW92ZUNsYXNzKHQpLmFkZENsYXNzKFwibGVmdFwiKTpcImxlZnRcIj09PXQmJnRoaXMudXNlZFBvc2l0aW9ucy5pbmRleE9mKFwicmlnaHRcIik+LTEmJnRoaXMudXNlZFBvc2l0aW9ucy5pbmRleE9mKFwiYm90dG9tXCIpPDA/dGhpcy4kZWxlbWVudC5yZW1vdmVDbGFzcyh0KTpcInJpZ2h0XCI9PT10JiZ0aGlzLnVzZWRQb3NpdGlvbnMuaW5kZXhPZihcImxlZnRcIik+LTEmJnRoaXMudXNlZFBvc2l0aW9ucy5pbmRleE9mKFwiYm90dG9tXCIpPDA/dGhpcy4kZWxlbWVudC5yZW1vdmVDbGFzcyh0KTp0aGlzLiRlbGVtZW50LnJlbW92ZUNsYXNzKHQpLHRoaXMuY2xhc3NDaGFuZ2VkPSEwLHRoaXMuY291bnRlci0tfX0se2tleTpcIl9zZXRQb3NpdGlvblwiLHZhbHVlOmZ1bmN0aW9uKCl7aWYoXCJmYWxzZVwiPT09dGhpcy4kYW5jaG9yLmF0dHIoXCJhcmlhLWV4cGFuZGVkXCIpKXJldHVybiExO3ZhciB0PXRoaXMuZ2V0UG9zaXRpb25DbGFzcygpLGU9Rm91bmRhdGlvbi5Cb3guR2V0RGltZW5zaW9ucyh0aGlzLiRlbGVtZW50KSxpPShGb3VuZGF0aW9uLkJveC5HZXREaW1lbnNpb25zKHRoaXMuJGFuY2hvciksXCJsZWZ0XCI9PT10P1wibGVmdFwiOlwicmlnaHRcIj09PXQ/XCJsZWZ0XCI6XCJ0b3BcIiksbj1cInRvcFwiPT09aT9cImhlaWdodFwiOlwid2lkdGhcIjtcImhlaWdodFwiPT09bj90aGlzLm9wdGlvbnMudk9mZnNldDp0aGlzLm9wdGlvbnMuaE9mZnNldDtpZihlLndpZHRoPj1lLndpbmRvd0RpbXMud2lkdGh8fCF0aGlzLmNvdW50ZXImJiFGb3VuZGF0aW9uLkJveC5JbU5vdFRvdWNoaW5nWW91KHRoaXMuJGVsZW1lbnQpKXJldHVybiB0aGlzLiRlbGVtZW50Lm9mZnNldChGb3VuZGF0aW9uLkJveC5HZXRPZmZzZXRzKHRoaXMuJGVsZW1lbnQsdGhpcy4kYW5jaG9yLFwiY2VudGVyIGJvdHRvbVwiLHRoaXMub3B0aW9ucy52T2Zmc2V0LHRoaXMub3B0aW9ucy5oT2Zmc2V0LCEwKSkuY3NzKHt3aWR0aDplLndpbmRvd0RpbXMud2lkdGgtMip0aGlzLm9wdGlvbnMuaE9mZnNldCxoZWlnaHQ6XCJhdXRvXCJ9KSx0aGlzLmNsYXNzQ2hhbmdlZD0hMCwhMTtmb3IodGhpcy4kZWxlbWVudC5vZmZzZXQoRm91bmRhdGlvbi5Cb3guR2V0T2Zmc2V0cyh0aGlzLiRlbGVtZW50LHRoaXMuJGFuY2hvcix0LHRoaXMub3B0aW9ucy52T2Zmc2V0LHRoaXMub3B0aW9ucy5oT2Zmc2V0KSk7IUZvdW5kYXRpb24uQm94LkltTm90VG91Y2hpbmdZb3UodGhpcy4kZWxlbWVudCwhMSwhMCkmJnRoaXMuY291bnRlcjspdGhpcy5fcmVwb3NpdGlvbih0KSx0aGlzLl9zZXRQb3NpdGlvbigpfX0se2tleTpcIl9ldmVudHNcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy4kZWxlbWVudC5vbih7XCJvcGVuLnpmLnRyaWdnZXJcIjp0aGlzLm9wZW4uYmluZCh0aGlzKSxcImNsb3NlLnpmLnRyaWdnZXJcIjp0aGlzLmNsb3NlLmJpbmQodGhpcyksXCJ0b2dnbGUuemYudHJpZ2dlclwiOnRoaXMudG9nZ2xlLmJpbmQodGhpcyksXCJyZXNpemVtZS56Zi50cmlnZ2VyXCI6dGhpcy5fc2V0UG9zaXRpb24uYmluZCh0aGlzKX0pLHRoaXMub3B0aW9ucy5ob3ZlciYmKHRoaXMuJGFuY2hvci5vZmYoXCJtb3VzZWVudGVyLnpmLmRyb3Bkb3duIG1vdXNlbGVhdmUuemYuZHJvcGRvd25cIikub24oXCJtb3VzZWVudGVyLnpmLmRyb3Bkb3duXCIsZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQoZS50aW1lb3V0KSxlLnRpbWVvdXQ9c2V0VGltZW91dChmdW5jdGlvbigpe2Uub3BlbigpLGUuJGFuY2hvci5kYXRhKFwiaG92ZXJc
6780IiwhMCl9LGUub3B0aW9ucy5ob3ZlckRlbGF5KX0pLm9uKFwibW91c2VsZWF2ZS56Zi5kcm9wZG93blwiLGZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KGUudGltZW91dCksZS50aW1lb3V0PXNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmNsb3NlKCksZS4kYW5jaG9yLmRhdGEoXCJob3ZlclwiLCExKX0sZS5vcHRpb25zLmhvdmVyRGVsYXkpfSksdGhpcy5vcHRpb25zLmhvdmVyUGFuZSYmdGhpcy4kZWxlbWVudC5vZmYoXCJtb3VzZWVudGVyLnpmLmRyb3Bkb3duIG1vdXNlbGVhdmUuemYuZHJvcGRvd25cIikub24oXCJtb3VzZWVudGVyLnpmLmRyb3Bkb3duXCIsZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQoZS50aW1lb3V0KX0pLm9uKFwibW91c2VsZWF2ZS56Zi5kcm9wZG93blwiLGZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KGUudGltZW91dCksZS50aW1lb3V0PXNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmNsb3NlKCksZS4kYW5jaG9yLmRhdGEoXCJob3ZlclwiLCExKX0sZS5vcHRpb25zLmhvdmVyRGVsYXkpfSkpLHRoaXMuJGFuY2hvci5hZGQodGhpcy4kZWxlbWVudCkub24oXCJrZXlkb3duLnpmLmRyb3Bkb3duXCIsZnVuY3Rpb24oaSl7dmFyIG49dCh0aGlzKSxzPUZvdW5kYXRpb24uS2V5Ym9hcmQuZmluZEZvY3VzYWJsZShlLiRlbGVtZW50KTtGb3VuZGF0aW9uLktleWJvYXJkLmhhbmRsZUtleShpLFwiRHJvcGRvd25cIix7dGFiX2ZvcndhcmQ6ZnVuY3Rpb24oKXtlLiRlbGVtZW50LmZpbmQoXCI6Zm9jdXNcIikuaXMocy5lcSgtMSkpJiYoZS5vcHRpb25zLnRyYXBGb2N1cz8ocy5lcSgwKS5mb2N1cygpLGkucHJldmVudERlZmF1bHQoKSk6ZS5jbG9zZSgpKX0sdGFiX2JhY2t3YXJkOmZ1bmN0aW9uKCl7KGUuJGVsZW1lbnQuZmluZChcIjpmb2N1c1wiKS5pcyhzLmVxKDApKXx8ZS4kZWxlbWVudC5pcyhcIjpmb2N1c1wiKSkmJihlLm9wdGlvbnMudHJhcEZvY3VzPyhzLmVxKC0xKS5mb2N1cygpLGkucHJldmVudERlZmF1bHQoKSk6ZS5jbG9zZSgpKX0sb3BlbjpmdW5jdGlvbigpe24uaXMoZS4kYW5jaG9yKSYmKGUub3BlbigpLGUuJGVsZW1lbnQuYXR0cihcInRhYmluZGV4XCIsLTEpLmZvY3VzKCksaS5wcmV2ZW50RGVmYXVsdCgpKX0sY2xvc2U6ZnVuY3Rpb24oKXtlLmNsb3NlKCksZS4kYW5jaG9yLmZvY3VzKCl9fSl9KX19LHtrZXk6XCJfYWRkQm9keUhhbmRsZXJcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXQoZG9jdW1lbnQuYm9keSkubm90KHRoaXMuJGVsZW1lbnQpLGk9dGhpcztlLm9mZihcImNsaWNrLnpmLmRyb3Bkb3duXCIpLm9uKFwiY2xpY2suemYuZHJvcGRvd25cIixmdW5jdGlvbih0KXtpLiRhbmNob3IuaXModC50YXJnZXQpfHxpLiRhbmNob3IuZmluZCh0LnRhcmdldCkubGVuZ3RofHxpLiRlbGVtZW50LmZpbmQodC50YXJnZXQpLmxlbmd0aHx8KGkuY2xvc2UoKSxlLm9mZihcImNsaWNrLnpmLmRyb3Bkb3duXCIpKX0pfX0se2tleTpcIm9wZW5cIix2YWx1ZTpmdW5jdGlvbigpe2lmKHRoaXMuJGVsZW1lbnQudHJpZ2dlcihcImNsb3NlbWUuemYuZHJvcGRvd25cIix0aGlzLiRlbGVtZW50LmF0dHIoXCJpZFwiKSksdGhpcy4kYW5jaG9yLmFkZENsYXNzKFwiaG92ZXJcIikuYXR0cih7XCJhcmlhLWV4cGFuZGVkXCI6ITB9KSx0aGlzLl9zZXRQb3NpdGlvbigpLHRoaXMuJGVsZW1lbnQuYWRkQ2xhc3MoXCJpcy1vcGVuXCIpLmF0dHIoe1wiYXJpYS1oaWRkZW5cIjohMX0pLHRoaXMub3B0aW9ucy5hdXRvRm9jdXMpe3ZhciB0PUZvdW5kYXRpb24uS2V5Ym9hcmQuZmluZEZvY3VzYWJsZSh0aGlzLiRlbGVtZW50KTt0Lmxlbmd0aCYmdC5lcSgwKS5mb2N1cygpfXRoaXMub3B0aW9ucy5jbG9zZU9uQ2xpY2smJnRoaXMuX2FkZEJvZHlIYW5kbGVyKCksdGhpcy4kZWxlbWVudC50cmlnZ2VyKFwic2hvdy56Zi5kcm9wZG93blwiLFt0aGlzLiRlbGVtZW50XSl9fSx7a2V5OlwiY2xvc2VcIix2YWx1ZTpmdW5jdGlvbigpe2lmKCF0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKFwiaXMtb3BlblwiKSlyZXR1cm4hMTtpZih0aGlzLiRlbGVtZW50LnJlbW92ZUNsYXNzKFwiaXMtb3BlblwiKS5hdHRyKHtcImFyaWEtaGlkZGVuXCI6ITB9KSx0aGlzLiRhbmNob3IucmVtb3ZlQ2xhc3MoXCJob3ZlclwiKS5hdHRyKFwiYXJpYS1leHBhbmRlZFwiLCExKSx0aGlzLmNsYXNzQ2hhbmdlZCl7dmFyIHQ9dGhpcy5nZXRQb3NpdGlvbkNsYXNzKCk7dCYmdGhpcy4kZWxlbWVudC5yZW1vdmVDbGFzcyh0KSx0aGlzLiRlbGVtZW50LmFkZENsYXNzKHRoaXMub3B0aW9ucy5wb3NpdGlvbkNsYXNzKS5jc3Moe2hlaWdodDpcIlwiLHdpZHRoOlwiXCJ9KSx0aGlzLmNsYXNzQ2hhbmdlZD0hMSx0aGlzLmNvdW50ZXI9NCx0aGlzLnVzZWRQb3NpdGlvbnMubGVuZ3RoPTB9dGhpcy4kZWxlbWVudC50cmlnZ2VyKFwiaGlkZS56Zi5kcm9wZG93blwiLFt0aGlzLiRlbGVtZW50XSl9fSx7a2V5OlwidG9nZ2xlXCIsdmFsdWU6ZnVuY3Rpb24oKXtpZih0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKFwiaXMtb3BlblwiKSl7aWYodGhpcy4kYW5jaG9yLmRhdGEoXCJob3ZlclwiKSlyZXR1cm47dGhpcy5jbG9zZSgpfWVsc2UgdGhpcy5vcGVuKCl9fSx7a2V5OlwiZGVzdHJveVwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy4kZWxlbWVudC5vZmYoXCIuemYudHJpZ2dlclwiKS5oaWRlKCksdGhpcy4kYW5jaG9yLm9mZihcIi56Zi5kcm9wZG93blwiKSxGb3VuZGF0aW9uLnVucmVnaXN0ZXJQbHVnaW4odGhpcyl9fV0pLGV9KCk7ZS5kZWZhdWx0cz17aG92ZXJEZWxheToyNTAsaG92ZXI6ITEsaG92ZXJQYW5lOiExLHZPZmZzZXQ6MSxoT2Zmc2V0OjEscG9zaXRpb25DbGFzczpcIlwiLHRyYXBGb2N1czohMSxhdXRvRm9jdXM6ITEsY2xvc2VPbkNsaWNrOiExfSxGb3VuZGF0aW9uLnBsdWdpbihlLFwiRHJvcGRvd25cIil9KGpRdWVyeSk7dmFyIF9jcmVhdGVDbGFzcz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXtmb3IodmFyIGk9MDtpPGUubGVuZ3RoO2krKyl7dmFyIG49ZVtpXTtuLmVudW1lcmFibGU9bi5lbnVtZXJhYmxlfHwhMSxuLmNvbmZpZ3VyYWJsZT0hMCxcInZhbHVlXCJpbiBuJiYobi53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsbi5rZXksbil9fXJldHVybi
6780BmdW5jdGlvbihlLGksbil7cmV0dXJuIGkmJnQoZS5wcm90b3R5cGUsaSksbiYmdChlLG4pLGV9fSgpOyFmdW5jdGlvbih0KXt2YXIgZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoaSxuKXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxlKSx0aGlzLiRlbGVtZW50PWksdGhpcy5vcHRpb25zPXQuZXh0ZW5kKHt9LGUuZGVmYXVsdHMsdGhpcy4kZWxlbWVudC5kYXRhKCksbiksRm91bmRhdGlvbi5OZXN0LkZlYXRoZXIodGhpcy4kZWxlbWVudCxcImRyb3Bkb3duXCIpLHRoaXMuX2luaXQoKSxGb3VuZGF0aW9uLnJlZ2lzdGVyUGx1Z2luKHRoaXMsXCJEcm9wZG93bk1lbnVcIiksRm91bmRhdGlvbi5LZXlib2FyZC5yZWdpc3RlcihcIkRyb3Bkb3duTWVudVwiLHtFTlRFUjpcIm9wZW5cIixTUEFDRTpcIm9wZW5cIixBUlJPV19SSUdIVDpcIm5leHRcIixBUlJPV19VUDpcInVwXCIsQVJST1dfRE9XTjpcImRvd25cIixBUlJPV19MRUZUOlwicHJldmlvdXNcIixFU0NBUEU6XCJjbG9zZVwifSl9cmV0dXJuIF9jcmVhdGVDbGFzcyhlLFt7a2V5OlwiX2luaXRcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuJGVsZW1lbnQuZmluZChcImxpLmlzLWRyb3Bkb3duLXN1Ym1lbnUtcGFyZW50XCIpO3RoaXMuJGVsZW1lbnQuY2hpbGRyZW4oXCIuaXMtZHJvcGRvd24tc3VibWVudS1wYXJlbnRcIikuY2hpbGRyZW4oXCIuaXMtZHJvcGRvd24tc3VibWVudVwiKS5hZGRDbGFzcyhcImZpcnN0LXN1YlwiKSx0aGlzLiRtZW51SXRlbXM9dGhpcy4kZWxlbWVudC5maW5kKCdbcm9sZT1cIm1lbnVpdGVtXCJdJyksdGhpcy4kdGFicz10aGlzLiRlbGVtZW50LmNoaWxkcmVuKCdbcm9sZT1cIm1lbnVpdGVtXCJdJyksdGhpcy4kdGFicy5maW5kKFwidWwuaXMtZHJvcGRvd24tc3VibWVudVwiKS5hZGRDbGFzcyh0aGlzLm9wdGlvbnMudmVydGljYWxDbGFzcyksdGhpcy4kZWxlbWVudC5oYXNDbGFzcyh0aGlzLm9wdGlvbnMucmlnaHRDbGFzcyl8fFwicmlnaHRcIj09PXRoaXMub3B0aW9ucy5hbGlnbm1lbnR8fEZvdW5kYXRpb24ucnRsKCl8fHRoaXMuJGVsZW1lbnQucGFyZW50cyhcIi50b3AtYmFyLXJpZ2h0XCIpLmlzKFwiKlwiKT8odGhpcy5vcHRpb25zLmFsaWdubWVudD1cInJpZ2h0XCIsdC5hZGRDbGFzcyhcIm9wZW5zLWxlZnRcIikpOnQuYWRkQ2xhc3MoXCJvcGVucy1yaWdodFwiKSx0aGlzLmNoYW5nZWQ9ITEsdGhpcy5fZXZlbnRzKCl9fSx7a2V5OlwiX2V2ZW50c1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyxpPVwib250b3VjaHN0YXJ0XCJpbiB3aW5kb3d8fFwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3cub250b3VjaHN0YXJ0LG49XCJpcy1kcm9wZG93bi1zdWJtZW51LXBhcmVudFwiOyh0aGlzLm9wdGlvbnMuY2xpY2tPcGVufHxpKSYmdGhpcy4kbWVudUl0ZW1zLm9uKFwiY2xpY2suemYuZHJvcGRvd25tZW51IHRvdWNoc3RhcnQuemYuZHJvcGRvd25tZW51XCIsZnVuY3Rpb24ocyl7dmFyIG89dChzLnRhcmdldCkucGFyZW50c1VudGlsKFwidWxcIixcIi5cIituKSxhPW8uaGFzQ2xhc3Mobikscj1cInRydWVcIj09PW8uYXR0cihcImRhdGEtaXMtY2xpY2tcIik7by5jaGlsZHJlbihcIi5pcy1kcm9wZG93bi1zdWJtZW51XCIpO2lmKGEpaWYocil7aWYoIWUub3B0aW9ucy5jbG9zZU9uQ2xpY2t8fCFlLm9wdGlvbnMuY2xpY2tPcGVuJiYhaXx8ZS5vcHRpb25zLmZvcmNlRm9sbG93JiZpKXJldHVybjtzLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLHMucHJldmVudERlZmF1bHQoKSxlLl9oaWRlKG8pfWVsc2Ugcy5wcmV2ZW50RGVmYXVsdCgpLHMuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksZS5fc2hvdyhvLmNoaWxkcmVuKFwiLmlzLWRyb3Bkb3duLXN1Ym1lbnVcIikpLG8uYWRkKG8ucGFyZW50c1VudGlsKGUuJGVsZW1lbnQsXCIuXCIrbikpLmF0dHIoXCJkYXRhLWlzLWNsaWNrXCIsITApfSksdGhpcy5vcHRpb25zLmRpc2FibGVIb3Zlcnx8dGhpcy4kbWVudUl0ZW1zLm9uKFwibW91c2VlbnRlci56Zi5kcm9wZG93bm1lbnVcIixmdW5jdGlvbihpKXtpLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO3ZhciBzPXQodGhpcyksbz1zLmhhc0NsYXNzKG4pO28mJihjbGVhclRpbWVvdXQoZS5kZWxheSksZS5kZWxheT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5fc2hvdyhzLmNoaWxkcmVuKFwiLmlzLWRyb3Bkb3duLXN1Ym1lbnVcIikpfSxlLm9wdGlvbnMuaG92ZXJEZWxheSkpfSkub24oXCJtb3VzZWxlYXZlLnpmLmRyb3Bkb3dubWVudVwiLGZ1bmN0aW9uKGkpe3ZhciBzPXQodGhpcyksbz1zLmhhc0NsYXNzKG4pO2lmKG8mJmUub3B0aW9ucy5hdXRvY2xvc2Upe2lmKFwidHJ1ZVwiPT09cy5hdHRyKFwiZGF0YS1pcy1jbGlja1wiKSYmZS5vcHRpb25zLmNsaWNrT3BlbilyZXR1cm4hMTtjbGVhclRpbWVvdXQoZS5kZWxheSksZS5kZWxheT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5faGlkZShzKX0sZS5vcHRpb25zLmNsb3NpbmdUaW1lKX19KSx0aGlzLiRtZW51SXRlbXMub24oXCJrZXlkb3duLnpmLmRyb3Bkb3dubWVudVwiLGZ1bmN0aW9uKGkpe3ZhciBuLHMsbz10KGkudGFyZ2V0KS5wYXJlbnRzVW50aWwoXCJ1bFwiLCdbcm9sZT1cIm1lbnVpdGVtXCJdJyksYT1lLiR0YWJzLmluZGV4KG8pPi0xLHI9YT9lLiR0YWJzOm8uc2libGluZ3MoXCJsaVwiKS5hZGQobyk7ci5lYWNoKGZ1bmN0aW9uKGUpe3JldHVybiB0KHRoaXMpLmlzKG8pPyhuPXIuZXEoZS0xKSx2b2lkKHM9ci5lcShlKzEpKSk6dm9pZCAwfSk7dmFyIGw9ZnVuY3Rpb24oKXtvLmlzKFwiOmxhc3QtY2hpbGRcIil8fHMuY2hpbGRyZW4oXCJhOmZpcnN0XCIpLmZvY3VzKCl9LHU9ZnVuY3Rpb24oKXtuLmNoaWxkcmVuKFwiYTpmaXJzdFwiKS5mb2N1cygpfSxkPWZ1bmN0aW9uKCl7dmFyIHQ9by5jaGlsZHJlbihcInVsLmlzLWRyb3Bkb3duLXN1Ym1lbnVcIik7dC5sZW5ndGgmJihlLl9zaG93KHQpLG8uZmluZChcImxpID4gYTpmaXJzdFwiKS5mb2N1cygpKX0saD1mdW5jdGlvbigpe3ZhciB0PW8ucGFyZW50KFwidWxcIikucGFyZW50KFwibGlcIik7dC5jaGlsZHJlbihcImE6Zmlyc3RcIikuZm9jdXMoKSxlLl9oaWRlKHQpfSxjPXtvcGVuOmQsY2xvc2U6ZnVuY3Rpb24oKXtlLl9oaWRlKGUuJGVsZW1lbnQpLGUuJG1lbnVJdGVtcy5maW5kKFwiYTpmaXJzdFwiKS5mb2N1cygpfSxoYW5kbGVkOmZ1bmN0aW9uKCl7aS5wcmV2ZW50RGVmYXVsdCgpLGkuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9fTthP2UudmVydGljYWw/XCJ
6780sZWZ0XCI9PT1lLm9wdGlvbnMuYWxpZ25tZW50P3QuZXh0ZW5kKGMse2Rvd246bCx1cDp1LG5leHQ6ZCxwcmV2aW91czpofSk6dC5leHRlbmQoYyx7ZG93bjpsLHVwOnUsbmV4dDpoLHByZXZpb3VzOmR9KTp0LmV4dGVuZChjLHtuZXh0OmwscHJldmlvdXM6dSxkb3duOmQsdXA6aH0pOlwibGVmdFwiPT09ZS5vcHRpb25zLmFsaWdubWVudD90LmV4dGVuZChjLHtuZXh0OmQscHJldmlvdXM6aCxkb3duOmwsdXA6dX0pOnQuZXh0ZW5kKGMse25leHQ6aCxwcmV2aW91czpkLGRvd246bCx1cDp1fSksRm91bmRhdGlvbi5LZXlib2FyZC5oYW5kbGVLZXkoaSxcIkRyb3Bkb3duTWVudVwiLGMpfSl9fSx7a2V5OlwiX2FkZEJvZHlIYW5kbGVyXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10KGRvY3VtZW50LmJvZHkpLGk9dGhpcztlLm9mZihcIm1vdXNldXAuemYuZHJvcGRvd25tZW51IHRvdWNoZW5kLnpmLmRyb3Bkb3dubWVudVwiKS5vbihcIm1vdXNldXAuemYuZHJvcGRvd25tZW51IHRvdWNoZW5kLnpmLmRyb3Bkb3dubWVudVwiLGZ1bmN0aW9uKHQpe3ZhciBuPWkuJGVsZW1lbnQuZmluZCh0LnRhcmdldCk7bi5sZW5ndGh8fChpLl9oaWRlKCksZS5vZmYoXCJtb3VzZXVwLnpmLmRyb3Bkb3dubWVudSB0b3VjaGVuZC56Zi5kcm9wZG93bm1lbnVcIikpfSl9fSx7a2V5OlwiX3Nob3dcIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgaT10aGlzLiR0YWJzLmluZGV4KHRoaXMuJHRhYnMuZmlsdGVyKGZ1bmN0aW9uKGksbil7cmV0dXJuIHQobikuZmluZChlKS5sZW5ndGg+MH0pKSxuPWUucGFyZW50KFwibGkuaXMtZHJvcGRvd24tc3VibWVudS1wYXJlbnRcIikuc2libGluZ3MoXCJsaS5pcy1kcm9wZG93bi1zdWJtZW51LXBhcmVudFwiKTt0aGlzLl9oaWRlKG4saSksZS5jc3MoXCJ2aXNpYmlsaXR5XCIsXCJoaWRkZW5cIikuYWRkQ2xhc3MoXCJqcy1kcm9wZG93bi1hY3RpdmVcIikuYXR0cih7XCJhcmlhLWhpZGRlblwiOiExfSkucGFyZW50KFwibGkuaXMtZHJvcGRvd24tc3VibWVudS1wYXJlbnRcIikuYWRkQ2xhc3MoXCJpcy1hY3RpdmVcIikuYXR0cih7XCJhcmlhLWV4cGFuZGVkXCI6ITB9KTt2YXIgcz1Gb3VuZGF0aW9uLkJveC5JbU5vdFRvdWNoaW5nWW91KGUsbnVsbCwhMCk7aWYoIXMpe3ZhciBvPVwibGVmdFwiPT09dGhpcy5vcHRpb25zLmFsaWdubWVudD9cIi1yaWdodFwiOlwiLWxlZnRcIixhPWUucGFyZW50KFwiLmlzLWRyb3Bkb3duLXN1Ym1lbnUtcGFyZW50XCIpO2EucmVtb3ZlQ2xhc3MoXCJvcGVuc1wiK28pLmFkZENsYXNzKFwib3BlbnMtXCIrdGhpcy5vcHRpb25zLmFsaWdubWVudCkscz1Gb3VuZGF0aW9uLkJveC5JbU5vdFRvdWNoaW5nWW91KGUsbnVsbCwhMCksc3x8YS5yZW1vdmVDbGFzcyhcIm9wZW5zLVwiK3RoaXMub3B0aW9ucy5hbGlnbm1lbnQpLmFkZENsYXNzKFwib3BlbnMtaW5uZXJcIiksdGhpcy5jaGFuZ2VkPSEwfWUuY3NzKFwidmlzaWJpbGl0eVwiLFwiXCIpLHRoaXMub3B0aW9ucy5jbG9zZU9uQ2xpY2smJnRoaXMuX2FkZEJvZHlIYW5kbGVyKCksdGhpcy4kZWxlbWVudC50cmlnZ2VyKFwic2hvdy56Zi5kcm9wZG93bm1lbnVcIixbZV0pfX0se2tleTpcIl9oaWRlXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaTtpPXQmJnQubGVuZ3RoP3Q6dm9pZCAwIT09ZT90aGlzLiR0YWJzLm5vdChmdW5jdGlvbih0LGkpe3JldHVybiB0PT09ZX0pOnRoaXMuJGVsZW1lbnQ7dmFyIG49aS5oYXNDbGFzcyhcImlzLWFjdGl2ZVwiKXx8aS5maW5kKFwiLmlzLWFjdGl2ZVwiKS5sZW5ndGg+MDtpZihuKXtpZihpLmZpbmQoXCJsaS5pcy1hY3RpdmVcIikuYWRkKGkpLmF0dHIoe1wiYXJpYS1leHBhbmRlZFwiOiExLFwiZGF0YS1pcy1jbGlja1wiOiExfSkucmVtb3ZlQ2xhc3MoXCJpcy1hY3RpdmVcIiksaS5maW5kKFwidWwuanMtZHJvcGRvd24tYWN0aXZlXCIpLmF0dHIoe1wiYXJpYS1oaWRkZW5cIjohMH0pLnJlbW92ZUNsYXNzKFwianMtZHJvcGRvd24tYWN0aXZlXCIpLHRoaXMuY2hhbmdlZHx8aS5maW5kKFwib3BlbnMtaW5uZXJcIikubGVuZ3RoKXt2YXIgcz1cImxlZnRcIj09PXRoaXMub3B0aW9ucy5hbGlnbm1lbnQ/XCJyaWdodFwiOlwibGVmdFwiO2kuZmluZChcImxpLmlzLWRyb3Bkb3duLXN1Ym1lbnUtcGFyZW50XCIpLmFkZChpKS5yZW1vdmVDbGFzcyhcIm9wZW5zLWlubmVyIG9wZW5zLVwiK3RoaXMub3B0aW9ucy5hbGlnbm1lbnQpLmFkZENsYXNzKFwib3BlbnMtXCIrcyksdGhpcy5jaGFuZ2VkPSExfXRoaXMuJGVsZW1lbnQudHJpZ2dlcihcImhpZGUuemYuZHJvcGRvd25tZW51XCIsW2ldKX19fSx7a2V5OlwiZGVzdHJveVwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy4kbWVudUl0ZW1zLm9mZihcIi56Zi5kcm9wZG93bm1lbnVcIikucmVtb3ZlQXR0cihcImRhdGEtaXMtY2xpY2tcIikucmVtb3ZlQ2xhc3MoXCJpcy1yaWdodC1hcnJvdyBpcy1sZWZ0LWFycm93IGlzLWRvd24tYXJyb3cgb3BlbnMtcmlnaHQgb3BlbnMtbGVmdCBvcGVucy1pbm5lclwiKSx0KGRvY3VtZW50LmJvZHkpLm9mZihcIi56Zi5kcm9wZG93bm1lbnVcIiksRm91bmRhdGlvbi5OZXN0LkJ1cm4odGhpcy4kZWxlbWVudCxcImRyb3Bkb3duXCIpLEZvdW5kYXRpb24udW5yZWdpc3RlclBsdWdpbih0aGlzKX19XSksZX0oKTtlLmRlZmF1bHRzPXtkaXNhYmxlSG92ZXI6ITEsYXV0b2Nsb3NlOiEwLGhvdmVyRGVsYXk6NTAsY2xpY2tPcGVuOiExLGNsb3NpbmdUaW1lOjUwMCxhbGlnbm1lbnQ6XCJsZWZ0XCIsY2xvc2VPbkNsaWNrOiEwLHZlcnRpY2FsQ2xhc3M6XCJ2ZXJ0aWNhbFwiLHJpZ2h0Q2xhc3M6XCJhbGlnbi1yaWdodFwiLGZvcmNlRm9sbG93OiEwfSxGb3VuZGF0aW9uLnBsdWdpbihlLFwiRHJvcGRvd25NZW51XCIpfShqUXVlcnkpO3ZhciBfY3JlYXRlQ2xhc3M9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBuPWVbaV07bi5lbnVtZXJhYmxlPW4uZW51bWVyYWJsZXx8ITEsbi5jb25maWd1cmFibGU9ITAsXCJ2YWx1ZVwiaW4gbiYmKG4ud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG4ua2V5LG4pfX1yZXR1cm4gZnVuY3Rpb24oZSxpLG4pe3JldHVybiBpJiZ0KGUucHJvdG90eXBlLGkpLG4mJnQoZSxuKSxlfX0oKTshZnVuY3Rpb24odCl7dmFyIGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGksbil7X2NsYXNzQ2FsbENoZWNrKHRoaXMsZSksdGhpcy4kZWxlbWVudD1pLHRoaXMub3B0aW9ucz10LmV4dGVuZCh7fSxlLmRlZmF1bHRzLHRoaXMuJGVsZW1lbnQuZGF0YSgpLG4pLHRoaXMuX2luaXQoKSxGb3VuZGF0aW9uLnJlZ2lzdGVyUGx1Z2luKHRoaXMsXCJFcXVhbGl6ZXJcIil9cmV0dXJuIF9jcmVhdGVDbGFzcyhlLFt7a2V5OlwiX2luaXRcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXR
6780oaXMuJGVsZW1lbnQuYXR0cihcImRhdGEtZXF1YWxpemVyXCIpfHxcIlwiLGk9dGhpcy4kZWxlbWVudC5maW5kKCdbZGF0YS1lcXVhbGl6ZXItd2F0Y2g9XCInK2UrJ1wiXScpO3RoaXMuJHdhdGNoZWQ9aS5sZW5ndGg/aTp0aGlzLiRlbGVtZW50LmZpbmQoXCJbZGF0YS1lcXVhbGl6ZXItd2F0Y2hdXCIpLHRoaXMuJGVsZW1lbnQuYXR0cihcImRhdGEtcmVzaXplXCIsZXx8Rm91bmRhdGlvbi5HZXRZb0RpZ2l0cyg2LFwiZXFcIikpLHRoaXMuaGFzTmVzdGVkPXRoaXMuJGVsZW1lbnQuZmluZChcIltkYXRhLWVxdWFsaXplcl1cIikubGVuZ3RoPjAsdGhpcy5pc05lc3RlZD10aGlzLiRlbGVtZW50LnBhcmVudHNVbnRpbChkb2N1bWVudC5ib2R5LFwiW2RhdGEtZXF1YWxpemVyXVwiKS5sZW5ndGg+MCx0aGlzLmlzT249ITE7dmFyIG4scz10aGlzLiRlbGVtZW50LmZpbmQoXCJpbWdcIik7dGhpcy5vcHRpb25zLmVxdWFsaXplT24/KG49dGhpcy5fY2hlY2tNUSgpLHQod2luZG93KS5vbihcImNoYW5nZWQuemYubWVkaWFxdWVyeVwiLHRoaXMuX2NoZWNrTVEuYmluZCh0aGlzKSkpOnRoaXMuX2V2ZW50cygpLCh2b2lkIDAhPT1uJiZuPT09ITF8fHZvaWQgMD09PW4pJiYocy5sZW5ndGg/Rm91bmRhdGlvbi5vbkltYWdlc0xvYWRlZChzLHRoaXMuX3JlZmxvdy5iaW5kKHRoaXMpKTp0aGlzLl9yZWZsb3coKSl9fSx7a2V5OlwiX3BhdXNlRXZlbnRzXCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmlzT249ITEsdGhpcy4kZWxlbWVudC5vZmYoXCIuemYuZXF1YWxpemVyIHJlc2l6ZW1lLnpmLnRyaWdnZXJcIil9fSx7a2V5OlwiX2V2ZW50c1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLl9wYXVzZUV2ZW50cygpLHRoaXMuaGFzTmVzdGVkP3RoaXMuJGVsZW1lbnQub24oXCJwb3N0ZXF1YWxpemVkLnpmLmVxdWFsaXplclwiLGZ1bmN0aW9uKGUpe2UudGFyZ2V0IT09dC4kZWxlbWVudFswXSYmdC5fcmVmbG93KCl9KTp0aGlzLiRlbGVtZW50Lm9uKFwicmVzaXplbWUuemYudHJpZ2dlclwiLHRoaXMuX3JlZmxvdy5iaW5kKHRoaXMpKSx0aGlzLmlzT249ITB9fSx7a2V5OlwiX2NoZWNrTVFcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PSFGb3VuZGF0aW9uLk1lZGlhUXVlcnkuYXRMZWFzdCh0aGlzLm9wdGlvbnMuZXF1YWxpemVPbik7cmV0dXJuIHQ/dGhpcy5pc09uJiYodGhpcy5fcGF1c2VFdmVudHMoKSx0aGlzLiR3YXRjaGVkLmNzcyhcImhlaWdodFwiLFwiYXV0b1wiKSk6dGhpcy5pc09ufHx0aGlzLl9ldmVudHMoKSx0fX0se2tleTpcIl9raWxsc3dpdGNoXCIsdmFsdWU6ZnVuY3Rpb24oKXt9fSx7a2V5OlwiX3JlZmxvd1wiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMub3B0aW9ucy5lcXVhbGl6ZU9uU3RhY2smJnRoaXMuX2lzU3RhY2tlZCgpPyh0aGlzLiR3YXRjaGVkLmNzcyhcImhlaWdodFwiLFwiYXV0b1wiKSwhMSk6dm9pZCh0aGlzLm9wdGlvbnMuZXF1YWxpemVCeVJvdz90aGlzLmdldEhlaWdodHNCeVJvdyh0aGlzLmFwcGx5SGVpZ2h0QnlSb3cuYmluZCh0aGlzKSk6dGhpcy5nZXRIZWlnaHRzKHRoaXMuYXBwbHlIZWlnaHQuYmluZCh0aGlzKSkpfX0se2tleTpcIl9pc1N0YWNrZWRcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLiR3YXRjaGVkWzBdLm9mZnNldFRvcCE9PXRoaXMuJHdhdGNoZWRbMV0ub2Zmc2V0VG9wfX0se2tleTpcImdldEhlaWdodHNcIix2YWx1ZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9W10saT0wLG49dGhpcy4kd2F0Y2hlZC5sZW5ndGg7bj5pO2krKyl0aGlzLiR3YXRjaGVkW2ldLnN0eWxlLmhlaWdodD1cImF1dG9cIixlLnB1c2godGhpcy4kd2F0Y2hlZFtpXS5vZmZzZXRIZWlnaHQpO3QoZSl9fSx7a2V5OlwiZ2V0SGVpZ2h0c0J5Um93XCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIGk9dGhpcy4kd2F0Y2hlZC5sZW5ndGg/dGhpcy4kd2F0Y2hlZC5maXJzdCgpLm9mZnNldCgpLnRvcDowLG49W10scz0wO25bc109W107Zm9yKHZhciBvPTAsYT10aGlzLiR3YXRjaGVkLmxlbmd0aDthPm87bysrKXt0aGlzLiR3YXRjaGVkW29dLnN0eWxlLmhlaWdodD1cImF1dG9cIjt2YXIgcj10KHRoaXMuJHdhdGNoZWRbb10pLm9mZnNldCgpLnRvcDtyIT1pJiYocysrLG5bc109W10saT1yKSxuW3NdLnB1c2goW3RoaXMuJHdhdGNoZWRbb10sdGhpcy4kd2F0Y2hlZFtvXS5vZmZzZXRIZWlnaHRdKX1mb3IodmFyIGw9MCx1PW4ubGVuZ3RoO3U+bDtsKyspe3ZhciBkPXQobltsXSkubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbMV19KS5nZXQoKSxoPU1hdGgubWF4LmFwcGx5KG51bGwsZCk7bltsXS5wdXNoKGgpfWUobil9fSx7a2V5OlwiYXBwbHlIZWlnaHRcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1NYXRoLm1heC5hcHBseShudWxsLHQpO3RoaXMuJGVsZW1lbnQudHJpZ2dlcihcInByZWVxdWFsaXplZC56Zi5lcXVhbGl6ZXJcIiksdGhpcy4kd2F0Y2hlZC5jc3MoXCJoZWlnaHRcIixlKSx0aGlzLiRlbGVtZW50LnRyaWdnZXIoXCJwb3N0ZXF1YWxpemVkLnpmLmVxdWFsaXplclwiKX19LHtrZXk6XCJhcHBseUhlaWdodEJ5Um93XCIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy4kZWxlbWVudC50cmlnZ2VyKFwicHJlZXF1YWxpemVkLnpmLmVxdWFsaXplclwiKTtmb3IodmFyIGk9MCxuPWUubGVuZ3RoO24+aTtpKyspe3ZhciBzPWVbaV0ubGVuZ3RoLG89ZVtpXVtzLTFdO2lmKDI+PXMpdChlW2ldWzBdWzBdKS5jc3Moe2hlaWdodDpcImF1dG9cIn0pO2Vsc2V7dGhpcy4kZWxlbWVudC50cmlnZ2VyKFwicHJlZXF1YWxpemVkcm93LnpmLmVxdWFsaXplclwiKTtmb3IodmFyIGE9MCxyPXMtMTtyPmE7YSsrKXQoZVtpXVthXVswXSkuY3NzKHtoZWlnaHQ6b30pO3RoaXMuJGVsZW1lbnQudHJpZ2dlcihcInBvc3RlcXVhbGl6ZWRyb3cuemYuZXF1YWxpemVyXCIpfX10aGlzLiRlbGVtZW50LnRyaWdnZXIoXCJwb3N0ZXF1YWxpemVkLnpmLmVxdWFsaXplclwiKX19LHtrZXk6XCJkZXN0cm95XCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLl9wYXVzZUV2ZW50cygpLHRoaXMuJHdhdGNoZWQuY3NzKFwiaGVpZ2h0XCIsXCJhdXRvXCIpLEZvdW5kYXRpb24udW5yZWdpc3RlclBsdWdpbih0aGlzKX19XSksZX0oKTtlLmRlZmF1bHRzPXtlcXVhbGl6ZU9uU3RhY2s6ITAsZXF1YWxpemVCeVJvdzohMSxlcXVhbGl6ZU9uOlwiXCJ9LEZvdW5kYXRpb24ucGx1Z2luKGUsXCJFcXVhbGl6ZXJcIil9KGpRdWVyeSk7dmFyIF9jcmVhdGVDbGFzcz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXtmb3IodmFyIGk9MDtpPGUubGVuZ3RoO2krKyl7dmFyIG49ZVtpXTtuLmVudW1lcmFibGU9bi5lbnVtZXJhYmxlfHwhMSxuLmNvbmZpZ3VyYWJsZT0hMCxcInZhbHVlXCJpbiBuJiYobi53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsbi5rZXksbil9fXJldHVybi
6780BmdW5jdGlvbihlLGksbil7cmV0dXJuIGkmJnQoZS5wcm90b3R5cGUsaSksbiYmdChlLG4pLGV9fSgpOyFmdW5jdGlvbih0KXt2YXIgZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoaSxuKXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxlKSx0aGlzLiRlbGVtZW50PWksdGhpcy5vcHRpb25zPXQuZXh0ZW5kKHt9LGUuZGVmYXVsdHMsbiksdGhpcy5ydWxlcz1bXSx0aGlzLmN1cnJlbnRQYXRoPVwiXCIsdGhpcy5faW5pdCgpLHRoaXMuX2V2ZW50cygpLEZvdW5kYXRpb24ucmVnaXN0ZXJQbHVnaW4odGhpcyxcIkludGVyY2hhbmdlXCIpfXJldHVybiBfY3JlYXRlQ2xhc3MoZSxbe2tleTpcIl9pbml0XCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLl9hZGRCcmVha3BvaW50cygpLHRoaXMuX2dlbmVyYXRlUnVsZXMoKSx0aGlzLl9yZWZsb3coKX19LHtrZXk6XCJfZXZlbnRzXCIsdmFsdWU6ZnVuY3Rpb24oKXt0KHdpbmRvdykub24oXCJyZXNpemUuemYuaW50ZXJjaGFuZ2VcIixGb3VuZGF0aW9uLnV0aWwudGhyb3R0bGUodGhpcy5fcmVmbG93LmJpbmQodGhpcyksNTApKX19LHtrZXk6XCJfcmVmbG93XCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdDtmb3IodmFyIGUgaW4gdGhpcy5ydWxlcyl7dmFyIGk9dGhpcy5ydWxlc1tlXTt3aW5kb3cubWF0Y2hNZWRpYShpLnF1ZXJ5KS5tYXRjaGVzJiYodD1pKX10JiZ0aGlzLnJlcGxhY2UodC5wYXRoKX19LHtrZXk6XCJfYWRkQnJlYWtwb2ludHNcIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdCBpbiBGb3VuZGF0aW9uLk1lZGlhUXVlcnkucXVlcmllcyl7dmFyIGk9Rm91bmRhdGlvbi5NZWRpYVF1ZXJ5LnF1ZXJpZXNbdF07ZS5TUEVDSUFMX1FVRVJJRVNbaS5uYW1lXT1pLnZhbHVlfX19LHtrZXk6XCJfZ2VuZXJhdGVSdWxlc1wiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBpLG49W107aT10aGlzLm9wdGlvbnMucnVsZXM/dGhpcy5vcHRpb25zLnJ1bGVzOnRoaXMuJGVsZW1lbnQuZGF0YShcImludGVyY2hhbmdlXCIpLm1hdGNoKC9cXFsuKj9cXF0vZyk7Zm9yKHZhciBzIGluIGkpe3ZhciBvPWlbc10uc2xpY2UoMSwtMSkuc3BsaXQoXCIsIFwiKSxhPW8uc2xpY2UoMCwtMSkuam9pbihcIlwiKSxyPW9bby5sZW5ndGgtMV07ZS5TUEVDSUFMX1FVRVJJRVNbcl0mJihyPWUuU1BFQ0lBTF9RVUVSSUVTW3JdKSxuLnB1c2goe3BhdGg6YSxxdWVyeTpyfSl9dGhpcy5ydWxlcz1ufX0se2tleTpcInJlcGxhY2VcIix2YWx1ZTpmdW5jdGlvbihlKXtpZih0aGlzLmN1cnJlbnRQYXRoIT09ZSl7dmFyIGk9dGhpcyxuPVwicmVwbGFjZWQuemYuaW50ZXJjaGFuZ2VcIjtcIklNR1wiPT09dGhpcy4kZWxlbWVudFswXS5ub2RlTmFtZT90aGlzLiRlbGVtZW50LmF0dHIoXCJzcmNcIixlKS5sb2FkKGZ1bmN0aW9uKCl7aS5jdXJyZW50UGF0aD1lfSkudHJpZ2dlcihuKTplLm1hdGNoKC9cXC4oZ2lmfGpwZ3xqcGVnfHBuZ3xzdmd8dGlmZikoWz8jXS4qKT8vaSk/dGhpcy4kZWxlbWVudC5jc3Moe1wiYmFja2dyb3VuZC1pbWFnZVwiOlwidXJsKFwiK2UrXCIpXCJ9KS50cmlnZ2VyKG4pOnQuZ2V0KGUsZnVuY3Rpb24ocyl7aS4kZWxlbWVudC5odG1sKHMpLnRyaWdnZXIobiksdChzKS5mb3VuZGF0aW9uKCksaS5jdXJyZW50UGF0aD1lfSl9fX0se2tleTpcImRlc3Ryb3lcIix2YWx1ZTpmdW5jdGlvbigpe319XSksZX0oKTtlLmRlZmF1bHRzPXtydWxlczpudWxsfSxlLlNQRUNJQUxfUVVFUklFUz17bGFuZHNjYXBlOlwic2NyZWVuIGFuZCAob3JpZW50YXRpb246IGxhbmRzY2FwZSlcIixwb3J0cmFpdDpcInNjcmVlbiBhbmQgKG9yaWVudGF0aW9uOiBwb3J0cmFpdClcIixyZXRpbmE6XCJvbmx5IHNjcmVlbiBhbmQgKC13ZWJraXQtbWluLWRldmljZS1waXhlbC1yYXRpbzogMiksIG9ubHkgc2NyZWVuIGFuZCAobWluLS1tb3otZGV2aWNlLXBpeGVsLXJhdGlvOiAyKSwgb25seSBzY3JlZW4gYW5kICgtby1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOiAyLzEpLCBvbmx5IHNjcmVlbiBhbmQgKG1pbi1kZXZpY2UtcGl4ZWwtcmF0aW86IDIpLCBvbmx5IHNjcmVlbiBhbmQgKG1pbi1yZXNvbHV0aW9uOiAxOTJkcGkpLCBvbmx5IHNjcmVlbiBhbmQgKG1pbi1yZXNvbHV0aW9uOiAyZHBweClcIn0sRm91bmRhdGlvbi5wbHVnaW4oZSxcIkludGVyY2hhbmdlXCIpfShqUXVlcnkpO3ZhciBfY3JlYXRlQ2xhc3M9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBuPWVbaV07bi5lbnVtZXJhYmxlPW4uZW51bWVyYWJsZXx8ITEsbi5jb25maWd1cmFibGU9ITAsXCJ2YWx1ZVwiaW4gbiYmKG4ud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG4ua2V5LG4pfX1yZXR1cm4gZnVuY3Rpb24oZSxpLG4pe3JldHVybiBpJiZ0KGUucHJvdG90eXBlLGkpLG4mJnQoZSxuKSxlfX0oKTshZnVuY3Rpb24odCl7dmFyIGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGksbil7X2NsYXNzQ2FsbENoZWNrKHRoaXMsZSksdGhpcy4kZWxlbWVudD1pLHRoaXMub3B0aW9ucz10LmV4dGVuZCh7fSxlLmRlZmF1bHRzLHRoaXMuJGVsZW1lbnQuZGF0YSgpLG4pLHRoaXMuX2luaXQoKSxGb3VuZGF0aW9uLnJlZ2lzdGVyUGx1Z2luKHRoaXMsXCJNYWdlbGxhblwiKX1yZXR1cm4gX2NyZWF0ZUNsYXNzKGUsW3trZXk6XCJfaW5pdFwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy4kZWxlbWVudFswXS5pZHx8Rm91bmRhdGlvbi5HZXRZb0RpZ2l0cyg2LFwibWFnZWxsYW5cIik7dGhpcy4kdGFyZ2V0cz10KFwiW2RhdGEtbWFnZWxsYW4tdGFyZ2V0XVwiKSx0aGlzLiRsaW5rcz10aGlzLiRlbGVtZW50LmZpbmQoXCJhXCIpLHRoaXMuJGVsZW1lbnQuYXR0cih7XCJkYXRhLXJlc2l6ZVwiOmUsXCJkYXRhLXNjcm9sbFwiOmUsaWQ6ZX0pLHRoaXMuJGFjdGl2ZT10KCksdGhpcy5zY3JvbGxQb3M9cGFyc2VJbnQod2luZG93LnBhZ2VZT2Zmc2V0LDEwKSx0aGlzLl9ldmVudHMoKX19LHtrZXk6XCJjYWxjUG9pbnRzXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLGk9ZG9jdW1lbnQuYm9keSxuPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudDt0aGlzLnBvaW50cz1bXSx0aGlzLndpbkhlaWdodD1NYXRoLnJvdW5kKE1hdGgubWF4KHdpbmRvdy5pbm5lckhlaWdodCxuLmNsaWVudE
6780hlaWdodCkpLHRoaXMuZG9jSGVpZ2h0PU1hdGgucm91bmQoTWF0aC5tYXgoaS5zY3JvbGxIZWlnaHQsaS5vZmZzZXRIZWlnaHQsbi5jbGllbnRIZWlnaHQsbi5zY3JvbGxIZWlnaHQsbi5vZmZzZXRIZWlnaHQpKSx0aGlzLiR0YXJnZXRzLmVhY2goZnVuY3Rpb24oKXt2YXIgaT10KHRoaXMpLG49TWF0aC5yb3VuZChpLm9mZnNldCgpLnRvcC1lLm9wdGlvbnMudGhyZXNob2xkKTtpLnRhcmdldFBvaW50PW4sZS5wb2ludHMucHVzaChuKX0pfX0se2tleTpcIl9ldmVudHNcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXM7dChcImh0bWwsIGJvZHlcIikse2R1cmF0aW9uOmUub3B0aW9ucy5hbmltYXRpb25EdXJhdGlvbixlYXNpbmc6ZS5vcHRpb25zLmFuaW1hdGlvbkVhc2luZ307dCh3aW5kb3cpLm9uZShcImxvYWRcIixmdW5jdGlvbigpe2Uub3B0aW9ucy5kZWVwTGlua2luZyYmbG9jYXRpb24uaGFzaCYmZS5zY3JvbGxUb0xvYyhsb2NhdGlvbi5oYXNoKSxlLmNhbGNQb2ludHMoKSxlLl91cGRhdGVBY3RpdmUoKX0pLHRoaXMuJGVsZW1lbnQub24oe1wicmVzaXplbWUuemYudHJpZ2dlclwiOnRoaXMucmVmbG93LmJpbmQodGhpcyksXCJzY3JvbGxtZS56Zi50cmlnZ2VyXCI6dGhpcy5fdXBkYXRlQWN0aXZlLmJpbmQodGhpcyl9KS5vbihcImNsaWNrLnpmLm1hZ2VsbGFuXCIsJ2FbaHJlZl49XCIjXCJdJyxmdW5jdGlvbih0KXt0LnByZXZlbnREZWZhdWx0KCk7dmFyIGk9dGhpcy5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpO2Uuc2Nyb2xsVG9Mb2MoaSl9KX19LHtrZXk6XCJzY3JvbGxUb0xvY1wiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciBpPU1hdGgucm91bmQodChlKS5vZmZzZXQoKS50b3AtdGhpcy5vcHRpb25zLnRocmVzaG9sZC8yLXRoaXMub3B0aW9ucy5iYXJPZmZzZXQpO3QoXCJodG1sLCBib2R5XCIpLnN0b3AoITApLmFuaW1hdGUoe3Njcm9sbFRvcDppfSx0aGlzLm9wdGlvbnMuYW5pbWF0aW9uRHVyYXRpb24sdGhpcy5vcHRpb25zLmFuaW1hdGlvbkVhc2luZyl9fSx7a2V5OlwicmVmbG93XCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmNhbGNQb2ludHMoKSx0aGlzLl91cGRhdGVBY3RpdmUoKX19LHtrZXk6XCJfdXBkYXRlQWN0aXZlXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdCxlPXBhcnNlSW50KHdpbmRvdy5wYWdlWU9mZnNldCwxMCk7aWYoZSt0aGlzLndpbkhlaWdodD09PXRoaXMuZG9jSGVpZ2h0KXQ9dGhpcy5wb2ludHMubGVuZ3RoLTE7ZWxzZSBpZihlPHRoaXMucG9pbnRzWzBdKXQ9MDtlbHNle3ZhciBpPXRoaXMuc2Nyb2xsUG9zPGUsbj10aGlzLHM9dGhpcy5wb2ludHMuZmlsdGVyKGZ1bmN0aW9uKHQscyl7cmV0dXJuIGk/ZT49dDp0LW4ub3B0aW9ucy50aHJlc2hvbGQ8PWV9KTt0PXMubGVuZ3RoP3MubGVuZ3RoLTE6MH1pZih0aGlzLiRhY3RpdmUucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmFjdGl2ZUNsYXNzKSx0aGlzLiRhY3RpdmU9dGhpcy4kbGlua3MuZXEodCkuYWRkQ2xhc3ModGhpcy5vcHRpb25zLmFjdGl2ZUNsYXNzKSx0aGlzLm9wdGlvbnMuZGVlcExpbmtpbmcpe3ZhciBvPXRoaXMuJGFjdGl2ZVswXS5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpO3dpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZT93aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUobnVsbCxudWxsLG8pOndpbmRvdy5sb2NhdGlvbi5oYXNoPW99dGhpcy5zY3JvbGxQb3M9ZSx0aGlzLiRlbGVtZW50LnRyaWdnZXIoXCJ1cGRhdGUuemYubWFnZWxsYW5cIixbdGhpcy4kYWN0aXZlXSl9fSx7a2V5OlwiZGVzdHJveVwiLHZhbHVlOmZ1bmN0aW9uKCl7aWYodGhpcy4kZWxlbWVudC5vZmYoXCIuemYudHJpZ2dlciAuemYubWFnZWxsYW5cIikuZmluZChcIi5cIit0aGlzLm9wdGlvbnMuYWN0aXZlQ2xhc3MpLnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5hY3RpdmVDbGFzcyksdGhpcy5vcHRpb25zLmRlZXBMaW5raW5nKXt2YXIgdD10aGlzLiRhY3RpdmVbMF0uZ2V0QXR0cmlidXRlKFwiaHJlZlwiKTt3aW5kb3cubG9jYXRpb24uaGFzaC5yZXBsYWNlKHQsXCJcIil9Rm91bmRhdGlvbi51bnJlZ2lzdGVyUGx1Z2luKHRoaXMpfX1dKSxlfSgpO2UuZGVmYXVsdHM9e2FuaW1hdGlvbkR1cmF0aW9uOjUwMCxhbmltYXRpb25FYXNpbmc6XCJsaW5lYXJcIix0aHJlc2hvbGQ6NTAsYWN0aXZlQ2xhc3M6XCJhY3RpdmVcIixkZWVwTGlua2luZzohMSxiYXJPZmZzZXQ6MH0sRm91bmRhdGlvbi5wbHVnaW4oZSxcIk1hZ2VsbGFuXCIpfShqUXVlcnkpO3ZhciBfY3JlYXRlQ2xhc3M9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBuPWVbaV07bi5lbnVtZXJhYmxlPW4uZW51bWVyYWJsZXx8ITEsbi5jb25maWd1cmFibGU9ITAsXCJ2YWx1ZVwiaW4gbiYmKG4ud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG4ua2V5LG4pfX1yZXR1cm4gZnVuY3Rpb24oZSxpLG4pe3JldHVybiBpJiZ0KGUucHJvdG90eXBlLGkpLG4mJnQoZSxuKSxlfX0oKTshZnVuY3Rpb24odCl7dmFyIGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGksbil7X2NsYXNzQ2FsbENoZWNrKHRoaXMsZSksdGhpcy4kZWxlbWVudD1pLHRoaXMub3B0aW9ucz10LmV4dGVuZCh7fSxlLmRlZmF1bHRzLHRoaXMuJGVsZW1lbnQuZGF0YSgpLG4pLHRoaXMuJGxhc3RUcmlnZ2VyPXQoKSx0aGlzLl9pbml0KCksdGhpcy5fZXZlbnRzKCksRm91bmRhdGlvbi5yZWdpc3RlclBsdWdpbih0aGlzLFwiT2ZmQ2FudmFzXCIpfXJldHVybiBfY3JlYXRlQ2xhc3MoZSxbe2tleTpcIl9pbml0XCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLiRlbGVtZW50LmF0dHIoXCJpZFwiKTtpZih0aGlzLiRlbGVtZW50LmF0dHIoXCJhcmlhLWhpZGRlblwiLFwidHJ1ZVwiKSx0KGRvY3VtZW50KS5maW5kKCdbZGF0YS1vcGVuPVwiJytlKydcIl0sIFtkYXRhLWNsb3NlPVwiJytlKydcIl0sIFtkYXRhLXRvZ2dsZT1cIicrZSsnXCJdJykuYXR0cihcImFyaWEtZXhwYW5kZWRcIixcImZhbHNlXCIpLmF0dHIoXCJhcmlhLWNvbnRyb2xzXCIsZSksdGhpcy5vcHRpb25zLmNsb3NlT25DbGljaylpZih0KFwiLmpzLW9mZi1jYW52YXMtZXhpdFwiKS5sZW5ndGgpdGhpcy4kZXhpdGVyPXQoXCIuanMtb2ZmLWNhbnZhcy1leGl0XCIpO2Vsc2V7dmFyIGk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtpLnNldEF0dHJpYnV0ZShcImNsYXNzXCIsXCJqcy1vZmYtY2FudmFzLWV4aXRcIiksdChcIltkYXRhLW9mZi1jYW52YXMtY29udGVudF1cIikuYXBwZW5kKGkpLHRoaXMuJGV4aXRlcj10KGkpfXRoaXMub3B0aW9ucy5pc1JldmVhbGVkPXRoaXMub3B0aW9ucy5pc1JldmVhbGVkfHxuZXcgUmVnRXhwKHRoaXMub3B0aW9ucy5yZXZlYWxDbGFzcyxcImdcIikudGVzdCh0aGlzLiRlbGVtZW50WzBdLmNsYXNzTmFtZSksdGhpcy5vcHRpb25zLmlzUmV2ZWFsZWQmJih0aGlzLm9wdGlvbnMucmV2ZWFsT249dGh
6780pcy5vcHRpb25zLnJldmVhbE9ufHx0aGlzLiRlbGVtZW50WzBdLmNsYXNzTmFtZS5tYXRjaCgvKHJldmVhbC1mb3ItbWVkaXVtfHJldmVhbC1mb3ItbGFyZ2UpL2cpWzBdLnNwbGl0KFwiLVwiKVsyXSx0aGlzLl9zZXRNUUNoZWNrZXIoKSksdGhpcy5vcHRpb25zLnRyYW5zaXRpb25UaW1lfHwodGhpcy5vcHRpb25zLnRyYW5zaXRpb25UaW1lPTFlMypwYXJzZUZsb2F0KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHQoXCJbZGF0YS1vZmYtY2FudmFzLXdyYXBwZXJdXCIpWzBdKS50cmFuc2l0aW9uRHVyYXRpb24pKX19LHtrZXk6XCJfZXZlbnRzXCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLiRlbGVtZW50Lm9mZihcIi56Zi50cmlnZ2VyIC56Zi5vZmZjYW52YXNcIikub24oe1wib3Blbi56Zi50cmlnZ2VyXCI6dGhpcy5vcGVuLmJpbmQodGhpcyksXCJjbG9zZS56Zi50cmlnZ2VyXCI6dGhpcy5jbG9zZS5iaW5kKHRoaXMpLFwidG9nZ2xlLnpmLnRyaWdnZXJcIjp0aGlzLnRvZ2dsZS5iaW5kKHRoaXMpLFwia2V5ZG93bi56Zi5vZmZjYW52YXNcIjp0aGlzLl9oYW5kbGVLZXlib2FyZC5iaW5kKHRoaXMpfSksdGhpcy5vcHRpb25zLmNsb3NlT25DbGljayYmdGhpcy4kZXhpdGVyLmxlbmd0aCYmdGhpcy4kZXhpdGVyLm9uKHtcImNsaWNrLnpmLm9mZmNhbnZhc1wiOnRoaXMuY2xvc2UuYmluZCh0aGlzKX0pfX0se2tleTpcIl9zZXRNUUNoZWNrZXJcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXM7dCh3aW5kb3cpLm9uKFwiY2hhbmdlZC56Zi5tZWRpYXF1ZXJ5XCIsZnVuY3Rpb24oKXtGb3VuZGF0aW9uLk1lZGlhUXVlcnkuYXRMZWFzdChlLm9wdGlvbnMucmV2ZWFsT24pP2UucmV2ZWFsKCEwKTplLnJldmVhbCghMSl9KS5vbmUoXCJsb2FkLnpmLm9mZmNhbnZhc1wiLGZ1bmN0aW9uKCl7Rm91bmRhdGlvbi5NZWRpYVF1ZXJ5LmF0TGVhc3QoZS5vcHRpb25zLnJldmVhbE9uKSYmZS5yZXZlYWwoITApfSl9fSx7a2V5OlwicmV2ZWFsXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy4kZWxlbWVudC5maW5kKFwiW2RhdGEtY2xvc2VdXCIpO3Q/KHRoaXMuY2xvc2UoKSx0aGlzLmlzUmV2ZWFsZWQ9ITAsdGhpcy4kZWxlbWVudC5vZmYoXCJvcGVuLnpmLnRyaWdnZXIgdG9nZ2xlLnpmLnRyaWdnZXJcIiksZS5sZW5ndGgmJmUuaGlkZSgpKToodGhpcy5pc1JldmVhbGVkPSExLHRoaXMuJGVsZW1lbnQub24oe1wib3Blbi56Zi50cmlnZ2VyXCI6dGhpcy5vcGVuLmJpbmQodGhpcyksXCJ0b2dnbGUuemYudHJpZ2dlclwiOnRoaXMudG9nZ2xlLmJpbmQodGhpcyl9KSxlLmxlbmd0aCYmZS5zaG93KCkpfX0se2tleTpcIm9wZW5cIix2YWx1ZTpmdW5jdGlvbihlLGkpe2lmKCF0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKFwiaXMtb3BlblwiKSYmIXRoaXMuaXNSZXZlYWxlZCl7dmFyIG49dGhpczt0KGRvY3VtZW50LmJvZHkpO3RoaXMub3B0aW9ucy5mb3JjZVRvcCYmdChcImJvZHlcIikuc2Nyb2xsVG9wKDApLEZvdW5kYXRpb24uTW92ZSh0aGlzLm9wdGlvbnMudHJhbnNpdGlvblRpbWUsdGhpcy4kZWxlbWVudCxmdW5jdGlvbigpe3QoXCJbZGF0YS1vZmYtY2FudmFzLXdyYXBwZXJdXCIpLmFkZENsYXNzKFwiaXMtb2ZmLWNhbnZhcy1vcGVuIGlzLW9wZW4tXCIrbi5vcHRpb25zLnBvc2l0aW9uKSxcbm4uJGVsZW1lbnQuYWRkQ2xhc3MoXCJpcy1vcGVuXCIpfSksdGhpcy4kZWxlbWVudC5hdHRyKFwiYXJpYS1oaWRkZW5cIixcImZhbHNlXCIpLnRyaWdnZXIoXCJvcGVuZWQuemYub2ZmY2FudmFzXCIpLHRoaXMub3B0aW9ucy5jbG9zZU9uQ2xpY2smJnRoaXMuJGV4aXRlci5hZGRDbGFzcyhcImlzLXZpc2libGVcIiksaSYmKHRoaXMuJGxhc3RUcmlnZ2VyPWkuYXR0cihcImFyaWEtZXhwYW5kZWRcIixcInRydWVcIikpLHRoaXMub3B0aW9ucy5hdXRvRm9jdXMmJnRoaXMuJGVsZW1lbnQub25lKEZvdW5kYXRpb24udHJhbnNpdGlvbmVuZCh0aGlzLiRlbGVtZW50KSxmdW5jdGlvbigpe24uJGVsZW1lbnQuZmluZChcImEsIGJ1dHRvblwiKS5lcSgwKS5mb2N1cygpfSksdGhpcy5vcHRpb25zLnRyYXBGb2N1cyYmKHQoXCJbZGF0YS1vZmYtY2FudmFzLWNvbnRlbnRdXCIpLmF0dHIoXCJ0YWJpbmRleFwiLFwiLTFcIiksdGhpcy5fdHJhcEZvY3VzKCkpfX19LHtrZXk6XCJfdHJhcEZvY3VzXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD1Gb3VuZGF0aW9uLktleWJvYXJkLmZpbmRGb2N1c2FibGUodGhpcy4kZWxlbWVudCksZT10LmVxKDApLGk9dC5lcSgtMSk7dC5vZmYoXCIuemYub2ZmY2FudmFzXCIpLm9uKFwia2V5ZG93bi56Zi5vZmZjYW52YXNcIixmdW5jdGlvbih0KXs5IT09dC53aGljaCYmOSE9PXQua2V5Y29kZXx8KHQudGFyZ2V0IT09aVswXXx8dC5zaGlmdEtleXx8KHQucHJldmVudERlZmF1bHQoKSxlLmZvY3VzKCkpLHQudGFyZ2V0PT09ZVswXSYmdC5zaGlmdEtleSYmKHQucHJldmVudERlZmF1bHQoKSxpLmZvY3VzKCkpKX0pfX0se2tleTpcImNsb3NlXCIsdmFsdWU6ZnVuY3Rpb24oZSl7aWYodGhpcy4kZWxlbWVudC5oYXNDbGFzcyhcImlzLW9wZW5cIikmJiF0aGlzLmlzUmV2ZWFsZWQpe3ZhciBpPXRoaXM7dChcIltkYXRhLW9mZi1jYW52YXMtd3JhcHBlcl1cIikucmVtb3ZlQ2xhc3MoXCJpcy1vZmYtY2FudmFzLW9wZW4gaXMtb3Blbi1cIitpLm9wdGlvbnMucG9zaXRpb24pLGkuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoXCJpcy1vcGVuXCIpLHRoaXMuJGVsZW1lbnQuYXR0cihcImFyaWEtaGlkZGVuXCIsXCJ0cnVlXCIpLnRyaWdnZXIoXCJjbG9zZWQuemYub2ZmY2FudmFzXCIpLHRoaXMub3B0aW9ucy5jbG9zZU9uQ2xpY2smJnRoaXMuJGV4aXRlci5yZW1vdmVDbGFzcyhcImlzLXZpc2libGVcIiksdGhpcy4kbGFzdFRyaWdnZXIuYXR0cihcImFyaWEtZXhwYW5kZWRcIixcImZhbHNlXCIpLHRoaXMub3B0aW9ucy50cmFwRm9jdXMmJnQoXCJbZGF0YS1vZmYtY2FudmFzLWNvbnRlbnRdXCIpLnJlbW92ZUF0dHIoXCJ0YWJpbmRleFwiKX19fSx7a2V5OlwidG9nZ2xlXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKFwiaXMtb3BlblwiKT90aGlzLmNsb3NlKHQsZSk6dGhpcy5vcGVuKHQsZSl9fSx7a2V5OlwiX2hhbmRsZUtleWJvYXJkXCIsdmFsdWU6ZnVuY3Rpb24odCl7Mjc9PT10LndoaWNoJiYodC5zdG9wUHJvcGFnYXRpb24oKSx0LnByZXZlbn
6780REZWZhdWx0KCksdGhpcy5jbG9zZSgpLHRoaXMuJGxhc3RUcmlnZ2VyLmZvY3VzKCkpfX0se2tleTpcImRlc3Ryb3lcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuY2xvc2UoKSx0aGlzLiRlbGVtZW50Lm9mZihcIi56Zi50cmlnZ2VyIC56Zi5vZmZjYW52YXNcIiksdGhpcy4kZXhpdGVyLm9mZihcIi56Zi5vZmZjYW52YXNcIiksRm91bmRhdGlvbi51bnJlZ2lzdGVyUGx1Z2luKHRoaXMpfX1dKSxlfSgpO2UuZGVmYXVsdHM9e2Nsb3NlT25DbGljazohMCx0cmFuc2l0aW9uVGltZTowLHBvc2l0aW9uOlwibGVmdFwiLGZvcmNlVG9wOiEwLGlzUmV2ZWFsZWQ6ITEscmV2ZWFsT246bnVsbCxhdXRvRm9jdXM6ITAscmV2ZWFsQ2xhc3M6XCJyZXZlYWwtZm9yLVwiLHRyYXBGb2N1czohMX0sRm91bmRhdGlvbi5wbHVnaW4oZSxcIk9mZkNhbnZhc1wiKX0oalF1ZXJ5KTt2YXIgX2NyZWF0ZUNsYXNzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKXt2YXIgbj1lW2ldO24uZW51bWVyYWJsZT1uLmVudW1lcmFibGV8fCExLG4uY29uZmlndXJhYmxlPSEwLFwidmFsdWVcImluIG4mJihuLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxuLmtleSxuKX19cmV0dXJuIGZ1bmN0aW9uKGUsaSxuKXtyZXR1cm4gaSYmdChlLnByb3RvdHlwZSxpKSxuJiZ0KGUsbiksZX19KCk7IWZ1bmN0aW9uKHQpe3ZhciBlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShpLG4pe19jbGFzc0NhbGxDaGVjayh0aGlzLGUpLHRoaXMuJGVsZW1lbnQ9aSx0aGlzLm9wdGlvbnM9dC5leHRlbmQoe30sZS5kZWZhdWx0cyx0aGlzLiRlbGVtZW50LmRhdGEoKSxuKSx0aGlzLl9pbml0KCksRm91bmRhdGlvbi5yZWdpc3RlclBsdWdpbih0aGlzLFwiT3JiaXRcIiksRm91bmRhdGlvbi5LZXlib2FyZC5yZWdpc3RlcihcIk9yYml0XCIse2x0cjp7QVJST1dfUklHSFQ6XCJuZXh0XCIsQVJST1dfTEVGVDpcInByZXZpb3VzXCJ9LHJ0bDp7QVJST1dfTEVGVDpcIm5leHRcIixBUlJPV19SSUdIVDpcInByZXZpb3VzXCJ9fSl9cmV0dXJuIF9jcmVhdGVDbGFzcyhlLFt7a2V5OlwiX2luaXRcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuJHdyYXBwZXI9dGhpcy4kZWxlbWVudC5maW5kKFwiLlwiK3RoaXMub3B0aW9ucy5jb250YWluZXJDbGFzcyksdGhpcy4kc2xpZGVzPXRoaXMuJGVsZW1lbnQuZmluZChcIi5cIit0aGlzLm9wdGlvbnMuc2xpZGVDbGFzcyk7dmFyIHQ9dGhpcy4kZWxlbWVudC5maW5kKFwiaW1nXCIpLGU9dGhpcy4kc2xpZGVzLmZpbHRlcihcIi5pcy1hY3RpdmVcIik7ZS5sZW5ndGh8fHRoaXMuJHNsaWRlcy5lcSgwKS5hZGRDbGFzcyhcImlzLWFjdGl2ZVwiKSx0aGlzLm9wdGlvbnMudXNlTVVJfHx0aGlzLiRzbGlkZXMuYWRkQ2xhc3MoXCJuby1tb3Rpb251aVwiKSx0Lmxlbmd0aD9Gb3VuZGF0aW9uLm9uSW1hZ2VzTG9h
6780ZGVkKHQsdGhpcy5fcHJlcGFyZUZvck9yYml0LmJpbmQodGhpcykpOnRoaXMuX3ByZXBhcmVGb3JPcmJpdCgpLHRoaXMub3B0aW9ucy5idWxsZXRzJiZ0aGlzLl9sb2FkQnVsbGV0cygpLHRoaXMuX2V2ZW50cygpLHRoaXMub3B0aW9ucy5hdXRvUGxheSYmdGhpcy4kc2xpZGVzLmxlbmd0aD4xJiZ0aGlzLmdlb1N5bmMoKSx0aGlzLm9wdGlvbnMuYWNjZXNzaWJsZSYmdGhpcy4kd3JhcHBlci5hdHRyKFwidGFiaW5kZXhcIiwwKX19LHtrZXk6XCJfbG9hZEJ1bGxldHNcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuJGJ1bGxldHM9dGhpcy4kZWxlbWVudC5maW5kKFwiLlwiK3RoaXMub3B0aW9ucy5ib3hPZkJ1bGxldHMpLmZpbmQoXCJidXR0b25cIil9fSx7a2V5OlwiZ2VvU3luY1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLnRpbWVyPW5ldyBGb3VuZGF0aW9uLlRpbWVyKHRoaXMuJGVsZW1lbnQse2R1cmF0aW9uOnRoaXMub3B0aW9ucy50aW1lckRlbGF5LGluZmluaXRlOiExfSxmdW5jdGlvbigpe3QuY2hhbmdlU2xpZGUoITApfSksdGhpcy50aW1lci5zdGFydCgpfX0se2tleTpcIl9wcmVwYXJlRm9yT3JiaXRcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5fc2V0V3JhcHBlckhlaWdodChmdW5jdGlvbihlKXt0Ll9zZXRTbGlkZUhlaWdodChlKX0pfX0se2tleTpcIl9zZXRXcmFwcGVySGVpZ2h0XCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIGksbj0wLHM9MDt0aGlzLiRzbGlkZXMuZWFjaChmdW5jdGlvbigpe2k9dGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQsdCh0aGlzKS5hdHRyKFwiZGF0YS1zbGlkZVwiLHMpLHMmJnQodGhpcykuY3NzKHtwb3NpdGlvbjpcInJlbGF0aXZlXCIsZGlzcGxheTpcIm5vbmVcIn0pLG49aT5uP2k6bixzKyt9KSxzPT09dGhpcy4kc2xpZGVzLmxlbmd0aCYmKHRoaXMuJHdyYXBwZXIuY3NzKHtoZWlnaHQ6bn0pLGUobikpfX0se2tleTpcIl9zZXRTbGlkZUhlaWdodFwiLHZhbHVlOmZ1bmN0aW9uKGUpe3RoaXMuJHNsaWRlcy5lYWNoKGZ1bmN0aW9uKCl7dCh0aGlzKS5jc3MoXCJtYXgtaGVpZ2h0XCIsZSl9KX19LHtrZXk6XCJfZXZlbnRzXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2lmKHRoaXMuJHNsaWRlcy5sZW5ndGg+MSl7aWYodGhpcy5vcHRpb25zLnN3aXBlJiZ0aGlzLiRzbGlkZXMub2ZmKFwic3dpcGVsZWZ0LnpmLm9yYml0IHN3aXBlcmlnaHQuemYub3JiaXRcIikub24oXCJzd2lwZWxlZnQuemYub3JiaXRcIixmdW5jdGlvbih0KXt0LnByZXZlbnREZWZhdWx0KCksZS5jaGFuZ2VTbGlkZSghMCl9KS5vbihcInN3aXBlcmlnaHQuemYub3JiaXRcIixmdW5jdGlvbih0KXt0LnByZXZlbnREZWZhdWx0KCksZS5jaGFuZ2VTbGlkZSghMSl9KSx0aGlzLm9wdGlvbnMuYXV0b1BsYXkmJih0aGlzLiRzbGlkZXMub24oXCJjbGljay56Zi5vcmJpdFwiLGZ1bmN0aW9uKCl7ZS4kZWxlbWVudC5kYXRhKFwiY2xpY2tlZE9uXCIsIWUuJGVsZW1lbnQuZGF0YShcImNsaWNrZWRPblwiKSksZS50aW1lcltlLiRlbGVtZW50LmRhdGEoXCJjbGlja2VkT25cIik/XCJwYXVzZVwiOlwic3RhcnRcIl0oKX0pLHRoaXMub3B0aW9ucy5wYXVzZU9uSG92ZXImJnRoaXMuJGVsZW1lbnQub24oXCJtb3VzZWVudGVyLnpmLm9yYml0XCIsZnVuY3Rpb24oKXtlLnRpbWVyLnBhdXNlKCl9KS5vbihcIm1vdXNlbGVhdmUuemYub3JiaXRcIixmdW5jdGlvbigpe2UuJGVsZW1lbnQuZGF0YShcImNsaWNrZWRPblwiKXx8ZS50aW1lci5zdGFydCgpfSkpLHRoaXMub3B0aW9ucy5uYXZCdXR0b25zKXt2YXIgaT10aGlzLiRlbGVtZW50LmZpbmQoXCIuXCIrdGhpcy5vcHRpb25zLm5leHRDbGFzcytcIiwgLlwiK3RoaXMub3B0aW9ucy5wcmV2Q2xhc3MpO2kuYXR0cihcInRhYmluZGV4XCIsMCkub24oXCJjbGljay56Zi5vcmJpdCB0b3VjaGVuZC56Zi5vcmJpdFwiLGZ1bmN0aW9uKGkpe2kucHJldmVudERlZmF1bHQoKSxlLmNoYW5nZVNsaWRlKHQodGhpcykuaGFzQ2xhc3MoZS5vcHRpb25zLm5leHRDbGFzcykpfSl9dGhpcy5vcHRpb25zLmJ1bGxldHMmJnRoaXMuJGJ1bGxldHMub24oXCJjbGljay56Zi5vcmJpdCB0b3VjaGVuZC56Zi5vcmJpdFwiLGZ1bmN0aW9uKCl7aWYoL2lzLWFjdGl2ZS9nLnRlc3QodGhpcy5jbGFzc05hbWUpKXJldHVybiExO3ZhciBpPXQodGhpcykuZGF0YShcInNsaWRlXCIpLG49aT5lLiRzbGlkZXMuZmlsdGVyKFwiLmlzLWFjdGl2ZVwiKS5kYXRhKFwic2xpZGVcIikscz1lLiRzbGlkZXMuZXEoaSk7ZS5jaGFuZ2VTbGlkZShuLHMsaSl9KSx0aGlzLiR3cmFwcGVyLmFkZCh0aGlzLiRidWxsZXRzKS5vbihcImtleWRvd24uemYub3JiaXRcIixmdW5jdGlvbihpKXtGb3VuZGF0aW9uLktleWJvYXJkLmhhbmRsZUtleShpLFwiT3JiaXRcIix7bmV4dDpmdW5jdGlvbigpe2UuY2hhbmdlU2xpZGUoITApfSxwcmV2aW91czpmdW5jdGlvbigpe2UuY2hhbmdlU2xpZGUoITEpfSxoYW5kbGVkOmZ1bmN0aW9uKCl7dChpLnRhcmdldCkuaXMoZS4kYnVsbGV0cykmJmUuJGJ1bGxldHMuZmlsdGVyKFwiLmlzLWFjdGl2ZVwiKS5mb2N1cygpfX0pfSl9fX0se2tleTpcImNoYW5nZVNsaWRlXCIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpe3ZhciBuPXRoaXMuJHNsaWRlcy5maWx0ZXIoXCIuaXMtYWN0aXZlXCIpLmVxKDApO2lmKC9tdWkvZy50ZXN0KG5bMF0uY2xhc3NOYW1lKSlyZXR1cm4hMTt2YXIgcyxvPXRoaXMuJHNsaWRlcy5maXJzdCgpLGE9dGhpcy4kc2xpZGVzLmxhc3QoKSxyPXQ/XCJSaWdodFwiOlwiTGVmdFwiLGw9dD9cIkxlZnRcIjpcIlJpZ2h0XCIsdT10aGlzO3M9ZT9lOnQ/dGhpcy5vcHRpb25zLmluZmluaXRlV3JhcD9uLm5leHQoXCIuXCIrdGhpcy5vcHRpb25zLnNsaWRlQ2xhc3MpLmxlbmd0aD9uLm5leHQoXCIuXCIrdGhpcy5vcHRpb25zLnNsaWRlQ2xhc3MpOm86bi5uZXh0KFwiLlwiK3RoaXMub3B0aW9ucy5zbGlkZUNsYXNzKTp0aGlzLm9wdGlvbnMuaW5maW5pdGVXcmFwP24ucHJldihcIi5cIit0aGlzLm9wdGlvbnMuc2xpZGVDbGFzcykubGVuZ3RoP24ucHJldihcIi5cIit0aGlzLm9wdGlvbnMuc2xpZGVDbGFzcyk6YTpuLnByZXYoXCIuXCIrdGh
6780pcy5vcHRpb25zLnNsaWRlQ2xhc3MpLHMubGVuZ3RoJiYodGhpcy5vcHRpb25zLmJ1bGxldHMmJihpPWl8fHRoaXMuJHNsaWRlcy5pbmRleChzKSx0aGlzLl91cGRhdGVCdWxsZXRzKGkpKSx0aGlzLm9wdGlvbnMudXNlTVVJPyhGb3VuZGF0aW9uLk1vdGlvbi5hbmltYXRlSW4ocy5hZGRDbGFzcyhcImlzLWFjdGl2ZVwiKS5jc3Moe3Bvc2l0aW9uOlwiYWJzb2x1dGVcIix0b3A6MH0pLHRoaXMub3B0aW9uc1tcImFuaW1JbkZyb21cIityXSxmdW5jdGlvbigpe3MuY3NzKHtwb3NpdGlvbjpcInJlbGF0aXZlXCIsZGlzcGxheTpcImJsb2NrXCJ9KS5hdHRyKFwiYXJpYS1saXZlXCIsXCJwb2xpdGVcIil9KSxGb3VuZGF0aW9uLk1vdGlvbi5hbmltYXRlT3V0KG4ucmVtb3ZlQ2xhc3MoXCJpcy1hY3RpdmVcIiksdGhpcy5vcHRpb25zW1wiYW5pbU91dFRvXCIrbF0sZnVuY3Rpb24oKXtuLnJlbW92ZUF0dHIoXCJhcmlhLWxpdmVcIiksdS5vcHRpb25zLmF1dG9QbGF5JiYhdS50aW1lci5pc1BhdXNlZCYmdS50aW1lci5yZXN0YXJ0KCl9KSk6KG4ucmVtb3ZlQ2xhc3MoXCJpcy1hY3RpdmUgaXMtaW5cIikucmVtb3ZlQXR0cihcImFyaWEtbGl2ZVwiKS5oaWRlKCkscy5hZGRDbGFzcyhcImlzLWFjdGl2ZSBpcy1pblwiKS5hdHRyKFwiYXJpYS1saXZlXCIsXCJwb2xpdGVcIikuc2hvdygpLHRoaXMub3B0aW9ucy5hdXRvUGxheSYmIXRoaXMudGltZXIuaXNQYXVzZWQmJnRoaXMudGltZXIucmVzdGFydCgpKSx0aGlzLiRlbGVtZW50LnRyaWdnZXIoXCJzbGlkZWNoYW5nZS56Zi5vcmJpdFwiLFtzXSkpfX0se2tleTpcIl91cGRhdGVCdWxsZXRzXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy4kZWxlbWVudC5maW5kKFwiLlwiK3RoaXMub3B0aW9ucy5ib3hPZkJ1bGxldHMpLmZpbmQoXCIuaXMtYWN0aXZlXCIpLnJlbW92ZUNsYXNzKFwiaXMtYWN0aXZlXCIpLmJsdXIoKSxpPWUuZmluZChcInNwYW46bGFzdFwiKS5kZXRhY2goKTt0aGlzLiRidWxsZXRzLmVxKHQpLmFkZENsYXNzKFwiaXMtYWN0aXZlXCIpLmFwcGVuZChpKX19LHtrZXk6XCJkZXN0cm95XCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLiRlbGVtZW50Lm9mZihcIi56Zi5vcmJpdFwiKS5maW5kKFwiKlwiKS5vZmYoXCIuemYub3JiaXRcIikuZW5kKCkuaGlkZSgpLEZvdW5kYXRpb24udW5yZWdpc3RlclBsdWdpbih0aGlzKX19XSksZX0oKTtlLmRlZmF1bHRzPXtidWxsZXRzOiEwLG5hdkJ1dHRvbnM6ITAsYW5pbUluRnJvbVJpZ2h0Olwic2xpZGUtaW4tcmlnaHRcIixhbmltT3V0VG9SaWdodDpcInNsaWRlLW91dC1yaWdodFwiLGFuaW1JbkZyb21MZWZ0Olwic2xpZGUtaW4tbGVmdFwiLGFuaW1PdXRUb0xlZnQ6XCJzbGlkZS1vdXQtbGVmdFwiLGF1dG9QbGF5OiEwLHRpbWVyRGVsYXk6NWUzLGluZmluaXRlV3JhcDohMCxzd2lwZTohMCxwYXVzZU9uSG92ZXI6ITAsYWNjZXNzaWJsZTohMCxjb250YWluZXJDbGFzczpcIm9yYml0LWNvbnRhaW5lclwiLHNsaWRlQ2xhc3M6XCJvcmJpdC1zbGlkZVwiLGJveE9mQnVsbGV0czpcIm9yYml0LWJ1bGxldHNcIixuZXh0Q2xhc3M6XCJvcmJpdC1uZXh0XCIscHJldkNsYXNzOlwib3JiaXQtcHJldmlvdXNcIix1c2VNVUk6ITB9LEZvdW5kYXRpb24ucGx1Z2luKGUsXCJPcmJpdFwiKX0oalF1ZXJ5KTt2YXIgX2NyZWF0ZUNsYXNzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKXt2YXIgbj1lW2ldO24uZW51bWVyYWJsZT1uLmVudW1lcmFibGV8fCExLG4uY29uZmlndXJhYmxlPSEwLFwidmFsdWVcImluIG4mJihuLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxuLmtleSxuKX19cmV0dXJuIGZ1bmN0aW9uKGUsaSxuKXtyZXR1cm4gaSYmdChlLnByb3RvdHlwZSxpKSxuJiZ0KGUsbiksZX19KCk7IWZ1bmN0aW9uKHQpe3ZhciBlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShpLG4pe19jbGFzc0NhbGxDaGVjayh0aGlzLGUpLHRoaXMuJGVsZW1lbnQ9dChpKSx0aGlzLnJ1bGVzPXRoaXMuJGVsZW1lbnQuZGF0YShcInJlc3BvbnNpdmUtbWVudVwiKSx0aGlzLmN1cnJlbnRNcT1udWxsLHRoaXMuY3VycmVudFBsdWdpbj1udWxsLHRoaXMuX2luaXQoKSx0aGlzLl9ldmVudHMoKSxGb3VuZGF0aW9uLnJlZ2lzdGVyUGx1Z2luKHRoaXMsXCJSZXNwb25zaXZlTWVudVwiKX1yZXR1cm4gX2NyZWF0ZUNsYXNzKGUsW3trZXk6XCJfaW5pdFwiLHZhbHVlOmZ1bmN0aW9uKCl7aWYoXCJzdHJpbmdcIj09dHlwZW9mIHRoaXMucnVsZXMpe2Zvcih2YXIgZT17fSxuPXRoaXMucnVsZXMuc3BsaXQoXCIgXCIpLHM9MDtzPG4ubGVuZ3RoO3MrKyl7dmFyIG89bltzXS5zcGxpdChcIi1cIiksYT1vLmxlbmd0aD4xP29bMF06XCJzbWFsbFwiLHI9by5sZW5ndGg+MT9vWzFdOm9bMF07bnVsbCE9PWlbcl0mJihlW2FdPWlbcl0pfXRoaXMucnVsZXM9ZX10LmlzRW1wdHlPYmplY3QodGhpcy5ydWxlcyl8fHRoaXMuX2NoZWNrTWVkaWFRdWVyaWVzKCl9fSx7a2V5OlwiX2V2ZW50c1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0KHdpbmRvdykub24oXCJjaGFuZ2VkLnpmLm1lZGlhcXVlcnlcIixmdW5jdGlvbigpe2UuX2NoZWNrTWVkaWFRdWVyaWVzKCl9KX19LHtrZXk6XCJfY2hlY2tNZWRpYVF1ZXJpZXNcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlLG49dGhpczt0LmVhY2godGhpcy5ydWxlcyxmdW5jdGlvbih0KXtGb3VuZGF0aW9uLk1lZGlhUXVlcnkuYXRMZWFzdCh0KSYmKGU9dCl9KSxlJiYodGhpcy5jdXJyZW50UGx1Z2luIGluc3RhbmNlb2YgdGhpcy5ydWxlc1tlXS5wbHVnaW58fCh0LmVhY2goaSxmdW5jdGlvbih0LGUpe24uJGVsZW1lbnQucmVtb3ZlQ2xhc3MoZS5jc3NDbGFzcyl9KSx0aGlzLiRlbGVtZW50LmFkZENsYXNzKHRoaXMucnVsZXNbZV0uY3NzQ2xhc3MpLHRoaXMuY3VycmVudFBsdWdpbiYmdGhpcy5jdXJyZW50UGx1Z2luLmRlc3Ryb3koKSx0aGlzLmN1cnJlbnRQbHVnaW49bmV3IHRoaXMucnVsZXNbZV0ucGx1Z2luKHRoaXMuJGVsZW1lbnQse30pKSl9fSx7a2V5OlwiZGVzdHJveVwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5jdXJyZW50UGx1Z2luLmRlc3Ryb3koKSx0KHdpbmRvdykub2ZmKFwiLnpmLlJlc3BvbnNpdmVNZW51XCIpLEZvdW5kYXRpb24udW5yZWdpc3RlclBsdWdpbih0aGlzKX19XSksZX0oKTtlLmRlZmF1bHRzPXt9O3ZhciBpPXtkcm9wZG93bjp7Y3NzQ2xhc3M6XCJkcm9wZG93blwiLHBsdWdpbjpGb3VuZGF0aW9uLl9wbHVnaW5zW1wiZHJvcGRvd24tbWVudVwiXXx8bnVsbH0sZHJpbGxkb3duOntjc3NDbGFzczpcImRyaWxsZG93blwiLHBsdWdpbjpGb3VuZGF0aW9uLl9wbHVnaW5zLmRyaWxsZG93bnx8bnVsbH0sYWNjb3JkaW9uOntjc3NDbGFzczpcImFjY29yZGlvbi1tZW51XCIscGx1Z2luOkZvdW5kYXRpb24uX3BsdWdpbnNbXCJhY2NvcmRpb24tbWVudVwiXXx8bnVsbH19O0ZvdW5kYXRpb24ucGx1Z2luKGUsXCJSZXNwb25zaXZlTWVudVwiKX0oalF1ZXJ5KTt2YXIgX2NyZWF0ZUNsYXNzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKXt2YXIgbj1lW2ldO24uZW51bWVyYWJsZT1uLmVudW1lcmFibGV8fCExLG4uY29uZmlndXJhYmxlPSEwLFwidmFsdWVcImluIG4mJihuLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxuLmtleSxuKX19cmV0dXJuIGZ1bmN0aW9uKGUsaSxuKXtyZXR1cm4gaSYmdChlLnByb3RvdHlwZSxpKSxuJiZ0KGUsbiksZX19KCk7IWZ1bmN0aW9uKHQpe3ZhciBlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShpLG4pe19jbGFzc0NhbGxDaGVjayh0aGlzLGUpLHRoaXMuJGVsZW1lbnQ9dChpKSx0aGlzLm9wdGlvbnM9dC5leHRlbmQoe30sZS5kZWZhdWx0cyx0aGlzLiRlbGVtZW50LmRhdGEoKSxuKSx0aGlzLl9pbml0KCksdGhpcy5fZXZlbnRzKCksRm91bmRhdGlvbi5yZWdpc3RlclBsdWdpbih0aGlzLFwiUmVzcG9uc2l2ZVRvZ2dsZVwiKX1yZXR1cm4gX2NyZWF0ZUNsYXNzKGUsW3trZXk6XCJfaW5pdFwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy4kZWxlbWVudC5kYXRhKFwicmVzcG9uc2l2ZS10b2dnbGVcIik7ZXx8Y29uc29sZS5lcnJvcihcIllvdXIgdGFiIGJhciBuZWVkcyBhbiBJRCBvZiBhIE1lbnUgYXMgdGhlIHZhbHVlIG9mIGRhdGEtdGFiLWJhci5cIiksdGhpcy4kdGFyZ2V0TWVudT10KFwiI1wiK2UpLHRoaXMuJHRvZ2dsZXI9dGhpcy4kZWxlbWVudC5maW5kKFwiW2RhdGEtdG9nZ2xlXVwiKSx0aGlzLl91cGRhdGUoKX19LHtrZXk6XCJfZXZlbnRzXCIsdmFsdWU6ZnVuY3Rpb24oKXt0KHdpbmRvdykub24oXCJjaGFuZ2VkLnpmLm1lZGlhcXVlcnlcIix0aGlzLl91cGRhdGUuYmluZCh0aGlzKSksdGhpcy4kdG9nZ2xlci5vbihcImNsaWNrLnpmLnJlc3BvbnNpdmVUb2dnbGVcIix0aGlzLnRvZ2dsZU1lbnUuYmluZCh0aGlzKSl9fSx7a2V5OlwiX3VwZGF0ZVwiLHZhbHVlOmZ1bmN0aW9uKCl7Rm91bmRhdGlvbi5NZWRpYVF1ZXJ5LmF0TGVhc3QodGhpcy5vcHRpb25zLmhpZGVGb3IpPyh0aGlzLiRlbGVtZW50LmhpZGUoKSx0aGlzLiR0YXJnZXRNZW51LnNob3coKSk6KHRoaXMuJGVsZW1lbnQuc2hvdygpLHRoaXMuJHRhcmdldE1lbnUuaGlkZSgpKX19LHtrZXk6XCJ0b2dnbGVNZW51XCIsdmFsdWU6ZnVuY3Rpb24oKXtGb3VuZGF0aW9uLk1lZGlhUXVlcnkuYXRMZWFzdCh0aGlzLm9wdGlvbnMuaGl
6780kZUZvcil8fCh0aGlzLiR0YXJnZXRNZW51LnRvZ2dsZSgwKSx0aGlzLiRlbGVtZW50LnRyaWdnZXIoXCJ0b2dnbGVkLnpmLnJlc3BvbnNpdmVUb2dnbGVcIikpfX0se2tleTpcImRlc3Ryb3lcIix2YWx1ZTpmdW5jdGlvbigpe319XSksZX0oKTtlLmRlZmF1bHRzPXtoaWRlRm9yOlwibWVkaXVtXCJ9LEZvdW5kYXRpb24ucGx1Z2luKGUsXCJSZXNwb25zaXZlVG9nZ2xlXCIpfShqUXVlcnkpO3ZhciBfY3JlYXRlQ2xhc3M9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBuPWVbaV07bi5lbnVtZXJhYmxlPW4uZW51bWVyYWJsZXx8ITEsbi5jb25maWd1cmFibGU9ITAsXCJ2YWx1ZVwiaW4gbiYmKG4ud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG4ua2V5LG4pfX1yZXR1cm4gZnVuY3Rpb24oZSxpLG4pe3JldHVybiBpJiZ0KGUucHJvdG90eXBlLGkpLG4mJnQoZSxuKSxlfX0oKTshZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybi9pUChhZHxob25lfG9kKS4qT1MvLnRlc3Qod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpfXZhciBpPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaShlLG4pe19jbGFzc0NhbGxDaGVjayh0aGlzLGkpLHRoaXMuJGVsZW1lbnQ9ZSx0aGlzLm9wdGlvbnM9dC5leHRlbmQoe30saS5kZWZhdWx0cyx0aGlzLiRlbGVtZW50LmRhdGEoKSxuKSx0aGlzLl9pbml0KCksRm91bmRhdGlvbi5yZWdpc3RlclBsdWdpbih0aGlzLFwiUmV2ZWFsXCIpLEZvdW5kYXRpb24uS2V5Ym9hcmQucmVnaXN0ZXIoXCJSZXZlYWxcIix7RU5URVI6XCJvcGVuXCIsU1BBQ0U6XCJvcGVuXCIsRVNDQVBFOlwiY2xvc2VcIixUQUI6XCJ0YWJfZm9yd2FyZFwiLFNISUZUX1RBQjpcInRhYl9iYWNrd2FyZFwifSl9cmV0dXJuIF9jcmVhdGVDbGFzcyhpLFt7a2V5OlwiX2luaXRcIix2YWx1ZTpmdW5jdGlvbigpe2lmKHRoaXMuaWQ9dGhpcy4kZWxlbWVudC5hdHRyKFwiaWRcIiksdGhpcy5pc0FjdGl2ZT0hMSx0aGlzLmNhY2hlZD17bXE6Rm91bmRhdGlvbi5NZWRpYVF1ZXJ5LmN1cnJlbnR9LHRoaXMuaXNpT1M9ZSgpLHRoaXMuaXNpT1MmJnRoaXMuJGVsZW1lbnQuYWRkQ2xhc3MoXCJpcy1pb3NcIiksdGhpcy4kYW5jaG9yPXQodCgnW2RhdGEtb3Blbj1cIicrdGhpcy5pZCsnXCJdJykubGVuZ3RoPydbZGF0YS1vcGVuPVwiJyt0aGlzLmlkKydcIl0nOidbZGF0YS10b2dnbGU9XCInK3RoaXMuaWQrJ1wiXScpLHRoaXMuJGFuY2hvci5sZW5ndGgpe3ZhciBpPXRoaXMuJGFuY2hvclswXS5pZHx8Rm91bmRhdGlvbi5HZXRZb0RpZ2l0cyg2LFwicmV2ZWFsXCIpO3RoaXMuJGFuY2hvci5hdHRyKHtcImFyaWEtY29udHJvbHNcIjp0aGlzLmlkLGlkOmksXCJhcmlhLWhhc3BvcHVwXCI6ITAsdGFiaW5kZXg6MH0pLHRoaXMuJGVsZW1lbnQuYXR0cih7XCJhcmlhLWxhYmVsbGVkYnlcIjppfSl9KHRoaXMub3B0aW9ucy5mdWxsU2NyZWVufHx0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKFwiZnVsbFwiKSkmJih0aGlzLm9wdGlvbnMuZnVsbFNjcmVlbj0hMCx0aGlzLm9wdGlvbnMub3ZlcmxheT0hMSksdGhpcy5vcHRpb25zLm92ZXJsYXkmJiF0aGlzLiRvdmVybGF5JiYodGhpcy4kb3ZlcmxheT10aGlzLl9tYWtlT3ZlcmxheSh0aGlzLmlkKSksdGhpcy4kZWxlbWVudC5hdHRyKHtyb2xlOlwiZGlhbG9nXCIsXCJhcmlhLWhpZGRlblwiOiEwLFwiZGF0YS15ZXRpLWJveFwiOnRoaXMuaWQsXCJkYXRhLXJlc2l6ZVwiOnRoaXMuaWR9KSx0aGlzLiRvdmVybGF5P3RoaXMuJGVsZW1lbnQuZGV0YWNoKCkuYXBwZW5kVG8odGhpcy4kb3ZlcmxheSk6KHRoaXMuJGVsZW1lbnQuZGV0YWNoKCkuYXBwZW5kVG8odChcImJvZHlcIikpLHRoaXMuJGVsZW1lbnQuYWRkQ2xhc3MoXCJ3aXRob3V0LW92ZXJsYXlcIikpLHRoaXMuX2V2ZW50cygpLHRoaXMub3B0aW9ucy5kZWVwTGluayYmd2luZG93LmxvY2F0aW9uLmhhc2g9PT1cIiNcIit0aGlzLmlkJiZ0KHdpbmRvdykub25lKFwibG9hZC56Zi5yZXZlYWxcIix0aGlzLm9wZW4uYmluZCh0aGlzKSl9fSx7a2V5OlwiX21ha2VPdmVybGF5XCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIGk9dChcIjxkaXY+PC9kaXY+XCIpLmFkZENsYXNzKFwicmV2ZWFsLW92ZXJsYXlcIikuYXR0cih7dGFiaW5kZXg6LTEsXCJhcmlhLWhpZGRlblwiOiEwfSkuYXBwZW5kVG8oXCJib2R5XCIpO3JldHVybiBpfX0se2tleTpcIl91cGRhdGVQb3NpdGlvblwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGUsaSxuPXRoaXMuJGVsZW1lbnQub3V0ZXJXaWR0aCgpLHM9dCh3aW5kb3cpLndpZHRoKCksbz10aGlzLiRlbGVtZW50Lm91dGVySGVpZ2h0KCksYT10KHdpbmRvdykuaGVpZ2h0KCk7ZT1cImF1dG9cIj09PXRoaXMub3B0aW9ucy5oT2Zmc2V0P3BhcnNlSW50KChzLW4pLzIsMTApOnBhcnNlSW50KHRoaXMub3B0aW9ucy5oT2Zmc2V0LDEwKSxpPVwiYXV0b1wiPT09dGhpcy5vcHRpb25zLnZPZmZzZXQ/bz5hP3BhcnNlSW50KE1hdGgubWluKDEwMCxhLzEwKSwxMCk6cGFyc2VJbnQoKGEtbykvNCwxMCk6cGFyc2VJbnQodGhpcy5vcHRpb25zLnZPZmZzZXQsMTApLHRoaXMuJGVsZW1lbnQuY3NzKHt0b3A6aStcInB4XCJ9KSx0aGlzLiRvdmVybGF5JiZcImF1dG9cIj09PXRoaXMub3B0aW9ucy5oT2Zmc2V0fHwodGhpcy4kZWxlbWVudC5jc3Moe2xlZnQ6ZStcInB4XCJ9KSx0aGlzLiRlbGVtZW50LmNzcyh7bWFyZ2luOlwiMHB4XCJ9KSl9fSx7a2V5OlwiX2V2ZW50c1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLiRlbGVtZW50Lm9uKHtcIm9wZW4uemYudHJpZ2dlclwiOnRoaXMub3Blbi5iaW5kKHRoaXMpLFwiY2xvc2UuemYudHJpZ2dlclwiOnRoaXMuY2xvc2UuYmluZCh0aGlzKSxcInRvZ2dsZS56Zi50cmlnZ2VyXCI6dGhpcy50b2dnbGUuYmluZCh0aGlzKSxcInJlc2l6ZW1lLnpmLnRyaWdnZXJcIjpmdW5jdGlvbigpe2UuX3VwZGF0ZVBvc2l0aW9uKCl9fSksdGhpcy4kYW5jaG9yLmxlbmd0aCYmdGhpcy4kYW5jaG9yLm9uKFwia2V5ZG93bi56Zi5yZXZlYWxcIixmdW5jdGlvbih0KXsxMyE9PXQud2hpY2gmJjMyIT09dC53aGljaHx8KHQuc3RvcFByb3BhZ2F0aW9uKCksdC5wcmV2ZW50RGVmYXVsdCgpLGUub3BlbigpKX0pLHRoaXMub3B0aW9ucy5jbG9zZU9uQ2xpY2smJnRoaXMub3B0aW9ucy5vdmVybGF5JiZ0aGlzLiRvdmVybGF5Lm9mZihcIi56Zi5yZXZlYWxcIikub24oXCJjbGljay56Zi5yZXZlYWxcIixmdW5jdGlvbihpKXtpLnRhcmdldD09PWUuJGVsZW1lbnRbMF18fH
6780QuY29udGFpbnMoZS4kZWxlbWVudFswXSxpLnRhcmdldCl8fGUuY2xvc2UoKX0pLHRoaXMub3B0aW9ucy5kZWVwTGluayYmdCh3aW5kb3cpLm9uKFwicG9wc3RhdGUuemYucmV2ZWFsOlwiK3RoaXMuaWQsdGhpcy5faGFuZGxlU3RhdGUuYmluZCh0aGlzKSl9fSx7a2V5OlwiX2hhbmRsZVN0YXRlXCIsdmFsdWU6ZnVuY3Rpb24odCl7d2luZG93LmxvY2F0aW9uLmhhc2ghPT1cIiNcIit0aGlzLmlkfHx0aGlzLmlzQWN0aXZlP3RoaXMuY2xvc2UoKTp0aGlzLm9wZW4oKX19LHtrZXk6XCJvcGVuXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2lmKHRoaXMub3B0aW9ucy5kZWVwTGluayl7dmFyIGk9XCIjXCIrdGhpcy5pZDt3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGU/d2luZG93Lmhpc3RvcnkucHVzaFN0YXRlKG51bGwsbnVsbCxpKTp3aW5kb3cubG9jYXRpb24uaGFzaD1pfWlmKHRoaXMuaXNBY3RpdmU9ITAsdGhpcy4kZWxlbWVudC5jc3Moe3Zpc2liaWxpdHk6XCJoaWRkZW5cIn0pLnNob3coKS5zY3JvbGxUb3AoMCksdGhpcy5vcHRpb25zLm92ZXJsYXkmJnRoaXMuJG92ZXJsYXkuY3NzKHt2aXNpYmlsaXR5OlwiaGlkZGVuXCJ9KS5zaG93KCksdGhpcy5fdXBkYXRlUG9zaXRpb24oKSx0aGlzLiRlbGVtZW50LmhpZGUoKS5jc3Moe3Zpc2liaWxpdHk6XCJcIn0pLHRoaXMuJG92ZXJsYXkmJnRoaXMuJG92ZXJsYXkuY3NzKHt2aXNpYmlsaXR5OlwiXCJ9KS5oaWRlKCksdGhpcy5vcHRpb25zLm11bHRpcGxlT3BlbmVkfHx0aGlzLiRlbGVtZW50LnRyaWdnZXIoXCJjbG9zZW1lLnpmLnJldmVhbFwiLHRoaXMuaWQpLHRoaXMub3B0aW9ucy5hbmltYXRpb25Jbj8odGhpcy5vcHRpb25zLm92ZXJsYXkmJkZvdW5kYXRpb24uTW90aW9uLmFuaW1hdGVJbih0aGlzLiRvdmVybGF5LFwiZmFkZS1pblwiKSxGb3VuZGF0aW9uLk1vdGlvbi5hbmltYXRlSW4odGhpcy4kZWxlbWVudCx0aGlzLm9wdGlvbnMuYW5pbWF0aW9uSW4sZnVuY3Rpb24oKXtlLmZvY3VzYWJsZUVsZW1lbnRzPUZvdW5kYXRpb24uS2V5Ym9hcmQuZmluZEZvY3VzYWJsZShlLiRlbGVtZW50KX0pKToodGhpcy5vcHRpb25zLm92ZXJsYXkmJnRoaXMuJG92ZXJsYXkuc2hvdygwKSx0aGlzLiRlbGVtZW50LnNob3codGhpcy5vcHRpb25zLnNob3dEZWxheSkpLHRoaXMuJGVsZW1lbnQuYXR0cih7XCJhcmlhLWhpZGRlblwiOiExLHRhYmluZGV4Oi0xfSkuZm9jdXMoKSx0aGlzLiRlbGVtZW50LnRyaWdnZXIoXCJvcGVuLnpmLnJldmVhbFwiKSx0aGlzLmlzaU9TKXt2YXIgbj13aW5kb3cucGFnZVlPZmZzZXQ7dChcImh0bWwsIGJvZHlcIikuYWRkQ2xhc3MoXCJpcy1yZXZlYWwtb3BlblwiKS5zY3JvbGxUb3Aobil9ZWxzZSB0KFwiYm9keVwiKS5hZGRDbGFzcyhcImlzLXJldmVhbC1vcGVuXCIpO3QoXCJib2R5XCIpLmFkZENsYXNzKFwiaXMtcmV2ZWFsLW9wZW5cIikuYXR0cihcImFyaWEtaGlkZGVuXCIsISghdGhpcy5vcHRpb25zLm92ZXJsYXkmJiF0aGlzLm9wdGlvbnMuZnVsbFNjcmVlbikpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLl9leHRyYUhhbmRsZXJzKCl9LDApfX0se2tleTpcIl9leHRyYUhhbmRsZXJzXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMuZm9jdXNhYmxlRWxlbWVudHM9Rm91bmRhdGlvbi5LZXlib2FyZC5maW5kRm9jdXNhYmxlKHRoaXMuJGVsZW1lbnQpLHRoaXMub3B0aW9ucy5vdmVybGF5fHwhdGhpcy5vcHRpb25zLmNsb3NlT25DbGlja3x8dGhpcy5vcHRpb25zLmZ1bGxTY3JlZW58fHQoXCJib2R5XCIpLm9uKFwiY2xpY2suemYucmV2ZWFsXCIsZnVuY3Rpb24oaSl7aS50YXJnZXQ9PT1lLiRlbGVtZW50WzBdfHx0LmNvbnRhaW5zKGUuJGVsZW1lbnRbMF0saS50YXJnZXQpfHxlLmNsb3NlKCl9KSx0aGlzLm9wdGlvbnMuY2xvc2VPbkVzYyYmdCh3aW5kb3cpLm9uKFwia2V5ZG93bi56Zi5yZXZlYWxcIixmdW5jdGlvbih0KXtGb3VuZGF0aW9uLktleWJvYXJkLmhhbmRsZUtleSh0LFwiUmV2ZWFsXCIse2Nsb3NlOmZ1bmN0aW9uKCl7ZS5vcHRpb25zLmNsb3NlT25Fc2MmJihlLmNsb3NlKCksZS4kYW5jaG9yLmZvY3VzKCkpfX0pfSksdGhpcy4kZWxlbWVudC5vbihcImtleWRvd24uemYucmV2ZWFsXCIsZnVuY3Rpb24oaSl7dmFyIG49dCh0aGlzKTtGb3VuZGF0aW9uLktleWJvYXJkLmhhbmRsZUtleShpLFwiUmV2ZWFsXCIse3RhYl9mb3J3YXJkOmZ1bmN0aW9uKCl7ZS4kZWxlbWVudC5maW5kKFwiOmZvY3VzXCIpLmlzKGUuZm9jdXNhYmxlRWxlbWVudHMuZXEoLTEpKSYmKGUuZm9jdXNhYmxlRWxlbWVudHMuZXEoMCkuZm9jdXMoKSxpLnByZXZlbnREZWZhdWx0KCkpLDA9PT1lLmZvY3VzYWJsZUVsZW1lbnRzLmxlbmd0aCYmaS5wcmV2ZW50RGVmYXVsdCgpfSx0YWJfYmFja3dhcmQ6ZnVuY3Rpb24oKXsoZS4kZWxlbWVudC5maW5kKFwiOmZvY3VzXCIpLmlzKGUuZm9jdXNhYmxlRWxlbWVudHMuZXEoMCkpfHxlLiRlbGVtZW50LmlzKFwiOmZvY3VzXCIpKSYmKGUuZm9jdXNhYmxlRWxlbWVudHMuZXEoLTEpLmZvY3VzKCksaS5wcmV2ZW50RGVmYXVsdCgpKSwwPT09ZS5mb2N1c2FibGVFbGVtZW50cy5sZW5ndGgmJmkucHJldmVudERlZmF1bHQoKX0sb3BlbjpmdW5jdGlvbigpe2UuJGVsZW1lbnQuZmluZChcIjpmb2N1c1wiKS5pcyhlLiRlbGVtZW50LmZpbmQoXCJbZGF0YS1jbG9zZV1cIikpP3NldFRpbWVvdXQoZnVuY3Rpb24oKXtlLiRhbmNob3IuZm9jdXMoKX0sMSk6bi5pcyhlLmZvY3VzYWJsZUVsZW1lbnRzKSYmZS5vcGVuKCl9LGNsb3NlOmZ1bmN0aW9uKCl7ZS5vcHRpb25zLmNsb3NlT25Fc2MmJihlLmNsb3NlKCksZS4kYW5jaG9yLmZvY3VzKCkpfX0pfSl9fSx7a2V5OlwiY2xvc2VcIix2YWx1ZTpmdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXtpLmlzaU9TP3QoXCJodG1sLCBib2R5XCIpLnJlbW92ZUNsYXNzKFwiaXMtcmV2ZWFsLW9wZW5cIik6dChcImJvZHlcIikucmVtb3ZlQ2xhc3MoXCJpcy1yZXZlYWwtb3BlblwiKSx0KFwiYm9keVwiKS5hdHRyKHtcImFyaWEtaGlkZGVuXCI6ITEsdGFiaW5kZXg6XCJcIn0pLGkuJGVsZW1lbnQuYXR0cihcImFyaWEtaGlkZGVuXCIsITApLGkuJGVsZW1lbnQudHJpZ2dlcihcImNsb3NlZC56Zi5yZXZlYWxcIil9aWYoIXRoaXMuaXNBY3RpdmV8fCF0aGlzLiRlbGVtZW50LmlzKFwiOnZpc2libGVcIikpcmV0dXJuITE7dmFyIGk9dGhpczt0aGlzLm9wdGlvbnMuYW5pbWF0aW9uT3V0Pyh0aGlzLm9wdGlvbnMub3ZlcmxheT9Gb3VuZGF0aW9uLk1vdGlvbi5hbmltYXRlT3V0KHRoaXMuJG92ZXJsYXksXCJmYWRlLW91dFwiLGUpOmUoKSxGb3VuZGF0aW9uLk1vdGlvbi5hbmltYXRlT3V0KHRoaXMuJGVsZW1lbnQsdGhpcy5vcHRpb25zLmFuaW1hdGlvbk91dCkpOih0aGlzLm9wdGlvbnMub3ZlcmxheT90aGlzLiRvdmVybGF5LmhpZGUoMCxlKTplKCksdGhpcy4kZWxlbWVudC5oaWRlKHRoaXMub3B0aW9ucy5oaWRlRGVsYXkpKSx0aGlzLm9wdGlvbnMuY2xvc2VPbkVzYyYmdCh3aW5kb3cpLm9mZihcImtleWRvd24uemYucmV2ZWFsXCIpLCF0aGlzLm9wdGlvbnMub3ZlcmxheSYmdGhpcy5vcHRpb25zLmNsb3NlT25DbGljayYmdChcImJvZHlcIikub2ZmKFwiY2xpY2suemYucmV2ZWFsXCIpLHRoaXMuJGVsZW1lbnQub2ZmKFwia2V5ZG93bi56Zi5yZXZlYWxcIiksdGhpcy5vcHRpb25zLnJlc2V0T25DbG9zZSYmdGhpcy4kZWxlbWVudC5odG1sKHRoaXMuJGVsZW1lbnQuaHRtbCgpKSx0aGlzLmlzQWN0aXZlPSExLGkub3B0aW9ucy5kZWVwTGluayYmKHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZT93aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUoXCJcIixkb2
6780N1bWVudC50aXRsZSx3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUpOndpbmRvdy5sb2NhdGlvbi5oYXNoPVwiXCIpfX0se2tleTpcInRvZ2dsZVwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5pc0FjdGl2ZT90aGlzLmNsb3NlKCk6dGhpcy5vcGVuKCl9fSx7a2V5OlwiZGVzdHJveVwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zLm92ZXJsYXkmJih0aGlzLiRlbGVtZW50LmFwcGVuZFRvKHQoXCJib2R5XCIpKSx0aGlzLiRvdmVybGF5LmhpZGUoKS5vZmYoKS5yZW1vdmUoKSksdGhpcy4kZWxlbWVudC5oaWRlKCkub2ZmKCksdGhpcy4kYW5jaG9yLm9mZihcIi56ZlwiKSx0KHdpbmRvdykub2ZmKFwiLnpmLnJldmVhbDpcIit0aGlzLmlkKSxGb3VuZGF0aW9uLnVucmVnaXN0ZXJQbHVnaW4odGhpcyl9fV0pLGl9KCk7aS5kZWZhdWx0cz17YW5pbWF0aW9uSW46XCJcIixhbmltYXRpb25PdXQ6XCJcIixzaG93RGVsYXk6MCxoaWRlRGVsYXk6MCxjbG9zZU9uQ2xpY2s6ITAsY2xvc2VPbkVzYzohMCxtdWx0aXBsZU9wZW5lZDohMSx2T2Zmc2V0OlwiYXV0b1wiLGhPZmZzZXQ6XCJhdXRvXCIsZnVsbFNjcmVlbjohMSxidG1PZmZzZXRQY3Q6MTAsb3ZlcmxheTohMCxyZXNldE9uQ2xvc2U6ITEsZGVlcExpbms6ITF9LEZvdW5kYXRpb24ucGx1Z2luKGksXCJSZXZlYWxcIil9KGpRdWVyeSk7dmFyIF9jcmVhdGVDbGFzcz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXtmb3IodmFyIGk9MDtpPGUubGVuZ3RoO2krKyl7dmFyIG49ZVtpXTtuLmVudW1lcmFibGU9bi5lbnVtZXJhYmxlfHwhMSxuLmNvbmZpZ3VyYWJsZT0hMCxcInZhbHVlXCJpbiBuJiYobi53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsbi5rZXksbil9fXJldHVybiBmdW5jdGlvbihlLGksbil7cmV0dXJuIGkmJnQoZS5wcm90b3R5cGUsaSksbiYmdChlLG4pLGV9fSgpOyFmdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsZSl7cmV0dXJuIHQvZX1mdW5jdGlvbiBpKHQsZSxpLG4pe3JldHVybiBNYXRoLmFicyh0LnBvc2l0aW9uKClbZV0rdFtuXSgpLzItaSl9dmFyIG49ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKGUsaSl7X2NsYXNzQ2FsbENoZWNrKHRoaXMsbiksdGhpcy4kZWxlbWVudD1lLHRoaXMub3B0aW9ucz10LmV4dGVuZCh7fSxuLmRlZmF1bHRzLHRoaXMuJGVsZW1lbnQuZGF0YSgpLGkpLHRoaXMuX2luaXQoKSxGb3VuZGF0aW9uLnJlZ2lzdGVyUGx1Z2luKHRoaXMsXCJTbGlkZXJcIiksRm91bmRhdGlvbi5LZXlib2FyZC5yZWdpc3RlcihcIlNsaWRlclwiLHtsdHI6e0FSUk9XX1JJR0hUOlwiaW5jcmVhc2VcIixBUlJPV19VUDpcImluY3JlYXNlXCIsQVJST1dfRE9XTjpcImRlY3JlYXNlXCIsQVJST1dfTEVGVDpcImRlY3JlYXNlXCIsU0hJRlRfQVJST1dfUklHSFQ6XCJpbmNyZWFzZV9mYXN0XCIsU0hJRlRfQVJST1dfVVA6XCJpbmNyZWFzZV9mYXN0XCIsU0hJRlRfQVJST1dfRE9XTjpcImRlY3JlYXNlX2Zhc3RcIixTSElGVF9BUlJPV19MRUZUOlwiZGVjcmVhc2VfZmFzdFwifSxydGw6e0FSUk9XX0xFRlQ6XCJpbmNyZWFzZVwiLEFSUk9XX1JJR0hUOlwiZGVjcmVhc2VcIixTSElGVF9BUlJPV19MRUZUOlwiaW5jcmVhc2VfZmFzdFwiLFNISUZUX0FSUk9XX1JJR0hUOlwiZGVjcmVhc2VfZmFzdFwifX0pfXJldHVybiBfY3JlYXRlQ2xhc3Mobixbe2tleTpcIl9pbml0XCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmlucHV0cz10aGlzLiRlbGVtZW50LmZpbmQoXCJpbnB1dFwiKSx0aGlzLmhhbmRsZXM9dGhpcy4kZWxlbWVudC5maW5kKFwiW2RhdGEtc2xpZGVyLWhhbmRsZV1cIiksdGhpcy4kaGFuZGxlPXRoaXMuaGFuZGxlcy5lcSgwKSx0aGlzLiRpbnB1dD10aGlzLmlucHV0cy5sZW5ndGg/dGhpcy5pbnB1dHMuZXEoMCk6dChcIiNcIit0aGlzLiRoYW5kbGUuYXR0cihcImFyaWEtY29udHJvbHNcIikpLHRoaXMuJGZpbGw9dGhpcy4kZWxlbWVudC5maW5kKFwiW2RhdGEtc2xpZGVyLWZpbGxdXCIpLmNzcyh0aGlzLm9wdGlvbnMudmVydGljYWw/XCJoZWlnaHRcIjpcIndpZHRoXCIsMCk7dmFyIGU9ITEsaT10aGlzOyh0aGlzLm9wdGlvbnMuZGlzYWJsZWR8fHRoaXMuJGVsZW1lbnQuaGFzQ2xhc3ModGhpcy5vcHRpb25zLmRpc2FibGVkQ2xhc3MpKSYmKHRoaXMub3B0aW9ucy5kaXNhYmxlZD0hMCx0aGlzLiRlbGVtZW50LmFkZENsYXNzKHRoaXMub3B0aW9ucy5kaXNhYmxlZENsYXNzKSksdGhpcy5pbnB1dHMubGVuZ3RofHwodGhpcy5pbnB1dHM9dCgpLmFkZCh0aGlzLiRpbnB1dCksdGhpcy5vcHRpb25zLmJpbmRpbmc9ITApLHRoaXMuX3NldEluaXRBdHRyKDApLHRoaXMuX2V2ZW50cyh0aGlzLiRoYW5kbGUpLHRoaXMuaGFuZGxlc1sxXSYmKHRoaXMub3B0aW9ucy5kb3VibGVTaWRlZD0hMCx0aGlzLiRoYW5kbGUyPXRoaXMuaGFuZGxlcy5lcSgxKSx0aGlzLiRpbnB1dDI9dGhpcy5pbnB1dHMubGVuZ3RoPjE/dGhpcy5pbnB1dHMuZXEoMSk6dChcIiNcIit0aGlzLiRoYW5kbGUyLmF0dHIoXCJhcmlhLWNvbnRyb2xzXCIpKSx0aGlzLmlucHV0c1sxXXx8KHRoaXMuaW5wdXRzPXRoaXMuaW5wdXRzLmFkZCh0aGlzLiRpbnB1dDIpKSxlPSEwLHRoaXMuX3NldEhhbmRsZVBvcyh0aGlzLiRoYW5kbGUsdGhpcy5vcHRpb25zLmluaXRpYWxTdGFydCwhMCxmdW5jdGlvbigpe2kuX3NldEhhbmRsZVBvcyhpLiRoYW5kbGUyLGkub3B0aW9ucy5pbml0aWFsRW5kLCEwKX0pLHRoaXMuX3NldEluaXRBdHRyKDEpLHRoaXMuX2V2ZW50cyh0aGlzLiRoYW5kbGUyKSksZXx8dGhpcy5fc2V0SGFuZGxlUG9zKHRoaXMuJGhhbmRsZSx0aGlzLm9wdGlvbnMuaW5pdGlhbFN0YXJ0LCEwKX19LHtrZXk6XCJfc2V0SGFuZGxlUG9zXCIsdmFsdWU6ZnVuY3Rpb24odCxpLG4scyl7aT1wYXJzZUZsb2F0KGkpLGk8dGhpcy5vcHRpb25zLnN0YXJ0P2k9dGhpcy5vcHRpb25zLnN0YXJ0Omk+dGhpcy5vcHRpb25zLmVuZCYmKGk9dGhpcy5vcHRpb25zLmVuZCk7dmFyIG89dGhpcy5vcHRpb25zLmRvdWJsZVNpZGVkO2lmKG8paWYoMD09PXRoaXMuaGFuZGxlcy5pbmRleCh0KSl7dmFyIGE9cGFyc2VGbG9hdCh0aGlzLiRoYW5kbGUyLmF0dHIoXCJhcmlhLXZhbHVlbm93XCIpKTtpPWk+PWE/YS10aGlzLm9wdGlvbnMuc3RlcDppfWVsc2V7dmFyIHI9cGFyc2VGbG9hdCh0aGlzLiRoYW5kbGUuYXR0cihcImFyaWEtdmFsdWVub3dcIikpO2k9cj49aT9yK3RoaXMub3B0aW9ucy5zdGVwOml9dGhpcy5vcHRpb25zLnZlcnRpY2FsJiYhbiYmKGk9dGhpcy5vcHRpb25zLmVuZC1pKTt2YXIgbD10aGlzLHU9dGhpcy5vcHRpb25zLnZlcnRpY2FsLGQ9dT9cImhlaWdodFwiOlwid2lkdGhcIixoPXU/XCJ0b3BcIjpcImxlZnRcIixjPXRbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClbZF0sZj10aGlzLiRlbGVtZW50WzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpW2RdLHA9ZShpLXRoaXMub3B0aW9ucy5zdGFydCx0aGlzLm9wdGlvbnMuZW5kLXRoaXMub3B0aW9ucy5zdGFydCkudG9GaXhlZCgyKSxtPShmLWMpKnAsdj0oMTAwKmUobSxmKSkudG9GaXhlZCh0aGlzLm9wdGlvbnMuZGVjaW1hbCk7aT1wYXJzZU
6780Zsb2F0KGkudG9GaXhlZCh0aGlzLm9wdGlvbnMuZGVjaW1hbCkpO3ZhciBnPXt9O2lmKHRoaXMuX3NldFZhbHVlcyh0LGkpLG8pe3ZhciB3LHk9MD09PXRoaXMuaGFuZGxlcy5pbmRleCh0KSxiPX5+KDEwMCplKGMsZikpO2lmKHkpZ1toXT12K1wiJVwiLHc9cGFyc2VGbG9hdCh0aGlzLiRoYW5kbGUyWzBdLnN0eWxlW2hdKS12K2IscyYmXCJmdW5jdGlvblwiPT10eXBlb2YgcyYmcygpO2Vsc2V7dmFyICQ9cGFyc2VGbG9hdCh0aGlzLiRoYW5kbGVbMF0uc3R5bGVbaF0pO3c9di0oaXNOYU4oJCk/dGhpcy5vcHRpb25zLmluaXRpYWxTdGFydC8oKHRoaXMub3B0aW9ucy5lbmQtdGhpcy5vcHRpb25zLnN0YXJ0KS8xMDApOiQpK2J9Z1tcIm1pbi1cIitkXT13K1wiJVwifXRoaXMuJGVsZW1lbnQub25lKFwiZmluaXNoZWQuemYuYW5pbWF0ZVwiLGZ1bmN0aW9uKCl7bC4kZWxlbWVudC50cmlnZ2VyKFwibW92ZWQuemYuc2xpZGVyXCIsW3RdKX0pO3ZhciBDPXRoaXMuJGVsZW1lbnQuZGF0YShcImRyYWdnaW5nXCIpPzFlMy82MDp0aGlzLm9wdGlvbnMubW92ZVRpbWU7Rm91bmRhdGlvbi5Nb3ZlKEMsdCxmdW5jdGlvbigpe3QuY3NzKGgsditcIiVcIiksbC5vcHRpb25zLmRvdWJsZVNpZGVkP2wuJGZpbGwuY3NzKGcpOmwuJGZpbGwuY3NzKGQsMTAwKnArXCIlXCIpfSksY2xlYXJUaW1lb3V0KGwudGltZW91dCksbC50aW1lb3V0PXNldFRpbWVvdXQoZnVuY3Rpb24oKXtsLiRlbGVtZW50LnRyaWdnZXIoXCJjaGFuZ2VkLnpmLnNsaWRlclwiLFt0XSl9LGwub3B0aW9ucy5jaGFuZ2VkRGVsYXkpfX0se2tleTpcIl9zZXRJbml0QXR0clwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuaW5wdXRzLmVxKHQpLmF0dHIoXCJpZFwiKXx8Rm91bmRhdGlvbi5HZXRZb0RpZ2l0cyg2LFwic2xpZGVyXCIpO3RoaXMuaW5wdXRzLmVxKHQpLmF0dHIoe2lkOmUsbWF4OnRoaXMub3B0aW9ucy5lbmQsbWluOnRoaXMub3B0aW9ucy5zdGFydCxzdGVwOnRoaXMub3B0aW9ucy5zdGVwfSksdGhpcy5oYW5kbGVzLmVxKHQpLmF0dHIoe3JvbGU6XCJzbGlkZXJcIixcImFyaWEtY29udHJvbHNcIjplLFwiYXJpYS12YWx1ZW1heFwiOnRoaXMub3B0aW9ucy5lbmQsXCJhcmlhLXZhbHVlbWluXCI6dGhpcy5vcHRpb25zLnN0YXJ0LFwiYXJpYS12YWx1ZW5vd1wiOjA9PT10P3RoaXMub3B0aW9ucy5pbml0aWFsU3RhcnQ6dGhpcy5vcHRpb25zLmluaXRpYWxFbmQsXCJhcmlhLW9yaWVudGF0aW9uXCI6dGhpcy5vcHRpb25zLnZlcnRpY2FsP1widmVydGljYWxcIjpcImhvcml6b250YWxcIix0YWJpbmRleDowfSl9fSx7a2V5OlwiX3NldFZhbHVlc1wiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5vcHRpb25zLmRvdWJsZVNpZGVkP3RoaXMuaGFuZGxlcy5pbmRleCh0KTowO3RoaXMuaW5wdXRzLmVxKGkpLnZhbChlKSx0LmF0dHIoXCJhcmlhLXZhbHVlbm93XCIsZSl9fSx7a2V5OlwiX2hhbmRsZUV2ZW50XCIsdmFsdWU6ZnVuY3Rpb24odCxuLHMpe3ZhciBvLGE7aWYocylvPXRoaXMuX2FkanVzdFZhbHVlKG51bGwscyksYT0hMDtlbHNle3QucHJldmVudERlZmF1bHQoKTt2YXIgcj10aGlzLGw9dGhpcy5vcHRpb25zLnZlcnRpY2FsLHU9bD9cImhlaWdodFwiOlwid2lkdGhcIixkPWw/XCJ0b3BcIjpcImxlZnRcIixoPWw/dC5wYWdlWTp0LnBhZ2VYLGM9dGhpcy4kaGFuZGxlWzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpW3VdLzIsZj10aGlzLiRlbGVtZW50WzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpW3VdLHA9dGhpcy4kZWxlbWVudC5vZmZzZXQoKVtkXS1oLG09cD4wPy1jOi1mPnAtYz9mOk1hdGguYWJzKHApLHY9ZShtLGYpO2lmKG89KHRoaXMub3B0aW9ucy5lbmQtdGhpcy5vcHRpb25zLnN0YXJ0KSp2K3RoaXMub3B0aW9ucy5zdGFydCxGb3VuZGF0aW9uLnJ0bCgpJiYhdGhpcy5vcHRpb25zLnZlcnRpY2FsJiYobz10aGlzLm9wdGlvbnMuZW5kLW8pLG89ci5fYWRqdXN0VmFsdWUobnVsbCxvKSxhPSExLCFuKXt2YXIgZz1pKHRoaXMuJGhhbmRsZSxkLG0sdSksdz1pKHRoaXMuJGhhbmRsZTIsZCxtLHUpO249dz49Zz90aGlzLiRoYW5kbGU6dGhpcy4kaGFuZGxlMn19dGhpcy5fc2V0SGFuZGxlUG9zKG4sbyxhKX19LHtrZXk6XCJfYWRqdXN0VmFsdWVcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpLG4scyxvLGE9dGhpcy5vcHRpb25zLnN0ZXAscj1wYXJzZUZsb2F0KGEvMik7cmV0dXJuIGk9dD9wYXJzZUZsb2F0KHQuYXR0cihcImFyaWEtdmFsdWVub3dcIikpOmUsbj1pJWEscz1pLW4sbz1zK2EsMD09PW4/aTppPWk+PXMrcj9vOnN9fSx7a2V5OlwiX2V2ZW50c1wiLHZhbHVlOmZ1bmN0aW9uKGUpe2lmKHRoaXMub3B0aW9ucy5kaXNhYmxlZClyZXR1cm4hMTt2YXIgaSxuPXRoaXM7aWYodGhpcy5pbnB1dHMub2ZmKFwiY2hhbmdlLnpmLnNsaWRlclwiKS5vbihcImNoYW5nZS56Zi5zbGlkZXJcIixmdW5jdGlvbihlKXt2YXIgaT1uLmlucHV0cy5pbmRleCh0KHRoaXMpKTtuLl9oYW5kbGVFdmVudChlLG4uaGFuZGxlcy5lcShpKSx0KHRoaXMpLnZhbCgpKX0pLHRoaXMub3B0aW9ucy5jbGlja1NlbGVjdCYmdGhpcy4kZWxlbWVudC5vZmYoXCJjbGljay56Zi5zbGlkZXJcIikub24oXCJjbGljay56Zi5zbGlkZXJcIixmdW5jdGlvbihlKXtyZXR1cm4gbi4kZWxlbWVudC5kYXRhKFwiZHJhZ2dpbmdcIik/ITE6dm9pZCh0KGUudGFyZ2V0KS5pcyhcIltkYXRhLXNsaWRlci1oYW5kbGVdXCIpfHwobi5vcHRpb25zLmRvdWJsZVNpZGVkP24uX2hhbmRsZUV2ZW50KGUpOm4uX2hhbmRsZUV2ZW50KGUsbi4kaGFuZGxlKSkpfSksdGhpcy5vcHRpb25zLmRyYWdnYWJsZSl7dGhpcy5oYW5kbGVzLmFkZFRvdWNoKCk7dmFyIHM9dChcImJvZHlcIik7ZS5vZmYoXCJtb3VzZWRvd24uemYuc2xpZGVyXCIpLm9uKFwibW91c2Vkb3duLnpmLnNsaWRlclwiLGZ1bmN0aW9uKG8pe2UuYWRkQ2xhc3MoXCJpcy1kcmFnZ2luZ1wiKSxuLiRmaWxsLmFkZENsYXNzKFwiaXMtZHJhZ2dpbmdcIiksbi4kZWxlbWVudC5kYXRhKFwiZHJhZ2dpbmdcIiwhMCksaT10KG8uY3VycmVudFRhcmdldCkscy5vbihcIm1vdXNlbW92ZS56Zi5zbGlkZXJcIixmdW5jdGlvbih0KXt0LnByZXZlbn
6780REZWZhdWx0KCksbi5faGFuZGxlRXZlbnQodCxpKX0pLm9uKFwibW91c2V1cC56Zi5zbGlkZXJcIixmdW5jdGlvbih0KXtuLl9oYW5kbGVFdmVudCh0LGkpLGUucmVtb3ZlQ2xhc3MoXCJpcy1kcmFnZ2luZ1wiKSxuLiRmaWxsLnJlbW92ZUNsYXNzKFwiaXMtZHJhZ2dpbmdcIiksbi4kZWxlbWVudC5kYXRhKFwiZHJhZ2dpbmdcIiwhMSkscy5vZmYoXCJtb3VzZW1vdmUuemYuc2xpZGVyIG1vdXNldXAuemYuc2xpZGVyXCIpfSl9KX1lLm9mZihcImtleWRvd24uemYuc2xpZGVyXCIpLm9uKFwia2V5ZG93bi56Zi5zbGlkZXJcIixmdW5jdGlvbihlKXt2YXIgaSxzPXQodGhpcyksbz1uLm9wdGlvbnMuZG91YmxlU2lkZWQ/bi5oYW5kbGVzLmluZGV4KHMpOjAsYT1wYXJzZUZsb2F0KG4uaW5wdXRzLmVxKG8pLnZhbCgpKTtGb3VuZGF0aW9uLktleWJvYXJkLmhhbmRsZUtleShlLFwiU2xpZGVyXCIse2RlY3JlYXNlOmZ1bmN0aW9uKCl7aT1hLW4ub3B0aW9ucy5zdGVwfSxpbmNyZWFzZTpmdW5jdGlvbigpe2k9YStuLm9wdGlvbnMuc3RlcH0sZGVjcmVhc2VfZmFzdDpmdW5jdGlvbigpe2k9YS0xMCpuLm9wdGlvbnMuc3RlcH0saW5jcmVhc2VfZmFzdDpmdW5jdGlvbigpe2k9YSsxMCpuLm9wdGlvbnMuc3RlcH0saGFuZGxlZDpmdW5jdGlvbigpe2UucHJldmVudERlZmF1bHQoKSxuLl9zZXRIYW5kbGVQb3MocyxpLCEwKX19KX0pfX0se2tleTpcImRlc3Ryb3lcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuaGFuZGxlcy5vZmYoXCIuemYuc2xpZGVyXCIpLHRoaXMuaW5wdXRzLm9mZihcIi56Zi5zbGlkZXJcIiksdGhpcy4kZWxlbWVudC5vZmYoXCIuemYuc2xpZGVyXCIpLEZvdW5kYXRpb24udW5yZWdpc3RlclBsdWdpbih0aGlzKX19XSksbn0oKTtuLmRlZmF1bHRzPXtzdGFydDowLGVuZDoxMDAsc3RlcDoxLGluaXRpYWxTdGFydDowLGluaXRpYWxFbmQ6MTAwLGJpbmRpbmc6ITEsY2xpY2tTZWxlY3Q6ITAsdmVydGljYWw6ITEsZHJhZ2dhYmxlOiEwLGRpc2FibGVkOiExLGRvdWJsZVNpZGVkOiExLGRlY2ltYWw6Mixtb3ZlVGltZToyMDAsZGlzYWJsZWRDbGFzczpcImRpc2FibGVkXCIsaW52ZXJ0VmVydGljYWw6ITEsY2hhbmdlZERlbGF5OjUwMH0sRm91bmRhdGlvbi5wbHVnaW4obixcIlNsaWRlclwiKX0oalF1ZXJ5KTt2YXIgX2NyZWF0ZUNsYXNzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKXt2YXIgbj1lW2ldO24uZW51bWVyYWJsZT1uLmVudW1lcmFibGV8fCExLG4uY29uZmlndXJhYmxlPSEwLFwidmFsdWVcImluIG4mJihuLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxuLmtleSxuKX19cmV0dXJuIGZ1bmN0aW9uKGUsaSxuKXtyZXR1cm4gaSYmdChlLnByb3RvdHlwZSxpKSxuJiZ0KGUsbiksZX19KCk7IWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCl7cmV0dXJuIHBhcnNlSW50KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmJvZHksbnVsbCkuZm9udFNpemUsMTApKnR9dmFyIGk9ZnVuY3Rpb24oKXtmdW5jdGlvbiBpKGUsbil7X2NsYXNzQ2FsbENoZWNrKHRoaXMsaSksdGhpcy4kZWxlbWVudD1lLHRoaXMub3B0aW9ucz10LmV4dGVuZCh7fSxpLmRlZmF1bHRzLHRoaXMuJGVsZW1lbnQuZGF0YSgpLG4pLHRoaXMuX2luaXQoKSxGb3VuZGF0aW9uLnJlZ2lzdGVyUGx1Z2luKHRoaXMsXCJTdGlja3lcIil9cmV0dXJuIF9jcmVhdGVDbGFzcyhpLFt7a2V5OlwiX2luaXRcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMuJGVsZW1lbnQucGFyZW50KFwiW2RhdGEtc3RpY2t5LWNvbnRhaW5lcl1cIiksaT10aGlzLiRlbGVtZW50WzBdLmlkfHxGb3VuZGF0aW9uLkdldFlvRGlnaXRzKDYsXCJzdGlja3lcIiksbj10aGlzO2UubGVuZ3RofHwodGhpcy53YXNXcmFwcGVkPSEwKSx0aGlzLiRjb250YWluZXI9ZS5sZW5ndGg/ZTp0KHRoaXMub3B0aW9ucy5jb250YWluZXIpLndyYXBJbm5lcih0aGlzLiRlbGVtZW50KSx0aGlzLiRjb250YWluZXIuYWRkQ2xhc3ModGhpcy5vcHRpb25zLmNvbnRhaW5lckNsYXNzKSx0aGlzLiRlbGVtZW50LmFkZENsYXNzKHRoaXMub3B0aW9ucy5zdGlja3lDbGFzcykuYXR0cih7XCJkYXRhLXJlc2l6ZVwiOml9KSx0aGlzLnNjcm9sbENvdW50PXRoaXMub3B0aW9ucy5jaGVja0V2ZXJ5LHRoaXMuaXNTdHVjaz0hMSx0KHdpbmRvdykub25lKFwibG9hZC56Zi5zdGlja3lcIixmdW5jdGlvbigpe1wiXCIhPT1uLm9wdGlvbnMuYW5jaG9yP24uJGFuY2hvcj10KFwiI1wiK24ub3B0aW9ucy5hbmNob3IpOm4uX3BhcnNlUG9pbnRzKCksbi5fc2V0U2l6ZXMoZnVuY3Rpb24oKXtuLl9jYWxjKCExKX0pLG4uX2V2ZW50cyhpLnNwbGl0KFwiLVwiKS5yZXZlcnNlKCkuam9pbihcIi1cIikpfSl9fSx7a2V5OlwiX3BhcnNlUG9pbnRzXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9wdGlvbnMudG9wQW5jaG9yLGk9dGhpcy5vcHRpb25zLmJ0bUFuY2hvcixuPVtlLGldLHM9e307aWYoZSYmaSlmb3IodmFyIG89MCxhPW4ubGVuZ3RoO2E+byYmbltvXTtvKyspe3ZhciByO2lmKFwibnVtYmVyXCI9PXR5cGVvZiBuW29dKXI9bltvXTtlbHNle3ZhciBsPW5bb10uc3BsaXQoXCI6XCIpLHU9dChcIiNcIitsWzBdKTtyPXUub2Zmc2V0KCkudG9wLGxbMV0mJlwiYm90dG9tXCI9PT1sWzFdLnRvTG93ZXJDYXNlKCkmJihyKz11WzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCl9c1tvXT1yfWVsc2Ugcz17MDoxLDE6ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbEhlaWdodH07dGhpcy5wb2ludHM9c319LHtrZXk6XCJfZXZlbnRzXCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIGk9dGhpcyxuPXRoaXMuc2Nyb2xsTGlzdGVuZXI9XCJzY3JvbGwuemYuXCIrZTt0aGlzLmlzT258fCh0aGlzLmNhblN0aWNrJiYodGhpcy5pc09uPSEwLHQod2luZG93KS5vZmYobikub24obixmdW5jdGlvbih0KXswPT09aS5zY3JvbGxDb3VudD8oaS5zY3JvbGxDb3VudD1pLm9wdGlvbnMuY2hlY2tFdmVyeSxpLl9zZXRTaXplcyhmdW5jdGlvbigpe2kuX2NhbGMoITEsd2luZG93LnBhZ2VZT2Zmc2V0KX0pKTooaS5zY3JvbGxDb3VudC0tLGkuX2NhbGMoITEsd2luZG93LnBhZ2VZT2Zmc2V0KSl9KSksdGhpcy4kZWxlbWVudC5vZmYoXCJyZXNpemVtZS56Zi50cmlnZ2VyXCIpLm9uKFwicmVzaXplbWUuemYudHJpZ2dlclwiLGZ1bmN0aW9uKHQscyl7aS5fc2V0U2l6ZXMoZnVuY3Rpb24oKXtpLl9jYWxjKCExKSxpLmNhblN0aWNrP2kuaXNPbnx8aS5fZXZlbnRzKGUpOmkuaXNPbiYmaS5fcGF1c2VMaXN0ZW5lcnMobil9KX0pKX19LHtrZXk6XCJfcGF1c2VMaXN0ZW5lcnNcIix2YWx1ZTpmdW5jdGlvbihlKXt0aGlzLmlzT249ITEsdCh3aW5kb3cpLm9mZihlKSx0aGlzLiRlbGVtZW50LnRyaWdnZXIoXCJwYXVzZS56Zi5zdGlja3lcIil9fSx7a2V5OlwiX2NhbGNcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3JldHVybiB0JiZ0aGlzLl9zZXRTaXplcygpLHRoaXMuY2FuU3RpY2s/KGV8fChlPXdpbmRvdy5wYWdlWU9mZnNldCksdm9pZChlPj10aGlzLnRvcFBvaW50P2U8PXRoaXMuYm90dG9tUG9pbnQ/dGhpcy5pc1N0dWNrfHx0aGlzLl9zZXRTdGlja3koKTp0aGlzLmlzU3R1Y2smJnRoaXMuX3JlbW92ZVN0aWNreSghMSk6dGhpcy5pc1N0dWNrJiZ0aGlzLl9yZW1vdmVTdGlja3koITApKSk6KHRoaXMuaXNTdHVjayYmdGhpcy5fcmVtb3ZlU3RpY2t5KCEwKSwhMSl9fSx7a2V5OlwiX3NldFN0aWNreVwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHRpb25zLnN0aWNrVG8sZT1cInRvcFwiPT09dD9cIm1hcmdpblRvcFwiOlwibWFyZ2luQm90dG9tXCIsaT1cInRvcFwiPT09dD9cImJvdHRvbVwiOlwidG9wXCIsbj17fTtuW2VdPXRoaXMub3B0aW9uc1tlXStcImVtXCIsblt0XT0wLG5baV09XCJhdXRvXCIsbi5sZWZ0PXRoaXMuJGNvbnRhaW5lci5vZmZzZXQoKS5sZWZ0K3BhcnNlSW50KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMuJGNvbnRhaW5lclswXSlbXCJwYWRkaW5nLWxlZnRcIl0sMTApLHRoaXMuaXNTdHVjaz0hMCx0aGlzLiRlbGVtZW50LnJlbW92ZUNsYXNzKFwiaXMtYW5jaG9yZWQgaXMtYXQtXCIraSkuYWRk
6780Q2xhc3MoXCJpcy1zdHVjayBpcy1hdC1cIit0KS5jc3MobikudHJpZ2dlcihcInN0aWNreS56Zi5zdHVja3RvOlwiK3QpfX0se2tleTpcIl9yZW1vdmVTdGlja3lcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLm9wdGlvbnMuc3RpY2tUbyxpPVwidG9wXCI9PT1lLG49e30scz0odGhpcy5wb2ludHM/dGhpcy5wb2ludHNbMV0tdGhpcy5wb2ludHNbMF06dGhpcy5hbmNob3JIZWlnaHQpLXRoaXMuZWxlbUhlaWdodCxvPWk/XCJtYXJnaW5Ub3BcIjpcIm1hcmdpbkJvdHRvbVwiLGE9aT9cImJvdHRvbVwiOlwidG9wXCIscj10P1widG9wXCI6XCJib3R0b21cIjtuW29dPTAsdCYmIWl8fGkmJiF0PyhuW2VdPXMsblthXT0wKToobltlXT0wLG5bYV09cyksbi5sZWZ0PVwiXCIsdGhpcy5pc1N0dWNrPSExLHRoaXMuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoXCJpcy1zdHVjayBpcy1hdC1cIitlKS5hZGRDbGFzcyhcImlzLWFuY2hvcmVkIGlzLWF0LVwiK3IpLmNzcyhuKS50cmlnZ2VyKFwic3RpY2t5LnpmLnVuc3R1Y2tmcm9tOlwiK3IpfX0se2tleTpcIl9zZXRTaXplc1wiLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMuY2FuU3RpY2s9Rm91bmRhdGlvbi5NZWRpYVF1ZXJ5LmF0TGVhc3QodGhpcy5vcHRpb25zLnN0aWNreU9uKSx0aGlzLmNhblN0aWNrfHx0KCk7dmFyIGU9dGhpcy4kY29udGFpbmVyWzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoLGk9d2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy4kY29udGFpbmVyWzBdKSxuPXBhcnNlSW50KGlbXCJwYWRkaW5nLXJpZ2h0XCJdLDEwKTt0aGlzLiRhbmNob3ImJnRoaXMuJGFuY2hvci5sZW5ndGg/dGhpcy5hbmNob3JIZWlnaHQ9dGhpcy4kYW5jaG9yWzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDp0aGlzLl9wYXJzZVBvaW50cygpLHRoaXMuJGVsZW1lbnQuY3NzKHtcIm1heC13aWR0aFwiOmUtbitcInB4XCJ9KTt2YXIgcz10aGlzLiRlbGVtZW50WzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodHx8dGhpcy5jb250YWluZXJIZWlnaHQ7dGhpcy5jb250YWluZXJIZWlnaHQ9cyx0aGlzLiRjb250YWluZXIuY3NzKHtoZWlnaHQ6c30pLHRoaXMuZWxlbUhlaWdodD1zLHRoaXMuaXNTdHVjayYmdGhpcy4kZWxlbWVudC5jc3Moe2xlZnQ6dGhpcy4kY29udGFpbmVyLm9mZnNldCgpLmxlZnQrcGFyc2VJbnQoaVtcInBhZGRpbmctbGVmdFwiXSwxMCl9KSx0aGlzLl9zZXRCcmVha1BvaW50cyhzLGZ1bmN0aW9uKCl7dCYmdCgpfSl9fSx7a2V5OlwiX3NldEJyZWFrUG9pbnRzXCIsdmFsdWU6ZnVuY3Rpb24odCxpKXtpZighdGhpcy5jYW5TdGljayl7aWYoIWkpcmV0dXJuITE7aSgpfXZhciBuPWUodGhpcy5vcHRpb25zLm1hcmdpblRvcCkscz1lKHRoaXMub3B0aW9ucy5tYXJnaW5Cb3R0b20pLG89dGhpcy5wb2ludHM/dGhpcy5wb2ludHNbMF06dGhpcy4kYW5jaG9yLm9mZnNldCgpLnRvcCxhPXRoaXMucG9pbnRzP3RoaXMucG9pbnRzWzFdOm8rdGhpcy5hbmNob3JIZWlnaHQscj13aW5kb3cuaW5uZXJIZWlnaHQ7XCJ0b3BcIj09PXRoaXMub3B0aW9ucy5zdGlja1RvPyhvLT1uLGEtPXQrbik6XCJib3R0b21cIj09PXRoaXMub3B0aW9ucy5zdGlja1RvJiYoby09ci0odCtzKSxhLT1yLXMpLHRoaXMudG9wUG9pbnQ9byx0aGlzLmJvdHRvbVBvaW50PWEsaSYmaSgpfX0se2tleTpcImRlc3Ryb3lcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuX3JlbW92ZVN0aWNreSghMCksdGhpcy4kZWxlbWVudC5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMuc3RpY2t5Q2xhc3MrXCIgaXMtYW5jaG9yZWQgaXMtYXQtdG9wXCIpLmNzcyh7aGVpZ2h0OlwiXCIsdG9wOlwiXCIsYm90dG9tOlwiXCIsXCJtYXgtd2lkdGhcIjpcIlwifSkub2ZmKFwicmVzaXplbWUuemYudHJpZ2dlclwiKSx0aGlzLiRhbmNob3Iub2ZmKFwiY2hhbmdlLnpmLnN0aWNreVwiKSx0KHdpbmRvdykub2ZmKHRoaXMuc2Nyb2xsTGlzdGVuZXIpLHRoaXMud2FzV3JhcHBlZD90aGlzLiRlbGVtZW50LnVud3JhcCgpOnRoaXMuJGNvbnRhaW5lci5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMuY29udGFpbmVyQ2xhc3MpLmNzcyh7aGVpZ2h0OlwiXCJ9KSxGb3VuZGF0aW9uLnVucmVnaXN0ZXJQbHVnaW4odGhpcyl9fV0pLGl9KCk7aS5kZWZhdWx0cz17Y29udGFpbmVyOlwiPGRpdiBkYXRhLXN0aWNreS1jb250YWluZXI+PC9kaXY+XCIsc3RpY2tUbzpcInRvcFwiLGFuY2hvcjpcIlwiLHRvcEFuY2hvcjpcIlwiLGJ0bUFuY2hvcjpcIlwiLG1hcmdpblRvcDoxLG1hcmdpbkJvdHRvbToxLHN0aWNreU9uOlwibWVkaXVtXCIsc3RpY2t5Q2xhc3M6XCJzdGlja3lcIixjb250YWluZXJDbGFzczpcInN0aWNreS1jb250YWluZXJcIixjaGVja0V2ZXJ5Oi0xfSxGb3VuZGF0aW9uLnBsdWdpbihpLFwiU3RpY2t5XCIpfShqUXVlcnkpO3ZhciBfY3JlYXRlQ2xhc3M9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBuPWVbaV07bi5lbnVtZXJhYmxlPW4uZW51bWVyYWJsZXx8ITEsbi5jb25maWd1cmFibGU9ITAsXCJ2YWx1ZVwiaW4gbiYmKG4ud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG4ua2V5LG4pfX1yZXR1cm4gZnVuY3Rpb24oZSxpLG4pe3JldHVybiBpJiZ0KGUucHJvdG90eXBlLGkpLG4mJnQoZSxuKSxlfX0oKTshZnVuY3Rpb24odCl7dmFyIGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGksbil7X2NsYXNzQ2FsbENoZWNrKHRoaXMsZSksdGhpcy4kZWxlbWVudD1pLHRoaXMub3B0aW9ucz10LmV4dGVuZCh7fSxlLmRlZmF1bHRzLHRoaXMuJGVsZW1lbnQuZGF0YSgpLG4pLHRoaXMuX2luaXQoKSxGb3VuZGF0aW9uLnJlZ2lzdGVyUGx1Z2luKHRoaXMsXCJUYWJzXCIpLEZvdW5kYXRpb24uS2V5Ym9hcmQucmVnaXN0ZXIoXCJUYWJzXCIse0VOVEVSOlwib3BlblwiLFNQQUNFOlwib3BlblwiLEFSUk9XX1JJR0hUOlwibmV4dFwiLEFSUk9XX1VQOlwicHJldmlvdXNcIixBUlJPV19ET1dOOlwibmV4dFwiLEFSUk9XX0xFRlQ6XCJwcmV2aW91c1wifSl9cmV0dXJuIF9jcmVhdGVDbGFzcyhlLFt7a2V5OlwiX2luaXRcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXR
6780oaXM7aWYodGhpcy4kdGFiVGl0bGVzPXRoaXMuJGVsZW1lbnQuZmluZChcIi5cIit0aGlzLm9wdGlvbnMubGlua0NsYXNzKSx0aGlzLiR0YWJDb250ZW50PXQoJ1tkYXRhLXRhYnMtY29udGVudD1cIicrdGhpcy4kZWxlbWVudFswXS5pZCsnXCJdJyksdGhpcy4kdGFiVGl0bGVzLmVhY2goZnVuY3Rpb24oKXt2YXIgaT10KHRoaXMpLG49aS5maW5kKFwiYVwiKSxzPWkuaGFzQ2xhc3MoXCJpcy1hY3RpdmVcIiksbz1uWzBdLmhhc2guc2xpY2UoMSksYT1uWzBdLmlkP25bMF0uaWQ6bytcIi1sYWJlbFwiLHI9dChcIiNcIitvKTtpLmF0dHIoe3JvbGU6XCJwcmVzZW50YXRpb25cIn0pLG4uYXR0cih7cm9sZTpcInRhYlwiLFwiYXJpYS1jb250cm9sc1wiOm8sXCJhcmlhLXNlbGVjdGVkXCI6cyxpZDphfSksci5hdHRyKHtyb2xlOlwidGFicGFuZWxcIixcImFyaWEtaGlkZGVuXCI6IXMsXCJhcmlhLWxhYmVsbGVkYnlcIjphfSkscyYmZS5vcHRpb25zLmF1dG9Gb2N1cyYmbi5mb2N1cygpfSksdGhpcy5vcHRpb25zLm1hdGNoSGVpZ2h0KXt2YXIgaT10aGlzLiR0YWJDb250ZW50LmZpbmQoXCJpbWdcIik7aS5sZW5ndGg/Rm91bmRhdGlvbi5vbkltYWdlc0xvYWRlZChpLHRoaXMuX3NldEhlaWdodC5iaW5kKHRoaXMpKTp0aGlzLl9zZXRIZWlnaHQoKX10aGlzLl9ldmVudHMoKX19LHtrZXk6XCJfZXZlbnRzXCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLl9hZGRLZXlIYW5kbGVyKCksdGhpcy5fYWRkQ2xpY2tIYW5kbGVyKCksdGhpcy5vcHRpb25zLm1hdGNoSGVpZ2h0JiZ0KHdpbmRvdykub24oXCJjaGFuZ2VkLnpmLm1lZGlhcXVlcnlcIix0aGlzLl9zZXRIZWlnaHQuYmluZCh0aGlzKSl9fSx7a2V5OlwiX2FkZENsaWNrSGFuZGxlclwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLiRlbGVtZW50Lm9mZihcImNsaWNrLnpmLnRhYnNcIikub24oXCJjbGljay56Zi50YWJzXCIsXCIuXCIrdGh
6780pcy5vcHRpb25zLmxpbmtDbGFzcyxmdW5jdGlvbihpKXtpLnByZXZlbnREZWZhdWx0KCksaS5zdG9wUHJvcGFnYXRpb24oKSx0KHRoaXMpLmhhc0NsYXNzKFwiaXMtYWN0aXZlXCIpfHxlLl9oYW5kbGVUYWJDaGFuZ2UodCh0aGlzKSl9KX19LHtrZXk6XCJfYWRkS2V5SGFuZGxlclwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcztlLiRlbGVtZW50LmZpbmQoXCJsaTpmaXJzdC1vZi10eXBlXCIpLGUuJGVsZW1lbnQuZmluZChcImxpOmxhc3Qtb2YtdHlwZVwiKTt0aGlzLiR0YWJUaXRsZXMub2ZmKFwia2V5ZG93bi56Zi50YWJzXCIpLm9uKFwia2V5ZG93bi56Zi50YWJzXCIsZnVuY3Rpb24oaSl7aWYoOSE9PWkud2hpY2gpe2kuc3RvcFByb3BhZ2F0aW9uKCksaS5wcmV2ZW50RGVmYXVsdCgpO1xudmFyIG4scyxvPXQodGhpcyksYT1vLnBhcmVudChcInVsXCIpLmNoaWxkcmVuKFwibGlcIik7YS5lYWNoKGZ1bmN0aW9uKGkpe3JldHVybiB0KHRoaXMpLmlzKG8pP3ZvaWQoZS5vcHRpb25zLndyYXBPbktleXM/KG49MD09PWk/YS5sYXN0KCk6YS5lcShpLTEpLHM9aT09PWEubGVuZ3RoLTE/YS5maXJzdCgpOmEuZXEoaSsxKSk6KG49YS5lcShNYXRoLm1heCgwLGktMSkpLHM9YS5lcShNYXRoLm1pbihpKzEsYS5sZW5ndGgtMSkpKSk6dm9pZCAwfSksRm91bmRhdGlvbi5LZXlib2FyZC5oYW5kbGVLZXkoaSxcIlRhYnNcIix7b3BlbjpmdW5jdGlvbigpe28uZmluZCgnW3JvbGU9XCJ0YWJcIl0nKS5mb2N1cygpLGUuX2hhbmRsZVRhYkNoYW5nZShvKX0scHJldmlvdXM6ZnVuY3Rpb24oKXtuLmZpbmQoJ1tyb2xlPVwidGFiXCJdJykuZm9jdXMoKSxlLl9oYW5kbGVUYWJDaGFuZ2Uobil9LG5leHQ6ZnVuY3Rpb24oKXtzLmZpbmQoJ1tyb2xlPVwidGFiXCJdJykuZm9jdXMoKSxlLl9oYW5kbGVUYWJDaGFuZ2Uocyl9fSl9fSl9fSx7a2V5OlwiX2hhbmRsZVRhYkNoYW5nZVwiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciBpPWUuZmluZCgnW3JvbGU9XCJ0YWJcIl0nKSxuPWlbMF0uaGFzaCxzPXRoaXMuJHRhYkNvbnRlbnQuZmluZChuKSxvPXRoaXMuJGVsZW1lbnQuZmluZChcIi5cIit0aGlzLm9wdGlvbnMubGlua0NsYXNzK1wiLmlzLWFjdGl2ZVwiKS5yZW1vdmVDbGFzcyhcImlzLWFjdGl2ZVwiKS5maW5kKCdbcm9sZT1cInRhYlwiXScpLmF0dHIoe1wiYXJpYS1zZWxlY3RlZFwiOlwiZmFsc2VcIn0pO3QoXCIjXCIrby5hdHRyKFwiYXJpYS1jb250cm9sc1wiKSkucmVtb3ZlQ2xhc3MoXCJpcy1hY3RpdmVcIikuYXR0cih7XCJhcmlhLWhpZGRlblwiOlwidHJ1ZVwifSksZS5hZGRDbGFzcyhcImlzLWFjdGl2ZVwiKSxpLmF0dHIoe1wiYXJpYS1zZWxlY3RlZFwiOlwidHJ1ZVwifSkscy5hZGRDbGFzcyhcImlzLWFjdGl2ZVwiKS5hdHRyKHtcImFyaWEtaGlkZGVuXCI6XCJmYWxzZVwifSksdGhpcy4kZWxlbWVudC50cmlnZ2VyKFwiY2hhbmdlLnpmLnRhYnNcIixbZV0pfX0se2tleTpcInNlbGVjdFRhYlwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlO2U9XCJvYmplY3RcIj09dHlwZW9mIHQ/dFswXS5pZDp0LGUuaW5kZXhPZihcIiNcIik8MCYmKGU9XCIjXCIrZSk7dmFyIGk9dGhpcy4kdGFiVGl0bGVzLmZpbmQoJ1tocmVmPVwiJytlKydcIl0nKS5wYXJlbnQoXCIuXCIrdGhpcy5vcHRpb25zLmxpbmtDbGFzcyk7dGhpcy5faGFuZGxlVGFiQ2hhbmdlKGkpfX0se2tleTpcIl9zZXRIZWlnaHRcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPTA7dGhpcy4kdGFiQ29udGVudC5maW5kKFwiLlwiK3RoaXMub3B0aW9ucy5wYW5lbENsYXNzKS5jc3MoXCJoZWlnaHRcIixcIlwiKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGk9dCh0aGlzKSxuPWkuaGFzQ2xhc3MoXCJpcy1hY3RpdmVcIik7bnx8aS5jc3Moe3Zpc2liaWxpdHk6XCJoaWRkZW5cIixkaXNwbGF5OlwiYmxvY2tcIn0pO3ZhciBzPXRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O258fGkuY3NzKHt2aXNpYmlsaXR5OlwiXCIsZGlzcGxheTpcIlwifSksZT1zPmU/czplfSkuY3NzKFwiaGVpZ2h0XCIsZStcInB4XCIpfX0se2tleTpcImRlc3Ryb3lcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuJGVsZW1lbnQuZmluZChcIi5cIit0aGlzLm9wdGlvbnMubGlua0NsYXNzKS5vZmYoXCIuemYudGFic1wiKS5oaWRlKCkuZW5kKCkuZmluZChcIi5cIit0aGlzLm9wdGlvbnMucGFuZWxDbGFzcykuaGlkZSgpLHRoaXMub3B0aW9ucy5tYXRjaEhlaWdodCYmdCh3aW5kb3cpLm9mZihcImNoYW5nZWQuemYubWVkaWFxdWVyeVwiKSxGb3VuZGF0aW9uLnVucmVnaXN0ZXJQbHVnaW4odGhpcyl9fV0pLGV9KCk7ZS5kZWZhdWx0cz17YXV0b0ZvY3VzOiExLHdyYXBPbktleXM6ITAsbWF0Y2hIZWlnaHQ6ITEsbGlua0NsYXNzOlwidGFicy10aXRsZVwiLHBhbmVsQ2xhc3M6XCJ0YWJzLXBhbmVsXCJ9LEZvdW5kYXRpb24ucGx1Z2luKGUsXCJUYWJzXCIpfShqUXVlcnkpO3ZhciBfY3JlYXRlQ2xhc3M9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBuPWVbaV07bi5lbnVtZXJhYmxlPW4uZW51bWVyYWJsZXx8ITEsbi5jb25maWd1cmFibGU9ITAsXCJ2YWx1ZVwiaW4gbiYmKG4ud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG4ua2V5LG4pfX1yZXR1cm4gZnVuY3Rpb24oZSxpLG4pe3JldHVybiBpJiZ0KGUucHJvdG90eXBlLGkpLG4mJnQoZSxuKSxlfX0oKTshZnVuY3Rpb24odCl7dmFyIGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGksbil7X2NsYXNzQ2FsbENoZWNrKHRoaXMsZSksdGhpcy4kZWxlbWVudD1pLHRoaXMub3B0aW9ucz10LmV4dGVuZCh7fSxlLmRlZmF1bHRzLGkuZGF0YSgpLG4pLHRoaXMuY2xhc3NOYW1lPVwiXCIsdGhpcy5faW5pdCgpLHRoaXMuX2V2ZW50cygpLEZvdW5kYXRpb24ucmVnaXN0ZXJQbHVnaW4odGhpcyxcIlRvZ2dsZXJcIil9cmV0dXJuIF9jcmVhdGVDbGFzcyhlLFt7a2V5OlwiX2luaXRcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlO3RoaXMub3B0aW9ucy5hbmltYXRlPyhlPXRoaXMub3B0aW9ucy5hbmltYXRlLnNwbGl0KFwiIFwiKSx0aGlzLmFuaW1hdGlvbkluPWVbMF0sdGhpcy5hbmltYXRpb25PdXQ9ZVsxXXx8bnVsbCk6KGU9dGhpcy4kZWxlbWVudC5kYXRhKFwidG9nZ2xlclwiKSx0aGlzLmNsYXNzTmFtZT1cIi5cIj09PWVbMF0/ZS5zbGljZSgxKTplKTt2YXIgaT10aGlzLiRlbGVtZW50WzBdLmlkO3QoJ1tkYXRhLW9wZW49XCInK2krJ1wiXSwgW2RhdGEtY2xvc2U9XCInK2krJ1wiXSwgW2RhdGEtdG9nZ2xlPVwiJytpKydcIl0nKS5hdHRyKFwiYXJpYS1jb250cm9sc1wiLGkpLHRoaXMuJGVsZW1lbnQuYXR0cihcImFyaWEtZXhwYW5kZWRcIiwhdGhpcy4kZWxlbWVudC5pcyhcIjpoaWRkZW5cIikpfX0se2tleTpcIl9ldmVudHNcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuJGVsZW1lbnQub2ZmKFwidG9nZ2xlLnpmLnRyaWdnZXJcIikub24oXCJ0b2dnbGUuemYudHJpZ2dlclwiLHRoaXMudG9nZ2xlLmJpbmQodGhpcykpfX0se2tleTpcInRvZ2dsZVwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpc1t0aGlzLm9wdGlvbnMuYW5pbWF0ZT9cIl90b2dnbGVBbmltYXRlXCI6XCJfdG9nZ2xlQ2xhc3NcIl0oKX19LHtrZXk6XCJfdG9nZ2xlQ2xhc3NcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuJGVsZW1lbnQudG9nZ2xlQ2xhc3ModGhpcy5jbGFzc05hbWUpO3ZhciB0PXRoaXMuJGVsZW1lbnQuaGFzQ2xhc3ModGhpcy5jbGFzc05hbWUpO3Q/dGhpcy4kZWxlbWVudC50cmlnZ2VyKFwib24uemYudG9nZ2xlclwiKTp0aGlzLiRlbGVtZW50LnRyaWdnZXIoXCJvZmYuemYudG9nZ2xlclwiKSx0aGlzLl91cGRhdGVBUklBKHQpfX0se2tleTpcIl90b2dnbGVBbmltYXRlXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuJGVsZW1lbnQuaXMoXCI6aGlkZGVuXCIpP0ZvdW5kYXRpb24uTW90aW9uLmFuaW1hdGVJbih0aGlzLiRlbGVtZW50LHRoaXMuYW5pbWF0aW9uSW4
6780sZnVuY3Rpb24oKXt0Ll91cGRhdGVBUklBKCEwKSx0aGlzLnRyaWdnZXIoXCJvbi56Zi50b2dnbGVyXCIpfSk6Rm91bmRhdGlvbi5Nb3Rpb24uYW5pbWF0ZU91dCh0aGlzLiRlbGVtZW50LHRoaXMuYW5pbWF0aW9uT3V0LGZ1bmN0aW9uKCl7dC5fdXBkYXRlQVJJQSghMSksdGhpcy50cmlnZ2VyKFwib2ZmLnpmLnRvZ2dsZXJcIil9KX19LHtrZXk6XCJfdXBkYXRlQVJJQVwiLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMuJGVsZW1lbnQuYXR0cihcImFyaWEtZXhwYW5kZWRcIiwhIXQpfX0se2tleTpcImRlc3Ryb3lcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuJGVsZW1lbnQub2ZmKFwiLnpmLnRvZ2dsZXJcIiksRm91bmRhdGlvbi51bnJlZ2lzdGVyUGx1Z2luKHRoaXMpfX1dKSxlfSgpO2UuZGVmYXVsdHM9e2FuaW1hdGU6ITF9LEZvdW5kYXRpb24ucGx1Z2luKGUsXCJUb2dnbGVyXCIpfShqUXVlcnkpO3ZhciBfY3JlYXRlQ2xhc3M9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBuPWVbaV07bi5lbnVtZXJhYmxlPW4uZW51bWVyYWJsZXx8ITEsbi5jb25maWd1cmFibGU9ITAsXCJ2YWx1ZVwiaW4gbiYmKG4ud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG4ua2V5LG4pfX1yZXR1cm4gZnVuY3Rpb24oZSxpLG4pe3JldHVybiBpJiZ0KGUucHJvdG90eXBlLGkpLG4mJnQoZSxuKSxlfX0oKTshZnVuY3Rpb24odCl7dmFyIGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGksbil7X2NsYXNzQ2FsbENoZWNrKHRoaXMsZSksdGhpcy4kZWxlbWVudD1pLHRoaXMub3B0aW9ucz10LmV4dGVuZCh7fSxlLmRlZmF1bHRzLHRoaXMuJGVsZW1lbnQuZGF0YSgpLG4pLHRoaXMuaXNBY3RpdmU9ITEsdGhpcy5pc0NsaWNrPSExLHRoaXMuX2luaXQoKSxGb3VuZGF0aW9uLnJlZ2lzdGVyUGx1Z2luKHRoaXMsXCJUb29sdGlwXCIpfXJldHVybiBfY3JlYXRlQ2xhc3MoZSxbe2tleTpcIl9pbml0XCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLiRlbGVtZW50LmF0dHIoXCJhcmlhLWRlc2NyaWJlZGJ5XCIpfHxGb3VuZGF0aW9uLkdldFlvRGlnaXRzKDYsXCJ0b29sdGlwXCIpO3RoaXMub3B0aW9ucy5wb3NpdGlvbkNsYXNzPXRoaXMuX2dldFBvc2l0aW9uQ2xhc3ModGhpcy4kZWxlbWVudCksdGhpcy5vcHRpb25zLnRpcFRleHQ9dGhpcy5vcHRpb25zLnRpcFRleHR8fHRoaXMuJGVsZW1lbnQuYXR0cihcInRpdGxlXCIpLHRoaXMudGVtcGxhdGU9dGhpcy5vcHRpb25zLnRlbXBsYXRlP3QodGhpcy5vcHRpb25zLnRlbXBsYXRlKTp0aGlzLl9idWlsZFRlbXBsYXRlKGUpLHRoaXMudGVtcGxhdGUuYXBwZW5kVG8oZG9jdW1lbnQuYm9keSkudGV4dCh0aGlzLm9wdGlvbnMudGlwVGV4dCkuaGlkZSgpLHRoaXMuJGVsZW1lbnQuYXR0cih7dGl0bGU6XCJcIixcImFyaWEtZGVzY3JpYmVkYnlcIjplLFwiZGF0YS15ZXRpLWJveFwiOmUsXCJkYXRhLXRvZ2dsZVwiOmUsXCJkYXRhLXJlc2l6ZVwiOmV9KS5hZGRDbGFzcyh0aGlzLnRyaWdnZXJDbGFzcyksdGhpcy51c2VkUG9zaXRpb25zPVtdLHRoaXMuY291bnRlcj00LHRoaXMuY2xhc3NDaGFuZ2VkPSExLHRoaXMuX2V2ZW50cygpfX0se2tleTpcIl9nZXRQb3NpdGlvbkNsYXNzXCIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoIXQpcmV0dXJuXCJcIjt2YXIgZT10WzBdLmNsYXNzTmFtZS5tYXRjaCgvXFxiKHRvcHxsZWZ0fHJpZ2h0KVxcYi9nKTtyZXR1cm4gZT1lP2VbMF06XCJcIn19LHtrZXk6XCJfYnVpbGRUZW1wbGF0ZVwiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciBpPSh0aGlzLm9wdGlvbnMudG9vbHRpcENsYXNzK1wiIFwiK3RoaXMub3B0aW9ucy5wb3NpdGlvbkNsYXNzK1wiIFwiK3RoaXMub3B0aW9ucy50ZW1wbGF0ZUNsYXNzZXMpLnRyaW0oKSxuPXQoXCI8ZGl2PjwvZGl2PlwiKS5hZGRDbGFzcyhpKS5hdHRyKHtyb2xlOlwidG9vbHRpcFwiLFwiYXJpYS1oaWRkZW5cIjohMCxcImRhdGEtaXMtYWN0aXZlXCI6ITEsXCJkYXRhLWlzLWZvY3VzXCI6ITEsaWQ6ZX0pO3JldHVybiBufX0se2tleTpcIl9yZXBvc2l0aW9uXCIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy51c2VkUG9zaXRpb25zLnB1c2godD90OlwiYm90dG9tXCIpLCF0JiZ0aGlzLnVzZWRQb3NpdGlvbnMuaW5kZXhPZihcInRvcFwiKTwwP3RoaXMudGVtcGxhdGUuYWRkQ2xhc3MoXCJ0b3BcIik6XCJ0b3BcIj09PXQmJnRoaXMudXNlZFBvc2l0aW9ucy5pbmRleE9mKFwiYm90dG9tXCIpPDA/dGhpcy50ZW1wbGF0ZS5yZW1vdmVDbGFzcyh0KTpcImxlZnRcIj09PXQmJnRoaXMudXNlZFBvc2l0aW9ucy5pbmRleE9mKFwicmlnaHRcIik8MD90aGlzLnRlbXBsYXRlLnJlbW92ZUNsYXNzKHQpLmFkZENsYXNzKFwicmlnaHRcIik6XCJyaWdodFwiPT09dCYmdGhpcy51c2VkUG9zaXRpb25zLmluZGV4T2YoXCJsZWZ0XCIpPDA/dGhpcy50ZW1wbGF0ZS5yZW1vdmVDbGFzcyh0KS5hZGRDbGFzcyhcImxlZnRcIik6IXQmJnRoaXMudXNlZFBvc2l0aW9ucy5pbmRleE9mKFwidG9wXCIpPi0xJiZ0aGlzLnVzZWRQb3NpdGlvbnMuaW5kZXhPZihcImxlZnRcIik8MD90aGlzLnRlbXBsYXRlLmFkZENsYXNzKFwibGVmdFwiKTpcInRvcFwiPT09dCYmdGhpcy51c2VkUG9zaXRpb25zLmluZGV4T2YoXCJib3R0b21cIik+LTEmJnRoaXMudXNlZFBvc2l0aW9ucy5pbmRleE9mKFwibGVmdFwiKTwwP3RoaXMudGVtcGxhdGUucmVtb3ZlQ2xhc3ModCkuYWRkQ2xhc3MoXCJsZWZ0XCIpOlwibGVmdFwiPT09dCYmdGhpcy51c2VkUG9zaXRpb25zLmluZGV4T2YoXCJyaWdodFwiKT4tMSYmdGhpcy51c2VkUG9zaXRpb25zLmluZGV4T2YoXCJib3R0b21cIik8MD90aGlzLnRlbXBsYXRlLnJlbW92ZUNsYXNzKHQpOlwicmlnaHRcIj09PXQmJnRoaXMudXNlZFBvc2l0aW9ucy5pbmRleE9mKFwibGVmdFwiKT4tMSYmdGhpcy51c2VkUG9zaXRpb25zLmluZGV4T2YoXCJib3R0b21cIik8MD90aGlzLnRlbXBsYXRlLnJlbW92ZUNsYXNzKHQpOnRoaXMudGVtcGxhdGUucmVtb3ZlQ2xhc3ModCksdGhpcy5jbGFzc0NoYW5nZWQ9ITAsdGhpcy5jb3VudGVyLS19fSx7a2V5OlwiX3NldFBvc2l0aW9uXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9nZXRQb3NpdGlvbkNsYXNzKHRoaXMudGVtcGxhdGUpLGU9Rm91bmRhdGlvbi5Cb3guR2V0RGltZW5zaW9ucyh0aGlzLnRlbXBsYXRlKSxpPUZvdW5kYXRpb24uQm94LkdldERpbWVuc2lvbnModGhpcy4kZWxlbWVudCksbj1cImxlZnRcIj09PXQ/XCJsZWZ0XCI6XCJyaWdodFwiPT09dD9cImxlZnRcIjpcInRvcFwiLHM9XCJ0b3BcIj09PW4/XCJoZWlnaHRcIjpcIndpZHRoXCI7XCJoZWlnaHRcIj09PXM/dGhpcy5vcHRpb25zLnZPZmZzZXQ6dGhpcy5vcHRpb25zLmhPZmZzZXQ7aWYoZS53aWR0aD49ZS53aW5kb3dEaW1zLndpZHRofHwhdGhpcy5jb3VudGVyJiYhRm91bmRhdGlvbi5Cb3guSW1Ob3RUb3VjaGluZ1lvdSh0aGlzLnRlbXBsYXRlKSlyZXR1cm4gdGhpcy50ZW1wbGF0ZS5vZmZzZXQoRm91bmRhdGlvbi5Cb3guR2V0T2Zmc2V0cyh0aGlzLnRlbXBsYXRlLHRoaXMuJGVsZW1lbnQsXCJjZW50ZXIgYm90dG9tXCIsdGhpcy5vcHRpb25zLnZPZmZzZXQsdGhpcy5vcHRpb25zLmhPZmZzZXQsITApKS5jc3Moe3dpZHRoOmkud2luZG93RGltcy53aWR0aC0yKnRoaXMub3B0aW9ucy5oT2Zmc2V0LGhlaWdodDpcImF1dG9cIn0pLCExO2Zvcih0aGlzLnRlbXBsYXRlLm9mZnNldChGb3VuZGF0aW9uLkJveC5HZXRPZmZzZXRzKHRoaXMudGVtcGxhdGUsdGhpcy4kZWxlbWVudCxcImNlbnRlciBcIisodHx8XCJib3R0b21cIiksdGhpcy5vcHRpb25zLnZPZmZzZXQsdGhpcy5vcHRpb25zLmhPZmZzZXQpKTshRm91bmRhdGlvbi5Cb3guSW1Ob3RUb3VjaGluZ1lvdSh0aGlzLnRlbXBsYXRlKSYmdGhpcy5jb3VudGVyOyl0aGlzLl9yZXBvc2l0aW9uKHQpLHRoaXMuX3NldFBvc2l0aW9uKCl9fSx7a2V5Olwic2hvd1wiLHZhbHVlOmZ1bmN0aW9uKCl7aWYoXCJhbGxcIiE9PXRoaXMub3B0aW9ucy5zaG93T24mJiFGb3VuZGF0aW9uLk1lZGlhUXVlcnkuYXRMZWFzdCh0aGlzLm9wdGlvbnMuc2hvd09uKSlyZXR1cm4hMTt2YXIgdD10aGlzO3RoaXMudGVtcGxhdGUuY3NzKFwidmlzaWJpbGl0eVwiLFwiaGlkZGVuXCIpLnNob3coKSx0aGlzLl9zZXRQb3NpdGlvbigpLHRoaXMuJGVsZW1lbnQudHJpZ2dlcihcImNsb3NlbWUuemYudG9vbHRpcFwiLHRoaXMudGVtcGxhdGUuYXR0cihcImlkXCIpKSx0aGlzLnRlbXBsYXRlLmF0dHIoe1wiZGF0YS1pcy1hY3RpdmVcIjohMCxcImFyaWEtaGlkZGVuXCI6ITF9KSx0LmlzQWN0aXZlPSEwLHRoaXMudGVtcGxhdGUuc3RvcCgpLmhpZGUoKS5jc3MoXCJ2aXNpYmlsaXR5XCIsXCJcIikuZmFkZUluKHRoaXMub3B0aW9ucy5mYWRlSW5EdXJhdGlvbixmdW5jdGlvbigpe30pLHRoaXMuJGVsZW1lbnQudHJpZ2dlcihcInNob3cuemYudG9vbHRpcFwiKX19LHtrZXk6XCJoaWRlXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMudGVtcGxhdGUuc3RvcCgpLmF0dHIoe1wiYXJpYS1oaWRkZW5cIjohMCxcImRhdGEtaXMtYWN0aXZlXCI6ITF9KS5mYWRlT3V0KHRoaXMub3B0aW9ucy5mYWRlT3V0RHVyYXRpb24sZnVuY3Rpb24oKXt0LmlzQWN0aXZlPSExLHQuaXNDbGljaz0hMSx0LmNsYXNzQ2hhbmdlZCYmKHQudGVtcGxhdGUucmVtb3ZlQ2xhc3ModC5fZ2V0UG9zaXRpb25DbGFzcyh0LnRlbXBsYXRlKSkuYWRkQ2xhc3ModC5vcHRpb25zLnBvc2l0aW9uQ2xhc3MpLHQudXNlZFBvc2l0aW9ucz1bXSx0LmNvdW50ZXI9NCx0LmNsYXNzQ2hhbmdlZD0hMSl9KSx0aGlzLiRlbGVtZW50LnRyaWdnZXIoXCJoaWRlLnpmLnRvb2x0aXBcIil9fSx7a2V5OlwiX2V2ZW50c1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPSh0aGlzLnRlbXBsYXRlLCExKTt0aGlzLm9wdGlvbnMuZGlzYWJsZUhvdmVyfHx0aGlzLiRlbGVtZW50Lm9uKFwibW91c2VlbnRlci56
6780Zi50b29sdGlwXCIsZnVuY3Rpb24oZSl7dC5pc0FjdGl2ZXx8KHQudGltZW91dD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5zaG93KCl9LHQub3B0aW9ucy5ob3ZlckRlbGF5KSl9KS5vbihcIm1vdXNlbGVhdmUuemYudG9vbHRpcFwiLGZ1bmN0aW9uKGkpe2NsZWFyVGltZW91dCh0LnRpbWVvdXQpLCghZXx8IXQuaXNDbGljayYmdC5vcHRpb25zLmNsaWNrT3BlbikmJnQuaGlkZSgpfSksdGhpcy5vcHRpb25zLmNsaWNrT3BlbiYmdGhpcy4kZWxlbWVudC5vbihcIm1vdXNlZG93bi56Zi50b29sdGlwXCIsZnVuY3Rpb24oZSl7ZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSx0LmlzQ2xpY2s/dC5oaWRlKCk6KHQuaXNDbGljaz0hMCwhdC5vcHRpb25zLmRpc2FibGVIb3ZlciYmdC4kZWxlbWVudC5hdHRyKFwidGFiaW5kZXhcIil8fHQuaXNBY3RpdmV8fHQuc2hvdygpKX0pLHRoaXMub3B0aW9ucy5kaXNhYmxlRm9yVG91Y2h8fHRoaXMuJGVsZW1lbnQub24oXCJ0YXAuemYudG9vbHRpcCB0b3VjaGVuZC56Zi50b29sdGlwXCIsZnVuY3Rpb24oZSl7dC5pc0FjdGl2ZT90LmhpZGUoKTp0LnNob3coKX0pLHRoaXMuJGVsZW1lbnQub24oe1wiY2xvc2UuemYudHJpZ2dlclwiOnRoaXMuaGlkZS5iaW5kKHRoaXMpfSksdGhpcy4kZWxlbWVudC5vbihcImZvY3VzLnpmLnRvb2x0aXBcIixmdW5jdGlvbihpKXtyZXR1cm4gZT0hMCx0LmlzQ2xpY2s/ITE6dm9pZCB0LnNob3coKX0pLm9uKFwiZm9jdXNvdXQuemYudG9vbHRpcFwiLGZ1bmN0aW9uKGkpe2U9ITEsdC5pc0NsaWNrPSExLHQuaGlkZSgpfSkub24oXCJyZXNpemVtZS56Zi50cmlnZ2VyXCIsZnVuY3Rpb24oKXt0LmlzQWN0aXZlJiZ0Ll9zZXRQb3NpdGlvbigpfSl9fSx7a2V5OlwidG9nZ2xlXCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmlzQWN0aXZlP3RoaXMuaGlkZSgpOnRoaXMuc2hvdygpfX0se2tleTpcImRlc3Ryb3lcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuJGVsZW1lbnQuYXR0cihcInRpdGxlXCIsdGhpcy50ZW1wbGF0ZS50ZXh0KCkpLm9mZihcIi56Zi50cmlnZ2VyIC56Zi50b290aXBcIikucmVtb3ZlQXR0cihcImFyaWEtZGVzY3JpYmVkYnlcIikucmVtb3ZlQXR0cihcImRhdGEteWV0aS1ib3hcIikucmVtb3ZlQXR0cihcImRhdGEtdG9nZ2xlXCIpLnJlbW92ZUF0dHIoXCJkYXRhLXJlc2l6ZVwiKSx0aGlzLnRlbXBsYXRlLnJlbW92ZSgpLEZvdW5kYXRpb24udW5yZWdpc3RlclBsdWdpbih0aGlzKX19XSksZX0oKTtlLmRlZmF1bHRzPXtkaXNhYmxlRm9yVG91Y2g6ITEsaG92ZXJEZWxheToyMDAsZmFkZUluRHVyYXRpb246MTUwLGZhZGVPdXREdXJhdGlvbjoxNTAsZGlzYWJsZUhvdmVyOiExLHRlbXBsYXRlQ2xhc3NlczpcIlwiLHRvb2x0aXBDbGFzczpcInRvb2x0aXBcIix0cmlnZ2VyQ2xhc3M6XCJoYXMtdGlwXCIsc2hvd09uOlwic21hbGxcIix0ZW1wbGF0ZTpcIlwiLHRpcFRleHQ6XCJcIix0b3VjaENsb3NlVGV4dDpcIlRhcCB0byBjbG9zZS5cIixjbGlja09wZW46ITAscG9zaXRpb25DbGFzczpcIlwiLHZPZmZzZXQ6MTAsaE9mZnNldDoxMn0sRm91bmRhdGlvbi5wbHVnaW4oZSxcIlRvb2x0aXBcIil9KGpRdWVyeSk7IiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyBQb2x5ZmlsbCBmb3IgcmVxdWVzdEFuaW1hdGlvbkZyYW1lXG4oZnVuY3Rpb24oKSB7XG4gIGlmICghRGF0ZS5ub3cpXG4gICAgRGF0ZS5ub3cgPSBmdW5jdGlvbigpIHsgcmV0dXJuIG5ldyBEYXRlKCkuZ2V0VGltZSgpOyB9O1xuXG4gIHZhciB2ZW5kb3JzID0gWyd3ZWJraXQnLCAnbW96J107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdmVuZG9ycy5sZW5ndGggJiYgIXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU7ICsraSkge1xuICAgICAgdmFyIHZwID0gdmVuZG9yc1tpXTtcbiAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSB3aW5kb3dbdnArJ1JlcXVlc3RBbmltYXRpb25GcmFtZSddO1xuICAgICAgd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lID0gKHdpbmRvd1t2cCsnQ2FuY2VsQW5pbWF0aW9uRnJhbWUnXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgd2luZG93W3ZwKydDYW5jZWxSZXF1ZXN0QW5pbWF0aW9uRnJhbWUnXSk7XG4gIH1cbiAgaWYgKC9pUChhZHxob25lfG9kKS4qT1MgNi8udGVzdCh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudClcbiAgICB8fCAhd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSB8fCAhd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKSB7XG4gICAgdmFyIGxhc3RUaW1lID0gMDtcbiAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgIHZhciBuZXh0VGltZSA9IE1hdGgubWF4KGxhc3RUaW1lICsgMTYsIG5vdyk7XG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBjYWxsYmFjayhsYXN0VGltZSA9IG5leHRUaW1lKTsgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFRpbWUgLSBub3cpO1xuICAgIH07XG4gICAgd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lID0gY2xlYXJUaW1lb3V0O1xuICB9XG59KSgpO1xuXG52YXIgaW5pdENsYXNzZXMgICA9IFsnbXVpLWVudGVyJywgJ211aS1sZWF2ZSddO1xudmFyIGFjdGl2ZUNsYXNzZXMgPSBbJ211aS1lbnRlci1hY3RpdmUnLCAnbXVpLWxlYXZlLWFjdGl2ZSddO1xuXG4vLyBGaW5kIHRoZSByaWdodCBcInRyYW5zaXRpb25lbmRcIiBldmVudCBmb3IgdGhpcyBicm93c2VyXG52YXIgZW5kRXZlbnQgPSAoZnVuY3Rpb24oKSB7XG4gIHZhciB0cmFuc2l0aW9ucyA9IHtcbiAgICAndHJhbnNpdGlvbic6ICd0cmFuc2l0aW9uZW5kJyxcbiAgICAnV2Via2l0VHJhbnNpdGlvbic6ICd3ZWJraXRUcmFuc2l0aW9uRW5kJyxcbiAgICAnTW96VHJhbnNpdGlvbic6ICd0cmFuc2l0aW9uZW5kJyxcbiAgICAnT1RyYW5zaXRpb24nOiAnb3RyYW5zaXRpb25lbmQnXG4gIH1cbiAgdmFyIGVsZW0gPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgZm9yICh2YXIgdCBpbiB0cmFuc2l0aW9ucykge1xuICAgIGlmICh0eXBlb2YgZWxlbS5zdHlsZVt0XSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybi
6780B0cmFuc2l0aW9uc1t0XTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn0pKCk7XG5cbmZ1bmN0aW9uIGFuaW1hdGUoaXNJbiwgZWxlbWVudCwgYW5pbWF0aW9uLCBjYikge1xuICBlbGVtZW50ID0gJChlbGVtZW50KS5lcSgwKTtcblxuICBpZiAoIWVsZW1lbnQubGVuZ3RoKSByZXR1cm47XG5cbiAgaWYgKGVuZEV2ZW50ID09PSBudWxsKSB7XG4gICAgaXNJbiA/IGVsZW1lbnQuc2hvdygpIDogZWxlbWVudC5oaWRlKCk7XG4gICAgY2IoKTtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgaW5pdENsYXNzID0gaXNJbiA/IGluaXRDbGFzc2VzWzBdIDogaW5pdENsYXNzZXNbMV07XG4gIHZhciBhY3RpdmVDbGFzcyA9IGlzSW4gPyBhY3RpdmVDbGFzc2VzWzBdIDogYWN0aXZlQ2xhc3Nlc1sxXTtcblxuICAvLyBTZXQgdXAgdGhlIGFuaW1hdGlvblxuICByZXNldCgpO1xuICBlbGVtZW50LmFkZENsYXNzKGFuaW1hdGlvbik7XG4gIGVsZW1lbnQuY3NzKCd0cmFuc2l0aW9uJywgJ25vbmUnKTtcbiAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCkge1xuICAgIGVsZW1lbnQuYWRkQ2xhc3MoaW5pdENsYXNzKTtcbiAgICBpZiAoaXNJbikgZWxlbWVudC5zaG93KCk7XG4gIH0pO1xuXG4gIC8vIFN0YXJ0IHRoZSBhbmltYXRpb25cbiAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCkge1xuICAgIGVsZW1lbnRbMF0ub2Zmc2V0V2lkdGg7XG4gICAgZWxlbWVudC5jc3MoJ3RyYW5zaXRpb24nLCAnJyk7XG4gICAgZWxlbWVudC5hZGRDbGFzcyhhY3RpdmVDbGFzcyk7XG4gIH0pO1xuXG4gIC8vIENsZWFuIHVwIHRoZSBhbmltYXRpb24gd2hlbiBpdCBmaW5pc2hlc1xuICBlbGVtZW50Lm9uZSgndHJhbnNpdGlvbmVuZCcsIGZpbmlzaCk7XG5cbiAgLy8gSGlkZXMgdGhlIGVsZW1lbnQgKGZvciBvdXQgYW5pbWF0aW9ucyksIHJlc2V0cyB0aGUgZWxlbWVudCwgYW5kIHJ1bnMgYSBjYWxsYmFja1xuICBmdW5jdGlvbiBmaW5pc2goKSB7XG4gICAgaWYgKCFpc0luKSBlbGVtZW50LmhpZGUoKTtcbiAgICByZXNldCgpO1xuICAgIGlmIChjYikgY2IuYXBwbHkoZWxlbWVudCk7XG4gIH1cblxuICAvLyBSZXNldHMgdHJhbnNpdGlvbnMgYW5kIHJlbW92ZXMgbW90aW9uLXNwZWNpZmljIGNsYXNzZXNcbiAgZnVuY3Rpb24gcmVzZXQoKSB7XG4gICAgZWxlbWVudFswXS5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb24gPSAwO1xuICAgIGVsZW1lbnQucmVtb3ZlQ2xhc3MoaW5pdENsYXNzICsgJyAnICsgYWN0aXZlQ2xhc3MgKyAnICcgKyBhbmltYXRpb24pO1xuICB9XG59XG5cbnZhciBNb3Rpb25VSSA9IHtcbiAgYW5pbWF0ZUluOiBmdW5jdGlvbihlbGVtZW50LCBhbmltYXRpb24sIGNiKSB7XG4gICAgYW5pbWF0ZSh0cnVlLCBlbGVtZW50LCBhbmltYXRpb24sIGNiKTtcbiAgfSxcblxuICBhbmltYXRlT3V0OiBmdW5jdGlvbihlbGVtZW50LCBhbmltYXRpb24sIGNiKSB7XG4gICAgYW5pbWF0ZShmYWxzZSwgZWxlbWVudCwgYW5pbWF0aW9uLCBjYik7XG4gIH1cbn1cbiIsIndpbmRvdy53aGF0SW5wdXQgPSAoZnVuY3Rpb24oKSB7XG5cbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIC8qXG4gICAgLS0tLS0tLS0tLS0tLS0tXG4gICAgdmFyaWFibGVzXG4gICAgLS0tLS0tLS0tLS0tLS0tXG4gICovXG5cbiAgLy8gYXJyYXkgb2YgYWN0aXZlbHkgcHJlc3NlZCBrZXlzXG4gIHZhciBhY3RpdmVLZXlzID0gW107XG5cbiAgLy8gY2FjaGUgZG9jdW1lbnQuYm9keVxuICB2YXIgYm9keTtcblxuICAvLyBib29sZWFuOiB0cnVlIGlmIHRvdWNoIGJ1ZmZlciB0aW1lciBpcyBydW5uaW5nXG4gIHZhciBidWZmZXIgPSBmYWxzZTtcblxuICAvLyB0aGUgbGFzdCB1c2VkIGlucHV0IHR5cGVcbiAgdmFyIGN1cnJlbnRJbnB1dCA9IG51bGw7XG5cbiAgLy8gYGlucHV0YCB0eXBlcyB0aGF0IGRvbid0IGFjY2VwdCB0ZXh0XG4gIHZhciBub25UeXBpbmdJbnB1dHMgPSBbXG4gICAgJ2J1dHRvbicsXG4gICAgJ2NoZWNrYm94Jy
6780xcbiAgICAnZmlsZScsXG4gICAgJ2ltYWdlJyxcbiAgICAncmFkaW8nLFxuICAgICdyZXNldCcsXG4gICAgJ3N1Ym1pdCdcbiAgXTtcblxuICAvLyBkZXRlY3QgdmVyc2lvbiBvZiBtb3VzZSB3aGVlbCBldmVudCB0byB1c2VcbiAgLy8gdmlhIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0V2ZW50cy93aGVlbFxuICB2YXIgbW91c2VXaGVlbCA9IGRldGVjdFdoZWVsKCk7XG5cbiAgLy8gbGlzdCBvZiBtb2RpZmllciBrZXlzIGNvbW1vbmx5IHVzZWQgd2l0aCB0aGUgbW91c2UgYW5kXG4gIC8vIGNhbiBiZSBzYWZlbHkgaWdub3JlZCB0byBwcmV2ZW50IGZhbHNlIGtleWJvYXJkIGRldGVjdGlvblxuICB2YXIgaWdub3JlTWFwID0gW1xuICAgIDE2LCAvLyBzaGlmdFxuICAgIDE3LCAvLyBjb250cm9sXG4gICAgMTgsIC8vIGFsdFxuICAgIDkxLCAvLyBXaW5kb3dzIGtleSAvIGxlZnQgQXBwbGUgY21kXG4gICAgOTMgIC8vIFdpbmRvd3MgbWVudSAvIHJpZ2h0IEFwcGxlIGNtZFxuICBdO1xuXG4gIC8vIG1hcHBpbmcgb2YgZXZlbnRzIHRvIGlucHV0IHR5cGVzXG4gIHZhciBpbnB1dE1hcCA9IHtcbiAgICAna2V5ZG93bic6ICdrZXlib2FyZCcsXG4gICAgJ2tleXVwJzogJ2tleWJvYXJkJyxcbiAgICAnbW91c2Vkb3duJzogJ21vdXNlJyxcbiAgICAnbW91c2Vtb3ZlJzogJ21vdXNlJyxcbiAgICAnTVNQb2ludGVyRG93bic6ICdwb2ludGVyJyxcbiAgICAnTVNQb2ludGVyTW92ZSc6ICdwb2ludGVyJyxcbiAgICAncG9pbnRlcmRvd24nOiAncG9pbnRlcicsXG4gICAgJ3BvaW50ZXJtb3ZlJzogJ3BvaW50ZXInLFxuICAgICd0b3VjaHN0YXJ0JzogJ3RvdWNoJ1xuICB9O1xuXG4gIC8vIGFkZCBjb3JyZWN0IG1vdXNlIHdoZWVsIGV2ZW50IG1hcHBpbmcgdG8gYGlucHV0TWFwYFxuICBpbnB1dE1hcFtkZXRlY3RXaGVlbCgpXSA9ICdtb3VzZSc7XG5cbiAgLy8gYXJyYXkgb2YgYWxsIHVzZWQgaW5wdXQgdHlwZXNcbiAgdmFyIGlucHV0VHlwZXMgPSBbXTtcblxuICAvLyBtYXBwaW5nIG9mIGtleSBjb2RlcyB0byBhIGNvbW1vbiBuYW1lXG4gIHZhciBrZXlNYXAgPSB7XG4gICAgOTogJ3RhYicsXG4gICAgMTM6ICdlbnRlcicsXG4gICAgMTY6ICdzaGlmdCcsXG4gICAgMjc6ICdlc2MnLFxuICAgIDMyOiAnc3BhY2UnLFxuICAgIDM3OiAnbGVmdCcsXG4gICAgMzg6ICd1cCcsXG4gICAgMzk6ICdyaWdodCcsXG4gICAgNDA6ICdkb3duJ1xuICB9O1xuXG4gIC8vIG1hcCBvZiBJRSAxMCBwb2ludGVyIGV2ZW50c1xuICB2YXIgcG9pbnRlck1hcCA9IHtcbiAgICAyOiAndG91Y2gnLFxuICAgIDM6ICd0b3VjaCcsIC8vIHRyZWF0IHBlbiBsaWtlIHRvdWNoXG4gICAgNDogJ21vdXNlJ1xuICB9O1xuXG4gIC8vIHRvdWNoIGJ1ZmZlciB0aW1lclxuICB2YXIgdGltZXI7XG5cblxuICAvKlxuICAgIC0tLS0tLS0tLS0tLS0tLVxuICAgIGZ1bmN0aW9uc1xuICAgIC0tLS0tLS0tLS0tLS0tLVxuICAqL1xuXG4gIC8vIGFsbG93cyBldmVudHMgdGhhdCBhcmUgYWxzbyB0cmlnZ2VyZWQgdG8gYmUgZmlsdGVyZWQgb3V0IGZvciBgdG91Y2hzdGFydGBcbiAgZnVuY3Rpb24gZXZlbnRCdWZmZXIoKSB7XG4gICAgY2xlYXJUaW1lcigpO1xuICAgIHNldElucHV0KGV2ZW50KTtcblxuICAgIGJ1ZmZlciA9IHRydWU7XG4gICAgdGltZXIgPSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgIGJ1ZmZlciA9IGZhbHNlO1xuICAgIH0sIDY1MCk7XG4gIH1cblxuICBmdW5jdGlvbiBidWZmZXJlZEV2ZW50KGV2ZW50KSB7XG4gICAgaWYgKCFidWZmZXIpIHNldElucHV0KGV2ZW50KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVuQnVmZmVyZWRFdmVudChldmVudCkge1xuICAgIGNsZWFyVGltZXIoKTtcbiAgICBzZXRJbnB1dChldmVudCk7XG4gIH1cblxuICBmdW5jdGlvbiBjbGVhclRpbWVyKCkge1xuICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGltZXIpO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0SW5wdXQoZXZlbnQpIHtcbiAgICB2YXIgZXZlbnRLZXkgPSBrZXkoZXZlbnQpO1xuICAgIHZhciB2YWx1ZSA9IGlucHV0TWFwW2V2ZW50LnR5cGVdO1xuICAgIGlmICh2YWx1ZSA9PT0gJ3BvaW50ZXInKSB2YWx1ZSA9IHBvaW50ZXJUeXBlKGV2ZW50KTtcblxuICAgIC8vIGRvbid0IGRvIGFueXRoaW5nIGlmIHRoZSB2YWx1ZSBtYXRjaGVzIHRoZSBpbnB1dCB0eXBlIGFscmVhZHkgc2V0XG4gICAgaWYgKGN1cnJlbnRJbnB1dCAhPT0gdmFsdWUpIHtcbiAgICAgIHZhciBldmVudFRhcmdldCA9IHRhcmdldChldmVudCk7XG4gICAgICB2Y
6780XIgZXZlbnRUYXJnZXROb2RlID0gZXZlbnRUYXJnZXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgIHZhciBldmVudFRhcmdldFR5cGUgPSAoZXZlbnRUYXJnZXROb2RlID09PSAnaW5wdXQnKSA/IGV2ZW50VGFyZ2V0LmdldEF0dHJpYnV0ZSgndHlwZScpIDogbnVsbDtcblxuICAgICAgaWYgKFxuICAgICAgICAoLy8gb25seSBpZiB0aGUgdXNlciBmbGFnIHRvIGFsbG93IHR5cGluZyBpbiBmb3JtIGZpZWxkcyBpc24ndCBzZXRcbiAgICAgICAgIWJvZHkuaGFzQXR0cmlidXRlKCdkYXRhLXdoYXRpbnB1dC1mb3JtdHlwaW5nJykgJiZcblxuICAgICAgICAvLyBvbmx5IGlmIGN1cnJlbnRJbnB1dCBoYXMgYSB2YWx1ZVxuICAgICAgICBjdXJyZW50SW5wdXQgJiZcblxuICAgICAgICAvLyBvbmx5IGlmIHRoZSBpbnB1dCBpcyBga2V5Ym9hcmRgXG4gICAgICAgIHZhbHVlID09PSAna2V5Ym9hcmQnICYmXG5cbiAgICAgICAgLy8gbm90IGlmIHRoZSBrZXkgaXMgYFRBQmBcbiAgICAgICAga2V5TWFwW2V2ZW50S2V5XSAhPT0gJ3RhYicgJiZcblxuICAgICAgICAvLyBvbmx5IGlmIHRoZSB0YXJnZXQgaXMgYSBmb3JtIGlucHV0IHRoYXQgYWNjZXB0cyB0ZXh0XG4gICAgICAgIChcbiAgICAgICAgICAgZXZlbnRUYXJnZXROb2RlID09PSAndGV4dGFyZWEnIHx8XG4gICAgICAgICAgIGV2ZW50VGFyZ2V0Tm9kZSA9PT0gJ3NlbGVjdCcgfHxcbiAgICAgICAgICAgKGV2ZW50VGFyZ2V0Tm9kZSA9PT0gJ2lucHV0JyAmJiBub25UeXBpbmdJbnB1dHMuaW5kZXhPZihldmVudFRhcmdldFR5cGUpIDwgMClcbiAgICAgICAgKSkgfHwgKFxuICAgICAgICAgIC8vIGlnbm9yZSBtb2RpZmllciBrZXlzXG4gICAgICAgICAgaWdub3JlTWFwLmluZGV4T2YoZXZlbnRLZXkpID4gLTFcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIC8vIGlnbm9yZSBrZXlib2FyZCB0eXBpbmdcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN3aXRjaElucHV0KHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodmFsdWUgPT09ICdrZXlib2FyZCcpIGxvZ0tleXMoZXZlbnRLZXkpO1xuICB9XG5cbiAgZnVuY3Rpb24gc3dpdGNoSW5wdXQoc3RyaW5nKSB7XG4gICAgY3VycmVudElucHV0ID0gc3RyaW5nO1xuICAgIGJvZHkuc2V0QXR0cmlidXRlKCdkYXRhLXdoYXRpbnB1dCcsIGN1cnJlbnRJbnB1dCk7XG5cbiAgICBpZiAoaW5wdXRUeXBlcy5pbmRleE9mKGN1cnJlbnRJbnB1dCkgPT09IC0xKSBpbnB1dFR5cGVzLnB1c2goY3VycmVudElucHV0KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGtleShldmVudCkge1xuICAgIHJldHVybiAoZXZlbnQua2V5Q29kZSkgPyBldmVudC5rZXlDb2RlIDogZXZlbnQud2hpY2g7XG4gIH1cblxuICBmdW5jdGlvbiB0YXJnZXQoZXZlbnQpIHtcbiAgICByZXR1cm4gZXZlbnQudGFyZ2V0IHx8IGV2ZW50LnNyY0VsZW1lbnQ7XG4gIH1cblxuICBmdW5jdGlvbiBwb2ludGVyVHlwZShldmVudCkge1xuICAgIGlmICh0eXBlb2YgZXZlbnQucG9pbnRlclR5cGUgPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gcG9pbnRlck1hcFtldmVudC5wb2ludGVyVHlwZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAoZXZlbnQucG9pbnRlclR5cGUgPT09ICdwZW4nKSA/ICd0b3VjaCcgOiBldmVudC5wb2ludGVyVHlwZTsgLy8gdHJlYXQgcGVuIGxpa2UgdG91Y2hcbiAgICB9XG4gIH1cblxuICAvLyBrZXlib2FyZCBsb2dnaW5nXG4gIGZ1bmN0aW9uIGxvZ0tleXMoZXZlbnRLZXkpIHtcbiAgICBpZiAoYWN0aXZlS2V5cy5pbmRleE9mKGtleU1hcFtldmVudEtleV0pID09PSAtMSAmJiBrZXlNYXBbZXZlbnRLZXldKSBhY3RpdmVLZXlzLnB1c2goa2V5TWFwW2V2ZW50S2V5XSk7XG4gIH1cblxuICBmdW5jdGlvbiB1bkxvZ0tleXMoZXZlbnQpIHtcbiAgICB2YXIgZXZlbnRLZXkgPSBrZXkoZXZlbnQpO1xuICAgIHZhciBhcnJheVBvcyA9IGFjdGl2ZUtleXMuaW5kZXhPZihrZXlNYXBbZXZlbnRLZXldKTtcblxuICAgIGlmIChhcnJheVBvcyAhPT0gLTEpIGFjdGl2ZUtleXMuc3BsaWNlKGFycmF5UG9zLCAxKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGJpbmRFdmVudHMoKSB7XG4gICAgYm9keSA9IGRvY3VtZW50LmJvZHk7XG5cbiAgICAvLyBwb2ludGVyIGV2ZW50cyAobW91c2UsIHBlbiwgdG91Y2gpXG4gICAgaWYgKHdpbmRvdy5Qb2ludGVyRXZlbnQpIHtcbiAgICAgIGJvZHkuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCBidWZmZXJlZEV2ZW50KTtcbiAgICAgIGJvZHkuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcm1vdmUnLCBidWZmZXJlZEV2ZW50KTtcbiAgICB9IGVsc2UgaWYgKHdpbmRvdy5NU1BvaW50ZXJFdmVudCkge1xuICAgICAgYm9keS5hZGRFdmVudExpc3RlbmVyKCdNU1BvaW50ZXJEb3duJywgYnVmZmVyZWRFdmVudCk7XG4gICAgICBib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ01TUG9pbnRlck1vdmUnLCBidWZmZXJlZEV2ZW50KTtcbiAgICB9IGVsc2Uge1xuXG4gICAgICAvLyBtb3VzZSBldmVudHNcbiAgICAgIGJvZHkuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgYnVmZmVyZWRFdmVudCk7XG4gICAgICBib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIGJ1ZmZlcmVkRXZlbnQpO1xuXG4gICAgICAvLyB0b3VjaCBldmVudHNcbiAgICAgIGlmICgnb250b3VjaHN0YXJ0JyBpbiB3aW5kb3cpIHtcbiAgICAgICAgYm9keS5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgZXZlbnRCdWZmZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIG1vdXNlIHdoZWVsXG4gICAgYm9keS5hZGRFdmVudExpc3RlbmVyKG1vdXNlV2hlZWwsIGJ1ZmZlcmVkRXZlbnQpO1xuXG4gICAgLy8ga2V5Ym9hcmQgZXZlbnRzXG4gICAgYm9keS5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdW5CdWZmZXJlZEV2ZW50KTtcbiAgICBib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgdW5CdWZmZXJlZEV2ZW50KTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIHVuTG9nS2V5cyk7XG4gIH1cblxuXG4gIC8qXG4gICAgLS0tLS0tLS0tLS0tLS0tXG4gICAgdXRpbGl0aWVzXG4gICAgLS0tLS0tLS0tLS0tLS0tXG4gICovXG5cbiAgLy8gZGV0ZWN0IHZlcnNpb24gb2YgbW91c2Ugd2hlZWwgZXZlbnQgdG8gdXNlXG4gIC8vIHZpYSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9FdmVudHMvd2hlZWxcbiAgZnVuY3Rpb24gZGV0ZWN0V2hlZWwoKSB7XG4gICAgcmV0dXJuIG1vdXNlV2hlZWwgPSAnb253aGVlbCcgaW4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykgP1xuICAgICAgJ3doZWVsJyA6IC8vIE1vZGVybiBicm93c2VycyBzdXBwb3J0IFwid2hlZWxcIlxuXG4gICAgICBkb2
6780N1bWVudC5vbm1vdXNld2hlZWwgIT09IHVuZGVmaW5lZCA/XG4gICAgICAgICdtb3VzZXdoZWVsJyA6IC8vIFdlYmtpdCBhbmQgSUUgc3VwcG9ydCBhdCBsZWFzdCBcIm1vdXNld2hlZWxcIlxuICAgICAgICAnRE9NTW91c2VTY3JvbGwnOyAvLyBsZXQncyBhc3N1bWUgdGhhdCByZW1haW5pbmcgYnJvd3NlcnMgYXJlIG9sZGVyIEZpcmVmb3hcbiAgfVxuXG5cbiAgLypcbiAgICAtLS0tLS0tLS0tLS0tLS1cbiAgICBpbml0XG5cbiAgICBkb24ndCBzdGFydCBzY3JpcHQgdW5sZXNzIGJyb3dzZXIgY3V0cyB0aGUgbXVzdGFyZCxcbiAgICBhbHNvIHBhc3NlcyBpZiBwb2x5ZmlsbHMgYXJlIHVzZWRcbiAgICAtLS0tLS0tLS0tLS0tLS1cbiAgKi9cblxuICBpZiAoXG4gICAgJ2FkZEV2ZW50TGlzdGVuZXInIGluIHdpbmRvdyAmJlxuICAgIEFycmF5LnByb3RvdHlwZS5pbmRleE9mXG4gICkge1xuXG4gICAgLy8gaWYgdGhlIGRvbSBpcyBhbHJlYWR5IHJlYWR5IGFscmVhZHkgKHNjcmlwdCB3YXMgcGxhY2VkIGF0IGJvdHRvbSBvZiA8Ym9keT4pXG4gICAgaWYgKGRvY3VtZW50LmJvZHkpIHtcbiAgICAgIGJpbmRFdmVudHMoKTtcblxuICAgIC8vIG90aGVyd2lzZSB3YWl0IGZvciB0aGUgZG9tIHRvIGxvYWQgKHNjcmlwdCB3YXMgcGxhY2VkIGluIHRoZSA8aGVhZD4pXG4gICAgfSBlbHNlIHtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBiaW5kRXZlbnRzKTtcbiAgICB9XG4gIH1cblxuXG4gIC8qXG4gICAgLS0tLS0tLS0tLS0tLS0tXG4gICAgYXBpXG4gICAgLS0tLS0tLS0tLS0tLS0tXG4gICovXG5cbiAgcmV0dXJuIHtcblxuICAgIC8vIHJldHVybnMgc3RyaW5nOiB0aGUgY3VycmVudCBpbnB1dCB0eXBlXG4gICAgYXNrOiBmdW5jdGlvbigpIHsgcmV0dXJuIGN1cnJlbnRJbnB1dDsgfSxcblxuICAgIC8vIHJldHVybnMgYXJyYXk6IGN1cnJlbnRseSBwcmVzc2VkIGtleXNcbiAgICBrZXlzOiBmdW5jdGlvbigpIHsgcmV0dXJuIGFjdGl2ZUtleXM7IH0sXG5cbiAgICAvLyByZXR1cm5zIGFycmF5OiBhbGwgdGhlIGRldGVjdGVkIGlucHV0IHR5cGVzXG4gICAgdHlwZXM6IGZ1bmN0aW9uKCkgeyByZXR1cm4gaW5wdXRUeXBlczsgfSxcblxuICAgIC8vIGFjY2VwdHMgc3RyaW5nOiBtYW51YWxseSBzZXQgdGhlIGlucHV0IHR5cGVcbiAgICBzZXQ6IHN3aXRjaElucHV0XG4gIH07XG5cbn0oKSk7XG4iLCIvKlxuICAgICBfIF8gICAgICBfICAgICAgIF9cbiBfX198IChfKSBfX198IHwgX18gIChfKV9fX1xuLyBfX3wgfCB8LyBfX3wgfC8gLyAgfCAvIF9ffFxuXFxfXyBcXCB8IHwgKF9ffCAgIDwgXyB8IFxcX18gXFxcbnxfX18vX3xffFxcX19ffF98XFxfKF8pLyB8X19fL1xuICAgICAgICAgICAgICAgICAgIHxfXy9cblxuIFZlcnNpb246IDEuNS45XG4gIEF1dGhvcjogS2VuIFdoZWVsZXJcbiBXZWJzaXRlOiBodHRwOi8va2Vud2hlZWxlci5naXRodWIuaW9cbiAgICBEb2NzOiBodHRwOi8va2Vud2hlZWxlci5naXRodWIuaW8vc2xpY2tcbiAgICBSZXBvOiBodHRwOi8vZ2l0aHViLmNvbS9rZW53aGVlbGVyL3NsaWNrXG4gIElzc3VlczogaHR0cDovL2dpdGh1Yi5jb20va2Vud2hlZWxlci9zbGljay9pc3N1ZXNcblxuICovXG4hZnVuY3Rpb24oYSl7XCJ1c2Ugc3RyaWN0XCI7XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbXCJqcXVlcnlcIl0sYSk6XCJ1bmRlZmluZWRcIiE9dHlwZW9mIGV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9YShyZXF1aXJlKFwianF1ZXJ5XCIpKTphKGpRdWVyeSl9KGZ1bmN0aW9uKGEpe1widXNlIHN0cmljdFwiO3ZhciBiPXdpbmRvdy5TbGlja3x8e307Yj1mdW5jdGlvbigpe2Z1bmN0aW9uIGMoYyxkKXt2YXIgZixlPXRoaXM7ZS5kZWZhdWx0cz17YWNjZXNzaWJpbGl0eTohMCxhZGFwdGl2ZUhlaWdodDohMSxhcHBlbmRBcnJvd3M6YShjKSxhcHBlbmREb3RzOmEoYyksYXJyb3dzOiEwLGFzTmF2Rm9yOm51bGwscHJldkFycm93Oic8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBkYXRhLXJvbGU9XCJub25lXCIgY2x
6780hc3M9XCJzbGljay1wcmV2XCIgYXJpYS1sYWJlbD1cIlByZXZpb3VzXCIgdGFiaW5kZXg9XCIwXCIgcm9sZT1cImJ1dHRvblwiPlByZXZpb3VzPC9idXR0b24+JyxuZXh0QXJyb3c6JzxidXR0b24gdHlwZT1cImJ1dHRvblwiIGRhdGEtcm9sZT1cIm5vbmVcIiBjbGFzcz1cInNsaWNrLW5leHRcIiBhcmlhLWxhYmVsPVwiTmV4dFwiIHRhYmluZGV4PVwiMFwiIHJvbGU9XCJidXR0b25cIj5OZXh0PC9idXR0b24+JyxhdXRvcGxheTohMSxhdXRvcGxheVNwZWVkOjNlMyxjZW50ZXJNb2RlOiExLGNlbnRlclBhZGRpbmc6XCI1MHB4XCIsY3NzRWFzZTpcImVhc2VcIixjdXN0b21QYWdpbmc6ZnVuY3Rpb24oYSxiKXtyZXR1cm4nPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1yb2xlPVwibm9uZVwiIHJvbGU9XCJidXR0b25cIiBhcmlhLXJlcXVpcmVkPVwiZmFsc2VcIiB0YWJpbmRleD1cIjBcIj4nKyhiKzEpK1wiPC9idXR0b24+XCJ9LGRvdHM6ITEsZG90c0NsYXNzOlwic2xpY2stZG90c1wiLGRyYWdnYWJsZTohMCxlYXNpbmc6XCJsaW5lYXJcIixlZGdlRnJpY3Rpb246LjM1LGZhZGU6ITEsZm9jdXNPblNlbGVjdDohMSxpbmZpbml0ZTohMCxpbml0aWFsU2xpZGU6MCxsYXp5TG9hZDpcIm9uZGVtYW5kXCIsbW9iaWxlRmlyc3Q6ITEscGF1c2VPbkhvdmVyOiEwLHBhdXNlT25Eb3RzSG92ZXI6ITEscmVzcG9uZFRvOlwid2luZG93XCIscmVzcG9uc2l2ZTpudWxsLHJvd3M6MSxydGw6ITEsc2xpZGU6XCJcIixzbGlkZXNQZXJSb3c6MSxzbGlkZXNUb1Nob3c6MSxzbGlkZXNUb1Njcm9sbDoxLHNwZWVkOjUwMCxzd2lwZTohMCxzd2lwZVRvU2xpZGU6ITEsdG91Y2hNb3ZlOiEwLHRvdWNoVGhyZXNob2xkOjUsdXNlQ1NTOiEwLHVzZVRyYW5zZm9ybTohMSx2YXJpYWJsZVdpZHRoOiExLHZlcnRpY2FsOiExLHZlcnRpY2FsU3dpcGluZzohMSx3YWl0Rm9yQW5pbWF0ZTohMCx6SW5kZXg6MWUzfSxlLmluaXRpYWxzPXthbmltYXRpbmc6ITEsZHJhZ2dpbmc6ITEsYXV0b1BsYXlUaW1lcjpudWxsLGN1cnJlbnREaXJlY3Rpb246MCxjdXJyZW50TGVmdDpudWxsLGN1cnJlbnRTbGlkZTowLGRpcmVjdGlvbjoxLCRkb3RzOm51bGwsbGlzdFdpZHRoOm51bGwsbGlzdEhlaWdodDpudWxsLGxvYWRJbmRleDowLCRuZXh0QXJyb3c6bnVsbCwkcHJldkFycm93Om51bGwsc2xpZGVDb3VudDpudWxsLHNsaWRlV2lkdGg6bnVsbCwkc2xpZGVUcmFjazpudWxsLCRzbGlkZXM6bnVsbCxzbGlkaW5nOiExLHNsaWRlT2Zmc2V0OjAsc3dpcGVMZWZ0Om51bGwsJGxpc3Q6bnVsbCx0b3VjaE9iamVjdDp7fSx0cmFuc2Zvcm1zRW5hYmxlZDohMSx1bnNsaWNrZWQ6ITF9LGEuZXh0ZW5kKGUsZS5pbml0aWFscyksZS5hY3RpdmVCcmVha3BvaW50PW51bGwsZS5hbmltVHlwZT1udWxsLGUuYW5pbVByb3A9bnVsbCxlLmJyZWFrcG9pbnRzPVtdLGUuYnJlYWtwb2ludFNldHRpbmdzPVtdLGUuY3NzVHJhbnNpdGlvbnM9ITEsZS5oaWRkZW49XCJoaWRkZW5cIixlLnBhdXNlZD0hMSxlLnBvc2l0aW9uUHJvcD1udWxsLGUucmVzcG9uZFRvPW51bGwsZS5yb3dDb3VudD0xLGUuc2hvdWxkQ2xpY2s9ITAsZS4kc2xpZGVyPWEoYyksZS4kc2xpZGVzQ2FjaGU9bnVsbCxlLnRyYW5zZm9ybVR5cGU9bnVsbCxlLnRyYW5zaXRpb25UeXBlPW51bGwsZS52aXNpYmlsaXR5Q2hhbmdlPVwidmlzaWJpbGl0eWNoYW5nZVwiLGUud2luZG93V2lkdGg9MCxlLndpbmRvd1RpbWVyPW51bGwsZj1hKGMpLmRhdGEoXCJzbGlja1wiKXx8e30sZS5vcHRpb25zPWEuZXh0ZW5kKHt9LGUuZGVmYXVsdHMsZixkKSxlLmN1cnJlbnRTbGlkZT1lLm9wdGlvbnMuaW5pdGlhbFNsaWRlLGUub3JpZ2luYWxTZXR0aW5ncz1lLm9wdGlvbnMsXCJ1bmRlZmluZWRcIiE9dHlwZW9mIGRvY3VtZW50Lm1vekhpZGRlbj8oZS5oaWRkZW49XCJtb3pIaWRkZW5cIixlLnZpc2liaWxpdHlDaGFuZ2U9XCJtb3p2aXNpYmlsaXR5Y2hhbmdlXCIpOlwidW5kZWZpbmVkXCIhPXR5cGVvZiBkb2N1bWVudC53ZWJraXRIaWRkZW4mJihlLmhpZGRlbj1cIndlYmtpdEhpZGRlblwiLGUudmlzaWJpbGl0eUNoYW5nZT1cIndlYmtpdHZpc2liaWxpdHljaGFuZ2VcIiksZS5hdXRvUGxheT1hLnByb3h5KGUuYXV0b1BsYXksZSksZS5hdXRvUGxheUNsZWFyPWEucHJveHkoZS5hdXRvUGxheUNsZWFyLGUpLGUuY2hhbmdlU2xpZGU9YS5wcm94eShlLmNoYW5nZVNsaWRlLGUpLGUuY2xpY2tIYW5kbGVyPWEucHJveHkoZS5jbGlja0hhbmRsZXIsZSksZS5zZWxlY3RIYW5kbGVyPWEucHJveHkoZS5zZWxlY3RIYW5kbGVyLGUpLGUuc2V0UG9zaXRpb249YS5wcm94eShlLnNldFBvc2l0aW9uLGUpLGUuc3dpcGVIYW5kbGVyPWEucHJveHkoZS5zd2lwZUhhbmRsZXIsZSksZS5kcmFnSGFuZGxlcj1hLnByb3h5KGUuZHJhZ0hhbmRsZXIsZSksZS5rZXlIYW5kbGVyPWEucHJveHkoZS5rZXlIYW5kbGVyLGUpLGUuYXV0b1BsYXlJdGVyYXRvcj1hLnByb3h5KGUuYXV0b1BsYXlJdGVyYXRvcixlKSxlLmluc3RhbmNlVWlkPWIrKyxlLmh0bWxFeHByPS9eKD86XFxzKig8W1xcd1xcV10rPilbXj5dKikkLyxlLnJlZ2lzdGVyQnJlYWtwb2ludHMoKSxlLmluaXQoITApLGUuY2hlY2tSZXNwb25zaXZlKCEwKX12YXIgYj0wO3JldHVybiBjfSgpLGIucHJvdG90eXBlLmFkZFNsaWRlPWIucHJvdG90eXBlLnNsaWNrQWRkPWZ1bmN0aW9uKGIsYyxkKXt2YXIgZT10aGlzO2lmKFwiYm9vbGVhblwiPT10eXBlb2YgYylkPWMsYz1udWxsO2Vsc2UgaWYoMD5jfHxjPj1lLnNsaWRlQ291bnQpcmV0dXJuITE7ZS51bmxvYWQoKSxcIm51bWJlclwiPT10eXBlb2YgYz8wPT09YyYmMD09PWUuJHNsaWRlcy5sZW5ndGg/YShiKS5hcHBlbmRUbyhlLiRzbGlkZVRyYWNrKTpkP2EoYikuaW5zZXJ0QmVmb3JlKGUuJHNsaWRlcy5lcShjKSk6YShiKS5pbnNlcnRBZnRlcihlLiRzbGlkZXMuZXEoYykpOmQ9PT0hMD9hKGIpLnByZXBlbmRUbyhlLiRzbGlkZVRyYWNrKTphKGIpLmFwcGVuZFRvKGUuJHNsaWRlVHJhY2spLGUuJHNsaWRlcz1lLiRzbGlkZVRyYWNrLmNoaWxkcmVuKHRoaXMub3B0aW9ucy5zbGlkZSksZS4kc2xpZGVUcmFjay5jaGlsZHJlbih0aGlzLm9wdGlvbnMuc2xpZGUpLmRldGFjaCgpLGUuJHNsaWRlVHJhY2suYXBwZW5kKGUuJHNsaWRlcyksZS4kc2xpZGVzLmVhY2goZnVuY3Rpb24oYixjKXthKGMpLmF0dHIoXCJkYXRhLXNsaWNrLWluZGV4XCIsYil9KSxlLiRzbGlkZXNDYWNoZT1lLiRzbGlkZXMsZS5yZWluaXQoKX0sYi5wcm90b3R5cGUuYW5pbWF0ZUhlaWdodD1mdW5jdGlvbigpe3ZhciBhPXRoaXM7aWYoMT09PWEub3B0aW9ucy5zbGlkZXNUb1Nob3cmJmEub3B0aW9ucy5hZGFwdGl2ZUhlaWdodD09PSEwJiZhLm9wdGlvbnMudmVydGljYWw9PT0hMSl7dmFyIGI9YS4kc2xpZGVzLmVxKGEuY3VycmVudFNsaWRlKS5vdXRlckhlaWdodCghMCk7YS4kbGlzdC5hbmltYXRlKHtoZWlnaHQ6Yn0sYS5vcHRpb25zLnNwZWVkKX19LGIucHJvdG90eXBlLmFuaW1hdGVTbGlkZT1mdW5jdGlvbihiLGMpe3ZhciBkPXt9LGU9dGhpcztlLmFuaW1hdGVIZWlnaHQoKSxlLm9wdGlvbnMucnRsPT09ITAmJmUub3B0aW9ucy52ZXJ0aWNhbD09PSExJiYoYj0tYiksZS50cmFuc2Zvcm1zRW5hYmxlZD09PSExP2Uub3B0aW9ucy52ZXJ0aWNhbD09PSExP2UuJHNsaWRlVHJhY2suYW5pbWF0ZSh7bGVmdDpifSxlLm9wdGlvbnMuc3BlZWQsZS5vcHRpb25zLmVhc2luZyxjKTplLiRzbGlkZVRyYWNrLmFuaW1hdGUoe3RvcDpifSxlLm9wdGlvbnMuc3BlZWQsZS5vcHRpb25zLmVhc2luZyxjKTplLmNzc1RyYW5zaXRpb25zPT09ITE/KGUub3B0aW9ucy5ydGw9PT0hMCYmKGUuY3VycmVudExlZnQ9LWUuY3VycmVudExlZnQpLGEoe2FuaW1TdGFydDplLmN1cnJlbnRMZWZ0fSkuYW5pbWF0ZSh7YW5pbVN0YXJ0OmJ9LHtkdXJhdGlvbjplLm9wdGlvbnMuc3BlZWQsZWFzaW5nOmUub3B0aW9ucy5lYXNpbmcsc3RlcDpmdW5jdGlvbihhKXthPU1hdGguY2VpbChhKSxlLm9wdGlvbnMudmVydGljYWw9PT0hMT8oZFtlLmFuaW1UeXBlXT1cInRyYW5zbGF0ZShcIithK1wicHgsIDBweClcIixlLiRzbGlkZVRyYWNrLmNzcyhkKSk6KGRbZS5hbmltVHlwZV09XCJ0cmFuc2xhdGUoMHB4LFwiK2ErXCJweClcIixlLiRzbGlkZVRyYWNrLmNzcyhkKSl9LGNvbXBsZXRlOmZ1bmN0aW9uKCl7YyYmYy5jYWxsKCl9fSkpOihlLmFwcGx5VHJhbnNpdGlvbigpLGI9TWF0aC5jZWlsKGIpLGUub3B0aW9ucy52ZXJ0aWNhbD09PSExP2RbZS5hbmltVHlwZV09XCJ0cmFuc2xhdGUzZChcIitiK1wicHgsIDBweCwgMHB4KVwiOmRbZS5hbmltVHlwZV09XCJ0cmFuc2xhdGUzZCgwc
6780HgsXCIrYitcInB4LCAwcHgpXCIsZS4kc2xpZGVUcmFjay5jc3MoZCksYyYmc2V0VGltZW91dChmdW5jdGlvbigpe2UuZGlzYWJsZVRyYW5zaXRpb24oKSxjLmNhbGwoKX0sZS5vcHRpb25zLnNwZWVkKSl9LGIucHJvdG90eXBlLmFzTmF2Rm9yPWZ1bmN0aW9uKGIpe3ZhciBjPXRoaXMsZD1jLm9wdGlvbnMuYXNOYXZGb3I7ZCYmbnVsbCE9PWQmJihkPWEoZCkubm90KGMuJHNsaWRlcikpLG51bGwhPT1kJiZcIm9iamVjdFwiPT10eXBlb2YgZCYmZC5lYWNoKGZ1bmN0aW9uKCl7dmFyIGM9YSh0aGlzKS5zbGljayhcImdldFNsaWNrXCIpO2MudW5zbGlja2VkfHxjLnNsaWRlSGFuZGxlcihiLCEwKX0pfSxiLnByb3RvdHlwZS5hcHBseVRyYW5zaXRpb249ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcyxjPXt9O2Iub3B0aW9ucy5mYWRlPT09ITE/Y1tiLnRyYW5zaXRpb25UeXBlXT1iLnRyYW5zZm9ybVR5cGUrXCIgXCIrYi5vcHRpb25zLnNwZWVkK1wibXMgXCIrYi5vcHRpb25zLmNzc0Vhc2U6Y1tiLnRyYW5zaXRpb25UeXBlXT1cIm9wYWNpdHkgXCIrYi5vcHRpb25zLnNwZWVkK1wibXMgXCIrYi5vcHRpb25zLmNzc0Vhc2UsYi5vcHRpb25zLmZhZGU9PT0hMT9iLiRzbGlkZVRyYWNrLmNzcyhjKTpiLiRzbGlkZXMuZXEoYSkuY3NzKGMpfSxiLnByb3RvdHlwZS5hdXRvUGxheT1mdW5jdGlvbigpe3ZhciBhPXRoaXM7YS5hdXRvUGxheVRpbWVyJiZjbGVhckludGVydmFsKGEuYXV0b1BsYXlUaW1lciksYS5zbGlkZUNvdW50PmEub3B0aW9ucy5zbGlkZXNUb1Nob3cmJmEucGF1c2VkIT09ITAmJihhLmF1dG9QbGF5VGltZXI9c2V0SW50ZXJ2YWwoYS5hdXRvUGxheUl0ZXJhdG9yLGEub3B0aW9ucy5hdXRvcGxheVNwZWVkKSl9LGIucHJvdG90eXBlLmF1dG9QbGF5Q2xlYXI9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO2EuYXV0b1BsYXlUaW1lciYmY2xlYXJJbnRlcnZhbChhLmF1dG9QbGF5VGltZXIpfSxiLnByb3RvdHlwZS5hdXRvUGxheUl0ZXJhdG9yPWZ1bmN0aW9uKCl7dmFyIGE9dGhpczthLm9wdGlvbnMuaW5maW5pdGU9PT0hMT8xPT09YS5kaXJlY3Rpb24/KGEuY3VycmVudFNsaWRlKzE9PT1hLnNsaWRlQ291bnQtMSYmKGEuZGlyZWN0aW9uPTApLGEuc2xpZGVIYW5kbGVyKGEuY3VycmVudFNsaWRlK2Eub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCkpOihhLmN1cnJlbnRTbGlkZS0xPT09MCYmKGEuZGlyZWN0aW9uPTEpLGEuc2xpZGVIYW5kbGVyKGEuY3VycmVudFNsaWRlLWEub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCkpOmEuc2xpZGVIYW5kbGVyKGEuY3VycmVudFNsaWRlK2Eub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCl9LGIucHJvdG90eXBlLmJ1aWxkQXJyb3dzPWZ1bmN0aW9uKCl7dmFyIGI9dGhpcztiLm9wdGlvbnMuYXJyb3dzPT09ITAmJihiLiRwcmV2QXJyb3c9YShiLm9wdGlvbnMucHJldkFycm93KS5hZGRDbGFzcyhcInNsaWNrLWFycm93XCIpLGIuJG5leHRBcnJvdz1hKGIub3B0aW9ucy5uZXh0QXJyb3cpLmFkZENsYXNzKFwic2xpY2stYXJyb3dcIiksYi5zbGlkZUNvdW50PmIub3B0aW9ucy5zbGlkZXNUb1Nob3c/KGIuJHByZXZBcnJvdy5yZW1vdmVDbGFzcyhcInNsaWNrLWhpZGRlblwiKS5yZW1vdmVBdHRyKFwiYXJpYS1oaWRkZW4gdGFiaW5kZXhcIiksYi4kbmV4dEFycm93LnJlbW92ZUNsYXNzKFwic2xpY2staGlkZGVuXCIpLnJlbW92ZUF0dHIoXCJhcmlhLWhpZGRlbiB0YWJpbmRleFwiKSxiLmh0bWxFeHByLnRlc3QoYi5vcHRpb25zLnByZXZBcnJvdykmJmIuJHByZXZBcnJvdy5wcmVwZW5kVG8oYi5vcHRpb25zLmFwcGVuZEFycm93cyksYi5odG1sRXhwci50ZXN0KGIub3B0aW9ucy5uZXh0QXJyb3cpJiZiLiRuZXh0QXJyb3cuYXBwZW5kVG8oYi5vcHRpb25zLmFwcGVuZEFycm93cyksYi5vcHRpb25zLmluZmluaXRlIT09ITAmJmIuJHByZXZBcnJvdy5hZGRDbGFzcyhcInNsaWNrLWRpc2FibGVkXCIpLmF0dHIoXCJhcmlhLWRpc2FibGVkXCIsXCJ0cnVlXCIpKTpiLiRwcmV2QXJyb3cuYWRkKGIuJG5leHRBcnJvdykuYWRkQ2xhc3MoXCJzbGljay1oaWRkZW5cIikuYXR0cih7XCJhcmlhLWRpc2FibGVkXCI6XCJ0cnVlXCIsdGFiaW5kZXg6XCItMVwifSkpfSxiLnByb3RvdHlwZS5idWlsZERvdHM9ZnVuY3Rpb24oKXt2YXIgYyxkLGI9dGhpcztpZihiLm9wdGlvbnMuZG90cz09PSEwJiZiLnNsaWRlQ291bnQ+Yi5vcHRpb25zLnNsaWRlc1RvU2hvdyl7Zm9yKGQ9Jzx1bCBjbGFzcz1cIicrYi5vcHRpb25zLmRvdHNDbGFzcysnXCI+JyxjPTA7Yzw9Yi5nZXREb3RDb3VudCgpO2MrPTEpZCs9XCI8bGk+XCIrYi5vcHRpb25zLmN1c3RvbVBhZ2luZy5jYWxsKHRoaXMsYixjKStcIjwvbGk+XCI7ZCs9XCI8L3VsPlwiLGIuJGRvdHM9YShkKS5hcHBlbmRUbyhiLm9wdGlvbnMuYXBwZW5kRG90cyksYi4kZG90cy5maW5kKFwibGlcIikuZmlyc3QoKS5hZGRDbGFzcyhcInNsaWNrLWFjdGl2ZVwiKS5hdHRyKFwiYXJpYS1oaWRkZW5cIixcImZhbHNlXCIpfX0sYi5wcm90b3R5cGUuYnVpbGRPdXQ9ZnVuY3Rpb24oKXt2YXIgYj10aGlzO2IuJHNsaWRlcz1iLiRzbGlkZXIuY2hpbGRyZW4oYi5vcHRpb25zLnNsaWRlK1wiOm5vdCguc2xpY2stY2xvbmVkKVwiKS5hZGRDbGFzcyhcInNsaWNrLXNsaWRlXCIpLGIuc2xpZGVDb3VudD1iLiRzbGlkZXMubGVuZ3RoLGIuJHNsaWRlcy5lYWNoKGZ1bmN0aW9uKGIsYyl7YShjKS5hdHRyKFwiZGF0YS1zbGljay1pbmRleFwiLGIpLmRhdGEoXCJvcmlnaW5hbFN0eWxpbmdcIixhKGMpLmF0dHIoXCJzdHlsZVwiKXx8XCJcIil9KSxiLiRzbGlkZXIuYWRkQ2xhc3MoXCJzbGljay1zbGlkZXJcIiksYi4kc2xpZGVUcmFjaz0wPT09Yi5zbGlkZUNvdW50P2EoJzxkaXYgY2xhc3M9XCJzbGljay10cmFja1wiLz4nKS5hcHBlbmRUbyhiLiRzbGlkZXIpOmIuJHNsaWRlcy53cmFwQWxsKCc8ZGl2IGNsYXNzPVwic2xpY2stdHJhY2tcIi8+JykucGFyZW50KCksYi4kbGlzdD1iLiRzbGlkZVRyYWNrLndyYXAoJzxkaXYgYXJpYS1saXZlPVwicG9saXRlXCIgY2xhc3M9XCJzbGljay1saXN0XCIvPicpLnBhcmVudCgpLGIuJHNsaWRlVHJhY2suY3NzKFwib3BhY2l0eVwiLDApLChiLm9wdGlvbnMuY2VudGVyTW9kZT09PSEwfHxiLm9wdGlvbnMuc3dpcGVUb1NsaWRlPT09ITApJiYoYi5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsPTEpLGEoXCJpbWdbZGF0YS1sYXp5XVwiLGIuJHNsaWRlcikubm90KFwiW3NyY11cIikuYWRkQ2xhc3MoXCJzbGljay1sb2FkaW5nXCIpLGIuc2V0dXBJbmZpbml0ZSgpLGIuYnVpbGRBcnJvd3MoKSxiLmJ1aWxkRG90cygpLGIudXBkYXRlRG90cygpLGIuc2V0U2xpZGVDbGFzc2VzKFwibnVtYmVyXCI9PXR5cGVvZiBiLmN1cnJlbnRTbGlkZT9iLmN1cnJlbnRTbGlkZTowKSxiLm9wdGlvbnMuZHJhZ2dhYmxlPT09ITAmJmIuJGxpc3QuYWRkQ2xhc3MoXCJkcmFnZ2FibGVcIil9LGIucHJvdG90eXBlLmJ1aWxkUm93cz1mdW5jdGlvbigpe3ZhciBiLGMsZCxlLGYsZyxoLGE9dGhpcztpZihlPWRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxnPWEuJHNsaWRlci5jaGlsZHJlbigpLGEub3B0aW9ucy5yb3dzPjEpe2ZvcihoPWEub3B0aW9ucy5zbGlkZXNQZXJSb3cqYS5vcHRpb25zLnJvd3MsZj1NYXRoLmNlaWwoZy5sZW5ndGgvaCksYj0wO2Y+YjtiKyspe3ZhciBpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7Zm9yKGM9MDtjPGEub3B0aW9ucy5yb3dzO2MrKyl7dmFyIGo9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtmb3IoZD0wO2Q8YS5vcHRpb25zLnNsaWRlc1BlclJvdztkKyspe3ZhciBrPWIqaCsoYyphLm9wdGlvbnMuc2xpZGVzUGVyUm93K2QpO2cuZ2V0KGspJiZqLmFwcGVuZENoaWxkKGcuZ2V0KGspKX1pLmFwcGVuZENoaWxkKGopfWUuYXBwZW5kQ2hpbGQoaSl9YS4kc2xpZGVyLmh0bWwoZSksYS4
6780kc2xpZGVyLmNoaWxkcmVuKCkuY2hpbGRyZW4oKS5jaGlsZHJlbigpLmNzcyh7d2lkdGg6MTAwL2Eub3B0aW9ucy5zbGlkZXNQZXJSb3crXCIlXCIsZGlzcGxheTpcImlubGluZS1ibG9ja1wifSl9fSxiLnByb3RvdHlwZS5jaGVja1Jlc3BvbnNpdmU9ZnVuY3Rpb24oYixjKXt2YXIgZSxmLGcsZD10aGlzLGg9ITEsaT1kLiRzbGlkZXIud2lkdGgoKSxqPXdpbmRvdy5pbm5lcldpZHRofHxhKHdpbmRvdykud2lkdGgoKTtpZihcIndpbmRvd1wiPT09ZC5yZXNwb25kVG8/Zz1qOlwic2xpZGVyXCI9PT1kLnJlc3BvbmRUbz9nPWk6XCJtaW5cIj09PWQucmVzcG9uZFRvJiYoZz1NYXRoLm1pbihqLGkpKSxkLm9wdGlvbnMucmVzcG9uc2l2ZSYmZC5vcHRpb25zLnJlc3BvbnNpdmUubGVuZ3RoJiZudWxsIT09ZC5vcHRpb25zLnJlc3BvbnNpdmUpe2Y9bnVsbDtmb3IoZSBpbiBkLmJyZWFrcG9pbnRzKWQuYnJlYWtwb2ludHMuaGFzT3duUHJvcGVydHkoZSkmJihkLm9yaWdpbmFsU2V0dGluZ3MubW9iaWxlRmlyc3Q9PT0hMT9nPGQuYnJlYWtwb2ludHNbZV0mJihmPWQuYnJlYWtwb2ludHNbZV0pOmc+ZC5icmVha3BvaW50c1tlXSYmKGY9ZC5icmVha3BvaW50c1tlXSkpO251bGwhPT1mP251bGwhPT1kLmFjdGl2ZUJyZWFrcG9pbnQ/KGYhPT1kLmFjdGl2ZUJyZWFrcG9pbnR8fGMpJiYoZC5hY3RpdmVCcmVha3BvaW50PWYsXCJ1bnNsaWNrXCI9PT1kLmJyZWFrcG9pbnRTZXR0aW5nc1tmXT9kLnVuc2xpY2soZik6KGQub3B0aW9ucz1hLmV4dGVuZCh7fSxkLm9yaWdpbmFsU2V0dGluZ3MsZC5icmVha3BvaW50U2V0dGluZ3NbZl0pLGI9PT0hMCYmKGQuY3VycmVudFNsaWRlPWQub3B0aW9ucy5pbml0aWFsU2xpZGUpLGQucmVmcmVzaChiKSksaD1mKTooZC5hY3RpdmVCcmVha3BvaW50PWYsXCJ1bnNsaWNrXCI9PT1kLmJyZWFrcG9pbnRTZXR0aW5nc1tmXT9kLnVuc2xpY2soZik6KGQub3B0aW9ucz1hLmV4dGVuZCh7fSxkLm9yaWdpbmFsU2V0dGluZ3MsZC5icmVha3BvaW50U2V0dGluZ3NbZl0pLGI9PT0hMCYmKGQuY3VycmVudFNsaWRlPWQub3B0aW9ucy5pbml0aWFsU2xpZGUpLGQucmVmcmVzaChiKSksaD1mKTpudWxsIT09ZC5hY3RpdmVCcmVha3BvaW50JiYoZC5hY3RpdmVCcmVha3BvaW50PW51bGwsZC5vcHRpb25zPWQub3JpZ2luYWxTZXR0aW5ncyxiPT09ITAmJihkLmN1cnJlbnRTbGlkZT1kLm9wdGlvbnMuaW5pdGlhbFNsaWRlKSxkLnJlZnJlc2goYiksaD1mKSxifHxoPT09ITF8fGQuJHNsaWRlci50cmlnZ2VyKFwiYnJlYWtwb2ludFwiLFtkLGhdKX19LGIucHJvdG90eXBlLmNoYW5nZVNsaWRlPWZ1bmN0aW9uKGIsYyl7dmFyIGYsZyxoLGQ9dGhpcyxlPWEoYi50YXJnZXQpO3N3aXRjaC
6780hlLmlzKFwiYVwiKSYmYi5wcmV2ZW50RGVmYXVsdCgpLGUuaXMoXCJsaVwiKXx8KGU9ZS5jbG9zZXN0KFwibGlcIikpLGg9ZC5zbGlkZUNvdW50JWQub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCE9PTAsZj1oPzA6KGQuc2xpZGVDb3VudC1kLmN1cnJlbnRTbGlkZSklZC5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsLGIuZGF0YS5tZXNzYWdlKXtjYXNlXCJwcmV2aW91c1wiOmc9MD09PWY/ZC5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsOmQub3B0aW9ucy5zbGlkZXNUb1Nob3ctZixkLnNsaWRlQ291bnQ+ZC5vcHRpb25zLnNsaWRlc1RvU2hvdyYmZC5zbGlkZUhhbmRsZXIoZC5jdXJyZW50U2xpZGUtZywhMSxjKTticmVhaztjYXNlXCJuZXh0XCI6Zz0wPT09Zj9kLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGw6ZixkLnNsaWRlQ291bnQ+ZC5vcHRpb25zLnNsaWRlc1RvU2hvdyYmZC5zbGlkZUhhbmRsZXIoZC5jdXJyZW50U2xpZGUrZywhMSxjKTticmVhaztjYXNlXCJpbmRleFwiOnZhciBpPTA9PT1iLmRhdGEuaW5kZXg/MDpiLmRhdGEuaW5kZXh8fGUuaW5kZXgoKSpkLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGw7ZC5zbGlkZUhhbmRsZXIoZC5jaGVja05hdmlnYWJsZShpKSwhMSxjKSxlLmNoaWxkcmVuKCkudHJpZ2dlcihcImZvY3VzXCIpO2JyZWFrO2RlZmF1bHQ6cmV0dXJufX0sYi5wcm90b3R5cGUuY2hlY2tOYXZpZ2FibGU9ZnVuY3Rpb24oYSl7dmFyIGMsZCxiPXRoaXM7aWYoYz1iLmdldE5hdmlnYWJsZUluZGV4ZXMoKSxkPTAsYT5jW2MubGVuZ3RoLTFdKWE9Y1tjLmxlbmd0aC0xXTtlbHNlIGZvcih2YXIgZSBpbiBjKXtpZihhPGNbZV0pe2E9ZDticmVha31kPWNbZV19cmV0dXJuIGF9LGIucHJvdG90eXBlLmNsZWFuVXBFdmVudHM9ZnVuY3Rpb24oKXt2YXIgYj10aGlzO2Iub3B0aW9ucy5kb3RzJiZudWxsIT09Yi4kZG90cyYmKGEoXCJsaVwiLGIuJGRvdHMpLm9mZihcImNsaWNrLnNsaWNrXCIsYi5jaGFuZ2VTbGlkZSksYi5vcHRpb25zLnBhdXNlT25Eb3RzSG92ZXI9PT0hMCYmYi5vcHRpb25zLmF1dG9wbGF5PT09ITAmJmEoXCJsaVwiLGIuJGRvdHMpLm9mZihcIm1vdXNlZW50ZXIuc2xpY2tcIixhLnByb3h5KGIuc2V0UGF1c2VkLGIsITApKS5vZmYoXCJtb3VzZWxlYXZlLnNsaWNrXCIsYS5wcm94eShiLnNldFBhdXNlZCxiLCExKSkpLGIub3B0aW9ucy5hcnJvd3M9PT0hMCYmYi5zbGlkZUNvdW50PmIub3B0aW9ucy5zbGlkZXNUb1Nob3cmJihiLiRwcmV2QXJyb3cmJmIuJHByZXZBcnJvdy5vZmYoXCJjbGljay5zbGlja1wiLGIuY2hhbmdlU2xpZGUpLGIuJG5leHRBcnJvdyYmYi4kbmV4dEFycm93Lm9mZihcImNsaWNrLnNsaWNrXCIsYi5jaGFuZ2VTbGlkZSkpLGIuJGxpc3Qub2ZmKFwidG91Y2hzdGFydC5zbGljayBtb3VzZWRvd24uc2xpY2tcIixiLnN3aXBlSGFuZGxlciksYi4kbGlzdC5vZmYoXCJ0b3VjaG1vdmUuc2xpY2sgbW91c2Vtb3ZlLnNsaWNrXCIsYi5zd2lwZUhhbmRsZXIpLGIuJGxpc3Qub2ZmKFwidG91Y2hlbmQuc2xpY2sgbW91c2V1cC5zbGlja1wiLGIuc3dpcGVIYW5kbGVyKSxiLiRsaXN0Lm9mZihcInRvdWNoY2FuY2VsLnNsaWNrIG1vdXNlbGVhdmUuc2xpY2tcIixiLnN3aXBlSGFuZGxlciksYi4kbGlzdC5vZmYoXCJjbGljay5zbGlja1wiLGIuY2xpY2tIYW5kbGVyKSxhKGRvY3VtZW50KS5vZmYoYi52aXNpYmlsaXR5Q2hhbmdlLGIudmlzaWJpbGl0eSksYi4kbGlzdC5vZmYoXCJtb3VzZWVudGVyLnNsaWNrXCIsYS5wcm94eShiLnNldFBhdXNlZCxiLCEwKSksYi4kbGlzdC5vZmYoXCJtb3VzZWxlYXZlLnNsaWNrXCIsYS5wcm94eShiLnNldFBhdXNlZCxiLCExKSksYi5vcHRpb25zLmFjY2Vzc2liaWxpdHk9PT0hMCYmYi4kbGlzdC5vZmYoXCJrZXlkb3duLnNsaWNrXCIsYi5rZXlIYW5kbGVyKSxiLm9wdGlvbnMuZm9jdXNPblNlbGVjdD09PSEwJiZhKGIuJHNsaWRlVHJhY2spLmNoaWxkcmVuKCkub2ZmKFwiY2xpY2suc2xpY2tcIixiLnNlbGVjdEhhbmRsZXIpLGEod2luZG93KS5vZmYoXCJvcmllbnRhdGlvbmNoYW5nZS5zbGljay5zbGljay1cIitiLmluc3RhbmNlVWlkLGIub3JpZW50YXRpb25DaGFuZ2UpLGEod2luZG93KS5vZmYoXCJyZXNpemUuc2xpY2suc2xpY2stXCIrYi5pbnN0YW5jZVVpZCxiLnJlc2l6ZSksYShcIltkcmFnZ2FibGUhPXRydWVdXCIsYi4kc2xpZGVUcmFjaykub2ZmKFwiZHJhZ3N0YXJ0XCIsYi5wcmV2ZW50RGVmYXVsdCksYSh3aW5kb3cpLm9mZihcImxvYWQuc2xpY2suc2xpY2stXCIrYi5pbnN0YW5jZVVpZCxiLnNldFBvc2l0aW9uKSxhKGRvY3VtZW50KS5vZmYoXCJyZWFkeS5zbGljay5zbGljay1cIitiLmluc3RhbmNlVWlkLGIuc2V0UG9zaXRpb24pfSxiLnByb3RvdHlwZS5jbGVhblVwUm93cz1mdW5jdGlvbigpe3ZhciBiLGE9dGhpczthLm9wdGlvbnMucm93cz4xJiYoYj1hLiRzbGlkZXMuY2hpbGRyZW4oKS5jaGlsZHJlbigpLGIucmVtb3ZlQXR0cihcInN0eWxlXCIpLGEuJHNsaWRlci5odG1sKGIpKX0sYi5wcm90b3R5cGUuY2xpY2tIYW5kbGVyPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXM7Yi5zaG91bGRDbGljaz09PSExJiYoYS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSxhLnN0b3BQcm9wYWdhdGlvbigpLGEucHJldmVudERlZmF1bHQoKSl9LGIucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oYil7dmFyIGM9dGhpcztjLmF1dG9QbGF5Q2xlYXIoKSxjLnRvdWNoT2JqZWN0PXt9LGMuY2xlYW5VcEV2ZW50cygpLGEoXCIuc2xpY2stY2xvbmVkXCIsYy4kc2xpZGVyKS5kZXRhY2goKSxjLiRkb3RzJiZjLiRkb3RzLnJlbW92ZSgpLGMuJHByZXZBcnJvdyYmYy4kcHJldkFycm93Lmxlbmd0aCYmKGMuJHByZXZBcnJvdy5yZW1vdmVDbGFzcyhcInNsaWNrLWRpc2FibGVkIHNsaWNrLWFycm93IHNsaWNrLWhpZGRlblwiKS5yZW1vdmVBdHRyKFwiYXJpYS1oaWRkZW4gYXJpYS1kaXNhYmxlZCB0YWJpbmRleFwiKS5jc3MoXCJkaXNwbGF5XCIsXCJcIiksYy5odG1sRXhwci50ZXN0KGMub3B0aW9ucy5wcmV2QXJyb3cpJiZjLiRwcmV2QXJyb3cucmVtb3ZlKCkpLGMuJG5leHRBcnJvdyYmYy4kbmV4dEFycm93Lmxlbmd0aCYmKGMuJG5leHRBcnJvdy5yZW1vdmVDbGFzcyhcInNsaWNrLWRpc2FibGVkIHNsaWNrLWFycm93IHNsaWNrLWhpZGRlblwiKS5yZW1vdmVBdHRyKFwiYXJpYS1oaWRkZW4gYXJpYS1kaXNhYmxlZCB0YWJpbmRleFwiKS5jc3MoXCJkaXNwbGF5XCIsXCJcIiksYy5odG1sRXhwci50ZXN0KGMub3B0aW9ucy5uZXh0QXJyb3cpJiZjLiRuZXh0QXJyb3cucmVtb3ZlKCkpLGMuJHNsaWRlcyYmKGMuJHNsaWRlcy5yZW1vdmVDbGFzcyhcInNsaWNrLXNsaWRlIHNsaWNrLWFjdGl2ZSBzbGljay1jZW50ZXIgc2xpY2stdmlzaWJsZSBzbGljay1jdXJyZW50XCIpLnJlbW92ZUF0dHIoXCJhcmlhLWhpZGRlblwiKS5yZW1vdmVBdHRyKFwiZGF0YS1zbGljay1pbmRleFwiKS5lYWNoKGZ1bmN0aW9uKCl7YSh0aGlzKS5hdHRyKFwic3R5bGVcIixhKHRoaXMpLmRhdGEoXCJvcmlnaW5hbFN0eWxpbmdcIikpfSksYy4kc2xpZGVUcmFjay5jaGlsZHJlbih0aGlzLm9wdGlvbnMuc2xpZGUpLmRldGFjaCgpLGMuJHNsaWRlVHJhY2suZGV0YWNoKCksYy4kbGlzdC5kZXRhY2goKSxjLiRzbGlkZXIuYXBwZW5kKGMuJHNsaWRlcykpLGMuY2xlYW5VcFJvd3MoKSxjLiRzbGlkZXIucmVtb3ZlQ2xhc3MoXCJzbGljay1zbGlkZXJcIiksYy4kc2xpZGVyLnJlbW92ZUNsYXNzKFwic2xpY2staW5pdGlhbGl6ZWRcIiksYy51bnNsaWNrZWQ9ITAsYnx8Yy4kc2xpZGVyLnRyaWdnZXIoXCJkZXN0cm95XCIsW2NdKX0sYi5wcm90b3R5cGUuZGlzYWJsZVRyYW5zaXRpb249ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcyxjPXt9O2NbYi50cmFuc2l0aW9uVHlwZV09XCJcIixiLm9wdGlvbnMuZmFkZT09PSExP2IuJHNsaWRlVHJhY2suY3NzKGMpOmIuJHNsaWRlcy5lcShhKS5jc3MoYyl9LGIucHJvdG90eXBlLmZhZGVTbGlkZT1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXM7Yy5jc3NUcmFuc2l0aW9ucz09PSExPyhjLiRzbGlkZXMuZXEoYSkuY3NzKHt6SW5kZXg6Yy5vcHRpb25zLnpJbmRleH0pLGMuJHNsaWRlcy5lcShhKS5hbmltYXRlKHtvcGFjaXR5OjF9LGMub3B0aW9ucy5zcGVlZCxjLm9wdGlvbnMuZWFzaW5nLGIpKTooYy5hcHBseVRyYW5zaXRpb24oYSksYy4kc2xpZGVzLmVxKGEpLmNzcyh7b3BhY2l0eToxLHpJbmRleDpjLm9wdGlvbnMuekluZGV4f
6780SksYiYmc2V0VGltZW91dChmdW5jdGlvbigpe2MuZGlzYWJsZVRyYW5zaXRpb24oYSksYi5jYWxsKCl9LGMub3B0aW9ucy5zcGVlZCkpfSxiLnByb3RvdHlwZS5mYWRlU2xpZGVPdXQ9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcztiLmNzc1RyYW5zaXRpb25zPT09ITE/Yi4kc2xpZGVzLmVxKGEpLmFuaW1hdGUoe29wYWNpdHk6MCx6SW5kZXg6Yi5vcHRpb25zLnpJbmRleC0yfSxiLm9wdGlvbnMuc3BlZWQsYi5vcHRpb25zLmVhc2luZyk6KGIuYXBwbHlUcmFuc2l0aW9uKGEpLGIuJHNsaWRlcy5lcShhKS5jc3Moe29wYWNpdHk6MCx6SW5kZXg6Yi5vcHRpb25zLnpJbmRleC0yfSkpfSxiLnByb3RvdHlwZS5maWx0ZXJTbGlkZXM9Yi5wcm90b3R5cGUuc2xpY2tGaWx0ZXI9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcztudWxsIT09YSYmKGIuJHNsaWRlc0NhY2hlPWIuJHNsaWRlcyxiLnVubG9hZCgpLGIuJHNsaWRlVHJhY2suY2hpbGRyZW4odGhpcy5vcHRpb25zLnNsaWRlKS5kZXRhY2goKSxiLiRzbGlkZXNDYWNoZS5maWx0ZXIoYSkuYXBwZW5kVG8oYi4kc2xpZGVUcmFjayksYi5yZWluaXQoKSl9LGIucHJvdG90eXBlLmdldEN1cnJlbnQ9Yi5wcm90b3R5cGUuc2xpY2tDdXJyZW50U2xpZGU9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO3JldHVybiBhLmN1cnJlbnRTbGlkZX0sYi5wcm90b3R5cGUuZ2V0RG90Q291bnQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLGI9MCxjPTAsZD0wO2lmKGEub3B0aW9ucy5pbmZpbml0ZT09PSEwKWZvcig7YjxhLnNsaWRlQ291bnQ7KSsrZCxiPWMrYS5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsLGMrPWEub3B0aW9ucy5zbGlkZXNUb1Njcm9sbDw9YS5vcHRpb25zLnNsaWRlc1RvU2hvdz9hLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGw6YS5vcHRpb25zLnNsaWRlc1RvU2hvdztlbHNlIGlmKGEub3B0aW9ucy5jZW50ZXJNb2RlPT09ITApZD1hLnNsaWRlQ291bnQ7ZWxzZSBmb3IoO2I8YS5zbGlkZUNvdW50OykrK2QsYj1jK2Eub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCxjKz1hLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGw8PWEub3B0aW9ucy5zbGlkZXNUb1Nob3c/YS5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsOmEub3B0aW9ucy5zbGlkZXNUb1Nob3c7cmV0dXJuIGQtMX0sYi5wcm90b3R5cGUuZ2V0TGVmdD1mdW5jdGlvbihhKXt2YXIgYyxkLGYsYj10aGlzLGU9MDtyZXR1cm4gYi5zbGlkZU9mZnNldD0wLGQ9Yi4kc2xpZGVzLmZpcnN0KCkub3V0ZXJIZWlnaHQoITApLGIub3B0aW9ucy5pbmZpbml0ZT09PSEwPyhiLnNsaWRlQ291bnQ+Yi5vcHRpb25zLnNsaWRlc1RvU2hvdyYmKGIuc2xpZGVPZmZzZXQ9Yi5zbGlkZVdpZHRoKmIub3B0aW9ucy5zbGlkZXNUb1Nob3cqLTEsZT1kKmIub3B0aW9ucy5zbGlkZXNUb1Nob3cqLTEpLGIuc2xpZGVDb3VudCViLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGwhPT0wJiZhK2Iub3B0aW9ucy5zbGlkZXNUb1Njcm9sbD5iLnNsaWRlQ291bnQmJmIuc2xpZGVDb3VudD5iLm9wdGlvbnMuc2xpZGVzVG9TaG93JiYoYT5iLnNsaWRlQ291bnQ/KGIuc2xpZGVPZmZzZXQ9KGIub3B0aW9ucy5zbGlkZXNUb1Nob3ctKGEtYi5zbGlkZUNvdW50KSkqYi5zbGlkZVdpZHRoKi0xLGU9KGIub3B0aW9ucy5zbGlkZXNUb1Nob3ctKGEtYi5zbGlkZUNvdW50KSkqZCotMSk6KGIuc2xpZGVPZmZzZXQ9Yi5zbGlkZUNvdW50JWIub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCpiLnNsaWRlV2lkdGgqLTEsZT1iLnNsaWRlQ291bnQlYi5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsKmQqLTEpKSk6YStiLm9wdGlvbnMuc2xpZGVzVG9TaG93PmIuc2xpZGVDb3VudCYmKGIuc2xpZGVPZmZzZXQ9KGErYi5vcHRpb25zLnNsaWRlc1RvU2hvdy1iLnNsaWRlQ291bnQpKmIuc2xpZGVXaWR0aCxlPShhK2Iub3B0aW9ucy5zbGlkZXNUb1Nob3ctYi5zbGlkZUNvdW50KSpkKSxiLnNsaWRlQ291bnQ8PWIub3B0aW9ucy5zbGlkZXNUb1Nob3cmJihiLnNsaWRlT2Zmc2V0PTAsZT0wKSxiLm9wdGlvbnMuY2VudGVyTW9kZT09PSEwJiZiLm9wdGlvbnMuaW5maW5pdGU9PT0hMD9iLnNsaWRlT2Zmc2V0Kz1iLnNsaWRlV2lkdGgqTWF0aC5mbG9vcihiLm9wdGlvbnMuc2xpZGVzVG9TaG93LzIpLWIuc2xpZGVXaWR0aDpiLm9wdGlvbnMuY2VudGVyTW9kZT09PSEwJiYoYi5zbGlkZU9mZnNldD0wLGIuc2xpZGVPZmZzZXQrPWIuc2xpZGVXaWR0aCpNYXRoLmZsb29yKGIub3B0aW9ucy5zbGlkZXNUb1Nob3cvMikpLGM9Yi5vcHRpb25zLnZlcnRpY2FsPT09ITE/YSpiLnNsaWRlV2lkdGgqLTErYi5zbGlkZU9mZnNldDphKmQqLTErZSxiLm9wdGlvbnMudmFyaWFibGVXaWR0aD09PSEwJiYoZj1iLnNsaWRlQ291bnQ8PWIub3B0aW9ucy5zbGlkZXNUb1Nob3d8fGIub3B0aW9ucy5pbmZpbml0ZT09PSExP2IuJHNsaWRlVHJhY2suY2hpbGRyZW4oXCIuc2xpY2stc2xpZGVcIikuZXEoYSk6Yi4kc2xpZGVUcmFjay5jaGlsZHJlbihcIi5zbGljay1zbGlkZVwiKS5lcShhK2Iub3B0aW9ucy5zbGlkZXNUb1Nob3cpLGM9Yi5vcHRpb25zLnJ0bD09PSEwP2ZbMF0/LTEqKGIuJHNsaWRlVHJhY2sud2lkdGgoKS1mWzBdLm9mZnNldExlZnQtZi53aWR0aCgpKTowOmZbMF0/LTEqZlswXS5vZmZzZXRMZWZ0OjAsYi5vcHRpb25zLmNlbnRlck1vZGU9PT0hMCYmKGY9Yi5zbGlkZUNvdW50PD1iLm9wdGlvbnMuc2xpZGVzVG9TaG93fHxiLm9wdGlvbnMuaW5maW5pdGU9PT0hMT9iLiRzbGlkZVRyYWNrLmNoaWxkcmVuKFwiLnNsaWNrLXNsaWRlXCIpLmVxKGEpOmIuJHNsaWRlVHJhY2suY2hpbGRyZW4oXCIuc2xpY2stc2xpZGVcIikuZXEoYStiLm9wdGlvbnMuc2xpZGVzVG9TaG93KzEpLGM9Yi5vcHRpb25zLnJ0bD09PSEwP2ZbMF0/LTEqKGIuJHNsaWRlVHJhY2sud2lkdGgoKS1mWzBdLm9mZnNldExlZnQtZi53aWR0aCgpKTowOmZbMF0/LTEqZlswXS5vZmZzZXRMZWZ0OjAsYys9KGIuJGxpc3Qud2lkdGgoKS1mLm91dGVyV2lkdGgoKSkvMikpLGN9LGIucHJvdG90eXBlLmdldE9wdGlvbj1iLnByb3RvdHlwZS5zbGlja0dldE9wdGlvbj1mdW5jdGlvbihhKXt2YXIgYj10aGlzO3JldHVybiBiLm9wdGlvbnNbYV19LGIucHJvdG90eXBlLmdldE5hdmlnYWJsZUluZGV4ZXM9ZnVuY3Rpb24oKXt2YXIgZSxhPXRoaXMsYj0wLGM9MCxkPVtdO2ZvcihhLm9wdGlvbnMuaW5maW5pdGU9PT0hMT9lPWEuc2xpZGVDb3VudDooYj0tMSphLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGwsYz0tMSphLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGwsZT0yKmEuc2xpZGVDb3VudCk7ZT5iOylkLnB1c2goYiksYj1jK2Eub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCxjKz1hLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGw8PWEub3B0aW9ucy5zbGlkZXNUb1Nob3c/YS5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsOmEub3B0aW9ucy5zbGlkZXNUb1Nob3c7cmV0dXJuIGR9LGIucHJvdG90eXBlLmdldFNsaWNrPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LGIucHJvdG90eXBlLmdldFNsaWRlQ291bnQ9ZnVuY3Rpb24oKXt2YXIgYyxkLGUsYj10aGlzO3JldHVybiBlPWIub3B0aW9ucy5jZW50ZXJNb2RlPT09ITA/Yi5zbGlkZVdpZHRoKk1hdGguZmxvb3IoYi5vcHRpb25zLnNsaWRlc1RvU2hvdy8yKTowLGIub3B0aW9ucy5zd2lwZVRvU2xpZGU9PT0hMD8oYi4kc2xpZGVUcmFjay5maW5kKFwiLnNsaWNrLXNsaWRlXCIpLmVhY2goZnVuY3Rpb24oYyxmKXtyZXR1cm4gZi5vZmZzZXRMZWZ0LWUrYShmKS5vdXRlcldpZHRoKCkvMj4tMSpiLnN3aXBlTGVmdD8oZD1mLCExKTp2b2lkIDB9KSxjPU1hdGguYWJzKGEoZCkuYXR0cihcImRhdGEtc2xpY2staW5kZXhcIiktYi5jdXJyZW50U2xpZGUpfHwxKTpiLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGx9LGIucHJvdG90eXBlLmdvVG89Yi5wcm90b3R5cGUuc2xpY2tHb1RvPWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcztjLmNoYW5nZVNsaWRlKHtkYXRhOnttZXNzYWdlOlwiaW5kZXhcIixpbmRleDpwYXJzZUludChhKX19LGIpfSxiLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKGIpe3ZhciBjPXRoaXM7YShjLiRzbGlkZXIpLmhhc0NsYXNzKFwic2xpY2staW5pdGlhbGl6ZWRcIil8fChhKGMuJHNsaWRlcikuYWRkQ2xhc3MoXCJzbGljay1pbml0aWFsaXplZFwiKSxjLmJ1aWxkUm93cygpLGMuYnVpbGRPdXQoKSxjLnNldFByb3BzKCksYy5zdGFydExvYWQoKSxjLmxvYWRTbGlkZXIoKSxjLmluaXRpYWxpemVFdmVudHMoKSxjLnVwZGF0ZUFycm93cygpLGMudXBkYXRlRG90cygpKSxiJiZjLiRzbGlkZXIudHJpZ2dlcihcImluaXRcIixbY10pLGMub3B0aW9ucy5hY2Nlc3NpYmlsaXR5PT09ITAmJmMuaW5pdEFEQSgpfSxiLnByb3RvdHlwZS5pbml0QXJyb3dFdmVudHM9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO2Eub3B0aW9ucy5hcnJvd3M9PT0hMCYmYS5zbGlkZUNvdW50PmEub3B0aW9ucy5zbGlkZXNUb1Nob3cmJihhLiRwcmV2QXJyb3cub24oXCJjbGljay5zbGlja1wiLHttZXNzYWdlOlwicHJldmlvdXNcIn0sYS5jaGFuZ2VTbGlkZSksYS4
6780kbmV4dEFycm93Lm9uKFwiY2xpY2suc2xpY2tcIix7bWVzc2FnZTpcIm5leHRcIn0sYS5jaGFuZ2VTbGlkZSkpfSxiLnByb3RvdHlwZS5pbml0RG90RXZlbnRzPWZ1bmN0aW9uKCl7dmFyIGI9dGhpcztiLm9wdGlvbnMuZG90cz09PSEwJiZiLnNsaWRlQ291bnQ+Yi5vcHRpb25zLnNsaWRlc1RvU2hvdyYmYShcImxpXCIsYi4kZG90cykub24oXCJjbGljay5zbGlja1wiLHttZXNzYWdlOlwiaW5kZXhcIn0sYi5jaGFuZ2VTbGlkZSksYi5vcHRpb25zLmRvdHM9PT0hMCYmYi5vcHRpb25zLnBhdXNlT25Eb3RzSG92ZXI9PT0hMCYmYi5vcHRpb25zLmF1dG9wbGF5PT09ITAmJmEoXCJsaVwiLGIuJGRvdHMpLm9uKFwibW91c2VlbnRlci5zbGlja1wiLGEucHJveHkoYi5zZXRQYXVzZWQsYiwhMCkpLm9uKFwibW91c2VsZWF2ZS5zbGlja1wiLGEucHJveHkoYi5zZXRQYXVzZWQsYiwhMSkpfSxiLnByb3RvdHlwZS5pbml0aWFsaXplRXZlbnRzPWZ1bmN0aW9uKCl7dmFyIGI9dGhpcztiLmluaXRBcnJvd0V2ZW50cygpLGIuaW5pdERvdEV2ZW50cygpLGIuJGxpc3Qub24oXCJ0b3VjaHN0YXJ0LnNsaWNrIG1vdXNlZG93bi5zbGlja1wiLHthY3Rpb246XCJzdGFydFwifSxiLnN3aXBlSGFuZGxlciksYi4kbGlzdC5vbihcInRvdWNobW92ZS5zbGljayBtb3VzZW1vdmUuc2xpY2tcIix7YWN0aW9uOlwibW92ZVwifSxiLnN3aXBlSGFuZGxlciksYi4kbGlzdC5vbihcInRvdWNoZW5kLnNsaWNrIG1vdXNldXAuc2xpY2tcIix7YWN0aW9uOlwiZW5kXCJ9LGIuc3dpcGVIYW5kbGVyKSxiLiRsaXN0Lm9uKFwidG91Y2hjYW5jZWwuc2xpY2sgbW91c2VsZWF2ZS5zbGlja1wiLHthY3Rpb246XCJlbmRcIn0sYi5zd2lwZUhhbmRsZXIpLGIuJGxpc3Qub24oXCJjbGljay5zbGlja1wiLGIuY2xpY2tIYW5kbGVyKSxhKGRvY3VtZW50KS5vbihiLnZpc2liaWxpdHlDaGFuZ2UsYS5wcm94eShiLnZpc2liaWxpdHksYikpLGIuJGxpc3Qub24oXCJtb3VzZWVudGVyLnNsaWNrXCIsYS5wcm94eShiLnNldFBhdXNlZCxiLCEwKSksYi4kbGlzdC5vbihcIm1vdXNlbGVhdmUuc2xpY2tcIixhLnByb3h5KGIuc2V0UGF1c2VkLGIsITEpKSxiLm9wdGlvbnMuYWNjZXNzaWJpbGl0eT09PSEwJiZiLiRsaXN0Lm9uKFwia2V5ZG93bi5zbGlja1wiLGIua2V5SGFuZGxlciksYi5vcHRpb25zLmZvY3VzT25TZWxlY3Q9PT0hMCYmYShiLiRzbGlkZVRyYWNrKS5jaGlsZHJlbigpLm9uKFwiY2xpY2suc2xpY2tcIixiLnNlbGVjdEhhbmRsZXIpLGEod2luZG93KS5vbihcIm9yaWVudGF0aW9uY2hhbmdlLnNsaWNrLnNsaWNrLVwiK2IuaW5zdGFuY2VVaWQsYS5wcm94eShiLm9yaWVudGF0aW9uQ2hhbmdlLGIpKSxhKHdpbmRvdykub24oXCJyZXNpemUuc2xpY2suc2xpY2stXCIrYi5pbnN0YW5jZVVpZCxhLnByb3h5KGIucmVzaXplLGIpKSxhKFwiW2RyYWdnYWJsZSE9dHJ1ZV1cIixiLiRzbGlkZVRyYWNrKS5vbihcImRyYWdzdGFydFwiLGIucHJldmVudERlZmF1bHQpLGEod2luZG93KS5vbihcImxvYWQuc2xpY2suc2xpY2stXCIrYi5pbnN0YW5jZVVpZCxiLnNldFBvc2l0aW9uKSxhKGRvY3VtZW50KS5vbihcInJlYWR5LnNsaWNrLnNsaWNrLVwiK2IuaW5zdGFuY2VVaWQsYi5zZXRQb3NpdGlvbil9LGIucHJvdG90eXBlLmluaXRVST1mdW5jdGlvbigpe3ZhciBhPXRoaXM7YS5vcHRpb25zLmFycm93cz09PSEwJiZhLnNsaWRlQ291bnQ+YS5vcHRpb25zLnNsaWRlc1RvU2hvdyYmKGEuJHByZXZBcnJvdy5zaG93KCksYS4kbmV4dEFycm93LnNob3coKSksYS5vcHRpb25zLmRvdHM9PT0hMCYmYS5zbGlkZUNvdW50PmEub3B0aW9ucy5zbGlkZXNUb1Nob3cmJmEuJGRvdHMuc2hvdygpLGEub3B0aW9ucy5hdXRvcGxheT09PSEwJiZhLmF1dG9QbGF5KCl9LGIucHJvdG90eXBlLmtleUhhbmRsZXI9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpczthLnRhcmdldC50YWdOYW1lLm1hdGNoKFwiVEVYVEFSRUF8SU5QVVR8U0VMRUNUXCIpfHwoMzc9PT1hLmtleUNvZGUmJmIub3B0aW9ucy5hY2Nlc3NpYmlsaXR5PT09ITA/Yi5jaGFuZ2VTbGlkZSh7ZGF0YTp7bWVzc2FnZTpcInByZXZpb3VzXCJ9fSk6Mzk9PT1hLmtleUNvZGUmJmIub3B0aW9ucy5hY2Nlc3NpYmlsaXR5PT09ITAmJmIuY2hhbmdlU2xpZGUoe2R
6780hdGE6e21lc3NhZ2U6XCJuZXh0XCJ9fSkpfSxiLnByb3RvdHlwZS5sYXp5TG9hZD1mdW5jdGlvbigpe2Z1bmN0aW9uIGcoYil7YShcImltZ1tkYXRhLWxhenldXCIsYikuZWFjaChmdW5jdGlvbigpe3ZhciBiPWEodGhpcyksYz1hKHRoaXMpLmF0dHIoXCJkYXRhLWxhenlcIiksZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW1nXCIpO2Qub25sb2FkPWZ1bmN0aW9uKCl7Yi5hbmltYXRlKHtvcGFjaXR5OjB9LDEwMCxmdW5jdGlvbigpe2IuYXR0cihcInNyY1wiLGMpLmFuaW1hdGUoe29wYWNpdHk6MX0sMjAwLGZ1bmN0aW9uKCl7Yi5yZW1vdmVBdHRyKFwiZGF0YS1sYXp5XCIpLnJlbW92ZUNsYXNzKFwic2xpY2stbG9hZGluZ1wiKX0pfSl9LGQuc3JjPWN9KX12YXIgYyxkLGUsZixiPXRoaXM7Yi5vcHRpb25zLmNlbnRlck1vZGU9PT0hMD9iLm9wdGlvbnMuaW5maW5pdGU9PT0hMD8oZT1iLmN1cnJlbnRTbGlkZSsoYi5vcHRpb25zLnNsaWRlc1RvU2hvdy8yKzEpLGY9ZStiLm9wdGlvbnMuc2xpZGVzVG9TaG93KzIpOihlPU1hdGgubWF4KDAsYi5jdXJyZW50U2xpZGUtKGIub3B0aW9ucy5zbGlkZXNUb1Nob3cvMisxKSksZj0yKyhiLm9wdGlvbnMuc2xpZGVzVG9TaG93LzIrMSkrYi5jdXJyZW50U2xpZGUpOihlPWIub3B0aW9ucy5pbmZpbml0ZT9iLm9wdGlvbnMuc2xpZGVzVG9TaG93K2IuY3VycmVudFNsaWRlOmIuY3VycmVudFNsaWRlLGY9ZStiLm9wdGlvbnMuc2xpZGVzVG9TaG93LGIub3B0aW9ucy5mYWRlPT09ITAmJihlPjAmJmUtLSxmPD1iLnNsaWRlQ291bnQmJmYrKykpLGM9Yi4kc2xpZGVyLmZpbmQoXCIuc2xpY2stc2xpZGVcIikuc2xpY2UoZSxmKSxnKGMpLGIuc2xpZGVDb3VudDw9Yi5vcHRpb25zLnNsaWRlc1RvU2hvdz8oZD1iLiRzbGlkZXIuZmluZChcIi5zbGljay1zbGlkZVwiKSxnKGQpKTpiLmN1cnJlbnRTbGlkZT49Yi5zbGlkZUNvdW50LWIub3B0aW9ucy5zbGlkZXNUb1Nob3c/KGQ9Yi4kc2xpZGVyLmZpbmQoXCIuc2xpY2stY2xvbmVkXCIpLnNsaWNlKDAsYi5vcHRpb25zLnNsaWRlc1RvU2hvdyksZyhkKSk6MD09PWIuY3VycmVudFNsaWRlJiYoZD1iLiRzbGlkZXIuZmluZChcIi5zbGljay1jbG9uZWRcIikuc2xpY2UoLTEqYi5vcHRpb25zLnNsaWRlc1RvU2hvdyksZyhkKSl9LGIucHJvdG90eXBlLmxvYWRTbGlkZXI9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO2Euc2V0UG9zaXRpb24oKSxhLiRzbGlkZVRyYWNrLmNzcyh7b3BhY2l0eToxfSksYS4kc2xpZGVyLnJlbW92ZUNsYXNzKFwic2xpY2stbG9hZGluZ1wiKSxhLmluaXRVSSgpLFwicHJvZ3Jlc3NpdmVcIj09PWEub3B0aW9ucy5sYXp5TG9hZCYmYS5wcm9ncmVzc2l2ZUxhenlMb2FkKCl9LGIucHJvdG90eXBlLm5leHQ9Yi5wcm90b3R5cGUuc2xpY2tOZXh0PWZ1bmN0aW9uKCl7dmFyIGE9dGhpczthLmNoYW5nZVNsaWRlKHtkYXRhOnttZXNzYWdlOlwibmV4dFwifX0pfSxiLnByb3RvdHlwZS5vcmllbnRhdGlvbkNoYW5nZT1mdW5jdGlvbigpe3ZhciBhPXRoaXM7YS5jaGVja1Jlc3BvbnNpdmUoKSxhLnNldFBvc2l0aW9uKCl9LGIucHJvdG90eXBlLnBhdXNlPWIucHJvdG90eXBlLnNsaWNrUGF1c2U9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO2EuYXV0b1BsYXlDbGVhcigpLGEucGF1c2VkPSEwfSxiLnByb3RvdHlwZS5wbGF5PWIucHJvdG90eXBlLnNsaWNrUGxheT1mdW5jdGlvbigpe3ZhciBhPXRoaXM7YS5wYXVzZWQ9ITEsYS5hdXRvUGxheSgpfSxiLnByb3RvdHlwZS5wb3N0U2xpZGU9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcztiLiRzbGlkZXIudHJpZ2dlcihcImFmdGVyQ2hhbmdlXCIsW2IsYV0pLGIuYW5pbWF0aW5nPSExLGIuc2V0UG9zaXRpb24oKSxiLnN3aXBlTGVmdD1udWxsLGIub3B0aW9ucy5hdXRvcGxheT09PSEwJiZiLnBhdXNlZD09PSExJiZiLmF1dG9QbGF5KCksYi5vcHRpb25zLmFjY2Vzc2liaWxpdHk9PT0hMCYmYi5pbml0QURBKCl9LGIucHJvdG90eXBlLnByZXY9Yi5wcm90b3R5cGUuc2xpY2tQcmV2PWZ1bmN0aW9uKCl7dmFyIGE9dGhpczthLmNoYW5nZVNsaWRlKHtkYXRhOnttZXNzYWdlOlwicHJldmlvdXNcIn19KX0sYi5wcm90b3R5cGUucHJldmVudERlZmF1bHQ9ZnVuY3Rpb24oYSl7YS5wcmV2ZW50RGVmYXVsdCgpfSxiLnByb3RvdHlwZS5wcm9ncmVzc2l2ZUxhenlMb2FkPWZ1bmN0aW9uKCl7dmFyIGMsZCxiPXRoaXM7Yz1hKFwiaW1nW2RhdGEtbGF6eV1cIixiLiRzbGlkZXIpLmxlbmd0aCxjPjAmJihkPWEoXCJpbWdbZGF0YS1sYXp5XVwiLGIuJHNsaWRlcikuZmlyc3QoKSxkLmF0dHIoXCJzcmNcIixudWxsKSxkLmF0dHIoXCJzcmNcIixkLmF0dHIoXCJkYXRhLWxhenlcIikpLnJlbW92ZUNsYXNzKFwic2xpY2stbG9hZGluZ1wiKS5sb2FkKGZ1bmN0aW9uKCl7ZC5yZW1vdmVBdHRyKFwiZGF0YS1sYXp5XCIpLGIucHJvZ3Jlc3NpdmVMYXp5TG9hZCgpLGIub3B0aW9ucy5hZGFwdGl2ZUhlaWdodD09PSEwJiZiLnNldFBvc2l0aW9uKCl9KS5lcnJvcihmdW5jdGlvbigpe2QucmVtb3ZlQXR0cihcImRhdGEtbGF6eVwiKSxiLnByb2dyZXNzaXZlTGF6eUxvYWQoKX0pKX0sYi5wcm90b3R5cGUucmVmcmVzaD1mdW5jdGlvbihiKXt2YXIgZCxlLGM9dGhpcztlPWMuc2xpZGVDb3VudC1jLm9wdGlvbnMuc2xpZGVzVG9TaG93LGMub3B0aW9ucy5pbmZpbml0ZXx8KGMuc2xpZGVDb3VudDw9Yy5vcHRpb25zLnNsaWRlc1RvU2hvdz9jLmN1cnJlbnRTbGlkZT0wOmMuY3VycmVudFNsaWRlPmUmJihjLmN1cnJlbnRTbGlkZT1lKSksZD1jLmN1cnJlbnRTbGlkZSxjLmRlc3Ryb3koITApLGEuZXh0ZW5kKGMsYy5pbml0aWFscyx7Y3VycmVudFNsaWRlOmR9KSxjLmluaXQoKSxifHxjLmNoYW5nZVNsaWRlKHtkYXRhOnttZXNzYWdlOlwiaW5kZXhcIixpbmRleDpkfX0sITEpfSxiLnByb3RvdHlwZS5yZWdpc3RlckJyZWFrcG9pbnRzPWZ1bmN0aW9uKCl7dmFyIGMsZCxlLGI9dGhpcyxmPWIub3B0aW9ucy5yZXNwb25zaXZlfHxudWxsO2lmKFwiYXJyYXlcIj09PWEudHlwZShmKSYmZi5sZW5ndGgpe2IucmVzcG9uZFRvPWIub3B0aW9ucy5yZXNwb25kVG98fFwid2luZG93XCI7Zm9yKGMgaW4gZilpZihlPWIuYnJlYWtwb2ludHMubGVuZ3RoLTEsZD1mW2NdLmJyZWFrcG9pbnQsZi5oYXNPd25Qcm9wZXJ0eShjKSl7Zm9yKDtlPj0wOyliLmJyZWFrcG9pbnRzW2VdJiZiLmJyZWFrcG9pbnRzW2VdPT09ZCYmYi5icmVha3BvaW50cy5zcGxpY2UoZSwxKSxlLS07Yi5icmVha3BvaW50cy5wdXNoKGQpLGIuYnJlYWtwb2ludFNldHRpbmdzW2RdPWZbY10uc2V0dGluZ3N9Yi5icmVha3BvaW50cy5zb3J0KGZ1bmN0aW9uKGEsYyl7cmV0dXJuIGIub3B0aW9ucy5tb2JpbGVGaXJzdD9hLWM6Yy1hfSl9fSxiLnByb3RvdHlwZS5yZWluaXQ9ZnVuY3Rpb24oKXt2YXIgYj10aGlzO2IuJHNsaWRlcz1iLiRzbGlkZVRyYWNrLmNoaWxkcmVuKGIub3B0aW9ucy5zbGlkZSkuYWRkQ2xhc3MoXCJzbGljay1zbGlkZVwiKSxiLnNsaWRlQ291bnQ9Yi4kc2xpZGVzLmxlbmd0aCxiLmN1cnJlbnRTbGlkZT49Yi5zbGlkZUNvdW50JiYwIT09Yi5jdXJyZW50U2xpZGUmJihiLmN1cnJlbnRTbGlkZT1iLmN1cnJlbnRTbGlkZS1iLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGwpLGIuc2xpZGVDb3VudDw9Yi5vcHRpb25zLnNsaWRlc1RvU2hvdyYmKGIuY3VycmVudFNsaWRlPTApLGIucmVnaXN0ZXJCcmVha3BvaW50cygpLGIuc2V0UHJvcHMoKSxiLnNldHVwSW5maW5pdGUoKSxiLmJ1aWxkQXJyb3dzKCksYi51cGRhdGVBcnJvd3MoKSxiLmluaXRBcnJvd0V2ZW50cygpLGIuYnVpbGREb3RzKCksYi51cGRhdGVEb3RzKCksYi5pbml0RG90RXZlbnRzKCksYi5jaGVja1Jlc3BvbnNpdmUoITEsITApLGIub3B0aW9ucy5mb2N1c09uU2VsZWN0PT09ITAmJmEoYi4kc2xpZGVUcmFjaykuY2hpbGRyZW4oKS5vbihcImNsaWNrLnNsaWNrXCIsYi5zZWxlY3RIYW5kbGVyKSxiLnNldFNsaWRlQ2xhc3NlcygwKSxiLnNldFBvc2l0aW9uKCksYi4kc2xpZGVyLnRyaWdnZXIoXCJyZUluaXRcIixbYl0pLGIub3B0aW9ucy5hdXRvcGxheT09PSEwJiZiLmZvY3VzSGFuZGxlcigpfSxiLnByb3RvdHlwZS5yZXNpemU9ZnVuY3Rpb24oKXt2YXIgYj10aGlzO2Eod2luZG93KS53aWR0aCgpIT09Yi53aW5kb3dXaWR0aCYmKGNsZWFyVGltZW91dChiLndpbmRvd0RlbGF5KSxiLndpbmRvd0RlbGF5PXdpbmRvdy5zZXRUaW
67801lb3V0KGZ1bmN0aW9uKCl7Yi53aW5kb3dXaWR0aD1hKHdpbmRvdykud2lkdGgoKSxiLmNoZWNrUmVzcG9uc2l2ZSgpLGIudW5zbGlja2VkfHxiLnNldFBvc2l0aW9uKCl9LDUwKSl9LGIucHJvdG90eXBlLnJlbW92ZVNsaWRlPWIucHJvdG90eXBlLnNsaWNrUmVtb3ZlPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzO3JldHVyblwiYm9vbGVhblwiPT10eXBlb2YgYT8oYj1hLGE9Yj09PSEwPzA6ZC5zbGlkZUNvdW50LTEpOmE9Yj09PSEwPy0tYTphLGQuc2xpZGVDb3VudDwxfHwwPmF8fGE+ZC5zbGlkZUNvdW50LTE/ITE6KGQudW5sb2FkKCksYz09PSEwP2QuJHNsaWRlVHJhY2suY2hpbGRyZW4oKS5yZW1vdmUoKTpkLiRzbGlkZVRyYWNrLmNoaWxkcmVuKHRoaXMub3B0aW9ucy5zbGlkZSkuZXEoYSkucmVtb3ZlKCksZC4kc2xpZGVzPWQuJHNsaWRlVHJhY2suY2hpbGRyZW4odGhpcy5vcHRpb25zLnNsaWRlKSxkLiRzbGlkZVRyYWNrLmNoaWxkcmVuKHRoaXMub3B0aW9ucy5zbGlkZSkuZGV0YWNoKCksZC4kc2xpZGVUcmFjay5hcHBlbmQoZC4kc2xpZGVzKSxkLiRzbGlkZXNDYWNoZT1kLiRzbGlkZXMsdm9pZCBkLnJlaW5pdCgpKX0sYi5wcm90b3R5cGUuc2V0Q1NTPWZ1bmN0aW9uKGEpe3ZhciBkLGUsYj10aGlzLGM9e307Yi5vcHRpb25zLnJ0bD09PSEwJiYoYT0tYSksZD1cImxlZnRcIj09Yi5wb3NpdGlvblByb3A/TWF0aC5jZWlsKGEpK1wicHhcIjpcIjBweFwiLGU9XCJ0b3BcIj09Yi5wb3NpdGlvblByb3A/TWF0aC5jZWlsKGEpK1wicHhcIjpcIjBweFwiLGNbYi5wb3NpdGlvblByb3BdPWEsYi50cmFuc2Zvcm1zRW5hYmxlZD09PSExP2IuJHNsaWRlVHJhY2suY3NzKGMpOihjPXt9LGIuY3NzVHJhbnNpdGlvbnM9PT0hMT8oY1tiLmFuaW1UeXBlXT1cInRyYW5zbGF0ZShcIitkK1wiLCBcIitlK1wiKVwiLGIuJHNsaWRlVHJhY2suY3NzKGMpKTooY1tiLmFuaW1UeXBlXT1cInRyYW5zbGF0ZTNkKFwiK2QrXCIsIFwiK2UrXCIsIDBweClcIixiLiRzbGlkZVRyYWNrLmNzcyhjKSkpfSxiLnByb3RvdHlwZS5zZXREaW1lbnNpb25zPWZ1bmN0aW9uKCl7dmFyIGE9dGhpczthLm9wdGlvbnMudmVydGljYWw9PT0hMT9hLm9wdGlvbnMuY2VudGVyTW9kZT09PSEwJiZhLiRsaXN0LmNzcyh7cGFkZGluZzpcIjBweCBcIithLm9wdGlvbnMuY2VudGVyUGFkZGluZ30pOihhLiRsaXN0LmhlaWdodChhLiRzbGlkZXMuZmlyc3QoKS5vdXRlckhlaWdodCghMCkqYS5vcHRpb25zLnNsaWRlc1RvU2hvdyksYS5vcHRpb25zLmNlbnRlck1vZGU9PT0hMCYmYS4kbGlzdC5jc3Moe3BhZGRpbmc6YS5vcHRpb25zLmNlbnRlclBhZGRpbmcrXCIgMHB4XCJ9KSksYS5saXN0V2lkdGg9YS4kbGlzdC53aWR0aCgpLGEubGlzdEhlaWdodD1hLiRsaXN0LmhlaWdodCgpLGEub3B0aW9ucy52ZXJ0aWNhbD09PSExJiZhLm9wdGlvbnMudmFyaWFibGVXaWR0aD09PSExPyhhLnNsaWRlV2lkdGg9TWF0aC5jZWlsKGEubGlzdFdpZHRoL2Eub3B0aW9ucy5zbGlkZXNUb1Nob3cpLGEuJHNsaWRlVHJhY2sud2lkdGgoTWF0aC5jZWlsKGEuc2xpZGVXaWR0aCphLiRzbGlkZVRyYWNrLmNoaWxkcmVuKFwiLnNsaWNrLXNsaWRlXCIpLmxlbmd0aCkpKTphLm9wdGlvbnMudmFyaWFibGVXaWR0aD09PSEwP2EuJHNsaWRlVHJhY2sud2lkdGgoNWUzKmEuc2xpZGVDb3VudCk6KGEuc2xpZGVXaWR0aD1NYXRoLmNlaWwoYS5saXN0V2lkdGgpLGEuJHNsaWRlVHJhY2suaGVpZ2h0KE1hdGguY2VpbChhLiRzbGlkZXMuZmlyc3QoKS5vdXRlckhlaWdodCghMCkqYS4kc2xpZGVUcmFjay5jaGlsZHJlbihcIi5zbGljay1zbGlkZVwiKS5sZW5ndGgpKSk7dmFyIGI9YS4kc2xpZGVzLmZpcnN0KCkub3V0ZXJXaWR0aCghMCktYS4kc2xpZGVzLmZpcnN0KCkud2lkdGgoKTthLm9wdGlvbnMudmFyaWFibGVXaWR0aD09PSExJiZhLiRzbGlkZVRyYWNrLmNoaWxkcmVuKFwiLnNsaWNrLXNsaWRlXCIpLndpZHRoKGEuc2xpZGVXaWR0aC1iKX0sYi5wcm90b3R5cGUuc2V0RmFkZT1mdW5jdGlvbigpe3ZhciBjLGI9dGhpcztiLiRzbGlkZXMuZWFjaChmdW5jdGlvbihkLGUpe2M9Yi5zbGlkZVdpZHRoKmQqLTEsYi5vcHRpb25zLnJ0bD09PSEwP2EoZSkuY3NzKHtwb3NpdGlvbjpcInJlbGF0aXZlXCIscmlnaHQ6Yyx0b3A6MCx6SW5kZXg6Yi5vcHRpb25zLnpJbmRleC0yLG9wYWNpdHk6MH0pOmEoZSkuY3NzKHtwb3NpdGlvbjpcInJlbGF0aXZlXCIsbGVmdDpjLHRvcDowLHpJbmRleDpiLm9wdGlvbnMuekluZGV4LTIsb3BhY2l0eTowfSl9KSxiLiRzbGlkZXMuZXEoYi5jdXJyZW50U2xpZGUpLmNzcyh7ekluZGV4OmIub3B0aW9ucy56SW5kZXgtMSxvcGFjaXR5OjF9KX0sYi5wcm90b3R5cGUuc2V0SGVpZ2h0PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcztpZigxPT09YS5vcHRpb25zLnNsaWRlc1RvU2hvdyYmYS5vcHRpb25zLmFkYXB0aXZlSGVpZ2h0PT09ITAmJmEub3B0aW9ucy52ZXJ0aWNhbD09PSExKXt2YXIgYj1hLiRzbGlkZXMuZXEoYS5jdXJyZW50U2xpZGUpLm91dGVySGVpZ2h0KCEwKTthLiRsaXN0LmNzcyhcImhlaWdodFwiLGIpfX0sYi5wcm90b3R5cGUuc2V0T3B0aW9uPWIucHJvdG90eXBlLnNsaWNrU2V0T3B0aW9uPWZ1bmN0aW9uKGIsYyxkKXt2YXIgZixnLGU9dGhpcztpZihcInJlc3BvbnNpdmVcIj09PWImJlwiYXJyYXlcIj09PWEudHlwZShjKSlmb3IoZyBpbiBjKWlmKFwiYXJyYXlcIiE9PWEudHlwZShlLm9wdGlvbnMucmVzcG9uc2l2ZSkpZS5vcHRpb25zLnJlc3BvbnNpdmU9W2NbZ11dO2Vsc2V7Zm9yKGY9ZS5vcHRpb25zLnJlc3BvbnNpdmUubGVuZ3RoLTE7Zj49MDspZS5vcHRpb25zLnJlc3BvbnNpdmVbZl0uYnJlYWtwb2ludD09PWNbZ10uYnJlYWtwb2ludCYmZS5vcHRpb25zLnJlc3BvbnNpdmUuc3BsaWNlKGYsMSksZi0tO2Uub3B0aW9ucy5yZXNwb25zaXZlLnB1c2goY1tnXSl9ZWxzZSBlLm9wdGlvbnNbYl09YztkPT09ITAmJihlLnVubG9hZCgpLGUucmVpbml0KCkpfSxiLnByb3RvdHlwZS5zZXRQb3NpdGlvbj1mdW5jdGlvbigpe3ZhciBhPXRoaXM7YS5zZXREaW1lbnNpb25zKCksYS5zZXRIZWlnaHQoKSxhLm9wdGlvbnMuZmFkZT09PSExP2Euc2V0Q1NTKGEuZ2V0TGVmdChhLmN1cnJlbnRTbGlkZSkpOmEuc2V0RmFkZSgpLGEuJHNsaWRlci50cmlnZ2VyKFwic2V0UG9zaXRpb25cIixbYV0pfSxiLnByb3RvdHlwZS5zZXRQcm9wcz1mdW5jdGlvbigpe3ZhciBhPXRoaXMsYj1kb2N1bWVudC5ib2R5LnN0eWxlO2EucG9zaXRpb25Qcm9wPWEub3B0aW9ucy52ZXJ0aWNhbD09PSEwP1widG9wXCI6XCJsZWZ0XCIsXCJ0b3BcIj09PWEucG9zaXRpb25Qcm9wP2EuJHNsaWRlci5hZGRDbGFzcyhcInNsaWNrLXZlcnRpY2FsXCIpOmEuJHNsaWRlci5yZW1vdmVDbGFzcyhcInNsaWNrLXZlcnRpY2FsXCIpLCh2b2lkIDAhPT1iLldlYmtpdFRyYW5zaXRpb258fHZvaWQgMCE9PWIuTW96VHJhbnNpdGlvbnx8dm9pZCAwIT09Yi5tc1RyYW5zaXRpb24pJiZhLm9wdGlvbnMudXNlQ1NTPT09ITAmJihhLmNzc1RyYW5zaXRpb25zPSEwKSxhLm9wdGlvbnMuZmFkZSYmKFwibnVtYmVyXCI9PXR5cGVvZiBhLm9wdGlvbnMuekluZGV4P2Eub3B0aW9ucy56SW5kZXg8MyYmKGEub3B0aW9ucy56SW5kZXg9Myk6YS5vcHRpb25zLnpJbmRleD1hLmRlZmF1bHRzLnpJbmRleCksdm9pZCAwIT09Yi5PVHJhbnNmb3JtJiYoYS5hbmltVHlwZT1cIk9UcmFuc2Zvcm1cIixhLnRyYW5zZm9ybVR5cGU9XCItby10cmFuc2Zvcm1cIixhLnRyYW5zaXRpb25UeXBlPVwiT1RyYW5zaXRpb25cIix2b2lkIDA9PT1iLnBlcnNwZWN0aXZlUHJvcGVydHkmJnZvaWQgMD09PWIud2Via2l0UGVyc3BlY3RpdmUmJihhLmFuaW1UeXBlPSExKSksdm9pZCAwIT09Yi5Nb3pUcmFuc2Zvcm0mJihhLmFuaW1UeXBlPVwiTW96VHJhbnNmb3JtXCIsYS50cmFuc2Zvcm1UeXBlPVwiLW1vei10cmFuc2Zvcm1cIixhLnRyYW5zaXRpb25UeXBlPVwiTW96VHJhbnNpdGlvblwiLHZvaWQgMD09PWIucGVyc3BlY3RpdmVQcm9wZXJ0eSYmdm9pZCAwPT09Yi5Nb3pQZXJzcGVjdGl2ZSYmKGEuYW5pbVR5cGU9ITEpKSx2b2lkIDAhPT1iLndlYmtpdFRyYW5zZm9ybSYmKGEuYW5pbVR5cGU9XCJ3ZWJraXRUcmFuc2Zvcm1cIixhLnRyYW5zZm9ybVR5cGU9XCItd2Via2l0LXRyYW5zZm9ybVwiLGEudHJhbnNpdGlvblR5cGU9XCJ3ZWJraXRUcmFuc2l0aW9uXCIsdm9pZCAwPT09Yi5wZXJzcGVjdGl2ZVByb3BlcnR5JiZ2b2lkIDA9PT1iLndlYmtpdFBlcnNwZWN0aXZlJiYoYS5hbmltVHlwZT0hMSkpLHZvaWQgMCE9PWIubXNUcmFuc2Zvcm0mJihhLmFuaW1UeXBlPVwibXNUcmFuc2Zvcm1cIixhLnRyYW5zZm9ybVR5cGU9XCItbXMtdHJhbnNmb3JtXCIsYS50cmFuc2l0aW9uVHlwZT1cIm1zVHJhbnNpdGlvblwiLHZvaWQgMD09PWIubXNUcmFuc2Zvcm0mJihhLmFuaW1UeXBlPSExKSksdm9pZCAwIT09Yi50cmFuc2Zvcm0mJmEuYW5pbVR5cGUhPT0hMSYmKGEuYW5pbVR5cGU9XCJ0cmFuc2Zvcm1cIixhLnRyYW5zZm9ybVR5cGU9XCJ0cmFuc2Zvcm1cIixhLnRyYW5zaXRpb25UeXBlPVwidHJhbnNpdGlvblwiKSxhLnRyYW5zZm9ybXNFbmFibGVkPWEub3B0aW9ucy51c2VUcmFuc2Zvcm0mJm51bGwhPT1hLmFuaW1UeXBlJiZhLmFuaW1UeXBlIT09ITF9LGIucHJvdG90eXBlLnNldFNsaWRlQ2xhc3Nlcz1mdW5jdGlvbihhKXt2YXIgYyxkLGUsZixiPXRoaXM7ZD1iLiRzbGlkZXIuZmluZChcIi5zbGljay1zbGlkZVwiKS5yZW1vdmVDbGFzcyhcInNsaWNrLWFjdGl2ZSBzbGljay1jZW50ZXIgc2xpY2stY3VycmVudFwiKS5hdHRyKFwiYXJpYS1oaWRkZW5cIixcInRydWVcIiksYi4kc2xpZGVzLmVxKGEpLmFkZENsYXNzKFwic2xpY2stY3VycmVudFwiKSxiLm9wdGlvbnMuY2VudGVyTW9kZT09PSEwPyhjPU1hdGguZmxvb3IoYi5vcHRpb25zLnNsaWRlc1RvU2hvdy8yKSxiLm9wdGlvbnMuaW5maW5pdGU9PT0hMCYmKGE+PWMmJmE8PWIuc2xpZGVDb3VudC0xLWM/Yi4kc2xpZGVzLnNsaWNlKGEtYyxhK2MrMSkuYWRk
6780Q2xhc3MoXCJzbGljay1hY3RpdmVcIikuYXR0cihcImFyaWEtaGlkZGVuXCIsXCJmYWxzZVwiKTooZT1iLm9wdGlvbnMuc2xpZGVzVG9TaG93K2EsZC5zbGljZShlLWMrMSxlK2MrMikuYWRkQ2xhc3MoXCJzbGljay1hY3RpdmVcIikuYXR0cihcImFyaWEtaGlkZGVuXCIsXCJmYWxzZVwiKSksMD09PWE/ZC5lcShkLmxlbmd0aC0xLWIub3B0aW9ucy5zbGlkZXNUb1Nob3cpLmFkZENsYXNzKFwic2xpY2stY2VudGVyXCIpOmE9PT1iLnNsaWRlQ291bnQtMSYmZC5lcShiLm9wdGlvbnMuc2xpZGVzVG9TaG93KS5hZGRDbGFzcyhcInNsaWNrLWNlbnRlclwiKSksYi4kc2xpZGVzLmVxKGEpLmFkZENsYXNzKFwic2xpY2stY2VudGVyXCIpKTphPj0wJiZhPD1iLnNsaWRlQ291bnQtYi5vcHRpb25zLnNsaWRlc1RvU2hvdz9iLiRzbGlkZXMuc2xpY2UoYSxhK2Iub3B0aW9ucy5zbGlkZXNUb1Nob3cpLmFkZENsYXNzKFwic2xpY2stYWN0aXZlXCIpLmF0dHIoXCJhcmlhLWhpZGRlblwiLFwiZmFsc2VcIik6ZC5sZW5ndGg8PWIub3B0aW9ucy5zbGlkZXNUb1Nob3c/ZC5hZGRDbGFzcyhcInNsaWNrLWFjdGl2ZVwiKS5hdHRyKFwiYXJpYS1oaWRkZW5cIixcImZhbHNlXCIpOihmPWIuc2xpZGVDb3VudCViLm9wdGlvbnMuc2xpZGVzVG9TaG93LGU9Yi5vcHRpb25zLmluZmluaXRlPT09ITA/Yi5vcHRpb25zLnNsaWRlc1RvU2hvdythOmEsYi5vcHRpb25zLnNsaWRlc1RvU2hvdz09Yi5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsJiZiLnNsaWRlQ291bnQtYTxiLm9wdGlvbnMuc2xpZGVzVG9TaG93P2Quc2xpY2UoZS0oYi5vcHRpb25zLnNsaWRlc1RvU2hvdy1mKSxlK2YpLmFkZENsYXNzKFwic2xpY2stYWN0aXZlXCIpLmF0dHIoXCJhcmlhLWhpZGRlblwiLFwiZmFsc2VcIik6ZC5zbGljZShlLGUrYi5vcHRpb25zLnNsaWRlc1RvU2hvdykuYWRkQ2xhc3MoXCJzbGljay1hY3RpdmVcIikuYXR0cihcImFyaWEtaGlkZGVuXCIsXCJmYWxzZVwiKSksXCJvbmRlbWFuZFwiPT09Yi5vcHRpb25zLmxhenlMb2FkJiZiLmxhenlMb2FkKCl9LGIucHJvdG90eXBlLnNldHVwSW5maW5pdGU9ZnVuY3Rpb24oKXt2YXIgYyxkLGUsYj10aGlzO2lmKGIub3B0aW9ucy5mYWRlPT09ITAmJihiLm9wdGlvbnMuY2VudGVyTW9kZT0hMSksYi5vcHRpb25zLmluZmluaXRlPT09ITAmJmIub3B0aW9ucy5mYWRlPT09ITEmJihkPW51bGwsYi5zbGlkZUNvdW50PmIub3B0aW9ucy5zbGlkZXNUb1Nob3cpKXtmb3IoZT1iLm9wdGlvbnMuY2VudGVyTW9kZT09PSEwP2Iub3B0aW9ucy5zbGlkZXNUb1Nob3crMTpiLm9wdGlvbnMuc2xpZGVzVG9TaG93LGM9Yi5zbGlkZUNvdW50O2M+Yi5zbGlkZUNvdW50LWU7Yy09MSlkPWMtMSxhKGIuJHNsaWRlc1tkXSkuY2xvbmUoITApLmF0dHIoXCJpZFwiLFwiXCIpLmF0dHIoXCJkYXRhLXNsaWNrLWluZGV4XCIsZC1iLnNsaWRlQ291bnQpLnByZXBlbmRUbyhiLiRzbGlkZVRyYWNrKS5hZGRDbGFzcyhcInNsaWNrLWNsb25lZFwiKTtmb3IoYz0wO2U+YztjKz0xKWQ9YyxhKGIuJHNsaWRlc1tkXSkuY2xvbmUoITApLmF0dHIoXCJpZFwiLFwiXCIpLmF0dHIoXCJkYXRhLXNsaWNrLWluZGV4XCIsZCtiLnNsaWRlQ291bnQpLmFwcGVuZFRvKGIuJHNsaWRlVHJhY2spLmFkZENsYXNzKFwic2xpY2stY2xvbmVkXCIpO2IuJHNsaWRlVHJhY2suZmluZChcIi5zbGljay1jbG9uZWRcIikuZmluZChcIltpZF1cIikuZWFjaChmdW5jdGlvbigpe2EodGhpcykuYXR0cihcImlkXCIsXCJcIil9KX19LGIucHJvdG90eXBlLnNldFBhdXNlZD1mdW5jdGlvbihhKXt2YXIgYj10aGlzO2Iub3B0aW9ucy5hdXRvcGxheT09PSEwJiZiLm9wdGlvbnMucGF1c2VPbkhvdmVyPT09ITAmJihiLnBhdXNlZD1hLGE/Yi5hdXRvUGxheUNsZWFyKCk6Yi5hdXRvUGxheSgpKX0sYi5wcm90b3R5cGUuc2VsZWN0SGFuZGxlcj1mdW5jdGlvbihiKXt2YXIgYz10aGlzLGQ9YShiLnRhcmdldCkuaXMoXCIuc2xpY2stc2xpZGVcIik/YShiLnRhcmdldCk6YShiLnRhcmdldCkucGFyZW50cyhcIi5zbGljay1zbGlkZVwiKSxlPXBhcnNlSW50KGQuYXR0cihcImRhdGEtc2xpY2staW5kZXhcIikpO3JldHVybiBlfHwoZT0wKSxjLnNsaWRlQ291bnQ8PWMub3B0aW9ucy5zbGlkZXNUb1Nob3c/KGMuc2V0U2xpZGVDbGFzc2VzKGUpLHZvaWQgYy5hc05hdkZvcihlKSk6dm9pZCBjLnNsaWRlSGFuZGxlcihlKX0sYi5wcm90b3R5cGUuc2xpZGVIYW5kbGVyPWZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsZyxoPW51bGwsaT10aGlzO3JldHVybiBiPWJ8fCExLGkuYW5pbWF0aW5nPT09ITAmJmkub3B0aW9ucy53YWl0Rm9yQW5pbWF0ZT09PSEwfHxpLm9wdGlvbnMuZmFkZT09PSEwJiZpLmN1cnJlbnRTbGlkZT09PWF8fGkuc2xpZGVDb3VudDw9aS5vcHRpb25zLnNsaWRlc1RvU2hvdz92b2lkIDA6KGI9PT0hMSYmaS5hc05hdkZvcihhKSxkPWEsaD1pLmdldExlZnQoZCksZz1pLmdldExlZnQoaS5jdXJyZW50U2xpZGUpLGkuY3VycmVudExlZnQ9bnVsbD09PWkuc3dpcGVMZWZ0P2c6aS5zd2lwZUxlZnQsaS5vcHRpb25zLmluZmluaXRlPT09ITEmJmkub3B0aW9ucy5jZW50ZXJNb2RlPT09ITEmJigwPmF8fGE+aS5nZXREb3RDb3VudCgpKmkub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCk/dm9pZChpLm9wdGlvbnMuZmFkZT09PSExJiYoZD1pLmN1cnJlbnRTbGlkZSxjIT09ITA/aS5hbmltYXRlU2xpZGUoZyxmdW5jdGlvbigpe2kucG9zdFNsaWRlKGQpO1xufSk6aS5wb3N0U2xpZGUoZCkpKTppLm9wdGlvbnMuaW5maW5pdGU9PT0hMSYmaS5vcHRpb25zLmNlbnRlck1vZGU9PT0hMCYmKDA+YXx8YT5pLnNsaWRlQ291bnQtaS5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsKT92b2lkKGkub3B0aW9ucy5mYWRlPT09ITEmJihkPWkuY3VycmVudFNsaWRlLGMhPT0hMD9pLmFuaW1hdGVTbGlkZShnLGZ1bmN0aW9uKCl7aS5wb3N0U2xpZGUoZCl9KTppLnBvc3RTbGlkZShkKSkpOihpLm9wdGlvbnMuYXV0b3BsYXk9PT0hMCYmY2xlYXJJbnRlcnZhbChpLmF1dG9QbGF5VGltZXIpLGU9MD5kP2kuc2xpZGVDb3VudCVpLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGwhPT0wP2kuc2xpZGVDb3VudC1pLnNsaWRlQ291bnQlaS5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsOmkuc2xpZGVDb3VudCtkOmQ+PWkuc2xpZGVDb3VudD9pLnNsaWRlQ291bnQlaS5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsIT09MD8wOmQtaS5zbGlkZUNvdW50OmQsaS5hbmltYXRpbmc9ITAsaS4kc2xpZGVyLnRyaWdnZXIoXCJiZWZvcmVDaGFuZ2VcIixbaSxpLmN1cnJlbnRTbGlkZSxlXSksZj1pLmN1cnJlbnRTbGlkZSxpLmN1cnJlbnRTbGlkZT1lLGkuc2V0U2xpZGVDbGFzc2VzKGkuY3VycmVudFNsaWRlKSxpLnVwZGF0ZURvdHMoKSxpLnVwZGF0ZUFycm93cygpLGkub3B0aW9ucy5mYWRlPT09ITA/KGMhPT0hMD8oaS5mYWRlU2xpZGVPdXQoZiksaS5mYWRlU2xpZGUoZSxmdW5jdGlvbigpe2kucG9zdFNsaWRlKGUpfSkpOmkucG9zdFNsaWRlKGUpLHZvaWQgaS5hbmltYXRlSGVpZ2h0KCkpOnZvaWQoYyE9PSEwP2kuYW5pbWF0ZVNsaWRlKGgsZnVuY3Rpb24oKXtpLnBvc3RTbGlkZShlKX0pOmkucG9zdFNsaWRlKGUpKSkpfSxiLnByb3RvdHlwZS5zdGFydExvYWQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO2Eub3B0aW9ucy5hcnJvd3M9PT0hMCYmYS5zbGlkZUNvdW50PmEub3B0aW9ucy5zbGlkZXNUb1Nob3cmJihhLiRwcmV2QXJyb3cuaGl
6780kZSgpLGEuJG5leHRBcnJvdy5oaWRlKCkpLGEub3B0aW9ucy5kb3RzPT09ITAmJmEuc2xpZGVDb3VudD5hLm9wdGlvbnMuc2xpZGVzVG9TaG93JiZhLiRkb3RzLmhpZGUoKSxhLiRzbGlkZXIuYWRkQ2xhc3MoXCJzbGljay1sb2FkaW5nXCIpfSxiLnByb3RvdHlwZS5zd2lwZURpcmVjdGlvbj1mdW5jdGlvbigpe3ZhciBhLGIsYyxkLGU9dGhpcztyZXR1cm4gYT1lLnRvdWNoT2JqZWN0LnN0YXJ0WC1lLnRvdWNoT2JqZWN0LmN1clgsYj1lLnRvdWNoT2JqZWN0LnN0YXJ0WS1lLnRvdWNoT2JqZWN0LmN1clksYz1NYXRoLmF0YW4yKGIsYSksZD1NYXRoLnJvdW5kKDE4MCpjL01hdGguUEkpLDA+ZCYmKGQ9MzYwLU1hdGguYWJzKGQpKSw0NT49ZCYmZD49MD9lLm9wdGlvbnMucnRsPT09ITE/XCJsZWZ0XCI6XCJyaWdodFwiOjM2MD49ZCYmZD49MzE1P2Uub3B0aW9ucy5ydGw9PT0hMT9cImxlZnRcIjpcInJpZ2h0XCI6ZD49MTM1JiYyMjU+PWQ/ZS5vcHRpb25zLnJ0bD09PSExP1wicmlnaHRcIjpcImxlZnRcIjplLm9wdGlvbnMudmVydGljYWxTd2lwaW5nPT09ITA/ZD49MzUmJjEzNT49ZD9cImxlZnRcIjpcInJpZ2h0XCI6XCJ2ZXJ0aWNhbFwifSxiLnByb3RvdHlwZS5zd2lwZUVuZD1mdW5jdGlvbihhKXt2YXIgYyxiPXRoaXM7aWYoYi5kcmFnZ2luZz0hMSxiLnNob3VsZENsaWNrPWIudG91Y2hPYmplY3Quc3dpcGVMZW5ndGg+MTA/ITE6ITAsdm9pZCAwPT09Yi50b3VjaE9iamVjdC5jdXJYKXJldHVybiExO2lmKGIudG91Y2hPYmplY3QuZWRnZUhpdD09PSEwJiZiLiRzbGlkZXIudHJpZ2dlcihcImVkZ2VcIixbYixiLnN3aXBlRGlyZWN0aW9uKCldKSxiLnRvdWNoT2JqZWN0LnN3aXBlTGVuZ3RoPj1iLnRvdWNoT2JqZWN0Lm1pblN3aXBlKXN3aXRjaChiLnN3aXBlRGlyZWN0aW9uKCkpe2Nhc2VcImxlZnRcIjpjPWIub3B0aW9ucy5zd2lwZVRvU2xpZGU/Yi5jaGVja05hdmlnYWJsZShiLmN1cnJlbnRTbGlkZStiLmdldFNsaWRlQ291bnQoKSk6Yi5jdXJyZW50U2xpZGUrYi5nZXRTbGlkZUNvdW50KCksYi5zbGlkZUhhbmRsZXIoYyksYi5jdXJyZW50RGlyZWN0aW9uPTAsYi50b3VjaE9iamVjdD17fSxiLiRzbGlkZXIudHJpZ2dlcihcInN3aXBlXCIsW2IsXCJsZWZ0XCJdKTticmVhaztjYXNlXCJyaWdodFwiOmM9Yi5vcHRpb25zLnN3aXBlVG9TbGlkZT9iLmNoZWNrTmF2aWdhYmxlKGIuY3VycmVudFNsaWRlLWIuZ2V0U2xpZGVDb3VudCgpKTpiLmN1cnJlbnRTbGlkZS1iLmdldFNsaWRlQ291bnQoKSxiLnNsaWRlSGFuZGxlcihjKSxiLmN1cnJlbnREaXJlY3Rpb249MSxiLnRvdWNoT2JqZWN0PXt9LGIuJHNsaWRlci50cmlnZ2VyKFwic3dpcGVcIixbYixcInJpZ2h0XCJdKX1lbHNlIGIudG91Y2hPYmplY3Quc3RhcnRYIT09Yi50b3VjaE9iamVjdC5jdXJYJiYoYi5zbGlkZUhhbmRsZXIoYi5jdXJyZW50U2xpZGUpLGIudG91Y2hPYmplY3Q9e30pfSxiLnByb3RvdHlwZS5zd2lwZUhhbmRsZXI9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcztpZighKGIub3B0aW9ucy5zd2lwZT09PSExfHxcIm9udG91Y2hlbmRcImluIGRvY3VtZW50JiZiLm9wdGlvbnMuc3dpcGU9PT0hMXx8Yi5vcHRpb25zLmRyYWdnYWJsZT09PSExJiYtMSE9PWEudHlwZS5pbmRleE9mKFwibW91c2VcIikpKXN3aXRjaChiLnRvdWNoT2JqZWN0LmZpbmdlckNvdW50PWEub3JpZ2luYWxFdmVudCYmdm9pZCAwIT09YS5vcmlnaW5hbEV2ZW50LnRvdWNoZXM/YS5vcmlnaW5hbEV2ZW50LnRvdWNoZXMubGVuZ3RoOjEsYi50b3VjaE9iamVjdC5taW5Td2lwZT1iLmxpc3RXaWR0aC9iLm9wdGlvbnMudG91Y2hUaHJlc2hvbGQsYi5vcHRpb25zLnZlcnRpY2FsU3dpcGluZz09PSEwJiYoYi50b3VjaE9iamVjdC5taW5Td2lwZT1iLmxpc3RIZWlnaHQvYi5vcHRpb25zLnRvdWNoVGhyZXNob2xkKSxhLmRhdGEuYWN0aW9uKXtjYXNlXCJzdGFydFwiOmIuc3dpcGVTdGFydChhKTticmVhaztjYXNlXCJtb3ZlXCI6Yi5zd2lwZU1vdmUoYSk7YnJlYWs7Y2FzZVwiZW5kXCI6Yi5zd2lwZUVuZChhKX19LGIucHJvdG90eXBlLnN3aXBlTW92ZT1mdW5jdGlvbihhKXt2YXIgZCxlLGYsZyxoLGI9dGhpcztyZXR1cm4gaD12b2lkIDAhPT1hLm9yaWdpbmFsRXZlbnQ/YS5vcmlnaW5hbEV2ZW50LnRvdWNoZXM6bnVsbCwhYi5kcmFnZ2luZ3x8aCYmMSE9PWgubGVuZ3RoPyExOihkPWIuZ2V0TGVmdChiLmN1cnJlbnRTbGlkZSksYi50b3VjaE9iamVjdC5jdXJYPXZvaWQgMCE9PWg/aFswXS5wYWdlWDphLmNsaWVudFgsYi50b3VjaE9iamVjdC5jdXJZPXZvaWQgMCE9PWg/aFswXS5wYWdlWTphLmNsaWVudFksYi50b3VjaE9iamVjdC5zd2lwZUxlbmd0aD1NYXRoLnJvdW5kKE1hdGguc3FydChNYXRoLnBvdyhiLnRvdWNoT2JqZWN0LmN1clgtYi50b3VjaE9iamVjdC5zdGFydFgsMikpKSxiLm9wdGlvbnMudmVydGljYWxTd2lwaW5nPT09ITAmJihiLnRvdWNoT2JqZWN0LnN3aXBlTGVuZ3RoPU1hdGgucm91bmQoTWF0aC5zcXJ0KE1hdGgucG93KGIudG91Y2hPYmplY3QuY3VyWS1iLnRvdWNoT2JqZWN0LnN0YXJ0WSwyKSkpKSxlPWIuc3dpcGVEaXJlY3Rpb24oKSxcInZlcnRpY2FsXCIhPT1lPyh2b2lkIDAhPT1hLm9yaWdpbmFsRXZlbnQmJmIudG91Y2hPYmplY3Quc3dpcGVMZW5ndGg+NCYmYS5wcmV2ZW50RGVmYXVsdCgpLGc9KGIub3B0aW9ucy5ydGw9PT0hMT8xOi0xKSooYi50b3VjaE9iamVjdC5jdXJYPmIudG91Y2hPYmplY3Quc3RhcnRYPzE6LTEpLGIub3B0aW9ucy52ZXJ0aWNhbFN3aXBpbmc9PT0hMCYmKGc9Yi50b3VjaE9iamVjdC5jdXJZPmIudG91Y2hPYmplY3Quc3RhcnRZPzE6LTEpLGY9Yi50b3VjaE9iamVjdC5zd2lwZUxlbmd0aCxiLnRvdWNoT2JqZWN0LmVkZ2VIaXQ9ITEsYi5vcHRpb25zLmluZmluaXRlPT09ITEmJigwPT09Yi5jdXJyZW50U2xpZGUmJlwicmlnaHRcIj09PWV8fGIuY3VycmVudFNsaWRlPj1iLmdldERvdENvdW50KCkmJlwibGVmdFwiPT09ZSkmJihmPWIudG91Y2hPYmplY3Quc3dpcGVMZW5ndGgqYi5vcHRpb25zLmVkZ2VGcmljdGlvbixiLnRvdWNoT2JqZWN0LmVkZ2VIaXQ9ITApLGIub3B0aW9ucy52ZXJ0aWNhbD09PSExP2Iuc3dpcGVMZWZ0PWQrZipnOmIuc3dpcGVMZWZ0PWQrZiooYi4kbGlzdC5oZWlnaHQoKS9iLmxpc3RXaWR0aCkqZyxiLm9wdGlvbnMudmVydGljYWxTd2lwaW5nPT09ITAmJihiLnN3aXBlTGVmdD1kK2YqZyksYi5vcHRpb25zLmZhZGU9PT0hMHx8Yi5vcHRpb25zLnRvdWNoTW92ZT09PSExPyExOmIuYW5pbWF0aW5nPT09ITA/KGIuc3dpcGVMZWZ0PW51bGwsITEpOnZvaWQgYi5zZXRDU1MoYi5zd2lwZUxlZnQpKTp2b2lkIDApfSxiLnByb3RvdHlwZS5zd2lwZVN0YXJ0PWZ1bmN0aW9uKGEpe3ZhciBjLGI9dGhpcztyZXR1cm4gMSE9PWIudG91Y2hPYmplY3QuZmluZ2VyQ291bnR8fGIuc2xpZGVDb3VudDw9Yi5vcHRpb25zLnNsaWRlc1RvU2hvdz8oYi50b3VjaE9iamVjdD17fSwhMSk6KHZvaWQgMCE9PWEub3JpZ2luYWxFdmVudCYmdm9pZCAwIT09YS5vcmlnaW5hbEV2ZW50LnRvdWNoZXMmJihjPWEub3JpZ2luYWxFdmVudC50b3VjaGVzWzBdKSxiLnRvdWNoT2JqZWN0LnN0YXJ0WD1iLnRvdWNoT2JqZWN0LmN1clg9dm9pZCAwIT09Yz9jLnBhZ2VYOmEuY2xpZW50WCxiLnRvdWNoT2JqZWN0LnN0YXJ0WT1iLnRvdWNoT2JqZWN0LmN1clk9dm9pZCAwIT09Yz9jLnBhZ2VZOmEuY2xpZW50WSx2b2lkKGIuZHJhZ2dpbmc9ITApKX0sYi5wcm90b3R5cGUudW5maWx0ZXJTbGlkZXM9Yi5wcm90b3R5cGUuc2xpY2tVbmZpbHRlcj1mdW5jdGlvbigpe3ZhciBhPXRoaXM7bnVsbCE9PWEuJHNsaWRlc0NhY2hlJiYoYS51bmxvYWQoKSxhLiRzbGlkZVRyYWNrLmNoaWxkcmVuKHRoaXMub3B0aW9ucy5zbGlkZSkuZGV0YWNoKCksYS4kc2xpZGVzQ2FjaGUuYXBwZW5kVG8oYS4kc2xpZGVUcmFjayksYS5yZWluaXQoKSl9LGIucHJvdG90eXBlLnVubG9hZD1mdW5jdGlvbigpe3ZhciBiPXRoaXM7YShcIi5zbGljay1jbG9uZWRcIixiLiRzbGlkZXIpLnJlbW92ZSgpLGIuJGRvdHMmJmIuJGRvdHMucmVtb3ZlKCksYi4kcHJldkFycm93JiZiLmh0bWxFeHByLnRlc3QoYi5vcHRpb25zLnByZXZBcnJvdykmJmIuJHByZXZBcnJvdy5yZW1vdmUoKSxiLiRuZXh0QXJyb3cmJmIuaHRtbEV4cHIudGVzdChiLm9wdGlvbnMubmV4dEFycm93KSYmYi4kbmV4dEFycm93LnJlbW92ZSgpLGIuJHNsaWRlcy5yZW1vdmVDbGFzcyhcInNsaWNrLXNsaWRlIHNsaWNrLWFjdGl2ZSBzbGljay12aXNpYmxlIHNsaWNrLWN1cnJlbnRcIikuYXR0cihcImFyaWEtaGlkZGVuXCIsXCJ0cnVlXCIpLmNzcyhcIndpZHRoXCIsXCJcIil9LGIucHJvdG90eXBlLnVuc2xpY2s9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcztiLiRzbGlkZXIudHJpZ2dlcihcInVuc2xpY2tcIixbYixhXSksYi5kZXN0cm95KCl9LGIucHJvdG90eXBlLnVwZGF0ZUFycm93cz1mdW5jdGlvbigpe3ZhciBiLGE9dGhpcztiPU1hdGguZmxvb3IoYS5vcHRpb25zLnNsaWRlc1RvU2hvdy8yKSxhLm9wdGlvbnMuYXJyb3dzPT09ITAmJmEuc2xpZGVDb3VudD5hLm9wdGlvbnMuc2xpZGVzVG9TaG93JiYhYS5vcHRpb25zLmluZmluaXRlJiYoYS4kcHJldkFycm93LnJlbW92ZUNsYXNzKFwic2xpY2stZGlzYWJsZWRcIikuYXR0cihcImFyaWEtZGlzYWJsZWRcIixcImZhbHNlXCIpLGEuJG5leHRBcnJvdy5yZW1vdmVDbGFzcyhcInNsaWNrLWRpc2FibGVkXCIpLmF0dHIoXCJhcmlhLWRpc2FibGVkXCIsXCJmYWxzZVwiKSwwPT09YS5jdXJyZW50U2xpZGU/KGEuJHByZXZBcnJvdy5hZGRDbGFzcyhcInNsaWNrLWRpc2FibGVkXCIpLmF0dHIoXCJhcmlhLWRpc2FibGVkXCIsXCJ0cnVlXCIpLGEuJG5leHRBcnJvdy5yZW1vdmVDbGFzcyhcInNsaWNrLWRpc2FibGVkXCIpLmF0dHIoXCJhcmlhLWRpc2FibGVkXCIsXCJmYWxzZVwiKSk6YS5jdXJyZW50U2xpZGU+PWEuc2xpZGVDb3VudC1hLm9wdGlvbnMuc2xpZGVzVG9TaG93JiZhLm9wdGlvbnMuY2VudGVyTW9kZT09PSExPyhhLiRuZXh0QXJyb3cuYWRkQ2xhc3MoXCJzbGljay1kaXNhYmxlZFwiKS5hdHRyKFwiYXJpYS1kaXNhYmxlZFwiLFwidHJ1ZVwiKSxhLiRwcmV2QXJyb3cucmVtb3ZlQ2xhc3MoXCJzbGljay1kaXNhYmxlZFwiKS5hdHRyKFwiYXJpYS1kaXNhYmxlZFwiLFwiZmFsc2VcIikpOmEuY3VycmVudFNsaWRlPj1hLnNsaWRlQ291bnQtMSYmYS5vcHRpb25zLmNlbn
6780Rlck1vZGU9PT0hMCYmKGEuJG5leHRBcnJvdy5hZGRDbGFzcyhcInNsaWNrLWRpc2FibGVkXCIpLmF0dHIoXCJhcmlhLWRpc2FibGVkXCIsXCJ0cnVlXCIpLGEuJHByZXZBcnJvdy5yZW1vdmVDbGFzcyhcInNsaWNrLWRpc2FibGVkXCIpLmF0dHIoXCJhcmlhLWRpc2FibGVkXCIsXCJmYWxzZVwiKSkpfSxiLnByb3RvdHlwZS51cGRhdGVEb3RzPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcztudWxsIT09YS4kZG90cyYmKGEuJGRvdHMuZmluZChcImxpXCIpLnJlbW92ZUNsYXNzKFwic2xpY2stYWN0aXZlXCIpLmF0dHIoXCJhcmlhLWhpZGRlblwiLFwidHJ1ZVwiKSxhLiRkb3RzLmZpbmQoXCJsaVwiKS5lcShNYXRoLmZsb29yKGEuY3VycmVudFNsaWRlL2Eub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCkpLmFkZENsYXNzKFwic2xpY2stYWN0aXZlXCIpLmF0dHIoXCJhcmlhLWhpZGRlblwiLFwiZmFsc2VcIikpfSxiLnByb3RvdHlwZS52aXNpYmlsaXR5PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcztkb2N1bWVudFthLmhpZGRlbl0/KGEucGF1c2VkPSEwLGEuYXV0b1BsYXlDbGVhcigpKTphLm9wdGlvbnMuYXV0b3BsYXk9PT0hMCYmKGEucGF1c2VkPSExLGEuYXV0b1BsYXkoKSl9LGIucHJvdG90eXBlLmluaXRBREE9ZnVuY3Rpb24oKXt2YXIgYj10aGlzO2IuJHNsaWRlcy5hZGQoYi4kc2xpZGVUcmFjay5maW5kKFwiLnNsaWNrLWNsb25lZFwiKSkuYXR0cih7XCJhcmlhLWhpZGRlblwiOlwidHJ1ZVwiLHRhYmluZGV4OlwiLTFcIn0pLmZpbmQoXCJhLCBpbnB1dCwgYnV0dG9uLCBzZWxlY3RcIikuYXR0cih7dGFiaW5kZXg6XCItMVwifSksYi4kc2xpZGVUcmFjay5hdHRyKFwicm9sZVwiLFwibGlzdGJveFwiKSxiLiRzbGlkZXMubm90KGIuJHNsaWRlVHJhY2suZmluZChcIi5zbGljay1jbG9uZWRcIikpLmVhY2goZnVuY3Rpb24oYyl7YSh0aGlzKS5hdHRyKHtyb2xlOlwib3B0aW9uXCIsXCJhcmlhLWRlc2NyaWJlZGJ5XCI6XCJzbGljay1zbGlkZVwiK2IuaW5zdGFuY2VVaWQrY30pfSksbnVsbCE9PWIuJGRvdHMmJmIuJGRvdHMuYXR0cihcInJvbGVcIixcInRhYmxpc3RcIikuZmluZChcImxpXCIpLmVhY2goZnVuY3Rpb24oYyl7YSh0aGlzKS5hdHRyKHtyb2xlOlwicHJlc2VudGF0aW9uXCIsXCJhcmlhLXNlbGVjdGVkXCI6XCJmYWxzZVwiLFwiYXJpYS1jb250cm9sc1wiOlwibmF2aWdhdGlvblwiK2IuaW5zdGFuY2VVaWQrYyxpZDpcInNsaWNrLXNsaWRlXCIrYi5pbnN0YW5jZVVpZCtjfSl9KS5maXJzdCgpLmF0dHIoXCJhcmlhLXNlbGVjdGVkXCIsXCJ0cnVlXCIpLmVuZCgpLmZpbmQoXCJidXR0b25cIikuYXR0cihcInJvbGVcIixcImJ1dHRvblwiKS5lbmQoKS5jbG9zZXN0KFwiZGl2XCIpLmF0dHIoXCJyb2xlXCIsXCJ0b29sYmFyXCIpLGIuYWN0aXZhdGVBREEoKX0sYi5wcm90b3R5cGUuYWN0aXZhdGVBREE9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO2EuJHNsaWRlVHJhY2suZmluZChcIi5zbGljay1hY3RpdmVcIikuYXR0cih7XCJhcmlhLWhpZGRlblwiOlwiZmFsc2VcIn0pLmZpbmQoXCJhLCBpbnB1dCwgYnV0dG9uLCBzZWxlY3RcIikuYXR0cih7dGFiaW5kZXg6XCIwXCJ9KX0sYi5wcm90b3R5cGUuZm9jdXNIYW5kbGVyPWZ1bmN0aW9uKCl7dmFyIGI9dGhpcztiLiRzbGlkZXIub24oXCJmb2N1cy5zbGljayBibHVyLnNsaWNrXCIsXCIqXCIsZnVuY3Rpb24oYyl7Yy5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTt2YXIgZD1hKHRoaXMpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtiLmlzUGxheSYmKGQuaXMoXCI6Zm9jdXNcIik/KGIuYXV0b1BsYXlDbGVhcigpLGIucGF1c2VkPSEwKTooYi5wYXVzZWQ9ITEsYi5hdXRvUGxheSgpKSl9LDApfSl9LGEuZm4uc2xpY2s9ZnVuY3Rpb24oKXt2YXIgZixnLGE9dGhpcyxjPWFyZ3VtZW50c1swXSxkPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSxlPWEubGVuZ3RoO2ZvcihmPTA7ZT5mO2YrKylpZihcIm9iamVjdFwiPT10eXBlb2YgY3x8XCJ1bmRlZmluZWRcIj09dHlwZW9mIGM/YVtmXS5zbGljaz1uZXcgYihhW2ZdLGMpOmc9YVtmXS5zbGlja1tjXS5hcHBseShhW2ZdLnNsaWNrLGQpLFwidW5kZWZpbmVkXCIhPXR5cGVvZiBnKXJldHVybiBnO3JldHVybiBhfX0pOyIsIi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBmYW5jeUJveCB2My41Ljdcbi8vXG4vLyBMaWNlbnNlZCBHUEx2MyBmb3Igb3BlbiBzb3VyY2UgdXNlXG4vLyBvciBmYW5jeUJveCBDb21tZXJjaWFsIExpY2Vuc2UgZm9yIGNvbW1lcmNpYWwgdXNlXG4vL1xuLy8gaHR0cDovL2ZhbmN5YXBwcy5jb20vZmFuY3lib3gvXG4vLyBDb3B5cmlnaHQgMjAxOSBmYW5jeUFwcHNcbi8vXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuKGZ1bmN0aW9uICh3aW5kb3csIGRvY3VtZW50LCAkLCB1bmRlZmluZWQpIHtcblx0XCJ1c2Ugc3RyaWN0XCI7XG5cblx0d2luZG93LmNvbnNvbGUgPSB3aW5kb3cuY29uc29sZSB8fCB7XG5cdFx0aW5mbzogZnVuY3Rpb24gKHN0dWZmKSB7fVxuXHR9O1xuXG5cdC8vIElmIHRoZXJlJ3Mgbm8galF1ZXJ5LCBmYW5jeUJveCBjYW4ndCB3b3JrXG5cdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblx0aWYgKCEkKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Ly8gQ2hlY2sgaWYgZmFuY3lCb3ggaXMgYWxyZWFkeSBpbml0aWFsaXplZFxuXHQvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblx0aWYgKCQuZm4uZmFuY3lib3gpIHtcblx0XHRjb25zb2xlLmluZm8oXCJmYW5jeUJveCBhbHJlYWR5IGluaXRpYWxpemVkXCIpO1xuXG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Ly8gUHJpdmF0ZSBkZWZhdWx0IHNldHRpbmdzXG5cdC8vID09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdHZhciBkZWZhdWx0cyA9IHtcblx0XHQvLyBDbG9zZSBleGlzdGluZyBtb2RhbHNcblx0XHQvLyBTZXQgdGhpcyB0byBmYWxzZSBpZiB5b3UgZG8gbm90IG5lZWQgdG8gc3RhY2sgbXVsdGlwbGUgaW5zdGFuY2VzXG5cdFx0Y2xvc2VFeGlzdGluZzogZmFsc2UsXG5cblx0XHQvLyBFbmFibGUgaW5maW5pdGUgZ2FsbGVyeSBuYXZpZ2F0aW9uXG5cdFx0bG9vcDogZmFsc2UsXG5cblx0XHQvLyBIb3Jpem9udGFsIHNwYWNlIGJldHdlZW4gc2xpZGVzXG5cdFx0Z3V0dG
6780VyOiA1MCxcblxuXHRcdC8vIEVuYWJsZSBrZXlib2FyZCBuYXZpZ2F0aW9uXG5cdFx0a2V5Ym9hcmQ6IHRydWUsXG5cblx0XHQvLyBTaG91bGQgYWxsb3cgY2FwdGlvbiB0byBvdmVybGFwIHRoZSBjb250ZW50XG5cdFx0cHJldmVudENhcHRpb25PdmVybGFwOiB0cnVlLFxuXG5cdFx0Ly8gU2hvdWxkIGRpc3BsYXkgbmF2aWdhdGlvbiBhcnJvd3MgYXQgdGhlIHNjcmVlbiBlZGdlc1xuXHRcdGFycm93czogdHJ1ZSxcblxuXHRcdC8vIFNob3VsZCBkaXNwbGF5IGNvdW50ZXIgYXQgdGhlIHRvcCBsZWZ0IGNvcm5lclxuXHRcdGluZm9iYXI6IHRydWUsXG5cblx0XHQvLyBTaG91bGQgZGlzcGxheSBjbG9zZSBidXR0b24gKHVzaW5nIGBidG5UcGwuc21hbGxCdG5gIHRlbXBsYXRlKSBvdmVyIHRoZSBjb250ZW50XG5cdFx0Ly8gQ2FuIGJlIHRydWUsIGZhbHNlLCBcImF1dG9cIlxuXHRcdC8vIElmIFwiYXV0b1wiIC0gd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGVuYWJsZWQgZm9yIFwiaHRtbFwiLCBcImlubGluZVwiIG9yIFwiYWpheFwiIGl0ZW1zXG5cdFx0c21hbGxCdG46IFwiYXV0b1wiLFxuXG5cdFx0Ly8gU2hvdWxkIGRpc3BsYXkgdG9vbGJhciAoYnV0dG9ucyBhdCB0aGUgdG9wKVxuXHRcdC8vIENhbiBiZSB0cnVlLCBmYWxzZSwgXCJhdXRvXCJcblx0XHQvLyBJZiBcImF1dG9cIiAtIHdpbGwgYmUgYXV0b21hdGljYWxseSBoaWRkZW4gaWYgXCJzbWFsbEJ0blwiIGlzIGVuYWJsZWRcblx0XHR0b29sYmFyOiBcImF1dG9cIixcblxuXHRcdC8vIFdoYXQgYnV0dG9ucyBzaG91bGQgYXBwZWFyIGluIHRoZSB0b3AgcmlnaHQgY29ybmVyLlxuXHRcdC8vIEJ1dHRvbnMgd2lsbCBiZSBjcmVhdGVkIHVzaW5nIHRlbXBsYXRlcyBmcm9tIGBidG5UcGxgIG9wdGlvblxuXHRcdC8vIGFuZCB0aGV5IHdpbGwgYmUgcGxhY2VkIGludG8gdG9vbGJhciAoY2xhc3M9XCJmYW5jeWJveC10b29sYmFyXCJgIGVsZW1lbnQpXG5cdFx0YnV0dG9uczogW1xuXHRcdFx0XCJ6b29tXCIsXG5cdFx0XHQvL1wic2hhcmVcIixcblx0XHRcdFwic2xpZGVTaG93XCIsXG5cdFx0XHQvL1wiZnVsbFNjcmVlblwiLFxuXHRcdFx0Ly9cImRvd25sb2FkXCIsXG5cdFx0XHRcInRodW1ic1wiLFxuXHRcdFx0XCJjbG9zZVwiXG5cdFx0XSxcblxuXHRcdC8vIERldGVjdCBcImlkbGVcIiB0aW1lIGluIHNlY29uZHNcblx0XHRpZGxlVGltZTogMyxcblxuXHRcdC8vIERpc2FibGUgcmlnaHQtY2xpY2sgYW5kIHVzZSBzaW1wbGUgaW1hZ2UgcHJvdGVjdGlvbiBmb3IgaW1hZ2VzXG5cdFx0cHJvdGVjdDogZmFsc2UsXG5cblx0XHQvLyBTaG9ydGN1dCB0byBtYWtlIGNvbnRlbnQgXCJtb2RhbFwiIC0gZGlzYWJsZSBrZXlib2FyZCBuYXZpZ3Rpb24sIGhpZGUgYnV0dG9ucywgZXRjXG5cdFx0bW9kYWw6IGZhbHNlLFxuXG5cdFx0aW1hZ2U6IHtcblx0XHRcdC8vIFdhaXQgZm9yIGltYWdlcyB0byBsb2FkIGJlZm9yZSBkaXNwbGF5aW5nXG5cdFx0XHQvLyAgIHRydWUgIC0gd2FpdCBmb3IgaW1hZ2UgdG8gbG9hZCBhbmQgdGhlbiBkaXNwbGF5O1xuXHRcdFx0Ly8gICBmYWxzZSAtIGRpc3BsYXkgdGh1bWJuYWlsIGFuZCBsb2FkIHRoZSBmdWxsLXNpemVkIGltYWdlIG92ZXIgdG9wLFxuXHRcdFx0Ly8gICAgICAgICAgIHJlcXVpcmVzIHByZWRlZmluZWQgaW1hZ2UgZGltZW5zaW9ucyAoYGRhdGEtd2lkdGhgIGFuZCBgZGF0YS1oZWlnaHRgIGF0dHJpYnV0ZXMpXG5cdFx0XHRwcmVsb2FkOiBmYWxzZVxuXHRcdH0sXG5cblx0XHRhamF4OiB7XG5cdFx0XHQvLyBPYmplY3QgY29udGFpbmluZyBzZXR0aW5ncyBmb3IgYWpheCByZXF1ZXN0XG5cdFx0XHRzZXR0aW5nczoge1xuXHRcdFx0XHQvLyBUaGlzIGhlbHBzIHRvIGluZGljYXRlIHRoYXQgcmVxdWVzdCBjb21lcyBmcm9tIHRoZSBtb2RhbFxuXHRcdFx0XHQvLyBGZWVsIGZyZWUgdG8gY2hhbmdlIG5hbWluZ1xuXHRcdFx0XHRkYXRhOiB7XG5cdFx0XHRcdFx0ZmFuY3lib3g6IHRydWVcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHRpZnJhbWU6IHtcblx0XHRcdC8vIElmcmFtZSB0ZW1wbGF0ZVxuXHRcdFx0dHBsOiAnPGlmcmFtZSBpZD1cImZhbmN5Ym94LWZyYW1le3JuZH1cIiBuYW1lPVwiZmFuY3lib3gtZnJhbWV7cm5kfVwiIGNsYXNzPVwiZmFuY3lib3gtaWZyYW1lXCIgYWxsb3dmdWxsc2NyZWVuPVwiYWxsb3dmdWxsc2NyZWVuXCIgYWxsb3c9XCJhdXRvcGxheTsgZnVsbHNjcmVlblwiIHNyYz1cIlwiPjwvaWZyYW1lPicsXG5cblx0XHRcdC8vIFByZWxvYWQgaWZyYW1lIGJlZm9yZSBkaXNwbGF5aW5nIGl0XG5cdFx0XHQvLyBUaGlzIGFsbG93cyB0byBjYWxjdWxhdGUgaWZyYW1lIGNvbnRlbnQgd2lkdGggYW5kIGhlaWdodFxuXHRcdFx0Ly8gKG5vdGU6IER1ZSB0byBcIlNhbWUgT3JpZ2luIFBvbGljeVwiLCB5b3UgY2FuJ3QgZ2V0IGNyb3NzIGRvbWFpbiBkYXRhKS5cblx0XHRcdHByZWxvYWQ6IHRydWUsXG5cblx0XHRcdC8vIEN1c3RvbSBDU1Mgc3R5bGluZyBmb3IgaWZyYW1lIHdyYXBwaW5nIGVsZW1lbnRcblx0XHRcdC8vIFlvdSBjYW4gdXNlIHRoaXMgdG8gc2V0IGN1c3RvbSBpZnJhbWUgZGltZW5zaW9uc1xuXHRcdFx0Y3NzOiB7fSxcblxuXHRcdFx0Ly8gSWZyYW1lIHRhZyBhdHRyaWJ1dGVzXG5cdFx0XHRhdHRyOiB7XG5cdFx0XHRcdHNjcm9sbGluZzogXCJhdXRvXCJcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0Ly8gRm9yIEhUTUw1IHZpZGVvIG9ubHlcblx0XHR2aWRlbzoge1xuXHRcdFx0dHBsOiAnPHZpZGVvIGNsYXNzPVwiZmFuY3lib3gtdmlkZW9cIiBjb250cm9scyBjb250cm9sc0xpc3Q9XCJub2Rvd25sb2FkXCIgcG9zdGVyPVwie3twb3N0ZXJ9fVwiPicgK1xuXHRcdFx0XHQnPHNvdXJjZSBzcmM9XCJ7e3NyY319XCIgdHlwZT1cInt7Zm9ybWF0fX1cIiAvPicgK1xuXHRcdFx0XHQnU29ycnksIHlvdXIgYnJvd3NlciBkb2VzblxcJ3Qgc3VwcG9ydCBlbWJlZGRlZCB2aWRlb3MsIDxhIGhyZWY9XCJ7e3NyY319XCI+ZG93bmxvYWQ8L2E+IGFuZCB3YXRjaCB3aXRoIHlvdXIgZmF2b3JpdGUgdmlkZW8gcGxheWVyIScgK1xuXHRcdFx0XHRcIjwvdmlkZW8+XCIsXG5cdFx0XHRmb3JtYXQ6IFwiXCIsIC8vIGN1c3RvbSB2aWRlbyBmb3JtYXRcblx0XHRcdGF1dG9TdGFydDogdHJ1ZVxuXHRcdH0sXG5cblx0XHQvLyBEZWZhdWx0IGNvbnRlbnQgdHlwZSBpZiBjYW5ub3QgYmUgZGV0ZWN0ZWQgYXV0b21hdGljYWxseVxuXHRcdGRlZmF1bHRUeXBlOiBcImltYWdlXCIsXG5cblx0XHQvLyBPcGVuL2Nsb3NlIGFuaW1hdGlvbiB0eXBlXG5cdFx0Ly8gUG9zc2libGUgdmFsdWVzOlxuXHRcdC8vICAgZmFsc2UgICAgICAgICAgICAtIGRpc2FibGVcblx0XHQvLyAgIFwiem9vbVwiICAgICAgICAgICAtIHpvb20gaW1hZ2VzIGZyb20vdG8gdGh1bWJuYWlsXG5cdFx0Ly8gICBcImZhZGVcIlxuXHRcdC8vICAgXCJ6b29tLWluLW91dFwiXG5cdFx0Ly9cblx0XHRhbmltYXRpb25FZmZlY3Q6IFwiem9vbVwiLFxuXG5cdFx0Ly8gRHVyYXRpb24gaW4gbXMgZm9yIG9wZW4vY2xvc2UgYW5pbWF0aW9uXG5cdFx0YW5pbWF0aW9uRHVyYXRpb246IDM2NixcblxuXHRcdC8vIFNob3VsZCBpbWFnZSBjaGFuZ2Ugb3BhY2l0eSB3aGlsZSB6b29taW5nXG5cdFx0Ly8gSWYgb3BhY2l0eSBpcyBcImF1dG9cIiwgdGhlbiBvcGFjaXR5IHdpbGwgYmUgY2hhbmdlZCBpZiBpbWFnZSBhbmQgdGh1bWJuYWlsIGhhdmUgZGlmZmVyZW50IGFzcGVjdCByYXRpb3Ncblx0XHR6b29tT3BhY2l0eTogXCJhdXRvXCIsXG5cblx0XHQvLyBUcmFuc2l0aW9uIGVmZmVjdCBiZXR3ZWVuIHNsaWRlc1xuXHRcdC8vXG5cdFx0Ly8gUG9zc2libGUgdmFsdWVzOlxuXHRcdC8vICAgZmFsc2UgICAgICAgICAgICAtIGRpc2FibGVcblx0XHQvLyAgIFwiZmFkZSdcblx0XHQvLyAgIFwic2xpZGUnXG5cdFx0Ly8gICBcImNpcmN1bGFyJ1xuXHRcdC8vICAgXCJ0dWJlJ1xuXHRcdC8vICAgXCJ6b29tLWluLW91dCdcblx0XHQvLyAgIFwicm90YXRlJ1xuXHRcdC8vXG5cdFx0dHJhbnNpdGlvbkVmZmVjd
6780DogXCJmYWRlXCIsXG5cblx0XHQvLyBEdXJhdGlvbiBpbiBtcyBmb3IgdHJhbnNpdGlvbiBhbmltYXRpb25cblx0XHR0cmFuc2l0aW9uRHVyYXRpb246IDM2NixcblxuXHRcdC8vIEN1c3RvbSBDU1MgY2xhc3MgZm9yIHNsaWRlIGVsZW1lbnRcblx0XHRzbGlkZUNsYXNzOiBcIlwiLFxuXG5cdFx0Ly8gQ3VzdG9tIENTUyBjbGFzcyBmb3IgbGF5b3V0XG5cdFx0YmFzZUNsYXNzOiBcIlwiLFxuXG5cdFx0Ly8gQmFzZSB0ZW1wbGF0ZSBmb3IgbGF5b3V0XG5cdFx0YmFzZVRwbDogJzxkaXYgY2xhc3M9XCJmYW5jeWJveC1jb250YWluZXJcIiByb2xlPVwiZGlhbG9nXCIgdGFiaW5kZXg9XCItMVwiPicgK1xuXHRcdFx0JzxkaXYgY2xhc3M9XCJmYW5jeWJveC1iZ1wiPjwvZGl2PicgK1xuXHRcdFx0JzxkaXYgY2xhc3M9XCJmYW5jeWJveC1pbm5lclwiPicgK1xuXHRcdFx0JzxkaXYgY2xhc3M9XCJmYW5jeWJveC1pbmZvYmFyXCI+PHNwYW4gZGF0YS1mYW5jeWJveC1pbmRleD48L3NwYW4+Jm5ic3A7LyZuYnNwOzxzcGFuIGRhdGEtZmFuY3lib3gtY291bnQ+PC9zcGFuPjwvZGl2PicgK1xuXHRcdFx0JzxkaXYgY2xhc3M9XCJmYW5jeWJveC10b29sYmFyXCI+e3tidXR0b25zfX08L2Rpdj4nICtcblx0XHRcdCc8ZGl2IGNsYXNzPVwiZmFuY3lib3gtbmF2aWdhdGlvblwiPnt7YXJyb3dzfX08L2Rpdj4nICtcblx0XHRcdCc8ZGl2IGNsYXNzPVwiZmFuY3lib3gtc3RhZ2VcIj48L2Rpdj4nICtcblx0XHRcdCc8ZGl2IGNsYXNzPVwiZmFuY3lib3gtY2FwdGlvblwiPjxkaXYgY2xhc3M9XCJmYW5jeWJveC1jYXB0aW9uX19ib2R5XCI+PC9kaXY+PC9kaXY+JyArXG5cdFx0XHRcIjwvZGl2PlwiICtcblx0XHRcdFwiPC9kaXY+XCIsXG5cblx0XHQvLyBMb2FkaW5nIGluZGljYXRvciB0ZW1wbGF0ZVxuXHRcdHNwaW5uZXJUcGw6ICc8ZGl2IGNsYXNzPVwiZmFuY3lib3gtbG9hZGluZ1wiPjwvZGl2PicsXG5cblx0XHQvLyBFcnJvciBtZXNzYWdlIHRlbXBsYXRlXG5cdFx0ZXJyb3JUcGw6ICc8ZGl2IGNsYXNzPVwiZmFuY3lib3gtZXJyb3JcIj48cD57e0VSUk9SfX08L3A+PC9kaXY+JyxcblxuXHRcdGJ0blRwbDoge1xuXHRcdFx0ZG93bmxvYWQ6ICc8YSBkb3dubG9hZCBkYXRhLWZhbmN5Ym94LWRvd25sb2FkIGNsYXNzPVwiZmFuY3lib3gtYnV0dG9uIGZhbmN5Ym94LWJ1dHRvbi0tZG93bmxvYWRcIiB0aXRsZT1cInt7RE9XTkxPQUR9fVwiIGhyZWY9XCJqYXZhc2NyaXB0OjtcIj4nICtcblx0XHRcdFx0JzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj48cGF0aCBkPVwiTTE4LjYyIDE3LjA5VjE5SDUuMzh2LTEuOTF6bS0yLjk3LTYuOTZMMTcgMTEuNDVsLTUgNC44Ny01LTQuODcgMS4zNi0xLjMyIDIuNjggMi42NFY1aDEuOTJ2Ny43N3pcIi8+PC9zdmc+JyArXG5cdFx0XHRcdFwiPC9hPlwiLFxuXG5cdFx0XHR6b29tOiAnPGJ1dHRvbiBkYXRhLWZhbmN5Ym94LXpvb20gY2xhc3M9XCJmYW5jeWJveC1idXR0b24gZmFuY3lib3gtYnV0dG9uLS16b29tXCIgdGl0bGU9XCJ7e1pPT019fVwiPicgK1xuXHRcdFx0XHQnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiPjxwYXRoIGQ9XCJNMTguNyAxNy4zbC0zLTNhNS45IDUuOSAwIDAgMC0uNi03LjYgNS45IDUuOSAwIDAgMC04LjQgMCA1LjkgNS45IDAgMCAwIDAgOC40IDUuOSA1LjkgMCAwIDAgNy43LjdsMyAzYTEgMSAwIDAgMCAxLjMgMGMuNC0uNS40LTEgMC0xLjV6TTguMSAxMy44YTQgNCAwIDAgMSAwLTUuNyA0IDQgMCAwIDEgNS43IDAgNCA0IDAgMCAxIDAgNS43IDQgNCAwIDAgMS01LjcgMHpcIi8+PC9zdmc+JyArXG5cdFx0XHRcdFwiPC9idXR0b24+XCIsXG5cblx0XHRcdGNsb3NlOiAnPGJ1dHRvbiBkYXRhLWZhbmN5Ym94LWNsb3NlIGNsYXNzPVwiZmFuY3lib3gtYnV0dG9uIGZhbmN5Ym94LWJ1dHRvbi0tY2xvc2VcIiB0aXRsZT1cInt7Q0xPU0V9fVwiPicgK1xuXHRcdFx0XHQnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiPjxwYXRoIGQ9XCJNMTIgMTAuNkw2LjYgNS4yIDUuMiA2LjZsNS40IDUuNC01LjQgNS40IDEuNCAxLjQgNS40LTUuNCA1LjQgNS40IDEuNC0xLjQtNS40LTUuNCA1LjQtNS40LTEuNC0xLjQtNS40IDUuNHpcIi8+PC9zdmc+JyArXG5cdFx0XHRcdFwiPC9idXR0b24+XCIsXG5cblx0XHRcdC8vIEFycm93c1xuXHRcdFx0YXJyb3dMZWZ0OiAnPGJ1dHRvbiBkYXRhLWZhbmN5Ym94LXByZXYgY2xhc3M9XCJmYW5jeWJveC1idXR0b24gZmFuY3lib3gtYnV0dG9uLS1hcnJvd19sZWZ0XCIgdGl0bGU9XCJ7e1BSRVZ9fVwiPicgK1xuXHRcdFx0XHQnPGRpdj48c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+PHBhdGggZD1cIk0xMS4yOCAxNS43bC0xLjM0IDEuMzdMNSAxMmw0Ljk0LTUuMDcgMS4zNCAxLjM4LTIuNjggMi43MkgxOXYxLjk0SDguNnpcIi8+PC9zdmc+PC9kaXY+JyArXG5cdFx0XHRcdFwiPC9idXR0b24+XCIsXG5cblx0XHRcdGFycm93UmlnaHQ6ICc8YnV0dG9uIGRhdGEtZmFuY3lib3gtbmV4dCBjbGFzcz1cImZhbmN5Ym94LWJ1dHRvbiBmYW5jeWJveC1idXR0b24tLWFycm93X3JpZ2h0XCIgdGl0bGU9XCJ7e05FWFR9fVwiPicgK1xuXHRcdFx0XHQnPGRpdj48c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+PHBhdGggZD1cIk0xNS40IDEyLjk3bC0yLjY4IDIuNzIgMS4zNCAxLjM4TDE5IDEybC00Ljk0LTUuMDctMS4zNCAxLjM4IDIuNjggMi43Mkg1djEuOTR6XCIvPjwvc3ZnPjwvZGl2PicgK1xuXHRcdFx0XHRcIjwvYnV0dG9uPlwiLFxuXG5cdFx0XHQvLyBUaGlzIHNtYWxsIGNsb3NlIGJ1dHRvbiB3aWxsIGJlIGFwcGVuZGVkIHRvIHlvdXIgaHRtbC9pbmxpbmUvYWpheCBjb250ZW50IGJ5IGRlZmF1bHQsXG5cdFx0XHQvLyBpZiBcInNtYWxsQnRuXCIgb3B0aW9uIGlzIG5vdCBzZXQgdG8gZmFsc2Vcblx0XHRcdHNtYWxsQnRuOiAnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1mYW5jeWJveC1jbG9zZSBjbGFzcz1cImZhbmN5Ym94LWJ1dHRvbiBmYW5jeWJveC1jbG9zZS1zbWFsbFwiIHRpdGxlPVwie3tDTE9TRX19XCI+JyArXG5cdFx0XHRcdCc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2ZXJzaW9uPVwiMVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj48cGF0aCBkPVwiTTEzIDEybDUtNS0xLTEtNSA1LTUtNS0xIDEgNSA1LTUgNSAxIDEgNS01IDUgNSAxLTF6XCIvPjwvc3ZnPicgK1xuXHRcdFx0XHRcIjwvYnV0dG9uPlwiXG5cdFx0fSxcblxuXHRcdC8vIENvbnRhaW5lciBpcyBpbmplY3RlZCBpbnRvIHRoaXMgZWxlbWVudFxuXHRcdHBhcmVudEVsOiBcImJvZHlcIixcblxuXHRcdC8vIEhpZGUgYnJvd3NlciB2ZXJ0aWNhbCBzY3JvbGxiYXJzOyB1c2UgYXQgeW91ciBvd24gcmlza1xuXHRcdGhpZGVTY3JvbGxiYXI6IHRydWUsXG5cblx0XHQvLyBGb2N1cyBoYW5kbGluZ1xuXHRcdC8vID09PT09PT09PT09PT09XG5cblx0XHQvLyBUcnkgdG8gZm9jdXMgb24gdGhlIGZpcnN0IGZvY3VzYWJsZSBlbGVtZW50IGFmdGVyIG9wZW5pbmdcblx0XHRhdXRvRm9jdXM6IHRydWUsXG5cblx0XHQvLyBQdXQgZm9jdXMgYmFjayB0byBhY3RpdmUgZWxlbWVudCBhZnRlciBjbG9zaW5nXG5cdFx0YmFja0ZvY3VzOiB0cnVlLFxuXG5cdFx0Ly8gRG8gbm90IGxldCB1c2VyIHRvIGZvY3VzIG9uIGVsZW1lbnQgb3V0c2lkZSBtb2RhbCBjb250ZW50XG5cdFx0dHJhcEZvY3VzOiB0cnVlLFxuXG5cdFx0Ly8gTW9kdWxlIHNwZWNpZmljIG9wdGlvbnNcblx0XHQvLyA9PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdFx0ZnVsbFNjcmVlbjoge1xuXHRcdFx0YXV0b1N0YXJ0Oi
6780BmYWxzZVxuXHRcdH0sXG5cblx0XHQvLyBTZXQgYHRvdWNoOiBmYWxzZWAgdG8gZGlzYWJsZSBwYW5uaW5nL3N3aXBpbmdcblx0XHR0b3VjaDoge1xuXHRcdFx0dmVydGljYWw6IHRydWUsIC8vIEFsbG93IHRvIGRyYWcgY29udGVudCB2ZXJ0aWNhbGx5XG5cdFx0XHRtb21lbnR1bTogdHJ1ZSAvLyBDb250aW51ZSBtb3ZlbWVudCBhZnRlciByZWxlYXNpbmcgbW91c2UvdG91Y2ggd2hlbiBwYW5uaW5nXG5cdFx0fSxcblxuXHRcdC8vIEhhc2ggdmFsdWUgd2hlbiBpbml0aWFsaXppbmcgbWFudWFsbHksXG5cdFx0Ly8gc2V0IGBmYWxzZWAgdG8gZGlzYWJsZSBoYXNoIGNoYW5nZVxuXHRcdGhhc2g6IG51bGwsXG5cblx0XHQvLyBDdXN0b21pemUgb3IgYWRkIG5ldyBtZWRpYSB0eXBlc1xuXHRcdC8vIEV4YW1wbGU6XG5cdFx0LypcbiAgICAgIG1lZGlhIDoge1xuICAgICAgICB5b3V0dWJlIDoge1xuICAgICAgICAgIHBhcmFtcyA6IHtcbiAgICAgICAgICAgIGF1dG9wbGF5IDogMFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICovXG5cdFx0bWVkaWE6IHt9LFxuXG5cdFx0c2xpZGVTaG93OiB7XG5cdFx0XHRhdXRvU3RhcnQ6IGZhbHNlLFxuXHRcdFx0c3BlZWQ6IDMwMDBcblx0XHR9LFxuXG5cdFx0dGh1bWJzOiB7XG5cdFx0XHRhdXRvU3RhcnQ6IGZhbHNlLCAvLyBEaXNwbGF5IHRodW1ibmFpbHMgb24gb3BlbmluZ1xuXHRcdFx0aGlkZU9uQ2xvc2U6IHRydWUsIC8vIEhpZGUgdGh1bWJuYWlsIGdyaWQgd2hlbiBjbG9zaW5nIGFuaW1hdGlvbiBzdGFydHNcblx0XHRcdHBhcmVudEVsOiBcIi5mYW5jeWJveC1jb250YWluZXJcIiwgLy8gQ29udGFpbmVyIGlzIGluamVjdGVkIGludG8gdGhpcyBlbGVtZW50XG5cdFx0XHRheGlzOiBcInlcIiAvLyBWZXJ0aWNhbCAoeSkgb3IgaG9yaXpvbnRhbCAoeCkgc2Nyb2xsaW5nXG5cdFx0fSxcblxuXHRcdC8vIFVzZSBtb3VzZXdoZWVsIHRvIG5hdmlnYXRlIGdhbGxlcnlcblx0XHQvLyBJZiAnYXV0bycgLSBlbmFibGVkIGZvciBpbWFnZXMgb25seVxuXHRcdHdoZWVsOiBcImF1dG9cIixcblxuXHRcdC8vIENhbGxiYWNrc1xuXHRcdC8vPT09PT09PT09PVxuXG5cdFx0Ly8gU2VlIERvY3VtZW50YXRpb24vQVBJL0V2ZW50cyBmb3IgbW9yZSBpbmZvcm1hdGlvblxuXHRcdC8vIEV4YW1wbGU6XG5cdFx0LypcbiAgICAgIGFmdGVyU2hvdzogZnVuY3Rpb24oIGluc3RhbmNlLCBjdXJyZW50ICkge1xuICAgICAgICBjb25zb2xlLmluZm8oICdDbGlja2VkIGVsZW1lbnQ6JyApO1xuICAgICAgICBjb25zb2xlLmluZm8oIGN1cnJlbnQub3B0cy4kb3JpZyApO1xuICAgICAgfVxuICAgICovXG5cblx0XHRvbkluaXQ6ICQubm9vcCwgLy8gV2hlbiBpbnN0YW5jZSBoYXMgYmVlbiBpbml0aWFsaXplZFxuXG5cdFx0YmVmb3JlTG9hZDogJC5ub29wLCAvLyBCZWZvcmUgdGhlIGNvbnRlbnQgb2YgYSBzbGlkZSBpcyBiZWluZyBsb2FkZWRcblx0XHRhZnRlckxvYWQ6ICQubm9vcCwgLy8gV2hlbiB0aGUgY29udGVudCBvZiBhIHNsaWRlIGlzIGRvbmUgbG9hZGluZ1xuXG5cdFx0YmVmb3JlU2hvdzogJC5ub29wLCAvLyBCZWZvcmUgb3BlbiBhbmltYXRpb24gc3RhcnRzXG5cdFx0YWZ0ZXJTaG93OiAkLm5vb3AsIC8vIFdoZW4gY29udGVudCBpcyBkb25lIGxvYWRpbmcgYW5kIGFuaW1hdGluZ1xuXG5cdFx0YmVmb3JlQ2xvc2U6ICQubm9vcCwgLy8gQmVmb3JlIHRoZSBpbnN0YW5jZSBhdHRlbXB0cyB0byBjbG9zZS4gUmV0dXJuIGZhbHNlIHRvIGNhbmNlbCB0aGUgY2xvc2UuXG5cdFx0YWZ0ZXJDbG9zZTogJC5ub29wLCAvLyBBZnRlciBpbnN0YW5jZSBoYXMgYmVlbiBjbG9zZWRcblxuXHRcdG9uQWN0aXZhdGU6ICQubm9vcCwgLy8gV2hlbiBpbnN0YW5jZSBpcyBicm91Z2h0IHRvIGZyb250XG5cdFx0b25EZWFjdGl2YXRlOiAkLm5vb3AsIC8vIFdoZW4gb3RoZXIgaW5zdGFuY2UgaGFzIGJlZW4gYWN0aXZhdGVkXG5cblx0XHQvLyBJbnRlcmFjdGlvblxuXHRcdC8vID09PT09PT09PT09XG5cblx0XHQvLyBVc2Ugb3B0aW9ucyBiZWxvdyB0byBjdXN0b21pemUgdGFrZW4gYWN0aW9uIHdoZW4gdXNlciBjbGlja3Mgb3IgZG91YmxlIGNsaWNrcyBvbiB0aGUgZmFuY3lCb3ggYXJlYSxcblx0XHQvLyBlYWNoIG9wdGlvbiBjYW4gYmUgc3RyaW5nIG9yIG1ldGhvZCB0aGF0IHJldHVybnMgdmFsdWUuXG5cdFx0Ly9cblx0XHQvLyBQb3NzaWJsZSB2YWx1ZXM6XG5cdFx0Ly8gICBcImNsb3NlXCIgICAgICAgICAgIC0gY2xvc2UgaW5zdGFuY2Vcblx0XHQvLyAgIFwibmV4dFwiICAgICAgICAgICAgLSBtb3ZlIHRvIG5leHQgZ2FsbGVyeSBpdGVtXG5cdFx0Ly8gICBcIm5leHRPckNsb3NlXCIgICAgIC0gbW92ZSB0byBuZXh0IGdhbGxlcnkgaXRlbSBvciBjbG9zZSBpZiBnYWxsZXJ5IGhhcyBvbmx5IG9uZSBpdGVtXG5cdFx0Ly8gICBcInRvZ2dsZUNvbnRyb2xzXCIgIC0gc2hvdy9oaWRlIGNvbnRyb2xzXG5cdFx0Ly8gICBcInpvb21cIiAgICAgICAgICAgIC0gem9vbSBpbWFnZSAoaWYgbG9hZGVkKVxuXHRcdC8vICAgZmFsc2UgICAgICAgICAgICAgLSBkbyBub3RoaW5nXG5cblx0XHQvLyBDbGlja2VkIG9uIHRoZSBjb250ZW50XG5cdFx0Y2xpY2tDb250ZW50OiBmdW5jdGlvbiAoY3VycmVudCwgZXZlbnQpIHtcblx0XHRcdHJldHVybiBjdXJyZW50LnR5cGUgPT09IFwiaW1hZ2VcIiA/IFwiem9vbVwiIDogZmFsc2U7XG5cdFx0fSxcblxuXHRcdC8vIENsaWNrZWQgb24gdGhlIHNsaWRlXG5cdFx0Y2xpY2tTbGlkZTogXCJjbG9zZVwiLFxuXG5cdFx0Ly8gQ2xpY2tlZCBvbiB0aGUgYmFja2dyb3VuZCAoYmFja2Ryb3ApIGVsZW1lbnQ7XG5cdFx0Ly8gaWYgeW91IGhhdmUgbm90IGNoYW5nZWQgdGhlIGxheW91dCwgdGhlbiBtb3N0IGxpa2VseSB5b3UgbmVlZCB0byB1c2UgYGNsaWNrU2xpZGVgIG9wdGlvblxuXHRcdGNsaWNrT3V0c2lkZTogXCJjbG9zZVwiLFxuXG5cdFx0Ly8gU2FtZSBhcyBwcmV2aW91cyB0d28sIGJ1dCBmb3IgZG91YmxlIGNsaWNrXG5cdFx0ZGJsY2xpY2tDb250ZW50OiBmYWxzZSxcblx0XHRkYmxjbGlja1NsaWRlOiBmYWxzZSxcblx0XHRkYmxjbGlja091dHNpZGU6IGZhbHNlLFxuXG5cdFx0Ly8gQ3VzdG9tIG9wdGlvbnMgd2hlbiBtb2JpbGUgZGV2aWNlIGlzIGRldGVjdGVkXG5cdFx0Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblx0XHRtb2JpbGU6IHtcblx0XHRcdHByZXZlbn
6780RDYXB0aW9uT3ZlcmxhcDogZmFsc2UsXG5cdFx0XHRpZGxlVGltZTogZmFsc2UsXG5cdFx0XHRjbGlja0NvbnRlbnQ6IGZ1bmN0aW9uIChjdXJyZW50LCBldmVudCkge1xuXHRcdFx0XHRyZXR1cm4gY3VycmVudC50eXBlID09PSBcImltYWdlXCIgPyBcInRvZ2dsZUNvbnRyb2xzXCIgOiBmYWxzZTtcblx0XHRcdH0sXG5cdFx0XHRjbGlja1NsaWRlOiBmdW5jdGlvbiAoY3VycmVudCwgZXZlbnQpIHtcblx0XHRcdFx0cmV0dXJuIGN1cnJlbnQudHlwZSA9PT0gXCJpbWFnZVwiID8gXCJ0b2dnbGVDb250cm9sc1wiIDogXCJjbG9zZVwiO1xuXHRcdFx0fSxcblx0XHRcdGRibGNsaWNrQ29udGVudDogZnVuY3Rpb24gKGN1cnJlbnQsIGV2ZW50KSB7XG5cdFx0XHRcdHJldHVybiBjdXJyZW50LnR5cGUgPT09IFwiaW1hZ2VcIiA/IFwiem9vbVwiIDogZmFsc2U7XG5cdFx0XHR9LFxuXHRcdFx0ZGJsY2xpY2tTbGlkZTogZnVuY3Rpb24gKGN1cnJlbnQsIGV2ZW50KSB7XG5cdFx0XHRcdHJldHVybiBjdXJyZW50LnR5cGUgPT09IFwiaW1hZ2VcIiA/IFwiem9vbVwiIDogZmFsc2U7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdC8vIEludGVybmF0aW9uYWxpemF0aW9uXG5cdFx0Ly8gPT09PT09PT09PT09PT09PT09PT1cblxuXHRcdGxhbmc6IFwiZW5cIixcblx0XHRpMThuOiB7XG5cdFx0XHRlbjoge1xuXHRcdFx0XHRDTE9TRTogXCJDbG9zZVwiLFxuXHRcdFx0XHRORVhUOiBcIk5leHRcIixcblx0XHRcdFx0UFJFVjogXCJQcmV2aW91c1wiLFxuXHRcdFx0XHRFUlJPUjogXCJUaGUgcmVxdWVzdGVkIGNvbnRlbnQgY2Fubm90IGJlIGxvYWRlZC4gPGJyLz4gUGxlYXNlIHRyeSBhZ2FpbiBsYXRlci5cIixcblx0XHRcdFx0UExBWV9TVEFSVDogXCJTdGFydCBzbGlkZXNob3dcIixcblx0XHRcdFx0UExBWV9TVE9QOiBcIlBhdXNlIHNsaWRlc2hvd1wiLFxuXHRcdFx0XHRGVUxMX1NDUkVFTjogXCJGdWxsIHNjcmVlblwiLFxuXHRcdFx0XHRUSFVNQlM6IFwiVGh1bWJuYWlsc1wiLFxuXHRcdFx0XHRET1dOTE9BRDogXCJEb3dubG9hZFwiLFxuXHRcdFx0XHRTSEFSRTogXCJTaGFyZVwiLFxuXHRcdFx0XHRaT09NOiBcIlpvb21cIlxuXHRcdFx0fSxcblx0XHRcdGRlOiB7XG5cdFx0XHRcdENMT1NFOiBcIlNjaGxpZSZzemxpZztlblwiLFxuXHRcdFx0XHRORVhUOiBcIldlaXRlclwiLFxuXHRcdFx0XHRQUkVWOiBcIlp1ciZ1dW1sO2NrXCIsXG5cdFx0XHRcdEVSUk9SOiBcIkRpZSBhbmdlZm9yZGVydGVuIERhdGVuIGtvbm50ZW4gbmljaHQgZ2VsYWRlbiB3ZXJkZW4uIDxici8+IEJpdHRlIHZlcnN1Y2hlbiBTaWUgZXMgc3AmYXVtbDt0ZXIgbm9jaG1hbC5cIixcblx0XHRcdFx0UExBWV9TVEFSVDogXCJEaWFzY2hhdSBzdGFydGVuXCIsXG5cdFx0XHRcdFBMQVlfU1RPUDogXCJEaWFzY2hhdSBiZWVuZGVuXCIsXG5cdFx0XHRcdEZVTExfU0NSRUVOOiBcIlZvbGxiaWxkXCIsXG5cdFx0XHRcdFRIVU1CUzogXCJWb3JzY2hhdWJpbGRlclwiLFxuXHRcdFx0XHRET1dOTE9BRDogXCJIZXJ1bnRlcmxhZGVuXCIsXG5cdFx0XHRcdFNIQVJFOiBcIlRlaWxlblwiLFxuXHRcdFx0XHRaT09NOiBcIlZlcmdyJm91bWw7JnN6bGlnO2VyblwiXG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXG5cdC8vIEZldyB1c2VmdWwgdmFyaWFibGVzIGFuZCBtZXRob2RzXG5cdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblx0dmFyICRXID0gJCh3aW5kb3cpO1xuXHR2YXIgJEQgPSAkKGRvY3VtZW50KTtcblxuXHR2YXIgY2FsbGVkID0gMDtcblxuXHQvLyBDaGVjayBpZiBhbiBvYmplY3QgaXMgYSBqUXVlcnkgb2JqZWN0IGFuZCBub3QgYSBuYXRpdmUgSmF2YVNjcmlwdCBvYmplY3Rcblx0Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cdHZhciBpc1F1ZXJ5ID0gZnVuY3Rpb24gKG9iaikge1xuXHRcdHJldHVybiBvYmogJiYgb2JqLmhhc093blByb3BlcnR5ICYmIG9iaiBpbnN0YW5jZW9mICQ7XG5cdH07XG5cblx0Ly8gSGFuZGxlIG11bHRpcGxlIGJyb3dzZXJzIGZvciBcInJlcXVlc3RBbmltYXRpb25GcmFtZVwiIGFuZCBcImNhbmNlbEFuaW1hdGlvbkZyYW1lXCJcblx0Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXHR2YXIgcmVxdWVzdEFGcmFtZSA9IChmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIChcblx0XHRcdHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcblx0XHRcdHdpbmRvdy53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcblx0XHRcdHdpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcblx0XHRcdHdpbmRvdy5vUmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8XG5cdFx0XHQvLyBpZiBhbGwgZWxzZSBmYWlscywgdXNlIHNldFRpbWVvdXRcblx0XHRcdGZ1bmN0aW9uIChjYWxsYmFjaykge1xuXHRcdFx0XHRyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoY2FsbGJhY2ssIDEwMDAgLyA2MCk7XG5cdFx0XHR9XG5cdFx0KTtcblx0fSkoKTtcblxuXHR2YXIgY2FuY2VsQUZyYW1lID0gKGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gKFxuXHRcdFx0d2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lIHx8XG5cdFx0XHR3aW5kb3cud2Via2l0Q2FuY2VsQW5pbWF0aW9uRnJhbWUgfHxcblx0XHRcdHdpbmRvdy5tb3pDYW5jZWxBbmltYXRpb25GcmFtZSB8fFxuXHRcdFx0d2luZG93Lm9DYW5jZWxBbmltYXRpb25GcmFtZSB8fFxuXHRcdFx0ZnVuY3Rpb24gKGlkKSB7XG5cdFx0XHRcdHdpbmRvdy5jbGVhclRpbWVvdXQoaWQpO1xuXHRcdFx0fVxuXHRcdCk7XG5cdH0pKCk7XG5cblx0Ly8gRGV0ZWN0IHRoZSBzdXBwb3J0ZWQgdHJhbnNpdGlvbi1lbmQgZXZlbnQgcHJvcGVydHkgbmFtZVxuXHQvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cdHZhciB0cmFuc2l0aW9uRW5kID0gKGZ1bmN0aW9uICgpIHtcblx0XHR2YXIgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZmFrZWVsZW1lbnRcIiksXG5cdFx0XHR0O1xuXG5cdFx0dmFyIHRyYW5zaXRpb25zID0ge1xuXHRcdFx0dHJhbnNpdGlvbjogXCJ0cmFuc2l0aW9uZW5kXCIsXG5cdFx0XHRPVHJhbnNpdGlvbjogXCJvVHJhbnNpdGlvbkVuZFwiLFxuXHRcdFx0TW96VHJhbnNpdGlvbjogXCJ0cmFuc2l0aW9uZW5kXCIsXG5cdFx0XHRXZWJraXRUcmFuc2l0aW9uOiBcIndlYmtpdFRyYW5zaXRpb25FbmRcIlxuXHRcdH07XG5cblx0XHRmb3IgKHQgaW4gdHJhbnNpdGlvbnMpIHtcblx0XHRcdGlmIChlbC5zdHlsZVt0XSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJldHVybi
6780B0cmFuc2l0aW9uc1t0XTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gXCJ0cmFuc2l0aW9uZW5kXCI7XG5cdH0pKCk7XG5cblx0Ly8gRm9yY2UgcmVkcmF3IG9uIGFuIGVsZW1lbnQuXG5cdC8vIFRoaXMgaGVscHMgaW4gY2FzZXMgd2hlcmUgdGhlIGJyb3dzZXIgZG9lc24ndCByZWRyYXcgYW4gdXBkYXRlZCBlbGVtZW50IHByb3Blcmx5XG5cdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cdHZhciBmb3JjZVJlZHJhdyA9IGZ1bmN0aW9uICgkZWwpIHtcblx0XHRyZXR1cm4gJGVsICYmICRlbC5sZW5ndGggJiYgJGVsWzBdLm9mZnNldEhlaWdodDtcblx0fTtcblxuXHQvLyBFeGNsdWRlIGFycmF5IChgYnV0dG9uc2ApIG9wdGlvbnMgZnJvbSBkZWVwIG1lcmdpbmdcblx0Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cdHZhciBtZXJnZU9wdHMgPSBmdW5jdGlvbiAob3B0czEsIG9wdHMyKSB7XG5cdFx0dmFyIHJleiA9ICQuZXh0ZW5kKHRydWUsIHt9LCBvcHRzMSwgb3B0czIpO1xuXG5cdFx0JC5lYWNoKG9wdHMyLCBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuXHRcdFx0aWYgKCQuaXNBcnJheSh2YWx1ZSkpIHtcblx0XHRcdFx0cmV6W2tleV0gPSB2YWx1ZTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdHJldHVybiByZXo7XG5cdH07XG5cblx0Ly8gSG93IG11Y2ggb2YgYW4gZWxlbWVudCBpcyB2aXNpYmxlIGluIHZpZXdwb3J0XG5cdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdHZhciBpblZpZXdwb3J0ID0gZnVuY3Rpb24gKGVsZW0pIHtcblx0XHR2YXIgZWxlbUNlbnRlciwgcmV6O1xuXG5cdFx0aWYgKCFlbGVtIHx8IGVsZW0ub3duZXJEb2N1bWVudCAhPT0gZG9jdW1lbnQpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQkKFwiLmZhbmN5Ym94LWNvbnRhaW5lclwiKS5jc3MoXCJwb2ludGVyLWV2ZW50c1wiLCBcIm5vbmVcIik7XG5cblx0XHRlbGVtQ2VudGVyID0ge1xuXHRcdFx0eDogZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0ICsgZWxlbS5vZmZzZXRXaWR0aCAvIDIsXG5cdFx0XHR5OiBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCArIGVsZW0ub2Zmc2V0SGVpZ2h0IC8gMlxuXHRcdH07XG5cblx0XHRyZXogPSBkb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KGVsZW1DZW50ZXIueCwgZWxlbUNlbnRlci55KSA9PT0gZWxlbTtcblxuXHRcdCQoXCIuZmFuY3lib3gtY29udGFpbmVyXCIpLmNzcyhcInBvaW50ZXItZXZlbnRzXCIsIFwiXCIpO1xuXG5cdFx0cmV0dXJuIHJlejtcblx0fTtcblxuXHQvLyBDbGFzcyBkZWZpbml0aW9uXG5cdC8vID09PT09PT09PT09PT09PT1cblxuXHR2YXIgRmFuY3lCb3ggPSBmdW5jdGlvbiAoY29udGVudCwgb3B0cywgaW5kZXgpIHtcblx0XHR2YXIgc2VsZiA9IHRoaXM7XG5cblx0XHRzZWxmLm9wdHMgPSBtZXJnZU9wdHMoe1xuXHRcdFx0aW5kZXg6IGluZGV4XG5cdFx0fSwgJC5mYW5jeWJveC5kZWZhdWx0cyk7XG5cblx0XHRpZiAoJC5pc1BsYWluT2JqZWN0KG9wdHMpKSB7XG5cdFx0XHRzZWxmLm9wdHMgPSBtZXJnZU9wdHMoc2VsZi5vcHRzLCBvcHRzKTtcblx0XHR9XG5cblx0XHRpZiAoJC5mYW5jeWJveC5pc01vYmlsZSkge1xuXHRcdFx0c2VsZi5vcHRzID0gbWVyZ2VPcHRzKHNlbGYub3B0cywgc2VsZi5vcHRzLm1vYmlsZSk7XG5cdFx0fVxuXG5cdFx0c2VsZi5pZCA9IHNlbGYub3B0cy5pZCB8fCArK2NhbGxlZDtcblxuXHRcdHNlbGYuY3VyckluZGV4ID0gcGFyc2VJbnQoc2VsZi5vcHRzLmluZGV4LCAxMCkgfHwgMDtcblx0XHRzZWxmLnByZXZJbmRleCA9IG51bGw7XG5cblx0XHRzZWxmLnByZXZQb3MgPSBudWxsO1xuXHRcdHNlbGYuY3VyclBvcyA9IDA7XG5cblx0XHRzZWxmLmZpcnN0UnVuID0gdHJ1ZTtcblxuXHRcdC8vIEFsbCBncm91cCBpdGVtc1xuXHRcdHNlbGYuZ3JvdXAgPSBbXTtcblxuXHRcdC8vIEV4aXN0aW5nIHNsaWRlcyAoZm9yIGN1cnJlbnQsIG5leHQgYW5kIHByZXZpb3VzIGdhbGxlcnkgaXRlbXMpXG5cdFx0c2VsZi5zbGlkZXMgPSB7fTtcblxuXHRcdC8vIENyZWF0ZSBncm91cCBlbGVtZW50c1xuXHRcdHNlbGYuYWRkQ29udGVudChjb250ZW50KTtcblxuXHRcdGlmICghc2VsZi5ncm91cC5sZW5ndGgpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRzZWxmLmluaXQoKTtcblx0fTtcblxuXHQkLmV4dGVuZChGYW5jeUJveC5wcm90b3R5cGUsIHtcblx0XHQvLyBDcmVhdGUgRE9NIHN0cnVjdHVyZVxuXHRcdC8vID09PT09PT09PT09PT09PT09PT09XG5cblx0XHRpbml0OiBmdW5jdGlvbiAoKSB7XG5cdFx0XHR2YXIgc2VsZiA9IHRoaXMsXG5cdFx0XHRcdGZpcnN0SXRlbSA9IHNlbGYuZ3JvdXBbc2VsZi5jdXJySW5kZXhdLFxuXHRcdFx0XHRmaXJzdEl0ZW1PcHRzID0gZmlyc3RJdGVtLm9wdHMsXG5cdFx0XHRcdCRjb250YWluZXIsXG5cdFx0XHRcdGJ1dHRvblN0cjtcblxuXHRcdFx0aWYgKGZpcnN0SXRlbU9wdHMuY2xvc2VFeGlzdGluZykge1xuXHRcdFx0XHQkLmZhbmN5Ym94LmNsb3NlKHRydWUpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBIaWRlIHNjcm9sbGJhcnNcblx0XHRcdC8vID09PT09PT09PT09PT09PVxuXG5cdFx0XHQkKFwiYm9keVwiKS5hZGRDbGFzcyhcImZhbmN5Ym94LWFjdGl2ZVwiKTtcblxuXHRcdFx0aWYgKFxuXHRcdFx0XHQhJC5mYW5jeWJveC5nZXRJbnN0YW5jZSgpICYmXG5cdFx0XHRcdGZpcnN0SXRlbU9wdHMuaGlkZVNjcm9sbGJhciAhPT0gZmFsc2UgJiZcblx0XHRcdFx0ISQuZmFuY3lib3guaXNNb2JpbGUgJiZcblx0XHRcdFx0ZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQgPiB3aW5kb3cuaW5uZXJIZWlnaHRcblx0XHRcdCkge1xuXHRcdFx0XHQkKFwiaGVhZFwiKS5hcHBlbmQoXG5cdFx0XHRcdFx0JzxzdHlsZSBpZD1cImZhbmN5Ym94LXN0eWxlLW5vc2Nyb2xsXCIgdHlwZT1cInRleHQvY3NzXCI+LmNvbXBlbnNhdGUtZm9yLXNjcm9sbGJhcnttYXJnaW4tcmlnaHQ6JyArXG5cdFx0XHRcdFx0KHdpbmRvdy5pbm5lcldpZHRoIC0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSArXG5cdFx0XHRcdFx0XCJweDt9PC9zdHlsZT5cIlxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdCQoXCJib2R5XCIpLmFkZENsYXNzKFwiY29tcGVuc2F0ZS1mb3Itc2Nyb2xsYmFyXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBCdWlsZCBodG1sIG1hcmt1cCBhbmQgc2V0IHJlZmVyZW5jZXNcblx0XHRcdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdFx0XHQvLyBCdWlsZCBodG1sIGNvZGUgZm9yIGJ1dHRvbnMgYW5kIGluc2VydCBpbnRvIG1haW4gdGVtcGxhdGVcblx0XHRcdGJ1dHRvblN0ciA9IFwiXCI7XG5cblx0XHRcdCQuZWFjaChmaXJzdEl0ZW1PcHRzLmJ1dHRvbnMsIGZ1bmN0aW9uIChpbmRleCwgdmFsdWUpIHtcblx0XHRcdFx0YnV0dG9uU3RyICs9IGZpcnN0SXRlbU9wdHMuYnRuVHBsW3ZhbHVlXSB8fCBcIlwiO
67801xuXHRcdFx0fSk7XG5cblx0XHRcdC8vIENyZWF0ZSBtYXJrdXAgZnJvbSBiYXNlIHRlbXBsYXRlLCBpdCB3aWxsIGJlIGluaXRpYWxseSBoaWRkZW4gdG9cblx0XHRcdC8vIGF2b2lkIHVubmVjZXNzYXJ5IHdvcmsgbGlrZSBwYWludGluZyB3aGlsZSBpbml0aWFsaXppbmcgaXMgbm90IGNvbXBsZXRlXG5cdFx0XHQkY29udGFpbmVyID0gJChcblx0XHRcdFx0c2VsZi50cmFuc2xhdGUoXG5cdFx0XHRcdFx0c2VsZixcblx0XHRcdFx0XHRmaXJzdEl0ZW1PcHRzLmJhc2VUcGxcblx0XHRcdFx0XHRcdC5yZXBsYWNlKFwie3tidXR0b25zfX1cIiwgYnV0dG9uU3RyKVxuXHRcdFx0XHRcdFx0LnJlcGxhY2UoXCJ7e2Fycm93c319XCIsIGZpcnN0SXRlbU9wdHMuYnRuVHBsLmFycm93TGVmdCArIGZpcnN0SXRlbU9wdHMuYnRuVHBsLmFycm93UmlnaHQpXG5cdFx0XHRcdClcblx0XHRcdClcblx0XHRcdFx0LmF0dHIoXCJpZFwiLCBcImZhbmN5Ym94LWNvbnRhaW5lci1cIiArIHNlbGYuaWQpXG5cdFx0XHRcdC5hZGRDbGFzcyhmaXJzdEl0ZW1PcHRzLmJhc2VDbGFzcylcblx0XHRcdFx0LmRhdGEoXCJGYW5jeUJveFwiLCBzZWxmKVxuXHRcdFx0XHQuYXBwZW5kVG8oZmlyc3RJdGVtT3B0cy5wYXJlbnRFbCk7XG5cblx0XHRcdC8vIENyZWF0ZSBvYmplY3QgaG9sZGluZyByZWZlcmVuY2VzIHRvIGpRdWVyeSB3cmFwcGVkIG5vZGVzXG5cdFx0XHRzZWxmLiRyZWZzID0ge1xuXHRcdFx0XHRjb250YWluZXI6ICRjb250YWluZXJcblx0XHRcdH07XG5cblx0XHRcdFtcImJnXCIsIFwiaW5uZXJcIiwgXCJpbmZvYmFyXCIsIFwidG9vbGJhclwiLCBcInN0YWdlXCIsIFwiY2FwdGlvblwiLCBcIm5hdmlnYXRpb25cIl0uZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuXHRcdFx0XHRzZWxmLiRyZWZzW2l0ZW1dID0gJGNvbnRhaW5lci5maW5kKFwiLmZhbmN5Ym94LVwiICsgaXRlbSk7XG5cdFx0XHR9KTtcblxuXHRcdFx0c2VsZi50cmlnZ2VyKFwib25Jbml0XCIpO1xuXG5cdFx0XHQvLyBFbmFibGUgZXZlbnRzLCBkZWFjdGl2ZSBwcmV2aW91cyBpbnN0YW5jZXNcblx0XHRcdHNlbGYuYWN0aXZhdGUoKTtcblxuXHRcdFx0Ly8gQnVpbGQgc2xpZGVzLCBsb2FkIGFuZCByZXZlYWwgY29udGVudFxuXHRcdFx0c2VsZi5qdW1wVG8oc2VsZi5jdXJySW5kZXgpO1xuXHRcdH0sXG5cblx0XHQvLyBTaW1wbGUgaTE4biBzdXBwb3J0IC0gcmVwbGFjZXMgb2JqZWN0IGtleXMgZm91bmQgaW4gdGVtcGxhdGVcblx0XHQvLyB3aXRoIGNvcnJlc3BvbmRpbmcgdmFsdWVzXG5cdFx0Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblx0XHR0cmFuc2xhdGU6IGZ1bmN0aW9uIChvYmosIHN0cikge1xuXHRcdFx0dmFyIGFyciA9IG9iai5vcHRzLmkxOG5bb2JqLm9wdHMubGFuZ10gfHwgb2JqLm9wdHMuaTE4bi5lbjtcblxuXHRcdFx0cmV0dXJuIHN0ci5yZXBsYWNlKC9cXHtcXHsoXFx3KylcXH1cXH0vZywgZnVuY3Rpb24gKG1hdGNoLCBuKSB7XG5cdFx0XHRcdHJldHVybiBhcnJbbl0gPT09IHVuZGVmaW5lZCA/IG1hdGNoIDogYXJyW25dO1xuXHRcdFx0fSk7XG5cdFx0fSxcblxuXHRcdC8vIFBvcHVsYXRlIGN1cnJlbnQgZ3JvdXAgd2l0aCBmcmVzaCBjb250ZW50XG5cdFx0Ly8gQ2hlY2sgaWYgZWFjaCBvYmplY3QgaGFzIHZhbGlkIHR5cGUgYW5kIGNvbnRlbnRcblx0XHQvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdFx0YWRkQ29udGVudDogZnVuY3Rpb24gKGNvbnRlbnQpIHtcblx0XHRcdHZhciBzZWxmID0gdGhpcyxcblx0XHRcdFx0aXRlbXMgPSAkLm1ha2VBcnJheShjb250ZW50KSxcblx0XHRcdFx0dGh1bWJzO1xuXG5cdFx0XHQkLmVhY2goaXRlbXMsIGZ1bmN0aW9uIChpLCBpdGVtKSB7XG5cdFx0XHRcdHZhciBvYmogPSB7fSxcblx0XHRcdFx0XHRvcHRzID0ge30sXG5cdFx0XHRcdFx0JGl0ZW0sXG5cdFx0XHRcdFx0dHlwZSxcblx0XHRcdFx0XHRmb3VuZCxcblx0XHRcdFx0XHRzcmMsXG5cdFx0XHRcdFx0c3JjUGFydHM7XG5cblx0XHRcdFx0Ly8gU3RlcCAxIC0gTWFrZSBzdXJlIHdlIGhhdmUgYW4gb2JqZWN0XG5cdFx0XHRcdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdFx0XHRcdGlmICgkLmlzUGxhaW5PYmplY3QoaXRlbSkpIHtcblx0XHRcdFx0XHQvLyBXZSBwcm9iYWJseSBoYXZlIG1hbnVhbCB1c2FnZSBoZXJlLCBzb21ldGhpbmcgbGlrZVxuXHRcdFx0XHRcdC8vICQuZmFuY3lib3gub3BlbiggWyB7IHNyYyA6IFwiaW1hZ2UuanBnXCIsIHR5cGUgOiBcImltYWdlXCIgfSBdIClcblxuXHRcdFx0XHRcdG9iaiA9IGl0ZW07XG5cdFx0XHRcdFx0b3B0cyA9IGl0ZW0ub3B0cyB8fCBpdGVtO1xuXHRcdFx0XHR9IGVsc2UgaWYgKCQudHlwZShpdGVtKSA9PT0gXCJvYmplY3RcIiAmJiAkKGl0ZW0pLmxlbmd0aCkge1xuXHRcdFx0XHRcdC8vIEhlcmUgd2UgcHJvYmFibHkgaGF2ZSBqUXVlcnkgY29sbGVjdGlvbiByZXR1cm5lZCBieSBzb21lIHNlbGVjdG9yXG5cdFx0XHRcdFx0JGl0ZW0gPSAkKGl0ZW0pO1xuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydCBhdHRyaWJ1dGVzIGxpa2UgYGRhdGEtb3B0aW9ucz0ne1widG91Y2hcIiA6IGZhbHNlfSdgIGFuZCBgZGF0YS10b3VjaD0nZmFsc2UnYFxuXHRcdFx0XHRcdG9wdHMgPSAkaXRlbS5kYXRhKCkgfHwge307XG5cdFx0XHRcdFx0b3B0cyA9ICQuZXh0ZW5kKHRydWUsIHt9LCBvcHRzLCBvcHRzLm9wdGlvbnMpO1xuXG5cdFx0XHRcdFx0Ly8gSGVyZSB3ZSBzdG9yZSBjbGlja2VkIGVsZW1lbnRcblx0XHRcdFx0XHRvcHRzLiRvcmlnID0gJGl0ZW07XG5cblx0XHRcdFx0XHRvYmouc3JjID0gc2VsZi5vcHRzLnNyYyB8fCBvcHRzLnNyYyB8fCAkaXRlbS5hdHRyKFwiaHJlZlwiKTtcblxuXHRcdFx0XHRcdC8vIEFzc3VtZSB0aGF0IHNpbXBsZSBzeW50YXggaXMgdXNlZCwgZm9yIGV4YW1wbGU6XG5cdFx0XHRcdFx0Ly8gICBgJC5mYW5jeWJveC5vcGVuKCAkKFwiI3Rlc3RcIiksIHt9ICk7YFxuXHRcdFx0XHRcdGlmICghb2JqLnR5cGUgJiYgIW9iai5zcmMpIHtcblx0XHRcdFx0XHRcdG9iai50eXBlID0gXCJpbmxpbmVcIjtcblx0XHRcdFx0XHRcdG9iai5zcmMgPSBpdGVtO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBBc3N1bWUgd2UgaGF2ZSBhIHNpbXBsZSBodG1sIGNvZGUsIGZvciBleGFtcGxlOlxuXHRcdFx0XHRcdC8vICAgJC5mYW5jeWJveC5vcGVuKCAnPGRpdj48aDE+SGkhPC9oMT48L2Rpdj4nICk7XG5cdFx0XHRcdFx0b2JqID0ge1xuXHRcdFx0XHRcdFx0dHlwZTogXCJodG1sXCIsXG5cdFx0XHRcdFx0XHRzcmM6IGl0ZW0gKyBcIlwiXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEVhY2ggZ2FsbGVyeSBvYmplY3QgaGFzIGZ1bGwgY29sbGVjdGlvbiBvZiBvcHRpb25zXG5cdFx0XHRcdG9iai5vcHRzID0gJC5leHRlbmQodHJ1ZSwge30sIHNlbGYub3B0cywgb3B0cyk7XG5cblx0XHRcdFx0Ly8gRG8gbm90IG1lcmdlIGJ1dHRvbnMgYXJyYXlcblx0XHRcdFx0aWYgKCQuaXNBcnJheShvcHRzLmJ1dHRvbnMpKSB7XG5cdFx0XHRcdFx0b2JqLm9wdHMuYnV0dG9ucyA9IG9wdHMuYnV0dG9ucztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICgkLmZhbmN5Ym94LmlzTW9iaWxlICYmIG9iai5vcHRzLm1vYmlsZSkge1xuXHRcdFx0XHRcdG9iai5vcHRzID0gbWVyZ2VPcHRzKG9iai5vcHRzLCBvYmoub3B0cy5tb2JpbGUpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gU3RlcCAyIC0gTWFrZSBzdXJlIHdlIGhhdmUgY29udGVudCB0eX
6780BlLCBpZiBub3QgLSB0cnkgdG8gZ3Vlc3Ncblx0XHRcdFx0Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHRcdFx0XHR0eXBlID0gb2JqLnR5cGUgfHwgb2JqLm9wdHMudHlwZTtcblx0XHRcdFx0c3JjID0gb2JqLnNyYyB8fCBcIlwiO1xuXG5cdFx0XHRcdGlmICghdHlwZSAmJiBzcmMpIHtcblx0XHRcdFx0XHRpZiAoKGZvdW5kID0gc3JjLm1hdGNoKC9cXC4obXA0fG1vdnxvZ3Z8d2VibSkoKFxcP3wjKS4qKT8kL2kpKSkge1xuXHRcdFx0XHRcdFx0dHlwZSA9IFwidmlkZW9cIjtcblxuXHRcdFx0XHRcdFx0aWYgKCFvYmoub3B0cy52aWRlby5mb3JtYXQpIHtcblx0XHRcdFx0XHRcdFx0b2JqLm9wdHMudmlkZW8uZm9ybWF0ID0gXCJ2aWRlby9cIiArIChmb3VuZFsxXSA9PT0gXCJvZ3ZcIiA/IFwib2dnXCIgOiBmb3VuZFsxXSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChzcmMubWF0Y2goLyheZGF0YTppbWFnZVxcL1thLXowLTkrXFwvPV0qLCl8KFxcLihqcChlfGd8ZWcpfGdpZnxwbmd8Ym1wfHdlYnB8c3ZnfGljbykoKFxcP3wjKS4qKT8kKS9pKSkge1xuXHRcdFx0XHRcdFx0dHlwZSA9IFwiaW1hZ2VcIjtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHNyYy5tYXRjaCgvXFwuKHBkZikoKFxcP3wjKS4qKT8kL2kpKSB7XG5cdFx0XHRcdFx0XHR0eXBlID0gXCJpZnJhbWVcIjtcblx0XHRcdFx0XHRcdG9iaiA9ICQuZXh0ZW5kKHRydWUsIG9iaiwge1xuXHRcdFx0XHRcdFx0XHRjb250ZW50VHlwZTogXCJwZGZcIixcblx0XHRcdFx0XHRcdFx0b3B0czoge1xuXHRcdFx0XHRcdFx0XHRcdGlmcmFtZToge1xuXHRcdFx0XHRcdFx0XHRcdFx0cHJlbG9hZDogZmFsc2Vcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoc3JjLmNoYXJBdCgwKSA9PT0gXCIjXCIpIHtcblx0XHRcdFx0XHRcdHR5cGUgPSBcImlubGluZVwiO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICh0eXBlKSB7XG5cdFx0XHRcdFx0b2JqLnR5cGUgPSB0eXBlO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHNlbGYudHJpZ2dlcihcIm9iamVjdE5lZWRzVHlwZVwiLCBvYmopO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCFvYmouY29udGVudFR5cGUpIHtcblx0XHRcdFx0XHRvYmouY29udGVudFR5cGUgPSAkLmluQXJyYXkob2JqLnR5cGUsIFtcImh0bWxcIiwgXCJpbmxpbmVcIiwgXCJhamF4XCJdKSA+IC0xID8gXCJodG1sXCIgOiBvYmoudHlwZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFN0ZXAgMyAtIFNvbWUgYWRqdXN0bWVudHNcblx0XHRcdFx0Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdFx0XHRcdG9iai5pbmRleCA9IHNlbGYuZ3JvdXAubGVuZ3RoO1xuXG5cdFx0XHRcdGlmIChvYmoub3B0cy5zbWFsbEJ0biA9PSBcImF1dG9cIikge1xuXHRcdFx0XHRcdG9iai5vcHRzLnNtYWxsQnRuID0gJC5pbkFycmF5KG9iai50eXBlLCBbXCJodG1sXCIsIFwiaW5saW5lXCIsIFwiYWpheFwiXSkgPiAtMTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChvYmoub3B0cy50b29sYmFyID09PSBcImF1dG9cIikge1xuXHRcdFx0XHRcdG9iai5vcHRzLnRvb2xiYXIgPSAhb2JqLm9wdHMuc21hbGxCdG47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBGaW5kIHRodW1ibmFpbCBpbWFnZSwgY2hlY2sgaWYgZXhpc3RzIGFuZCBpZiBpcyBpbiB0aGUgdmlld3BvcnRcblx0XHRcdFx0b2JqLiR0aHVtYiA9IG9iai5vcHRzLiR0aHVtYiB8fCBudWxsO1xuXG5cdFx0XHRcdGlmIChvYmoub3B0cy4kdHJpZ2dlciAmJiBvYmouaW5kZXggPT09IHNlbGYub3B0cy5pbmRleCkge1xuXHRcdFx0XHRcdG9iai4kdGh1bWIgPSBvYmoub3B0cy4kdHJpZ2dlci5maW5kKFwiaW1nOmZpcnN0XCIpO1xuXG5cdFx0XHRcdFx0aWYgKG9iai4kdGh1bWIubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRvYmoub3B0cy4kb3JpZyA9IG9iai5vcHRzLiR0cmlnZ2VyO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICghKG9iai4kdGh1bWIgJiYgb2JqLiR0aHVtYi5sZW5ndGgpICYmIG9iai5vcHRzLiRvcmlnKSB7XG5cdFx0XHRcdFx0b2JqLiR0aHVtYiA9IG9iai5vcHRzLiRvcmlnLmZpbmQoXCJpbWc6Zmlyc3RcIik7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAob2JqLiR0aHVtYiAmJiAhb2JqLiR0aHVtYi5sZW5ndGgpIHtcblx0XHRcdFx0XHRvYmouJHRodW1iID0gbnVsbDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdG9iai50aHVtYiA9IG9iai5vcHRzLnRodW1iIHx8IChvYmouJHRodW1iID8gb2JqLiR0aHVtYlswXS5zcmMgOiBudWxsKTtcblxuXHRcdFx0XHQvLyBcImNhcHRpb25cIiBpcyBhIFwic3BlY2lhbFwiIG9wdGlvbiwgaXQgY2FuIGJlIHVzZWQgdG8gY3VzdG9taXplIGNhcHRpb24gcGVyIGdhbGxlcnkgaXRlbVxuXHRcdFx0XHRpZiAoJC50eXBlKG9iai5vcHRzLmNhcHRpb24pID09PSBcImZ1bmN0aW9uXCIpIHtcblx0XHRcdFx0XHRvYmoub3B0cy5jYXB0aW9uID0gb2JqLm9wdHMuY2FwdGlvbi5hcHBseShpdGVtLCBbc2VsZiwgb2JqXSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoJC50eXBlKHNlbGYub3B0cy5jYXB0aW9uKSA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRcdFx0b2JqLm9wdHMuY2FwdGlvbiA9IHNlbGYub3B0cy5jYXB0aW9uLmFwcGx5KGl0ZW0sIFtzZWxmLCBvYmpdKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIE1ha2Ugc3VyZSB3ZSBoYXZlIGNhcHRpb24gYXMgYSBzdHJpbmcgb3IgalF1ZXJ5IG9iamVjdFxuXHRcdFx0XHRpZiAoIShvYmoub3B0cy5jYXB0aW9uIGluc3RhbmNlb2YgJCkpIHtcblx0XHRcdFx0XHRvYmoub3B0cy5jYXB0aW9uID0gb2JqLm9wdHMuY2FwdGlvbiA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IG9iai5vcHRzLmNhcHRpb24gKyBcIlwiO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQ2hlY2sgaWYgdXJsIGNvbnRhaW5zIFwiZmlsdGVyXCIgdXNlZCB0byBmaWx0ZXIgdGhlIGNvbnRlbn
6780Rcblx0XHRcdFx0Ly8gRXhhbXBsZTogXCJhamF4Lmh0bWwgI3NvbWV0aGluZ1wiXG5cdFx0XHRcdGlmIChvYmoudHlwZSA9PT0gXCJhamF4XCIpIHtcblx0XHRcdFx0XHRzcmNQYXJ0cyA9IHNyYy5zcGxpdCgvXFxzKy8sIDIpO1xuXG5cdFx0XHRcdFx0aWYgKHNyY1BhcnRzLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0XHRcdG9iai5zcmMgPSBzcmNQYXJ0cy5zaGlmdCgpO1xuXG5cdFx0XHRcdFx0XHRvYmoub3B0cy5maWx0ZXIgPSBzcmNQYXJ0cy5zaGlmdCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEhpZGUgYWxsIGJ1dHRvbnMgYW5kIGRpc2FibGUgaW50ZXJhY3Rpdml0eSBmb3IgbW9kYWwgaXRlbXNcblx0XHRcdFx0aWYgKG9iai5vcHRzLm1vZGFsKSB7XG5cdFx0XHRcdFx0b2JqLm9wdHMgPSAkLmV4dGVuZCh0cnVlLCBvYmoub3B0cywge1xuXHRcdFx0XHRcdFx0dHJhcEZvY3VzOiB0cnVlLFxuXHRcdFx0XHRcdFx0Ly8gUmVtb3ZlIGJ1dHRvbnNcblx0XHRcdFx0XHRcdGluZm9iYXI6IDAsXG5cdFx0XHRcdFx0XHR0b29sYmFyOiAwLFxuXG5cdFx0XHRcdFx0XHRzbWFsbEJ0bjogMCxcblxuXHRcdFx0XHRcdFx0Ly8gRGlzYWJsZSBrZXlib2FyZCBuYXZpZ2F0aW9uXG5cdFx0XHRcdFx0XHRrZXlib2FyZDogMCxcblxuXHRcdFx0XHRcdFx0Ly8gRGlzYWJsZSBzb21lIG1vZHVsZXNcblx0XHRcdFx0XHRcdHNsaWRlU2hvdzogMCxcblx0XHRcdFx0XHRcdGZ1bGxTY3JlZW46IDAsXG5cdFx0XHRcdFx0XHR0aHVtYnM6IDAsXG5cdFx0XHRcdFx0XHR0b3VjaDogMCxcblxuXHRcdFx0XHRcdFx0Ly8gRGlzYWJsZSBjbGljayBldmVudCBoYW5kbGVyc1xuXHRcdFx0XHRcdFx0Y2xpY2tDb250ZW50OiBmYWxzZSxcblx0XHRcdFx0XHRcdGNsaWNrU2xpZGU6IGZhbHNlLFxuXHRcdFx0XHRcdFx0Y2xpY2tPdXRzaWRlOiBmYWxzZSxcblx0XHRcdFx0XHRcdGRibGNsaWNrQ29udGVudDogZmFsc2UsXG5cdFx0XHRcdFx0XHRkYmxjbGlja1NsaWRlOiBmYWxzZSxcblx0XHRcdFx0XHRcdGRibGNsaWNrT3V0c2lkZTogZmFsc2Vcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFN0ZXAgNCAtIEFkZCBwcm9jZXNzZWQgb2JqZWN0IHRvIGdyb3VwXG5cdFx0XHRcdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblx0XHRcdFx0c2VsZi5ncm91cC5wdXNoKG9iaik7XG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gVXBkYXRlIGNvbnRyb2xzIGlmIGdhbGxlcnkgaXMgYWxyZWFkeSBvcGVuZWRcblx0XHRcdGlmIChPYmplY3Qua2V5cyhzZWxmLnNsaWRlcykubGVuZ3RoKSB7XG5cdFx0XHRcdHNlbGYudXBkYXRlQ29udHJvbHMoKTtcblxuXHRcdFx0XHQvLyBVcGRhdGUgdGh1bWJuYWlscywgaWYgbmVlZGVkXG5cdFx0XHRcdHRodW1icyA9IHNlbGYuVGh1bWJzO1xuXG5cdFx0XHRcdGlmICh0aHVtYnMgJiYgdGh1bWJzLmlzQWN0aXZlKSB7XG5cdFx0XHRcdFx0dGh1bWJzLmNyZWF0ZSgpO1xuXG5cdFx0XHRcdFx0dGh1bWJzLmZvY3VzKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0Ly8gQXR0YWNoIGFuIGV2ZW50IGhhbmRsZXIgZnVuY3Rpb25zIGZvcjpcblx0XHQvLyAgIC0gbmF2aWdhdGlvbiBidXR0b25zXG5cdFx0Ly8gICAtIGJyb3dzZXIgc2Nyb2xsaW5nLCByZXNpemluZztcblx0XHQvLyAgIC0gZm9jdXNpbmdcblx0XHQvLyAgIC0ga2V5Ym9hcmRcblx0XHQvLyAgIC0gZGV0ZWN0aW5nIGluYWN0aXZpdHlcblx0XHQvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdFx0YWRkRXZlbnRzOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHR2YXIgc2VsZiA9IHRoaXM7XG5cblx0XHRcdHNlbGYucmVtb3ZlRXZlbnRzKCk7XG5cblx0XHRcdC8vIE1ha2UgbmF2aWdhdGlvbiBlbGVtZW50cyBjbGlja2FibGVcblx0XHRcdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHRcdFx0c2VsZi4kcmVmcy5jb250YWluZXJcblx0XHRcdFx0Lm9uKFwiY2xpY2suZmItY2xvc2VcIiwgXCJbZGF0YS1mYW5jeWJveC1jbG9zZV1cIiwgZnVuY3Rpb24gKGUpIHtcblx0XHRcdFx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcblxuXHRcdFx0XHRcdHNlbGYuY2xvc2UoZSk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5vbihcInRvdWNoc3RhcnQuZmItcHJldiBjbGljay5mYi1wcmV2XCIsIFwiW2Rh
6780dGEtZmFuY3lib3gtcHJldl1cIiwgZnVuY3Rpb24gKGUpIHtcblx0XHRcdFx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcblxuXHRcdFx0XHRcdHNlbGYucHJldmlvdXMoKTtcblx0XHRcdFx0fSlcblx0XHRcdFx0Lm9uKFwidG91Y2hzdGFydC5mYi1uZXh0IGNsaWNrLmZiLW5leHRcIiwgXCJbZGF0YS1mYW5jeWJveC1uZXh0XVwiLCBmdW5jdGlvbiAoZSkge1xuXHRcdFx0XHRcdGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG5cdFx0XHRcdFx0c2VsZi5uZXh0KCk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5vbihcImNsaWNrLmZiXCIsIFwiW2RhdGEtZmFuY3lib3gtem9vbV1cIiwgZnVuY3Rpb24gKGUpIHtcblx0XHRcdFx0XHQvLyBDbGljayBoYW5kbGVyIGZvciB6b29tIGJ1dHRvblxuXHRcdFx0XHRcdHNlbGZbc2VsZi5pc1NjYWxlZERvd24oKSA/IFwic2NhbGVUb0FjdHVhbFwiIDogXCJzY2FsZVRvRml0XCJdKCk7XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHQvLyBIYW5kbGUgcGFnZSBzY3JvbGxpbmcgYW5kIGJyb3dzZXIgcmVzaXppbmdcblx0XHRcdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdFx0XHQkVy5vbihcIm9yaWVudGF0aW9uY2hhbmdlLmZiIHJlc2l6ZS5mYlwiLCBmdW5jdGlvbiAoZSkge1xuXHRcdFx0XHRpZiAoZSAmJiBlLm9yaWdpbmFsRXZlbnQgJiYgZS5vcmlnaW5hbEV2ZW50LnR5cGUgPT09IFwicmVzaXplXCIpIHtcblx0XHRcdFx0XHRpZiAoc2VsZi5yZXF1ZXN0SWQpIHtcblx0XHRcdFx0XHRcdGNhbmNlbEFGcmFtZShzZWxmLnJlcXVlc3RJZCk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0c2VsZi5yZXF1ZXN0SWQgPSByZXF1ZXN0QUZyYW1lKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdHNlbGYudXBkYXRlKGUpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGlmIChzZWxmLmN1cnJlbnQgJiYgc2VsZi5jdXJyZW50LnR5cGUgPT09IFwiaWZyYW1lXCIpIHtcblx0XHRcdFx0XHRcdHNlbGYuJHJlZnMuc3RhZ2UuaGlkZSgpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHNldFRpbWVvdXQoXG5cdFx0XHRcdFx0XHRmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdHNlbGYuJHJlZnMuc3RhZ2Uuc2hvdygpO1xuXG5cdFx0XHRcdFx0XHRcdHNlbGYudXBkYXRlKGUpO1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdCQuZmFuY3lib3guaXNNb2JpbGUgPyA2MDAgOiAyNTBcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0JEQub24oXCJrZXlkb3duLmZiXCIsIGZ1bmN0aW9uIChlKSB7XG5cdFx0XHRcdHZhciBpbnN0YW5jZSA9ICQuZmFuY3lib3ggPyAkLmZhbmN5Ym94LmdldEluc3RhbmNlKCkgOiBudWxsLFxuXHRcdFx0XHRcdGN1cnJlbnQgPSBpbnN0YW5jZS5jdXJyZW50LFxuXHRcdFx0XHRcdGtleWNvZGUgPSBlLmtleUNvZGUgfHwgZS53aGljaDtcblxuXHRcdFx0XHQvLyBUcmFwIGtleWJvYXJkIGZvY3VzIGluc2lkZSBvZiB0aGUgbW9kYWxcblx0XHRcdFx0Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblx0XHRcdFx0aWYgKGtleWNvZGUgPT0gOSkge1xuXHRcdFx0XHRcdGlmIChjdXJyZW50Lm9wdHMudHJhcEZvY3VzKSB7XG5cdFx0XHRcdFx0XHRzZWxmLmZvY3VzKGUpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEVuYWJsZSBrZXlib2FyZCBuYXZpZ2F0aW9uXG5cdFx0XHRcdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblx0XHRcdFx0aWYgKCFjdXJyZW50Lm9wdHMua2V5Ym9hcmQgfHwgZS5jdHJsS2V5IHx8IGUuYWx0S2V5IHx8IGUuc2hpZnRLZXkgfHwgJChlLnRhcmdldCkuaXMoXCJpbnB1dCx0ZXh0YXJlYSx2aWRlbyxhdWRpbyxzZWxlY3RcIikpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBCYWNrc3BhY2UgYW5kIEVzYyBrZXlzXG5cdFx0XHRcdGlmIChrZXljb2RlID09PSA4IHx8IGtleWNvZGUgPT09IDI3KSB7XG5cdFx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG5cdFx0XHRcdFx0c2VsZi5jbG9zZShlKTtcblxuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIExlZnQgYXJyb3cgYW5kIFVwIGFycm93XG5cdFx0XHRcdGlmIChrZXljb2RlID09PSAzNyB8fCBrZXljb2RlID09PSAzOCkge1xuXHRcdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcblxuXHRcdFx0XHRcdHNlbGYucHJldmlvdXMoKTtcblxuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFJpZ2ggYXJyb3cgYW5kIERvd24gYXJyb3dcblx0XHRcdFx0aWYgKGtleWNvZGUgPT09IDM5IHx8IGtleWNvZGUgPT09IDQwKSB7XG5cdFx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG5cdFx0XHRcdFx0c2VsZi5uZXh0KCk7XG5cblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRzZWxmLnRyaWdnZXIoXCJhZnRlcktleWRvd25cIiwgZSwga2V5Y29kZSk7XG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gSGlkZSBjb250cm9scyBhZnRlciBzb21lIGluYWN0aXZpdHkgcGVyaW9kXG5cdFx0XHRpZiAoc2VsZi5ncm91cFtzZWxmLmN1cnJJbmRleF0ub3B0cy5pZGxlVGltZSkge1xuXHRcdFx0XHRzZWxmLmlkbGVTZWNvbmRzQ291bnRlciA9IDA7XG5cblx0XHRcdFx0JEQub24oXG5cdFx0XHRcdFx0XCJtb3VzZW1vdmUuZmItaWRsZSBtb3VzZWxlYXZlLmZiLWlkbGUgbW91c2Vkb3duLmZiLWlkbGUgdG91Y2hzdGFydC5mYi1pZGxlIHRvdWNobW92ZS5mYi1pZGxlIHNjcm9sbC5mYi1pZGxlIGtleWRvd24uZmItaWRsZVwiLFxuXHRcdFx0XHRcdGZ1bmN0aW9uIChlKSB7XG5cdFx0XHRcdFx0XHRzZWxmLmlkbGVTZWNvbmRzQ291bnRlciA9IDA7XG5cblx0XHRcdFx0XHRcdGlmIChzZWxmLmlzSWRsZSkge1xuXHRcdFx0XHRcdFx0XHRzZWxmLnNob3dDb250cm9scygpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRzZWxmLmlzSWRsZSA9IGZhbHNlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0KTtcblxuXHRcdFx0XHRzZWxmLmlkbGVJbnRlcnZhbCA9IHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0c2VsZi5pZGxlU2Vjb25kc0NvdW50ZXIrKztcblxuXHRcdFx0XHRcdGlmIChzZWxmLmlkbGVTZWNvbmRzQ291bnRlciA+PSBzZWxmLmdyb3VwW3NlbGYuY3VyckluZGV4XS5vcHRzLmlkbGVUaW
67801lICYmICFzZWxmLmlzRHJhZ2dpbmcpIHtcblx0XHRcdFx0XHRcdHNlbGYuaXNJZGxlID0gdHJ1ZTtcblx0XHRcdFx0XHRcdHNlbGYuaWRsZVNlY29uZHNDb3VudGVyID0gMDtcblxuXHRcdFx0XHRcdFx0c2VsZi5oaWRlQ29udHJvbHMoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sIDEwMDApO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQvLyBSZW1vdmUgZXZlbnRzIGFkZGVkIGJ5IHRoZSBjb3JlXG5cdFx0Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdFx0cmVtb3ZlRXZlbnRzOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHR2YXIgc2VsZiA9IHRoaXM7XG5cblx0XHRcdCRXLm9mZihcIm9yaWVudGF0aW9uY2hhbmdlLmZiIHJlc2l6ZS5mYlwiKTtcblx0XHRcdCRELm9mZihcImtleWRvd24uZmIgLmZiLWlkbGVcIik7XG5cblx0XHRcdHRoaXMuJHJlZnMuY29udGFpbmVyLm9mZihcIi5mYi1jbG9zZSAuZmItcHJldiAuZmItbmV4dFwiKTtcblxuXHRcdFx0aWYgKHNlbGYuaWRsZUludGVydmFsKSB7XG5cdFx0XHRcdHdpbmRvdy5jbGVhckludGVydmFsKHNlbGYuaWRsZUludGVydmFsKTtcblxuXHRcdFx0XHRzZWxmLmlkbGVJbnRlcnZhbCA9IG51bGw7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdC8vIENoYW5nZSB0byBwcmV2aW91cyBnYWxsZXJ5IGl0ZW1cblx0XHQvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblx0XHRwcmV2aW91czogZnVuY3Rpb24gKGR1cmF0aW9uKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5qdW1wVG8odGhpcy5jdXJyUG9zIC0gMSwgZHVyYXRpb24pO1xuXHRcdH0sXG5cblx0XHQvLyBDaGFuZ2UgdG8gbmV4dCBnYWxsZXJ5IGl0ZW1cblx0XHQvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHRcdG5leHQ6IGZ1bmN0aW9uIChkdXJhdGlvbikge1xuXHRcdFx0cmV0dXJuIHRoaXMuanVtcFRvKHRoaXMuY3VyclBvcyArIDEsIGR1cmF0aW9uKTtcblx0XHR9LFxuXG5cdFx0Ly8gU3dpdGNoIHRvIHNlbGVjdGVkIGdhbGxlcnkgaXRlbVxuXHRcdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHRcdGp1bXBUbzogZnVuY3Rpb24gKHBvcywgZHVyYXRpb24pIHtcblx0XHRcdHZhciBzZWxmID0gdGhpcyxcblx0XHRcdFx0Z3JvdXBMZW4gPSBzZWxmLmdyb3VwLmxlbmd0aCxcblx0XHRcdFx0Zmlyc3RSdW4sXG5cdFx0XHRcdGlzTW92ZWQsXG5cdFx0XHRcdGxvb3AsXG5cdFx0XHRcdGN1cnJlbnQsXG5cdFx0XHRcdHByZXZpb3VzLFxuXHRcdFx0XHRzbGlkZVBvcyxcblx0XHRcdFx0c3RhZ2VQb3MsXG5cdFx0XHRcdHByb3AsXG5cdFx0XHRcdGRpZmY7XG5cblx0XHRcdGlmIChzZWxmLmlzRHJhZ2dpbmcgfHwgc2VsZi5pc0Nsb3NpbmcgfHwgKHNlbGYuaXNBbmltYXRpbmcgJiYgc2VsZi5maXJzdFJ1bikpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTaG91bGQgbG9vcD9cblx0XHRcdHBvcyA9IHBhcnNlSW50KHBvcywgMTApO1xuXHRcdFx0bG9vcCA9IHNlbGYuY3VycmVudCA/IHNlbGYuY3VycmVudC5vcHRzLmxvb3AgOiBzZWxmLm9wdHMubG9vcDtcblxuXHRcdFx0aWYgKCFsb29wICYmIChwb3MgPCAwIHx8IHBvcyA+PSBncm91cExlbikpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDaGVjayBpZiBvcGVuaW5nIGZvciB0aGUgZmlyc3QgdGltZTsgdGhpcyBoZWxwcyB0byBzcGVlZCB0aGluZ3MgdXBcblx0XHRcdGZpcnN0UnVuID0gc2VsZi5maXJzdFJ1biA9ICFPYmplY3Qua2V5cyhzZWxmLnNsaWRlcykubGVuZ3RoO1xuXG5cdFx0XHQvLyBDcmVhdGUgc2xpZGVzXG5cdFx0XHRwcmV2aW91cyA9IHNlbGYuY3VycmVudDtcblxuXHRcdFx0c2VsZi5wcmV2SW5kZXggPSBzZWxmLmN1cnJJbmRleDtcblx0XHRcdHNlbGYucHJldlBvcyA9IHNlbGYuY3VyclBvcztcblxuXHRcdFx0Y3VycmVudCA9IHNlbGYuY3JlYXRlU2xpZGUocG9zKTtcblxuXHRcdFx0aWYgKGdyb3VwTGVuID4gMSkge1xuXHRcdFx0XHRpZiAobG9vcCB8fCBjdXJyZW50LmluZGV4IDwgZ3JvdXBMZW4gLSAxKSB7XG5cdFx0XHRcdFx0c2VsZi5jcmVhdGVTbGlkZShwb3MgKyAxKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChsb29wIHx8IGN1cnJlbnQuaW5kZXggPiAwKSB7XG5cdFx0XHRcdFx0c2VsZi5jcmVhdGVTbGlkZShwb3MgLSAxKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRzZWxmLmN1cnJlbnQgPSBjdXJyZW50O1xuXHRcdFx0c2VsZi5jdXJySW5kZXggPSBjdXJyZW50LmluZGV4O1xuXHRcdFx0c2VsZi5jdXJyUG9zID0gY3VycmVudC5wb3M7XG5cblx0XHRcdHNlbGYudHJpZ2dlcihcImJlZm9yZVNob3dcIiwgZmlyc3RSdW4pO1xuXG5cdFx0XHRzZWxmLnVwZGF0ZUNvbnRyb2xzKCk7XG5cblx0XHRcdC8vIFZhbGlkYXRlIGR1cmF0aW9uIGxlbmd0aFxuXHRcdFx0Y3VycmVudC5mb3JjZWREdXJhdGlvbiA9IHVuZGVmaW5lZDtcblxuXHRcdFx0aWYgKCQuaXNOdW1lcmljKGR1cmF0aW9uKSkge1xuXHRcdFx0XHRjdXJyZW50LmZvcmNlZER1cmF0aW9uID0gZHVyYXRpb247XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRkdXJhdGlvbiA9IGN1cnJlbnQub3B0c1tmaXJzdFJ1biA/IFwiYW5pbWF0aW9uRHVyYXRpb25cIiA6IFwidHJhbnNpdGlvbkR1cmF0aW9uXCJdO1xuXHRcdFx0fVxuXG5cdFx0XHRkdXJhdGlvbiA9IHBhcnNlSW50KGR1cmF0aW9uLCAxMCk7XG5cblx0XHRcdC8vIENoZWNrIGlmIHVzZXIgaGFzIHN3aXBlZCB0aGUgc2xpZGVzIG9yIGlmIHN0aWxsIGFuaW1hdGluZ1xuXHRcdFx0aXNNb3ZlZCA9IHNlbGYuaXNNb3ZlZChjdXJyZW50KTtcblxuXHRcdFx0Ly8gTWFrZSBzdXJlIGN1cnJlbnQgc2xpZGUgaXMgdmlzaWJsZVxuXHRcdFx0Y3VycmVudC4kc2xpZGUuYWRkQ2xhc3MoXCJmYW5jeWJveC1zbGlkZS0tY3VycmVudFwiKTtcblxuXHRcdFx0Ly8gRnJlc2ggc3RhcnQgLSByZXZlYWwgY29udGFpbmVyLCBjdXJyZW50IHNsaWRlIGFuZCBzdGFydCBsb2FkaW5nIGNvbnRlbnRcblx0XHRcdGlmIChmaXJzdFJ1bikge1xuXHRcdFx0XHRpZiAoY3VycmVudC5vcHRzLmFuaW1hdGlvbkVmZmVjdCAmJi
6780BkdXJhdGlvbikge1xuXHRcdFx0XHRcdHNlbGYuJHJlZnMuY29udGFpbmVyLmNzcyhcInRyYW5zaXRpb24tZHVyYXRpb25cIiwgZHVyYXRpb24gKyBcIm1zXCIpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0c2VsZi4kcmVmcy5jb250YWluZXIuYWRkQ2xhc3MoXCJmYW5jeWJveC1pcy1vcGVuXCIpLnRyaWdnZXIoXCJmb2N1c1wiKTtcblxuXHRcdFx0XHQvLyBBdHRlbXB0IHRvIGxvYWQgY29udGVudCBpbnRvIHNsaWRlXG5cdFx0XHRcdC8vIFRoaXMgd2lsbCBsYXRlciBjYWxsIGBhZnRlckxvYWRgIC0+IGByZXZlYWxDb250ZW50YFxuXHRcdFx0XHRzZWxmLmxvYWRTbGlkZShjdXJyZW50KTtcblxuXHRcdFx0XHRzZWxmLnByZWxvYWQoXCJpbWFnZVwiKTtcblxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIEdldCBhY3R1YWwgc2xpZGUvc3RhZ2UgcG9zaXRpb25zIChiZWZvcmUgY2xlYW5pbmcgdXApXG5cdFx0XHRzbGlkZVBvcyA9ICQuZmFuY3lib3guZ2V0VHJhbnNsYXRlKHByZXZpb3VzLiRzbGlkZSk7XG5cdFx0XHRzdGFnZVBvcyA9ICQuZmFuY3lib3guZ2V0VHJhbnNsYXRlKHNlbGYuJHJlZnMuc3RhZ2UpO1xuXG5cdFx0XHQvLyBDbGVhbiB1cCBhbGwgc2xpZGVzXG5cdFx0XHQkLmVhY2goc2VsZi5zbGlkZXMsIGZ1bmN0aW9uIChpbmRleCwgc2xpZGUpIHtcblx0XHRcdFx0JC5mYW5jeWJveC5zdG9wKHNsaWRlLiRzbGlkZSwgdHJ1ZSk7XG5cdFx0XHR9KTtcblxuXHRcdFx0aWYgKHByZXZpb3VzLnBvcyAhPT0gY3VycmVudC5wb3MpIHtcblx0XHRcdFx0cHJldmlvdXMuaXNDb21wbGV0ZSA9IGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHRwcmV2aW91cy4kc2xpZGUucmVtb3ZlQ2xhc3MoXCJmYW5jeWJveC1zbGlkZS0tY29tcGxldGUgZmFuY3lib3gtc2xpZGUtLWN1cnJlbnRcIik7XG5cblx0XHRcdC8vIElmIHNsaWRlcyBhcmUgb3V0IG9mIHBsYWNlLCB0aGVuIGFuaW1hdGUgdGhlbSB0byBjb3JyZWN0IHBvc2l0aW9uXG5cdFx0XHRpZiAoaXNNb3ZlZCkge1xuXHRcdFx0XHQvLyBDYWxjdWxhdGUgaG9yaXpvbnRhbCBzd2lwZSBkaXN0YW5jZVxuXHRcdFx0XHRkaWZmID0gc2xpZGVQb3MubGVmdCAtIChwcmV2aW91cy5wb3MgKiBzbGlkZVBvcy53aWR0aCArIHByZXZpb3VzLnBvcyAqIHByZXZpb3VzLm9wdHMuZ3V0dGVyKTtcblxuXHRcdFx0XHQkLmVhY2goc2VsZi5zbGlkZXMsIGZ1bmN0aW9uIChpbmRleCwgc2xpZGUpIHtcblx0XHRcdFx0XHRzbGlkZS4kc2xpZGUucmVtb3ZlQ2xhc3MoXCJmYW5jeWJveC1hbmltYXRlZFwiKS5yZW1vdmVDbGFzcyhmdW5jdGlvbiAoaW5kZXgsIGNsYXNzTmFtZSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIChjbGFzc05hbWUubWF0Y2goLyhefFxccylmYW5jeWJveC1meC1cXFMrL2cpIHx8IFtdKS5qb2luKFwiIFwiKTtcblx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdC8vIE1ha2Ugc3VyZSB0aGF0IGVhY2ggc2xpZGUgaXMgaW4gZXF1YWwgZGlzdGFuY2Vcblx0XHRcdFx0XHQvLyBUaGlzIGlzIG1vc3RseSBuZWVkZWQgZm9yIGZyZXNobHkgYWRkZWQgc2xpZGVzLCBiZWNhdXNlIHRoZXkgYXJlIG5vdCB5ZXQgcG9zaXRpb25lZFxuXHRcdFx0XHRcdHZhciBsZWZ0UG9zID0gc2xpZGUucG9zICogc2xpZGVQb3Mud2lkdGggKyBzbGlkZS5wb3MgKiBzbGlkZS5vcHRzLmd1dHRlcjtcblxuXHRcdFx0XHRcdCQuZmFuY3lib3guc2V0VHJhbnNsYXRlKHNsaWRlLiRzbGlkZSwge1xuXHRcdFx0XHRcdFx0dG9wOiAwLFxuXHRcdFx0XHRcdFx0bGVmdDogbGVmdFBvcyAtIHN0YWdlUG9zLmxlZnQgKyBkaWZmXG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRpZiAoc2xpZGUucG9zICE9PSBjdXJyZW50LnBvcykge1xuXHRcdFx0XHRcdFx0c2xpZGUuJHNsaWRlLmFkZENsYXNzKFwiZmFuY3lib3gtc2xpZGUtLVwiICsgKHNsaWRlLnBvcyA+IGN1cnJlbnQucG9zID8gXCJuZXh0XCIgOiBcInByZXZpb3VzXCIpKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBSZWRyYXcgdG8gbWFrZSBzdXJlIHRoYXQgdHJhbnNpdGlvbiB3aWxsIHN0YXJ0XG5cdFx0XHRcdFx0Zm9yY2VSZWRyYXcoc2xpZGUuJHNsaWRlKTtcblxuXHRcdFx0XHRcdC8vIEFuaW1hdGUgdGhlIHNsaWRlXG5cdFx0XHRcdFx0JC5mYW5jeWJveC5hbmltYXRlKFxuXHRcdFx0XHRcdFx0c2xpZGUuJHNsaWRlLCB7XG5cdFx0XHRcdFx0XHRcdHRvcDogMCxcblx0XHRcdFx0XHRcdFx0bGVmdDogKHNsaWRlLnBvcyAtIGN1cnJlbnQucG9zKSAqIHNsaWRlUG9zLndpZHRoICsgKHNsaWRlLnBvcyAtIGN1cnJlbnQucG9zKSAqIHNsaWRlLm9wdHMuZ3V0dGVyXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0ZHVyYXRpb24sXG5cdFx0XHRcdFx0XHRmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdHNsaWRlLiRzbGlkZVxuXHRcdFx0XHRcdFx0XHRcdC5jc3Moe1xuXHRcdFx0XHRcdFx0XHRcdFx0dHJhbnNmb3JtOiBcIlwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0b3BhY2l0eTogXCJcIlxuXHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdFx0LnJlbW92ZUNsYXNzKFwiZmFuY3lib3gtc2xpZGUtLW5leHQgZmFuY3lib3gtc2xpZGUtLXByZXZpb3VzXCIpO1xuXG5cdFx0XHRcdFx0XHRcdGlmIChzbGlkZS5wb3MgPT09IHNlbGYuY3VyclBvcykge1xuXHRcdFx0XHRcdFx0XHRcdHNlbGYuY29tcGxldGUoKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSBlbHNlIGlmIChkdXJhdGlvbiAmJiBjdXJyZW50Lm9wdHMudHJhbnNpdGlvbkVmZmVjdCkge1xuXHRcdFx0XHQvLyBTZXQgdHJhbnNpdGlvbiBlZmZlY3QgZm9yIHByZXZpb3VzbHkgYWN0aXZlIHNsaWRlXG5cdFx0XHRcdHByb3AgPSBcImZhbmN5Ym94LWFuaW1hdGVkIGZhbmN5Ym94LWZ4LVwiICsgY3VycmVudC5vcHRzLnRyYW5zaXRpb25FZmZlY3Q7XG5cblx0XHRcdFx0cHJldmlvdXMuJHNsaWRlLmFkZENsYXNzKFwiZmFuY3lib3gtc2xpZGUtLVwiICsgKHByZXZpb3VzLnBvcyA+IGN1cnJlbnQucG9zID8gXCJuZXh0XCIgOiBcInByZXZpb3VzXCIpKTtcblxuXHRcdFx0XHQkLmZhbmN5Ym94LmFuaW1hdGUoXG5cdFx0XHRcdFx0cHJldmlvdXMuJHNsaWRlLFxuXHRcdFx0XHRcdHByb3AsXG5cdFx0XHRcdFx0ZHVyYXRpb24sXG5cdFx0XHRcdFx0ZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0cHJldmlvdXMuJHNsaWRlLnJlbW92ZUNsYXNzKHByb3ApLnJlbW92ZUNsYXNzKFwiZmFuY3lib3gtc2xpZGUtLW5leHQgZmFuY3lib3gtc2xpZGUtLXByZXZpb3VzXCIpO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0ZmFsc2Vcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGN1cnJlbnQuaXNMb2FkZWQpIHtcblx0XHRcdFx0c2VsZi5yZXZlYWxDb250ZW50KGN1cnJlbnQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c2VsZi5sb2FkU2xpZGUoY3VycmVudCk7XG5cdFx0XHR9XG5cblx0XHRcdHNlbGYucHJlbG9hZChcImltYWdlXCIpO1xuXHRcdH0sXG5cblx0XHQvLyBDcmVhdGUgbmV3IFwic2xpZGVcIiBlbGVtZW50XG5cdFx0Ly8gVGhlc2UgYXJlIGdhbGxlcnkgaXRlbXMgIHRoYXQgYXJlIGFjdHVhbGx5IGFkZGVkIHRvIERPTVxuXHRcdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHRcdGNyZWF0ZVNsaWRlOiBmdW5jdGlvbiAocG9zKSB7XG5cdFx0XHR2YXIgc2VsZiA9IHRoaXMsXG5cdFx0XHRcdCRzbGlkZSxcblx0XHRcdFx0aW5kZXg7XG5cblx0XHRcdGluZGV4ID0gcG9zICUgc2VsZi5ncm91cC5sZW5ndGg7XG5cdFx0XHRpbmRleCA9IGluZGV4IDwgMCA/IHNlbGYuZ3JvdXAubGVuZ3RoICsgaW5kZXggOiBpbmRleDtcblxuXHRcdFx0aWYgKCFzZWxmLnNsaWRlc1twb3NdICYmIHNlbGYuZ3JvdXBbaW5kZXhdKSB7XG5cdFx0XHRcdCRzbGlkZSA9ICQoJzxkaXYgY2xhc3M9XCJmYW5jeWJveC1zbGlkZVwiPjwvZGl2PicpLmFwcGVuZFRvKHNlbGYuJHJlZnMuc3RhZ2UpO1xuXG5cdFx0XHRcdHNlbGYuc2xpZGVzW3Bvc10gPSAkLmV4dGVuZCh0cnVlLCB7fSwgc2VsZi5ncm91cFtpbmRleF0sIHtcblx0XHRcdFx0XHRwb3M6IHBvcyxcblx0XHRcdFx0XHQkc2xpZGU6ICRzbGlkZSxcblx0XHRcdFx0XHRpc0xvYWRlZDogZmFsc2Vcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0c2VsZi51cGRhdGVTbGlkZShzZWxmLnNsaWRlc1twb3NdKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHNlbGYuc2xpZGVzW3Bvc107XG5cdFx0fSxcblxuXHRcdC8vIFNjYWxlIGltYWdlIHRvIH
6780RoZSBhY3R1YWwgc2l6ZSBvZiB0aGUgaW1hZ2U7XG5cdFx0Ly8geCBhbmQgeSB2YWx1ZXMgc2hvdWxkIGJlIHJlbGF0aXZlIHRvIHRoZSBzbGlkZVxuXHRcdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHRcdHNjYWxlVG9BY3R1YWw6IGZ1bmN0aW9uICh4LCB5LCBkdXJhdGlvbikge1xuXHRcdFx0dmFyIHNlbGYgPSB0aGlzLFxuXHRcdFx0XHRjdXJyZW50ID0gc2VsZi5jdXJyZW50LFxuXHRcdFx0XHQkY29udGVudCA9IGN1cnJlbnQuJGNvbnRlbnQsXG5cdFx0XHRcdGNhbnZhc1dpZHRoID0gJC5mYW5jeWJveC5nZXRUcmFuc2xhdGUoY3VycmVudC4kc2xpZGUpLndpZHRoLFxuXHRcdFx0XHRjYW52YXNIZWlnaHQgPSAkLmZhbmN5Ym94LmdldFRyYW5zbGF0ZShjdXJyZW50LiRzbGlkZSkuaGVpZ2h0LFxuXHRcdFx0XHRuZXdJbWdXaWR0aCA9IGN1cnJlbnQud2lkdGgsXG5cdFx0XHRcdG5ld0ltZ0hlaWdodCA9IGN1cnJlbnQuaGVpZ2h0LFxuXHRcdFx0XHRpbWdQb3MsXG5cdFx0XHRcdHBvc1gsXG5cdFx0XHRcdHBvc1ksXG5cdFx0XHRcdHNjYWxlWCxcblx0XHRcdFx0c2NhbGVZO1xuXG5cdFx0XHRpZiAoc2VsZi5pc0FuaW1hdGluZyB8fCBzZWxmLmlzTW92ZWQoKSB8fCAhJGNvbnRlbnQgfHwgIShjdXJyZW50LnR5cGUgPT0gXCJpbWFnZVwiICYmIGN1cnJlbnQuaXNMb2FkZWQgJiYgIWN1cnJlbnQuaGFzRXJyb3IpKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0c2VsZi5pc0FuaW1hdGluZyA9IHRydWU7XG5cblx0XHRcdCQuZmFuY3lib3guc3RvcCgkY29udGVudCk7XG5cblx0XHRcdHggPSB4ID09PSB1bmRlZmluZWQgPyBjYW52YXNXaWR0aCAqIDAuNSA6IHg7XG5cdFx0XHR5ID0geSA9PT0gdW5kZWZpbmVkID8gY2FudmFzSGVpZ2h0ICogMC41IDogeTtcblxuXHRcdFx0aW1nUG9zID0gJC5mYW5jeWJveC5nZXRUcmFuc2xhdGUoJGNvbnRlbnQpO1xuXG5cdFx0XHRpbWdQb3MudG9wIC09ICQuZmFuY3lib3guZ2V0VHJhbnNsYXRlKGN1cnJlbnQuJHNsaWRlKS50b3A7XG5cdFx0XHRpbWdQb3MubGVmdCAtPSAkLmZhbmN5Ym94LmdldFRyYW5zbGF0ZShjdXJyZW50LiRzbGlkZSkubGVmdDtcblxuXHRcdFx0c2NhbGVYID0gbmV3SW1nV2lkdGggLyBpbWdQb3Mud2lkdGg7XG5cdFx0XHRzY2FsZVkgPSBuZXdJbWdIZWlnaHQgLyBpbWdQb3MuaGVpZ2h0O1xuXG5cdFx0XHQvLyBHZXQgY2VudGVyIHBvc2l0aW9uIGZvciBvcmlnaW5hbCBpbWFnZVxuXHRcdFx0cG9zWCA9IGNhbnZhc1dpZHRoICogMC41IC0gbmV3SW1nV2lkdGggKiAwLjU7XG5cdFx0XHRwb3NZID0gY2FudmFzSGVpZ2h0ICogMC41IC0gbmV3SW1nSGVpZ2h0ICogMC41O1xuXG5cdFx0XHQvLyBNYWtlIHN1cmUgaW1hZ2UgZG9lcyBub3QgbW92ZSBhd2F5IGZyb20gZWRnZXNcblx0XHRcdGlmIChuZXdJbWdXaWR0aCA+IGNhbnZhc1dpZHRoKSB7XG5cdFx0XHRcdHBvc1ggPSBpbWdQb3MubGVmdCAqIHNjYWxlWCAtICh4ICogc2NhbGVYIC0geCk7XG5cblx0XHRcdFx0aWYgKHBvc1ggPiAwKSB7XG5cdFx0XHRcdFx0cG9zWCA9IDA7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAocG9zWCA8IGNhbnZhc1dpZHRoIC0gbmV3SW1nV2lkdGgpIHtcblx0XHRcdFx0XHRwb3NYID0gY2FudmFzV2lkdGggLSBuZXdJbWdXaWR0aDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAobmV3SW1nSGVpZ2h0ID4gY2FudmFzSGVpZ2h0KSB7XG5cdFx0XHRcdHBvc1kgPSBpbWdQb3MudG9wICogc2NhbGVZIC0gKHkgKiBzY2FsZVkgLSB5KTtcblxuXHRcdFx0XHRpZiAocG9zWSA+IDApIHtcblx0XHRcdFx0XHRwb3NZID0gMDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChwb3NZIDwgY2FudmFzSGVpZ2h0IC0gbmV3SW1nSGVpZ2h0KSB7XG5cdFx0XHRcdFx0cG9zWSA9IGNhbnZhc0hlaWdodCAtIG5ld0ltZ0hlaWdodDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRzZWxmLnVwZGF0ZUN1cnNvcihuZXdJbWdXaWR0aCwgbmV3SW1nSGVpZ2h0KTtcblxuXHRcdFx0JC5mYW5jeWJveC5hbmltYXRlKFxuXHRcdFx0XHQkY29udGVudCwge1xuXHRcdFx0XHRcdHRvcDogcG9zWSxcblx0XHRcdFx0XHRsZWZ0OiBwb3NYLFxuXHRcdFx0XHRcdHNjYWxlWDogc2NhbGVYLFxuXHRcdFx0XHRcdHNjYWxlWTogc2NhbGVZXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGR1cmF0aW9uIHx8IDM2Nixcblx0XHRcdFx0ZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHNlbGYuaXNBbmltYXRpbmcgPSBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0KTtcblxuXHRcdFx0Ly8gU3RvcCBzbGlkZXNob3dcblx0XHRcdGlmIChzZWxmLlNsaWRlU2hvdyAmJiBzZWxmLlNsaWRlU2hvdy5pc0FjdGl2ZSkge1xuXHRcdFx0XHRzZWxmLlNsaWRlU2hvdy5zdG9wKCk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdC8vIFNjYWxlIGltYWdlIHRvIGZpdCBpbnNpZGUgcGFyZW50IGVsZW1lbnRcblx0XHQvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblx0XHRzY2FsZVRvRml0OiBmdW5jdGlvbiAoZHVyYXRpb24pIHtcblx0XHRcdHZhciBzZWxmID0gdGhpcyxcblx0XHRcdFx0Y3VycmVudCA9IHNlbGYuY3VycmVudCxcblx0XHRcdFx0JGNvbnRlbnQgPSBjdXJyZW50LiRjb250ZW50LFxuXHRcdFx0XHRlbmQ7XG5cblx0XHRcdGlmIChzZWxmLmlzQW5pbWF0aW5nIHx8IHNlbGYuaXNNb3ZlZCgpIHx8ICEkY29udGVudCB8fCAhKGN1cnJlbnQudHlwZSA9PSBcImltYWdlXCIgJiYgY3VycmVudC5pc0xvYWRlZCAmJiAhY3VycmVudC5oYXNFcnJvcikpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRzZWxmLmlzQW5pbWF0aW5nID0gdHJ1ZTtcblxuXHRcdFx0JC5mYW5jeWJveC5zdG9wKCRjb250ZW50KTtcblxuXHRcdFx0ZW5kID0gc2VsZi5nZXRGaXRQb3MoY3VycmVudCk7XG5cblx0XHRcdHNlbGYudXBkYXRlQ3Vyc29yKGVuZC53aWR0aCwgZW5kLmhlaWdodCk7XG5cblx0XHRcdCQuZmFuY3lib3guYW5pbWF0ZShcblx0XHRcdFx0JGNvbnRlbnQsIHtcblx0XHRcdFx0XHR0b3A6IGVuZC50b3AsXG5cdFx0XHRcdFx0bGVmdDogZW5kLmxlZnQsXG5cdFx0XHRcdFx0c2NhbGVYOiBlbmQud2lkdGggLyAkY29udGVudC53aWR0aCgpLFxuXHRcdFx0XHRcdHNjYWxlWTogZW5kLmhlaWdodCAvICRjb250ZW50LmhlaWdodCgpXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGR1cmF0aW9uIHx8IDM2Nixcblx0XHRcdFx0ZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHNlbGYuaXNBbmltYXRpbmcgPSBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0KTtcblx0XHR9LFxuXG5cdFx0Ly8gQ2FsY3VsYXRlIGltYWdlIHNpemUgdG8gZml0IGluc2lkZSB2aWV3cG9ydFxuXHRcdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHRcdGdldEZpdFBvczogZnVuY3Rpb24gKHNsaWRlKSB7XG5cdFx0XHR2YXIgc2VsZiA9IHRoaXMsXG5cdFx0XHRcdCRjb250ZW50ID0gc2xpZGUuJGNvbnRlbnQsXG5cdFx0XHRcdCRzbGlkZSA9IHNsaWRlLiRzbGlkZSxcblx0XHRcdFx0d2lkdGggPSBzbGlkZS53aWR0aCB8fCBzbGlkZS5vcHRzLndpZHRoLFxuXHRcdFx0XHRoZWlnaHQgPSBzbGlkZS5oZWlnaHQgfHwgc2xpZGUub3B0cy5oZWlnaHQsXG5cdFx0XHRcdG1heFdpZHRoLFxuXHRcdFx0XHRtYXhIZWlnaHQsXG5cdFx0XHRcdG1pblJhdGlvLFxuXHRcdFx0XHRhc3BlY3RSYXRpbyxcblx0XHRcdFx0cmV6ID0ge307XG5cblx0XHRcdGlmICghc2xpZGUuaXNMb2FkZWQgfHwgISRjb250ZW50IHx8ICEkY29udGVudC5sZW5ndGgpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHRtYXhXaWR0aCA9ICQuZmFuY3lib3guZ2V0VHJhbnNsYXRlKHNlbGYuJHJlZnMuc3RhZ2UpLndpZHRoO1xuXHRcdFx0bWF4SGVpZ2h0ID0gJC5mYW5jeWJveC5nZXRUcmFuc2xhdGUoc2VsZi4kcmVmcy5zdGFnZSkuaGVpZ2h0O1xuXG5cdFx0XHRtYXhXaWR0aCAtPVxuXHRcdFx0XHRwYXJzZU
6780Zsb2F0KCRzbGlkZS5jc3MoXCJwYWRkaW5nTGVmdFwiKSkgK1xuXHRcdFx0XHRwYXJzZUZsb2F0KCRzbGlkZS5jc3MoXCJwYWRkaW5nUmlnaHRcIikpICtcblx0XHRcdFx0cGFyc2VGbG9hdCgkY29udGVudC5jc3MoXCJtYXJnaW5MZWZ0XCIpKSArXG5cdFx0XHRcdHBhcnNlRmxvYXQoJGNvbnRlbnQuY3NzKFwibWFyZ2luUmlnaHRcIikpO1xuXG5cdFx0XHRtYXhIZWlnaHQgLT1cblx0XHRcdFx0cGFyc2VGbG9hdCgkc2xpZGUuY3NzKFwicGFkZGluZ1RvcFwiKSkgK1xuXHRcdFx0XHRwYXJzZUZsb2F0KCRzbGlkZS5jc3MoXCJwYWRkaW5nQm90dG9tXCIpKSArXG5cdFx0XHRcdHBhcnNlRmxvYXQoJGNvbnRlbnQuY3NzKFwibWFyZ2luVG9wXCIpKSArXG5cdFx0XHRcdHBhcnNlRmxvYXQoJGNvbnRlbnQuY3NzKFwibWFyZ2luQm90dG9tXCIpKTtcblxuXHRcdFx0aWYgKCF3aWR0aCB8fCAhaGVpZ2h0KSB7XG5cdFx0XHRcdHdpZHRoID0gbWF4V2lkdGg7XG5cdFx0XHRcdGhlaWdodCA9IG1heEhlaWdodDtcblx0XHRcdH1cblxuXHRcdFx0bWluUmF0aW8gPSBNYXRoLm1pbigxLCBtYXhXaWR0aCAvIHdpZHRoLCBtYXhIZWlnaHQgLyBoZWlnaHQpO1xuXG5cdFx0XHR3aWR0aCA9IG1pblJhdGlvICogd2lkdGg7XG5cdFx0XHRoZWlnaHQgPSBtaW5SYXRpbyAqIGhlaWdodDtcblxuXHRcdFx0Ly8gQWRqdXN0IHdpZHRoL2hlaWdodCB0byBwcmVjaXNlbHkgZml0IGludG8gY29udGFpbmVyXG5cdFx0XHRpZiAod2lkdGggPiBtYXhXaWR0aCAtIDAuNSkge1xuXHRcdFx0XHR3aWR0aCA9IG1heFdpZHRoO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoaGVpZ2h0ID4gbWF4SGVpZ2h0IC0gMC41KSB7XG5cdFx0XHRcdGhlaWdodCA9IG1heEhlaWdodDtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHNsaWRlLnR5cGUgPT09IFwiaW1hZ2VcIikge1xuXHRcdFx0XHRyZXoudG9wID0gTWF0aC5mbG9vcigobWF4SGVpZ2h0IC0gaGVpZ2h0KSAqIDAuNSkgKyBwYXJzZUZsb2F0KCRzbGlkZS5jc3MoXCJwYWRkaW5nVG9wXCIpKTtcblx0XHRcdFx0cmV6LmxlZnQgPSBNYXRoLmZsb29yKChtYXhXaWR0aCAtIHdpZHRoKSAqIDAuNSkgKyBwYXJzZUZsb2F0KCRzbGlkZS5jc3MoXCJwYWRkaW5nTGVmdFwiKSk7XG5cdFx0XHR9IGVsc2UgaWYgKHNsaWRlLmNvbnRlbnRUeXBlID09PSBcInZpZGVvXCIpIHtcblx0XHRcdFx0Ly8gRm9yY2UgYXNwZWN0IHJhdGlvIGZvciB0aGUgdmlkZW9cblx0XHRcdFx0Ly8gXCJJIHNheSB0aGUgd2hvbGUgd29ybGQgbXVzdCBsZWFybiBvZiBvdXIgcGVhY2VmdWwgd2F5c+KApiBieSBmb3JjZSFcIlxuXHRcdFx0XHRhc3BlY3RSYXRpbyA9IHNsaWRlLm9wdHMud2lkdGggJiYgc2xpZGUub3B0cy5oZWlnaHQgPyB3aWR0aCAvIGhlaWdodCA6IHNsaWRlLm9wdHMucmF0aW8gfHwgMTYgLyA5O1xuXG5cdFx0XHRcdGlmIChoZWlnaHQgPiB3aWR0aCAvIGFzcGVjdFJhdGlvKSB7XG5cdFx0XHRcdFx0aGVpZ2h0ID0gd2lkdGggLyBhc3BlY3RSYXRpbztcblx0XHRcdFx0fSBlbHNlIGlmICh3aWR0aCA+IGhlaWdodCAqIGFzcGVjdFJhdGlvKSB7XG5cdFx0XHRcdFx0d2lkdGggPSBoZWlnaHQgKiBhc3BlY3RSYXRpbztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXoud2lkdGggPSB3aWR0aDtcblx0XHRcdHJlei5oZWlnaHQgPSBoZWlnaHQ7XG5cblx0XHRcdHJldHVybiByZXo7XG5cdFx0fSxcblxuXHRcdC8vIFVwZGF0ZSBjb250ZW50IHNpemUgYW5kIHBvc2l0aW9uIGZvciBhbGwgc2xpZGVzXG5cdFx0Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdFx0dXBkYXRlOiBmdW5jdGlvbiAoZSkge1xuXHRcdFx0dmFyIHNlbGYgPSB0aGlzO1xuXG5cdFx0XHQkLmVhY2goc2VsZi5zbGlkZXMsIGZ1bmN0aW9uIChrZXksIHNsaWRlKSB7XG5cdFx0XHRcdHNlbGYudXBkYXRlU2xpZGUoc2xpZGUsIGUpO1xuXHRcdFx0fSk7XG5cdFx0fSxcblxuXHRcdC8vIFVwZGF0ZSBzbGlkZSBjb250ZW50IHBvc2l0aW9uIGFuZCBzaXplXG5cdFx0Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHRcdHVwZGF0ZVNsaWRlOiBmdW5jdGlvbiAoc2xpZGUsIGUpIHtcblx0XHRcdHZhciBzZWxmID0gdGhpcyxcblx0XHRcdFx0JGNvbnRlbnQgPSBzbGlkZSAmJiBzbGlkZS4kY29udGVudCxcblx0XHRcdFx0d2lkdGggPSBzbGlkZS53aWR0aCB8fCBzbGlkZS5vcHRzLndpZHRoLFxuXHRcdFx0XHRoZWlnaHQgPSBzbGlkZS5oZWlnaHQgfHwgc2xpZGUub3B0cy5oZWlnaHQsXG5cdFx0XHRcdCRzbGlkZSA9IHNsaWRlLiRzbGlkZTtcblxuXHRcdFx0Ly8gRmlyc3QsIHByZXZlbnQgY2FwdGlvbiBvdmVybGFwLCBpZiBuZWVkZWRcblx0XHRcdHNlbGYuYWRqdXN0Q2FwdGlvbihzbGlkZSk7XG5cblx0XHRcdC8vIFRoZW4gcmVzaXplIGNvbnRlbnQgdG8gZml0IGluc2lkZSB0aGUgc2xpZGVcblx0XHRcdGlmICgkY29udGVudCAmJiAod2lkdGggfHwgaGVpZ2h0IHx8IHNsaWRlLmNvbnRlbnRUeXBlID09PSBcInZpZGVvXCIpICYmICFzbGlkZS5oYXNFcnJvcikge1xuXHRcdFx0XHQkLmZhbmN5Ym94LnN0b3AoJGNvbnRlbnQpO1xuXG5cdFx0XHRcdCQuZmFuY3lib3guc2V0VHJhbnNsYXRlKCRjb250ZW50LCBzZWxmLmdldEZpdFBvcyhzbGlkZSkpO1xuXG5cdFx0XHRcdGlmIChzbGlkZS5wb3MgPT09IHNlbGYuY3VyclBvcykge1xuXHRcdFx0XHRcdHNlbGYuaXNBbmltYXRpbmcgPSBmYWxzZTtcblxuXHRcdFx0XHRcdHNlbGYudXBkYXRlQ3Vyc29yKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gVGhlbiBzb21lIGFkanVzdG1lbnRzXG5cdFx0XHRzZWxmLmFkanVzdExheW91dChzbGlkZSk7XG5cblx0XHRcdGlmICgkc2xpZGUubGVuZ3RoKSB7XG5cdFx0XHRcdCRzbGlkZS50cmlnZ2VyKFwicmVmcmVzaFwiKTtcblxuXHRcdFx0XHRpZiAoc2xpZGUucG9zID09PSBzZWxmLmN1cnJQb3MpIHtcblx0XHRcdFx0XHRzZWxmLiRyZWZzLnRvb2xiYXJcblx0XHRcdFx0XHRcdC5hZGQoc2VsZi4kcmVmcy5uYXZpZ2F0aW9uLmZpbmQoXCIuZmFuY3lib3gtYnV0dG9uLS1hcnJvd19yaWdodFwiKSlcblx0XHRcdFx0XHRcdC50b2dnbGVDbGFzcyhcImNvbXBlbnNhdGUtZm9yLXNjcm9sbGJhclwiLCAkc2xpZGUuZ2V0KDApLnNjcm9sbEhlaWdodCA+ICRzbGlkZS5nZXQoMCkuY2xpZW50SGVpZ2h0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRzZWxmLnRyaWdnZXIoXCJvblVwZGF0ZVwiLCBzbGlkZSwgZSk7XG5cdFx0fSxcblxuXHRcdC8vIEhvcml6b250YWxseSBjZW50ZXIgc2xpZGVcblx0XHQvLyA9PT09PT09PT09PT09PT09PT09PT09PT09XG5cblx0XHRjZW50ZXJTbGlkZTogZnVuY3Rpb24gKGR1cmF0aW9uKSB7XG5cdFx0XHR2YXIgc2VsZiA9IHRoaXMsXG5cdFx0XHRcdGN1cnJlbnQgPSBzZWxmLmN1cnJlbnQsXG5cdFx0XHRcdCRzbGlkZSA9IGN1cnJlbnQuJHNsaWRlO1xuXG5cdFx0XHRpZiAoc2VsZi5pc0Nsb3NpbmcgfHwgIWN1cnJlbnQpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHQkc2xpZGUuc2libGluZ3MoKS5jc3Moe1xuXHRcdFx0XHR0cmFuc2Zvcm06IFwiXCIsXG5cdFx0XHRcdG9wYWNpdHk6IFwiXCJcblx0XHRcdH0pO1xuXG5cdFx0XHQkc2xpZGVcblx0XHRcdFx0LnBhcmVudCgpXG5cdFx0XHRcdC5jaGlsZHJlbigpXG5cdFx0XHRcdC5yZW1vdmVDbGFzcyhcImZhbmN5Ym94LXNsaWRlLS1wcmV2aW91cyBmYW5jeWJveC1zbGlkZS0tbmV4dFwiKTtcblxuXHRcdFx0JC5mYW5jeWJveC5hbmltYXRlKFxuXHRcdFx0XHQkc2xpZGUsIHtcblx0XHRcdFx0XHR0b3A6IDAsXG5cdFx0XHRcdFx0bGVmdDogMCxcblx0XHRcdFx0XHRvcGFjaXR5OiAxXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGR1cmF0aW9uID09PSB1bmRlZmluZWQgPyAwIDogZHVyYXRpb24sXG5cdFx0XHRcdGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHQvLyBDbGVhbiB1cFxuXHRcdFx0XHRcdCRzbGlkZS5jc3Moe1xuXHRcdFx0XHRcdFx0dHJhbnNmb3JtOiBcIlwiLFxuXHRcdFx0XHRcdFx0b3BhY2l0eTogXCJcIlxuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0aWYgKCFjdXJyZW50LmlzQ29tcGxldGUpIHtcblx0XHRcdFx0XHRcdHNlbGYuY29tcGxldGUoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdGZhbHNlXG5cdFx0XHQpO1xuXHRcdH0sXG5cblx0XHQvLyBDaGVjayBpZiBjdXJyZW50IHNsaWRlIGlzIG1vdmVkIChzd2lwZWQpXG5cdFx0Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdFx0aXNNb3ZlZDogZnVuY3Rpb24gKHNsaWRlKSB7XG5cdFx0XHR2YXIgY3VycmVudCA9IHNsaWRlIHx8IHRoaXMuY3VycmVudCxcblx0XHRcdFx0c2xpZGVQb3MsXG5cdFx0XHRcdHN0YWdlUG9zO1xuXG5cdFx0XHRpZiAoIWN1cnJlbnQpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHRzdGFnZVBvcyA9ICQuZmFuY3lib3guZ2V0VHJhbnNsYXRlKHRoaXMuJHJlZnMuc3RhZ2UpO1xuXHRcdFx0c2xpZGVQb3MgPSAkLmZhbmN5Ym94LmdldFRyYW5zbGF0ZShjdXJyZW50LiRzbGlkZSk7XG5cblx0XHRcdHJldHVybiAoXG5cdFx0XHRcdCFjdXJyZW50LiRzbGlkZS5oYXNDbGFzcyhcImZhbmN5Ym94LWFuaW1hdGVkXCIpICYmXG5cdFx0XHRcdChNYXRoLmFicyhzbGlkZVBvcy50b3AgLSBzdGFnZVBvcy50b3ApID4gMC41IHx8IE1hdGguYWJzKHNsaWRlUG9zLmxlZnQgLSBzdGFnZVBvcy5sZWZ0KSA+IDAuNSlcblx0XHRcdCk7XG5cdFx0fSxcblxuXHRcdC8vIFVwZGF0ZSBjdXJzb3Igc3R5bGUgZGVwZW5kaW5nIGlmIGNvbnRlbnQgY2FuIGJlIHpvb21lZFxuXHRcdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdFx0dXBkYXRlQ3Vyc29yOiBmdW5jdGlvbiAobmV4dFdpZHRoLCBuZXh0SGVpZ2h0KSB7XG5cdFx0XHR2YXIgc2VsZiA9IHRoaXMsXG5cdFx0XHRcdGN1cnJlbnQgPSBzZWxmLmN1cnJlbnQsXG5cdFx0XHRcdCRjb250YWluZXIgPSBzZWxmLiRyZWZzLmNvbn
6780RhaW5lcixcblx0XHRcdFx0Y2FuUGFuLFxuXHRcdFx0XHRpc1pvb21hYmxlO1xuXG5cdFx0XHRpZiAoIWN1cnJlbnQgfHwgc2VsZi5pc0Nsb3NpbmcgfHwgIXNlbGYuR3Vlc3R1cmVzKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0JGNvbnRhaW5lci5yZW1vdmVDbGFzcyhcImZhbmN5Ym94LWlzLXpvb21hYmxlIGZhbmN5Ym94LWNhbi16b29tSW4gZmFuY3lib3gtY2FuLXpvb21PdXQgZmFuY3lib3gtY2FuLXN3aXBlIGZhbmN5Ym94LWNhbi1wYW5cIik7XG5cblx0XHRcdGNhblBhbiA9IHNlbGYuY2FuUGFuKG5leHRXaWR0aCwgbmV4dEhlaWdodCk7XG5cblx0XHRcdGlzWm9vbWFibGUgPSBjYW5QYW4gPyB0cnVlIDogc2VsZi5pc1pvb21hYmxlKCk7XG5cblx0XHRcdCRjb250YWluZXIudG9nZ2xlQ2xhc3MoXCJmYW5jeWJveC1pcy16b29tYWJsZVwiLCBpc1pvb21hYmxlKTtcblxuXHRcdFx0JChcIltkYXRhLWZhbmN5Ym94LXpvb21dXCIpLnByb3AoXCJkaXNhYmxlZFwiLCAhaXNab29tYWJsZSk7XG5cblx0XHRcdGlmIChjYW5QYW4pIHtcblx0XHRcdFx0JGNvbnRhaW5lci5hZGRDbGFzcyhcImZhbmN5Ym94LWNhbi1wYW5cIik7XG5cdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRpc1pvb21hYmxlICYmXG5cdFx0XHRcdChjdXJyZW50Lm9wdHMuY2xpY2tDb250ZW50ID09PSBcInpvb21cIiB8fCAoJC5pc0Z1bmN0aW9uKGN1cnJlbnQub3B0cy5jbGlja0NvbnRlbnQpICYmIGN1cnJlbnQub3B0cy5jbGlja0NvbnRlbnQoY3VycmVudCkgPT0gXCJ6b29tXCIpKVxuXHRcdFx0KSB7XG5cdFx0XHRcdCRjb250YWluZXIuYWRkQ2xhc3MoXCJmYW5jeWJveC1jYW4tem9vbUluXCIpO1xuXHRcdFx0fSBlbHNlIGlmIChjdXJyZW50Lm9wdHMudG91Y2ggJiYgKGN1cnJlbnQub3B0cy50b3VjaC52ZXJ0aWNhbCB8fCBzZWxmLmdyb3VwLmxlbmd0aCA+IDEpICYmIGN1cnJlbnQuY29udGVudFR5cGUgIT09IFwidmlkZW9cIikge1xuXHRcdFx0XHQkY29udGFpbmVyLmFkZENsYXNzKFwiZmFuY3lib3gtY2FuLXN3aXBlXCIpO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQvLyBDaGVjayBpZiBjdXJyZW50IHNsaWRlIGlzIHpvb21hYmxlXG5cdFx0Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdFx0aXNab29tYWJsZTogZnVuY3Rpb24gKCkge1xuXHRcdFx0dmFyIHNlbGYgPSB0aGlzLFxuXHRcdFx0XHRjdXJyZW50ID0gc2VsZi5jdXJyZW50LFxuXHRcdFx0XHRmaXRQb3M7XG5cblx0XHRcdC8vIEFzc3VtZSB0aGF0IHNsaWRlIGlzIHpvb21hYmxlIGlmOlxuXHRcdFx0Ly8gICAtIGltYWdlIGlzIHN0aWxsIGxvYWRpbmdcblx0XHRcdC8vICAgLSBhY3R1YWwgc2l6ZSBvZiB0aGUgaW1hZ2UgaXMgc21hbGxlciB0aGFuIGF2YWlsYWJsZSBhcmVhXG5cdFx0XHRpZiAoY3VycmVudCAmJiAhc2VsZi5pc0Nsb3NpbmcgJiYgY3VycmVudC50eXBlID09PSBcImltYWdlXCIgJiYgIWN1cnJlbnQuaGFzRXJyb3IpIHtcblx0XHRcdFx0aWYgKCFjdXJyZW50LmlzTG9hZGVkKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRmaXRQb3MgPSBzZWxmLmdldEZpdFBvcyhjdXJyZW50KTtcblxuXHRcdFx0XHRpZiAoZml0UG9zICYmIChjdXJyZW50LndpZHRoID4gZml0UG9zLndpZHRoIHx8IGN1cnJlbnQuaGVpZ2h0ID4gZml0UG9zLmhlaWdodCkpIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSxcblxuXHRcdC8vIENoZWNrIGlmIGN1cnJlbnQgaW1hZ2UgZGltZW5zaW9ucyBhcmUgc21hbGxlciB0aGFuIGFjdHVhbFxuXHRcdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdFx0aXNTY2FsZWREb3duOiBmdW5jdGlvbiAobmV4dFdpZHRoLCBuZXh0SGVpZ2h0KSB7XG5cdFx0XHR2YXIgc2VsZiA9IHRoaXMsXG5cdFx0XHRcdHJleiA9IGZhbHNlLFxuXHRcdFx0XHRjdXJyZW50ID0gc2VsZi5jdXJyZW50LFxuXHRcdFx0XHQkY29udGVudCA9IGN1cnJlbnQuJGNvbnRlbnQ7XG5cblx0XHRcdGlmIChuZXh0V2lkdGggIT09IHVuZGVmaW5lZCAmJiBuZXh0SGVpZ2h0ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cmV6ID0gbmV4dFdpZHRoIDwgY3VycmVudC53aWR0aCAmJi
6780BuZXh0SGVpZ2h0IDwgY3VycmVudC5oZWlnaHQ7XG5cdFx0XHR9IGVsc2UgaWYgKCRjb250ZW50KSB7XG5cdFx0XHRcdHJleiA9ICQuZmFuY3lib3guZ2V0VHJhbnNsYXRlKCRjb250ZW50KTtcblx0XHRcdFx0cmV6ID0gcmV6LndpZHRoIDwgY3VycmVudC53aWR0aCAmJiByZXouaGVpZ2h0IDwgY3VycmVudC5oZWlnaHQ7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiByZXo7XG5cdFx0fSxcblxuXHRcdC8vIENoZWNrIGlmIGltYWdlIGRpbWVuc2lvbnMgZXhjZWVkIHBhcmVudCBlbGVtZW50XG5cdFx0Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHRcdGNhblBhbjogZnVuY3Rpb24gKG5leHRXaWR0aCwgbmV4dEhlaWdodCkge1xuXHRcdFx0dmFyIHNlbGYgPSB0aGlzLFxuXHRcdFx0XHRjdXJyZW50ID0gc2VsZi5jdXJyZW50LFxuXHRcdFx0XHRwb3MgPSBudWxsLFxuXHRcdFx0XHRyZXogPSBmYWxzZTtcblxuXHRcdFx0aWYgKGN1cnJlbnQudHlwZSA9PT0gXCJpbWFnZVwiICYmIChjdXJyZW50LmlzQ29tcGxldGUgfHwgKG5leHRXaWR0aCAmJiBuZXh0SGVpZ2h0KSkgJiYgIWN1cnJlbnQuaGFzRXJyb3IpIHtcblx0XHRcdFx0cmV6ID0gc2VsZi5nZXRGaXRQb3MoY3VycmVudCk7XG5cblx0XHRcdFx0aWYgKG5leHRXaWR0aCAhPT0gdW5kZWZpbmVkICYmIG5leHRIZWlnaHQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHBvcyA9IHtcblx0XHRcdFx0XHRcdHdpZHRoOiBuZXh0V2lkdGgsXG5cdFx0XHRcdFx0XHRoZWlnaHQ6IG5leHRIZWlnaHRcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9IGVsc2UgaWYgKGN1cnJlbnQuaXNDb21wbGV0ZSkge1xuXHRcdFx0XHRcdHBvcyA9ICQuZmFuY3lib3guZ2V0VHJhbnNsYXRlKGN1cnJlbnQuJGNvbnRlbnQpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHBvcyAmJiByZXopIHtcblx0XHRcdFx0XHRyZXogPSBNYXRoLmFicyhwb3Mud2lkdGggLSByZXoud2lkdGgpID4gMS41IHx8IE1hdGguYWJzKHBvcy5oZWlnaHQgLSByZXouaGVpZ2h0KSA+IDEuNTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gcmV6O1xuXHRcdH0sXG5cblx0XHQvLyBMb2FkIGNvbnRlbnQgaW50byB0aGUgc2xpZGVcblx0XHQvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHRcdGxvYWRTbGlkZTogZnVuY3Rpb24gKHNsaWRlKSB7XG5cdFx0XHR2YXIgc2VsZiA9IHRoaXMsXG5cdFx0XHRcdHR5cGUsXG5cdFx0XHRcdCRzbGlkZSxcblx0XHRcdFx0YWpheExvYWQ7XG5cblx0XHRcdGlmIChzbGlkZS5pc0xvYWRpbmcgfHwgc2xpZGUuaXNMb2FkZWQpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRzbGlkZS5pc0xvYWRpbmcgPSB0cnVlO1xuXG5cdFx0XHRpZiAoc2VsZi50cmlnZ2VyKFwiYmVmb3JlTG9hZFwiLCBzbGlkZSkgPT09IGZhbHNlKSB7XG5cdFx0XHRcdHNsaWRlLmlzTG9hZGluZyA9IGZhbHNlO1xuXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0dHlwZSA9IHNsaWRlLnR5cGU7XG5cdFx0XHQkc2xpZGUgPSBzbGlkZS4kc2xpZGU7XG5cblx0XHRcdCRzbGlkZVxuXHRcdFx0XHQub2ZmKFwicmVmcmVzaFwiKVxuXHRcdFx0XHQudHJpZ2dlcihcIm9uUmVzZXRcIilcblx0XHRcdFx0LmFkZENsYXNzKHNsaWRlLm9wdHMuc2xpZGVDbGFzcyk7XG5cblx0XHRcdC8vIENyZWF0ZSBjb250ZW50IGRlcGVuZGluZyBvbiB0aGUgdHlwZVxuXHRcdFx0c3dpdGNoICh0eXBlKSB7XG5cdFx0XHRcdGNhc2UgXCJpbWFnZVwiOlxuXHRcdFx0XHRcdHNlbGYuc2V0SW1hZ2Uoc2xpZGUpO1xuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBcImlmcmFtZVwiOlxuXHRcdFx0XHRcdHNlbGYuc2V0SWZyYW1lKHNsaWRlKTtcblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgXCJodG1sXCI6XG5cdFx0XHRcdFx0c2VsZi5zZXRDb250ZW50KHNsaWRlLCBzbGlkZS5zcmMgfHwgc2xpZGUuY29udGVudCk7XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIFwidmlkZW9cIjpcblx0XHRcdFx0XHRzZWxmLnNldENvbnRlbnQoXG5cdFx0XHRcdFx0XHRzbGlkZSxcblx0XHRcdFx0XHRcdHNsaWRlLm9wdHMudmlkZW8udHBsXG5cdFx0XHRcdFx0XHRcdC5yZXBsYWNlKC9cXHtcXHtzcmNcXH1cXH0vZ2ksIHNsaWRlLnNyYylcblx0XHRcdFx0XHRcdFx0LnJlcGxhY2UoXCJ7e2Zvcm1hdH19XCIsIHNsaWRlLm9wdHMudmlkZW9Gb3JtYXQgfHwgc2xpZGUub3B0cy52aWRlby5mb3JtYXQgfHwgXCJcIilcblx0XHRcdFx0XHRcdFx0LnJlcGxhY2UoXCJ7e3Bvc3Rlcn19XCIsIHNsaWRlLnRodW1iIHx8IFwiXCIpXG5cdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgXCJpbmxpbmVcIjpcblx0XHRcdFx0XHRpZiAoJChzbGlkZS5zcmMpLmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0c2VsZi5zZXRDb250ZW50KHNsaWRlLCAkKHNsaWRlLnNyYykpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRzZWxmLnNldEVycm9yKHNsaWRlKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIFwiYWpheFwiOlxuXHRcdFx0XHRcdHNlbGYuc2hvd0xvYWRpbmcoc2xpZGUpO1xuXG5cdFx0XHRcdFx0YWpheExvYWQgPSAkLmFqYXgoXG5cdFx0XHRcdFx0XHQkLmV4dGVuZCh7fSwgc2xpZGUub3B0cy5hamF4LnNldHRpbmdzLCB7XG5cdFx0XHRcdFx0XHRcdHVybDogc2xpZGUuc3JjLFxuXHRcdFx0XHRcdFx0XHRzdWNjZXNzOiBmdW5jdGlvbiAoZGF0YSwgdGV4dFN0YXR1cykge1xuXHRcdFx0XHRcdFx0XHRcdGlmICh0ZXh0U3RhdHVzID09PSBcInN1Y2Nlc3NcIikge1xuXHRcdFx0XHRcdFx0XHRcdFx0c2VsZi5zZXRDb250ZW50KHNsaWRlLCBkYXRhKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdGVycm9yOiBmdW5jdGlvbiAoanFYSFIsIHRleHRTdGF0dXMpIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoanFYSFIgJiYgdGV4dFN0YXR1cyAhPT0gXCJhYm9ydFwiKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRzZWxmLnNldEVycm9yKHNsaWRlKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdCRzbGlkZS5vbmUoXCJvblJlc2V0XCIsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdGFqYXhMb2FkLmFib3J0KCk7XG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdHNlbGYuc2V0RXJyb3Ioc2xpZGUpO1xuXG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybi
6780B0cnVlO1xuXHRcdH0sXG5cblx0XHQvLyBVc2UgdGh1bWJuYWlsIGltYWdlLCBpZiBwb3NzaWJsZVxuXHRcdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblx0XHRzZXRJbWFnZTogZnVuY3Rpb24gKHNsaWRlKSB7XG5cdFx0XHR2YXIgc2VsZiA9IHRoaXMsXG5cdFx0XHRcdGdob3N0O1xuXG5cdFx0XHQvLyBDaGVjayBpZiBuZWVkIHRvIHNob3cgbG9hZGluZyBpY29uXG5cdFx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0dmFyICRpbWcgPSBzbGlkZS4kaW1hZ2U7XG5cblx0XHRcdFx0aWYgKCFzZWxmLmlzQ2xvc2luZyAmJiBzbGlkZS5pc0xvYWRpbmcgJiYgKCEkaW1nIHx8ICEkaW1nLmxlbmd0aCB8fCAhJGltZ1swXS5jb21wbGV0ZSkgJiYgIXNsaWRlLmhhc0Vycm9yKSB7XG5cdFx0XHRcdFx0c2VsZi5zaG93TG9hZGluZyhzbGlkZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0sIDUwKTtcblxuXHRcdFx0Ly9DaGVjayBpZiBpbWFnZSBoYXMgc3Jjc2V0XG5cdFx0XHRzZWxmLmNoZWNrU3Jjc2V0KHNsaWRlKTtcblxuXHRcdFx0Ly8gVGhpcyB3aWxsIGJlIHdyYXBwZXIgY29udGFpbmluZyBib3RoIGdob3N0IGFuZCBhY3R1YWwgaW1hZ2Vcblx0XHRcdHNsaWRlLiRjb250ZW50ID0gJCgnPGRpdiBjbGFzcz1cImZhbmN5Ym94LWNvbnRlbnRcIj48L2Rpdj4nKVxuXHRcdFx0XHQuYWRkQ2xhc3MoXCJmYW5jeWJveC1pcy1oaWRkZW5cIilcblx0XHRcdFx0LmFwcGVuZFRvKHNsaWRlLiRzbGlkZS5hZGRDbGFzcyhcImZhbmN5Ym94LXNsaWRlLS1pbWFnZVwiKSk7XG5cblx0XHRcdC8vIElmIHdlIGhhdmUgYSB0aHVtYm5haWwsIHdlIGNhbiBkaXNwbGF5IGl0IHdoaWxlIGFjdHVhbCBpbWFnZSBpcyBsb2FkaW5nXG5cdFx0XHQvLyBVc2VycyB3aWxsIG5vdCBzdGFyZSBhdCBibGFjayBzY3JlZW4gYW5kIGFjdHVhbCBpbWFnZSB3aWxsIGFwcGVhciBncmFkdWFsbHlcblx0XHRcdGlmIChzbGlkZS5vcHRzLnByZWxvYWQgIT09IGZhbHNlICYmIHNsaWRlLm9wdHMud2lkdGggJiYgc2xpZGUub3B0cy5oZWlnaHQgJiYgc2xpZGUudGh1bWIpIHtcblx0XHRcdFx0c2xpZGUud2lkdGggPSBzbGlkZS5vcHRzLndpZHRoO1xuXHRcdFx0XHRzbGlkZS5oZWlnaHQgPSBzbGlkZS5vcHRzLmhlaWdodDtcblxuXHRcdFx0XHRnaG9zdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIik7XG5cblx0XHRcdFx0Z2hvc3Qub25lcnJvciA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHQkKHRoaXMpLnJlbW92ZSgpO1xuXG5cdFx0XHRcdFx0c2xpZGUuJGdob3N0ID0gbnVsbDtcblx0XHRcdFx0fTtcblxuXHRcdFx0XHRnaG9zdC5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0c2VsZi5hZnRlckxvYWQoc2xpZGUpO1xuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdHNsaWRlLiRnaG9zdCA9ICQoZ2hvc3QpXG5cdFx0XHRcdFx0LmFkZENsYXNzKFwiZmFuY3lib3gtaW1hZ2VcIilcblx0XHRcdFx0XHQuYXBwZW5kVG8oc2xpZGUuJGNvbnRlbnQpXG5cdFx0XHRcdFx0LmF0dHIoXCJzcmNcIiwgc2xpZGUudGh1bWIpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdGFydCBsb2FkaW5nIGFjdHVhbCBpbWFnZVxuXHRcdFx0c2VsZi5zZXRCaWdJbWFnZShzbGlkZSk7XG5cdFx0fSxcblxuXHRcdC8vIENoZWNrIGlmIGltYWdlIGhhcyBzcmNzZXQgYW5kIGdldCB0aGUgc291cmNlXG5cdFx0Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblx0XHRjaGVja1NyY3NldDogZnVuY3Rpb24gKHNsaWRlKSB7XG5cdFx0XHR2YXIgc3Jjc2V0ID0gc2xpZGUub3B0cy5zcmNzZXQgfHwgc2xpZGUub3B0cy5pbWFnZS5zcmNzZXQsXG5cdFx0XHRcdGZvdW5kLFxuXHRcdFx0XHR0ZW1wLFxuXHRcdFx0XHRweFJhdGlvLFxuXHRcdFx0XHR3aW5kb3dXaWR0aDtcblxuXHRcdFx0Ly8gSWYgd2UgaGF2ZSBcInNyY3NldFwiLCB0aGVuIHdlIG5lZWQgdG8gZmluZCBmaXJzdCBtYXRjaGluZyBcInNyY1wiIHZhbHVlLlxuXHRcdFx0Ly8gVGhpcyBpcyBuZWNlc3NhcnksIGJlY2F1c2Ugd2hlbiB5b3Ugc2V0IGFuIHNyYyBhdHRyaWJ1dGUsIHRoZSBicm93c2VyIHdpbGwgcHJlbG9hZCB0aGUgaW1hZ2Vcblx0XHRcdC8vIGJlZm9yZSBhbnkgamF2YXNjcmlwdCBvciBldmVuIENTUyBpcyBhcHBsaWVkLlxuXHRcdFx0aWYgKHNyY3NldCkge1xuXHRcdFx0XHRweFJhdGlvID0gd2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMTtcblx0XHRcdFx0d2luZG93V2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aCAqIHB4UmF0aW87XG5cblx0XHRcdFx0dGVtcCA9IHNyY3NldC5zcGxpdChcIixcIikubWFwKGZ1bmN0aW9uIChlbCkge1xuXHRcdFx0XHRcdHZhciByZXQgPSB7fTtcblxuXHRcdFx0XHRcdGVsLnRyaW0oKVxuXHRcdFx0XHRcdFx0LnNwbGl0KC9cXHMrLylcblx0XHRcdFx0XHRcdC5mb3JFYWNoKGZ1bmN0aW9uIChlbCwgaSkge1xuXHRcdFx0XHRcdFx0XHR2YXIgdmFsdWUgPSBwYXJzZUludChlbC5zdWJzdHJpbmcoMCwgZWwubGVuZ3RoIC0gMSksIDEwKTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoaSA9PT0gMCkge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiAocmV0LnVybCA9IGVsKTtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGlmICh2YWx1ZSkge1xuXHRcdFx0XHRcdFx0XHRcdHJldC52YWx1ZSA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0XHRcdHJldC5wb3N0Zml4ID0gZWxbZWwubGVuZ3RoIC0gMV07XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0Ly8gU29ydCBieSB2YWx1ZVxuXHRcdFx0XHR0ZW1wLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcblx0XHRcdFx0XHRyZXR1cm4gYS52YWx1ZSAtIGIudmFsdWU7XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdC8vIE9rLCBub3cgd2UgaGF2ZSBhbiBhcnJheSBvZiBhbGwgc3Jjc2V0IHZhbHVlc1xuXHRcdFx0XHRmb3IgKHZhciBqID0gMDsgaiA8IHRlbXAubGVuZ3RoOyBqKyspIHtcblx0XHRcdFx0XHR2YXIgZWwgPSB0ZW1wW2pdO1xuXG5cdFx0XHRcdFx0aWYgKChlbC5wb3N0Zml4ID09PSBcIndcIiAmJiBlbC52YWx1ZSA+PSB3aW5kb3dXaWR0aCkgfHwgKGVsLnBvc3RmaXggPT09IFwieFwiICYmIGVsLnZhbHVlID49IHB4UmF0aW8pKSB7XG5cdFx0XHRcdFx0XHRmb3VuZCA9IGVsO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gSWYgbm90IGZvdW5kLCB0YWtlIHRoZSBsYXN0IG9uZVxuXHRcdFx0XHRpZiAoIWZvdW5kICYmIHRlbXAubGVuZ3RoKSB7XG5cdFx0XHRcdFx0Zm91bmQgPSB0ZW1wW3RlbXAubGVuZ3RoIC0gMV07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoZm91bmQpIHtcblx0XHRcdFx0XHRzbGlkZS5zcmMgPSBmb3VuZC51cmw7XG5cblx0XHRcdFx0XHQvLyBJZiB3ZSBoYXZlIGRlZmF1bHQgd2lkdGgvaGVpZ2h0IHZhbHVlcywgd2UgY2FuIGNhbGN1bGF0ZSBoZWlnaHQgZm9yIG1hdGNoaW5nIHNvdXJjZVxuXHRcdFx0XHRcdGlmIChzbGlkZS53aWR0aCAmJi
6780BzbGlkZS5oZWlnaHQgJiYgZm91bmQucG9zdGZpeCA9PSBcIndcIikge1xuXHRcdFx0XHRcdFx0c2xpZGUuaGVpZ2h0ID0gKHNsaWRlLndpZHRoIC8gc2xpZGUuaGVpZ2h0KSAqIGZvdW5kLnZhbHVlO1xuXHRcdFx0XHRcdFx0c2xpZGUud2lkdGggPSBmb3VuZC52YWx1ZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRzbGlkZS5vcHRzLnNyY3NldCA9IHNyY3NldDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQvLyBDcmVhdGUgZnVsbC1zaXplIGltYWdlXG5cdFx0Ly8gPT09PT09PT09PT09PT09PT09PT09PVxuXG5cdFx0c2V0QmlnSW1hZ2U6IGZ1bmN0aW9uIChzbGlkZSkge1xuXHRcdFx0dmFyIHNlbGYgPSB0aGlzLFxuXHRcdFx0XHRpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW1nXCIpLFxuXHRcdFx0XHQkaW1nID0gJChpbWcpO1xuXG5cdFx0XHRzbGlkZS4kaW1hZ2UgPSAkaW1nXG5cdFx0XHRcdC5vbmUoXCJlcnJvclwiLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0c2VsZi5zZXRFcnJvcihzbGlkZSk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5vbmUoXCJsb2FkXCIsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHR2YXIgc2l6ZXM7XG5cblx0XHRcdFx0XHRpZiAoIXNsaWRlLiRnaG9zdCkge1xuXHRcdFx0XHRcdFx0c2VsZi5yZXNvbHZlSW1hZ2VTbGlkZVNpemUoc2xpZGUsIHRoaXMubmF0dXJhbFdpZHRoLCB0aGlzLm5hdHVyYWxIZWlnaHQpO1xuXG5cdFx0XHRcdFx0XHRzZWxmLmFmdGVyTG9hZChzbGlkZSk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKHNlbGYuaXNDbG9zaW5nKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKHNsaWRlLm9wdHMuc3Jjc2V0KSB7XG5cdFx0XHRcdFx0XHRzaXplcyA9IHNsaWRlLm9wdHMuc2l6ZXM7XG5cblx0XHRcdFx0XHRcdGlmICghc2l6ZXMgfHwgc2l6ZXMgPT09IFwiYXV0b1wiKSB7XG5cdFx0XHRcdFx0XHRcdHNpemVzID1cblx0XHRcdFx0XHRcdFx0XHQoc2xpZGUud2lkdGggLyBzbGlkZS5oZWlnaHQgPiAxICYmICRXLndpZHRoKCkgLyAkVy5oZWlnaHQoKSA+IDEgPyBcIjEwMFwiIDogTWF0aC5yb3VuZCgoc2xpZGUud2lkdGggLyBzbGlkZS5oZWlnaHQpICogMTAwKSkgK1xuXHRcdFx0XHRcdFx0XHRcdFwidndcIjtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0JGltZy5hdHRyKFwic2l6ZXNcIiwgc2l6ZXMpLmF0dHIoXCJzcmNzZXRcIiwgc2xpZGUub3B0cy5zcmNzZXQpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIEhpZGUgdGVtcG9yYXJ5IGltYWdlIGFmdGVyIHNvbWUgZGVsYXlcblx0XHRcdFx0XHRpZiAoc2xpZGUuJGdob3N0KSB7XG5cdFx0XHRcdFx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0aWYgKHNsaWRlLiRnaG9zdCAmJiAhc2VsZi5pc0Nsb3NpbmcpIHtcblx0XHRcdFx0XHRcdFx0XHRzbGlkZS4kZ2hvc3QuaGlkZSgpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9LCBNYXRoLm1pbigzMDAsIE1hdGgubWF4KDEwMDAsIHNsaWRlLmhlaWdodCAvIDE2MDApKSk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0c2VsZi5oaWRlTG9hZGluZyhzbGlkZSk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5hZGRDbGFzcyhcImZhbmN5Ym94LWltYWdlXCIpXG5cdFx0XHRcdC5hdHRyKFwic3JjXCIsIHNsaWRlLnNyYylcblx0XHRcdFx0LmFwcGVuZFRvKHNsaWRlLiRjb250ZW50KTtcblxuXHRcdFx0aWYgKChpbWcuY29tcGxldGUgfHwgaW1nLnJlYWR5U3RhdGUgPT0gXCJjb21wbGV0ZVwiKSAmJiAkaW1nLm5hdHVyYWxXaWR0aCAmJiAkaW1nLm5hdHVyYWxIZWlnaHQpIHtcblx0XHRcdFx0JGltZy50cmlnZ2VyKFwibG9hZFwiKTtcblx0XHRcdH0gZWxzZSBpZiAoaW1nLmVycm9yKSB7XG5cdFx0XHRcdCRpbWcudHJpZ2dlcihcImVycm9yXCIpO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQvLyBDb21wdXRlcyB0aGUgc2xpZGUgc2l6ZSBmcm9tIGltYWdlIHNpemUgYW5kIG1heFdpZHRoL21heEhlaWdodFxuXHRcdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblx0XHRyZXNvbHZlSW1hZ2VTbGlkZVNpemU6IGZ1bmN0aW9uIChzbGlkZSwgaW1nV2lkdGgsIGltZ0hlaWdodCkge1xuXHRcdFx0dmFyIG1heFdpZHRoID0gcGFyc2VJbnQoc2xpZGUub3B0cy53aWR0aCwgMTApLFxuXHRcdFx0XHRtYXhIZWlnaHQgPSBwYXJzZUludChzbGlkZS5vcHRzLmhlaWdodCwgMTApO1xuXG5cdFx0XHQvLyBTZXRzIHRoZSBkZWZhdWx0IHZhbHVlcyBmcm9tIHRoZSBpbWFnZVxuXHRcdFx0c2xpZGUud2lkdGggPSBpbWdXaWR0aDtcblx0XHRcdHNsaWRlLmhlaWdodCA9IGltZ0hlaWdodDtcblxuXHRcdFx0aWYgKG1heFdpZHRoID4gMCkge1xuXHRcdFx0XHRzbGlkZS53aWR0aCA9IG1heFdpZHRoO1xuXHRcdFx0XHRzbGlkZS5oZWlnaHQgPSBNYXRoLmZsb29yKChtYXhXaWR0aCAqIGltZ0hlaWdodCkgLyBpbWdXaWR0aCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChtYXhIZWlnaHQgPiAwKSB7XG5cdFx0XHRcdHNsaWRlLndpZHRoID0gTWF0aC5mbG9vcigobWF4SGVpZ2h0ICogaW1nV2lkdGgpIC8gaW1nSGVpZ2h0KTtcblx0XHRcdFx0c2xpZGUuaGVpZ2h0ID0gbWF4SGVpZ2h0O1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQvLyBDcmVhdGUgaWZyYW1lIHdyYXBwZXIsIGlmcmFtZSBhbmQgYmluZGluZ3Ncblx0XHQvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHRcdHNldElmcmFtZTogZnVuY3Rpb24gKHNsaWRlKSB7XG5cdFx0XHR2YXIgc2VsZiA9IHRoaXMsXG5cdFx0XHRcdG9wdHMgPSBzbGlkZS5vcHRzLmlmcmFtZSxcblx0XHRcdFx0JHNsaWRlID0gc2xpZGUuJHNsaWRlLFxuXHRcdFx0XHQkaWZyYW1lO1xuXG5cdFx0XHRzbGlkZS4kY29udGVudCA9ICQoJzxkaXYgY2xhc3M9XCJmYW5jeWJveC1jb250ZW50JyArIChvcHRzLnByZWxvYWQgPyBcIiBmYW5jeWJveC1pcy1oaWRkZW5cIiA6IFwiXCIpICsgJ1wiPjwvZGl2PicpXG5cdFx0XHRcdC5jc3Mob3B0cy5jc3MpXG5cdFx0XHRcdC5hcHBlbmRUbygkc2xpZGUpO1xuXG5cdFx0XHQkc2xpZGUuYWRkQ2xhc3MoXCJmYW5jeWJveC1zbGlkZS0tXCIgKyBzbGlkZS5jb250ZW50VHlwZSk7XG5cblx0XHRcdHNsaWRlLiRpZnJhbWUgPSAkaWZyYW1lID0gJChvcHRzLnRwb
6780C5yZXBsYWNlKC9cXHtybmRcXH0vZywgbmV3IERhdGUoKS5nZXRUaW1lKCkpKVxuXHRcdFx0XHQuYXR0cihvcHRzLmF0dHIpXG5cdFx0XHRcdC5hcHBlbmRUbyhzbGlkZS4kY29udGVudCk7XG5cblx0XHRcdGlmIChvcHRzLnByZWxvYWQpIHtcblx0XHRcdFx0c2VsZi5zaG93TG9hZGluZyhzbGlkZSk7XG5cblx0XHRcdFx0Ly8gVW5mb3J0dW5hdGVseSwgaXQgaXMgbm90IGFsd2F5cyBwb3NzaWJsZSB0byBkZXRlcm1pbmUgaWYgaWZyYW1lIGlzIHN1Y2Nlc3NmdWxseSBsb2FkZWRcblx0XHRcdFx0Ly8gKGR1ZSB0byBicm93c2VyIHNlY3VyaXR5IHBvbGljeSlcblxuXHRcdFx0XHQkaWZyYW1lLm9uKFwibG9hZC5mYiBlcnJvci5mYlwiLCBmdW5jdGlvbiAoZSkge1xuXHRcdFx0XHRcdHRoaXMuaXNSZWFkeSA9IDE7XG5cblx0XHRcdFx0XHRzbGlkZS4kc2xpZGUudHJpZ2dlcihcInJlZnJlc2hcIik7XG5cblx0XHRcdFx0XHRzZWxmLmFmdGVyTG9hZChzbGlkZSk7XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdC8vIFJlY2FsY3VsYXRlIGlmcmFtZSBjb250ZW50IHNpemVcblx0XHRcdFx0Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdFx0XHRcdCRzbGlkZS5vbihcInJlZnJlc2guZmJcIiwgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHZhciAkY29udGVudCA9IHNsaWRlLiRjb250ZW50LFxuXHRcdFx0XHRcdFx0ZnJhbWVXaWR0aCA9IG9wdHMuY3NzLndpZHRoLFxuXHRcdFx0XHRcdFx0ZnJhbWVIZWlnaHQgPSBvcHRzLmNzcy5oZWlnaHQsXG5cdFx0XHRcdFx0XHQkY29udGVudHMsXG5cdFx0XHRcdFx0XHQkYm9keTtcblxuXHRcdFx0XHRcdGlmICgkaWZyYW1lWzBdLmlzUmVhZHkgIT09IDEpIHtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0JGNvbnRlbnRzID0gJGlmcmFtZS5jb250ZW50cygpO1xuXHRcdFx0XHRcdFx0JGJvZHkgPSAkY29udGVudHMuZmluZChcImJvZHlcIik7XG5cdFx0XHRcdFx0fSBjYXRjaCAoaWdub3JlKSB7fVxuXG5cdFx0XHRcdFx0Ly8gQ2FsY3VsYXRlIGNvbnRlbnQgZGltZW5zaW9ucywgaWYgaXQgaXMgYWNjZXNzaWJsZVxuXHRcdFx0XHRcdGlmICgkYm9keSAmJiAkYm9keS5sZW5ndGggJiYgJGJvZHkuY2hpbGRyZW4oKS5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdC8vIEF2b2lkIHNjcm9sbGluZyB0byB0b3AgKGlmIG11bHRpcGxlIGluc3RhbmNlcylcblx0XHRcdFx0XHRcdCRzbGlkZS5jc3MoXCJvdmVyZmxvd1wiLCBcInZpc2libGVcIik7XG5cblx0XHRcdFx0XHRcdCRjb250ZW50LmNzcyh7XG5cdFx0XHRcdFx0XHRcdHdpZHRoOiBcIjEwMCVcIixcblx0XHRcdFx0XHRcdFx0XCJtYXgtd2lkdGhcIjogXCIxMDAlXCIsXG5cdFx0XHRcdFx0XHRcdGhlaWdodDogXCI5OTk5cHhcIlxuXHRcdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRcdGlmIChmcmFtZVdpZHRoID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0ZnJhbWVXaWR0aCA9IE1hdGguY2VpbChNYXRoLm1heCgkYm9keVswXS5jbGllbnRXaWR0aCwgJGJvZHkub3V0ZXJXaWR0aCh0cnVlKSkpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQkY29udGVudC5jc3MoXCJ3aWR0aFwiLCBmcmFtZVdpZHRoID8gZnJhbWVXaWR0aCA6IFwiXCIpLmNzcyhcIm1heC13aWR0aFwiLCBcIlwiKTtcblxuXHRcdFx0XHRcdFx0aWYgKGZyYW1lSGVpZ2h0ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0ZnJhbWVIZWlnaHQgPSBNYXRoLmNlaWwoTWF0aC5tYXgoJGJvZHlbMF0uY2xpZW50SGVpZ2h0LCAkYm9keS5vdXRlckhlaWdodCh0cnVlKSkpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQkY29udGVudC5jc3MoXCJoZWlnaHRcIiwgZnJhbWVIZWlnaHQgPyBmcmFtZUhlaWdodCA6IFwiXCIpO1xuXG5cdFx0XHRcdFx0XHQkc2xpZGUuY3NzKFwib3ZlcmZsb3dcIiwgXCJhdXRvXCIpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdCRjb250ZW50LnJlbW92ZUNsYXNzKFwiZmFuY3lib3gtaXMtaGlkZGVuXCIpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHNlbGYuYWZ0ZXJMb2FkKHNsaWRlKTtcblx0XHRcdH1cblxuXHRcdFx0JGlmcmFtZS5hdHRyKFwic3JjXCIsIHNsaWRlLnNyYyk7XG5cblx0XHRcdC8vIFJlbW92ZSBpZnJhbWUgaWYgY2xvc2luZyBvciBjaGFuZ2luZyBnYWxsZXJ5IGl0ZW1cblx0XHRcdCRzbGlkZS5vbmUoXCJvblJlc2V0XCIsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0Ly8gVGhpcyBoZWxwcyBJRSBub3QgdG8gdGhyb3cgZXJyb3JzIHdoZW4gY2xvc2luZ1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdCQodGhpcylcblx0XHRcdFx0XHRcdC5maW5kKFwiaWZyYW1lXCIpXG5cdFx0XHRcdFx0XHQuaGlkZSgpXG5cdFx0XHRcdFx0XHQudW5iaW5kKClcblx0XHRcdFx0XHRcdC5hdHRyKFwic3JjXCIsIFwiLy9hYm91dDpibGFua1wiKTtcblx0XHRcdFx0fSBjYXRjaCAoaWdub3JlKSB7fVxuXG5cdFx0XHRcdCQodGhpcylcblx0XHRcdFx0XHQub2ZmKFwicmVmcmVzaC5mYlwiKVxuXHRcdFx0XHRcdC5lbXB0eSgpO1xuXG5cdFx0XHRcdHNsaWRlLmlzTG9hZGVkID0gZmFsc2U7XG5cdFx0XHRcdHNsaWRlLmlzUmV2ZWFsZWQgPSBmYWxzZTtcblx0XHRcdH0pO1xuXHRcdH0sXG5cblx0XHQvLyBXcmFwIGFuZCBhcHBlbmQgY29udGVudCB0byB0aGUgc2xpZGVcblx0XHQvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdFx0c2V0Q29udGVudDogZnVuY3Rpb24gKHNsaWRlLCBjb250ZW50KSB7XG5cdFx0XHR2YXIgc2VsZiA9IHRoaXM7XG5cblx0XHRcdGlmIChzZWxmLmlzQ2xvc2luZykge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdHNlbGYuaGlkZUxvYWRpbmcoc2xpZGUpO1xuXG5cdFx0XHRpZiAoc2xpZGUuJGNvbnRlbnQpIHtcblx0XHRcdFx0JC5mYW5jeWJveC5zdG9wKHNsaWRlLiRjb250ZW50KTtcblx0XHRcdH1cblxuXHRcdFx0c2xpZGUuJHNsaWRlLmVtcHR5KCk7XG5cblx0XHRcdC8vIElmIGNvbnRlbnQgaXMgYSBqUXVlcnkgb2JqZWN0LCB0aGVuIGl0IHdpbGwgYmUgbW92ZWQgdG8gdGhlIHNsaWRlLlxuXHRcdFx0Ly8gVGhlIHBsYWNlaG9sZG
6780VyIGlzIGNyZWF0ZWQgc28gd2Ugd2lsbCBrbm93IHdoZXJlIHRvIHB1dCBpdCBiYWNrLlxuXHRcdFx0aWYgKGlzUXVlcnkoY29udGVudCkgJiYgY29udGVudC5wYXJlbnQoKS5sZW5ndGgpIHtcblx0XHRcdFx0Ly8gTWFrZSBzdXJlIGNvbnRlbnQgaXMgbm90IGFscmVhZHkgbW92ZWQgdG8gZmFuY3lCb3hcblx0XHRcdFx0aWYgKGNvbnRlbnQuaGFzQ2xhc3MoXCJmYW5jeWJveC1jb250ZW50XCIpIHx8IGNvbnRlbnQucGFyZW50KCkuaGFzQ2xhc3MoXCJmYW5jeWJveC1jb250ZW50XCIpKSB7XG5cdFx0XHRcdFx0Y29udGVudC5wYXJlbnRzKFwiLmZhbmN5Ym94LXNsaWRlXCIpLnRyaWdnZXIoXCJvblJlc2V0XCIpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQ3JlYXRlIHRlbXBvcmFyeSBlbGVtZW50IG1hcmtpbmcgb3JpZ2luYWwgcGxhY2Ugb2YgdGhlIGNvbnRlbnRcblx0XHRcdFx0c2xpZGUuJHBsYWNlaG9sZGVyID0gJChcIjxkaXY+XCIpXG5cdFx0XHRcdFx0LmhpZGUoKVxuXHRcdFx0XHRcdC5pbnNlcnRBZnRlcihjb250ZW50KTtcblxuXHRcdFx0XHQvLyBNYWtlIHN1cmUgY29udGVudCBpcyB2aXNpYmxlXG5cdFx0XHRcdGNvbnRlbnQuY3NzKFwiZGlzcGxheVwiLCBcImlubGluZS1ibG9ja1wiKTtcblx0XHRcdH0gZWxzZSBpZiAoIXNsaWRlLmhhc0Vycm9yKSB7XG5cdFx0XHRcdC8vIElmIGNvbnRlbnQgaXMganVzdCBhIHBsYWluIHRleHQsIHRyeSB0byBjb252ZXJ0IGl0IHRvIGh0bWxcblx0XHRcdFx0aWYgKCQudHlwZShjb250ZW50KSA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0XHRcdGNvbnRlbnQgPSAkKFwiPGRpdj5cIilcblx0XHRcdFx0XHRcdC5hcHBlbmQoJC50cmltKGNvbnRlbnQpKVxuXHRcdFx0XHRcdFx0LmNvbnRlbnRzKCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBJZiBcImZpbHRlclwiIG9wdGlvbiBpcyBwcm92aWRlZCwgdGhlbiBmaWx0ZXIgY29udGVudFxuXHRcdFx0XHRpZiAoc2xpZGUub3B0cy5maWx0ZXIpIHtcblx0XHRcdFx0XHRjb250ZW50ID0gJChcIjxkaXY+XCIpXG5cdFx0XHRcdFx0XHQuaHRtbChjb250ZW50KVxuXHRcdFx0XHRcdFx0LmZpbmQoc2xpZGUub3B0cy5maWx0ZXIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHNsaWRlLiRzbGlkZS5vbmUoXCJvblJlc2V0XCIsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0Ly8gUGF1c2UgYWxsIGh0bWw1IHZpZGVvL2F1ZGlvXG5cdFx0XHRcdCQodGhpcylcblx0XHRcdFx0XHQuZmluZChcInZpZGVvLGF1ZGlvXCIpXG5cdFx0XHRcdFx0LnRyaWdnZXIoXCJwYXVzZVwiKTtcblxuXHRcdFx0XHQvLyBQdXQgY29udGVudCBiYWNrXG5cdFx0XHRcdGlmIChzbGlkZS4kcGxhY2Vob2xkZXIpIHtcblx0XHRcdFx0XHRzbGlkZS4kcGxhY2Vob2xkZXIuYWZ0ZXIoY29udGVudC5yZW1vdmVDbGFzcyhcImZhbmN5Ym94LWNvbnRlbnRcIikuaGlkZSgpKS5yZW1vdmUoKTtcblxuXHRcdFx0XHRcdHNsaWRlLiRwbGFjZWhvbGRlciA9IG51bGw7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBSZW1vdmUgY3VzdG9tIGNsb3NlIGJ1dHRvblxuXHRcdFx0XHRpZiAoc2xpZGUuJHNtYWxsQnRuKSB7XG5cdFx0XHRcdFx0c2xpZGUuJHNtYWxsQnRuLnJlbW92ZSgpO1xuXG5cdFx0XHRcdFx0c2xpZGUuJHNtYWxsQnRuID0gbnVsbDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFJlbW92ZSBjb250ZW50IGFuZCBtYXJrIHNsaWRlIGFzIG5vdCBsb2FkZWRcblx0XHRcdFx0aWYgKCFzbGlkZS5oYXNFcnJvcikge1xuXHRcdFx0XHRcdCQodGhpcykuZW1wdHkoKTtcblxuXHRcdFx0XHRcdHNsaWRlLmlzTG9hZGVkID0gZmFsc2U7XG5cdFx0XHRcdFx0c2xpZGUuaXNSZXZlYWxlZCA9IGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0JChjb250ZW50KS5hcHBlbmRUbyhzbGlkZS4kc2xpZGUpO1xuXG5cdFx0XHRpZiAoJChjb250ZW50KS5pcyhcInZpZGVvLGF1ZGlvXCIpKSB7XG5cdFx0XHRcdCQoY29udGVudCkuYWRkQ2xhc3MoXCJmYW5jeWJveC12aWRlb1wiKTtcblxuXHRcdFx0XHQkKGNvbnRlbnQpLndyYXAoXCI8ZGl2PjwvZGl2PlwiKTtcblxuXHRcdFx0XHRzbGlkZS5jb250ZW50VHlwZSA9IFwidmlkZW9cIjtcblxuXHRcdFx0XHRzbGlkZS5vcHRzLndpZHRoID0gc2xpZGUub3B0cy53aWR0aCB8fCAkKGNvbnRlbnQpLmF0dHIoXCJ3aWR0aFwiKTtcblx0XHRcdFx0c2xpZGUub3B0cy5oZWlnaHQgPSBzbGlkZS5vcHRzLmhlaWdodCB8fCAkKGNvbnRlbnQpLmF0dHIoXCJoZWlnaHRcIik7XG5cdFx0XHR9XG5cblx0XHRcdHNsaWRlLiRjb250ZW50ID0gc2xpZGUuJHNsaWRlXG5cdFx0XHRcdC5jaGlsZHJlbigpXG5cdFx0XHRcdC5maWx0ZXIoXCJkaXYsZm9ybSxtYWluLHZpZGVvLGF1ZGlvLGFydGljbGUsLmZhbmN5Ym94LWNvbnRlbnRcIilcblx0XHRcdFx0LmZpcnN0KCk7XG5cblx0XHRcdHNsaWRlLiRjb250ZW50LnNpYmxpbmdzKCkuaGlkZSgpO1xuXG5cdFx0XHQvLyBSZS1jaGVjayBpZiB0aGVyZSBpcyBhIHZhbGlkIGNvbnRlbnRcblx0XHRcdC8vIChpbiBzb21lIGNhc2VzLCBhamF4IHJlc3BvbnNlIGNhbiBjb250YWluIHZhcmlvdXMgZWxlbWVudHMgb3IgcGxhaW4gdGV4dClcblx0XHRcdGlmICghc2xpZGUuJGNvbnRlbnQubGVuZ3RoKSB7XG5cdFx0XHRcdHNsaWRlLiRjb250ZW50ID0gc2xpZGUuJHNsaWRlXG5cdFx0XHRcdFx0LndyYXBJbm5lcihcIjxkaXY+PC9kaXY+XCIpXG5cdFx0XHRcdFx0LmNoaWxkcmVuKClcblx0XHRcdFx0XHQuZmlyc3QoKTtcblx0XHRcdH1cblxuXHRcdFx0c2xpZGUuJGNvbnRlbnQuYWRkQ2xhc3MoXCJmYW5jeWJveC1jb250ZW50XCIpO1xuXG5cdFx0XHRzbGlkZS4kc2xpZGUuYWRkQ2xhc3MoXCJmYW5jeWJveC1zbGlkZS0tXCIgKyBzbGlkZS5jb250ZW50VHlwZSk7XG5cblx0XHRcdHNlbGYuYWZ0ZXJMb2FkKHNsaWRlKTtcblx0XHR9LFxuXG5cdFx0Ly8gRGlzcGxheSBlcnJvciBtZXNzYWdlXG5cdFx0Ly8gPT09PT09PT09PT09PT09PT09PT09XG5cblx0XHRzZXRFcnJvcjogZnVuY3Rpb24gKHNsaWRlKSB7XG5cdFx0XHRzbGlkZS5oYXNFcnJvciA9IHRydWU7XG5cblx0XHRcdHNsaWRlLiRzbGlkZVxuXHRcdFx0XHQudHJpZ2dlcihcIm9uUmVzZXRcIilcblx0XHRcdFx0LnJlbW92ZUNsYXNzKFwiZmFuY3lib3gtc2xpZGUtLVwiICsgc2xpZGUuY29udGVudFR5cGUpXG5cdFx0XHRcdC5hZGRDbGFzcyhcImZhbmN5Ym94LXNsaWRlLS1lcnJvclwiKTtcblxuXHRcdFx0c2xpZGUuY29udGVudFR5cGUgPSBcImh0bWxcIjtcblxuXHRcdFx0dGhpcy5zZXRDb250ZW50KHNsaWRlLCB0aGlzLnRyYW5zbGF0ZShzbGlkZSwgc2xpZGUub3B0cy5lcnJvclRwbCkpO1xuXG5cdFx0XHRpZiAoc2xpZGUucG9zID09PSB0aGlzLmN1cnJQb3MpIHtcblx0XHRcdFx0dGhpcy5pc0FuaW1hdGluZyA9IGZhbHNlO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQvLyBTaG93IGxvYWRpbmcgaWNvbiBpbnNpZGUgdGhlIHNsaWRlXG5cdFx0Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdFx0c2hvd0xvYWRpbmc6IGZ1bmN0aW9uIChzbGlkZSkge1xuXHRcdFx0dmFyIHNlbGYgPSB0aGlzO1xuXG5cdFx0XHRzbGlkZSA9IHNsaWRlIHx8IHNlbGYuY3VycmVudDtcblxuXHRcdFx0aWYgKHNsaWRlICYmICFzbGlkZS4kc3Bpbm5lcikge1xuXHRcdFx0XHRzbGlkZS4kc3Bpbm5lciA9ICQoc2VsZi50cmFuc2xhdGUoc2VsZiwgc2VsZi5vcHRzLnNwaW5uZXJUcGwpKVxuXHRcdFx0XHRcdC5hcHBlbmRUbyhzbGlkZS4kc2xpZGUpXG5cdFx0XHRcdFx0LmhpZGUoKVxuXHRcdFx0XHRcdC5mYWRlSW4oXCJmYXN0XCIpO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQvLyBSZW1vdmUgbG9hZGluZyBpY29uIGZyb20gdGhlIHNsaWRlXG5cdFx0Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdFx0aGlkZUxvYWRpbmc6IGZ1bmN0aW9uIChzbGlkZSkge1xuXHRcdFx0dmFyIHNlbGYgPSB0aGlzO1xuXG5cdFx0XHRzbGlkZSA9IHNsaWRlIHx8IHNlbGYuY3VycmVudDtcblxuXHRcdFx0aWYgKHNsaWRlICYmIHNsaWRlLiRzcGlubmVyKSB7XG5cdFx0XHRcdHNsaWRlLiRzcGlubmVyLnN0b3AoKS5yZW1vdmUoKTtcblxuXHRcdFx0XHRkZWxldGUgc2xpZGUuJHNwaW5uZXI7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdC8vIEFkanVzdG1lbnRzIGFmdGVyIHNsaWRlIGNvbnRlbnQgaGFzIGJlZW4gbG9hZGVkXG5cdFx0Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHRcdGFmdGVyTG9hZDogZnVuY3Rpb24gKHNsaWRlKSB7XG5cdFx0XHR2YXIgc2VsZiA9IHRoaXM7XG5cblx0XHRcdGlmIChzZWxmLmlzQ2xvc2luZykge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdHNsaWRlLmlzTG9hZGluZyA9IGZhbHNlO1xuXHRcdFx0c2xpZGUuaXNMb2FkZWQgPSB0cnVlO1xuXG5cdFx0XHRzZWxmLnRyaWdnZXIoXCJhZnRlckxvYWRcIiwgc2xpZGUpO1xuXG5cdFx0XHRzZWxmLmhpZGVMb2FkaW5nKHNsaWRlKTtcblxuXHRcdFx0Ly8gQWRkIHNtYWxsIGNsb3NlIGJ1dHRvblxuXHRcdFx0aWYgKHNsaWRlLm9wdHMuc21hbGxCdG4gJiYgKCFzbGlkZS4kc21hbGxCdG4gfHwgIXNsaWRlLiRzbWFsbEJ0bi5sZW5ndGgpKSB7XG5cdFx0XHRcdHNsaWRlLiRzbWFsbEJ0biA9ICQoc2VsZi50cmFuc2xhdGUoc2xpZGUsIHNsaWRlLm9wdHMuYnRuVHBsLnNtYWxsQnRuKSkuYXBwZW5kVG8oc2xpZGUuJGNvbnRlbnQpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBEaXNhYmxlIHJpZ2h0IGNsaWNrXG5cdFx0XHRpZiAoc2xpZGUub3B0cy5wcm90ZWN0ICYmIHNsaWRlLiRjb250ZW50ICYmICFzbGlkZS5oYXNFcnJvcikge1xuXHRcdFx0XHRzbGlkZS4kY29udGVudC5vbihcImNvbnRleHRtZW51LmZiXCIsIGZ1bmN0aW9uIChlKSB7XG5cdFx0XHRcdFx0aWYgKGUuYnV0dG9uID09IDIpIHtcblx0XHRcdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0Ly8gQWRkIGZha2UgZWxlbWVudCBvbiB0b3Agb2YgdGhlIGltYWdlXG5cdFx0XHRcdC8vIFRoaXMgbWFrZXMgYSBiaXQgaGFyZGVyIGZvciB1c2VyIHRvIHNlbGVjdCBpbWFnZVxuXHRcdFx0XHRpZiAoc2xpZGUudHlwZSA9PT0gXCJpbWFnZVwiKSB7XG5cdFx0XHRcdFx0JCgnPGRpdiBjbGFzcz1cImZhbmN5Ym94LXNwYWNlYmFsbFwiPjwvZGl2PicpLmFwcGVuZFRvKHNsaWRlLiRjb250ZW50KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRzZWxmLmFkanVzdENhcHRpb24oc2xpZGUpO1xuXG5cdFx0XHRzZWxmLmFkanVzdExheW91dChzbGlkZSk7XG5cblx0XHRcdGlmIChzbGlkZS5wb3MgPT09IHNlbGYuY3VyclBvcykge1xuXHRcdFx0XHRzZWxmLnVwZGF0ZUN1cnNvcigpO1xuXHRcdFx0fVxuXG5cdFx0XHRzZWxmLnJldmVhbENvbnRlbnQoc2xpZGUpO1xuXHRcdH0sXG5cblx0XHQvLyBQcmV2ZW50IGNhcHRpb24gb3ZlcmxhcCxcblx0XHQvLyBmaXggY3NzIGluY29uc2lzdGVuY3kgYW
6780Nyb3NzIGJyb3dzZXJzXG5cdFx0Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdFx0YWRqdXN0Q2FwdGlvbjogZnVuY3Rpb24gKHNsaWRlKSB7XG5cdFx0XHR2YXIgc2VsZiA9IHRoaXMsXG5cdFx0XHRcdGN1cnJlbnQgPSBzbGlkZSB8fCBzZWxmLmN1cnJlbnQsXG5cdFx0XHRcdGNhcHRpb24gPSBjdXJyZW50Lm9wdHMuY2FwdGlvbixcblx0XHRcdFx0cHJldmVudE92ZXJsYXAgPSBjdXJyZW50Lm9wdHMucHJldmVudENhcHRpb25PdmVybGFwLFxuXHRcdFx0XHQkY2FwdGlvbiA9IHNlbGYuJHJlZnMuY2FwdGlvbixcblx0XHRcdFx0JGNsb25lLFxuXHRcdFx0XHRjYXB0aW9uSCA9IGZhbHNlO1xuXG5cdFx0XHQkY2FwdGlvbi50b2dnbGVDbGFzcyhcImZhbmN5Ym94LWNhcHRpb24tLXNlcGFyYXRlXCIsIHByZXZlbnRPdmVybGFwKTtcblxuXHRcdFx0aWYgKHByZXZlbnRPdmVybGFwICYmIGNhcHRpb24gJiYgY2FwdGlvbi5sZW5ndGgpIHtcblx0XHRcdFx0aWYgKGN1cnJlbnQucG9zICE9PSBzZWxmLmN1cnJQb3MpIHtcblx0XHRcdFx0XHQkY2xvbmUgPSAkY2FwdGlvbi5jbG9uZSgpLmFwcGVuZFRvKCRjYXB0aW9uLnBhcmVudCgpKTtcblxuXHRcdFx0XHRcdCRjbG9uZVxuXHRcdFx0XHRcdFx0LmNoaWxkcmVuKClcblx0XHRcdFx0XHRcdC5lcSgwKVxuXHRcdFx0XHRcdFx0LmVtcHR5KClcblx0XHRcdFx0XHRcdC5odG1sKGNhcHRpb24pO1xuXG5cdFx0XHRcdFx0Y2FwdGlvbkggPSAkY2xvbmUub3V0ZXJIZWlnaHQodHJ1ZSk7XG5cblx0XHRcdFx0XHQkY2xvbmUuZW1wdHkoKS5yZW1vdmUoKTtcblx0XHRcdFx0fSBlbHNlIGlmIChzZWxmLiRjYXB0aW9uKSB7XG5cdFx0XHRcdFx0Y2FwdGlvbkggPSBzZWxmLiRjYXB0aW9uLm91dGVySGVpZ2h0KHRydWUpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y3VycmVudC4kc2xpZGUuY3NzKFwicGFkZGluZy1ib3R0b21cIiwgY2FwdGlvbkggfHwgXCJcIik7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdC8vIFNpbXBsZSBoYWNrIHRvIGZpeCBpbmNvbnNpc3RlbmN5IGFjcm9zcyBicm93c2VycywgZGVzY3JpYmVkIGhlcmUgKGFmZmVjdHMgRWRnZSwgdG9vKTpcblx0XHQvLyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD03NDg1MThcblx0XHQvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHRcdGFkanVzdExheW91dDogZnVuY3Rpb24gKHNsaWRlKSB7XG5cdFx0XHR2YXIgc2VsZiA9IHRoaXMsXG5cdFx0XHRcdGN1cnJlbnQgPSBzbGlkZSB8fCBzZWxmLmN1cnJlbnQsXG5cdFx0XHRcdHNjcm9sbEhlaWdodCxcblx0XHRcdFx0bWFyZ2luQm90dG9tLFxuXHRcdFx0XHRpbmxpbmVQYWRkaW5nLFxuXHRcdFx0XHRhY3R1YWxQYWRkaW5nO1xuXG5cdFx0XHRpZiAoY3VycmVudC5pc0xvYWRlZCAmJiBjdXJyZW50Lm9wdHMuZGlzYWJsZUxheW91dEZpeCAhPT0gdHJ1ZSkge1xuXHRcdFx0XHRjdXJyZW50LiRjb250ZW50LmNzcyhcIm1hcmdpbi1ib3R0b21cIiwgXCJcIik7XG5cblx0XHRcdFx0Ly8gSWYgd2Ugd291bGQgYWx3YXlzIHNldCBtYXJnaW4tYm90dG9tIGZvciB0aGUgY29udGVudCxcblx0XHRcdFx0Ly8gdGhlbiBpdCB3b3VsZCBwb3RlbnRpYWxseSBicmVhayB2ZXJ0aWNhbCBhbGlnblxuXHRcdFx0XHRpZiAoY3VycmVudC4kY29udGVudC5vdXRlckhlaWdodCgpID4gY3VycmVudC4kc2xpZGUuaGVpZ2h0KCkgKyAwLjUpIHtcblx0XHRcdFx0XHRpbmxpbmVQYWRkaW5nID0gY3VycmVudC4kc2xpZGVbMF0uc3R5bGVbXCJwYWRkaW5nLWJvdHRvbVwiXTtcblx0XHRcdFx0XHRhY3R1YWxQYWRkaW5nID0gY3VycmVudC4kc2xpZGUuY3NzKFwicGFkZGluZy1ib3R0b21cIik7XG5cblx0XHRcdFx0XHRpZiAocGFyc2VGbG9hdChhY3R1YWxQYWRkaW5nKSA+IDApIHtcblx0XHRcdFx0XHRcdHNjcm9sbEhlaWdodCA9IGN1cnJlbnQuJHNsaWRlWzBdLnNjcm9sbEhlaWdodDtcblxuXHRcdFx0XHRcdFx0Y3VycmVudC4kc2xpZGUuY3NzKFwicGFkZGluZy1ib3R0b21cIiwgMCk7XG5cblx0XHRcdFx0XHRcdGlmIChNYXRoLmFicyhzY3JvbGxIZWlnaHQgLSBjdXJyZW50LiRzbGlkZVswXS5zY3JvbGxIZWlnaHQpIDwgMSkge1xuXHRcdFx0XHRcdFx0XHRtYXJnaW5Cb3R0b20gPSBhY3R1YWxQYWRkaW5nO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRjdXJyZW50LiRzbGlkZS5jc3MoXCJwYWRkaW5nLWJvdHRvbVwiLCBpbmxpbmVQYWRkaW5nKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjdXJyZW50LiRjb250ZW50LmNzcyhcIm1hcmdpbi1ib3R0b21cIiwgbWFyZ2luQm90dG9tKTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0Ly8gTWFrZSBjb250ZW50IHZpc2libGVcblx0XHQvLyBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgcmlnaHQgYWZ0ZXIgY29udGVudCBoYXMgYmVlbiBsb2FkZWQgb3Jcblx0XHQvLyB1c2VyIG5hdmlnYXRlcyBnYWxsZXJ5IGFuZCB0cmFuc2l0aW9uIHNob3VsZCBzdGFydFxuXHRcdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdFx0cmV2ZWFsQ29udGVudDogZnVuY3Rpb24gKHNsaWRlKSB7XG5cdFx0XHR2YXIgc2VsZiA9IHRoaXMsXG5cdFx0XHRcdCRzbGlkZSA9IHNsaWRlLiRzbGlkZSxcblx0XHRcdFx0ZW5kID0gZmFsc2UsXG5cdFx0XHRcdHN0YXJ0ID0gZmFsc2UsXG5cdFx0XHRcdGlzTW92ZWQgPSBzZWxmLmlzTW92ZWQoc2xpZGUpLFxuXHRcdFx0XHRpc1JldmVhbGVkID0gc2xpZGUuaXNSZXZlYWxlZCxcblx0XHRcdFx0ZWZmZWN0LFxuXHRcdFx0XHRlZmZlY3RDbGFzc05hbWUsXG5cdFx0XHRcdGR1cmF0aW9uLFxuXHRcdFx0XHRvcGFjaXR5O1xuXG5cdFx0XHRzbGlkZS5pc1JldmVhbGVkID0gdHJ1ZTtcblxuXHRcdFx0ZWZmZWN0ID0gc2xpZGUub3B0c1tzZWxmLmZpcnN0UnVuID8gXCJhbmltYXRpb25FZmZlY3RcIiA6IFwidHJhbnNpdGlvbkVmZmVjdFwiXTtcblx0XHRcdGR1cmF0aW9uID0gc2xpZGUub3B0c1tzZWxmLmZpcnN0UnVuID8gXCJhbmltYXRpb25EdXJhdGlvblwiIDogXCJ0cmFuc2l0aW9uRHVyYXRpb25cIl07XG5cblx0XHRcdGR1cmF0aW9uID0gcGFyc2VJbnQoc2xpZGUuZm9yY2VkRHVyYXRpb24gPT09IHVuZGVmaW5lZCA/IGR1cmF0aW9uIDogc2xpZGUuZm9yY2VkRHVyYXRpb24sIDEwKTtcblxuXHRcdFx0aWYgKGlzTW92ZWQgfHwgc2xpZGUucG9zICE9PSBzZWxmLmN1cnJQb3MgfHwgIWR1cmF0aW9uKSB7XG5cdFx0XHRcdGVmZmVjdCA9IGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDaGVjayBpZiBjYW4gem9vbVxuXHRcdFx0aWYgKGVmZmVjdCA9PT0gXCJ6b29tXCIpIHtcblx0XHRcdFx0aWYgKHNsaWRlLnBvcyA9PT0gc2VsZi5jdXJyUG9zICYmIGR1cmF0aW9uICYmIHNsaWRlLnR5cGUgPT09IFwiaW1hZ2VcIiAmJiAhc2xpZGUuaGFzRXJyb3IgJiYgKHN0YXJ0ID0gc2VsZi5nZXRUaHVtYlBvcyhzbGlkZSkpKSB7XG5cdFx0XHRcdFx0ZW5kID0gc2VsZi5nZXRGaXRQb3Moc2xpZGUpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGVmZmVjdCA9IFwiZmFkZVwiO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFpvb20gYW5pbWF0aW9uXG5cdFx0XHQvLyA9PT09PT09PT09PT09PVxuXHRcdFx0aWYgKGVmZmVjdCA9PT0gXCJ6b29tXCIpIHtcblx0XHRcdFx0c2VsZi5pc0FuaW1hdGluZyA9IHRydWU7XG5cblx0XHRcdFx0ZW5kLnNjYWxlWCA9IGVuZC53aWR0aCAvIHN0YXJ0LndpZHRoO1xuXHRcdFx0XHRlbmQuc2NhbGVZID0gZW5kLmhlaWdodCAvIHN0YXJ0LmhlaWdodDtcblxuXHRcdFx0XHQvLyBDaGVjayBpZiB3ZSBuZWVkIHRvIGFuaW1hdGUgb3BhY2l0eVxuXHRcdFx0XHRvcGFjaXR5ID0gc2xpZGUub3B0cy56b29tT3BhY2l0eTtcblxuXHRcdFx0XHRpZiAob3BhY2l0eSA9PSBcImF1dG9cIikge1xuXHRcdFx0XHRcdG9wYWNpdHkgPSBNYXRoLmFicyhzbGlkZS53aWR0aCAvIHNsaWRlLmhlaWdodCAtIHN0YXJ0LndpZHRoIC8gc3RhcnQuaGVpZ2h0KSA+IDAuMTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChvcGFjaXR5KSB7XG5cdFx0XHRcdFx0c3RhcnQub3BhY2l0eSA9IDAuMTtcblx0XHRcdFx0XHRlbmQub3BhY2l0eSA9IDE7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBEcmF3IGltYWdlIGF0IHN0YXJ0IHBvc2l0aW9uXG5cdFx0XHRcdCQuZmFuY3lib3guc2V0VHJhbnNsYXRlKHNsaWRlLiRjb250ZW50LnJlbW92ZUNsYXNzKFwiZmFuY3lib3gtaXMtaGlkZGVuXCIpLCBzdGFydCk7XG5cblx0XHRcdFx0Zm9yY2VSZWRyYXcoc2xpZGUuJGNvbnRlbnQpO1xuXG5cdFx0XHRcdC8vIFN0YXJ0IGFuaW1hdGlvblxuXHRcdFx0XHQkLmZhbmN5Ym94LmFuaW1hdGUoc2xpZGUuJGNvbnRlbnQsIGVuZCwgZHVyYXRpb24sIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRzZWxmLmlzQW5pbWF0aW5nID0gZmFsc2U7XG5cblx0XHRcdFx0XHRzZWxmLmNvbXBsZXRlKCk7XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0c2VsZi51cGRhdGVTbGlkZShzbGlkZSk7XG5cblx0XHRcdC8vIFNpbXBseSBzaG93IGNvbnRlbnQgaWYgbm8gZWZmZWN0XG5cdFx0XHQvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXHRcdFx0aWYgKCFlZmZlY3QpIHtcblx0XHRcdFx0c2xpZGUuJGNvbnRlbnQucmVtb3ZlQ2xhc3MoXCJmYW5jeWJveC1pcy1oaWRkZW5cIik7XG5cblx0XHRcdFx0aWYgKCFpc1JldmVhbGVkICYmIGlzTW92ZWQgJiYgc2xpZGUudHlwZSA9PT0gXCJpbWFnZVwiICYmICFzbGlkZS5oYXNFcnJvcikge1xuXHRcdFx0XHRcdHNsaWRlLiRjb250ZW50LmhpZGUoKS5mYWRlSW4oXCJmYXN0XCIpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHNsaWRlLnBvcyA9PT0gc2VsZi5jdXJyUG9zKSB7XG5cdFx0XHRcdFx0c2VsZi5jb21wbGV0ZSgpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBQcmVwYXJlIGZvciBDU1MgdHJhbnNpdG9uXG5cdFx0XHQvLyA9PT09PT09PT09PT09PT09PT09PT09PT09XG5cdFx0XHQkLmZhbmN5Ym94LnN0b3AoJHNsaWRlKTtcblxuXHRcdFx0Ly9lZmZlY3RDbGFzc05hbWUgPSBcImZhbmN5Ym94LWFuaW1hdGVkIGZhbmN5Ym94LXNsaWRlLS1cIiArIChzbGlkZS5wb3MgPj0gc2VsZi5wcmV2UG9zID8gXCJuZXh0XCIgOiBcInByZX
6780Zpb3VzXCIpICsgXCIgZmFuY3lib3gtZngtXCIgKyBlZmZlY3Q7XG5cdFx0XHRlZmZlY3RDbGFzc05hbWUgPSBcImZhbmN5Ym94LXNsaWRlLS1cIiArIChzbGlkZS5wb3MgPj0gc2VsZi5wcmV2UG9zID8gXCJuZXh0XCIgOiBcInByZXZpb3VzXCIpICsgXCIgZmFuY3lib3gtYW5pbWF0ZWQgZmFuY3lib3gtZngtXCIgKyBlZmZlY3Q7XG5cblx0XHRcdCRzbGlkZS5hZGRDbGFzcyhlZmZlY3RDbGFzc05hbWUpLnJlbW92ZUNsYXNzKFwiZmFuY3lib3gtc2xpZGUtLWN1cnJlbnRcIik7IC8vLmFkZENsYXNzKGVmZmVjdENsYXNzTmFtZSk7XG5cblx0XHRcdHNsaWRlLiRjb250ZW50LnJlbW92ZUNsYXNzKFwiZmFuY3lib3gtaXMtaGlkZGVuXCIpO1xuXG5cdFx0XHQvLyBGb3JjZSByZWZsb3dcblx0XHRcdGZvcmNlUmVkcmF3KCRzbGlkZSk7XG5cblx0XHRcdGlmIChzbGlkZS50eXBlICE9PSBcImltYWdlXCIpIHtcblx0XHRcdFx0c2xpZGUuJGNvbnRlbnQuaGlkZSgpLnNob3coMCk7XG5cdFx0XHR9XG5cblx0XHRcdCQuZmFuY3lib3guYW5pbWF0ZShcblx0XHRcdFx0JHNsaWRlLFxuXHRcdFx0XHRcImZhbmN5Ym94LXNsaWRlLS1jdXJyZW50XCIsXG5cdFx0XHRcdGR1cmF0aW9uLFxuXHRcdFx0XHRmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0JHNsaWRlLnJlbW92ZUNsYXNzKGVmZmVjdENsYXNzTmFtZSkuY3NzKHtcblx0XHRcdFx0XHRcdHRyYW5zZm9ybTogXCJcIixcblx0XHRcdFx0XHRcdG9wYWNpdHk6IFwiXCJcblx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdGlmIChzbGlkZS5wb3MgPT09IHNlbGYuY3VyclBvcykge1xuXHRcdFx0XHRcdFx0c2VsZi5jb21wbGV0ZSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblx0XHRcdFx0dHJ1ZVxuXHRcdFx0KTtcblx0XHR9LFxuXG5cdFx0Ly8gQ2hlY2sgaWYgd2UgY2FuIGFuZCBoYXZlIHRvIHpvb20gZnJvbSB0aHVtYm5haWxcblx0XHQvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdFx0Z2V0VGh1bWJQb3M6IGZ1bmN0aW9uIChzbGlkZSkge1xuXHRcdFx0dmFyIHJleiA9IGZhbHNlLFxuXHRcdFx0XHQkdGh1bWIgPSBzbGlkZS4kdGh1bWIsXG5cdFx0XHRcdHRodW1iUG9zLFxuXHRcdFx0XHRidHcsXG5cdFx0XHRcdGJydyxcblx0XHRcdFx0YmJ3LFxuXHRcdFx0XHRibHc7XG5cblx0XHRcdGlmICghJHRodW1iIHx8ICFpblZpZXdwb3J0KCR0aHVtYlswXSkpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHR0aHVtYlBvcyA9ICQuZmFuY3lib3guZ2V0VHJhbnNsYXRlKCR0aHVtYik7XG5cblx0XHRcdGJ0dyA9IHBhcnNlRmxvYXQoJHRodW1iLmNzcyhcImJvcmRlci10b3Atd2lkdGhcIikgfHwgMCk7XG5cdFx0XHRicncgPSBwYXJzZUZsb2F0KCR0aHVtYi5jc3MoXCJib3JkZXItcmlnaHQtd2lkdGhcIikgfHwgMCk7XG5cdFx0XHRiYncgPSBwYXJzZUZsb2F0KCR0aHVtYi5jc3MoXCJib3JkZXItYm90dG9tLXdpZHRoXCIpIHx8IDApO1xuXHRcdFx0Ymx3ID0gcGFyc2VGbG9hdCgkdGh1bWIuY3NzKFwiYm9yZGVyLWxlZnQtd2lkdGhcIikgfHwgMCk7XG5cblx0XHRcdHJleiA9IHtcblx0XHRcdFx0dG9wOiB0aHVtYlBvcy50b3AgKyBidHcsXG5cdFx0XHRcdGxlZnQ6IHRodW1iUG9zLmxlZnQgKyBibHcsXG5cdFx0XHRcdHdpZHRoOiB0aHVtYlBvcy53aWR0aCAtIGJydyAtIGJsdyxcblx0XHRcdFx0aGVpZ2h0OiB0aHVtYlBvcy5oZWlnaHQgLSBidHcgLSBiYncsXG5cdFx0XHRcdHNjYWxlWDogMSxcblx0XHRcdFx0c2NhbGVZOiAxXG5cdFx0XHR9O1xuXG5cdFx0XHRyZXR1cm4gdGh1bWJQb3Mud2lkdGggPiAwICYmIHRodW1iUG9zLmhlaWdodCA+IDAgPyByZXogOiBmYWxzZTtcblx0XHR9LFxuXG5cdFx0Ly8gRmluYWwgYWRqdXN0bWVudHMgYWZ0ZXIgY3VycmVudCBnYWxsZXJ5IGl0ZW0gaXMgbW92ZWQgdG8gcG9zaXRpb25cblx0XHQvLyBhbmQgaXRgcyBjb250ZW50IGlzIGxvYWRlZFxuXHRcdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdFx0Y29tcGxldGU6IGZ1bmN0aW9uICgpIHtcblx0XHRcdHZhciBzZWxmID0gdGhpcyxcblx0XHRcdFx0Y3VycmVudCA9IHNlbGYuY3VycmVudCxcblx0XHRcdFx0c2xpZGVzID0ge30sXG5cdFx0XHRcdCRlbDtcblxuXHRcdFx0aWYgKHNlbGYuaXNNb3ZlZCgpIHx8ICFjdXJyZW50LmlzTG9hZGVkKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCFjdXJyZW50LmlzQ29tcGxldGUpIHtcblx0XHRcdFx0Y3VycmVudC5pc0NvbXBsZXRlID0gdHJ1ZTtcblxuXHRcdFx0XHRjdXJyZW50LiRzbGlkZS5zaWJsaW5ncygpLnRyaWdnZXIoXCJvblJlc2V0XCIpO1xuXG5cdFx0XHRcdHNlbGYucHJlbG9hZChcImlubGluZVwiKTtcblxuXHRcdFx0XHQvLyBUcmlnZ2VyIGFueSBDU1MgdHJhbnNpdG9uIGluc2lkZSB0aGUgc2xpZGVcblx0XHRcdFx0Zm9yY2VSZWRyYXcoY3VycmVudC4kc2xpZGUpO1xuXG5cdFx0XHRcdGN1cnJlbnQuJHNsaWRlLmFkZENsYXNzKFwiZmFuY3lib3gtc2xpZGUtLWNvbXBsZXRlXCIpO1xuXG5cdFx0XHRcdC8vIFJlbW92ZSB1bm5lY2Vzc2FyeSBzbGlkZXNcblx0XHRcdFx0JC5lYWNoKHNlbGYuc2xpZGVzLCBmdW5jdGlvbiAoa2V5LCBzbGlkZSkge1xuXHRcdFx0XHRcdGlmIChzbGlkZS5wb3MgPj0gc2VsZi5jdXJyUG9zIC0gMSAmJiBzbGlkZS5wb3MgPD0gc2VsZi5jdXJyUG9zICsgMSkge1xuXHRcdFx0XHRcdFx0c2xpZGVzW3NsaWRlLnBvc10gPSBzbGlkZTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHNsaWRlKSB7XG5cdFx0XHRcdFx0XHQkLmZhbmN5Ym94LnN0b3Aoc2xpZGUuJHNsaWRlKTtcblxuXHRcdFx0XHRcdFx0c2xpZGUuJHNsaWRlLm9mZigpLnJlbW92ZSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0c2VsZi5zbGlkZXMgPSBzbGlkZXM7XG5cdFx0XHR9XG5cblx0XHRcdHNlbGYuaXNBbmltYXRpbmcgPSBmYWxzZTtcblxuXHRcdFx0c2VsZi51cGRhdGVDdXJzb3IoKTtcblxuXHRcdFx0c2VsZi50cmlnZ2VyKFwiYWZ0ZXJTaG93XCIpO1xuXG5cdFx0XHQvLyBBdXRvcGxheSBmaXJzdCBodG1sNSB2aWRlby9hdWRpb1xuXHRcdFx0aWYgKCEhY3VycmVudC5vcHRzLnZpZGVvLmF1dG9TdGFydCkge1xuXHRcdFx0XHRjdXJyZW50LiRzbGlkZVxuXHRcdFx0XHRcdC5maW5kKFwidmlkZW8sYXVkaW9cIilcblx0XHRcdFx0XHQuZmlsdGVyKFwiOnZpc2libGU6Zmlyc3RcIilcblx0XHRcdFx0XHQudHJpZ2dlcihcInBsYXlcIilcblx0XHRcdFx0XHQub25lKFwiZW5kZWRcIiwgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0aWYgKERvY3VtZW50LmV4aXRGdWxsc2NyZWVuKSB7XG5cdFx0XHRcdFx0XHRcdERvY3VtZW50LmV4aXRGdWxsc2NyZWVuKCk7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHRoaXMud2Via2l0RXhpdEZ1bGxzY3JlZW4pIHtcblx0XHRcdFx0XHRcdFx0dGhpcy53ZWJraXRFeGl0
6780RnVsbHNjcmVlbigpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRzZWxmLm5leHQoKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVHJ5IHRvIGZvY3VzIG9uIHRoZSBmaXJzdCBmb2N1c2FibGUgZWxlbWVudFxuXHRcdFx0aWYgKGN1cnJlbnQub3B0cy5hdXRvRm9jdXMgJiYgY3VycmVudC5jb250ZW50VHlwZSA9PT0gXCJodG1sXCIpIHtcblx0XHRcdFx0Ly8gTG9vayBmb3IgdGhlIGZpcnN0IGlucHV0IHdpdGggYXV0b2ZvY3VzIGF0dHJpYnV0ZVxuXHRcdFx0XHQkZWwgPSBjdXJyZW50LiRjb250ZW50LmZpbmQoXCJpbnB1dFthdXRvZm9jdXNdOmVuYWJsZWQ6dmlzaWJsZTpmaXJzdFwiKTtcblxuXHRcdFx0XHRpZiAoJGVsLmxlbmd0aCkge1xuXHRcdFx0XHRcdCRlbC50cmlnZ2VyKFwiZm9jdXNcIik7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0c2VsZi5mb2N1cyhudWxsLCB0cnVlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBBdm9pZCBqdW1waW5nXG5cdFx0XHRjdXJyZW50LiRzbGlkZS5zY3JvbGxUb3AoMCkuc2Nyb2xsTGVmdCgwKTtcblx0XHR9LFxuXG5cdFx0Ly8gUHJlbG9hZCBuZXh0IGFuZCBwcmV2aW91cyBzbGlkZXNcblx0XHQvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdFx0cHJlbG9hZDogZnVuY3Rpb24gKHR5cGUpIHtcblx0XHRcdHZhciBzZWxmID0gdGhpcyxcblx0XHRcdFx0cHJldixcblx0XHRcdFx0bmV4dDtcblxuXHRcdFx0aWYgKHNlbGYuZ3JvdXAubGVuZ3RoIDwgMikge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdG5leHQgPSBzZWxmLnNsaWRlc1tzZWxmLmN1cnJQb3MgKyAxXTtcblx0XHRcdHByZXYgPSBzZWxmLnNsaWRlc1tzZWxmLmN1cnJQb3MgLSAxXTtcblxuXHRcdFx0aWYgKHByZXYgJiYgcHJldi50eXBlID09PSB0eXBlKSB7XG5cdFx0XHRcdHNlbGYubG9hZFNsaWRlKHByZXYpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAobmV4dCAmJiBuZXh0LnR5cGUgPT09IHR5cGUpIHtcblx0XHRcdFx0c2VsZi5sb2FkU2xpZGUobmV4dCk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdC8vIFRyeSB0byBmaW5kIGFuZCBmb2N1cyBvbiB0aGUgZmlyc3QgZm9jdXNhYmxlIGVsZW1lbnRcblx0XHQvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblx0XHRmb2N1czogZnVuY3Rpb24gKGUsIGZpcnN0UnVuKSB7XG5cdFx0XHR2YXIgc2VsZiA9IHRoaXMsXG5cdFx0XHRcdGZvY3VzYWJsZVN0ciA9IFtcblx0XHRcdFx0XHRcImFbaHJlZl1cIixcblx0XHRcdFx0XHRcImFyZWFbaHJlZl1cIixcblx0XHRcdFx0XHQnaW5wdXQ6bm90KFtkaXNhYmxlZF0pOm5vdChbdHlwZT1cImhpZGRlblwiXSk6bm90KFthcmlhLWhpZGRlbl0pJyxcblx0XHRcdFx0XHRcInNlbGVjdDpub3QoW2Rpc2FibGVkXSk6bm90KFthcmlhLWhpZGRlbl0pXCIsXG5cdFx0XHRcdFx0XCJ0ZXh0YXJlYTpub3QoW2Rpc2FibGVkXSk6bm90KFthcmlhLWhpZGRlbl0pXCIsXG5cdFx0XHRcdFx0XCJidXR0b246bm90KFtkaXNhYmxlZF0pOm5vdChbYXJpYS1oaWRkZW5dKVwiLFxuXHRcdFx0XHRcdFwiaWZyYW1lXCIsXG5cdFx0XHRcdFx0XCJvYmplY3RcIixcblx0XHRcdFx0XHRcImVtYmVkXCIsXG5cdFx0XHRcdFx0XCJ2aWRlb1wiLFxuXHRcdFx0XHRcdFwiYXVkaW9cIixcblx0XHRcdFx0XHRcIltjb250ZW50ZWRpdGFibGVdXCIsXG5cdFx0XHRcdFx0J1t0YWJpbmRleF06bm90KFt0YWJpbmRleF49XCItXCJdKSdcblx0XHRcdFx0XS5qb2luKFwiLFwiKSxcblx0XHRcdFx0Zm9jdXNhYmxlSXRlbXMsXG5cdFx0XHRcdGZvY3VzZWRJdGVtSW5kZXg7XG5cblx0XHRcdGlmIChzZWxmLmlzQ2xvc2luZykge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGlmIChlIHx8ICFzZWxmLmN1cnJlbnQgfHwgIXNlbGYuY3VycmVudC5pc0NvbXBsZXRlKSB7XG5cdFx0XHRcdC8vIEZvY3VzIG9uIGFueSBlbGVtZW50IGluc2lkZSBmYW5jeWJveFxuXHRcdFx0XHRmb2N1c2FibGVJdGVtcyA9IHNlbGYuJHJlZnMuY29udGFpbmVyLmZpbmQoXCIqOnZpc2libGVcIik7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBGb2N1cyBpbnNpZGUgY3VycmVudCBzbGlkZVxuXHRcdFx0XHRmb2N1c2FibGVJdGVtcyA9IHNlbGYuY3VycmVudC4kc2xpZGUuZmluZChcIio6dmlzaWJsZVwiICsgKGZpcnN0UnVuID8gXCI6bm90KC5mYW5jeWJveC1jbG9zZS1zbWFsbClcIiA6IFwiXCIpKTtcblx0XHRcdH1cblxuXHRcdFx0Zm9jdXNhYmxlSXRlbXMgPSBmb2N1c2FibGVJdGVtcy5maWx0ZXIoZm9jdXNhYmxlU3RyKS5maWx0ZXIoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRyZXR1cm4gJCh0aGlzKS5jc3MoXCJ2aXNpYmlsaXR5XCIpICE9PSBcImhpZGRlblwiICYmICEkKHRoaXMpLmhhc0NsYXNzKFwiZGlzYWJsZWRcIik7XG5cdFx0XHR9KTtcblxuXHRcdFx0aWYgKGZvY3VzYWJsZUl0ZW1zLmxlbmd0aCkge1xuXHRcdFx0XHRmb2N1c2VkSXRlbUluZGV4ID0gZm9jdXNhYmxlSXRlbXMuaW5kZXgoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCk7XG5cblx0XHRcdFx0aWYgKGUgJiYgZS5zaGlmdEtleSkge1xuXHRcdFx0XHRcdC8vIEJhY2sgdGFiXG5cdFx0XHRcdFx0aWYgKGZvY3VzZWRJdGVtSW5kZXggPCAwIHx8IGZvY3VzZWRJdGVtSW5kZXggPT0gMCkge1xuXHRcdFx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG5cdFx0XHRcdFx0XHRmb2N1c2FibGVJdGVtcy5lcShmb2N1c2FibGVJdGVtcy5sZW5ndGggLSAxKS50cmlnZ2VyKFwiZm9jdXNcIik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIE91dHNpZGUgb3IgRm9yd2FyZCB0YWJcblx0XHRcdFx0XHRpZiAoZm9jdXNlZEl0ZW1JbmRleCA8IDAgfHwgZm9jdXNlZEl0ZW1JbmRleCA9PSBmb2N1c2FibGVJdGVtcy5sZW5ndGggLSAxKSB7XG5cdFx0XHRcdFx0XHRpZiAoZSkge1xuXHRcdFx0XHRcdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGZvY3VzYWJsZUl0ZW1zLmVxKDApLnRyaWdnZXIoXCJmb2N1c1wiKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHNlbGYuJHJlZnMuY29udGFpbmVyLnRyaWdnZXIoXCJmb2N1c1wiKTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0Ly8gQWN0aXZhdGVzIGN1cnJlbnQgaW5zdGFuY2UgLSBicmluZ3MgY29udGFpbmVyIHRvIHRoZSBmcm9udCBhbmQgZW5hYmxlcyBrZXlib2FyZCxcblx0XHQvLyBub3RpZmllcyBvdGhlciBpbnN0YW5jZXMgYWJvdXQgZGVhY3RpdmF0aW5nXG5cdFx0Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblx0XHRhY3RpdmF0ZTogZnVuY3Rpb24gKCkge1xuXHRcdFx0dmFyIHNlbGYgPSB0aGlzO1xuXG5cdFx0XHQvLyBEZWFjdGl2YXRlIGFsbCBpbnN0YW5jZXNcblx0XHRcdCQoXCIuZmFuY3lib3gtY29udGFpbmVyXCIpLmVhY2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHR2YXIgaW5zdGFuY2UgPSAkKHRoaXMpLmRhdGEoXCJGYW5jeUJveFwiKTtcblxuXHRcdFx0XHQvLyBTa2lwIHNlbGYgYW5kIGNsb3NpbmcgaW5zdGFuY2VzXG5cdFx0XHRcdGlmIChpbnN0YW5jZSAmJiBpbnN0YW5jZS5pZCAhPT0gc2VsZi5pZCAmJiAhaW5zdGFuY2UuaXNDbG9zaW5nKSB7XG5cdFx0XHRcdFx0aW5zdGFuY2UudHJpZ2dlcihcIm9uRGVhY3RpdmF0ZVwiKTtcblxuXHRcdFx0XHRcdGluc3RhbmNlLnJlbW92ZUV2ZW50cygpO1xuXG5cdFx0XHRcdFx0aW5zdGFuY2UuaXNWaXNpYmxlID0gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHRzZWxmLmlzVmlzaWJsZSA9IHRydWU7XG5cblx0XHRcdGlmIChzZWxmLmN1cnJlbnQgfHwgc2VsZi5pc0lkbGUpIHtcblx0XHRcdFx0c2VsZi51cGRhdGUoKTtcblxuXHRcdFx0XHRzZWxmLnVwZGF0ZUNvbnRyb2xzKCk7XG5cdFx0XHR9XG5cblx0XHRcdHNlbGYudHJpZ2dlcihcIm9uQWN0aXZhdGVcIik7XG5cblx0XHRcdHNlbGYuYWRkRXZlbnRzKCk7XG5cdFx0fSxcblxuXHRcdC8vIFN0YXJ0IGNsb3NpbmcgcHJvY2VkdXJlXG5cdFx0Ly8gVGhpcyB3aWxsIHN0YXJ0IFwiem9vbS1vdXRcIiBhbmltYXRpb24gaWYgbmVlZGVkIGFuZCBjbGVhbiBldmVyeXRoaW5nIHVwIGFmdGVyd2FyZHNcblx0XHQvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHRcdGNsb3NlOiBmdW5jdGlvbiAoZSwgZCkge1xuXHRcdFx0dmFyIHNlbGYgPSB0aGlzLFxuXHRcdFx0XHRjdXJyZW50ID0gc2VsZi5jdXJyZW50LFxuXHRcdFx0XHRlZmZlY3QsXG5cdFx0XHRcdGR1cmF0aW9uLFxuXHRcdFx0XHQkY29udGVudCxcblx0XHRcdFx0ZG9tUmVjdCxcblx0XHRcdFx0b3BhY2l0eSxcblx0XHRcdFx0c3RhcnQsXG5cdFx0XHRcdGVuZDtcblxuXHRcdFx0dmFyIGRvbmUgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHNlbGYuY2xlYW5VcChlKTtcblx0XHRcdH07XG5cblx0XHRcdGlmIChzZWxmLmlzQ2xvc2luZykge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cblx0XHRcdHNlbGYuaXNDbG9zaW5nID0gdHJ1ZTtcblxuXHRcdFx0Ly8gSWYgYmVmb3JlQ2xvc2UgY2FsbGJhY2sgcHJldmVudHMgY2xvc2luZywgbWFrZSBzdXJlIGNvbnRlbnQgaXMgY2VudGVyZWRcblx0XHRcdGlmIChzZWxmLnRyaWdnZXIoXCJiZWZvcmVDbG9zZVwiLCBlKSA9PT0gZmFsc2UpIHtcblx0XHRcdFx0c2VsZi5pc0Nsb3NpbmcgPSBmYWxzZTtcblxuXHRcdFx0XHRyZXF1
6780ZXN0QUZyYW1lKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRzZWxmLnVwZGF0ZSgpO1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJlbW92ZSBhbGwgZXZlbnRzXG5cdFx0XHQvLyBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgaW5zdGFuY2VzLCB0aGV5IHdpbGwgYmUgc2V0IGFnYWluIGJ5IFwiYWN0aXZhdGVcIiBtZXRob2Rcblx0XHRcdHNlbGYucmVtb3ZlRXZlbnRzKCk7XG5cblx0XHRcdCRjb250ZW50ID0gY3VycmVudC4kY29udGVudDtcblx0XHRcdGVmZmVjdCA9IGN1cnJlbnQub3B0cy5hbmltYXRpb25FZmZlY3Q7XG5cdFx0XHRkdXJhdGlvbiA9ICQuaXNOdW1lcmljKGQpID8gZCA6IGVmZmVjdCA/IGN1cnJlbnQub3B0cy5hbmltYXRpb25EdXJhdGlvbiA6IDA7XG5cblx0XHRcdGN1cnJlbnQuJHNsaWRlLnJlbW92ZUNsYXNzKFwiZmFuY3lib3gtc2xpZGUtLWNvbXBsZXRlIGZhbmN5Ym94LXNsaWRlLS1uZXh0IGZhbmN5Ym94LXNsaWRlLS1wcmV2aW91cyBmYW5jeWJveC1hbmltYXRlZFwiKTtcblxuXHRcdFx0aWYgKGUgIT09IHRydWUpIHtcblx0XHRcdFx0JC5mYW5jeWJveC5zdG9wKGN1cnJlbnQuJHNsaWRlKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGVmZmVjdCA9IGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZW1vdmUgb3RoZXIgc2xpZGVzXG5cdFx0XHRjdXJyZW50LiRzbGlkZVxuXHRcdFx0XHQuc2libGluZ3MoKVxuXHRcdFx0XHQudHJpZ2dlcihcIm9uUmVzZXRcIilcblx0XHRcdFx0LnJlbW92ZSgpO1xuXG5cdFx0XHQvLyBUcmlnZ2VyIGFuaW1hdGlvbnNcblx0XHRcdGlmIChkdXJhdGlvbikge1xuXHRcdFx0XHRzZWxmLiRyZWZzLmNvbnRhaW5lclxuXHRcdFx0XHRcdC5yZW1vdmVDbGFzcyhcImZhbmN5Ym94LWlzLW9wZW5cIilcblx0XHRcdFx0XHQuYWRkQ2xhc3MoXCJmYW5jeWJveC1pcy1jbG9zaW5nXCIpXG5cdFx0XHRcdFx0LmNzcyhcInRyYW5zaXRpb24tZHVyYXRpb25cIiwgZHVyYXRpb24gKyBcIm1zXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDbGVhbiB1cFxuXHRcdFx0c2VsZi5oaWRlTG9hZGluZyhjdXJyZW50KTtcblxuXHRcdFx0c2VsZi5oaWRlQ29udHJvbHModHJ1ZSk7XG5cblx0XHRcdHNlbGYudXBkYXRlQ3Vyc29yKCk7XG5cblx0XHRcdC8vIENoZWNrIGlmIHBvc3NpYmxlIHRvIHpvb20tb3V0XG5cdFx0XHRpZiAoXG5cdFx0XHRcdGVmZmVjdCA9PT0gXCJ6b29tXCIgJiZcblx0XHRcdFx0ISgkY29udGVudCAmJiBkdXJhdGlvbiAmJiBjdXJyZW50LnR5cGUgPT09IFwiaW1hZ2VcIiAmJiAhc2VsZi5pc01vdmVkKCkgJiYgIWN1cnJlbnQuaGFzRXJyb3IgJiYgKGVuZCA9IHNlbGYuZ2V0VGh1bWJQb3MoY3VycmVudCkpKVxuXHRcdFx0KSB7XG5cdFx0XHRcdGVmZmVjdCA9IFwiZmFkZVwiO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoZWZmZWN0ID09PSBcInpvb21cIikge1xuXHRcdFx0XHQkLmZhbmN5Ym94LnN0b3AoJGNvbnRlbnQpO1xuXG5cdFx0XHRcdGRvbVJlY3QgPSAkLmZhbmN5Ym94LmdldFRyYW5zbGF0ZSgkY29udGVudCk7XG5cblx0XHRcdFx0c3RhcnQgPSB7XG5cdFx0XHRcdFx0dG9wOiBkb21SZWN0LnRvcCxcblx0XHRcdFx0XHRsZWZ0OiBkb21SZWN0LmxlZnQsXG5cdFx0XHRcdFx0c2NhbGVYOiBkb21SZWN0LndpZHRoIC8gZW5kLndpZHRoLFxuXHRcdFx0XHRcdHNjYWxlWTogZG9tUmVjdC5oZWlnaHQgLyBlbmQuaGVpZ2h0LFxuXHRcdFx0XHRcdHdpZHRoOiBlbmQud2lkdGgsXG5cdFx0XHRcdFx0aGVpZ2h0OiBlbmQuaGVpZ2h0XG5cdFx0XHRcdH07XG5cblx0XHRcdFx0Ly8gQ2hlY2sgaWYgd2UgbmVlZCB0byBhbmltYXRlIG9wYWNpdHlcblx0XHRcdFx0b3BhY2l0eSA9IGN1cnJlbnQub3B0cy56b29tT3BhY2l0eTtcblxuXHRcdFx0XHRpZiAob3BhY2l0eSA9PSBcImF1dG9cIikge1xuXHRcdFx0XHRcdG9wYWNpdHkgPSBNYXRoLmFicyhjdXJyZW50LndpZHRoIC8gY3VycmVudC5oZWlnaHQgLSBlbmQud2lkdGggLyBlbmQuaGVpZ2h0KSA+IDAuMTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChvcGFjaXR5KSB7XG5cdFx0XHRcdFx0ZW5kLm9wYWNpdHkgPSAwO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0JC5mYW5jeWJveC5zZXRUcmFuc2xhdGUoJGNvbnRlbnQsIHN0YXJ0KTtcblxuXHRcdFx0XHRmb3JjZVJlZHJhdygkY29udGVudCk7XG5cblx0XHRcdFx0JC5mYW5jeWJveC5hbmltYXRlKCRjb250ZW50LCBlbmQsIGR1cmF0aW9uLCBkb25lKTtcblxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGVmZmVjdCAmJiBkdXJhdGlvbikge1xuXHRcdFx0XHQkLmZhbmN5Ym94LmFuaW1hdGUoXG5cdFx0XHRcdFx0Y3VycmVudC4kc2xpZGUuYWRkQ2xhc3MoXCJmYW5jeWJveC1zbGlkZS0tcHJldmlvdXNcIikucmVtb3ZlQ2xhc3MoXCJmYW5jeWJveC1zbGlkZS0tY3VycmVudFwiKSxcblx0XHRcdFx0XHRcImZhbmN5Ym94LWFuaW1hdGVkIGZhbmN5Ym94LWZ4LVwiICsgZWZmZWN0LFxuXHRcdFx0XHRcdGR1cmF0aW9uLFxuXHRcdFx0XHRcdGRvbmVcblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIElmIHNraXAgYW5pbWF0aW9uXG5cdFx0XHRcdGlmIChlID09PSB0cnVlKSB7XG5cdFx0XHRcdFx0c2V0VGltZW91dChkb25lLCBkdXJhdGlvbik7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0ZG9uZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0sXG5cblx0XHQvLyBGaW5hbCBhZGp1c3RtZW50cyBhZnRlciByZW1vdmluZyB0aGUgaW5zdGFuY2Vcblx0XHQvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHRcdGNsZWFuVXA6IGZ1bmN0aW9uIChlKSB7XG5cdFx0XHR2YXIgc2VsZiA9IHRoaXMsXG5cdFx0XHRcdGluc3RhbmNlLFxuXHRcdFx0XHQkZm9jdXMgPSBzZWxmLmN1cnJlbnQub3B0cy4kb3JpZyxcblx0XHRcdFx0eCxcblx0XHRcdFx0eTtcblxuXHRcdFx0c2VsZi5jdXJyZW50LiRzbGlkZS50cmlnZ2VyKFwib25SZXNldFwiKTtcblxuXHRcdFx0c2VsZi4kcmVmcy5jb250YWluZXIuZW1wdHkoKS5yZW1vdmUoKTtcblxuXHRcdFx0c2VsZi50cmlnZ2VyKFwiYWZ0ZXJDbG9zZVwiLCBlKTtcblxuXHRcdFx0Ly8gUGxhY2UgYmFjayBmb2N1c1xuXHRcdFx0aWYgKCEhc2VsZi5jdXJyZW50Lm9wdHMuYmFja0ZvY3VzKSB7XG5cdFx0XHRcdGlmICghJGZvY3VzIHx8ICEkZm9jdXMubGVuZ3RoIHx8ICEkZm9jdXMuaXMoXCI6dmlzaWJsZVwiKSkge1xuXHRcdFx0XHRcdCRmb2N1cyA9IHNlbGYuJHRyaWdnZXI7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoJGZvY3VzICYmICRmb2N1cy5sZW5ndGgpIHtcblx0XHRcdFx0XHR4ID0gd2luZG93LnNjcm9sbFg7XG5cdFx0XHRcdFx0eSA9IHdpbmRvdy5zY3JvbGxZO1xuXG5cdFx0XHRcdFx0JGZvY3VzLnRyaWdnZXIoXCJmb2N1c1wiKTtcblxuXHRcdFx0XHRcdCQoXCJodG1sLCBib2R5XCIpXG5cdFx0XHRcdFx0XHQuc2Nyb2xsVG9wKHkpXG5cdFx0XHRcdFx0XHQuc2Nyb2xsTGVmdCh4KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRzZWxmLmN1cnJlbnQgPSBudWxsO1xuXG5cdFx0XHQvLyBDaGVjayBpZiB0aGVyZSBhcmUgb3RoZXIgaW5zdGFuY2VzXG5cdFx0XHRpbnN0YW5jZSA9ICQuZmFuY3lib3guZ2V0SW5zdGFuY2UoKTtcblxuXHRcdFx0aWYgKGluc3RhbmNlKSB7XG5cdFx0XHRcdGluc3RhbmNlLmFjdGl2YXRlKCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQkKFwiYm9keVwiKS5yZW1vdmVDbGFzcyhcImZhbmN5Ym94LWFjdGl2ZSBjb21wZW5zYXRlLWZvci1zY3JvbGxiYXJcIik7XG5cblx0XHRcdFx0JChcIiNmYW5jeWJveC1zdHlsZS1ub3Njcm9sbFwiKS5yZW1vdmUoKTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0Ly8gQ2FsbCBjYWxsYmFjayBhbmQgdHJpZ2dlciBhbiBldmVudFxuXHRcdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHRcdHRyaWdnZXI6IGZ1bmN0aW9uIChuYW1lLCBzbGlkZSkge1xuXHRcdFx0dmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpLFxuXHRcdFx0XHRzZWxmID0gdGhpcyxcblx0XHRcdFx0b2JqID0gc2xpZGUgJiYgc2xpZGUub3B0cyA/IHNsaWRlIDogc2VsZi5jdXJyZW50LFxuXHRcdFx0XHRyZXo7XG5cblx0XHRcdGlmIChvYmopIHtcblx0XHRcdFx0YXJncy51bnNoaWZ0KG9iaik7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvYmogPSBzZWxmO1xuXHRcdFx0fVxuXG5cdFx0XHRhcmdzLnVuc2hpZnQoc2VsZik7XG5cblx0XHRcdGlmICgkLmlzRnVuY3Rpb24ob2JqLm9wdHNbbmFtZV0pKSB7XG5cdFx0XHRcdHJleiA9IG9iai5vcHRzW25hbWVdLmFwcGx5KG9iaiwgYXJncyk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChyZXogPT09IGZhbHNlKSB7XG5cdFx0XHRcdHJldHVybi
6780ByZXo7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChuYW1lID09PSBcImFmdGVyQ2xvc2VcIiB8fCAhc2VsZi4kcmVmcykge1xuXHRcdFx0XHQkRC50cmlnZ2VyKG5hbWUgKyBcIi5mYlwiLCBhcmdzKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHNlbGYuJHJlZnMuY29udGFpbmVyLnRyaWdnZXIobmFtZSArIFwiLmZiXCIsIGFyZ3MpO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQvLyBVcGRhdGUgaW5mb2JhciB2YWx1ZXMsIG5hdmlnYXRpb24gYnV0dG9uIHN0YXRlcyBhbmQgcmV2ZWFsIGNhcHRpb25cblx0XHQvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHRcdHVwZGF0ZUNvbnRyb2xzOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHR2YXIgc2VsZiA9IHRoaXMsXG5cdFx0XHRcdGN1cnJlbnQgPSBzZWxmLmN1cnJlbnQsXG5cdFx0XHRcdGluZGV4ID0gY3VycmVudC5pbmRleCxcblx0XHRcdFx0JGNvbnRhaW5lciA9IHNlbGYuJHJlZnMuY29udGFpbmVyLFxuXHRcdFx0XHQkY2FwdGlvbiA9IHNlbGYuJHJlZnMuY2FwdGlvbixcblx0XHRcdFx0Y2FwdGlvbiA9IGN1cnJlbnQub3B0cy5jYXB0aW9uO1xuXG5cdFx0XHQvLyBSZWNhbGN1bGF0ZSBjb250ZW50IGRpbWVuc2lvbnNcblx0XHRcdGN1cnJlbnQuJHNsaWRlLnRyaWdnZXIoXCJyZWZyZXNoXCIpO1xuXG5cdFx0XHQvLyBTZXQgY2FwdGlvblxuXHRcdFx0aWYgKGNhcHRpb24gJiYgY2FwdGlvbi5sZW5ndGgpIHtcblx0XHRcdFx0c2VsZi4kY2FwdGlvbiA9ICRjYXB0aW9uO1xuXG5cdFx0XHRcdCRjYXB0aW9uXG5cdFx0XHRcdFx0LmNoaWxkcmVuKClcblx0XHRcdFx0XHQuZXEoMClcblx0XHRcdFx0XHQuaHRtbChjYXB0aW9uKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHNlbGYuJGNhcHRpb24gPSBudWxsO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIXNlbGYuaGFzSGlkZGVuQ29udHJvbHMgJiYgIXNlbGYuaXNJZGxlKSB7XG5cdFx0XHRcdHNlbGYuc2hvd0NvbnRyb2xzKCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFVwZGF0ZSBpbmZvIGFuZCBuYXZpZ2F0aW9uIGVsZW1lbnRzXG5cdFx0XHQkY29udGFpbmVyLmZpbmQoXCJbZGF0YS1mYW5jeWJveC1jb3VudF1cIikuaHRtbChzZWxmLmdyb3VwLmxlbmd0aCk7XG5cdFx0XHQkY29udGFpbmVyLmZpbmQoXCJbZGF0YS1mYW5jeWJveC1pbmRleF1cIikuaHRtbChpbmRleCArIDEpO1xuXG5cdFx0XHQkY29udGFpbmVyLmZpbmQoXCJbZGF0YS1mYW5jeWJveC1wcmV2XVwiKS5wcm9wKFwiZGlzYWJsZWRcIiwgIWN1cnJlbnQub3B0cy5sb29wICYmIGluZGV4IDw9IDApO1xuXHRcdFx0JGNvbnRhaW5lci5maW5kKFwiW2RhdGEtZmFuY3lib3gtbmV4dF1cIikucHJvcChcImRpc2FibGVkXCIsICFjdXJyZW50Lm9wdHMubG9vcCAmJiBpbmRleCA+PSBzZWxmLmdyb3VwLmxlbmd0aCAtIDEpO1xuXG5cdFx0XHRpZiAoY3VycmVudC50eXBlID09PSBcImltYWdlXCIpIHtcblx0XHRcdFx0Ly8gUmUtZW5hYmxlIGJ1dHRvbnM7IHVwZGF0ZSBkb3dubG9hZCBidXR0b24gc291cmNlXG5cdFx0XHRcdCRjb250YWluZXJcblx0XHRcdFx0XHQuZmluZChcIltkYXRhLWZhbmN5Ym94LXpvb21dXCIpXG5cdFx0XHRcdFx0LnNob3coKVxuXHRcdFx0XHRcdC5lbmQoKVxuXHRcdFx0XHRcdC5maW5kKFwiW2RhdGEtZmFuY3lib3gtZG93bmxvYWRdXCIpXG5cdFx0XHRcdFx0LmF0dHIoXCJocmVmXCIsIGN1cnJlbnQub3B0cy5pbWFnZS5zcmMgfHwgY3VycmVudC5zcmMpXG5cdFx0XHRcdFx0LnNob3coKTtcblx0XHRcdH0gZWxzZSBpZiAoY3VycmVudC5vcHRzLnRvb2xiYXIpIHtcblx0XHRcdFx0JGNvbnRhaW5lci5maW5kKFwiW2RhdGEtZmFuY3lib3gtZG93bmxvYWRdLFtkYXRhLWZhbmN5Ym94LXpvb21dXCIpLmhpZGUoKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTWFrZSBzdXJlIGZvY3VzIGlzIG5vdCBvbiBkaXNhYmxlZCBidXR0b24vZWxlbWVudFxuXHRcdFx0aWYgKCQoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkuaXMoXCI6aGlkZGVuLFtkaXNhYmxlZF1cIikpIHtcblx0XHRcdFx0c2VsZi4kcmVmcy5jb250YWluZXIudHJpZ2dlcihcImZvY3VzXCIpO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQvLyBIaWRlIHRvb2xiYXIgYW5kIGNhcHRpb25cblx0XHQvLyA9PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHRcdGhpZGVDb250cm9sczogZnVuY3Rpb24gKGFuZENhcHRpb24pIHtcblx0XHRcdHZhciBzZWxmID0gdGhpcyxcblx0XHRcdFx0YXJyID0gW1wiaW5mb2JhclwiLCBcInRvb2xiYXJcIiwgXCJuYXZcIl07XG5cblx0XHRcdGlmIChhbmRDYXB0aW9uIHx8ICFzZWxmLmN1cnJlbnQub3B0cy5wcmV2ZW50Q2FwdGlvbk92ZXJsYXApIHtcblx0XHRcdFx0YXJyLnB1c2goXCJjYXB0aW9uXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLiRyZWZzLmNvbnRhaW5lci5yZW1vdmVDbGFzcyhcblx0XHRcdFx0YXJyXG5cdFx0XHRcdFx0Lm1hcChmdW5jdGlvbiAoaSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIFwiZmFuY3lib3gtc2hvdy1cIiArIGk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuam9pbihcIiBcIilcblx0XHRcdCk7XG5cblx0XHRcdHRoaXMuaGFzSGlkZGVuQ29udHJvbHMgPSB0cnVlO1xuXHRcdH0sXG5cblx0XHRzaG93Q29udHJvbHM6IGZ1bmN0aW9uICgpIHtcblx0XHRcdHZhciBzZWxmID0gdGhpcyxcblx0XHRcdFx0b3B0cyA9IHNlbGYuY3VycmVudCA/IHNlbGYuY3VycmVudC5vcHRzIDogc2VsZi5vcHRzLFxuXHRcdFx0XHQkY29udGFpbmVyID0gc2VsZi4kcmVmcy5jb250YWluZXI7XG5cblx0XHRcdHNlbGYuaGFzSGlkZGVuQ29udHJvbHMgPSBmYWxzZTtcblx0XHRcdHNlbGYuaWRsZVNlY29uZHNDb3VudGVyID0gMDtcblxuXHRcdFx0JGNvbnRhaW5lclxuXHRcdFx0XHQudG9nZ2xlQ2xhc3MoXCJmYW5jeWJveC1zaG93LXRvb2xiYXJcIiwgISEob3B0cy50b29sYmFyICYmIG9wdHMuYnV0dG9ucykpXG5cdFx0XHRcdC50b2dnbGVDbGFzcyhcImZhbmN5Ym94LXNob3ctaW5mb2JhclwiLCAhIShvcHRzLmluZm9iYXIgJiYgc2VsZi5ncm91cC5sZW5ndGggPiAxKSlcblx0XHRcdFx0LnRvZ2dsZUNsYXNzKFwiZmFuY3lib3gtc2hvdy1jYXB0aW9uXCIsICEhc2VsZi4kY2FwdGlvbilcblx0XHRcdFx0LnRvZ2dsZUNsYXNzKFwiZmFuY3lib3gtc2hvdy1uYXZcIiwgISEob3B0cy5hcnJvd3MgJiYgc2VsZi5ncm91cC5sZW5ndGggPiAxKSlcblx0XHRcdFx0LnRvZ2dsZUNsYXNzKFwiZmFuY3lib3gtaXMtbW9kYWxcIiwgISFvcHRzLm1vZGFsKTtcblx0XHR9LFxuXG5cdFx0Ly8gVG9nZ2xlIHRvb2xiYXIgYW5kIGNhcHRpb25cblx0XHQvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdFx0dG9nZ2xlQ29udHJvbHM6IGZ1bmN0aW9uICgpIHtcblx0XHRcdGlmICh0aGlzLmhhc0hpZGRlbkNvbnRyb2xzKSB7XG5cdFx0XHRcdHRoaXMuc2hvd0NvbnRyb2xzKCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLmhpZGVDb250cm9scygpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cblx0JC5mYW5jeWJveCA9IHtcblx0XHR2ZXJzaW9uOiBcIjMuNS43XCIsXG5cdFx0ZGVmYXVsdHM6IGRlZmF1bHRzLFxuXG5cdFx0Ly8gR2V0IGN1cnJlbnQgaW5zdGFuY2UgYW5kIGV4ZWN1dGUgYSBjb21tYW5kLlxuXHRcdC8vXG5cdFx0Ly8gRXhhbXBsZXMgb2YgdXNhZ2U6XG5cdFx0Ly9cblx0XHQvLyAgICRpbnN0YW5jZSA9ICQuZmFuY3lib3guZ2V0SW5zdGFuY2UoKTtcblx0XHQvLyAgICQuZmFuY3lib3guZ2V0SW5zdGFuY2UoKS5qdW1wVG8oIDEgKTtcblx0XHQvLyAgICQuZmFuY3lib3guZ2V0SW5zdGFuY2UoICdqdW1wVG8nLCAxICk7XG5cdFx0Ly8gICAkLmZhbmN5Ym94LmdldEluc3RhbmNlKCBmdW5jdGlvbigpIHtcblx0XHQvLyAgICAgICBjb25zb2xlLmluZm8oIHRoaXMuY3VyckluZGV4ICk7XG5cdFx0Ly8gICB9KTtcblx0XHQvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHRcdGdldEluc3RhbmNlOiBmdW5jdGlvbiAoY29tbWFuZCkge1xuXHRcdFx0dmFyIGluc3RhbmNlID0gJCgnLmZhbmN5Ym94LWNvbnRhaW5lcjpub3QoXCIuZmFuY3lib3gtaXMtY2xvc2luZ1wiKTpsYXN0JykuZGF0YShcIkZhbmN5Qm94XCIpLFxuXHRcdFx0XHRhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcblxuXHRcdFx0aWYgKGluc3RhbmNlIGluc3RhbmNlb2YgRmFuY3lCb3gpIHtcblx0XHRcdFx0aWYgKCQudHlwZShjb21tYW5kKSA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0XHRcdGluc3RhbmNlW2NvbW1hbmRdLmFwcGx5KGluc3RhbmNlLCBhcmdzKTtcblx0XHRcdFx0fSBlbHNlIGlmICgkLnR5cGUoY29tbWFuZCkgPT09IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0XHRcdGNvbW1hbmQuYXBwbHkoaW5zdGFuY2UsIGFyZ3MpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIGluc3RhbmNlO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSxcblxuXHRcdC8vIENyZWF0ZSBuZXcgaW5zdGFuY2Vcblx0XHQvLyA9PT09PT09PT09PT09PT09PT09XG5cblx0XHRvcGVuOiBmdW5jdGlvbiAoaXRlbXMsIG9wdHMsIGluZGV4KSB7XG5cdFx0XHRyZXR1cm4gbmV3IEZhbmN5Qm94KGl0ZW1zLCBvcHRzLCBpbmRleCk7XG5cdFx0fSxcblxuXHRcdC8vIENsb3NlIGN1cnJlbnQgb3IgYWxsIGluc3RhbmNlc1xuXHRcdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdFx0Y2xvc2U6IGZ1bmN0aW9uIChhbGwpIHtcblx0XHRcdHZhciBpbnN0YW5jZSA9IHRoaXMuZ2V0SW5zdGFuY2UoKTtcblxuXHRcdFx0aWYgKGluc3RhbmNlKSB7XG5cdFx0XHRcdGluc3RhbmNlLmNsb3NlKCk7XG5cblx0XHRcdFx0Ly8gVHJ5IHRvIGZpbmQgYW5kIGNsb3NlIG5leHQgaW5zdGFuY2Vcblx0XHRcdFx0aWYgKGFsbCA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRcdHRoaXMuY2xvc2UoYWxsKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQvLyBDbG9zZSBhbGwgaW5zdGFuY2VzIGFuZCB1bmJpbmQgYWxsIGV2ZW50c1xuXHRcdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblx0XHRkZXN0cm95OiBmdW5jdGlvbiAoKSB7XG5cdFx0XHR0aGlzLmNsb3NlKHRydWUpO1xuXG5cdFx0XHQkRC5hZGQoXCJib2R5XCIpLm9mZihcImNsaWNrLmZiLXN0YXJ0XCIsIFwiKipcIik7XG5cdFx0fSxcblxuXHRcdC8vIFRyeSB0byBkZXRlY3QgbW9iaWxlIGRldmljZXNcblx0XHQvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblx0XHRpc01vYmlsZTogL0FuZHJvaWR8d2ViT1N8aVBob25lfGlQYWR8aVBvZHxCbGFja0JlcnJ5fElFTW9iaWxlfE9wZXJhIE1pbmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLFxuXG5cdFx0Ly8gRGV0ZWN0IGlmICd0cmFuc2xhdGUzZCcgc3VwcG9ydCBpcyBhdmFpbGFibGVcblx0XHQvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdFx0dXNlM2Q6IChmdW5jdGlvbiAoKSB7XG5cdFx0XHR2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblxuXHRcdFx0cmV0dXJuIChcblx0XHRcdFx0d2luZG93LmdldENvbXB1dGVkU3R5bGUgJiZcblx0XHRcdFx0d2luZG93LmdldENvbXB1dGVkU3R5bGUoZGl2KSAmJlxuXHRcdFx0XHR3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkaXYpLmdldFByb3BlcnR5VmFsdWUoXCJ0cmFuc2Zvcm1cIikgJiZcblx0XHRcdFx0IShkb2N1bWVudC5kb2N1bWVudE1vZGUgJiYgZG9jdW1lbnQuZG9jdW1lbnRNb2RlIDwgMTEpXG5cdFx0XHQpO1xuXHRcdH0pKCksXG5cblx0XHQvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IGN1cnJlbnQgdmlzdWFsIHN0YXRlIG9mIGFuIGVsZW1lbnRcblx0XHQvLyByZXR1cm5zIGFycmF5WyB0b3AsIGxlZnQsIGhvcml6b250YWwtc2NhbGUsIHZlcnRpY2FsLXNjYWxlLCBvcGFjaXR5IF1cblx0XHQvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHRcdGdldFRyYW5zbGF0ZTogZnVuY3Rpb24gKCRlbCkge1xuXHRcdFx0dmFyIGRvbVJlY3Q7XG5cblx0XHRcdGlmICghJGVsIHx8ICEkZWwubGVuZ3RoKSB7XG5cdFx0XHRcdHJldHVybi
6780BmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0ZG9tUmVjdCA9ICRlbFswXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0dG9wOiBkb21SZWN0LnRvcCB8fCAwLFxuXHRcdFx0XHRsZWZ0OiBkb21SZWN0LmxlZnQgfHwgMCxcblx0XHRcdFx0d2lkdGg6IGRvbVJlY3Qud2lkdGgsXG5cdFx0XHRcdGhlaWdodDogZG9tUmVjdC5oZWlnaHQsXG5cdFx0XHRcdG9wYWNpdHk6IHBhcnNlRmxvYXQoJGVsLmNzcyhcIm9wYWNpdHlcIikpXG5cdFx0XHR9O1xuXHRcdH0sXG5cblx0XHQvLyBTaG9ydGN1dCBmb3Igc2V0dGluZyBcInRyYW5zbGF0ZTNkXCIgcHJvcGVydGllcyBmb3IgZWxlbWVudFxuXHRcdC8vIENhbiBzZXQgYmUgdXNlZCB0byBzZXQgb3BhY2l0eSwgdG9vXG5cdFx0Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHRcdHNldFRyYW5zbGF0ZTogZnVuY3Rpb24gKCRlbCwgcHJvcHMpIHtcblx0XHRcdHZhciBzdHIgPSBcIlwiLFxuXHRcdFx0XHRjc3MgPSB7fTtcblxuXHRcdFx0aWYgKCEkZWwgfHwgIXByb3BzKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHByb3BzLmxlZnQgIT09IHVuZGVmaW5lZCB8fCBwcm9wcy50b3AgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRzdHIgPVxuXHRcdFx0XHRcdChwcm9wcy5sZWZ0ID09PSB1bmRlZmluZWQgPyAkZWwucG9zaXRpb24oKS5sZWZ0IDogcHJvcHMubGVmdCkgK1xuXHRcdFx0XHRcdFwicHgsIFwiICtcblx0XHRcdFx0XHQocHJvcHMudG9wID09PSB1bmRlZmluZWQgPyAkZWwucG9zaXRpb24oKS50b3AgOiBwcm9wcy50b3ApICtcblx0XHRcdFx0XHRcInB4XCI7XG5cblx0XHRcdFx0aWYgKHRoaXMudXNlM2QpIHtcblx0XHRcdFx0XHRzdHIgPSBcInRyYW5zbGF0ZTNkKFwiICsgc3RyICsgXCIsIDBweClcIjtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzdHIgPSBcInRyYW5zbGF0ZShcIiArIHN0ciArIFwiKVwiO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmIChwcm9wcy5zY2FsZVggIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5zY2FsZVkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRzdHIgKz0gXCIgc2NhbGUoXCIgKyBwcm9wcy5zY2FsZVggKyBcIiwgXCIgKyBwcm9wcy5zY2FsZVkgKyBcIilcIjtcblx0XHRcdH0gZWxzZSBpZiAocHJvcHMuc2NhbGVYICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0c3RyICs9IFwiIHNjYWxlWChcIiArIHByb3BzLnNjYWxlWCArIFwiKVwiO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoc3RyLmxlbmd0aCkge1xuXHRcdFx0XHRjc3MudHJhbnNmb3JtID0gc3RyO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAocHJvcHMub3BhY2l0eSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGNzcy5vcGFjaXR5ID0gcHJvcHMub3BhY2l0eTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHByb3BzLndpZHRoICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Y3NzLndpZHRoID0gcHJvcHMud2lkdGg7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChwcm9wcy5oZWlnaHQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRjc3MuaGVpZ2h0ID0gcHJvcHMuaGVpZ2h0O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gJGVsLmNzcyhjc3MpO1xuXHRcdH0sXG5cblx0XHQvLyBTaW1wbGUgQ1NTIHRyYW5zaXRpb24gaGFuZGxlclxuXHRcdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblx0XHRhbmltYXRlOiBmdW5jdGlvbiAoJGVsLCB0bywgZHVyYXRpb24sIGNhbGxiYWNrLCBsZWF2ZUFuaW1hdGlvbk5hbWUpIHtcblx0XHRcdHZhciBzZWxmID0gdGhpcyxcblx0XHRcdFx0ZnJvbTtcblxuXHRcdFx0aWYgKCQuaXNGdW5jdGlvbihkdXJhdGlvbikpIHtcblx0XHRcdFx0Y2FsbGJhY2sgPSBkdXJhdGlvbjtcblx0XHRcdFx0ZHVyYXRpb24gPSBudWxsO1xuXHRcdFx0fVxuXG5cdFx0XHRzZWxmLnN0b3AoJGVsKTtcblxuXHRcdFx0ZnJvbSA9IHNlbGYuZ2V0VHJhbnNsYXRlKCRlbCk7XG5cblx0XHRcdCRlbC5vbih0cmFuc2l0aW9uRW5kLCBmdW5jdGlvbiAoZSkge1xuXHRcdFx0XHQvLyBTa2lwIGV2ZW50cyBmcm9tIGNoaWxkIGVsZW1lbnRzIGFuZCB6LWluZGV4IGNoYW5nZVxuXHRcdFx0XHRpZiAoZSAmJiBlLm9yaWdpbmFsRXZlbnQgJiYgKCEkZWwuaXMoZS5vcmlnaW5hbEV2ZW50LnRhcmdldCkgfHwgZS5vcmlnaW5hbEV2ZW50LnByb3BlcnR5TmFtZSA9PSBcInotaW5kZXhcIikpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRzZWxmLnN0b3AoJGVsKTtcblxuXHRcdFx0XHRpZiAoJC5pc051bWVyaWMoZHVyYXRpb24pKSB7XG5cdFx0XHRcdFx0JGVsLmNzcyhcInRyYW5zaXRpb24tZHVyYXRpb25cIiwgXCJcIik7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoJC5pc1BsYWluT2JqZWN0KHRvKSkge1xuXHRcdFx0XHRcdGlmICh0by5zY2FsZVggIT09IHVuZGVmaW5lZCAmJiB0by5zY2FsZVkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0c2VsZi5zZXRUcmFuc2xhdGUoJGVsLCB7XG5cdFx0XHRcdFx0XHRcdHRvcDogdG8udG9wLFxuXHRcdFx0XHRcdFx0XHRsZWZ0OiB0by5sZWZ0LFxuXHRcdFx0XHRcdFx0XHR3aWR0aDogZnJvbS53aWR0aCAqIHRvLnNjYWxlWCxcblx0XHRcdFx0XHRcdFx0aGVpZ2h0OiBmcm9tLmhlaWdodCAqIHRvLnNjYWxlWSxcblx0XHRcdFx0XHRcdFx0c2NhbGVYOiAxLFxuXHRcdFx0XHRcdFx0XHRzY2FsZVk6IDFcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmIChsZWF2ZUFuaW1hdGlvbk5hbWUgIT09IHRydWUpIHtcblx0XHRcdFx0XHQkZWwucmVtb3ZlQ2xhc3ModG8pO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCQuaXNGdW5jdGlvbihjYWxsYmFjaykpIHtcblx0XHRcdFx0XHRjYWxsYmFjayhlKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdGlmICgkLmlzTnVtZXJpYyhkdXJhdGlvbikpIHtcblx0XHRcdFx0JGVsLmNzcyhcInRyYW5zaXRpb24tZHVyYXRpb25cIiwgZHVyYXRpb24gKyBcIm1zXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdGFydCBhbmltYXRpb24gYnkgY2hhbmdpbmcgQ1NTIHByb3BlcnRpZXMgb3IgY2xhc3MgbmFtZVxuXHRcdFx0aWYgKCQuaXNQbGFpbk9iamVjdCh0bykpIHtcblx0XHRcdFx0aWYgKHRvLnNjYWxlWCAhPT0gdW5kZWZpbmVkICYmIHRvLnNjYWxlWSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0ZGVsZXRlIHRvLndpZHRoO1xuXHRcdFx0XHRcdGRlbGV0ZSB0by5oZWlnaHQ7XG5cblx0XHRcdFx0XHRpZiAoJGVsLnBhcmVudCgpLmhhc0NsYXNzKFwiZmFuY3lib3gtc2xpZGUtLWltYWdlXCIpKSB7XG5cdFx0XHRcdFx0XHQkZWwucGFyZW50KCkuYWRkQ2xhc3MoXCJmYW5jeWJveC1pcy1zY2FsaW5nXCIpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdCQuZmFuY3lib3guc2V0VHJhbnNsYXRlKCRlbCwgdG8pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0JGVsLmFkZENsYXNzKHRvKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTWFrZSBzdXJlIHRoYXQgYHRyYW5zaXRpb25lbmRgIGNhbGxiYWNrIGdldHMgZmlyZWRcblx0XHRcdCRlbC5kYXRhKFxuXHRcdFx0XHRcInRpbWVyXCIsXG5cdFx0XHRcdHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdCRlbC50cmlnZ2VyKHRyYW5zaXRpb25FbmQpO1xuXHRcdFx0XHR9LCBkdXJhdGlvbiArIDMzKVxuXHRcdFx0KTtcblx0XHR9LFxuXG5cdFx0c3RvcDogZnVuY3Rpb24gKCRlbCwgY2FsbENhbGxiYWNrKSB7XG5cdFx0XHRpZiAoJGVsICYmICRlbC5sZW5ndGgpIHtcblx0XHRcdFx0Y2xlYXJUaW1lb3V0KCRlbC5kYXRhKFwidGltZXJcIikpO1xuXG5cdFx0XHRcdGlmIChjYWxsQ2FsbGJhY2spIHtcblx0XHRcdFx0XHQkZWwudHJpZ2dlcih0cmFuc2l0aW9uRW5kKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdCRlbC5vZmYodHJhbnNpdGlvbkVuZCkuY3NzKFwidHJhbnNpdGlvbi1kdXJhdGlvblwiLCBcIlwiKTtcblxuXHRcdFx0XHQkZWwucGFyZW50KCkucmVtb3ZlQ2xhc3MoXCJmYW5jeWJveC1pcy1zY2FsaW5nXCIpO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblxuXHQvLyBEZWZhdWx0IGNsaWNrIGhhbmRsZXIgZm9yIFwiZmFuY3lib3hlZFwiIGxpbmtzXG5cdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblx0ZnVuY3Rpb24gX3J1bihlLCBvcHRzKSB7XG5cdFx0dmFyIGl0ZW1zID0gW10sXG5cdFx0XHRpbmRleCA9IDAsXG5cdFx0XHQkdGFyZ2V0LFxuXHRcdFx0dmFsdWUsXG5cdFx0XHRpbnN0YW5jZTtcblxuXHRcdC8vIEF2b2lkIG9wZW5pbmcgbXVsdGlwbGUgdGltZXNcblx0XHRpZiAoZSAmJiBlLmlzRGVmYXVsdFByZXZlbn
6780RlZCgpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG5cdFx0b3B0cyA9IG9wdHMgfHwge307XG5cblx0XHRpZiAoZSAmJiBlLmRhdGEpIHtcblx0XHRcdG9wdHMgPSBtZXJnZU9wdHMoZS5kYXRhLm9wdGlvbnMsIG9wdHMpO1xuXHRcdH1cblxuXHRcdCR0YXJnZXQgPSBvcHRzLiR0YXJnZXQgfHwgJChlLmN1cnJlbnRUYXJnZXQpLnRyaWdnZXIoXCJibHVyXCIpO1xuXHRcdGluc3RhbmNlID0gJC5mYW5jeWJveC5nZXRJbnN0YW5jZSgpO1xuXG5cdFx0aWYgKGluc3RhbmNlICYmIGluc3RhbmNlLiR0cmlnZ2VyICYmIGluc3RhbmNlLiR0cmlnZ2VyLmlzKCR0YXJnZXQpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKG9wdHMuc2VsZWN0b3IpIHtcblx0XHRcdGl0ZW1zID0gJChvcHRzLnNlbGVjdG9yKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gR2V0IGFsbCByZWxhdGVkIGl0ZW1zIGFuZCBmaW5kIGluZGV4IGZvciBjbGlja2VkIG9uZVxuXHRcdFx0dmFsdWUgPSAkdGFyZ2V0LmF0dHIoXCJkYXRhLWZhbmN5Ym94XCIpIHx8IFwiXCI7XG5cblx0XHRcdGlmICh2YWx1ZSkge1xuXHRcdFx0XHRpdGVtcyA9IGUuZGF0YSA/IGUuZGF0YS5pdGVtcyA6IFtdO1xuXHRcdFx0XHRpdGVtcyA9IGl0ZW1zLmxlbmd0aCA/IGl0ZW1zLmZpbHRlcignW2RhdGEtZmFuY3lib3g9XCInICsgdmFsdWUgKyAnXCJdJykgOiAkKCdbZGF0YS1mYW5jeWJveD1cIicgKyB2YWx1ZSArICdcIl0nKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGl0ZW1zID0gWyR0YXJnZXRdO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGluZGV4ID0gJChpdGVtcykuaW5kZXgoJHRhcmdldCk7XG5cblx0XHQvLyBTb21ldGltZXMgY3VycmVudCBpdGVtIGNhbiBub3QgYmUgZm91bmRcblx0XHRpZiAoaW5kZXggPCAwKSB7XG5cdFx0XHRpbmRleCA9IDA7XG5cdFx0fVxuXG5cdFx0aW5zdGFuY2UgPSAkLmZhbmN5Ym94Lm9wZW4oaXRlbXMsIG9wdHMsIGluZGV4KTtcblxuXHRcdC8vIFNhdmUgbGFzdCBhY3RpdmUgZWxlbWVudFxuXHRcdGluc3RhbmNlLiR0cmlnZ2VyID0gJHRhcmdldDtcblx0fVxuXG5cdC8vIENyZWF0ZSBhIGpRdWVyeSBwbHVnaW5cblx0Ly8gPT09PT09PT09PT09PT09PT09PT09PVxuXG5cdCQuZm4uZmFuY3lib3ggPSBmdW5jdGlvbiAob3B0aW9ucykge1xuXHRcdHZhciBzZWxlY3RvcjtcblxuXHRcdG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXHRcdHNlbGVjdG9yID0gb3B0aW9ucy5zZWxlY3RvciB8fCBmYWxzZTtcblxuXHRcdGlmIChzZWxlY3Rvcikge1xuXHRcdFx0Ly8gVXNlIGJvZHkgZWxlbWVudCBpbnN0ZWFkIG9mIGRvY3VtZW50IHNvIGl0IGV4ZWN1dGVzIGZpcnN0XG5cdFx0XHQkKFwiYm9keVwiKVxuXHRcdFx0XHQub2ZmKFwiY2xpY2suZmItc3RhcnRcIiwgc2VsZWN0b3IpXG5cdFx0XHRcdC5vbihcImNsaWNrLmZiLXN0YXJ0XCIsIHNlbGVjdG9yLCB7XG5cdFx0XHRcdFx0b3B0aW9uczogb3B0aW9uc1xuXHRcdFx0XHR9LCBfcnVuKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5vZmYoXCJjbGljay5mYi1zdGFydFwiKS5vbihcblx0XHRcdFx0XCJjbGljay5mYi1zdGFydFwiLCB7XG5cdFx0XHRcdFx0aXRlbXM6IHRoaXMsXG5cdFx0XHRcdFx0b3B0aW9uczogb3B0aW9uc1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRfcnVuXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9O1xuXG5cdC8vIFNlbGYgaW5pdGlhbGl6aW5nIHBsdWdpbiBmb3IgYWxsIGVsZW1lbnRzIGhhdmluZyBgZGF0YS1mYW5jeWJveGAgYXR0cmlidXRlXG5cdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblx0JEQub24oXCJjbGljay5mYi1zdGFydFwiLCBcIltkYXRhLWZhbmN5Ym94XVwiLCBfcnVuKTtcblxuXHQvLyBFbmFibGUgXCJ0cmlnZ2VyIGVsZW1lbnRzXCJcblx0Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cdCRELm9uKFwiY2xpY2suZmItc3RhcnRcIiwgXCJbZGF0YS1mYW5jeWJveC10cmlnZ2VyXVwiLCBmdW5jdGlvbiAoZSkge1xuXHRcdCQoJ1tkYXRhLWZhbmN5Ym94PVwiJyArICQodGhpcykuYXR0cihcImRhdGEtZmFuY3lib3gtdHJpZ2dlclwiKSArICdcIl0nKVxuXHRcdFx0LmVxKCQodGhpcykuYXR0cihcImRhdGEtZmFuY3lib3gtaW5kZXhcIikgfHwgMClcblx0XHRcdC50cmlnZ2VyKFwiY2xpY2suZmItc3RhcnRcIiwge1xuXHRcdFx0XHQkdHJpZ2dlcjogJCh0aGlzKVxuXHRcdFx0fSk7XG5cdH0pO1xuXG5cdC8vIFRyYWNrIGZvY3VzIGV2ZW50IGZvciBiZXR0ZXIgYWNjZXNzaWJpbGl0eSBzdHlsaW5nXG5cdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cdChmdW5jdGlvbiAoKSB7XG5cdFx0dmFyIGJ1dHRvblN0ciA9IFwiLmZhbmN5Ym94LWJ1dHRvblwiLFxuXHRcdFx0Zm9jdXNTdHIgPSBcImZhbmN5Ym94LWZvY3VzXCIsXG5cdFx0XHQkcHJlc3NlZCA9IG51bGw7XG5cblx0XHQkRC5vbihcIm1vdXNlZG93biBtb3VzZXVwIGZvY3VzIGJsdXJcIiwgYnV0dG9uU3RyLCBmdW5jdGlvbiAoZSkge1xuXHRcdFx0c3dpdGNoIChlLnR5cGUpIHtcblx0XHRcdFx0Y2FzZSBcIm1vdXNlZG93blwiOlxuXHRcdFx0XHRcdCRwcmVzc2VkID0gJCh0aGlzKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcIm1vdXNldXBcIjpcblx0XHRcdFx0XHQkcHJlc3NlZCA9IG51bGw7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJmb2N1c2luXCI6XG5cdFx0XHRcdFx0JChidXR0b25TdHIpLnJlbW92ZUNsYXNzKGZvY3VzU3RyKTtcblxuXHRcdFx0XHRcdGlmICghJCh0aGlzKS5pcygkcHJlc3NlZCkgJiYgISQodGhpcykuaXMoXCJbZGlzYWJsZWRdXCIpKSB7XG5cdFx0XHRcdFx0XHQkKHRoaXMpLmFkZENsYXNzKGZvY3VzU3RyKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJmb2N1c291dFwiOlxuXHRcdFx0XHRcdCQoYnV0dG9uU3RyKS5yZW1vdmVDbGFzcyhmb2N1c1N0cik7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0pKCk7XG59KSh3aW5kb3csIGRvY3VtZW50LCBqUXVlcnkpO1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vXG4vLyBNZWRpYVxuLy8gQWRkcyBhZGRpdGlvbmFsIG1lZGlhIHR5cGUgc3VwcG9ydFxuLy9cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4oZnVuY3Rpb24gKCQpIHtcblx0XCJ1c2Ugc3RyaWN0XCI7XG5cblx0Ly8gT2JqZWN0IGNvbnRhaW5pbmcgcHJvcGVydGllcyBmb3IgZWFjaCBtZWRpYSB0eXBlXG5cdHZhciBkZWZhdWx0cyA9IHtcblx0XHR5b3V0dWJlOiB7XG5cdFx0XHRtYXRjaGVyOiAvKHlvdXR1YmVcXC5jb218eW91dHVcXC5iZXx5b3V0dWJlXFwtbm9jb29raWVcXC5jb20pXFwvKHdhdGNoXFw/KC4qJik/dj18dlxcL3x1XFwvfGVtYmVkXFwvPyk/KHZpZGVvc2VyaWVzXFw/bGlzdD0oLiopfFtcXHctXXsxMX18XFw/bGlzdFR5cGU9KC4qKSZsaXN0PSguKikpKC4qKS9pLFxuXHRcdFx0cGFyYW1zOiB7XG5cdFx0XHRcdGF1dG9wbGF5OiAxLFxuXHRcdFx0XHRhdXRvaGl
6780kZTogMSxcblx0XHRcdFx0ZnM6IDEsXG5cdFx0XHRcdHJlbDogMCxcblx0XHRcdFx0aGQ6IDEsXG5cdFx0XHRcdHdtb2RlOiBcInRyYW5zcGFyZW50XCIsXG5cdFx0XHRcdGVuYWJsZWpzYXBpOiAxLFxuXHRcdFx0XHRodG1sNTogMVxuXHRcdFx0fSxcblx0XHRcdHBhcmFtUGxhY2U6IDgsXG5cdFx0XHR0eXBlOiBcImlmcmFtZVwiLFxuXHRcdFx0dXJsOiBcImh0dHBzOi8vd3d3LnlvdXR1YmUtbm9jb29raWUuY29tL2VtYmVkLyQ0XCIsXG5cdFx0XHR0aHVtYjogXCJodHRwczovL2ltZy55b3V0dWJlLmNvbS92aS8kNC9ocWRlZmF1bHQuanBnXCJcblx0XHR9LFxuXG5cdFx0dmltZW86IHtcblx0XHRcdG1hdGNoZXI6IC9eLit2aW1lby5jb21cXC8oLipcXC8pPyhbXFxkXSspKC4qKT8vLFxuXHRcdFx0cGFyYW1zOiB7XG5cdFx0XHRcdGF1dG9wbGF5OiAxLFxuXHRcdFx0XHRoZDogMSxcblx0XHRcdFx0c2hvd190aXRsZTogMSxcblx0XHRcdFx0c2hvd19ieWxpbmU6IDEsXG5cdFx0XHRcdHNob3dfcG9ydHJhaXQ6IDAsXG5cdFx0XHRcdGZ1bGxzY3JlZW46IDFcblx0XHRcdH0sXG5cdFx0XHRwYXJhbVBsYWNlOiAzLFxuXHRcdFx0dHlwZTogXCJpZnJhbWVcIixcblx0XHRcdHVybDogXCIvL3BsYXllci52aW1lby5jb20vdmlkZW8vJDJcIlxuXHRcdH0sXG5cblx0XHRpbnN0YWdyYW06IHtcblx0XHRcdG1hdGNoZXI6IC8oaW5zdGFnclxcLmFtfGluc3RhZ3JhbVxcLmNvbSlcXC9wXFwvKFthLXpBLVowLTlfXFwtXSspXFwvPy9pLFxuXHRcdFx0dHlwZTogXCJpbWFnZVwiLFxuXHRcdFx0dXJsOiBcIi8vJDEvcC8kMi9tZWRpYS8/c2l6ZT1sXCJcblx0XHR9LFxuXG5cdFx0Ly8gRXhhbXBsZXM6XG5cdFx0Ly8gaHR0cDovL21hcHMuZ29vZ2xlLmNvbS8/bGw9NDguODU3OTk1LDIuMjk0Mjk3JnNwbj0wLjAwNzY2NiwwLjAyMTEzNiZ0PW0mej0xNlxuXHRcdC8vIGh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vbWFwcy9AMzcuNzg1MjAwNiwtMTIyLjQxNDYzNTUsMTQuNjV6XG5cdFx0Ly8gaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9tYXBzL0A1Mi4yMTExMTIzLDIuOTIzNzU0Miw2LjYxej9obD1lblxuXHRcdC8vIGh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vbWFwcy9wbGFjZS9Hb29nbGVwbGV4L0AzNy40MjIwMDQxLC0xMjIuMDgzMzQ5NCwxN3ovZGF0YT0hNG01ITNtNCExczB4MDoweDZjMjk2YzY2NjE5MzY3ZTAhOG0yITNkMzcuNDIxOTk5OCE0ZC0xMjIuMDg0MDU3MlxuXHRcdGdtYXBfcGxhY2U6IHtcblx0XHRcdG1hdGNoZXI6IC8obWFwc1xcLik/Z29vZ2xlXFwuKFthLXpdezIsM30oXFwuW2Etel17Mn0pPylcXC8oKChtYXBzXFwvKHBsYWNlXFwvKC4qKVxcLyk/XFxAKC4qKSwoXFxkKy4/XFxkKz8peikpfChcXD9sbD0pKSguKik/L2ksXG5cdFx0XHR0eXBlOiBcImlmcmFtZVwiLFxuXHRcdFx0dXJsOiBmdW5jdGlvbiAocmV6KSB7XG5cdFx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFx0XCIvL21hcHMuZ29vZ2xlLlwiICtcblx0XHRcdFx0XHRyZXpbMl0gK1xuXHRcdFx0XHRcdFwiLz9sbD1cIiArXG5cdFx0XHRcdFx0KHJlels5XSA/IHJlels5XSArIFwiJno9XCIgKyBNYXRoLmZsb29yKHJlelsxMF0pICsgKHJlelsxMl0gPyByZXpbMTJdLnJlcGxhY2UoL15cXC8vLCBcIiZcIikgOiBcIlwiKSA6IHJlelsxMl0gKyBcIlwiKS5yZXBsYWNlKC9cXD8vLCBcIiZcIikgK1xuXHRcdFx0XHRcdFwiJm91dHB1dD1cIiArXG5cdFx0XHRcdFx0KHJlelsxMl0gJiYgcmV6WzEyXS5pbmRleE9mKFwibGF5ZXI9Y1wiKSA+IDAgPyBcInN2ZW1iZWRcIiA6IFwiZW1iZWRcIilcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0Ly8gRXhhbXBsZXM6XG5cdFx0Ly8gaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9tYXBzL3NlYXJjaC9FbXBpcmUrU3RhdGUrQnVpbGRpbmcvXG5cdFx0Ly8gaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9tYXBzL3NlYXJjaC8/YXBpPTEmcXVlcnk9Y2VudHVyeWxpbmsrZmllbGRcblx0XHQvLyBodHRwczovL3d3dy5nb29nbGUuY29tL21hcHMvc2VhcmNoLz9hcGk9MSZxdWVyeT00Ny41OTUxNTE4LC0xMjIuMzMxNjM5M1xuXHRcdGdtYXBfc2VhcmNoOiB7XG5cdFx0XHRtYXRjaGVyOiAvKG1hcHNcXC4pP2dvb2dsZVxcLihbYS16XXsyLDN9KFxcLlthLXpdezJ9KT8pXFwvKG1hcHNcXC9zZWFyY2hcXC8pKC4qKS9pLFxuXHRcdFx0dHlwZTogXCJpZnJhbWVcIixcblx0XHRcdHVybDogZnVuY3Rpb24gKHJleikge1xuXHRcdFx0XHRyZXR1cm4gXCIvL21hcHMuZ29vZ2xlLlwiICsgcmV6WzJdICsgXCIvbWFwcz9xPVwiICsgcmV6WzVdLnJlcGxhY2UoXCJxdWVyeT1cIiwgXCJxPVwiKS5yZXBsYWNlKFwiYXBpPTFcIiwgXCJcIikgKyBcIiZvdXRwdXQ9ZW1iZWRcIjtcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cblx0Ly8gRm9ybWF0cyBtYXRjaGluZyB1cmwgdG8gZmluYWwgZm9ybVxuXHR2YXIgZm9ybWF0ID0gZnVuY3Rpb24gKHVybCwgcmV6LCBwYXJhbXMpIHtcblx0XHRpZiAoIXVybCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHBhcmFtcyA9IHBhcmFtcyB8fCBcIlwiO1xuXG5cdFx0aWYgKCQudHlwZShwYXJhbXMpID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRwYXJhbXMgPSAkLnBhcmFtKHBhcmFtcywgdHJ1ZSk7XG5cdFx0fVxuXG5cdFx0JC5lYWNoKHJleiwgZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcblx0XHRcdHVybCA9IHVybC5yZXBsYWNlKFwiJFwiICsga2V5LCB2YWx1ZSB8fCBcIlwiKTtcblx0XHR9KTtcblxuXHRcdGlmIChwYXJhbXMubGVuZ3RoKSB7XG5cdFx0XHR1cmwgKz0gKHVybC5pbmRleE9mKFwiP1wiKSA+IDAgPyBcIiZcIiA6IFwiP1wiKSArIHBhcmFtcztcblx0XHR9XG5cblx0XHRyZXR1cm4gdXJsO1xuXHR9O1xuXG5cdCQoZG9jdW1lbnQpLm9uKFwib2JqZWN0TmVlZHNUeXBlLmZiXCIsIGZ1bmN0aW9uIChlLCBpbnN0YW5jZSwgaXRlbSkge1xuXHRcdHZhciB1cmwgPSBpdGVtLnNyYyB8fCBcIlwiLFxuXHRcdFx0dHlwZSA9IGZhbHNlLFxuXHRcdFx0bWVkaWEsXG5cdFx0XHR0aHVtYixcblx0XHRcdHJleixcblx0XHRcdHBhcmFtcyxcblx0XHRcdHVybFBhcmFtcyxcblx0XHRcdHBhcmFtT2JqLFxuXHRcdFx0cHJvdmlkZXI7XG5cblx0XHRtZWRpYSA9ICQuZXh0ZW5kKHRydWUsIHt9LCBkZWZhdWx0cywgaXRlbS5vcHRzLm1lZGlhKTtcblxuXHRcdC8vIExvb2sgZm9yIGFueSBtYXRjaGluZyBtZWRpYSB0eXBlXG5cdFx0JC5lYWNoKG1lZGlhLCBmdW5jdGlvbiAocHJvdmlkZXJOYW1lLCBwcm92aWRlck9wdHMpIHtcblx0XHRcdHJleiA9IHVybC5tYXRjaChwcm92aWRlck9wdHMubWF0Y2hlcik7XG5cblx0XHRcdGlmICghcmV6KSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0dHlwZSA9IHByb3ZpZGVyT3B0cy50eXBlO1xuXHRcdFx0cHJvdmlkZXIgPSBwcm92aWRlck5hbWU7XG5cdFx0XHRwYXJhbU9iaiA9IHt9O1xuXG5cdFx0XHRpZiAocHJvdmlkZXJPcHRzLnBhcmFtUGxhY2UgJiYgcmV6W3Byb3ZpZGVyT3B0cy5wYXJhbVBsYWNlXSkge1xuXHRcdFx0XHR1cmxQYXJhbXMgPSByZXpbcHJvdmlkZXJPcHRzLnBhcmFtUGxhY2VdO1xuXG5cdFx0XHRcdGlmICh1cmxQYXJhbXNbMF0gPT0gXCI/XCIpIHtcblx0XHRcdFx0XHR1cmxQYXJhbXMgPSB1cmxQYXJhbXMuc3Vic3RyaW5nKDEpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dXJsUGFyYW1zID0gdXJsUGFyYW1zLnNwbGl0KFwiJlwiKTtcblxuXHRcdFx0XHRmb3IgKHZhciBtID0gMDsgbSA8IHVybFBhcmFtcy5sZW5ndGg7ICsrbSkge1xuXHRcdFx0XHRcdHZhciBwID0gdXJsUGFyYW1zW21dLnNwbGl0KFwiPVwiLCAyKTtcblxuXHRcdFx0XHRcdGlmIChwLmxlbmd0aCA9PSAyKSB7XG5cdFx0XHRcdFx0XHRwYXJhbU9ialtwWzBdXSA9IGRlY29kZVVSSUNvbXBvbmVudChwWzFdLnJlcGxhY2UoL1xcKy9nLCBcIiBcIikpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRwYXJhbXMgPSAkLmV4dGVuZCh0cnVlLCB7fSwgcHJvdmlkZXJPcHRzLnBhcmFtcywgaXRlbS5vcHRzW3Byb3Z
6780pZGVyTmFtZV0sIHBhcmFtT2JqKTtcblxuXHRcdFx0dXJsID1cblx0XHRcdFx0JC50eXBlKHByb3ZpZGVyT3B0cy51cmwpID09PSBcImZ1bmN0aW9uXCIgPyBwcm92aWRlck9wdHMudXJsLmNhbGwodGhpcywgcmV6LCBwYXJhbXMsIGl0ZW0pIDogZm9ybWF0KHByb3ZpZGVyT3B0cy51cmwsIHJleiwgcGFyYW1zKTtcblxuXHRcdFx0dGh1bWIgPVxuXHRcdFx0XHQkLnR5cGUocHJvdmlkZXJPcHRzLnRodW1iKSA9PT0gXCJmdW5jdGlvblwiID8gcHJvdmlkZXJPcHRzLnRodW1iLmNhbGwodGhpcywgcmV6LCBwYXJhbXMsIGl0ZW0pIDogZm9ybWF0KHByb3ZpZGVyT3B0cy50aHVtYiwgcmV6KTtcblxuXHRcdFx0aWYgKHByb3ZpZGVyTmFtZSA9PT0gXCJ5b3V0dWJlXCIpIHtcblx0XHRcdFx0dXJsID0gdXJsLnJlcGxhY2UoLyZ0PSgoXFxkKyltKT8oXFxkKylzLywgZnVuY3Rpb24gKG1hdGNoLCBwMSwgbSwgcykge1xuXHRcdFx0XHRcdHJldHVybiBcIiZzdGFydD1cIiArICgobSA/IHBhcnNlSW50KG0sIDEwKSAqIDYwIDogMCkgKyBwYXJzZUludChzLCAxMCkpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0gZWxzZSBpZiAocHJvdmlkZXJOYW1lID09PSBcInZpbWVvXCIpIHtcblx0XHRcdFx0dXJsID0gdXJsLnJlcGxhY2UoXCImJTIzXCIsIFwiI1wiKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH0pO1xuXG5cdFx0Ly8gSWYgaXQgaXMgZm91bmQsIHRoZW4gY2hhbmdlIGNvbnRlbnQgdHlwZSBhbmQgdXBkYXRlIHRoZSB1cmxcblxuXHRcdGlmICh0eXBlKSB7XG5cdFx0XHRpZiAoIWl0ZW0ub3B0cy50aHVtYiAmJiAhKGl0ZW0ub3B0cy4kdGh1bWIgJiYgaXRlbS5vcHRzLiR0aHVtYi5sZW5ndGgpKSB7XG5cdFx0XHRcdGl0ZW0ub3B0cy50aHVtYiA9IHRodW1iO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodHlwZSA9PT0gXCJpZnJhbWVcIikge1xuXHRcdFx0XHRpdGVtLm9wdHMgPSAkLmV4dGVuZCh0cnVlLCBpdGVtLm9wdHMsIHtcblx0XHRcdFx0XHRpZnJhbWU6IHtcblx0XHRcdFx0XHRcdHByZWxvYWQ6IGZhbHNlLFxuXHRcdFx0XHRcdFx0YXR0cjoge1xuXHRcdFx0XHRcdFx0XHRzY3JvbGxpbmc6IFwibm9cIlxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cblx0XHRcdCQuZXh0ZW5kKGl0ZW0sIHtcblx0XHRcdFx0dHlwZTogdHlwZSxcblx0XHRcdFx0c3JjOiB1cmwsXG5cdFx0XHRcdG9yaWdTcmM6IGl0ZW0uc3JjLFxuXHRcdFx0XHRjb250ZW50U291cmNlOiBwcm92aWRlcixcblx0XHRcdFx0Y29udGVudFR5cGU6IHR5cGUgPT09IFwiaW1hZ2VcIiA/IFwiaW1hZ2VcIiA6IHByb3ZpZGVyID09IFwiZ21hcF9wbGFjZVwiIHx8IHByb3ZpZGVyID09IFwiZ21hcF9zZWFyY2hcIiA/IFwibWFwXCIgOiBcInZpZGVvXCJcblx0XHRcdH0pO1xuXHRcdH0gZWxzZSBpZiAodXJsKSB7XG5cdFx0XHRpdGVtLnR5cGUgPSBpdGVtLm9wdHMuZGVmYXVsdFR5cGU7XG5cdFx0fVxuXHR9KTtcblxuXHQvLyBMb2FkIFlvdVR1YmUvVmlkZW8gQVBJIG9uIHJlcXVlc3QgdG8gZGV0ZWN0IHdoZW4gdmlkZW8gZmluaXNoZWQgcGxheWluZ1xuXHR2YXIgVmlkZW9BUElMb2FkZXIgPSB7XG5cdFx0eW91dHViZToge1xuXHRcdFx0c3JjOiBcImh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL2lmcmFtZV9hcGlcIixcblx0XHRcdGNsYXNzOiBcIllUXCIsXG5cdFx0XHRsb2FkaW5nOiBmYWxzZSxcblx0XHRcdGxvYWRlZDogZmFsc2Vcblx0XHR9LFxuXG5cdFx0dmltZW86IHtcblx0XHRcdHNyYzogXCJodHRwczovL3BsYXllci52aW1lby5jb20vYXBpL3BsYXllci5qc1wiLFxuXHRcdFx0Y2xhc3M6IFwiVmltZW9cIixcblx0XHRcdGxvYWRpbmc6IGZhbHNlLFxuXHRcdFx0bG9hZGVkOiBmYWxzZVxuXHRcdH0sXG5cblx0XHRsb2FkOiBmdW5jdGlvbiAodmVuZG9yKSB7XG5cdFx0XHR2YXIgX3RoaXMgPSB0aGlzLFxuXHRcdFx0XHRzY3JpcHQ7XG5cblx0XHRcdGlmICh0aGlzW3ZlbmRvcl0ubG9hZGVkKSB7XG5cdFx0XHRcdHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdF90aGlzLmRvbmUodmVuZG9yKTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXNbdmVuZG9yXS5sb2FkaW5nKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0dGhpc1t2ZW5kb3JdLmxvYWRpbmcgPSB0cnVlO1xuXG5cdFx0XHRzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpO1xuXHRcdFx0c2NyaXB0LnR5cGUgPSBcInRleHQvamF2YXNjcmlwdFwiO1xuXHRcdFx0c2NyaXB0LnNyYyA9IHRoaXNbdmVuZG9yXS5zcmM7XG5cblx0XHRcdGlmICh2ZW5kb3IgPT09IFwieW91dHViZVwiKSB7XG5cdFx0XHRcdHdpbmRvdy5vbllvdVR1YmVJZnJhbWVBUElSZWFkeSA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRfdGhpc1t2ZW5kb3JdLmxvYWRlZCA9IHRydWU7XG5cdFx0XHRcdFx0X3RoaXMuZG9uZSh2ZW5kb3IpO1xuXHRcdFx0XHR9O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c2NyaXB0Lm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRfdGhpc1t2ZW5kb3JdLmxvYWRlZCA9IHRydWU7XG5cdFx0XHRcdFx0X3RoaXMuZG9uZSh2ZW5kb3IpO1xuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHRkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNjcmlwdCk7XG5cdFx0fSxcblx0XHRkb25lOiBmdW5jdGlvbiAodmVuZG9yKSB7XG5cdFx0XHR2YXIgaW5zdGFuY2UsICRlbCwgcGxheWVyO1xuXG5cdFx0XHRpZiAodmVuZG9yID09PSBcInlvdXR1YmVcIikge1xuXHRcdFx0XHRkZWxldGUgd2luZG93Lm9uWW91VHViZUlmcmFtZUFQSVJlYWR5O1xuXHRcdFx0fVxuXG5cdFx0XHRpbnN0YW5jZSA9ICQuZmFuY3lib3guZ2V0SW5zdGFuY2UoKTtcblxuXHRcdFx0aWYgKGluc3RhbmNlKSB7XG5cdFx0XHRcdCRlbCA9IGluc3RhbmNlLmN1cnJlbnQuJGNvbnRlbnQuZmluZChcImlmcmFtZVwiKTtcblxuXHRcdFx0XHRpZiAodmVuZG9yID09PSBcInlvdXR1YmVcIiAmJiBZVCAhPT0gdW5kZWZpbmVkICYmIFlUKSB7XG5cdFx0XHRcdFx0cGxheWVyID0gbmV3IFlULlBsYXllcigkZWwuYXR0cihcImlkXCIpLCB7XG5cdFx0XHRcdFx0XHRldmVudHM6IHtcblx0XHRcdFx0XHRcdFx0b25TdGF0ZUNoYW5nZTogZnVuY3Rpb24gKGUpIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoZS5kYXRhID09IDApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGluc3RhbmNlLm5leHQoKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSBlbHNlIGlmICh2ZW5kb3IgPT09IFwidmltZW9cIiAmJiBWaW1lbyAhPT0gdW5kZWZpbmVkICYmIFZpbWVvKSB7XG5cdFx0XHRcdFx0cGxheWVyID0gbmV3IFZpbWVvLlBsYXllcigkZWwpO1xuXG5cdFx0XHRcdFx0cGxheWVyLm9uKFwiZW5kZWRcIiwgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0aW5zdGFuY2UubmV4dCgpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXG5cdCQoZG9jdW1lbnQpLm9uKHtcblx0XHRcImFmdGVyU2hvdy5mYlwiOiBmdW5jdGlvbiAoZSwgaW5zdGFuY2UsIGN1cnJlbnQpIHtcblx0XHRcdGlmIChpbnN0YW5jZS5ncm91cC5sZW5ndGggPiAxICYmIChjdXJyZW50LmNvbnRlbn
6780RTb3VyY2UgPT09IFwieW91dHViZVwiIHx8IGN1cnJlbnQuY29udGVudFNvdXJjZSA9PT0gXCJ2aW1lb1wiKSkge1xuXHRcdFx0XHRWaWRlb0FQSUxvYWRlci5sb2FkKGN1cnJlbnQuY29udGVudFNvdXJjZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcbn0pKGpRdWVyeSk7XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy9cbi8vIEd1ZXN0dXJlc1xuLy8gQWRkcyB0b3VjaCBndWVzdHVyZXMsIGhhbmRsZXMgY2xpY2sgYW5kIHRhcCBldmVudHNcbi8vXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuKGZ1bmN0aW9uICh3aW5kb3csIGRvY3VtZW50LCAkKSB7XG5cdFwidXNlIHN0cmljdFwiO1xuXG5cdHZhciByZXF1ZXN0QUZyYW1lID0gKGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gKFxuXHRcdFx0d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSB8fFxuXHRcdFx0d2luZG93LndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZSB8fFxuXHRcdFx0d2luZG93Lm1velJlcXVlc3RBbmltYXRpb25GcmFtZSB8fFxuXHRcdFx0d2luZG93Lm9SZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcblx0XHRcdC8vIGlmIGFsbCBlbHNlIGZhaWxzLCB1c2Ugc2V0VGltZW91dFxuXHRcdFx0ZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG5cdFx0XHRcdHJldHVybiB3aW5kb3cuc2V0VGltZW91dChjYWxsYmFjaywgMTAwMCAvIDYwKTtcblx0XHRcdH1cblx0XHQpO1xuXHR9KSgpO1xuXG5cdHZhciBjYW5jZWxBRnJhbWUgPSAoZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiAoXG5cdFx0XHR3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUgfHxcblx0XHRcdHdpbmRvdy53ZWJraXRDYW5jZWxBbmltYXRpb25GcmFtZSB8fFxuXHRcdFx0d2luZG93Lm1vekNhbmNlbEFuaW1hdGlvbkZyYW1lIHx8XG5cdFx0XHR3aW5kb3cub0NhbmNlbEFuaW1hdGlvbkZyYW1lIHx8XG5cdFx0XHRmdW5jdGlvbiAoaWQpIHtcblx0XHRcdFx0d2luZG93LmNsZWFyVGltZW91dChpZCk7XG5cdFx0XHR9XG5cdFx0KTtcblx0fSkoKTtcblxuXHR2YXIgZ2V0UG9pbnRlclhZID0gZnVuY3Rpb24gKGUpIHtcblx0XHR2YXIgcmVzdWx0ID0gW107XG5cblx0XHRlID0gZS5vcmlnaW5hbEV2ZW50IHx8IGUgfHwgd2luZG93LmU7XG5cdFx0ZSA9IGUudG91Y2hlcyAmJiBlLnRvdWNoZXMubGVuZ3RoID8gZS50b3VjaGVzIDogZS5jaGFuZ2VkVG91Y2hlcyAmJiBlLmNoYW5nZWRUb3VjaGVzLmxlbmd0aCA/IGUuY2hhbmdlZFRvdWNoZXMgOiBbZV07XG5cblx0XHRmb3IgKHZhciBrZXkgaW4gZSkge1xuXHRcdFx0aWYgKGVba2V5XS5wYWdlWCkge1xuXHRcdFx0XHRyZXN1bHQucHVzaCh7XG5cdFx0XHRcdFx0eDogZVtrZXldLnBhZ2VYLFxuXHRcdFx0XHRcdHk6IGVba2V5XS5wYWdlWVxuXHRcdFx0XHR9KTtcblx0XHRcdH0gZWxzZSBpZiAoZVtrZXldLmNsaWVudFgpIHtcblx0XHRcdFx0cmVzdWx0LnB1c2goe1xuXHRcdFx0XHRcdHg6IGVba2V5XS5jbGllbnRYLFxuXHRcdFx0XHRcdHk6IGVba2V5XS5jbGllbnRZXG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH07XG5cblx0dmFyIGRpc3RhbmNlID0gZnVuY3Rpb24gKHBvaW50MiwgcG9pbnQxLCB3aGF0KSB7XG5cdFx0aWYgKCFwb2ludDEgfHwgIXBvaW50Mikge1xuXHRcdFx0cmV0dXJuIDA7XG5cdFx0fVxuXG5cdFx0aWYgKHdoYXQgPT09IFwieFwiKSB7XG5cdFx0XHRyZXR1cm4gcG9pbnQyLnggLSBwb2ludDEueDtcblx0XHR9IGVsc2UgaWYgKHdoYXQgPT09IFwieVwiKSB7XG5cdFx0XHRyZXR1cm4gcG9pbnQyLnkgLSBwb2ludDEueTtcblx0XHR9XG5cblx0XHRyZXR1cm4gTWF0aC5zcXJ0KE1hdGgucG93KHBvaW50Mi54IC0gcG9pbnQxLngsIDIpICsgTWF0aC5wb3cocG9pbnQyLnkgLSBwb2ludDEueSwgMikpO1xuXHR9O1xuXG5cdHZhciBpc0NsaWNrYWJsZSA9IGZ1bmN0aW9uICgkZWwpIHtcblx0XHRpZiAoXG5cdFx0XHQkZWwuaXMoJ2EsYXJlYSxidXR0b24sW3JvbGU9XCJidXR0b25cIl0saW5wdXQsbGFiZWwsc2VsZWN0LHN1bW1hcnksdGV4dGFyZWEsdmlkZW8sYXVkaW8saWZyYW1lJykgfHxcblx0XHRcdCQuaXNGdW5jdGlvbigkZWwuZ2V0KDApLm9uY2xpY2spIHx8XG5cdFx0XHQkZWwuZGF0YShcInNlbGVjdGFibGVcIilcblx0XHQpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdC8vIENoZWNrIGZvciBhdHRyaWJ1dGVzIGxpa2UgZGF0YS1mYW5jeWJveC1uZXh0IG9yIGRhdGEtZmFuY3lib3gtY2xvc2Vcblx0XHRmb3IgKHZhciBpID0gMCwgYXR0cyA9ICRlbFswXS5hdHRyaWJ1dGVzLCBuID0gYXR0cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcblx0XHRcdGlmIChhdHRzW2ldLm5vZGVOYW1lLnN1YnN0cigwLCAxNCkgPT09IFwiZGF0YS1mYW5jeWJveC1cIikge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH07XG5cblx0dmFyIGhhc1Njcm9sbGJhcnMgPSBmdW5jdGlvbiAoZWwpIHtcblx0XHR2YXIgb3ZlcmZsb3dZID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWwpW1wib3ZlcmZsb3cteVwiXSxcblx0XHRcdG92ZXJmbG93WCA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsKVtcIm92ZXJmbG93LXhcIl0sXG5cdFx0XHR2ZXJ0aWNhbCA9IChvdmVyZmxvd1kgPT09IFwic2Nyb2xsXCIgfHwgb3ZlcmZsb3dZID09PSBcImF1dG9cIikgJiYgZWwuc2Nyb2xsSGVpZ2h0ID4gZWwuY2xpZW50SGVpZ2h0LFxuXHRcdFx0aG9yaXpvbnRhbCA9IChvdmVyZmxvd1ggPT09IFwic2Nyb2xsXCIgfHwgb3ZlcmZsb3dYID09PSBcImF1dG9cIikgJiYgZWwuc2Nyb2xsV2lkdGggPiBlbC5jbGllbnRXaWR0aDtcblxuXHRcdHJldHVybiB2ZXJ0aWNhbCB8fCBob3Jpem9udGFsO1xuXHR9O1xuXG5cdHZhciBpc1Njcm9sbGFibGUgPSBmdW5jdGlvbiAoJGVsKSB7XG5cdFx0dmFyIHJleiA9IGZhbHNlO1xuXG5cdFx0d2hpbGUgKHRydWUpIHtcblx0XHRcdHJleiA9IGhhc1Njcm9sbGJhcnMoJGVsLmdldCgwKSk7XG5cblx0XHRcdGlmIChyZXopIHtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cblx0XHRcdCRlbCA9ICRlbC5wYXJlbnQoKTtcblxuXHRcdFx0aWYgKCEkZWwubGVuZ3RoIHx8ICRlbC5oYXNDbGFzcyhcImZhbmN5Ym94LXN0YWdlXCIpIHx8ICRlbC5pcyhcImJvZHlcIikpIHtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlejtcblx0fTtcblxuXHR2YXIgR3Vlc3R1cmVzID0gZnVuY3Rpb24gKGluc3RhbmNlKSB7XG5cdFx0dmFyIHNlbGYgPSB0aGlzO1xuXG5cdFx0c2VsZi5pbnN0YW5jZSA9IGluc3RhbmNlO1xuXG5cdFx0c2VsZi4kYmcgPSBpbnN0YW5jZS4kcmVmcy5iZztcblx0XHRzZWxmLiRzdGFnZSA9IGluc3RhbmNlLiRyZWZzLnN0YWdlO1xuXHRcdHNlbGYuJGNvbn
6780RhaW5lciA9IGluc3RhbmNlLiRyZWZzLmNvbnRhaW5lcjtcblxuXHRcdHNlbGYuZGVzdHJveSgpO1xuXG5cdFx0c2VsZi4kY29udGFpbmVyLm9uKFwidG91Y2hzdGFydC5mYi50b3VjaCBtb3VzZWRvd24uZmIudG91Y2hcIiwgJC5wcm94eShzZWxmLCBcIm9udG91Y2hzdGFydFwiKSk7XG5cdH07XG5cblx0R3Vlc3R1cmVzLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuXHRcdHZhciBzZWxmID0gdGhpcztcblxuXHRcdHNlbGYuJGNvbnRhaW5lci5vZmYoXCIuZmIudG91Y2hcIik7XG5cblx0XHQkKGRvY3VtZW50KS5vZmYoXCIuZmIudG91Y2hcIik7XG5cblx0XHRpZiAoc2VsZi5yZXF1ZXN0SWQpIHtcblx0XHRcdGNhbmNlbEFGcmFtZShzZWxmLnJlcXVlc3RJZCk7XG5cdFx0XHRzZWxmLnJlcXVlc3RJZCA9IG51bGw7XG5cdFx0fVxuXG5cdFx0aWYgKHNlbGYudGFwcGVkKSB7XG5cdFx0XHRjbGVhclRpbWVvdXQoc2VsZi50YXBwZWQpO1xuXHRcdFx0c2VsZi50YXBwZWQgPSBudWxsO1xuXHRcdH1cblx0fTtcblxuXHRHdWVzdHVyZXMucHJvdG90eXBlLm9udG91Y2hzdGFydCA9IGZ1bmN0aW9uIChlKSB7XG5cdFx0dmFyIHNlbGYgPSB0aGlzLFxuXHRcdFx0JHRhcmdldCA9ICQoZS50YXJnZXQpLFxuXHRcdFx0aW5zdGFuY2UgPSBzZWxmLmluc3RhbmNlLFxuXHRcdFx0Y3VycmVudCA9IGluc3RhbmNlLmN1cnJlbnQsXG5cdFx0XHQkc2xpZGUgPSBjdXJyZW50LiRzbGlkZSxcblx0XHRcdCRjb250ZW50ID0gY3VycmVudC4kY29udGVudCxcblx0XHRcdGlzVG91Y2hEZXZpY2UgPSBlLnR5cGUgPT0gXCJ0b3VjaHN0YXJ0XCI7XG5cblx0XHQvLyBEbyBub3QgcmVzcG9uZCB0byBib3RoICh0b3VjaCBhbmQgbW91c2UpIGV2ZW50c1xuXHRcdGlmIChpc1RvdWNoRGV2aWNlKSB7XG5cdFx0XHRzZWxmLiRjb250YWluZXIub2ZmKFwibW91c2Vkb3duLmZiLnRvdWNoXCIpO1xuXHRcdH1cblxuXHRcdC8vIElnbm9yZSByaWdodCBjbGlja1xuXHRcdGlmIChlLm9yaWdpbmFsRXZlbnQgJiYgZS5vcmlnaW5hbEV2ZW50LmJ1dHRvbiA9PSAyKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gSWdub3JlIHRhcGluZyBvbiBsaW5rcywgYnV0dG9ucywgaW5wdXQgZWxlbWVudHNcblx0XHRpZiAoISRzbGlkZS5sZW5ndGggfHwgISR0YXJnZXQubGVuZ3RoIHx8IGlzQ2xpY2thYmxlKCR0YXJnZXQpIHx8IGlzQ2xpY2thYmxlKCR0YXJnZXQucGFyZW50KCkpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdC8vIElnbm9yZSBjbGlja3Mgb24gdGhlIHNjcm9sbGJhclxuXHRcdGlmICghJHRhcmdldC5pcyhcImltZ1wiKSAmJiBlLm9yaWdpbmFsRXZlbnQuY2xpZW50WCA+ICR0YXJnZXRbMF0uY2xpZW50V2lkdGggKyAkdGFyZ2V0Lm9mZnNldCgpLmxlZnQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBJZ25vcmUgY2xpY2tzIHdoaWxlIHpvb21pbmcgb3IgY2xvc2luZ1xuXHRcdGlmICghY3VycmVudCB8fCBpbnN0YW5jZS5pc0FuaW1hdGluZyB8fCBjdXJyZW50LiRzbGlkZS5oYXNDbGFzcyhcImZhbmN5Ym94LWFuaW1hdGVkXCIpKSB7XG5cdFx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0c2VsZi5yZWFsUG9pbnRzID0gc2VsZi5zdGFydFBvaW50cyA9IGdldFBvaW50ZXJYWShlKTtcblxuXHRcdGlmICghc2VsZi5zdGFydFBvaW50cy5sZW5ndGgpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBBbGxvdyBvdGhlciBzY3JpcHRzIHRvIGNhdGNoIHRvdWNoIGV2ZW50IGlmIFwidG91Y2hcIiBpcyBzZXQgdG8gZmFsc2Vcblx0XHRpZiAoY3VycmVudC50b3VjaCkge1xuXHRcdFx0ZS5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHR9XG5cblx0XHRzZWxmLnN0YXJ0RXZlbnQgPSBlO1xuXG5cdFx0c2VsZi5jYW5UYXAgPSB0cnVlO1xuXHRcdHNlbGYuJHRhcmdldCA9ICR0YXJnZXQ7XG5cdFx0c2VsZi4kY29udGVudCA9ICRjb250ZW50O1xuXHRcdHNlbGYub3B0cyA9IGN1cnJlbnQub3B0cy50b3VjaDtcblxuXHRcdHNlbGYuaXNQYW5uaW5nID0gZmFsc2U7XG5cdFx0c2VsZi5pc1N3aXBpbmcgPSBmYWxzZTtcblx0XHRzZWxmLmlzWm9vbWluZyA9IGZhbHNlO1xuXHRcdHNlbGYuaXNTY3JvbGxpbmcgPSBmYWxzZTtcblx0XHRzZWxmLmNhblBhbiA9IGluc3RhbmNlLmNhblBhbigpO1xuXG5cdFx0c2VsZi5zdGFydFRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcblx0XHRzZWxmLmRpc3RhbmNlWCA9IHNlbGYuZGlzdGFuY2VZID0gc2VsZi5kaXN0YW5jZSA9IDA7XG5cblx0XHRzZWxmLmNhbnZhc1dpZHRoID0gTWF0aC5yb3VuZCgkc2xpZGVbMF0uY2xpZW50V2lkdGgpO1xuXHRcdHNlbGYuY2FudmFzSGVpZ2h0ID0gTWF0aC5yb3VuZCgkc2xpZGVbMF0uY2xpZW50SGVpZ2h0KTtcblxuXHRcdHNlbGYuY29udGVudExhc3RQb3MgPSBudWxsO1xuXHRcdHNlbGYuY29udGVudFN0YXJ0UG9zID0gJC5mYW5jeWJveC5nZXRUcmFuc2xhdGUoc2VsZi4kY29udGVudCkgfHwge1xuXHRcdFx0dG9wOiAwLFxuXHRcdFx0bGVmdDogMFxuXHRcdH07XG5cdFx0c2VsZi5zbGlkZXJTdGFydFBvcyA9ICQuZmFuY3lib3guZ2V0VHJhbnNsYXRlKCRzbGlkZSk7XG5cblx0XHQvLyBTaW5jZSBwb3NpdGlvbiB3aWxsIGJlIGFic29sdXRlLCBidXQgd2UgbmVlZCB0byBtYWtlIGl0IHJlbGF0aXZlIHRvIHRoZSBzdGFnZVxuXHRcdHNlbGYuc3RhZ2VQb3MgPSAkLmZhbmN5Ym94LmdldFRyYW5zbGF0ZShpbnN0YW5jZS4kcmVmcy5zdGFnZSk7XG5cblx0XHRzZWxmLnNsaWRlclN0YXJ0UG9zLnRvcCAtPSBzZWxmLnN0YWdlUG9zLnRvcDtcblx0XHRzZWxmLnNsaWRlclN0YXJ0UG9zLmxlZnQgLT0gc2VsZi5zdGFnZVBvcy5sZWZ0O1xuXG5cdFx0c2VsZi5jb250ZW50U3RhcnRQb3MudG9wIC09IHNlbGYuc3RhZ2VQb3MudG9wO1xuXHRcdHNlbGYuY29udGVudFN0YXJ0UG9zLmxlZnQgLT0gc2VsZi5zdGFnZVBvcy5sZWZ0O1xuXG5cdFx0JChkb2N1bWVudClcblx0XHRcdC5vZmYoXCIuZmIudG91Y2hcIilcblx0XHRcdC5vbihpc1RvdWNoRGV2aWNlID8gXCJ0b3VjaGVuZC5mYi50b3VjaCB0b3VjaGNhbmNlbC5mYi50b3VjaFwiIDogXCJtb3VzZXVwLmZiLnRvdWNoIG1vdXNlbGVhdmUuZmIudG91Y2hcIiwgJC5wcm94eShzZWxmLCBcIm9udG91Y2hlbmRcIikpXG5cdFx0XHQub24oaXNUb3VjaERldmljZSA/IFwidG91Y2htb3ZlLmZiLnRvdWNoXCIgOiBcIm1vdXNlbW92ZS5mYi50b3VjaFwiLCAkLnByb3h5KHNlbGYsIFwib250b3VjaG1vdmVcIikpO1xuXG5cdFx0aWYgKCQuZmFuY3lib3guaXNNb2JpbGUpIHtcblx0XHRcdGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgc2VsZi5vbnNjcm9sbCwgdHJ1ZSk7XG5cdFx0fVxuXG5cdFx0Ly8gU2tpcCBpZiBjbGlja2VkIG91dHNpZGUgdGhlIHNsaWRpbmcgYXJlYVxuXHRcdGlmICghKHNlbGYub3B0cyB8fCBzZWxmLmNhblBhbikgfHwgISgkdGFyZ2V0LmlzKHNlbGYuJHN0YWdlKSB8fCBzZWxmLiRzdGFnZS5maW5kKCR0YXJnZXQpLmxlbmd0aCkpIHtcblx0XHRcdGlmICgk
6780dGFyZ2V0LmlzKFwiLmZhbmN5Ym94LWltYWdlXCIpKSB7XG5cdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCEoJC5mYW5jeWJveC5pc01vYmlsZSAmJiAkdGFyZ2V0LnBhcmVudHMoXCIuZmFuY3lib3gtY2FwdGlvblwiKS5sZW5ndGgpKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRzZWxmLmlzU2Nyb2xsYWJsZSA9IGlzU2Nyb2xsYWJsZSgkdGFyZ2V0KSB8fCBpc1Njcm9sbGFibGUoJHRhcmdldC5wYXJlbnQoKSk7XG5cblx0XHQvLyBDaGVjayBpZiBlbGVtZW50IGlzIHNjcm9sbGFibGUgYW5kIHRyeSB0byBwcmV2ZW50IGRlZmF1bHQgYmVoYXZpb3IgKHNjcm9sbGluZylcblx0XHRpZiAoISgkLmZhbmN5Ym94LmlzTW9iaWxlICYmIHNlbGYuaXNTY3JvbGxhYmxlKSkge1xuXHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdH1cblxuXHRcdC8vIE9uZSBmaW5nZXIgb3IgbW91c2UgY2xpY2sgLSBzd2lwZSBvciBwYW4gYW4gaW1hZ2Vcblx0XHRpZiAoc2VsZi5zdGFydFBvaW50cy5sZW5ndGggPT09IDEgfHwgY3VycmVudC5oYXNFcnJvcikge1xuXHRcdFx0aWYgKHNlbGYuY2FuUGFuKSB7XG5cdFx0XHRcdCQuZmFuY3lib3guc3RvcChzZWxmLiRjb250ZW50KTtcblxuXHRcdFx0XHRzZWxmLmlzUGFubmluZyA9IHRydWU7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzZWxmLmlzU3dpcGluZyA9IHRydWU7XG5cdFx0XHR9XG5cblx0XHRcdHNlbGYuJGNvbnRhaW5lci5hZGRDbGFzcyhcImZhbmN5Ym94LWlzLWdyYWJiaW5nXCIpO1xuXHRcdH1cblxuXHRcdC8vIFR3byBmaW5nZXJzIC0gem9vbSBpbWFnZVxuXHRcdGlmIChzZWxmLnN0YXJ0UG9pbnRzLmxlbmd0aCA9PT0gMiAmJiBjdXJyZW50LnR5cGUgPT09IFwiaW1hZ2VcIiAmJiAoY3VycmVudC5pc0xvYWRlZCB8fCBjdXJyZW50LiRnaG9zdCkpIHtcblx0XHRcdHNlbGYuY2FuVGFwID0gZmFsc2U7XG5cdFx0XHRzZWxmLmlzU3dpcGluZyA9IGZhbHNlO1xuXHRcdFx0c2VsZi5pc1Bhbm5pbmcgPSBmYWxzZTtcblxuXHRcdFx0c2VsZi5pc1pvb21pbmcgPSB0cnVlO1xuXG5cdFx0XHQkLmZhbmN5Ym94LnN0b3Aoc2VsZi4kY29udGVudCk7XG5cblx0XHRcdHNlbGYuY2VudGVyUG9pbnRTdGFydFggPSAoc2VsZi5zdGFydFBvaW50c1swXS54ICsgc2VsZi5zdGFydFBvaW50c1sxXS54KSAqIDAuNSAtICQod2luZG93KS5zY3JvbGxMZWZ0KCk7XG5cdFx0XHRzZWxmLmNlbnRlclBvaW50U3RhcnRZID0gKHNlbGYuc3RhcnRQb2ludHNbMF0ueSArIHNlbGYuc3RhcnRQb2ludHNbMV0ueSkgKiAwLjUgLSAkKHdpbmRvdykuc2Nyb2xsVG9wKCk7XG5cblx0XHRcdHNlbGYucGVyY2VudGFnZU9mSW1hZ2VBdFBpbmNoUG9pbnRYID0gKHNlbGYuY2VudGVyUG9pbnRTdGFydFggLSBzZWxmLmNvbnRlbnRTdGFydFBvcy5sZWZ0KSAvIHNlbGYuY29udGVudFN0YXJ0UG9zLndpZHRoO1xuXHRcdFx0c2VsZi5wZXJjZW50YWdlT2ZJbWFnZUF0UGluY2hQb2ludFkgPSAoc2VsZi5jZW50ZXJQb2ludFN0YXJ0WSAtIHNlbGYuY29udGVudFN0YXJ0UG9zLnRvcCkgLyBzZWxmLmNvbnRlbnRTdGFydFBvcy5oZWlnaHQ7XG5cblx0XHRcdHNlbGYuc3RhcnREaXN0YW5jZUJldHdlZW5GaW5nZXJzID0gZGlzdGFuY2Uoc2VsZi5zdGFydFBvaW50c1swXSwgc2VsZi5zdGFydFBvaW50c1sxXSk7XG5cdFx0fVxuXHR9O1xuXG5cdEd1ZXN0dXJlcy5wcm90b3R5cGUub25zY3JvbGwgPSBmdW5jdGlvbiAoZSkge1xuXHRcdHZhciBzZWxmID0gdGhpcztcblxuXHRcdHNlbGYuaXNTY3JvbGxpbmcgPSB0cnVlO1xuXG5cdFx0ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCBzZWxmLm9uc2Nyb2xsLCB0cnVlKTtcblx0fTtcblxuXHRHdWVzdHVyZXMucHJvdG90eXBlLm9udG91Y2htb3ZlID0gZnVuY3Rpb24gKGUpIHtcblx0XHR2YXIgc2VsZiA9IHRoaXM7XG5cblx0XHQvLyBNYWtlIHN1cmUgdXNlciBoYXMgbm90IHJlbGVhc2VkIG92ZXIgaWZyYW1lIG9yIGRpc2FibGVkIGVsZW1lbnRcblx0XHRpZiAoZS5vcmlnaW5hbEV2ZW50LmJ1dHRvbnMgIT09IHVuZGVmaW5lZCAmJiBlLm9yaWdpbmFsRXZlbnQuYnV0dG9ucyA9PT0gMCkge1xuXHRcdFx0c2VsZi5vbnRvdWNoZW5kKGUpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChzZWxmLmlzU2Nyb2xsaW5nKSB7XG5cdFx0XHRzZWxmLmNhblRhcCA9IGZhbHNlO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHNlbGYubmV3UG9pbnRzID0gZ2V0UG9pbnRlclhZKGUpO1xuXG5cdFx0aWYgKCEoc2VsZi5vcHRzIHx8IHNlbGYuY2FuUGFuKSB8fCAhc2VsZi5uZXdQb2ludHMubGVuZ3RoIHx8ICFzZWxmLm5ld1BvaW50cy5sZW5ndGgpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoIShzZWxmLmlzU3dpcGluZyAmJiBzZWxmLmlzU3dpcGluZyA9PT0gdHJ1ZSkpIHtcblx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0XHR9XG5cblx0XHRzZWxmLmRpc3RhbmNlWCA9IGRpc3RhbmNlKHNlbGYubmV3UG9pbnRzWzBdLCBzZWxmLnN0YXJ0UG9pbnRzWzBdLCBcInhcIik7XG5cdFx0c2VsZi5kaXN0YW5jZVkgPSBkaXN0YW5jZShzZWxmLm5ld1BvaW50c1swXSwgc2VsZi5zdGFydFBvaW50c1swXSwgXCJ5XCIpO1xuXG5cdFx0c2VsZi5kaXN0YW5jZSA9IGRpc3RhbmNlKHNlbGYubmV3UG9pbnRzWzBdLCBzZWxmLnN0YXJ0UG9pbnRzWzBdKTtcblxuXHRcdC8vIFNraXAgZmFsc2Ugb250b3VjaG1vdmUgZXZlbnRzIChDaHJvbWUpXG5cdFx0aWYgKHNlbGYuZGlzdGFuY2UgPiAwKSB7XG5cdFx0XHRpZiAoc2VsZi5pc1N3aXBpbmcpIHtcblx0XHRcdFx0c2VsZi5vblN3aXBlKGUpO1xuXHRcdFx0fSBlbHNlIGlmIChzZWxmLmlzUGFubmluZykge1xuXHRcdFx0XHRzZWxmLm9uUGFuKCk7XG5cdFx0XHR9IGVsc2UgaWYgKHNlbGYuaXNab29taW5nKSB7XG5cdFx0XHRcdHNlbGYub25ab29tKCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXG5cdEd1ZXN0dXJlcy5wcm90b3R5cGUub25Td2lwZSA9IGZ1bmN0aW9uIChlKSB7XG5cdFx0dmFyIHNlbGYgPSB0aGlzLFxuXHRcdFx0aW5zdGFuY2UgPSBzZWxmLmluc3RhbmNlLFxuXHRcdFx0c3dpcGluZyA9IHNlbGYuaXNTd2lwaW5nLFxuXHRcdFx0bGVmdCA9IHNlbGYuc2xpZGVyU3RhcnRQb3MubGVmdCB8fCAwLFxuXHRcdFx0YW5nbGU7XG5cblx0XHQvLyBJZiBkaXJlY3Rpb24gaXMgbm90IHlldCBkZXRlcm1pbmVkXG5cdFx0aWYgKHN3aXBpbmcgPT09IHRydWUpIHtcblx0XHRcdC8vIFdlIG5lZWQgYXQgbGVhc3QgMTBweCBkaXN0YW5jZSB0byBjb3JyZWN0bHkgY2FsY3VsYXRlIGFuIGFuZ2xlXG5cdFx0XHRpZiAoTWF0aC5hYnMoc2VsZi5kaXN0YW5jZSkgPiAxMCkge1xuXHRcdFx0XHRzZWxmLmNhblRhcCA9IGZhbHNlO1xuXG5cdFx0XHRcdGlmIChpbnN0YW5jZS5ncm91cC5sZW5ndGggPCAyICYmIHNlbGYub3B0cy52ZXJ0aWNhbCkge1xuXHRcdFx0XHRcdHNlbGYuaXNTd2lwaW5nID0gXCJ5XCI7XG5cdFx0XHRcdH0gZWxzZSBpZiAoaW5zdGFuY2UuaXNEcmFnZ2luZyB8fCBzZWxmLm9wdHMudmVydGljYWwgPT09IGZhbHNlIHx8IChzZWxmLm9wdHMudmVydGljYWwgPT09IFwiYXV0b1wiICYmICQod2luZG93KS53aWR0aCgpID4gODAwKSkge1xuXHRcdFx0XHRcdHNlbGYuaXNTd2lwaW5nID0gXCJ4XCI7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0YW5nbGUgPSBNYXRoLmFicygoTWF0aC5hdGFuMihzZWxmLmRpc3RhbmNlWSwgc2VsZi5kaXN0YW5jZVgpICogMTgwKSAvIE1hdGguUEkpO1xuXG5cdFx0XHRcdFx0c2VsZi5pc1N3aXBpbmcgPSBhbmdsZSA+IDQ1ICYmIGFuZ2xlIDwgMTM1ID8gXCJ5XCIgOiBcInhcIjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChzZWxmLmlzU3dpcGluZyA9PT0gXCJ5XCIgJiYgJC5mYW5jeWJveC5pc01vYmlsZSAmJiBzZWxmLmlzU2Nyb2xsYWJsZSkge1xuXHRcdFx0XHRcdHNlbGYuaXNTY3JvbGxpbmcgPSB0cnVlO1xuXG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aW5zdGFuY2UuaXNEcmFnZ2luZyA9IHNlbGYuaXNTd2lwaW5nO1xuXG5cdFx0XHRcdC8vIFJlc2V0IHBvaW50cyB0byBhdm9pZCBqdW1waW5nLCBiZWNhdXNlIHdlIGRyb3BwZWQgZmlyc3Qgc3dpcGVzIHRvIGNhbGN1bGF0ZSB0aGUgYW5nbGVcblx0XHRcdFx0c2VsZi5zdGFydFBvaW50cyA9IHNlbGYubmV3UG9pbnRzO1xuXG5cdFx0XHRcdCQuZWFjaChpbnN0YW5jZS5zbGlkZXMsIGZ1bmN0aW9uIChpbmRleCwgc2xpZGUpIHtcblx0XHRcdFx0XHR2YXIgc2xpZGVQb3MsIHN0YWdlUG9zO1xuXG5cdFx0XHRcdFx0JC5mYW5jeWJveC5zdG9wKHNsaWRlLiRzbGlkZSk7XG5cblx0XHRcdFx0XHRzbGlkZVBvcyA9ICQuZmFuY3lib3guZ2V0VHJhbnNsYXRlKHNsaWRlLiRzbGlkZSk7XG5cdFx0XHRcdFx0c3RhZ2VQb3MgPSAkLmZhbmN5Ym94LmdldFRyYW5zbGF0ZShpbnN0YW5jZS4kcmVmcy5zdGFnZSk7XG5cblx0XHRcdFx0XHRzbGlkZS4kc2xpZGVcblx0XHRcdFx0XHRcdC5jc3Moe1xuXHRcdFx0XHRcdFx0XHR0cmFuc2Zvcm06IFwiXCIsXG5cdFx0XHRcdFx0XHRcdG9wYWNpdHk6IFwiXCIsXG5cdFx0XHRcdFx0XHRcdFwidHJhbnNpdGlvbi1kdXJhdGlvblwiOiBcIlwiXG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0LnJlbW92ZUNsYXNzKFwiZmFuY3lib3gtYW5pbWF0ZWRcIilcblx0XHRcdFx0XHRcdC5yZW1vdmVDbGFzcyhmdW5jdGlvbiAoaW5kZXgsIGNsYXNzTmFtZSkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gKGNsYXNzTmFtZS5tYXRjaCgvKF58XFxzKWZhbmN5Ym94LWZ4LVxcUysvZykgfHwgW10pLmpvaW4oXCIgXCIpO1xuXHRcdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRpZiAoc2xpZGUucG9zID09PSBpbnN0YW5jZS5jdXJyZW50LnBvcykge1xuXHRcdFx0XHRcdFx0c2VsZi5zbGlkZXJTdGFydFBvcy50b3AgPSBzbGlkZVBvcy50b3AgLSBzdGFnZVBvcy50b3A7XG5cdFx0XHRcdFx0XHRzZWxmLnNsaWRlclN0YXJ0UG9zLmxlZnQgPSBzbGlkZVBvcy5sZWZ0IC0gc3RhZ2
6780VQb3MubGVmdDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQkLmZhbmN5Ym94LnNldFRyYW5zbGF0ZShzbGlkZS4kc2xpZGUsIHtcblx0XHRcdFx0XHRcdHRvcDogc2xpZGVQb3MudG9wIC0gc3RhZ2VQb3MudG9wLFxuXHRcdFx0XHRcdFx0bGVmdDogc2xpZGVQb3MubGVmdCAtIHN0YWdlUG9zLmxlZnRcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0Ly8gU3RvcCBzbGlkZXNob3dcblx0XHRcdFx0aWYgKGluc3RhbmNlLlNsaWRlU2hvdyAmJiBpbnN0YW5jZS5TbGlkZVNob3cuaXNBY3RpdmUpIHtcblx0XHRcdFx0XHRpbnN0YW5jZS5TbGlkZVNob3cuc3RvcCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBTdGlja3kgZWRnZXNcblx0XHRpZiAoc3dpcGluZyA9PSBcInhcIikge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRzZWxmLmRpc3RhbmNlWCA+IDAgJiZcblx0XHRcdFx0KHNlbGYuaW5zdGFuY2UuZ3JvdXAubGVuZ3RoIDwgMiB8fCAoc2VsZi5pbnN0YW5jZS5jdXJyZW50LmluZGV4ID09PSAwICYmICFzZWxmLmluc3RhbmNlLmN1cnJlbnQub3B0cy5sb29wKSlcblx0XHRcdCkge1xuXHRcdFx0XHRsZWZ0ID0gbGVmdCArIE1hdGgucG93KHNlbGYuZGlzdGFuY2VYLCAwLjgpO1xuXHRcdFx0fSBlbHNlIGlmIChcblx0XHRcdFx0c2VsZi5kaXN0YW5jZVggPCAwICYmXG5cdFx0XHRcdChzZWxmLmluc3RhbmNlLmdyb3VwLmxlbmd0aCA8IDIgfHxcblx0XHRcdFx0XHQoc2VsZi5pbnN0YW5jZS5jdXJyZW50LmluZGV4ID09PSBzZWxmLmluc3RhbmNlLmdyb3VwLmxlbmd0aCAtIDEgJiYgIXNlbGYuaW5zdGFuY2UuY3VycmVudC5vcHRzLmxvb3ApKVxuXHRcdFx0KSB7XG5cdFx0XHRcdGxlZnQgPSBsZWZ0IC0gTWF0aC5wb3coLXNlbGYuZGlzdGFuY2VYLCAwLjgpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bGVmdCA9IGxlZnQgKyBzZWxmLmRpc3RhbmNlWDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRzZWxmLnNsaWRlckxhc3RQb3MgPSB7XG5cdFx0XHR0b3A6IHN3aXBpbmcgPT0gXCJ4XCIgPyAwIDogc2VsZi5zbGlkZXJTdGFydFBvcy50b3AgKyBzZWxmLmRpc3RhbmNlWSxcblx0XHRcdGxlZnQ6IGxlZnRcblx0XHR9O1xuXG5cdFx0aWYgKHNlbGYucmVxdWVzdElkKSB7XG5cdFx0XHRjYW5jZWxBRnJhbWUoc2VsZi5yZXF1ZXN0SWQpO1xuXG5cdFx0XHRzZWxmLnJlcXVlc3RJZCA9IG51bGw7XG5cdFx0fVxuXG5cdFx0c2VsZi5yZXF1ZXN0SWQgPSByZXF1ZXN0QUZyYW1lKGZ1bmN0aW9uICgpIHtcblx0XHRcdGlmIChzZWxmLnNsaWRlckxhc3RQb3MpIHtcblx0XHRcdFx0JC5lYWNoKHNlbGYuaW5zdGFuY2Uuc2xpZGVzLCBmdW5jdGlvbiAoaW5kZXgsIHNsaWRlKSB7XG5cdFx0XHRcdFx0dmFyIHBvcyA9IHNsaWRlLnBvcyAtIHNlbGYuaW5zdGFuY2UuY3VyclBvcztcblxuXHRcdFx0XHRcdCQuZmFuY3lib3guc2V0VHJhbnNsYXRlKHNsaWRlLiRzbGlkZSwge1xuXHRcdFx0XHRcdFx0dG9wOiBzZWxmLnNsaWRlckxhc3RQb3MudG9wLFxuXHRcdFx0XHRcdFx0bGVmdDogc2VsZi5zbGlkZXJMYXN0UG9zLmxlZnQgKyBwb3MgKiBzZWxmLmNhbnZhc1dpZHRoICsgcG9zICogc2xpZGUub3B0cy5ndXR0ZXJcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0c2VsZi4kY29udGFpbmVyLmFkZENsYXNzKFwiZmFuY3lib3gtaXMtc2xpZGluZ1wiKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fTtcblxuXHRHdWVzdHVyZXMucHJvdG90eXBlLm9uUGFuID0gZnVuY3Rpb24gKCkge1xuXHRcdHZhciBzZWxmID0gdGhpcztcblxuXHRcdC8vIFByZXZlbnQgYWNjaWRlbnRhbCBtb3ZlbWVudCAoc29tZXRpbWVzLCB3aGVuIHRhcHBpbmcgY2FzdWFsbHksIGZpbmdlciBjYW4gbW92ZSBhIGJpdClcblx0XHRpZiAoZGlzdGFuY2Uoc2VsZi5uZXdQb2ludHNbMF0sIHNlbGYucmVhbFBvaW50c1swXSkgPCAoJC5mYW5jeWJveC5pc01vYmlsZSA/IDEwIDogNSkpIHtcblx0XHRcdHNlbGYuc3RhcnRQb2ludHMgPSBzZWxmLm5ld1BvaW50cztcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRzZWxmLmNhblRhcCA9IGZhbHNlO1xuXG5cdFx0c2VsZi5jb250ZW50TGFzdFBvcyA9IHNlbGYubGltaXRNb3ZlbWVudCgpO1xuXG5cdFx0aWYgKHNlbGYucmVxdWVzdElkKSB7XG5cdFx0XHRjYW5jZWxBRnJhbWUoc2VsZi5yZXF1ZXN0SWQpO1xuXHRcdH1cblxuXHRcdHNlbGYucmVxdWVzdElkID0gcmVxdWVzdEFGcmFtZShmdW5jdGlvbiAoKSB7XG5cdFx0XHQkLmZhbmN5Ym94LnNldFRyYW5zbGF0ZShzZWxmLiRjb250ZW50LCBzZWxmLmNvbnRlbnRMYXN0UG9zKTtcblx0XHR9KTtcblx0fTtcblxuXHQvLyBNYWtlIHBhbm5pbmcgc3RpY2t5IHRvIHRoZSBlZGdlc1xuXHRHdWVzdHVyZXMucHJvdG90eXBlLmxpbWl0TW92ZW1lbnQgPSBmdW5jdGlvbiAoKSB7XG5cdFx0dmFyIHNlbGYgPSB0aGlzO1xuXG5cdFx0dmFyIGNhbnZhc1dpZHRoID0gc2VsZi5jYW52YXNXaWR0aDtcblx0XHR2YXIgY2FudmFzSGVpZ2h0ID0gc2VsZi5jYW52YXNIZWlnaHQ7XG5cblx0XHR2YXIgZGlzdGFuY2VYID0gc2VsZi5kaXN0YW5jZVg7XG5cdFx0dmFyIGRpc3RhbmNlWSA9IHNlbGYuZGlzdGFuY2VZO1xuXG5cdFx0dmFyIGNvbnRlbnRTdGFydFBvcyA9IHNlbGYuY29udGVudFN0YXJ0UG9zO1xuXG5cdFx0dmFyIGN1cnJlbnRPZmZzZXRYID0gY29udGVudFN0YXJ0UG9zLmxlZnQ7XG5cdFx0dmFyIGN1cnJlbnRPZmZzZXRZID0gY29udGVudFN0YXJ0UG9zLnRvcDtcblxuXHRcdHZhciBjdXJyZW50V2lkdGggPSBjb250ZW50U3RhcnRQb3Mud2lkdGg7XG5cdFx0dmFyIGN1cnJlbnRIZWlnaHQgPSBjb250ZW50U3RhcnRQb3MuaGVpZ2h0O1xuXG5cdFx0dmFyIG1pblRyYW5zbGF0ZVgsIG1pblRyYW5zbGF0ZVksIG1heFRyYW5zbGF0ZVgsIG1heFRyYW5zbGF0ZVksIG5ld09mZnNldFgsIG5ld09mZnNldFk7XG5cblx0XHRpZiAoY3VycmVudFdpZHRoID4gY2FudmFzV2lkdGgpIHtcblx0XHRcdG5ld09mZnNldFggPSBjdXJyZW50T2Zmc2V0WCArIGRpc3RhbmNlWDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bmV3T2Zmc2V0WCA9IGN1cnJlbnRPZmZzZXRYO1xuXHRcdH1cblxuXHRcdG5ld09mZnNldFkgPSBjdXJyZW50T2Zmc2V0WSArIGRpc3RhbmNlWTtcblxuXHRcdC8vIFNsb3cgZG93biBwcm9wb3J0aW9uYWxseSB0byB0cmF2ZWxlZCBkaXN0YW5jZVxuXHRcdG1pblRyYW5zbGF0ZVggPSBNYXRoLm1heCgwLCBjYW52YXNXaWR0aCAqIDAuNSAtIGN1cnJlbnRXaWR0aCAqIDAuNSk7XG5cdFx0bWluVHJhbnNsYXRlWSA9IE1hdGgubWF4KDAsIGNhbnZhc0hlaWdodCAqIDAuNSAtIGN1cnJlbnRIZWlnaHQgKiAwLjUpO1xuXG5cdFx0bWF4VHJhbnNsYXRlWCA9IE1hdGgubWluKGNhbnZhc1dpZHRoIC0gY3VycmVudFdpZHRoLCBjYW52YXNXaWR0aCAqIDAuNSAtIGN1cnJlbnRXaWR0aCAqIDAuNSk7XG5cdFx0bWF4VHJhbnNsYXRlWSA9IE1hdGgubWluKGNhbnZhc0hlaWdodCAtIGN1cnJlbnRIZWlnaHQsIGNhbnZhc0hlaWdodCAqIDAuNSAtIGN1cnJlbnRIZWlnaHQgKiAwLjUpO1xuXG5cdFx0Ly8gICAtPlxuXHRcdGlmIChkaXN0YW5jZVggPiAwICYmIG5ld09mZnNldFggPiBtaW5UcmFuc2xhdGVYKSB7XG5cdFx0XHRuZXdPZmZzZXRYID0gbWluVHJhbnNsYXRlWCAtIDEgKyBNYXRoLnBvdygtbWluVHJhbnNsYXRlWCArIGN1cnJlbnRPZmZzZXRYICsgZGlzdGFuY2VYLCAwLjgpIHx8IDA7XG5cdFx0fVxuXG5cdFx0Ly8gICAgPC1cblx0XHRpZiAoZGlzdGFuY2VYIDwgMCAmJiBuZXdPZmZzZXRYIDwgbWF4VHJhbnNsYXRlWCkge1xuXHRcdFx0bmV3T2Zmc2V0WCA9IG1heFRyYW5zbGF0ZVggKyAxIC0gTWF0aC5wb3cobWF4VHJhbnNsYXRlWCAtIGN1cnJlbnRPZmZzZXRYIC0gZGlzdGFuY2VYLCAwLjgpIHx8IDA7XG5cdFx0fVxuXG5cdFx0Ly8gICBcXC9cblx0XHRpZiAoZGlzdGFuY2VZID4gMCAmJiBuZXdPZmZzZXRZID4gbWluVHJhbnNsYXRlWSkge1xuXHRcdFx0bmV3T2Zmc2V0WSA9IG1pblRyYW5zbGF0ZVkgLSAxICsgTWF0aC5wb3coLW1pblRyYW5zbGF0ZVkgKyBjdXJyZW50T2Zmc2V0WSArIGRpc3RhbmNlWSwgMC44KSB8fCAwO1xuXHRcdH1cblxuXHRcdC8vICAgL1xcXG5cdFx0aWYgKGRpc3RhbmNlWSA8IDAgJiYgbmV3T2Zmc2V0WSA8IG1heFRyYW5zbGF0ZVkpIHtcblx0XHRcdG5ld09mZnNldFkgPSBtYXhUcmFuc2xhdGVZICsgMSAtIE1hdGgucG93KG1heFRyYW5zbGF0ZVkgLSBjdXJyZW50T2Zmc2V0WSAtIGRpc3RhbmNlWSwgMC44KSB8fCAwO1xuXHRcdH1cblxuXHRcdHJldHVybi
6780B7XG5cdFx0XHR0b3A6IG5ld09mZnNldFksXG5cdFx0XHRsZWZ0OiBuZXdPZmZzZXRYXG5cdFx0fTtcblx0fTtcblxuXHRHdWVzdHVyZXMucHJvdG90eXBlLmxpbWl0UG9zaXRpb24gPSBmdW5jdGlvbiAobmV3T2Zmc2V0WCwgbmV3T2Zmc2V0WSwgbmV3V2lkdGgsIG5ld0hlaWdodCkge1xuXHRcdHZhciBzZWxmID0gdGhpcztcblxuXHRcdHZhciBjYW52YXNXaWR0aCA9IHNlbGYuY2FudmFzV2lkdGg7XG5cdFx0dmFyIGNhbnZhc0hlaWdodCA9IHNlbGYuY2FudmFzSGVpZ2h0O1xuXG5cdFx0aWYgKG5ld1dpZHRoID4gY2FudmFzV2lkdGgpIHtcblx0XHRcdG5ld09mZnNldFggPSBuZXdPZmZzZXRYID4gMCA/IDAgOiBuZXdPZmZzZXRYO1xuXHRcdFx0bmV3T2Zmc2V0WCA9IG5ld09mZnNldFggPCBjYW52YXNXaWR0aCAtIG5ld1dpZHRoID8gY2FudmFzV2lkdGggLSBuZXdXaWR0aCA6IG5ld09mZnNldFg7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIENlbnRlciBob3Jpem9udGFsbHlcblx0XHRcdG5ld09mZnNldFggPSBNYXRoLm1heCgwLCBjYW52YXNXaWR0aCAvIDIgLSBuZXdXaWR0aCAvIDIpO1xuXHRcdH1cblxuXHRcdGlmIChuZXdIZWlnaHQgPiBjYW52YXNIZWlnaHQpIHtcblx0XHRcdG5ld09mZnNldFkgPSBuZXdPZmZzZXRZID4gMCA/IDAgOiBuZXdPZmZzZXRZO1xuXHRcdFx0bmV3T2Zmc2V0WSA9IG5ld09mZnNldFkgPCBjYW52YXNIZWlnaHQgLSBuZXdIZWlnaHQgPyBjYW52YXNIZWlnaHQgLSBuZXdIZWlnaHQgOiBuZXdPZmZzZXRZO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBDZW50ZXIgdmVydGljYWxseVxuXHRcdFx0bmV3T2Zmc2V0WSA9IE1hdGgubWF4KDAsIGNhbnZhc0hlaWdodCAvIDIgLSBuZXdIZWlnaHQgLyAyKTtcblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0dG9wOiBuZXdPZmZzZXRZLFxuXHRcdFx0bGVmdDogbmV3T2Zmc2V0WFxuXHRcdH07XG5cdH07XG5cblx0R3Vlc3R1cmVzLnByb3RvdHlwZS5vblpvb20gPSBmdW5jdGlvbiAoKSB7XG5cdFx0dmFyIHNlbGYgPSB0aGlzO1xuXG5cdFx0Ly8gQ2FsY3VsYXRlIGN1cnJlbnQgZGlzdGFuY2UgYmV0d2VlbiBwb2ludHMgdG8gZ2V0IHBpbmNoIHJhdGlvIGFuZCBuZXcgd2lkdGggYW5kIGhlaWdodFxuXHRcdHZhciBjb250ZW50U3RhcnRQb3MgPSBzZWxmLmNvbnRlbnRTdGFydFBvcztcblxuXHRcdHZhciBjdXJyZW50V2lkdGggPSBjb250ZW50U3RhcnRQb3Mud2lkdGg7XG5cdFx0dmFyIGN1cnJlbnRIZWlnaHQgPSBjb250ZW50U3RhcnRQb3MuaGVpZ2h0O1xuXG5cdFx0dmFyIGN1cnJlbnRPZmZzZXRYID0gY29udGVudFN0YXJ0UG9zLmxlZnQ7XG5cdFx0dmFyIGN1cnJlbnRPZmZzZXRZID0gY29udGVudFN0YXJ0UG9zLnRvcDtcblxuXHRcdHZhciBlbmREaXN0YW5jZUJldHdlZW5GaW5nZXJzID0gZGlzdGFuY2Uoc2VsZi5uZXdQb2ludHNbMF0sIHNlbGYubmV3UG9pbnRzWzFdKTtcblxuXHRcdHZhciBwaW5jaFJhdGlvID0gZW5kRGlzdGFuY2VCZXR3ZWVuRmluZ2VycyAvIHNlbGYuc3RhcnREaXN0YW5jZUJldHdlZW5GaW5nZXJzO1xuXG5cdFx0dmFyIG5ld1dpZHRoID0gTWF0aC5mbG9vcihjdXJyZW50V2lkdGggKiBwaW5jaFJhdGlvKTtcblx0XHR2YXIgbmV3SGVpZ2h0ID0gTWF0aC5mbG9vcihjdXJyZW50SGVpZ2h0ICogcGluY2hSYXRpbyk7XG5cblx0XHQvLyBUaGlzIGlzIHRoZSB0cmFuc2xhdGlvbiBkdWUgdG8gcGluY2gtem9vbWluZ1xuXHRcdHZhciB0cmFuc2xhdGVGcm9tWm9vbWluZ1ggPSAoY3VycmVudFdpZHRoIC0gbmV3V2lkdGgpICogc2VsZi5wZXJjZW50YWdlT2ZJbWFnZUF0UGluY2hQb2ludFg7XG5cdFx0dmFyIHRyYW5zbGF0ZUZyb21ab29taW5nWSA9IChjdXJyZW50SGVpZ2h0IC0gbmV3SGVpZ2h0KSAqIHNlbGYucGVyY2VudGFnZU9mSW1hZ2VBdFBpbmNoUG9pbnRZO1xuXG5cdFx0Ly8gUG9pbnQgYmV0d2VlbiB0aGUgdHdvIHRvdWNoZXNcblx0XHR2YXIgY2VudGVyUG9pbnRFbmRYID0gKHNlbGYubmV3UG9pbnRzWzBdLnggKyBzZWxmLm5ld1BvaW50c1sxXS54KSAvIDIgLSAkKHdpbmRvdykuc2Nyb2xsTGVmdCgpO1xuXHRcdHZhciBjZW50ZXJQb2ludEVuZFkgPSAoc2VsZi5uZXdQb2ludHNbMF0ueSArIHNlbGYubmV3UG9pbnRzWzFdLnkpIC8gMiAtICQod2luZG93KS5zY3JvbGxUb3AoKTtcblxuXHRcdC8vIEFuZCB0aGlzIGlzIHRoZSB0cmFuc2xhdGlvbiBkdWUgdG8gdHJhbnNsYXRpb24gb2YgdGhlIGNlbnRlcnBvaW50XG5cdFx0Ly8gYmV0d2VlbiB0aGUgdHdvIGZpbmdlcnNcblx0XHR2YXIgdHJhbnNsYXRlRnJvbVRyYW5zbGF0aW5nWCA9IGNlbnRlclBvaW50RW5kWCAtIHNlbGYuY2VudGVyUG9pbnRTdGFydFg7XG5cdFx0dmFyIHRyYW5zbGF0ZUZyb21UcmFuc2xhdGluZ1kgPSBjZW50ZXJQb2ludEVuZFkgLSBzZWxmLmNlbnRlclBvaW50U3RhcnRZO1xuXG5cdFx0Ly8gVGhlIG5ldyBvZmZzZXQgaXMgdGhlIG9sZC9jdXJyZW50IG9uZSBwbHVzIHRoZSB0b3RhbCB0cmFuc2xhdGlvblxuXHRcdHZhciBuZXdPZmZzZXRYID0gY3VycmVudE9mZnNldFggKyAodHJhbnNsYXRlRnJvbVpvb21pbmdYICsgdHJhbnNsYXRlRnJvbVRyYW5zbGF0aW5nWCk7XG5cdFx0dmFyIG5ld09mZnNldFkgPSBjdXJyZW50T2Zmc2V0WSArICh0cmFuc2xhdGVGcm9tWm9vbWluZ1kgKyB0cmFuc2xhdGVGcm9tVHJhbnNsYXRpbmdZKTtcblxuXHRcdHZhciBuZXdQb3MgPSB7XG5cdFx0XHR0b3A6IG5ld09mZnNldFksXG5cdFx0XHRsZWZ0OiBuZXdPZmZzZXRYLFxuXHRcdFx0c2NhbGVYOiBwaW5jaFJhdGlvLFxuXHRcdFx0c2NhbGVZOiBwaW5jaFJhdGlvXG5cdFx0fTtcblxuXHRcdHNlbGYuY2FuVGFwID0gZmFsc2U7XG5cblx0XHRzZWxmLm5ld1dpZHRoID0gbmV3V2lkdGg7XG5cdFx0c2VsZi5uZXdIZWlnaHQgPSBuZXdIZWlnaHQ7XG5cblx0XHRzZWxmLmNvbnRlbnRMYXN0UG9zID0gbmV3UG9zO1xuXG5cdFx0aWYgKHNlbGYucmVxdWVzdElkKSB7XG5cdFx0XHRjYW5jZWxBRnJhbWUoc2VsZi5yZXF1ZXN0SWQpO1xuXHRcdH1cblxuXHRcdHNlbGYucmVxdWVzdElkID0gcmVxdWVzdEFGcmFtZShmdW5jdGlvbiAoKSB7XG5cdFx0XHQkLmZhbmN5Ym94LnNldFRyYW5zbGF0ZShzZWxmLiRjb250ZW50LCBzZWxmLmNvbnRlbn
6780RMYXN0UG9zKTtcblx0XHR9KTtcblx0fTtcblxuXHRHdWVzdHVyZXMucHJvdG90eXBlLm9udG91Y2hlbmQgPSBmdW5jdGlvbiAoZSkge1xuXHRcdHZhciBzZWxmID0gdGhpcztcblxuXHRcdHZhciBzd2lwaW5nID0gc2VsZi5pc1N3aXBpbmc7XG5cdFx0dmFyIHBhbm5pbmcgPSBzZWxmLmlzUGFubmluZztcblx0XHR2YXIgem9vbWluZyA9IHNlbGYuaXNab29taW5nO1xuXHRcdHZhciBzY3JvbGxpbmcgPSBzZWxmLmlzU2Nyb2xsaW5nO1xuXG5cdFx0c2VsZi5lbmRQb2ludHMgPSBnZXRQb2ludGVyWFkoZSk7XG5cdFx0c2VsZi5kTXMgPSBNYXRoLm1heChuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIHNlbGYuc3RhcnRUaW1lLCAxKTtcblxuXHRcdHNlbGYuJGNvbnRhaW5lci5yZW1vdmVDbGFzcyhcImZhbmN5Ym94LWlzLWdyYWJiaW5nXCIpO1xuXG5cdFx0JChkb2N1bWVudCkub2ZmKFwiLmZiLnRvdWNoXCIpO1xuXG5cdFx0ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCBzZWxmLm9uc2Nyb2xsLCB0cnVlKTtcblxuXHRcdGlmIChzZWxmLnJlcXVlc3RJZCkge1xuXHRcdFx0Y2FuY2VsQUZyYW1lKHNlbGYucmVxdWVzdElkKTtcblxuXHRcdFx0c2VsZi5yZXF1ZXN0SWQgPSBudWxsO1xuXHRcdH1cblxuXHRcdHNlbGYuaXNTd2lwaW5nID0gZmFsc2U7XG5cdFx0c2VsZi5pc1Bhbm5pbmcgPSBmYWxzZTtcblx0XHRzZWxmLmlzWm9vbWluZyA9IGZhbHNlO1xuXHRcdHNlbGYuaXNTY3JvbGxpbmcgPSBmYWxzZTtcblxuXHRcdHNlbGYuaW5zdGFuY2UuaXNEcmFnZ2luZyA9IGZhbHNlO1xuXG5cdFx0aWYgKHNlbGYuY2FuVGFwKSB7XG5cdFx0XHRyZXR1cm4gc2VsZi5vblRhcChlKTtcblx0XHR9XG5cblx0XHRzZWxmLnNwZWVkID0gMTAwO1xuXG5cdFx0Ly8gU3BlZWQgaW4gcHgvbXNcblx0XHRzZWxmLnZlbG9jaXR5WCA9IChzZWxmLmRpc3RhbmNlWCAvIHNlbGYuZE1zKSAqIDAuNTtcblx0XHRzZWxmLnZlbG9jaXR5WSA9IChzZWxmLmRpc3RhbmNlWSAvIHNlbGYuZE1zKSAqIDAuNTtcblxuXHRcdGlmIChwYW5uaW5nKSB7XG5cdFx0XHRzZWxmLmVuZFBhbm5pbmcoKTtcblx0XHR9IGVsc2UgaWYgKHpvb21pbmcpIHtcblx0XHRcdHNlbGYuZW5kWm9vbWluZygpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRzZWxmLmVuZFN3aXBpbmcoc3dpcGluZywgc2Nyb2xsaW5nKTtcblx0XHR9XG5cblx0XHRyZXR1cm47XG5cdH07XG5cblx0R3Vlc3R1cmVzLnByb3RvdHlwZS5lbmRTd2lwaW5nID0gZnVuY3Rpb24gKHN3aXBpbmcsIHNjcm9sbGluZykge1xuXHRcdHZhciBzZWxmID0gdGhpcyxcblx0XHRcdHJldCA9IGZhbHNlLFxuXHRcdFx0bGVuID0gc2VsZi5pbnN0YW5jZS5ncm91cC5sZW5ndGgsXG5cdFx0XHRkaXN0YW5jZVggPSBNYXRoLmFicyhzZWxmLmRpc3RhbmNlWCksXG5cdFx0XHRjYW5BZHZhbmNlID0gc3dpcGluZyA9PSBcInhcIiAmJiBsZW4gPiAxICYmICgoc2VsZi5kTXMgPiAxMzAgJiYgZGlzdGFuY2VYID4gMTApIHx8IGRpc3RhbmNlWCA+IDUwKSxcblx0XHRcdHNwZWVkWCA9IDMwMDtcblxuXHRcdHNlbGYuc2xpZGVyTGFzdFBvcyA9IG51bGw7XG5cblx0XHQvLyBDbG9zZSBpZiBzd2lwZWQgdmVydGljYWxseSAvIG5hdmlnYXRlIGlmIGhvcml6b250YWxseVxuXHRcdGlmIChzd2lwaW5nID09IFwieVwiICYmICFzY3JvbGxpbmcgJiYgTWF0aC5hYnMoc2VsZi5kaXN0YW5jZVkpID4gNTApIHtcblx0XHRcdC8vIENvbnRpbnVlIHZlcnRpY2FsIG1vdmVtZW50XG5cdFx0XHQkLmZhbmN5Ym94LmFuaW1hdGUoXG5cdFx0XHRcdHNlbGYuaW5zdGFuY2UuY3VycmVudC4kc2xpZGUsIHtcblx0XHRcdFx0XHR0b3A6IHNlbGYuc2xpZGVyU3RhcnRQb3MudG9wICsgc2VsZi5kaXN0YW5jZVkgKyBzZWxmLnZlbG9jaXR5WSAqIDE1MCxcblx0XHRcdFx0XHRvcGFjaXR5OiAwXG5cdFx0XHRcdH0sXG5cdFx0XHRcdDIwMFxuXHRcdFx0KTtcblx0XHRcdHJldCA9IHNlbGYuaW5zdGFuY2UuY2xvc2UodHJ1ZSwgMjUwKTtcblx0XHR9IGVsc2UgaWYgKGNhbkFkdmFuY2UgJiYgc2VsZi5kaXN0YW5jZVggPiAwKSB7XG5cdFx0XHRyZXQgPSBzZWxmLmluc3RhbmNlLnByZXZpb3VzKHNwZWVkWCk7XG5cdFx0fSBlbHNlIGlmIChjYW5BZHZhbmNlICYmIHNlbGYuZGlzdGFuY2VYIDwgMCkge1xuXHRcdFx0cmV0ID0gc2VsZi5pbnN0YW5jZS5uZXh0KHNwZWVkWCk7XG5cdFx0fVxuXG5cdFx0aWYgKHJldCA9PT0gZmFsc2UgJiYgKHN3aXBpbmcgPT0gXCJ4XCIgfHwgc3dpcGluZyA9PSBcInlcIikpIHtcblx0XHRcdHNlbGYuaW5zdGFuY2UuY2VudGVyU2xpZGUoMjAwKTtcblx0XHR9XG5cblx0XHRzZWxmLiRjb250YWluZXIucmVtb3ZlQ2xhc3MoXCJmYW5jeWJveC1pcy1zbGlkaW5nXCIpO1xuXHR9O1xuXG5cdC8vIExpbWl0IHBhbm5pbmcgZnJvbSBlZGdlc1xuXHQvLyA9PT09PT09PT09PT09PT09PT09PT09PT1cblx0R3Vlc3R1cmVzLnByb3RvdHlwZS5lbmRQYW5uaW5nID0gZnVuY3Rpb24gKCkge1xuXHRcdHZhciBzZWxmID0gdGhpcyxcblx0XHRcdG5ld09mZnNldFgsXG5cdFx0XHRuZXdPZmZzZXRZLFxuXHRcdFx0bmV3UG9zO1xuXG5cdFx0aWYgKCFzZWxmLmNvbnRlbnRMYXN0UG9zKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKHNlbGYub3B0cy5tb21lbnR1bSA9PT0gZmFsc2UgfHwgc2VsZi5kTXMgPiAzNTApIHtcblx0XHRcdG5ld09mZnNldFggPSBzZWxmLmNvbnRlbnRMYXN0UG9zLmxlZnQ7XG5cdFx0XHRuZXdPZmZzZXRZID0gc2VsZi5jb250ZW50TGFzdFBvcy50b3A7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIENvbnRpbnVlIG1vdmVtZW50XG5cdFx0XHRuZXdPZmZzZXRYID0gc2VsZi5jb250ZW50TGFzdFBvcy5sZWZ0ICsgc2VsZi52ZWxvY2l0eVggKiA1MDA7XG5cdFx0XHRuZXdPZmZzZXRZID0gc2VsZi5jb250ZW50TGFzdFBvcy50b3AgKyBzZWxmLnZlbG9jaXR5WSAqIDUwMDtcblx0XHR9XG5cblx0XHRuZXdQb3MgPSBzZWxmLmxpbWl0UG9zaXRpb24obmV3T2Zmc2V0WCwgbmV3T2Zmc2V0WSwgc2VsZi5jb250ZW50U3RhcnRQb3Mud2lkdGgsIHNlbGYuY29udGVudFN0YXJ0UG9zLmhlaWdodCk7XG5cblx0XHRuZXdQb3Mud2lkdGggPSBzZWxmLmNvbnRlbn
6780RTdGFydFBvcy53aWR0aDtcblx0XHRuZXdQb3MuaGVpZ2h0ID0gc2VsZi5jb250ZW50U3RhcnRQb3MuaGVpZ2h0O1xuXG5cdFx0JC5mYW5jeWJveC5hbmltYXRlKHNlbGYuJGNvbnRlbnQsIG5ld1BvcywgMzY2KTtcblx0fTtcblxuXHRHdWVzdHVyZXMucHJvdG90eXBlLmVuZFpvb21pbmcgPSBmdW5jdGlvbiAoKSB7XG5cdFx0dmFyIHNlbGYgPSB0aGlzO1xuXG5cdFx0dmFyIGN1cnJlbnQgPSBzZWxmLmluc3RhbmNlLmN1cnJlbnQ7XG5cblx0XHR2YXIgbmV3T2Zmc2V0WCwgbmV3T2Zmc2V0WSwgbmV3UG9zLCByZXNldDtcblxuXHRcdHZhciBuZXdXaWR0aCA9IHNlbGYubmV3V2lkdGg7XG5cdFx0dmFyIG5ld0hlaWdodCA9IHNlbGYubmV3SGVpZ2h0O1xuXG5cdFx0aWYgKCFzZWxmLmNvbnRlbnRMYXN0UG9zKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0bmV3T2Zmc2V0WCA9IHNlbGYuY29udGVudExhc3RQb3MubGVmdDtcblx0XHRuZXdPZmZzZXRZID0gc2VsZi5jb250ZW50TGFzdFBvcy50b3A7XG5cblx0XHRyZXNldCA9IHtcblx0XHRcdHRvcDogbmV3T2Zmc2V0WSxcblx0XHRcdGxlZnQ6IG5ld09mZnNldFgsXG5cdFx0XHR3aWR0aDogbmV3V2lkdGgsXG5cdFx0XHRoZWlnaHQ6IG5ld0hlaWdodCxcblx0XHRcdHNjYWxlWDogMSxcblx0XHRcdHNjYWxlWTogMVxuXHRcdH07XG5cblx0XHQvLyBSZXNldCBzY2FsZXgvc2NhbGVZIHZhbHVlczsgdGhpcyBoZWxwcyBmb3IgcGVyZm9tYW5jZSBhbmQgZG9lcyBub3QgYnJlYWsgYW5pbWF0aW9uXG5cdFx0JC5mYW5jeWJveC5zZXRUcmFuc2xhdGUoc2VsZi4kY29udGVudCwgcmVzZXQpO1xuXG5cdFx0aWYgKG5ld1dpZHRoIDwgc2VsZi5jYW52YXNXaWR0aCAmJiBuZXdIZWlnaHQgPCBzZWxmLmNhbnZhc0hlaWdodCkge1xuXHRcdFx0c2VsZi5pbnN0YW5jZS5zY2FsZVRvRml0KDE1MCk7XG5cdFx0fSBlbHNlIGlmIChuZXdXaWR0aCA+IGN1cnJlbnQud2lkdGggfHwgbmV3SGVpZ2h0ID4gY3VycmVudC5oZWlnaHQpIHtcblx0XHRcdHNlbGYuaW5zdGFuY2Uuc2NhbGVUb0FjdHVhbChzZWxmLmNlbnRlclBvaW50U3RhcnRYLCBzZWxmLmNlbnRlclBvaW50U3RhcnRZLCAxNTApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRuZXdQb3MgPSBzZWxmLmxpbWl0UG9zaXRpb24obmV3T2Zmc2V0WCwgbmV3T2Zmc2V0WSwgbmV3V2lkdGgsIG5ld0hlaWdodCk7XG5cblx0XHRcdCQuZmFuY3lib3guYW5pbWF0ZShzZWxmLiRjb250ZW50LCBuZXdQb3MsIDE1MCk7XG5cdFx0fVxuXHR9O1xuXG5cdEd1ZXN0dXJlcy5wcm90b3R5cGUub25UYXAgPSBmdW5jdGlvbiAoZSkge1xuXHRcdHZhciBzZWxmID0gdGhpcztcblx0XHR2YXIgJHRhcmdldCA9ICQoZS50YXJnZXQpO1xuXG5cdFx0dmFyIGluc3RhbmNlID0gc2VsZi5pbnN0YW5jZTtcblx0XHR2YXIgY3VycmVudCA9IGluc3RhbmNlLmN1cnJlbnQ7XG5cblx0XHR2YXIgZW5kUG9pbnRzID0gKGUgJiYgZ2V0UG9pbnRlclhZKGUpKSB8fCBzZWxmLnN0YXJ0UG9pbnRzO1xuXG5cdFx0dmFyIHRhcFggPSBlbmRQb2ludHNbMF0gPyBlbmRQb2ludHNbMF0ueCAtICQod2luZG93KS5zY3JvbGxMZWZ0KCkgLSBzZWxmLnN0YWdlUG9zLmxlZnQgOiAwO1xuXHRcdHZhciB0YXBZID0gZW5kUG9pbnRzWzBdID8gZW5kUG9pbnRzWzBdLnkgLSAkKHdpbmRvdykuc2Nyb2xsVG9wKCkgLSBzZWxmLnN0YWdlUG9zLnRvcCA6IDA7XG5cblx0XHR2YXIgd2hlcmU7XG5cblx0XHR2YXIgcHJvY2VzcyA9IGZ1bmN0aW9uIChwcmVmaXgpIHtcblx0XHRcdHZhciBhY3Rpb24gPSBjdXJyZW50Lm9wdHNbcHJlZml4XTtcblxuXHRcdFx0aWYgKCQuaXNGdW5jdGlvbihhY3Rpb24pKSB7XG5cdFx0XHRcdGFjdGlvbiA9IGFjdGlvbi5hcHBseShpbnN0YW5jZSwgW2N1cnJlbnQsIGVdKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCFhY3Rpb24pIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRzd2l0Y2ggKGFjdGlvbikge1xuXHRcdFx0XHRjYXNlIFwiY2xvc2VcIjpcblx0XHRcdFx0XHRpbnN0YW5jZS5jbG9zZShzZWxmLnN0YXJ0RXZlbnQpO1xuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBcInRvZ2dsZUNvbnRyb2xzXCI6XG5cdFx0XHRcdFx0aW5zdGFuY2UudG9nZ2xlQ29udHJvbHMoKTtcblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgXCJuZXh0XCI6XG5cdFx0XHRcdFx0aW5zdGFuY2UubmV4dCgpO1xuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBcIm5leHRPckNsb3NlXCI6XG5cdFx0XHRcdFx0aWYgKGluc3RhbmNlLmdyb3VwLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0XHRcdGluc3RhbmNlLm5leHQoKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0aW5zdGFuY2UuY2xvc2Uoc2VsZi5zdGFydEV2ZW50KTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIFwiem9vbVwiOlxuXHRcdFx0XHRcdGlmIChjdXJyZW50LnR5cGUgPT0gXCJpbWFnZVwiICYmIChjdXJyZW50LmlzTG9hZGVkIHx8IGN1cnJlbnQuJGdob3N0KSkge1xuXHRcdFx0XHRcdFx0aWYgKGluc3RhbmNlLmNhblBhbigpKSB7XG5cdFx0XHRcdFx0XHRcdGluc3RhbmNlLnNjYWxlVG9GaXQoKTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoaW5zdGFuY2UuaXNTY2FsZWREb3duKCkpIHtcblx0XHRcdFx0XHRcdFx0aW5zdGFuY2Uuc2NhbGVUb0FjdHVhbCh0YXBYLCB0YXBZKTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoaW5zdGFuY2UuZ3JvdXAubGVuZ3RoIDwgMikge1xuXHRcdFx0XHRcdFx0XHRpbnN0YW5jZS5jbG9zZShzZWxmLnN0YXJ0RXZlbnQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvLyBJZ25vcmUgcmlnaHQgY2xpY2tcblx0XHRpZiAoZS5vcmlnaW5hbEV2ZW50ICYmIGUub3JpZ2luYWxFdmVudC5idXR0b24gPT0gMikge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIFNraXAgaWYgY2xpY2tlZCBvbiB0aGUgc2Nyb2xsYmFyXG5cdFx0aWYgKCEkdGFyZ2V0LmlzKFwiaW1nXCIpICYmIHRhcFggPiAkdGFyZ2V0WzBdLmNsaWVudFdpZHRoICsgJHRhcmdldC5vZmZzZXQoKS5sZWZ0KSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gQ2hlY2sgd2hlcmUgaXMgY2xpY2tlZFxuXHRcdGlmICgk
6780dGFyZ2V0LmlzKFwiLmZhbmN5Ym94LWJnLC5mYW5jeWJveC1pbm5lciwuZmFuY3lib3gtb3V0ZXIsLmZhbmN5Ym94LWNvbnRhaW5lclwiKSkge1xuXHRcdFx0d2hlcmUgPSBcIk91dHNpZGVcIjtcblx0XHR9IGVsc2UgaWYgKCR0YXJnZXQuaXMoXCIuZmFuY3lib3gtc2xpZGVcIikpIHtcblx0XHRcdHdoZXJlID0gXCJTbGlkZVwiO1xuXHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRpbnN0YW5jZS5jdXJyZW50LiRjb250ZW50ICYmXG5cdFx0XHRpbnN0YW5jZS5jdXJyZW50LiRjb250ZW50XG5cdFx0XHRcdC5maW5kKCR0YXJnZXQpXG5cdFx0XHRcdC5hZGRCYWNrKClcblx0XHRcdFx0LmZpbHRlcigkdGFyZ2V0KS5sZW5ndGhcblx0XHQpIHtcblx0XHRcdHdoZXJlID0gXCJDb250ZW50XCI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBDaGVjayBpZiB0aGlzIGlzIGEgZG91YmxlIHRhcFxuXHRcdGlmIChzZWxmLnRhcHBlZCkge1xuXHRcdFx0Ly8gU3RvcCBwcmV2aW91c2x5IGNyZWF0ZWQgc2luZ2xlIHRhcFxuXHRcdFx0Y2xlYXJUaW1lb3V0KHNlbGYudGFwcGVkKTtcblx0XHRcdHNlbGYudGFwcGVkID0gbnVsbDtcblxuXHRcdFx0Ly8gU2tpcCBpZiBkaXN0YW5jZSBiZXR3ZWVuIHRhcHMgaXMgdG9vIGJpZ1xuXHRcdFx0aWYgKE1hdGguYWJzKHRhcFggLSBzZWxmLnRhcFgpID4gNTAgfHwgTWF0aC5hYnModGFwWSAtIHNlbGYudGFwWSkgPiA1MCkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH1cblxuXHRcdFx0Ly8gT0ssIG5vdyB3ZSBhc3N1bWUgdGhhdCB0aGlzIGlzIGEgZG91YmxlLXRhcFxuXHRcdFx0cHJvY2VzcyhcImRibGNsaWNrXCIgKyB3aGVyZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIFNpbmdsZSB0YXAgd2lsbCBiZSBwcm9jZXNzZWQgaWYgdXNlciBoYXMgbm90IGNsaWNrZWQgc2Vjb25kIHRpbWUgd2l0aGluIDMwMG1zXG5cdFx0XHQvLyBvciB0aGVyZSBpcyBubyBuZWVkIHRvIH
6780dhaXQgZm9yIGRvdWJsZS10YXBcblx0XHRcdHNlbGYudGFwWCA9IHRhcFg7XG5cdFx0XHRzZWxmLnRhcFkgPSB0YXBZO1xuXG5cdFx0XHRpZiAoY3VycmVudC5vcHRzW1wiZGJsY2xpY2tcIiArIHdoZXJlXSAmJiBjdXJyZW50Lm9wdHNbXCJkYmxjbGlja1wiICsgd2hlcmVdICE9PSBjdXJyZW50Lm9wdHNbXCJjbGlja1wiICsgd2hlcmVdKSB7XG5cdFx0XHRcdHNlbGYudGFwcGVkID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0c2VsZi50YXBwZWQgPSBudWxsO1xuXG5cdFx0XHRcdFx0aWYgKCFpbnN0YW5jZS5pc0FuaW1hdGluZykge1xuXHRcdFx0XHRcdFx0cHJvY2VzcyhcImNsaWNrXCIgKyB3aGVyZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LCA1MDApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cHJvY2VzcyhcImNsaWNrXCIgKyB3aGVyZSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH07XG5cblx0JChkb2N1bWVudClcblx0XHQub24oXCJvbkFjdGl2YXRlLmZiXCIsIGZ1bmN0aW9uIChlLCBpbnN0YW5jZSkge1xuXHRcdFx0aWYgKGluc3RhbmNlICYmICFpbnN0YW5jZS5HdWVzdHVyZXMpIHtcblx0XHRcdFx0aW5zdGFuY2UuR3Vlc3R1cmVzID0gbmV3IEd1ZXN0dXJlcyhpbnN0YW5jZSk7XG5cdFx0XHR9XG5cdFx0fSlcblx0XHQub24oXCJiZWZvcmVDbG9zZS5mYlwiLCBmdW5jdGlvbiAoZSwgaW5zdGFuY2UpIHtcblx0XHRcdGlmIChpbnN0YW5jZSAmJiBpbnN0YW5jZS5HdWVzdHVyZXMpIHtcblx0XHRcdFx0aW5zdGFuY2UuR3Vlc3R1cmVzLmRlc3Ryb3koKTtcblx0XHRcdH1cblx0XHR9KTtcbn0pKHdpbmRvdywgZG9jdW1lbnQsIGpRdWVyeSk7XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy9cbi8vIFNsaWRlU2hvd1xuLy8gRW5hYmxlcyBzbGlkZXNob3cgZnVuY3Rpb25hbGl0eVxuLy9cbi8vIEV4YW1wbGUgb2YgdXNhZ2U6XG4vLyAkLmZhbmN5Ym94LmdldEluc3RhbmNlKCkuU2xpZGVTaG93LnN0YXJ0KClcbi8vXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuKGZ1bmN0aW9uIChkb2N1bWVudCwgJCkge1xuXHRcInVzZSBzdHJpY3RcIjtcblxuXHQkLmV4dGVuZCh0cnVlLCAkLmZhbmN5Ym94LmRlZmF1bHRzLCB7XG5cdFx0YnRuVHBsOiB7XG5cdFx0XHRzbGlkZVNob3c6ICc8YnV0dG9uIGRhdGEtZmFuY3lib3gtcGxheSBjbGFzcz1cImZhbmN5Ym94LWJ1dHRvbiBmYW5jeWJveC1idXR0b24tLXBsYXlcIiB0aXRsZT1cInt7UExBWV9TVEFSVH19XCI+JyArXG5cdFx0XHRcdCc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+PHBhdGggZD1cIk02LjUgNS40djEzLjJsMTEtNi42elwiLz48L3N2Zz4nICtcblx0XHRcdFx0JzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj48cGF0aCBkPVwiTTguMzMgNS43NWgyLjJ2MTIuNWgtMi4yVjUuNzV6bTUuMTUgMGgyLjJ2MTIuNWgtMi4yVjUuNzV6XCIvPjwvc3ZnPicgK1xuXHRcdFx0XHRcIjwvYnV0dG9uPlwiXG5cdFx0fSxcblx0XHRzbGlkZVNob3c6IHtcblx0XHRcdGF1dG9TdGFydDogZmFsc2UsXG5cdFx0XHRzcGVlZDogMzAwMCxcblx0XHRcdHByb2dyZXNzOiB0cnVlXG5cdFx0fVxuXHR9KTtcblxuXHR2YXIgU2xpZGVTaG93ID0gZnVuY3Rpb24gKGluc3RhbmNlKSB7XG5cdFx0dGhpcy5pbnN0YW5jZSA9IGluc3RhbmNlO1xuXHRcdHRoaXMuaW5pdCgpO1xuXHR9O1xuXG5cdCQuZXh0ZW5kKFNsaWRlU2hvdy5wcm90b3R5cGUsIHtcblx0XHR0aW1lcjogbnVsbCxcblx0XHRpc0FjdGl2ZTogZmFsc2UsXG5cdFx0JGJ1dHRvbjogbnVsbCxcblxuXHRcdGluaXQ6IGZ1bmN0aW9uICgpIHtcblx0XHRcdHZhciBzZWxmID0gdGhpcyxcblx0XHRcdFx0aW5zdGFuY2UgPSBzZWxmLmluc3RhbmNlLFxuXHRcdFx0XHRvcHRzID0gaW5zdGFuY2UuZ3JvdXBbaW5zdGFuY2UuY3VyckluZGV4XS5vcHRzLnNsaWRlU2hvdztcblxuXHRcdFx0c2VsZi4kYnV0dG9uID0gaW5zdGFuY2UuJHJlZnMudG9vbGJhci5maW5kKFwiW2RhdGEtZmFuY3lib3gtcGxheV1cIikub24oXCJjbGlja1wiLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHNlbGYudG9nZ2xlKCk7XG5cdFx0XHR9KTtcblxuXHRcdFx0aWYgKGluc3RhbmNlLmdyb3VwLmxlbmd0aCA8IDIgfHwgIW9wdHMpIHtcblx0XHRcdFx0c2VsZi4kYnV0dG9uLmhpZGUoKTtcblx0XHRcdH0gZWxzZSBpZiAob3B0cy5wcm9ncmVzcykge1xuXHRcdFx0XHRzZWxmLiRwcm9ncmVzcyA9ICQoJzxkaXYgY2xhc3M9XCJmYW5jeWJveC1wcm9ncmVzc1wiPjwvZGl2PicpLmFwcGVuZFRvKGluc3RhbmNlLiRyZWZzLmlubmVyKTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0c2V0OiBmdW5jdGlvbiAoZm9yY2UpIHtcblx0XHRcdHZhciBzZWxmID0gdGhpcyxcblx0XHRcdFx0aW5zdGFuY2UgPSBzZWxmLmluc3RhbmNlLFxuXHRcdFx0XHRjdXJyZW50ID0gaW5zdGFuY2UuY3VycmVudDtcblxuXHRcdFx0Ly8gQ2hlY2sgaWYgcmVhY2hlZCBsYXN0IGVsZW1lbnRcblx0XHRcdGlmIChjdXJyZW50ICYmIChmb3JjZSA9PT0gdHJ1ZSB8fCBjdXJyZW50Lm9wdHMubG9vcCB8fCBpbnN0YW5jZS5jdXJySW5kZXggPCBpbnN0YW5jZS5ncm91cC5sZW5ndGggLSAxKSkge1xuXHRcdFx0XHRpZiAoc2VsZi5pc0FjdGl2ZSAmJiBjdXJyZW50LmNvbnRlbn
6780RUeXBlICE9PSBcInZpZGVvXCIpIHtcblx0XHRcdFx0XHRpZiAoc2VsZi4kcHJvZ3Jlc3MpIHtcblx0XHRcdFx0XHRcdCQuZmFuY3lib3guYW5pbWF0ZShzZWxmLiRwcm9ncmVzcy5zaG93KCksIHtcblx0XHRcdFx0XHRcdFx0c2NhbGVYOiAxXG5cdFx0XHRcdFx0XHR9LCBjdXJyZW50Lm9wdHMuc2xpZGVTaG93LnNwZWVkKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRzZWxmLnRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRpZiAoIWluc3RhbmNlLmN1cnJlbnQub3B0cy5sb29wICYmIGluc3RhbmNlLmN1cnJlbnQuaW5kZXggPT0gaW5zdGFuY2UuZ3JvdXAubGVuZ3RoIC0gMSkge1xuXHRcdFx0XHRcdFx0XHRpbnN0YW5jZS5qdW1wVG8oMCk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRpbnN0YW5jZS5uZXh0KCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSwgY3VycmVudC5vcHRzLnNsaWRlU2hvdy5zcGVlZCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHNlbGYuc3RvcCgpO1xuXHRcdFx0XHRpbnN0YW5jZS5pZGxlU2Vjb25kc0NvdW50ZXIgPSAwO1xuXHRcdFx0XHRpbnN0YW5jZS5zaG93Q29udHJvbHMoKTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0Y2xlYXI6IGZ1bmN0aW9uICgpIHtcblx0XHRcdHZhciBzZWxmID0gdGhpcztcblxuXHRcdFx0Y2xlYXJUaW1lb3V0KHNlbGYudGltZXIpO1xuXG5cdFx0XHRzZWxmLnRpbWVyID0gbnVsbDtcblxuXHRcdFx0aWYgKHNlbGYuJHByb2dyZXNzKSB7XG5cdFx0XHRcdHNlbGYuJHByb2dyZXNzLnJlbW92ZUF0dHIoXCJzdHlsZVwiKS5oaWRlKCk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdHN0YXJ0OiBmdW5jdGlvbiAoKSB7XG5cdFx0XHR2YXIgc2VsZiA9IHRoaXMsXG5cdFx0XHRcdGN1cnJlbnQgPSBzZWxmLmluc3RhbmNlLmN1cnJlbnQ7XG5cblx0XHRcdGlmIChjdXJyZW50KSB7XG5cdFx0XHRcdHNlbGYuJGJ1dHRvblxuXHRcdFx0XHRcdC5hdHRyKFwidGl0bGVcIiwgKGN1cnJlbnQub3B0cy5pMThuW2N1cnJlbnQub3B0cy5sYW5nXSB8fCBjdXJyZW50Lm9wdHMuaTE4bi5lbikuUExBWV9TVE9QKVxuXHRcdFx0XHRcdC5yZW1vdmVDbGFzcyhcImZhbmN5Ym94LWJ1dHRvbi0tcGxheVwiKVxuXHRcdFx0XHRcdC5hZGRDbGFzcyhcImZhbmN5Ym94LWJ1dHRvbi0tcGF1c2VcIik7XG5cblx0XHRcdFx0c2VsZi5pc0FjdGl2ZSA9IHRydWU7XG5cblx0XHRcdFx0aWYgKGN1cnJlbnQuaXNDb21wbGV0ZSkge1xuXHRcdFx0XHRcdHNlbGYuc2V0KHRydWUpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0c2VsZi5pbnN0YW5jZS50cmlnZ2VyKFwib25TbGlkZVNob3dDaGFuZ2VcIiwgdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdHN0b3A6IGZ1bmN0aW9uICgpIHtcblx0XHRcdHZhciBzZWxmID0gdGhpcyxcblx0XHRcdFx0Y3VycmVudCA9IHNlbGYuaW5zdGFuY2UuY3VycmVudDtcblxuXHRcdFx0c2VsZi5jbGVhcigpO1xuXG5cdFx0XHRzZWxmLiRidXR0b25cblx0XHRcdFx0LmF0dHIoXCJ0aXRsZVwiLCAoY3VycmVudC5vcHRzLmkxOG5bY3VycmVudC5vcHRzLmxhbmddIHx8IGN1cnJlbnQub3B0cy5pMThuLmVuKS5QTEFZX1NUQVJUKVxuXHRcdFx0XHQucmVtb3ZlQ2xhc3MoXCJmYW5jeWJveC1idXR0b24tLXBhdXNlXCIpXG5cdFx0XHRcdC5hZGRDbGFzcyhcImZhbmN5Ym94LWJ1dHRvbi0tcGxheVwiKTtcblxuXHRcdFx0c2VsZi5pc0FjdGl2ZSA9IGZhbHNlO1xuXG5cdFx0XHRzZWxmLmluc3RhbmNlLnRyaWdnZXIoXCJvblNsaWRlU2hvd0NoYW5nZVwiLCBmYWxzZSk7XG5cblx0XHRcdGlmIChzZWxmLiRwcm9ncmVzcykge1xuXHRcdFx0XHRzZWxmLiRwcm9ncmVzcy5yZW1vdmVBdHRyKFwic3R5bGVcIikuaGlkZSgpO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHR0b2dnbGU6IGZ1bmN0aW9uICgpIHtcblx0XHRcdHZhciBzZWxmID0gdGhpcztcblxuXHRcdFx0aWYgKHNlbGYuaXNBY3RpdmUpIHtcblx0XHRcdFx0c2VsZi5zdG9wKCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzZWxmLnN0YXJ0KCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblxuXHQkKGRvY3VtZW50KS5vbih7XG5cdFx0XCJvbkluaXQuZmJcIjogZnVuY3Rpb24gKGUsIGluc3RhbmNlKSB7XG5cdFx0XHRpZiAoaW5zdGFuY2UgJiYgIWluc3RhbmNlLlNsaWRlU2hvdykge1xuXHRcdFx0XHRpbnN0YW5jZS5TbGlkZVNob3cgPSBuZXcgU2xpZGVTaG93KGluc3RhbmNlKTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0XCJiZWZvcmVTaG93LmZiXCI6IGZ1bmN0aW9uIChlLCBpbnN0YW5jZSwgY3VycmVudCwgZmlyc3RSdW4pIHtcblx0XHRcdHZhciBTbGlkZVNob3cgPSBpbnN0YW5jZSAmJiBpbnN0YW5jZS5TbGlkZVNob3c7XG5cblx0XHRcdGlmIChmaXJzdFJ1bikge1xuXHRcdFx0XHRpZiAoU2xpZGVTaG93ICYmIGN1cnJlbnQub3B0cy5zbGlkZVNob3cuYXV0b1N0YXJ0KSB7XG5cdFx0XHRcdFx0U2xpZGVTaG93LnN0YXJ0KCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoU2xpZGVTaG93ICYmIFNsaWRlU2hvdy5pc0FjdGl2ZSkge1xuXHRcdFx0XHRTbGlkZVNob3cuY2xlYXIoKTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0XCJhZnRlclNob3cuZmJcIjogZnVuY3Rpb24gKGUsIGluc3RhbmNlLCBjdXJyZW50KSB7XG5cdFx0XHR2YXIgU2xpZGVTaG93ID0gaW5zdGFuY2UgJiYgaW5zdGFuY2UuU2xpZGVTaG93O1xuXG5cdFx0XHRpZiAoU2xpZGVTaG93ICYmIFNsaWRlU2hvdy5pc0FjdGl2ZSkge1xuXHRcdFx0XHRTbGlkZVNob3cuc2V0KCk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdFwiYWZ0ZXJLZXlkb3duLmZiXCI6IGZ1bmN0aW9uIChlLCBpbnN0YW5jZSwgY3VycmVudCwga2V5cHJlc3MsIGtleWNvZGUpIHtcblx0XHRcdHZhciBTbGlkZVNob3cgPSBpbnN0YW5jZSAmJiBpbnN0YW5jZS5TbGlkZVNob3c7XG5cblx0XHRcdC8vIFwiUFwiIG9yIFNwYWNlYmFyXG5cdFx0XHRpZiAoU2xpZGVTaG93ICYmIGN1cnJlbnQub3B0cy5zbGlkZVNob3cgJiYgKGtleWNvZGUgPT09IDgwIHx8IGtleWNvZGUgPT09IDMyKSAmJiAhJChkb2
6780N1bWVudC5hY3RpdmVFbGVtZW50KS5pcyhcImJ1dHRvbixhLGlucHV0XCIpKSB7XG5cdFx0XHRcdGtleXByZXNzLnByZXZlbnREZWZhdWx0KCk7XG5cblx0XHRcdFx0U2xpZGVTaG93LnRvZ2dsZSgpO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHRcImJlZm9yZUNsb3NlLmZiIG9uRGVhY3RpdmF0ZS5mYlwiOiBmdW5jdGlvbiAoZSwgaW5zdGFuY2UpIHtcblx0XHRcdHZhciBTbGlkZVNob3cgPSBpbnN0YW5jZSAmJiBpbnN0YW5jZS5TbGlkZVNob3c7XG5cblx0XHRcdGlmIChTbGlkZVNob3cpIHtcblx0XHRcdFx0U2xpZGVTaG93LnN0b3AoKTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXG5cdC8vIFBhZ2UgVmlzaWJpbGl0eSBBUEkgdG8gcGF1c2Ugc2xpZGVzaG93IHdoZW4gd2luZG93IGlzIG5vdCBhY3RpdmVcblx0JChkb2N1bWVudCkub24oXCJ2aXNpYmlsaXR5Y2hhbmdlXCIsIGZ1bmN0aW9uICgpIHtcblx0XHR2YXIgaW5zdGFuY2UgPSAkLmZhbmN5Ym94LmdldEluc3RhbmNlKCksXG5cdFx0XHRTbGlkZVNob3cgPSBpbnN0YW5jZSAmJiBpbnN0YW5jZS5TbGlkZVNob3c7XG5cblx0XHRpZiAoU2xpZGVTaG93ICYmIFNsaWRlU2hvdy5pc0FjdGl2ZSkge1xuXHRcdFx0aWYgKGRvY3VtZW50LmhpZGRlbikge1xuXHRcdFx0XHRTbGlkZVNob3cuY2xlYXIoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFNsaWRlU2hvdy5zZXQoKTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xufSkoZG9jdW1lbnQsIGpRdWVyeSk7XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy9cbi8vIEZ1bGxTY3JlZW5cbi8vIEFkZHMgZnVsbHNjcmVlbiBmdW5jdGlvbmFsaXR5XG4vL1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbihmdW5jdGlvbiAoZG9jdW1lbnQsICQpIHtcblx0XCJ1c2Ugc3RyaWN0XCI7XG5cblx0Ly8gQ29sbGVjdGlvbiBvZiBtZXRob2RzIHN1cHBvcnRlZCBieSB1c2VyIGJyb3dzZXJcblx0dmFyIGZuID0gKGZ1bmN0aW9uICgpIHtcblx0XHR2YXIgZm5NYXAgPSBbXG5cdFx0XHRbXCJyZXF1ZXN0RnVsbHNjcmVlblwiLCBcImV4aXRGdWxsc2NyZWVuXCIsIFwiZnVsbHNjcmVlbkVsZW1lbnRcIiwgXCJmdWxsc2NyZWVuRW5hYmxlZFwiLCBcImZ1bGxzY3JlZW5jaGFuZ2VcIiwgXCJmdWxsc2NyZWVuZXJyb3JcIl0sXG5cdFx0XHQvLyBuZXcgV2ViS2l0XG5cdFx0XHRbXG5cdFx0XHRcdFwid2Via2l0UmVxdWVzdEZ1bGxzY3JlZW5cIixcblx0XHRcdFx0XCJ3ZWJraXRFeGl0RnVsbHNjcmVlblwiLFxuXHRcdFx0XHRcIndlYmtpdEZ1bGxzY3JlZW5FbGVtZW50XCIsXG5cdFx0XHRcdFwid2Via2l0RnVsbHNjcmVlbkVuYWJsZWRcIixcblx0XHRcdFx0XCJ3ZWJraXRmdWxsc2NyZWVuY2hhbmdlXCIsXG5cdFx0XHRcdFwid2Via2l0ZnVsbHNjcmVlbmVycm9yXCJcblx0XHRcdF0sXG5cdFx0XHQvLyBvbGQgV2ViS2l0IChTYWZhcmkgNS4xKVxuXHRcdFx0W1xuXHRcdFx0XHRcIndlYmtpdFJlcXVlc3RGdWxsU2NyZWVuXCIsXG5cdFx0XHRcdFwid2Via2l0Q2FuY2VsRnVsbFNjcmVlblwiLFxuXHRcdFx0XHRcIndlYmtpdEN1cnJlbnRGdWxsU2NyZWVuRWxlbWVudFwiLFxuXHRcdFx0XHRcIndlYmtpdENhbmNlbEZ1bGxTY3JlZW5cIixcblx0XHRcdFx0XCJ3ZWJraXRmdWxsc2NyZWVuY2hhbmdlXCIsXG5cdFx0XHRcdFwid2Via2l0ZnVsbHNjcmVlbmVycm9yXCJcblx0XHRcdF0sXG5cdFx0XHRbXG5cdFx0XHRcdFwibW96UmVxdWVzdEZ1bGxTY3JlZW5cIixcblx0XHRcdFx0XCJtb3pDYW5jZWxGdWxsU2NyZWVuXCIsXG5cdFx0XHRcdFwibW96RnVsbFNjcmVlbkVsZW1lbnRcIixcblx0XHRcdFx0XCJtb3pGdWxsU2NyZWVuRW5hYmxlZFwiLFxuXHRcdFx0XHRcIm1vemZ1bGxzY3JlZW5jaGFuZ2VcIixcblx0XHRcdFx0XCJtb3pmdWxsc2NyZWVuZXJyb3JcIlxuXHRcdFx0XSxcblx0XHRcdFtcIm1zUmVxdWVzdEZ1bGxzY3JlZW5cIiwgXCJtc0V4aXRGdWxsc2NyZWVuXCIsIFwibXNGdWxsc2NyZWVuRWxlbWVudFwiLCBcIm1zRnVsbHNjcmVlbkVuYWJsZWRcIiwgXCJNU0Z1bGxzY3JlZW5DaGFuZ2VcIiwgXCJNU0Z1bGxzY3JlZW5FcnJvclwiXVxuXHRcdF07XG5cblx0XHR2YXIgcmV0ID0ge307XG5cblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGZuTWFwLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgdmFsID0gZm5NYXBbaV07XG5cblx0XHRcdGlmICh2YWwgJiYgdmFsWzFdIGluIGRvY3VtZW50KSB7XG5cdFx0XHRcdGZvciAodmFyIGogPSAwOyBqIDwgdmFsLmxlbmd0aDsgaisrKSB7XG5cdFx0XHRcdFx0cmV0W2ZuTWFwWzBdW2pdXSA9IHZhbFtqXTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiByZXQ7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9KSgpO1xuXG5cdGlmIChmbikge1xuXHRcdHZhciBGdWxsU2NyZWVuID0ge1xuXHRcdFx0cmVxdWVzdDogZnVuY3Rpb24gKGVsZW0pIHtcblx0XHRcdFx0ZWxlbSA9IGVsZW0gfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuXG5cdFx0XHRcdGVsZW1bZm4ucmVxdWVzdEZ1bGxzY3JlZW5dKGVsZW0uQUxMT1dfS0VZQk9BUkRfSU5QVVQpO1xuXHRcdFx0fSxcblx0XHRcdGV4aXQ6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0ZG9jdW1lbnRbZm4uZXhpdEZ1bGxzY3JlZW5dKCk7XG5cdFx0XHR9LFxuXHRcdFx0dG9nZ2xlOiBmdW5jdGlvbiAoZWxlbSkge1xuXHRcdFx0XHRlbGVtID0gZWxlbSB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cblx0XHRcdFx0aWYgKHRoaXMuaXNGdWxsc2NyZWVuKCkpIHtcblx0XHRcdFx0XHR0aGlzLmV4aXQoKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0aGlzLnJlcXVlc3QoZWxlbSk7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRpc0Z1bGxzY3JlZW46IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmV0dXJuIEJvb2xlYW4oZG9jdW1lbnRbZm4uZnVsbHNjcmVlbkVsZW1lbnRdKTtcblx0XHRcdH0sXG5cdFx0XHRlbmFibGVkOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHJldHVybi
6780BCb29sZWFuKGRvY3VtZW50W2ZuLmZ1bGxzY3JlZW5FbmFibGVkXSk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdCQuZXh0ZW5kKHRydWUsICQuZmFuY3lib3guZGVmYXVsdHMsIHtcblx0XHRcdGJ0blRwbDoge1xuXHRcdFx0XHRmdWxsU2NyZWVuOiAnPGJ1dHRvbiBkYXRhLWZhbmN5Ym94LWZ1bGxzY3JlZW4gY2xhc3M9XCJmYW5jeWJveC1idXR0b24gZmFuY3lib3gtYnV0dG9uLS1mc2VudGVyXCIgdGl0bGU9XCJ7e0ZVTExfU0NSRUVOfX1cIj4nICtcblx0XHRcdFx0XHQnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiPjxwYXRoIGQ9XCJNNyAxNEg1djVoNXYtMkg3di0zem0tMi00aDJWN2gzVjVINXY1em0xMiA3aC0zdjJoNXYtNWgtMnYzek0xNCA1djJoM3YzaDJWNWgtNXpcIi8+PC9zdmc+JyArXG5cdFx0XHRcdFx0JzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj48cGF0aCBkPVwiTTUgMTZoM3YzaDJ2LTVINXptMy04SDV2Mmg1VjVIOHptNiAxMWgydi0zaDN2LTJoLTV6bTItMTFWNWgtMnY1aDVWOHpcIi8+PC9zdmc+JyArXG5cdFx0XHRcdFx0XCI8L2J1dHRvbj5cIlxuXHRcdFx0fSxcblx0XHRcdGZ1bGxTY3JlZW46IHtcblx0XHRcdFx0YXV0b1N0YXJ0OiBmYWxzZVxuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0JChkb2N1bWVudCkub24oZm4uZnVsbHNjcmVlbmNoYW5nZSwgZnVuY3Rpb24gKCkge1xuXHRcdFx0dmFyIGlzRnVsbHNjcmVlbiA9IEZ1bGxTY3JlZW4uaXNGdWxsc2NyZWVuKCksXG5cdFx0XHRcdGluc3RhbmNlID0gJC5mYW5jeWJveC5nZXRJbnN0YW5jZSgpO1xuXG5cdFx0XHRpZiAoaW5zdGFuY2UpIHtcblx0XHRcdFx0Ly8gSWYgaW1hZ2UgaXMgem9vbWluZywgdGhlbiBmb3JjZSB0byBzdG9wIGFuZCByZXBvc2l0aW9uIHByb3Blcmx5XG5cdFx0XHRcdGlmIChpbnN0YW5jZS5jdXJyZW50ICYmIGluc3RhbmNlLmN1cnJlbnQudHlwZSA9PT0gXCJpbWFnZVwiICYmIGluc3RhbmNlLmlzQW5pbWF0aW5nKSB7XG5cdFx0XHRcdFx0aW5zdGFuY2UuaXNBbmltYXRpbmcgPSBmYWxzZTtcblxuXHRcdFx0XHRcdGluc3RhbmNlLnVwZGF0ZSh0cnVlLCB0cnVlLCAwKTtcblxuXHRcdFx0XHRcdGlmICghaW5zdGFuY2UuaXNDb21wbGV0ZSkge1xuXHRcdFx0XHRcdFx0aW5zdGFuY2UuY29tcGxldGUoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpbnN0YW5jZS50cmlnZ2VyKFwib25GdWxsc2NyZWVuQ2hhbmdlXCIsIGlzRnVsbHNjcmVlbik7XG5cblx0XHRcdFx0aW5zdGFuY2UuJHJlZnMuY29udGFpbmVyLnRvZ2dsZUNsYXNzKFwiZmFuY3lib3gtaXMtZnVsbHNjcmVlblwiLCBpc0Z1bGxzY3JlZW4pO1xuXG5cdFx0XHRcdGluc3RhbmNlLiRyZWZzLnRvb2xiYXJcblx0XHRcdFx0XHQuZmluZChcIltkYXRhLWZhbmN5Ym94LWZ1bGxzY3JlZW5dXCIpXG5cdFx0XHRcdFx0LnRvZ2dsZUNsYXNzKFwiZmFuY3lib3gtYnV0dG9uLS1mc2VudGVyXCIsICFpc0Z1bGxzY3JlZW4pXG5cdFx0XHRcdFx0LnRvZ2dsZUNsYXNzKFwiZmFuY3lib3gtYnV0dG9uLS1mc2V4aXRcIiwgaXNGdWxsc2NyZWVuKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdCQoZG9jdW1lbnQpLm9uKHtcblx0XHRcIm9uSW5pdC5mYlwiOiBmdW5jdGlvbiAoZSwgaW5zdGFuY2UpIHtcblx0XHRcdHZhciAkY29udGFpbmVyO1xuXG5cdFx0XHRpZiAoIWZuKSB7XG5cdFx0XHRcdGluc3RhbmNlLiRyZWZzLnRvb2xiYXIuZmluZChcIltkYXRhLWZhbmN5Ym94LWZ1bGxzY3JlZW5dXCIpLnJlbW92ZSgpO1xuXG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGluc3RhbmNlICYmIGluc3RhbmNlLmdyb3VwW2luc3RhbmNlLmN1cnJJbmRleF0ub3B0cy5mdWxsU2NyZWVuKSB7XG5cdFx0XHRcdCRjb250YWluZXIgPSBpbnN0YW5jZS4kcmVmcy5jb250YWluZXI7XG5cblx0XHRcdFx0JGNvbnRhaW5lci5vbihcImNsaWNrLmZiLWZ1bGxzY3JlZW5cIiwgXCJbZGF0YS1mYW5jeWJveC1mdWxsc2NyZWVuXVwiLCBmdW5jdGlvbiAoZSkge1xuXHRcdFx0XHRcdGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG5cdFx0XHRcdFx0RnVsbFNjcmVlbi50b2dnbGUoKTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0aWYgKGluc3RhbmNlLm9wdHMuZnVsbFNjcmVlbiAmJiBpbnN0YW5jZS5vcHRzLmZ1bGxTY3JlZW4uYXV0b1N0YXJ0ID09PSB0cnVlKSB7XG5cdFx0XHRcdFx0RnVsbFNjcmVlbi5yZXF1ZXN0KCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBFeHBvc2UgQVBJXG5cdFx0XHRcdGluc3RhbmNlLkZ1bGxTY3JlZW4gPSBGdWxsU2NyZWVuO1xuXHRcdFx0fSBlbHNlIGlmIChpbnN0YW5jZSkge1xuXHRcdFx0XHRpbnN0YW5jZS4kcmVmcy50b29sYmFyLmZpbmQoXCJbZGF0YS1mYW5jeWJveC1mdWxsc2NyZWVuXVwiKS5oaWRlKCk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdFwiYWZ0ZXJLZXlkb3duLmZiXCI6IGZ1bmN0aW9uIChlLCBpbnN0YW5jZSwgY3VycmVudCwga2V5cHJlc3MsIGtleWNvZGUpIHtcblx0XHRcdC8vIFwiRlwiXG5cdFx0XHRpZiAoaW5zdGFuY2UgJiYgaW5zdGFuY2UuRnVsbFNjcmVlbiAmJiBrZXljb2RlID09PSA3MCkge1xuXHRcdFx0XHRrZXlwcmVzcy5wcmV2ZW50RGVmYXVsdCgpO1xuXG5cdFx0XHRcdGluc3RhbmNlLkZ1bGxTY3JlZW4udG9nZ2xlKCk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdFwiYmVmb3JlQ2xvc2UuZmJcIjogZnVuY3Rpb24gKGUsIGluc3RhbmNlKSB7XG5cdFx0XHRpZiAoaW5zdGFuY2UgJiYgaW5zdGFuY2UuRnVsbFNjcmVlbiAmJiBpbnN0YW5jZS4kcmVmcy5jb250YWluZXIuaGFzQ2xhc3MoXCJmYW5jeWJveC1pcy1mdWxsc2NyZWVuXCIpKSB7XG5cdFx0XHRcdEZ1bGxTY3JlZW4uZXhpdCgpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG59KShkb2N1bWVudCwgalF1ZXJ5KTtcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vL1xuLy8gVGh1bWJzXG4vLyBEaXNwbGF5cyB0aHVtYm5haWxzIGluIGEgZ3JpZFxuLy9cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4oZnVuY3Rpb24gKGRvY3VtZW50LCAkKSB7XG5cdFwidXNlIHN0cmljdFwiO1xuXG5cdHZhciBDTEFTUyA9IFwiZmFuY3lib3gtdGh1bWJzXCIsXG5cdFx0Q0xBU1NfQUNUSVZF
6780ID0gQ0xBU1MgKyBcIi1hY3RpdmVcIjtcblxuXHQvLyBNYWtlIHN1cmUgdGhlcmUgYXJlIGRlZmF1bHQgdmFsdWVzXG5cdCQuZmFuY3lib3guZGVmYXVsdHMgPSAkLmV4dGVuZChcblx0XHR0cnVlLCB7XG5cdFx0XHRidG5UcGw6IHtcblx0XHRcdFx0dGh1bWJzOiAnPGJ1dHRvbiBkYXRhLWZhbmN5Ym94LXRodW1icyBjbGFzcz1cImZhbmN5Ym94LWJ1dHRvbiBmYW5jeWJveC1idXR0b24tLXRodW1ic1wiIHRpdGxlPVwie3tUSFVNQlN9fVwiPicgK1xuXHRcdFx0XHRcdCc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+PHBhdGggZD1cIk0xNC41OSAxNC41OWgzLjc2djMuNzZoLTMuNzZ2LTMuNzZ6bS00LjQ3IDBoMy43NnYzLjc2aC0zLjc2di0zLjc2em0tNC40NyAwaDMuNzZ2My43Nkg1LjY1di0zLjc2em04Ljk0LTQuNDdoMy43NnYzLjc2aC0zLjc2di0zLjc2em0tNC40NyAwaDMuNzZ2My43NmgtMy43NnYtMy43NnptLTQuNDcgMGgzLjc2djMuNzZINS42NXYtMy43NnptOC45NC00LjQ3aDMuNzZ2My43NmgtMy43NlY1LjY1em0tNC40NyAwaDMuNzZ2My43NmgtMy43NlY1LjY1em0tNC40NyAwaDMuNzZ2My43Nkg1LjY1VjUuNjV6XCIvPjwvc3ZnPicgK1xuXHRcdFx0XHRcdFwiPC9idXR0b24+XCJcblx0XHRcdH0sXG5cdFx0XHR0aHVtYnM6IHtcblx0XHRcdFx0YXV0b1N0YXJ0OiBmYWxzZSwgLy8gRGlzcGxheSB0aHVtYm5haWxzIG9uIG9wZW5pbmdcblx0XHRcdFx0aGlkZU9uQ2xvc2U6IHRydWUsIC8vIEhpZGUgdGh1bWJuYWlsIGdyaWQgd2hlbiBjbG9zaW5nIGFuaW1hdGlvbiBzdGFydHNcblx0XHRcdFx0cGFyZW50RWw6IFwiLmZhbmN5Ym94LWNvbnRhaW5lclwiLCAvLyBDb250YWluZXIgaXMgaW5qZWN0ZWQgaW50byB0aGlzIGVsZW1lbnRcblx0XHRcdFx0YXhpczogXCJ5XCIgLy8gVmVydGljYWwgKHkpIG9yIGhvcml6b250YWwgKHgpIHNjcm9sbGluZ1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0JC5mYW5jeWJveC5kZWZhdWx0c1xuXHQpO1xuXG5cdHZhciBGYW5jeVRodW1icyA9IGZ1bmN0aW9uIChpbnN0YW5jZSkge1xuXHRcdHRoaXMuaW5pdChpbnN0YW5jZSk7XG5cdH07XG5cblx0JC5leHRlbmQoRmFuY3lUaHVtYnMucHJvdG90eXBlLCB7XG5cdFx0JGJ1dHRvbjogbnVsbCxcblx0XHQkZ3JpZDogbnVsbCxcblx0XHQkbGlzdDogbnVsbCxcblx0XHRpc1Zpc2libGU6IGZhbHNlLFxuXHRcdGlzQWN0aXZlOiBmYWxzZSxcblxuXHRcdGluaXQ6IGZ1bmN0aW9uIChpbnN0YW5jZSkge1xuXHRcdFx0dmFyIHNlbGYgPSB0aGlzLFxuXHRcdFx0XHRncm91cCA9IGluc3RhbmNlLmdyb3VwLFxuXHRcdFx0XHRlbmFibGVkID0gMDtcblxuXHRcdFx0c2VsZi5pbnN0YW5jZSA9IGluc3RhbmNlO1xuXHRcdFx0c2VsZi5vcHRzID0gZ3JvdXBbaW5zdGFuY2UuY3VyckluZGV4XS5vcHRzLnRodW1icztcblxuXHRcdFx0aW5zdGFuY2UuVGh1bWJzID0gc2VsZjtcblxuXHRcdFx0c2VsZi4kYnV0dG9uID0gaW5zdGFuY2UuJHJlZnMudG9vbGJhci5maW5kKFwiW2RhdGEtZmFuY3lib3gtdGh1bWJzXVwiKTtcblxuXHRcdFx0Ly8gRW5hYmxlIHRodW1icyBpZiBhdCBsZWFzdCB0d28gZ3JvdXAgaXRlbXMgaGF2ZSB0aHVtYm5haWxzXG5cdFx0XHRmb3IgKHZhciBpID0gMCwgbGVuID0gZ3JvdXAubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdFx0aWYgKGdyb3VwW2ldLnRodW1iKSB7XG5cdFx0XHRcdFx0ZW5hYmxlZCsrO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGVuYWJsZWQgPiAxKSB7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKGVuYWJsZWQgPiAxICYmICEhc2VsZi5vcHRzKSB7XG5cdFx0XHRcdHNlbGYuJGJ1dHRvbi5yZW1vdmVBdHRyKFwic3R5bGVcIikub24oXCJjbGlja1wiLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0c2VsZi50b2dnbGUoKTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0c2VsZi5pc0FjdGl2ZSA9IHRydWU7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzZWxmLiRidXR0b24uaGlkZSgpO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHRjcmVhdGU6IGZ1bmN0aW9uICgpIHtcblx0XHRcdHZhciBzZWxmID0gdGhpcyxcblx0XHRcdFx0aW5zdGFuY2UgPSBzZWxmLmluc3RhbmNlLFxuXHRcdFx0XHRwYXJlbnRFbCA9IHNlbGYub3B0cy5wYXJlbnRFbCxcblx0XHRcdFx0bGlzdCA9IFtdLFxuXHRcdFx0XHRzcmM7XG5cblx0XHRcdGlmICghc2VsZi4kZ3JpZCkge1xuXHRcdFx0XHQvLyBDcmVhdGUgbWFpbiBlbGVtZW50XG5cdFx0XHRcdHNlbGYuJGdyaWQgPSAkKCc8ZGl2IGNsYXNzPVwiJyArIENMQVNTICsgXCIgXCIgKyBDTEFTUyArIFwiLVwiICsgc2VsZi5vcHRzLmF4aXMgKyAnXCI+PC9kaXY+JykuYXBwZW5kVG8oXG5cdFx0XHRcdFx0aW5zdGFuY2UuJHJlZnMuY29udGFpbmVyXG5cdFx0XHRcdFx0XHQuZmluZChwYXJlbnRFbClcblx0XHRcdFx0XHRcdC5hZGRCYWNrKClcblx0XHRcdFx0XHRcdC5maWx0ZXIocGFyZW50RWwpXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0Ly8gQWRkIFwiY2xpY2tcIiBldmVudCB0aGF0IHBlcmZvcm1zIGdhbGxlcnkgbmF2aWdhdGlvblxuXHRcdFx0XHRzZWxmLiRncmlkLm9uKFwiY2xpY2tcIiwgXCJhXCIsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRpbnN0YW5jZS5qdW1wVG8oJCh0aGlzKS5hdHRyKFwiZGF0YS1pbmRleFwiKSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBCdWlsZCB0aGUgbGlzdFxuXHRcdFx0aWYgKCFzZWxmLiRsaXN0KSB7XG5cdFx0XHRcdHNlbGYuJGxpc3QgPSAkKCc8ZGl2IGNsYXNzPVwiJyArIENMQVNTICsgJ19fbGlzdFwiPicpLmFwcGVuZFRvKHNlbGYuJGdyaWQpO1xuXHRcdFx0fVxuXG5cdFx0XHQkLmVhY2goaW5zdGFuY2UuZ3JvdXAsIGZ1bmN0aW9uIChpLCBpdGVtKSB7XG5cdFx0XHRcdHNyYyA9IGl0ZW0udGh1bWI7XG5cblx0XHRcdFx0aWYgKCFzcmMgJiYgaXRlbS50eXBlID09PSBcImltYWdlXCIpIHtcblx0XHRcdFx0XHRzcmMgPSBpdGVtLnNyYztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGxpc3QucHVzaChcblx0XHRcdFx0XHQnPGEgaHJlZj1cImphdmFzY3JpcHQ6O1wiIHRhYmluZGV4PVwiMFwiIGRhdGEtaW5kZXg9XCInICtcblx0XHRcdFx0XHRpICtcblx0XHRcdFx0XHQnXCInICtcblx0XHRcdFx0XHQoc3JjICYmIHNyYy5sZW5ndGggPyAnIHN0eWxlPVwiYmFja2dyb3VuZC1pbWFnZTp1cmwoJyArIHNyYyArICcpXCInIDogJ2NsYXNzPVwiZmFuY3lib3gtdGh1bWJzLW1pc3NpbmdcIicpICtcblx0XHRcdFx0XHRcIj48L2E+XCJcblx0XHRcdFx0KTtcblx0XHRcdH0pO1xuXG5cdFx0XHRzZWxmLiRsaXN0WzBdLmlubmVySFRNTCA9IGxpc3Quam9pbihcIlwiKTtcblxuXHRcdFx0aWYgKHNlbGYub3B0cy5heGlzID09PSBcInhcIikge1xuXHRcdFx0XHQvLyBTZXQgZml4ZWQgd2lkdGggZm9yIGxpc3QgZWxlbWVudCB0byBlbmFibGUgaG9yaXpvbn
6780RhbCBzY3JvbGxpbmdcblx0XHRcdFx0c2VsZi4kbGlzdC53aWR0aChcblx0XHRcdFx0XHRwYXJzZUludChzZWxmLiRncmlkLmNzcyhcInBhZGRpbmctcmlnaHRcIiksIDEwKSArXG5cdFx0XHRcdFx0aW5zdGFuY2UuZ3JvdXAubGVuZ3RoICpcblx0XHRcdFx0XHRzZWxmLiRsaXN0XG5cdFx0XHRcdFx0XHQuY2hpbGRyZW4oKVxuXHRcdFx0XHRcdFx0LmVxKDApXG5cdFx0XHRcdFx0XHQub3V0ZXJXaWR0aCh0cnVlKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHRmb2N1czogZnVuY3Rpb24gKGR1cmF0aW9uKSB7XG5cdFx0XHR2YXIgc2VsZiA9IHRoaXMsXG5cdFx0XHRcdCRsaXN0ID0gc2VsZi4kbGlzdCxcblx0XHRcdFx0JGdyaWQgPSBzZWxmLiRncmlkLFxuXHRcdFx0XHR0aHVtYixcblx0XHRcdFx0dGh1bWJQb3M7XG5cblx0XHRcdGlmICghc2VsZi5pbnN0YW5jZS5jdXJyZW50KSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0dGh1bWIgPSAkbGlzdFxuXHRcdFx0XHQuY2hpbGRyZW4oKVxuXHRcdFx0XHQucmVtb3ZlQ2xhc3MoQ0xBU1NfQUNUSVZFKVxuXHRcdFx0XHQuZmlsdGVyKCdbZGF0YS1pbmRleD1cIicgKyBzZWxmLmluc3RhbmNlLmN1cnJlbnQuaW5kZXggKyAnXCJdJylcblx0XHRcdFx0LmFkZENsYXNzKENMQVNTX0FDVElWRSk7XG5cblx0XHRcdHRodW1iUG9zID0gdGh1bWIucG9zaXRpb24oKTtcblxuXHRcdFx0Ly8gQ2hlY2sgaWYgbmVlZCB0byBzY3JvbGwgdG8gbWFrZSBjdXJyZW50IHRodW1iIHZpc2libGVcblx0XHRcdGlmIChzZWxmLm9wdHMuYXhpcyA9PT0gXCJ5XCIgJiYgKHRodW1iUG9zLnRvcCA8IDAgfHwgdGh1bWJQb3MudG9wID4gJGxpc3QuaGVpZ2h0KCkgLSB0aHVtYi5vdXRlckhlaWdodCgpKSkge1xuXHRcdFx0XHQkbGlzdC5zdG9wKCkuYW5pbWF0ZSh7XG5cdFx0XHRcdFx0XHRzY3JvbGxUb3A6ICRsaXN0LnNjcm9sbFRvcCgpICsgdGh1bWJQb3MudG9wXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRkdXJhdGlvblxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIGlmIChcblx0XHRcdFx0c2VsZi5vcHRzLmF4aXMgPT09IFwieFwiICYmXG5cdFx0XHRcdCh0aHVtYlBvcy5sZWZ0IDwgJGdyaWQuc2Nyb2xsTGVmdCgpIHx8IHRodW1iUG9zLmxlZnQgPiAkZ3JpZC5zY3JvbGxMZWZ0KCkgKyAoJGdyaWQud2lkdGgoKSAtIHRodW1iLm91dGVyV2lkdGgoKSkpXG5cdFx0XHQpIHtcblx0XHRcdFx0JGxpc3Rcblx0XHRcdFx0XHQucGFyZW50KClcblx0XHRcdFx0XHQuc3RvcCgpXG5cdFx0XHRcdFx0LmFuaW1hdGUoe1xuXHRcdFx0XHRcdFx0XHRzY3JvbGxMZWZ0OiB0aHVtYlBvcy5sZWZ0XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0ZHVyYXRpb25cblx0XHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHR1cGRhdGU6IGZ1bmN0aW9uICgpIHtcblx0XHRcdHZhciB0aGF0ID0gdGhpcztcblx0XHRcdHRoYXQuaW5zdGFuY2UuJHJlZnMuY29udGFpbmVyLnRvZ2dsZUNsYXNzKFwiZmFuY3lib3gtc2hvdy10aHVtYnNcIiwgdGhpcy5pc1Zpc2libGUpO1xuXG5cdFx0XHRpZiAodGhhdC5pc1Zpc2libGUpIHtcblx0XHRcdFx0aWYgKCF0aGF0LiRncmlkKSB7XG5cdFx0XHRcdFx0dGhhdC5jcmVhdGUoKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoYXQuaW5zdGFuY2UudHJpZ2dlcihcIm9uVGh1bWJzU2hvd1wiKTtcblxuXHRcdFx0XHR0aGF0LmZvY3VzKDApO1xuXHRcdFx0fSBlbHNlIGlmICh0aGF0LiRncmlkKSB7XG5cdFx0XHRcdHRoYXQuaW5zdGFuY2UudHJpZ2dlcihcIm9uVGh1bWJzSGlkZVwiKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVXBkYXRlIGNvbnRlbnQgcG9zaXRpb25cblx0XHRcdHRoYXQuaW5zdGFuY2UudXBkYXRlKCk7XG5cdFx0fSxcblxuXHRcdGhpZGU6IGZ1bmN0aW9uICgpIHtcblx0XHRcdHRoaXMuaXNWaXNpYmxlID0gZmFsc2U7XG5cdFx0XHR0aGlzLnVwZGF0ZSgpO1xuXHRcdH0sXG5cblx0XHRzaG93OiBmdW5jdGlvbiAoKSB7XG5cdFx0XHR0aGlzLmlzVmlzaWJsZSA9IHRydWU7XG5cdFx0XHR0aGlzLnVwZGF0ZSgpO1xuXHRcdH0sXG5cblx0XHR0b2dnbGU6IGZ1bmN0aW9uICgpIHtcblx0XHRcdHRoaXMuaXNWaXNpYmxlID0gIXRoaXMuaXNWaXNpYmxlO1xuXHRcdFx0dGhpcy51cGRhdGUoKTtcblx0XHR9XG5cdH0pO1xuXG5cdCQoZG9jdW1lbnQpLm9uKHtcblx0XHRcIm9uSW5pdC5mYlwiOiBmdW5jdGlvbiAoZSwgaW5zdGFuY2UpIHtcblx0XHRcdHZhciBUaHVtYnM7XG5cblx0XHRcdGlmIChpbnN0YW5jZSAmJiAhaW5zdGFuY2UuVGh1bWJzKSB7XG5cdFx0XHRcdFRodW1icyA9IG5ldyBGYW5jeVRodW1icyhpbnN0YW5jZSk7XG5cblx0XHRcdFx0aWYgKFRodW1icy5pc0FjdGl2ZSAmJiBUaHVtYnMub3B0cy5hdXRvU3RhcnQgPT09IHRydWUpIHtcblx0XHRcdFx0XHRUaHVtYnMuc2hvdygpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdFwiYmVmb3JlU2hvdy5mYlwiOiBmdW5jdGlvbiAoZSwgaW5zdGFuY2UsIGl0ZW0sIGZpcnN0UnVuKSB7XG5cdFx0XHR2YXIgVGh1bWJzID0gaW5zdGFuY2UgJiYgaW5zdGFuY2UuVGh1bWJzO1xuXG5cdFx0XHRpZiAoVGh1bWJzICYmIFRodW1icy5pc1Zpc2libGUpIHtcblx0XHRcdFx0VGh1bWJzLmZvY3VzKGZpcnN0UnVuID8gMCA6IDI1MCk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdFwiYWZ0ZXJLZXlkb3duLmZiXCI6IGZ1bmN0aW9uIChlLCBpbnN0YW5jZSwgY3VycmVudCwga2V5cHJlc3MsIGtleWNvZGUpIHtcblx0XHRcdHZhciBUaHVtYnMgPSBpbnN0YW5jZSAmJiBpbnN0YW5jZS5UaHVtYnM7XG5cblx0XHRcdC8vIFwiR1wiXG5cdFx0XHRpZiAoVGh1bWJzICYmIFRodW1icy5pc0FjdGl2ZSAmJiBrZXljb2RlID09PSA3MSkge1xuXHRcdFx0XHRrZXlwcmVzcy5wcmV2ZW50RGVmYXVsdCgpO1xuXG5cdFx0XHRcdFRodW1icy50b2dnbGUoKTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0XCJiZWZvcmVDbG9zZS5mYlwiOiBmdW5jdGlvbiAoZSwgaW5zdGFuY2UpIHtcblx0XHRcdHZhciBUaHVtYnMgPSBpbnN0YW5jZSAmJiBpbnN0YW5jZS5UaHVtYnM7XG5cblx0XHRcdGlmIChUaHVtYnMgJiYgVGh1bWJzLmlzVmlzaWJsZSAmJiBUaHVtYnMub3B0cy5oaWRlT25DbG9zZSAhPT0gZmFsc2UpIHtcblx0XHRcdFx0VGh1bWJzLiRncmlkLmhpZGUoKTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xufSkoZG9jdW1lbnQsIGpRdWVyeSk7XG4vLy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vL1xuLy8gU2hhcmVcbi8vIERpc3BsYXlzIHNpbXBsZSBmb3JtIGZvciBzaGFyaW5nIGN1cnJlbnQgdXJ
6780sXG4vL1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbihmdW5jdGlvbiAoZG9jdW1lbnQsICQpIHtcblx0XCJ1c2Ugc3RyaWN0XCI7XG5cblx0JC5leHRlbmQodHJ1ZSwgJC5mYW5jeWJveC5kZWZhdWx0cywge1xuXHRcdGJ0blRwbDoge1xuXHRcdFx0c2hhcmU6ICc8YnV0dG9uIGRhdGEtZmFuY3lib3gtc2hhcmUgY2xhc3M9XCJmYW5jeWJveC1idXR0b24gZmFuY3lib3gtYnV0dG9uLS1zaGFyZVwiIHRpdGxlPVwie3tTSEFSRX19XCI+JyArXG5cdFx0XHRcdCc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+PHBhdGggZD1cIk0yLjU1IDE5YzEuNC04LjQgOS4xLTkuOCAxMS45LTkuOFY1bDcgNy03IDYuM3YtMy41Yy0yLjggMC0xMC41IDIuMS0xMS45IDQuMnpcIi8+PC9zdmc+JyArXG5cdFx0XHRcdFwiPC9idXR0b24+XCJcblx0XHR9LFxuXHRcdHNoYXJlOiB7XG5cdFx0XHR1cmw6IGZ1bmN0aW9uIChpbnN0YW5jZSwgaXRlbSkge1xuXHRcdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRcdCghaW5zdGFuY2UuY3VycmVudEhhc2ggJiYgIShpdGVtLnR5cGUgPT09IFwiaW5saW5lXCIgfHwgaXRlbS50eXBlID09PSBcImh0bWxcIikgPyBpdGVtLm9yaWdTcmMgfHwgaXRlbS5zcmMgOiBmYWxzZSkgfHwgd2luZG93LmxvY2F0aW9uXG5cdFx0XHRcdCk7XG5cdFx0XHR9LFxuXHRcdFx0dHBsOiAnPGRpdiBjbGFzcz1cImZhbmN5Ym94LXNoYXJlXCI+JyArXG5cdFx0XHRcdFwiPGgxPnt7U0hBUkV9fTwvaDE+XCIgK1xuXHRcdFx0XHRcIjxwPlwiICtcblx0XHRcdFx0JzxhIGNsYXNzPVwiZmFuY3lib3gtc2hhcmVfX2J1dHRvbiBmYW5jeWJveC1zaGFyZV9fYnV0dG9uLS1mYlwiIGhyZWY9XCJodHRwczovL3d3dy5mYWNlYm9vay5jb20vc2hhcmVyL3NoYXJlci5waHA/dT17e3VybH19XCI+JyArXG5cdFx0XHRcdCc8c3ZnIHZpZXdCb3g9XCIwIDAgNTEyIDUxMlwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48cGF0aCBkPVwibTI4NyA0NTZ2LTI5OWMwLTIxIDYtMzUgMzUtMzVoMzh2LTYzYy03LTEtMjktMy01NS0zLTU0IDAtOTEgMzMtOTEgOTR2MzA2bTE0My0yNTRoLTIwNXY3MmgxOTZcIiAvPjwvc3ZnPicgK1xuXHRcdFx0XHRcIjxzcGFuPkZhY2Vib29rPC9zcGFuPlwiICtcblx0XHRcdFx0XCI8L2E+XCIgK1xuXHRcdFx0XHQnPGEgY2xhc3M9XCJmYW5jeWJveC1zaGFyZV9fYnV0dG9uIGZhbmN5Ym94LXNoYXJlX19idXR0b24tLXR3XCIgaHJlZj1cImh0dHBzOi8vdHdpdHRlci5jb20vaW50ZW50L3R3ZWV0P3VybD17e3VybH19JnRleHQ9e3tkZXNjcn19XCI+JyArXG5cdFx0XHRcdCc8c3ZnIHZpZXdCb3g9XCIwIDAgNTEyIDUxMlwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48cGF0aCBkPVwibTQ1NiAxMzNjLTE0IDctMzEgMTEtNDcgMTMgMTctMTAgMzAtMjcgMzctNDYtMTUgMTAtMzQgMTYtNTIgMjAtNjEtNjItMTU3LTctMTQxIDc1LTY4LTMtMTI5LTM1LTE2OS04NS0yMiAzNy0xMSA4NiAyNiAxMDktMTMgMC0yNi00LTM3LTkgMCAzOSAyOCA3MiA2NSA4MC0xMiAzLTI1IDQtMzcgMiAxMCAzMyA0MSA1NyA3NyA1Ny00MiAzMC03NyAzOC0xMjIgMzQgMTcwIDExMSAzNzgtMzIgMzU5LTIwOCAxNi0xMSAzMC0yNSA0MS00MnpcIiAvPjwvc3ZnPicgK1xuXHRcdFx0XHRcIjxzcGFuPlR3aXR0ZXI8L3NwYW4+XCIgK1xuXHRcdFx0XHRcIjwvYT5cIiArXG5cdFx0XHRcdCc8YSBjbGFzcz1cImZhbmN5Ym94LXNoYXJlX19idXR0b24gZmFuY3lib3gtc2hhcmVfX2J1dHRvbi0tcHRcIiBocmVmPVwiaHR0cHM6Ly93d3cucGludGVyZXN0LmNvbS9waW4vY3JlYXRlL2J1dHRvbi8/dXJsPXt7dXJsfX0mZGVzY3JpcHRpb249e3tkZXNjcn19Jm1lZGlhPXt7bWVkaWF9fVwiPicgK1xuXHRcdFx0XHQnPHN2ZyB2aWV3Qm94PVwiMCAwIDUxMiA1MTJcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHBhdGggZD1cIm0yNjUgNTZjLTEwOSAwLTE2NCA3OC0xNjQgMTQ0IDAgMzkgMTUgNzQgNDcgODcgNSAyIDEwIDAgMTItNWw0LTE5YzItNiAxLTgtMy0xMy05LTExLTE1LTI1LTE1LTQ1IDAtNTggNDMtMTEwIDExMy0xMTAgNjIgMCA5NiAzOCA5NiA4OCAwIDY3LTMwIDEyMi03MyAxMjItMjQgMC00Mi0xOS0zNi00NCA2LTI5IDIwLTYwIDIwLTgxIDAtMTktMTAtMzUtMzEtMzUtMjUgMC00NCAyNi00NCA2MCAwIDIxIDcgMzYgNyAzNmwtMzAgMTI1Yy04IDM3LTEgODMgMCA4NyAwIDMgNCA0IDUgMiAyLTMgMzItMzkgNDItNzVsMTYtNjRjOCAxNiAzMSAyOSA1NiAyOSA3NCAwIDEyNC02NyAxMjQtMTU3IDAtNjktNTgtMTMyLTE0Ni0xMzJ6XCIgZmlsbD1cIiNmZmZcIi8+PC9zdmc+JyArXG5cdFx0XHRcdFwiPHNwYW4+UGludGVyZXN0PC9zcGFuPlwiICtcblx0XHRcdFx0XCI8L2E+XCIgK1xuXHRcdFx0XHRcIjwvcD5cIiArXG5cdFx0XHRcdCc8cD48aW5wdXQgY2xhc3M9XCJmYW5jeWJveC1zaGFyZV9faW5wdXRcIiB0eXBlPVwidGV4dFwiIHZhbHVlPVwie3t1cmxfcmF3fX1cIiBvbmNsaWNrPVwic2VsZWN0KClcIiAvPjwvcD4nICtcblx0XHRcdFx0XCI8L2Rpdj5cIlxuXHRcdH1cblx0fSk7XG5cblx0ZnVuY3Rpb24gZXNjYXBlSHRtbChzdHJpbmcpIHtcblx0XHR2YXIgZW50aXR5TWFwID0ge1xuXHRcdFx0XCImXCI6IFwiJmFtcDtcIixcblx0XHRcdFwiPFwiOiBcIiZsdDtcIixcblx0XHRcdFwiPlwiOiBcIiZndDtcIixcblx0XHRcdCdcIic6IFwiJnF1b3Q7XCIsXG5cdFx0XHRcIidcIjogXCImIzM5O1wiLFxuXHRcdFx0XCIvXCI6IFwiJiN4MkY7XCIsXG5cdFx0XHRcImBcIjogXCImI3g2MDtcIixcblx0XHRcdFwiPVwiOiBcIiYjeDNEO1wiXG5cdFx0fTtcblxuXHRcdHJldHVybiBTdHJpbmcoc3RyaW5nKS5yZXBsYWNlKC9bJjw+XCInYD1cXC9dL2csIGZ1bmN0aW9uIChzKSB7XG5cdFx0XHRyZXR1cm4gZW50aXR5TWFwW3NdO1xuXHRcdH0pO1xuXHR9XG5cblx0JChkb2N1bWVudCkub24oXCJjbGlja1wiLCBcIltkYXRhLWZhbmN5Ym94LXNoYXJlXVwiLCBmdW5jdGlvbiAoKSB7XG5cdFx0dmFyIGluc3RhbmNlID0gJC5mYW5jeWJveC5nZXRJbnN0YW5jZSgpLFxuXHRcdFx0Y3VycmVudCA9IGluc3RhbmNlLmN1cnJlbnQgfHwgbnVsbCxcblx0XHRcdHVybCxcblx0XHRcdHRwbDtcblxuXHRcdGlmICghY3VycmVudCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICgkLnR5cGUoY3VycmVudC5vcHRzLnNoYXJlLnVybCkgPT09IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0dXJsID0gY3VycmVudC5vcHRzLnNoYXJlLnVybC5hcHBseShjdXJyZW50LCBbaW5zdGFuY2UsIGN1cnJlbnRdKTtcblx0XHR9XG5cblx0XHR0cGwgPSBjdXJyZW50Lm9wdHMuc2hhcmUudHBsXG5cdFx0XHQucmVwbGFjZSgvXFx7XFx7bWVkaWFcXH1cXH0vZywgY3VycmVudC50eXBlID09PSBcImltYWdlXCIgPyBlbmNvZGVVUklDb21wb25lbnQoY3VycmVudC5zcmMpIDogXCJcIilcblx0XHRcdC5yZXBsYWNlKC9cXHtcXHt1cmxcXH1cXH0vZywgZW5jb2RlVVJJQ29tcG9uZW50KHVybCkpXG5cdFx0XHQucmVwbGFjZSgvXFx7XFx7dXJsX3Jhd1xcfVxcfS9nLCBlc2NhcGVIdG1sKHVybCkpXG5cdFx0XHQucmVwbGFjZSgvXFx7XFx7ZGVzY3JcXH1cXH0vZywgaW5zdGFuY2UuJGNhcHRpb24gPyBlbmNvZGVVUklDb21wb25lbnQoaW5zdGFuY2UuJGNhcHRpb24udGV4dCgpKSA6IFwiXCIpO1xuXG5cdFx0JC5mYW5jeWJveC5vcGVuKHtcblx0XHRcdHNyYzogaW5zdGFuY2UudHJhbnNsYXRlKGluc3RhbmNlLCB0cGwpLFxuXHRcdFx0dHlwZTogXCJodG1sXCIsXG5cdFx0XHRvcHRzOiB7XG5cdFx0XHRcdHRvdWNoOiBmYWxzZSxcblx0XHRcdFx0YW5pbWF0aW9uRWZmZWN0OiBmYWxzZSxcblx0XHRcdFx0YWZ0ZXJMb2FkOiBmdW5jdGlvbiAoc2hhcmVJbnN0YW5jZSwgc2hhcmVDdXJyZW50KSB7XG5cdFx0XHRcdFx0Ly8gQ2xvc2Ugc2VsZiBpZiBwYXJlbnQgaW5zdGFuY2UgaXMgY2xvc2luZ1xuXHRcdFx0XHRcdGluc3RhbmNlLiRyZWZzLmNvbn
6780RhaW5lci5vbmUoXCJiZWZvcmVDbG9zZS5mYlwiLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRzaGFyZUluc3RhbmNlLmNsb3NlKG51bGwsIDApO1xuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0Ly8gT3BlbmluZyBsaW5rcyBpbiBhIHBvcHVwIHdpbmRvd1xuXHRcdFx0XHRcdHNoYXJlQ3VycmVudC4kY29udGVudC5maW5kKFwiLmZhbmN5Ym94LXNoYXJlX19idXR0b25cIikuY2xpY2soZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0d2luZG93Lm9wZW4odGhpcy5ocmVmLCBcIlNoYXJlXCIsIFwid2lkdGg9NTUwLCBoZWlnaHQ9NDUwXCIpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRtb2JpbGU6IHtcblx0XHRcdFx0XHRhdXRvRm9jdXM6IGZhbHNlXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fSk7XG59KShkb2N1bWVudCwgalF1ZXJ5KTtcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vL1xuLy8gSGFzaFxuLy8gRW5hYmxlcyBsaW5raW5nIHRvIGVhY2ggbW9kYWxcbi8vXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuKGZ1bmN0aW9uICh3aW5kb3csIGRvY3VtZW50LCAkKSB7XG5cdFwidXNlIHN0cmljdFwiO1xuXG5cdC8vIFNpbXBsZSAkLmVzY2FwZVNlbGVjdG9yIHBvbHlmaWxsIChmb3IgalF1ZXJ5IHByaW9yIHYzKVxuXHRpZiAoISQuZXNjYXBlU2VsZWN0b3IpIHtcblx0XHQkLmVzY2FwZVNlbGVjdG9yID0gZnVuY3Rpb24gKHNlbCkge1xuXHRcdFx0dmFyIHJjc3Nlc2NhcGUgPSAvKFtcXDAtXFx4MWZcXHg3Zl18Xi0/XFxkKXxeLSR8W15cXHg4MC1cXHVGRkZGXFx3LV0vZztcblx0XHRcdHZhciBmY3NzZXNjYXBlID0gZnVuY3Rpb24gKGNoLCBhc0NvZGVQb2ludCkge1xuXHRcdFx0XHRpZiAoYXNDb2RlUG9pbnQpIHtcblx0XHRcdFx0XHQvLyBVKzAwMDAgTlVMTCBiZWNvbWVzIFUrRkZGRCBSRVBMQUNFTUVOVCBDSEFSQUNURVJcblx0XHRcdFx0XHRpZiAoY2ggPT09IFwiXFwwXCIpIHtcblx0XHRcdFx0XHRcdHJldHVybiBcIlxcdUZGRkRcIjtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBDb250cm9sIGNoYXJhY3RlcnMgYW5kIChkZXBlbmRlbnQgdXBvbiBwb3NpdGlvbikgbnVtYmVycyBnZXQgZXNjYXBlZCBhcyBjb2RlIHBvaW50c1xuXHRcdFx0XHRcdHJldHVybiBjaC5zbGljZSgwLCAtMSkgKyBcIlxcXFxcIiArIGNoLmNoYXJDb2RlQXQoY2gubGVuZ3RoIC0gMSkudG9TdHJpbmcoMTYpICsgXCIgXCI7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBPdGhlciBwb3RlbnRpYWxseS1zcGVjaWFsIEFTQ0lJIGNoYXJhY3RlcnMgZ2V0IGJhY2tzbGFzaC1lc2NhcGVkXG5cdFx0XHRcdHJldHVybiBcIlxcXFxcIiArIGNoO1xuXHRcdFx0fTtcblxuXHRcdFx0cmV0dXJuIChzZWwgKyBcIlwiKS5yZXBsYWNlKHJjc3Nlc2NhcGUsIGZjc3Nlc2NhcGUpO1xuXHRcdH07XG5cdH1cblxuXHQvLyBHZXQgaW5mbyBhYm91dCBnYWxsZXJ5IG5hbWUgYW5kIGN1cnJlbnQgaW5kZXggZnJvbSB1cmxcblx0ZnVuY3Rpb24gcGFyc2VVcmwoKSB7XG5cdFx0dmFyIGhhc2ggPSB3aW5kb3cubG9jYXRpb24uaGFzaC5zdWJzdHIoMSksXG5cdFx0XHRyZXogPSBoYXNoLnNwbGl0KFwiLVwiKSxcblx0XHRcdGluZGV4ID0gcmV6Lmxlbmd0aCA+IDEgJiYgL15cXCs/XFxkKyQvLnRlc3QocmV6W3Jlei5sZW5ndGggLSAxXSkgPyBwYXJzZUludChyZXoucG9wKC0xKSwgMTApIHx8IDEgOiAxLFxuXHRcdFx0Z2FsbGVyeSA9IHJlei5qb2luKFwiLVwiKTtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRoYXNoOiBoYXNoLFxuXHRcdFx0LyogSW5kZXggaXMgc3RhcnRpbmcgZnJvbSAxICovXG5cdFx0XHRpbmRleDogaW5kZXggPCAxID8gMSA6IGluZGV4LFxuXHRcdFx0Z2FsbGVyeTogZ2FsbGVyeVxuXHRcdH07XG5cdH1cblxuXHQvLyBUcmlnZ2VyIGNsaWNrIGV2bnQgb24gbGlua3MgdG8gb3BlbiBuZXcgZmFuY3lCb3ggaW5zdGFuY2Vcblx0ZnVuY3Rpb24gdHJpZ2dlckZyb21VcmwodXJsKSB7XG5cdFx0aWYgKHVybC5nYWxsZXJ5ICE9PSBcIlwiKSB7XG5cdFx0XHQvLyBJZiB3ZSBjYW4gZmluZCBlbGVtZW50IG1hdGNoaW5nICdkYXRhLWZhbmN5Ym94JyBhdHJpYnV0ZSxcblx0XHRcdC8vIHRoZW4gdHJpZ2dlcmluZyBjbGljayBldmVudCBzaG91bGQgc3RhcnQgZmFuY3lCb3hcblx0XHRcdCQoXCJbZGF0YS1mYW5jeWJveD0nXCIgKyAkLmVzY2FwZVNlbGVjdG9yKHVybC5nYWxsZXJ5KSArIFwiJ11cIilcblx0XHRcdFx0LmVxKHVybC5pbmRleCAtIDEpXG5cdFx0XHRcdC5mb2N1cygpXG5cdFx0XHRcdC50cmlnZ2VyKFwiY2xpY2suZmItc3RhcnRcIik7XG5cdFx0fVxuXHR9XG5cblx0Ly8gR2V0IGdhbGxlcnkgbmFtZSBmcm9tIGN1cnJlbnQgaW5zdGFuY2Vcblx0ZnVuY3Rpb24gZ2V0R2FsbGVyeUlEKGluc3RhbmNlKSB7XG5cdFx0dmFyIG9wdHMsIHJldDtcblxuXHRcdGlmICghaW5zdGFuY2UpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRvcHRzID0gaW5zdGFuY2UuY3VycmVudCA/IGluc3RhbmNlLmN1cnJlbnQub3B0cyA6IGluc3RhbmNlLm9wdHM7XG5cdFx0cmV0ID0gb3B0cy5oYXNoIHx8IChvcHRzLiRvcmlnID8gb3B0cy4kb3JpZy5kYXRhKFwiZmFuY3lib3hcIikgfHwgb3B0cy4kb3JpZy5kYXRhKFwiZmFuY3lib3gtdHJpZ2dlclwiKSA6IFwiXCIpO1xuXG5cdFx0cmV0dXJuIHJldCA9PT0gXCJcIiA/IGZhbHNlIDogcmV0O1xuXHR9XG5cblx0Ly8gU3RhcnQgd2hlbiBET00gYmVjb21lcyByZWFkeVxuXHQkKGZ1bmN0aW9uICgpIHtcblx0XHQvLyBDaGVjayBpZiB1c2VyIGhhcyBkaXNhYmxlZCB0aGlzIG1vZHVsZVxuXHRcdGlmICgkLmZhbmN5Ym94LmRlZmF1bHRzLmhhc2ggPT09IGZhbHNlKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gVXBkYXRlIGhhc2ggd2hlbiBvcGVuaW5nL2Nsb3NpbmcgZmFuY3lCb3hcblx0XHQkKGRvY3VtZW50KS5vbih7XG5cdFx0XHRcIm9uSW5pdC5mYlwiOiBmdW5jdGlvbiAoZSwgaW5zdGFuY2UpIHtcblx0XHRcdFx0dmFyIHVybCwgZ2FsbGVyeTtcblxuXHRcdFx0XHRpZiAoaW5zdGFuY2UuZ3JvdXBbaW5zdGFuY2UuY3VyckluZGV4XS5vcHRzLmhhc2ggPT09IGZhbHNlKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dXJsID0gcGFyc2VVcmwoKTtcblx0XHRcdFx0Z2FsbGVyeSA9IGdldEdhbGxlcnlJRChpbnN0YW5jZSk7XG5cblx0XHRcdFx0Ly8gTWFrZSBzdXJlIGdhbGxlcnkgc3RhcnQgaW5kZXggbWF0Y2hlcyBpbmRleCBmcm9tIGhhc2hcblx0XHRcdFx0aWYgKGdhbGxlcnkgJiYgdXJsLmdhbGxlcnkgJiYgZ2FsbGVyeSA9PSB1cmwuZ2FsbGVyeSkge1xuXHRcdFx0XHRcdGluc3RhbmNlLmN1cnJJbmRleCA9IHVybC5pbmRleCAtIDE7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cblx0XHRcdFwiYmVmb3JlU2hvdy5mYlwiOiBmdW5jdGlvbiAoZSwgaW5zdGFuY2UsIGN1cnJlbnQsIGZpcnN0UnVuKSB7XG5cdFx0XHRcdHZhciBnYWxsZXJ5O1xuXG5cdFx0XHRcdGlmICghY3VycmVudCB8fCBjdXJyZW50Lm9wdHMuaGFzaCA9PT0gZmFsc2UpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBDaGVjayBpZiBuZWVkIHRvIHVwZGF0ZSB3aW5kb3cgaGFzaFxuXHRcdFx0XHRnYWxsZXJ5ID0gZ2V0R2FsbGVyeUlEKGluc3RhbmNlKTtcblxuXHRcdFx0XHRpZiAoIWdhbGxlcnkpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBWYXJpYWJsZSBjb250YWluaW5nIGxhc3QgaGFzaCB2YWx1ZSBzZXQgYnkgZmFuY3lCb3hcblx0XHRcdFx0Ly8gSXQgd2lsbCBiZSB1c2VkIHRvIGRldGVybWluZSBpZiBmYW5jeUJveCBuZWVkcyB0byBjbG9zZSBhZnRlciBoYXNoIGNoYW5nZSBpcyBkZXRlY3RlZFxuXHRcdFx0XHRpbnN0YW5jZS5jdXJyZW50SGFzaCA9IGdhbGxlcnkgKyAoaW5zdGFuY2UuZ3JvdXAubGVuZ3RoID4gMSA/IFwiLVwiICsgKGN1cnJlbnQuaW5kZXggKyAxKSA6IFwiXCIpO1xuXG5cdFx0XHRcdC8vIElmIGN1cnJlbnQgaGFzaCBpcyB0aGUgc2FtZSAodGhpcyBpbnN0YW5jZSBtb3N0IGxpa2VseSBpcyBvcGVuZWQgYnkgaGFzaGNoYW5nZSksIHRoZW4gZG8gbm90aGluZ1xuXHRcdFx0XHRpZiAod2luZG93LmxvY2F0aW9uLmhhc2ggPT09IFwiI1wiICsgaW5zdGFuY2UuY3VycmVudEhhc2gpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoZmlyc3RSdW4gJiYgIWluc3RhbmNlLm9yaWdIYXNoKSB7XG5cdFx0XHRcdFx0aW5zdGFuY2Uub3JpZ0hhc2ggPSB3aW5kb3cubG9jYXRpb24uaGFzaDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChpbnN0YW5jZS5oYXNoVGltZXIpIHtcblx0XHRcdFx0XHRjbGVhclRpbWVvdXQoaW5zdGFuY2UuaGFzaFRpbWVyKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFVwZGF0ZSBoYXNoXG5cdFx0XHRcdGluc3RhbmNlLmhhc2hUaW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdGlmIChcInJlcGxhY2VTdGF0ZVwiIGluIHdpbmRvdy5oaXN0b3J5KSB7XG5cdFx0XHRcdFx0XHR3aW5kb3cuaGlzdG9yeVtmaXJzdFJ1biA/IFwicHVzaFN0YXRlXCIgOiBcInJlcGxhY2VTdGF0ZVwiXSh7fSxcblx0XHRcdFx0XHRcdFx0ZG9jdW1lbnQudGl0bGUsXG5cdFx0XHRcdFx0XHRcdHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSArIHdpbmRvdy5sb2NhdGlvbi5zZWFyY2ggKyBcIiNcIiArIGluc3RhbmNlLmN1cnJlbnRIYXNoXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRpZiAoZmlyc3RSdW4pIHtcblx0XHRcdFx0XHRcdFx0aW5zdGFuY2UuaGFzQ3JlYXRlZEhpc3RvcnkgPSB0cnVlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHR3aW5kb3cubG9jYXRpb24uaGFzaCA9IGluc3RhbmNlLmN1cnJlbnRIYXNoO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGluc3RhbmNlLmhhc2hUaW1lciA9IG51bGw7XG5cdFx0XHRcdH0sIDMwMCk7XG5cdFx0XHR9LFxuXG5cdFx0XHRcImJlZm9yZUNsb3NlLmZiXCI6IGZ1bmN0aW9uIChlLCBpbnN0YW5jZSwgY3VycmVudCkge1xuXHRcdFx0XHRpZiAoIWN1cnJlbnQgfHwgY3VycmVudC5vcHRzLmhhc2ggPT09IGZhbHNlKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y2xlYXJUaW1lb3V0KGluc3RhbmNlLmhhc2hUaW1lcik7XG5cblx0XHRcdFx0Ly8gR290byBwcmV2aW91cyBoaXN0b3J5IGVudHJ5XG5cdFx0XHRcdGlmIChpbnN0YW5jZS5jdXJyZW50SGFzaCAmJiBpbnN0YW5jZS5oYXNDcmVhdGVkSGlzdG9yeSkge1xuXHRcdFx0XHRcdHdpbmRvdy5oaXN0b3J5LmJhY2soKTtcblx0XHRcdFx0fSBlbHNlIGlmIChpbnN0YW5jZS5jdXJyZW50SGFzaCkge1xuXHRcdFx0XHRcdGlmIChcInJlcGxhY2VTdGF0ZVwiIGluIHdpbmRvdy5oaXN0b3J5KSB7XG5cdFx0XHRcdFx0XHR3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUoe30sIGRvY3VtZW50LnRpdGxlLCB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUgKyB3aW5kb3cubG9jYXRpb24uc2VhcmNoICsgKGluc3RhbmNlLm9yaWdIYXNoIHx8IFwiXCIpKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0d2luZG93LmxvY2F0aW9uLmhhc2ggPSBpbnN0YW5jZS5vcmlnSGFzaDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpbnN0YW5jZS5jdXJyZW50SGFzaCA9IG51bGw7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHQvLyBDaGVjayBpZiBuZWVkIHRvIHN0YXJ0L2Nsb3NlIGFmdGVyIHVybCBoYXMgY2hhbmdlZFxuXHRcdCQod2luZG93KS5vbihcImhhc2hjaGFuZ2UuZmJcIiwgZnVuY3Rpb24gKCkge1xuXHRcdFx0dmFyIHVybCA9IHBhcnNlVXJsKCksXG5cdFx0XHRcdGZiID0gbnVsbDtcblxuXHRcdFx0Ly8gRmluZCBsYXN0IGZhbmN5Qm94IGluc3RhbmNlIHRoYXQgaGFzIFwiaGFzaFwiXG5cdFx0XHQkLmVhY2goXG5cdFx0XHRcdCQoXCIuZmFuY3lib3gtY29udGFpbmVyXCIpXG5cdFx0XHRcdFx0LmdldCgpXG5cdFx0XHRcdFx0LnJldmVyc2UoKSxcblx0XHRcdFx0ZnVuY3Rpb24gKGluZGV4LCB2YWx1ZSkge1xuXHRcdFx0XHRcdHZhciB0bXAgPSAkKHZhbHVlKS5kYXRhKFwiRmFuY3lCb3hcIik7XG5cblx0XHRcdFx0XHRpZiAodG1wICYmIHRtcC5jdXJyZW50SGFzaCkge1xuXHRcdFx0XHRcdFx0ZmIgPSB0bXA7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHQpO1xuXG5cdFx0XHRpZiAoZmIpIHtcblx0XHRcdFx0Ly8gTm93LCBjb21wYXJlIGhhc2ggdmFsdWVzXG5cdFx0XHRcdGlmIChmYi5jdXJyZW50SGFzaCAhPT0gdXJsLmdhbGxlcnkgKyBcIi1cIiArIHVybC5pbmRleCAmJiAhKHVybC5pbmRleCA9PT0gMSAmJi
6780BmYi5jdXJyZW50SGFzaCA9PSB1cmwuZ2FsbGVyeSkpIHtcblx0XHRcdFx0XHRmYi5jdXJyZW50SGFzaCA9IG51bGw7XG5cblx0XHRcdFx0XHRmYi5jbG9zZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKHVybC5nYWxsZXJ5ICE9PSBcIlwiKSB7XG5cdFx0XHRcdHRyaWdnZXJGcm9tVXJsKHVybCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHQvLyBDaGVjayBjdXJyZW50IGhhc2ggYW5kIHRyaWdnZXIgY2xpY2sgZXZlbnQgb24gbWF0Y2hpbmcgZWxlbWVudCB0byBzdGFydCBmYW5jeUJveCwgaWYgbmVlZGVkXG5cdFx0c2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0XHRpZiAoISQuZmFuY3lib3guZ2V0SW5zdGFuY2UoKSkge1xuXHRcdFx0XHR0cmlnZ2VyRnJvbVVybChwYXJzZVVybCgpKTtcblx0XHRcdH1cblx0XHR9LCA1MCk7XG5cdH0pO1xufSkod2luZG93LCBkb2N1bWVudCwgalF1ZXJ5KTtcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vL1xuLy8gV2hlZWxcbi8vIEJhc2ljIG1vdXNlIHdlaGVlbCBzdXBwb3J0IGZvciBnYWxsZXJ5IG5hdmlnYXRpb25cbi8vXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuKGZ1bmN0aW9uIChkb2N1bWVudCwgJCkge1xuXHRcInVzZSBzdHJpY3RcIjtcblxuXHR2YXIgcHJldlRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcblxuXHQkKGRvY3VtZW50KS5vbih7XG5cdFx0XCJvbkluaXQuZmJcIjogZnVuY3Rpb24gKGUsIGluc3RhbmNlLCBjdXJyZW50KSB7XG5cdFx0XHRpbnN0YW5jZS4kcmVmcy5zdGFnZS5vbihcIm1vdXNld2hlZWwgRE9NTW91c2VTY3JvbGwgd2hlZWwgTW96TW91c2VQaXhlbFNjcm9sbFwiLCBmdW5jdGlvbiAoZSkge1xuXHRcdFx0XHR2YXIgY3VycmVudCA9IGluc3RhbmNlLmN1cnJlbnQsXG5cdFx0XHRcdFx0Y3VyclRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcblxuXHRcdFx0XHRpZiAoaW5zdGFuY2UuZ3JvdXAubGVuZ3RoIDwgMiB8fCBjdXJyZW50Lm9wdHMud2hlZWwgPT09IGZhbHNlIHx8IChjdXJyZW50Lm9wdHMud2hlZWwgPT09IFwiYXV0b1wiICYmIGN1cnJlbnQudHlwZSAhPT0gXCJpbWFnZVwiKSkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0ZS5zdG9wUHJvcGFnYXRpb24oKTtcblxuXHRcdFx0XHRpZiAoY3VycmVudC4kc2xpZGUuaGFzQ2xhc3MoXCJmYW5jeWJveC1hbmltYXRlZFwiKSkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGUgPSBlLm9yaWdpbmFsRXZlbnQgfHwgZTtcblxuXHRcdFx0XHRpZiAoY3VyclRpbWUgLSBwcmV2VGltZSA8IDI1MCkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHByZXZUaW1lID0gY3VyclRpbWU7XG5cblx0XHRcdFx0aW5zdGFuY2VbKC1lLmRlbHRhWSB8fCAtZS5kZWx0YVggfHwgZS53aGVlbERlbHRhIHx8IC1lLmRldGFpbCkgPCAwID8gXCJuZXh0XCIgOiBcInByZXZpb3VzXCJdKCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH0pO1xufSkoZG9jdW1lbnQsIGpRdWVyeSk7XG4iLCIvLyBHZW5lcmF0ZWQgYnkgQ29mZmVlU2NyaXB0IDEuMTIuNFxuXG4vKiogQHByZXNlcnZlIE92ZXJsYXBwaW5nTWFya2VyU3BpZGVyZmllclxuaHR0cHM6Ly9naXRodWIuY29tL2phd2ovT3ZlcmxhcHBpbmdNYXJrZXJTcGlkZXJmaWVyXG5Db3B5cmlnaHQgKGMpIDIwMTEgLSAyMDEzIEdlb3JnZSBNYWNLZXJyb25cblJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5jZTogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlXG5Ob3RlOiBUaGUgR29vZ2xlIE1hcHMgQVBJIHYzIG11c3QgYmUgaW5jbHVkZWQgKmJlZm9yZSogdGhpcyBjb2RlXG4gKi9cblxuKGZ1bmN0aW9uKCkge1xuICB2YXIgcmVmLFxuICAgIGhhc1Byb3AgPSB7fS5oYXNPd25Qcm9wZXJ0eSxcbiAgICBzbGljZSA9IFtdLnNsaWNlO1xuXG4gIGlmICgoKHJlZiA9IHRoaXNbJ2dvb2dsZSddKSAhPSBudWxsID8gcmVmWydtYXBzJ10gOiB2b2lkIDApID09IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0aGlzWydPdmVybGFwcGluZ01hcmtlclNwaWRlcmZpZXInXSA9IChmdW5jdGlvbigpIHtcbiAgICB2YXIgZ2UsIGdtLCBqLCBsY0gsIGxjVSwgbGVuLCBtdCwgcCwgcmVmMSwgdHdvUGksIHg7XG5cbiAgICBwID0gX0NsYXNzLnByb3RvdHlwZTtcblxuICAgIHJlZjEgPSBbX0NsYXNzLCBwXTtcbiAgICBmb3IgKGogPSAwLCBsZW4gPSByZWYxLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7XG4gICAgICB4ID0gcmVmMVtqXTtcbiAgICAgIHhbJ1ZFUlNJT04nXSA9ICcwLjMuMyc7XG4gICAgfVxuXG4gICAgZ20gPSBnb29nbGUubWFwcztcblxuICAgIGdlID0gZ20uZXZlbnQ7XG5cbiAgICBtdCA9IGdtLk1hcFR5cGVJZDtcblxuICAgIHR3b1BpID0gTWF0aC5QSSAqIDI7XG5cbiAgICBwWydrZWVwU3BpZGVyZmllZCddID0gZmFsc2U7XG5cbiAgICBwWydtYXJrZXJzV29udEhpZGUnXSA9IGZhbHNlO1xuXG4gICAgcFsnbWFya2Vyc1dvbnRNb3ZlJ10gPSBmYWxzZTtcblxuICAgIHBbJ25lYXJieURpc3RhbmNlJ10gPSAyMDtcblxuICAgIHBbJ2NpcmNsZVNwaXJhbFN3aXRjaG92ZXInXSA9IDk7XG5cbiAgICBwWydjaXJjbGVGb290U2VwYXJhdGlvbiddID0gMjM7XG5cbiAgICBwWydjaXJjbGVTdGFydEFuZ2xlJ10gPSB0d29QaSAvIDEyO1xuXG4gICAgcFsnc3BpcmFsRm9vdFNlcGFyYXRpb24nXSA9IDI2O1xuXG4gICAgcFsnc3BpcmFsTGVuZ3RoU3RhcnQnXSA9IDExO1xuXG4gICAgcFsnc3BpcmFsTGVuZ3RoRmFjdG9yJ10gPSA0O1xuXG4gICAgcFsnc3BpZGVyZmllZFpJbmRleCddID0gMTAwMDtcblxuICAgIHBbJ3VzdWFsTGVnWkluZGV4J10gPSAxMDtcblxuICAgIHBbJ2hpZ2hsaWdodGVkTGVnWkluZGV4J10gPSAyMDtcblxuICAgIHBbJ2xlZ1dlaWdodCddID0gMS41O1xuXG4gICAgcFsnbGVnQ29sb3JzJ10gPSB7XG4gICAgICAndXN1YWwnOiB7fSxcbiAgICAgICdoaWdobGlnaHRlZCc6IHt9XG4gICAgfTtcblxuICAgIGxjVSA9IHBbJ2xlZ0NvbG9ycyddWyd1c3VhbCddO1xuXG4gICAgbGNIID0gcFsnbGVnQ29sb3JzJ11bJ2hpZ2hsaWdodGVkJ107XG5cbiAgICBsY1VbbXQuSFlCUklEXSA9IGxjVVttdC5TQVRFTExJVEVdID0gJyNmZmYnO1xuXG4gICAgbGNIW210LkhZQlJJRF0gPSBsY0hbbXQuU0FURUxMSVRFXSA9ICcjZjAwJztcblxuICAgIGxjVVttdC5URVJSQUlOXSA9IGxjVVttdC5ST0FETUFQXSA9ICcjNDQ0JztcblxuICAgIGxjSFttdC5URVJSQUlOXSA9IGxjSFttdC5ST0FETUFQXSA9ICcjZjAwJztcblxuICAgIGZ1bmN0aW9uIF9DbGFzcyhtYXAxLCBvcHRzKSB7XG4gICAgICB2Y
6780XIgZSwgaywgbCwgbGVuMSwgcmVmMiwgdjtcbiAgICAgIHRoaXMubWFwID0gbWFwMTtcbiAgICAgIGlmIChvcHRzID09IG51bGwpIHtcbiAgICAgICAgb3B0cyA9IHt9O1xuICAgICAgfVxuICAgICAgZm9yIChrIGluIG9wdHMpIHtcbiAgICAgICAgaWYgKCFoYXNQcm9wLmNhbGwob3B0cywgaykpIGNvbnRpbnVlO1xuICAgICAgICB2ID0gb3B0c1trXTtcbiAgICAgICAgdGhpc1trXSA9IHY7XG4gICAgICB9XG4gICAgICB0aGlzLnByb2pIZWxwZXIgPSBuZXcgdGhpcy5jb25zdHJ1Y3Rvci5Qcm9qSGVscGVyKHRoaXMubWFwKTtcbiAgICAgIHRoaXMuaW5pdE1hcmtlckFycmF5cygpO1xuICAgICAgdGhpcy5saXN0ZW5lcnMgPSB7fTtcbiAgICAgIHJlZjIgPSBbJ2NsaWNrJywgJ3pvb21fY2hhbmdlZCcsICdtYXB0eXBlaWRfY2hhbmdlZCddO1xuICAgICAgZm9yIChsID0gMCwgbGVuMSA9IHJlZjIubGVuZ3RoOyBsIDwgbGVuMTsgbCsrKSB7XG4gICAgICAgIGUgPSByZWYyW2xdO1xuICAgICAgICBnZS5hZGRMaXN0ZW5lcih0aGlzLm1hcCwgZSwgKGZ1bmN0aW9uKF90aGlzKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzWyd1bnNwaWRlcmZ5J10oKTtcbiAgICAgICAgICB9O1xuICAgICAgICB9KSh0aGlzKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcC5pbml0TWFya2VyQXJyYXlzID0gZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLm1hcmtlcnMgPSBbXTtcbiAgICAgIHJldHVybiB0aGlzLm1hcmtlckxpc3RlbmVyUmVmcyA9IFtdO1xuICAgIH07XG5cbiAgICBwWydhZGRNYXJrZXInXSA9IGZ1bmN0aW9uKG1hcmtlcikge1xuICAgICAgdmFyIGxpc3RlbmVyUmVmcztcbiAgICAgIGlmIChtYXJrZXJbJ19vbXMnXSAhPSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgbWFya2VyWydfb21zJ10gPSB0cnVlO1xuICAgICAgbGlzdGVuZXJSZWZzID0gW1xuICAgICAgICBnZS5hZGRMaXN0ZW5lcihtYXJrZXIsICdjbGljaycsIChmdW5jdGlvbihfdGhpcykge1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzLnNwaWRlckxpc3RlbmVyKG1hcmtlciwgZXZlbnQpO1xuICAgICAgICAgIH07XG4gICAgICAgIH0pKHRoaXMpKVxuICAgICAgXTtcbiAgICAgIGlmICghdGhpc1snbWFya2Vyc1dvbnRIaWRlJ10pIHtcbiAgICAgICAgbGlzdGVuZXJSZWZzLnB1c2goZ2UuYWRkTGlzdGVuZXIobWFya2VyLCAndmlzaWJsZV9jaGFuZ2VkJywgKGZ1bmN0aW9uKF90aGlzKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzLm1hcmtlckNoYW5nZUxpc3RlbmVyKG1hcmtlciwgZmFsc2UpO1xuICAgICAgICAgIH07XG4gICAgICAgIH0pKHRoaXMpKSk7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXNbJ21hcmtlcnNXb250TW92ZSddKSB7XG4gICAgICAgIGxpc3RlbmVyUmVmcy5wdXNoKGdlLmFkZExpc3RlbmVyKG1hcmtlciwgJ3Bvc2l0aW9uX2NoYW5nZWQnLCAoZnVuY3Rpb24oX3RoaXMpIHtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMubWFya2VyQ2hhbmdlTGlzdGVuZXIobWFya2VyLCB0cnVlKTtcbiAgICAgICAgICB9O1xuICAgICAgICB9KSh0aGlzKSkpO1xuICAgICAgfVxuICAgICAgdGhpcy5tYXJrZXJMaXN0ZW5lclJlZnMucHVzaChsaXN0ZW5lclJlZnMpO1xuICAgICAgdGhpcy5tYXJrZXJzLnB1c2gobWFya2VyKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICBwLm1hcmtlckNoYW5nZUxpc3RlbmVyID0gZnVuY3Rpb24obWFya2VyLCBwb3NpdGlvbkNoYW5nZWQpIHtcbiAgICAgIGlmICgobWFya2VyWydfb21zRGF0YSddICE9IG51bGwpICYmIChwb3NpdGlvbkNoYW5nZWQgfHwgIW1hcmtlci5nZXRWaXNpYmxlKCkpICYmICEoKHRoaXMuc3BpZGVyZnlpbmcgIT0gbnVsbCkgfHwgKHRoaXMudW5zcGlkZXJmeWluZyAhPSBudWxsKSkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbJ3Vuc3BpZGVyZnknXShwb3NpdGlvbkNoYW5nZWQgPyBtYXJrZXIgOiBudWxsKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcFsnZ2V0TWFya2VycyddID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5tYXJrZXJzLnNsaWNlKDApO1xuICAgIH07XG5cbiAgICBwWydyZW1vdmVNYXJrZXInXSA9IGZ1bmN0aW9uKG1hcmtlcikge1xuICAgICAgdmFyIGksIGwsIGxlbjEsIGxpc3RlbmVyUmVmLCBsaXN0ZW5lclJlZnM7XG4gICAgICBpZiAobWFya2VyWydfb21zRGF0YSddICE9IG51bGwpIHtcbiAgICAgICAgdGhpc1sndW5zcGlkZXJmeSddKCk7XG4gICAgICB9XG4gICAgICBpID0gdGhpcy5hcnJJbmRleE9mKHRoaXMubWFya2VycywgbWFya2VyKTtcbiAgICAgIGlmIChpIDwgMCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIGxpc3RlbmVyUmVmcyA9IHRoaXMubWFya2VyTGlzdGVuZXJSZWZzLnNwbGljZShpLCAxKVswXTtcbiAgICAgIGZvciAobCA9IDAsIGxlbjEgPSBsaXN0ZW5lclJlZnMubGVuZ3RoOyBsIDwgbGVuMTsgbCsrKSB7XG4gICAgICAgIGxpc3RlbmVyUmVmID0gbGlzdGVuZXJSZWZzW2xdO1xuICAgICAgICBnZS5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lclJlZik7XG4gICAgICB9XG4gICAgICBkZWxldGUgbWFya2VyWydfb21zJ107XG4gICAgICB0aGlzLm1hcmtlcnMuc3BsaWNlKGksIDEpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIHBbJ2NsZWFyTWFya2VycyddID0gZnVuY3Rpb24oKSB7XG4gICAgICB2Y
6780XIgaSwgbCwgbGVuMSwgbGVuMiwgbGlzdGVuZXJSZWYsIGxpc3RlbmVyUmVmcywgbWFya2VyLCBuLCByZWYyO1xuICAgICAgdGhpc1sndW5zcGlkZXJmeSddKCk7XG4gICAgICByZWYyID0gdGhpcy5tYXJrZXJzO1xuICAgICAgZm9yIChpID0gbCA9IDAsIGxlbjEgPSByZWYyLmxlbmd0aDsgbCA8IGxlbjE7IGkgPSArK2wpIHtcbiAgICAgICAgbWFya2VyID0gcmVmMltpXTtcbiAgICAgICAgbGlzdGVuZXJSZWZzID0gdGhpcy5tYXJrZXJMaXN0ZW5lclJlZnNbaV07XG4gICAgICAgIGZvciAobiA9IDAsIGxlbjIgPSBsaXN0ZW5lclJlZnMubGVuZ3RoOyBuIDwgbGVuMjsgbisrKSB7XG4gICAgICAgICAgbGlzdGVuZXJSZWYgPSBsaXN0ZW5lclJlZnNbbl07XG4gICAgICAgICAgZ2UucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXJSZWYpO1xuICAgICAgICB9XG4gICAgICAgIGRlbGV0ZSBtYXJrZXJbJ19vbXMnXTtcbiAgICAgIH1cbiAgICAgIHRoaXMuaW5pdE1hcmtlckFycmF5cygpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIHBbJ2FkZExpc3RlbmVyJ10gPSBmdW5jdGlvbihldmVudCwgZnVuYykge1xuICAgICAgdmFyIGJhc2U7XG4gICAgICAoKGJhc2UgPSB0aGlzLmxpc3RlbmVycylbZXZlbnRdICE9IG51bGwgPyBiYXNlW2V2ZW50XSA6IGJhc2VbZXZlbnRdID0gW10pLnB1c2goZnVuYyk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgcFsncmVtb3ZlTGlzdGVuZXInXSA9IGZ1bmN0aW9uKGV2ZW50LCBmdW5jKSB7XG4gICAgICB2Y
6780XIgaTtcbiAgICAgIGkgPSB0aGlzLmFyckluZGV4T2YodGhpcy5saXN0ZW5lcnNbZXZlbnRdLCBmdW5jKTtcbiAgICAgIGlmICghKGkgPCAwKSkge1xuICAgICAgICB0aGlzLmxpc3RlbmVyc1tldmVudF0uc3BsaWNlKGksIDEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIHBbJ2NsZWFyTGlzdGVuZXJzJ10gPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgdGhpcy5saXN0ZW5lcnNbZXZlbnRdID0gW107XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgcC50cmlnZ2VyID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgYXJncywgZXZlbnQsIGZ1bmMsIGwsIGxlbjEsIHJlZjIsIHJlZjMsIHJlc3VsdHM7XG4gICAgICBldmVudCA9IGFyZ3VtZW50c1swXSwgYXJncyA9IDIgPD0gYXJndW1lbnRzLmxlbmd0aCA/IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSA6IFtdO1xuICAgICAgcmVmMyA9IChyZWYyID0gdGhpcy5saXN0ZW5lcnNbZXZlbnRdKSAhPSBudWxsID8gcmVmMiA6IFtdO1xuICAgICAgcmVzdWx0cyA9IFtdO1xuICAgICAgZm9yIChsID0gMCwgbGVuMSA9IHJlZjMubGVuZ3RoOyBsIDwgbGVuMTsgbCsrKSB7XG4gICAgICAgIGZ1bmMgPSByZWYzW2xdO1xuICAgICAgICByZXN1bHRzLnB1c2goZnVuYy5hcHBseShudWxsLCBhcmdzKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9O1xuXG4gICAgcC5nZW5lcmF0ZVB0c0NpcmNsZSA9IGZ1bmN0aW9uKGNvdW50LCBjZW50ZXJQdCkge1xuICAgICAgdmFyIGFuZ2xlLCBhbmdsZVN0ZXAsIGNpcmN1bWZlcmVuY2UsIGksIGwsIGxlZ0xlbmd0aCwgcmVmMiwgcmVzdWx0cztcbiAgICAgIGNpcmN1bWZlcmVuY2UgPSB0aGlzWydjaXJjbGVGb290U2VwYXJhdGlvbiddICogKDIgKyBjb3VudCk7XG4gICAgICBsZWdMZW5ndGggPSBjaXJjdW1mZXJlbmNlIC8gdHdvUGk7XG4gICAgICBhbmdsZVN0ZXAgPSB0d29QaSAvIGNvdW50O1xuICAgICAgcmVzdWx0cyA9IFtdO1xuICAgICAgZm9yIChpID0gbCA9IDAsIHJlZjIgPSBjb3VudDsgMCA8PSByZWYyID8gbCA8IHJlZjIgOiBsID4gcmVmMjsgaSA9IDAgPD0gcmVmMiA/ICsrbCA6IC0tbCkge1xuICAgICAgICBhbmdsZSA9IHRoaXNbJ2NpcmNsZVN0YXJ0QW5nbGUnXSArIGkgKiBhbmdsZVN0ZXA7XG4gICAgICAgIHJlc3VsdHMucHVzaChuZXcgZ20uUG9pbnQoY2VudGVyUHQueCArIGxlZ0xlbmd0aCAqIE1hdGguY29zKGFuZ2xlKSwgY2VudGVyUHQueSArIGxlZ0xlbmd0aCAqIE1hdGguc2luKGFuZ2xlKSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfTtcblxuICAgIHAuZ2VuZXJhdGVQdHNTcGlyYWwgPSBmdW5jdGlvbihjb3VudCwgY2VudGVyUHQpIHtcbiAgICAgIHZhciBhbmdsZSwgaSwgbCwgbGVnTGVuZ3RoLCBwdCwgcmVmMiwgcmVzdWx0cztcbiAgICAgIGxlZ0xlbmd0aCA9IHRoaXNbJ3NwaXJhbExlbmd0aFN0YXJ0J107XG4gICAgICBhbmdsZSA9IDA7XG4gICAgICByZXN1bHRzID0gW107XG4gICAgICBmb3IgKGkgPSBsID0gMCwgcmVmMiA9IGNvdW50OyAwIDw9IHJlZjIgPyBsIDwgcmVmMiA6IGwgPiByZWYyOyBpID0gMCA8PSByZWYyID8gKytsIDogLS1sKSB7XG4gICAgICAgIGFuZ2xlICs9IHRoaXNbJ3NwaXJhbEZvb3RTZXBhcmF0aW9uJ10gLyBsZWdMZW5ndGggKyBpICogMC4wMDA1O1xuICAgICAgICBwdCA9IG5ldyBnbS5Qb2ludChjZW50ZXJQdC54ICsgbGVnTGVuZ3RoICogTWF0aC5jb3MoYW5nbGUpLCBjZW50ZXJQdC55ICsgbGVnTGVuZ3RoICogTWF0aC5zaW4oYW5nbGUpKTtcbiAgICAgICAgbGVnTGVuZ3RoICs9IHR3b1BpICogdGhpc1snc3BpcmFsTGVuZ3RoRmFjdG9yJ10gLyBhbmdsZTtcbiAgICAgICAgcmVzdWx0cy5wdXNoKHB0KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH07XG5cbiAgICBwLnNwaWRlckxpc3RlbmVyID0gZnVuY3Rpb24obWFya2VyLCBldmVudCkge1xuICAgICAgdmFyIGwsIGxlbjEsIG0sIG1QdCwgbWFya2VyUHQsIG1hcmtlclNwaWRlcmZpZWQsIG5EaXN0LCBuZWFyYnlNYXJrZXJEYXRhLCBub25OZWFyYnlNYXJrZXJzLCBweFNxLCByZWYyO1xuICAgICAgbWFya2VyU3BpZGVyZmllZCA9IG1hcmtlclsnX29tc0RhdGEnXSAhPSBudWxsO1xuICAgICAgaWYgKCEobWFya2VyU3BpZGVyZmllZCAmJiB0aGlzWydrZWVwU3BpZGVyZmllZCddKSkge1xuICAgICAgICB0aGlzWyd1bnNwaWRlcmZ5J10oKTtcbiAgICAgIH1cbiAgICAgIGlmIChtYXJrZXJTcGlkZXJmaWVkIHx8IHRoaXMubWFwLmdldFN0cmVldFZpZXcoKS5nZXRWaXNpYmxlKCkgfHwgdGhpcy5tYXAuZ2V0TWFwVHlwZUlkKCkgPT09ICdHb29nbGVFYXJ0aEFQSScpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJpZ2dlcignY2xpY2snLCBtYXJrZXIsIGV2ZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5lYXJieU1hcmtlckRhdGEgPSBbXTtcbiAgICAgICAgbm9uTmVhcmJ5TWFya2VycyA9IFtdO1xuICAgICAgICBuRGlzdCA9IHRoaXNbJ25lYXJieURpc3RhbmNlJ107XG4gICAgICAgIHB4U3EgPSBuRGlzdCAqIG5EaXN0O1xuICAgICAgICBtYXJrZXJQdCA9IHRoaXMubGxUb1B0KG1hcmtlci5wb3NpdGlvbik7XG4gICAgICAgIHJlZjIgPSB0aGlzLm1hcmtlcnM7XG4gICAgICAgIGZvciAobCA9IDAsIGxlbjEgPSByZWYyLmxlbmd0aDsgbCA8IGxlbjE7IGwrKykge1xuICAgICAgICAgIG0gPSByZWYyW2xdO1xuICAgICAgICAgIGlmICghKChtLm1hcCAhPSBudWxsKSAmJiBtLmdldFZpc2libGUoKSkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBtUHQgPSB0aGlzLmxsVG9QdChtLnBvc2l0aW9uKTtcbiAgICAgICAgICBpZiAodGhpcy5wdERpc3RhbmNlU3EobVB0LCBtYXJrZXJQdCkgPCBweFNxKSB7XG4gICAgICAgICAgICBuZWFyYnlNYXJrZXJEYXRhLnB1c2goe1xuICAgICAgICAgICAgICBtYXJrZXI6IG0sXG4gICAgICAgICAgICAgIG1hcmtlclB0OiBtUHRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBub25OZWFyYnlNYXJrZXJzLnB1c2gobSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChuZWFyYnlNYXJrZXJEYXRhLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgI
6780HJldHVybiB0aGlzLnRyaWdnZXIoJ2NsaWNrJywgbWFya2VyLCBldmVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc3BpZGVyZnkobmVhcmJ5TWFya2VyRGF0YSwgbm9uTmVhcmJ5TWFya2Vycyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcFsnbWFya2Vyc05lYXJNYXJrZXInXSA9IGZ1bmN0aW9uKG1hcmtlciwgZmlyc3RPbmx5KSB7XG4gICAgICB2YXIgbCwgbGVuMSwgbSwgbVB0LCBtYXJrZXJQdCwgbWFya2VycywgbkRpc3QsIHB4U3EsIHJlZjIsIHJlZjMsIHJlZjQ7XG4gICAgICBpZiAoZmlyc3RPbmx5ID09IG51bGwpIHtcbiAgICAgICAgZmlyc3RPbmx5ID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5wcm9qSGVscGVyLmdldFByb2plY3Rpb24oKSA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IFwiTXVzdCB3YWl0IGZvciAnaWRsZScgZXZlbnQgb24gbWFwIGJlZm9yZSBjYWxsaW5nIG1hcmtlcnNOZWFyTWFya2VyXCI7XG4gICAgICB9XG4gICAgICBuRGlzdCA9IHRoaXNbJ25lYXJieURpc3RhbmNlJ107XG4gICAgICBweFNxID0gbkRpc3QgKiBuRGlzdDtcbiAgICAgIG1hcmtlclB0ID0gdGhpcy5sbFRvUHQobWFya2VyLnBvc2l0aW9uKTtcbiAgICAgIG1hcmtlcnMgPSBbXTtcbiAgICAgIHJlZjIgPSB0aGlzLm1hcmtlcnM7XG4gICAgICBmb3IgKGwgPSAwLCBsZW4xID0gcmVmMi5sZW5ndGg7IGwgPCBsZW4xOyBsKyspIHtcbiAgICAgICAgbSA9IHJlZjJbbF07XG4gICAgICAgIGlmIChtID09PSBtYXJrZXIgfHwgKG0ubWFwID09IG51bGwpIHx8ICFtLmdldFZpc2libGUoKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIG1QdCA9IHRoaXMubGxUb1B0KChyZWYzID0gKHJlZjQgPSBtWydfb21zRGF0YSddKSAhPSBudWxsID8gcmVmNC51c3VhbFBvc2l0aW9uIDogdm9pZCAwKSAhPSBudWxsID8gcmVmMyA6IG0ucG9zaXRpb24pO1xuICAgICAgICBpZiAodGhpcy5wdERpc3RhbmNlU3EobVB0LCBtYXJrZXJQdCkgPCBweFNxKSB7XG4gICAgICAgICAgbWFya2Vycy5wdXNoKG0pO1xuICAgICAgICAgIGlmIChmaXJzdE9ubHkpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG1hcmtlcnM7XG4gICAgfTtcblxuICAgIHBbJ21hcmtlcnNOZWFyQW55T3RoZXJNYXJrZXInXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGksIGkxLCBpMiwgbCwgbGVuMSwgbGVuMiwgbGVuMywgbSwgbTEsIG0xRGF0YSwgbTIsIG0yRGF0YSwgbURhdGEsIG4sIG5EaXN0LCBweFNxLCBxLCByZWYyLCByZWYzLCByZWY0LCByZXN1bHRzO1xuICAgICAgaWYgKHRoaXMucHJvakhlbHBlci5nZXRQcm9qZWN0aW9uKCkgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBcIk11c3Qgd2FpdCBmb3IgJ2lkbGUnIGV2ZW50IG9uIG1hcCBiZWZvcmUgY2FsbGluZyBtYXJrZXJzTmVhckFueU90aGVyTWFya2VyXCI7XG4gICAgICB9XG4gICAgICBuRGlzdCA9IHRoaXNbJ25lYXJieURpc3RhbmNlJ107XG4gICAgICBweFNxID0gbkRpc3QgKiBuRGlzdDtcbiAgICAgIG1EYXRhID0gKGZ1bmN0aW9uKCkge1xuICAgICAgICB2Y
6780XIgbCwgbGVuMSwgcmVmMiwgcmVmMywgcmVmNCwgcmVzdWx0cztcbiAgICAgICAgcmVmMiA9IHRoaXMubWFya2VycztcbiAgICAgICAgcmVzdWx0cyA9IFtdO1xuICAgICAgICBmb3IgKGwgPSAwLCBsZW4xID0gcmVmMi5sZW5ndGg7IGwgPCBsZW4xOyBsKyspIHtcbiAgICAgICAgICBtID0gcmVmMltsXTtcbiAgICAgICAgICByZXN1bHRzLnB1c2goe1xuICAgICAgICAgICAgcHQ6IHRoaXMubGxUb1B0KChyZWYzID0gKHJlZjQgPSBtWydfb21zRGF0YSddKSAhPSBudWxsID8gcmVmNC51c3VhbFBvc2l0aW9uIDogdm9pZCAwKSAhPSBudWxsID8gcmVmMyA6IG0ucG9zaXRpb24pLFxuICAgICAgICAgICAgd2lsbFNwaWRlcmZ5OiBmYWxzZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgICAgfSkuY2FsbCh0aGlzKTtcbiAgICAgIHJlZjIgPSB0aGlzLm1hcmtlcnM7XG4gICAgICBmb3IgKGkxID0gbCA9IDAsIGxlbjEgPSByZWYyLmxlbmd0aDsgbCA8IGxlbjE7IGkxID0gKytsKSB7XG4gICAgICAgIG0xID0gcmVmMltpMV07XG4gICAgICAgIGlmICghKChtMS5tYXAgIT0gbnVsbCkgJiYgbTEuZ2V0VmlzaWJsZSgpKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIG0xRGF0YSA9IG1EYXRhW2kxXTtcbiAgICAgICAgaWYgKG0xRGF0YS53aWxsU3BpZGVyZnkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICByZWYzID0gdGhpcy5tYXJrZXJzO1xuICAgICAgICBmb3IgKGkyID0gbiA9IDAsIGxlbjIgPSByZWYzLmxlbmd0aDsgbiA8IGxlbjI7IGkyID0gKytuKSB7XG4gICAgICAgICAgbTIgPSByZWYzW2kyXTtcbiAgICAgICAgICBpZiAoaTIgPT09IGkxKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCEoKG0yLm1hcCAhPSBudWxsKSAmJiBtMi5nZXRWaXNpYmxlKCkpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbTJEYXRhID0gbURhdGFbaTJdO1xuICAgICAgICAgIGlmIChpMiA8IGkxICYmICFtMkRhdGEud2lsbFNwaWRlcmZ5KSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRoaXMucHREaXN0YW5jZVNxKG0xRGF0YS5wdCwgbTJEYXRhLnB0KSA8IHB4U3EpIHtcbiAgICAgICAgICAgIG0xRGF0YS53aWxsU3BpZGVyZnkgPSBtMkRhdGEud2lsbFNwaWRlcmZ5ID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmVmNCA9IHRoaXMubWFya2VycztcbiAgICAgIHJlc3VsdHMgPSBbXTtcbiAgICAgIGZvciAoaSA9IHEgPSAwLCBsZW4zID0gcmVmNC5sZW5ndGg7IHEgPCBsZW4zOyBpID0gKytxKSB7XG4gICAgICAgIG0gPSByZWY0W2ldO1xuICAgICAgICBpZiAobURhdGFbaV0ud2lsbFNwaWRlcmZ5KSB7XG4gICAgICAgICAgcmVzdWx0cy5wdXNoKG0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9O1xuXG4gICAgcC5tYWtlSGlnaGxpZ2h0TGlzdGVuZXJGdW5jcyA9IGZ1bmN0aW9uKG1hcmtlcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaGlnaGxpZ2h0OiAoZnVuY3Rpb24oX3RoaXMpIHtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gbWFya2VyWydfb21zRGF0YSddLmxlZy5zZXRPcHRpb25zKHtcbiAgICAgICAgICAgICAgc3Ryb2tlQ29sb3I6IF90aGlzWydsZWdDb2xvcnMnXVsnaGlnaGxpZ2h0ZWQnXVtfdGhpcy5tYXAubWFwVHlwZUlkXSxcbiAgICAgICAgICAgICAgekluZGV4OiBfdGhpc1snaGlnaGxpZ2h0ZWRMZWdaSW5kZXgnXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSkodGhpcyksXG4gICAgICAgIHVuaGlnaGxpZ2h0OiAoZnVuY3Rpb24oX3RoaXMpIHtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gbWFya2VyWydfb21zRGF0YSddLmxlZy5zZXRPcHRpb25zKHtcbiAgICAgICAgICAgICAgc3Ryb2tlQ29sb3I6IF90aGlzWydsZWdDb2xvcnMnXVsndXN1YWwnXVtfdGhpcy5tYXAubWFwVHlwZUlkXSxcbiAgICAgICAgICAgICAgekluZGV4OiBfdGhpc1sndXN1YWxMZWdaSW5kZXgnXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSkodGhpcylcbiAgICAgIH07XG4gICAgfTtcblxuICAgIHAuc3BpZGVyZnkgPSBmdW5jdGlvbihtYXJrZXJEYXRhLCBub25OZWFyYnlNYXJrZXJzKSB7XG4gICAgICB2Y
6780XIgYm9keVB0LCBmb290TGwsIGZvb3RQdCwgZm9vdFB0cywgaGlnaGxpZ2h0TGlzdGVuZXJGdW5jcywgbGVnLCBtYXJrZXIsIG1kLCBuZWFyZXN0TWFya2VyRGF0dW0sIG51bUZlZXQsIHNwaWRlcmZpZWRNYXJrZXJzO1xuICAgICAgdGhpcy5zcGlkZXJmeWluZyA9IHRydWU7XG4gICAgICBudW1GZWV0ID0gbWFya2VyRGF0YS5sZW5ndGg7XG4gICAgICBib2R5UHQgPSB0aGlzLnB0QXZlcmFnZSgoZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBsLCBsZW4xLCByZXN1bHRzO1xuICAgICAgICByZXN1bHRzID0gW107XG4gICAgICAgIGZvciAobCA9IDAsIGxlbjEgPSBtYXJrZXJEYXRhLmxlbmd0aDsgbCA8IGxlbjE7IGwrKykge1xuICAgICAgICAgIG1kID0gbWFya2VyRGF0YVtsXTtcbiAgICAgICAgICByZXN1bHRzLnB1c2gobWQubWFya2VyUHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgICAgfSkoKSk7XG4gICAgICBmb290UHRzID0gbnVtRmVldCA+PSB0aGlzWydjaXJjbGVTcGlyYWxTd2l0Y2hvdmVyJ10gPyB0aGlzLmdlbmVyYXRlUHRzU3BpcmFsKG51bUZlZXQsIGJvZHlQdCkucmV2ZXJzZSgpIDogdGhpcy5nZW5lcmF0ZVB0c0NpcmNsZShudW1GZWV0LCBib2R5UHQpO1xuICAgICAgc3BpZGVyZmllZE1hcmtlcnMgPSAoZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBsLCBsZW4xLCByZXN1bHRzO1xuICAgICAgICByZXN1bHRzID0gW107XG4gICAgICAgIGZvciAobCA9IDAsIGxlbjEgPSBmb290UHRzLmxlbmd0aDsgbCA8IGxlbjE7IGwrKykge1xuICAgICAgICAgIGZvb3RQdCA9IGZvb3RQdHNbbF07XG4gICAgICAgICAgZm9vdExsID0gdGhpcy5wdFRvTGwoZm9vdFB0KTtcbiAgICAgICAgICBuZWFyZXN0TWFya2VyRGF0dW0gPSB0aGlzLm1pbkV4dHJhY3QobWFya2VyRGF0YSwgKGZ1bmN0aW9uKF90aGlzKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24obWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLnB0RGlzdGFuY2VTcShtZC5tYXJrZXJQdCwgZm9vdFB0KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSkodGhpcykpO1xuICAgICAgICAgIG1hcmtlciA9IG5lYXJlc3RNYXJrZXJEYXR1bS5tYXJrZXI7XG4gICAgICAgICAgbGVnID0gbmV3IGdtLlBvbHlsaW5lKHtcbiAgICAgICAgICAgIG1hcDogdGhpcy5tYXAsXG4gICAgICAgICAgICBwYXRoOiBbbWFya2VyLnBvc2l0aW9uLCBmb290TGxdLFxuICAgICAgICAgICAgc3Ryb2tlQ29sb3I6IHRoaXNbJ2xlZ0NvbG9ycyddWyd1c3VhbCddW3RoaXMubWFwLm1hcFR5cGVJZF0sXG4gICAgICAgICAgICBzdHJva2VXZWlnaHQ6IHRoaXNbJ2xlZ1dlaWdodCddLFxuICAgICAgICAgICAgekluZGV4OiB0aGlzWyd1c3VhbExlZ1pJbmRleCddXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgbWFya2VyWydfb21zRGF0YSddID0ge1xuICAgICAgICAgICAgdXN1YWxQb3NpdGlvbjogbWFya2VyLnBvc2l0aW9uLFxuICAgICAgICAgICAgbGVnOiBsZWdcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmICh0aGlzWydsZWdDb2xvcnMnXVsnaGlnaGxpZ2h0ZWQnXVt0aGlzLm1hcC5tYXBUeXBlSWRdICE9PSB0aGlzWydsZWdDb2xvcnMnXVsndXN1YWwnXVt0aGlzLm1hcC5tYXBUeXBlSWRdKSB7XG4gICAgICAgICAgICBoaWdobGlnaHRMaXN0ZW5lckZ1bmNzID0gdGhpcy5tYWtlSGlnaGxpZ2h0TGlzdGVuZXJGdW5jcyhtYXJrZXIpO1xuICAgICAgICAgICAgbWFya2VyWydfb21zRGF0YSddLmhpZ2h0bGlnaHRMaXN0ZW5lcnMgPSB7XG4gICAgICAgICAgICAgIGhpZ2hsaWdodDogZ2UuYWRkTGlzdGVuZXIobWFya2VyLCAnbW91c2VvdmVyJywgaGlnaGxpZ2h0TGlzdGVuZXJGdW5jcy5oaWdobGlnaHQpLFxuICAgICAgICAgICAgICB1bmhpZ2hsaWdodDogZ2UuYWRkTGlzdGVuZXIobWFya2VyLCAnbW91c2VvdXQnLCBoaWdobGlnaHRMaXN0ZW5lckZ1bmNzLnVuaGlnaGxpZ2h0KVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbWFya2VyLnNldFBvc2l0aW9uKGZvb3RMbCk7XG4gICAgICAgICAgbWFya2VyLnNldFpJbmRleChNYXRoLnJvdW5kKHRoaXNbJ3NwaWRlcmZpZWRaSW5kZXgnXSArIGZvb3RQdC55KSk7XG4gICAgICAgICAgcmVzdWx0cy5wdXNoKG1hcmtlcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgICB9KS5jYWxsKHRoaXMpO1xuICAgICAgZGVsZXRlIHRoaXMuc3BpZGVyZnlpbmc7XG4gICAgICB0aGlzLnNwaWRlcmZpZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuIHRoaXMudHJpZ2dlcignc3BpZGVyZnknLCBzcGlkZXJmaWVkTWFya2Vycywgbm9uTmVhcmJ5TWFya2Vycyk7XG4gICAgfTtcblxuICAgIHBbJ3Vuc3BpZGVyZnknXSA9IGZ1bmN0aW9uKG1hcmtlck5vdFRvTW92ZSkge1xuICAgICAgdmFyIGwsIGxlbjEsIGxpc3RlbmVycywgbWFya2VyLCBub25OZWFyYnlNYXJrZXJzLCByZWYyLCB1bnNwaWRlcmZpZWRNYXJrZXJzO1xuICAgICAgaWYgKG1hcmtlck5vdFRvTW92ZSA9PSBudWxsKSB7XG4gICAgICAgIG1hcmtlck5vdFRvTW92ZSA9IG51bGw7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5zcGlkZXJmaWVkID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICB0aGlzLnVuc3BpZGVyZnlpbmcgPSB0cnVlO1xuICAgICAgdW5zcGlkZXJmaWVkTWFya2VycyA9IFtdO1xuICAgICAgbm9uTmVhcmJ5TWFya2VycyA9IFtdO1xuICAgICAgcmVmMiA9IHRoaXMubWFya2VycztcbiAgICAgIGZvciAobCA9IDAsIGxlbjEgPSByZWYyLmxlbmd0aDsgbCA8IGxlbjE7IGwrKykge1xuICAgICAgICBtYXJrZXIgPSByZWYyW2xdO1xuICAgICAgICBpZiAobWFya2VyWydfb21zRGF0YSddICE9IG51bGwpIHtcbiAgICAgICAgICBtYXJrZXJbJ19vbXNEYXRhJ10ubGVnLnNldE1hcChudWxsKTtcbiAgICAgICAgICBpZiAobWFya2VyICE9PSBtYXJrZXJOb3RUb01vdmUpIHtcbiAgICAgICAgICAgIG1hcmtlci5zZXRQb3NpdGlvbihtYXJrZXJbJ19vbXNEYXRhJ10udXN1YWxQb3NpdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICAgIG1hcmtlci5zZXRaSW5kZXgobnVsbCk7XG4gICAgICAgICAgbGlzdGVuZXJzID0gbWFya2VyWydfb21zRGF0YSddLmhpZ2h0bGlnaHRMaXN0ZW5lcnM7XG4gICAgICAgICAgaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7XG4gICAgICAgICAgICBnZS5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lcnMuaGlnaGxpZ2h0KTtcbiAgICAgICAgICAgIGdlLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVycy51bmhpZ2hsaWdodCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlbGV0ZSBtYXJrZXJbJ19vbXNEYXRhJ107XG4gICAgICAgICAgdW5zcGlkZXJmaWVkTWFya2Vycy5wdXNoKG1hcmtlcik7XG4gICAgICAgI
6780H0gZWxzZSB7XG4gICAgICAgICAgbm9uTmVhcmJ5TWFya2Vycy5wdXNoKG1hcmtlcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGRlbGV0ZSB0aGlzLnVuc3BpZGVyZnlpbmc7XG4gICAgICBkZWxldGUgdGhpcy5zcGlkZXJmaWVkO1xuICAgICAgdGhpcy50cmlnZ2VyKCd1bnNwaWRlcmZ5JywgdW5zcGlkZXJmaWVkTWFya2Vycywgbm9uTmVhcmJ5TWFya2Vycyk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgcC5wdERpc3RhbmNlU3EgPSBmdW5jdGlvbihwdDEsIHB0Mikge1xuICAgICAgdmFyIGR4LCBkeTtcbiAgICAgIGR4ID0gcHQxLnggLSBwdDIueDtcbiAgICAgIGR5ID0gcHQxLnkgLSBwdDIueTtcbiAgICAgIHJldHVybiBkeCAqIGR4ICsgZHkgKiBkeTtcbiAgICB9O1xuXG4gICAgcC5wdEF2ZXJhZ2UgPSBmdW5jdGlvbihwdHMpIHtcbiAgICAgIHZhciBsLCBsZW4xLCBudW1QdHMsIHB0LCBzdW1YLCBzdW1ZO1xuICAgICAgc3VtWCA9IHN1bVkgPSAwO1xuICAgICAgZm9yIChsID0gMCwgbGVuMSA9IHB0cy5sZW5ndGg7IGwgPCBsZW4xOyBsKyspIHtcbiAgICAgICAgcHQgPSBwdHNbbF07XG4gICAgICAgIHN1bVggKz0gcHQueDtcbiAgICAgICAgc3VtWSArPSBwdC55O1xuICAgICAgfVxuICAgICAgbnVtUHRzID0gcHRzLmxlbmd0aDtcbiAgICAgIHJldHVybiBuZXcgZ20uUG9pbnQoc3VtWCAvIG51bVB0cywgc3VtWSAvIG51bVB0cyk7XG4gICAgfTtcblxuICAgIHAubGxUb1B0ID0gZnVuY3Rpb24obGwpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb2pIZWxwZXIuZ2V0UHJvamVjdGlvbigpLmZyb21MYXRMbmdUb0RpdlBpeGVsKGxsKTtcbiAgICB9O1xuXG4gICAgcC5wdFRvTGwgPSBmdW5jdGlvbihwdCkge1xuICAgICAgcmV0dXJuIHRoaXMucHJvakhlbHBlci5nZXRQcm9qZWN0aW9uKCkuZnJvbURpdlBpeGVsVG9MYXRMbmcocHQpO1xuICAgIH07XG5cbiAgICBwLm1pbkV4dHJhY3QgPSBmdW5jdGlvbihzZXQsIGZ1bmMpIHtcbiAgICAgIHZhciBiZXN0SW5kZXgsIGJlc3RWYWwsIGluZGV4LCBpdGVtLCBsLCBsZW4xLCB2YWw7XG4gICAgICBmb3IgKGluZGV4ID0gbCA9IDAsIGxlbjEgPSBzZXQubGVuZ3RoOyBsIDwgbGVuMTsgaW5kZXggPSArK2wpIHtcbiAgICAgICAgaXRlbSA9IHNldFtpbmRleF07XG4gICAgICAgIHZhbCA9IGZ1bmMoaXRlbSk7XG4gICAgICAgIGlmICgodHlwZW9mIGJlc3RJbmRleCA9PT0gXCJ1bmRlZmluZWRcIiB8fCBiZXN0SW5kZXggPT09IG51bGwpIHx8IHZhbCA8IGJlc3RWYWwpIHtcbiAgICAgICAgICBiZXN0VmFsID0gdmFsO1xuICAgICAgICAgIGJlc3RJbmRleCA9IGluZGV4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gc2V0LnNwbGljZShiZXN0SW5kZXgsIDEpWzBdO1xuICAgIH07XG5cbiAgICBwLmFyckluZGV4T2YgPSBmdW5jdGlvbihhcnIsIG9iaikge1xuICAgICAgdmFyIGksIGwsIGxlbjEsIG87XG4gICAgICBpZiAoYXJyLmluZGV4T2YgIT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gYXJyLmluZGV4T2Yob2JqKTtcbiAgICAgIH1cbiAgICAgIGZvciAoaSA9IGwgPSAwLCBsZW4xID0gYXJyLmxlbmd0aDsgbCA8IGxlbjE7IGkgPSArK2wpIHtcbiAgICAgICAgbyA9IGFycltpXTtcbiAgICAgICAgaWYgKG8gPT09IG9iaikge1xuICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gLTE7XG4gICAgfTtcblxuICAgIF9DbGFzcy5Qcm9qSGVscGVyID0gZnVuY3Rpb24obWFwKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZXRNYXAobWFwKTtcbiAgICB9O1xuXG4gICAgX0NsYXNzLlByb2pIZWxwZXIucHJvdG90eXBlID0gbmV3IGdtLk92ZXJsYXlWaWV3KCk7XG5cbiAgICBfQ2xhc3MuUHJvakhlbHBlci5wcm90b3R5cGVbJ2RyYXcnXSA9IGZ1bmN0aW9uKCkge307XG5cbiAgICByZXR1cm4gX0NsYXNzO1xuXG4gIH0pKCk7XG5cbn0pLmNhbGwodGhpcyk7XG4iLCJ2YXIgJCA9IGpRdWVyeS5ub0NvbmZsaWN0KCk7XG5cbiQoZG9jdW1lbnQpLmZvdW5kYXRpb24oKTtcblxudmFyICRob21lcGFnZVNsaWRlciA9ICQoJy5ob21lcGFnZS1zbGlkZXInKTtcblxuJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24gKCkge1xuXHRpZigkaG9tZXBhZ2VTbGlkZXIubGVuZ3RoKSB7XG5cdFx0JGhvbWVwYWdlU2xpZGVyLnNsaWNrKHtcblx0XHRcdGFycm93czogdHJ1ZSxcblx0XHRcdGRvdHM6IHRydWUsXG5cdFx0XHRhdXRvcGxheTogdHJ1ZSxcblx0XHRcdGF1dG9wbGF5U3BlZWQ6IDYwMDAsXG5cdFx0XHRmYWRlOiB0cnVlXG5cdFx0fSk7XG5cdH1cblxuXHQvLyBnYWxsZXJ5IHNsaWRlclxuXHR2YXIgJGdhbGxlcnlTbGlkZXIgPSAkKCcuZ2FsbGVyeS13aWRnZXQtc2xpZGVyJyk7XG5cblx0JGdhbGxlcnlTbGlkZXIub24oJ2luaXQnLCBmdW5jdGlvbihzbGljayl7XG5cdFx0dmFyICRzbGlkZXMgPSAkZ2FsbGVyeVNsaWRlci5maW5kKCcuc2xpY2stc2xpZGUnKS5ub3QoJy5zbGljay1jbG9uZWQnKSxcblx0XHRcdHNsaWRlc051bWJlciA9ICRzbGlkZXMubGVuZ3RoOyAvLyBmb3Igc29tZSByZWFzb24gaXQgcmVjZWl2ZXMgMiBhY3RpdmUgc2xpZGVzXG5cdFx0JCgnLnNsaWRlcy1jb3VudGVyJykuZmluZCgnLmN1cnJlbnQtc2xpZGUtbnVtYmVyJykuaHRtbCgnMScpO1xuXHRcdCQoJy5zbGlkZXMtY291bnRlcicpLmZpbmQoJy50b3RhbC1zbGlkZXMnKS5hcHBlbmQoJyBvZiAnICsgc2xpZGVzTnVtYmVyKTtcblx0fSk7XG5cblx0JGdhbGxlcnlTbGlkZXIub24oJ2FmdGVyQ2hhbmdlJywgZnVuY3Rpb24oc2xpY2ssIGN1cnJlbnRTbGlkZSwgbmV4dFNsaWRlKXtcblx0XHQkKCcuc2xpZGVzLWNvdW50ZXInKS5maW5kKCcuY3VycmVudC1zbGlkZS1udW1iZXInKS5odG1sKGN1cnJlbnRTbGlkZS5jdXJyZW50U2xpZGUgKyAxKTtcblx0fSk7XG5cblx0aWYoJGdhbGxlcnlTbGlkZXIubGVuZ3RoKSB7XG5cdFx0dmFyIHNsaWNrR2FsbGVyeVNsaWRlciA9ICRnYWxsZXJ5U2xpZGVyLnNsaWNrKHtcblx0XHRcdGFycm93czogdHJ1ZSxcblx0XHRcdGRvdHM6IGZhbHNlLFxuXHRcdFx0YWRhcHRpdmVIZWlnaHQ6IHRydWUsXG5cdFx0XHRwcmV2QXJyb3c6ICc8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImdhbGxlcnktc2xpZGVyLXByZXZcIj4mbHNhcXVvOzwvYnV0dG9uPicsXG5cdFx0XHRuZXh0QXJyb3c6ICc8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImdhbGxlcnktc2xpZGVyLW5leHRcIj4mcnNhcXVvOzwvYnV0dG9uPicsXG5cdFx0XHRhcHBlbmRBcnJvd3M6ICQoJy5nYWxsZXJ5LXNsaWRlci1uYXYnKSxcblx0XHR9KTtcblx0fVxuXG5cdCQoJy5mYW5jeWJveCcpLmZhbmN5Ym94KCk7XG5cblx0JC5mbi5hbG1Db21wbGV0ZSA9IGZ1bmN0aW9uKGFsbSl7XG5cdFx0c2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0XHRuZXcgRm91bmRhdGlvbi5FcXVhbGl6ZXIoJCgnI3BhZ2UsICNzaW5nbGUtcG9zdCcpLCB7XG5cdFx0XHRcdCdkYXRhLWVxdWFsaXplLW9uJyA6ICdtZWRpdW0nXG5cdFx0XHR9KTtcblx0XHR9LCAzMDApO1xuXHR9O1xuXG5cdC8qIG1ha2UgdGhlIG1vYmlsZSBtZW51IH
6780BhcmVudCBpdGVtcyBsaW5rcyBhY2Nlc3NpYmxlICovXG5cblx0Ly8gZGlzYWJsZSBwcmV2ZW50IGRlZmF1bHRcblx0JCgnI21vYmlsZS1tZW51IC5pcy1hY2NvcmRpb24tc3VibWVudS1wYXJlbnQgPiBhJykudW5iaW5kKCdjbGljaycpO1xuXG5cdCQoJyNtb2JpbGUtbWVudSAuaXMtYWNjb3JkaW9uLXN1Ym1lbnUtcGFyZW50ID4gYSAuZHJvcGRvd24tYXJyb3cnKS5jbGljayhmdW5jdGlvbiAoZSkge1xuXHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0JCh0aGlzKS50b2dnbGVDbGFzcygnaXMtb3BlbmVkJyk7XG5cblx0XHRpZigkKHRoaXMpLmhhc0NsYXNzKCdpcy1vcGVuZWQnKSkge1xuXHRcdFx0JChkb2N1bWVudCkudHJpZ2dlcignZG93bi56Zi5hY2NvcmRpb25NZW51Jyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdCQoZG9jdW1lbnQpLnRyaWdnZXIoJ3VwLnpmLmFjY29yZGlvbk1lbnUnKTtcblx0XHR9XG5cblx0XHQkKHRoaXMpLmNsb3Nlc3QoJy5pcy1hY2NvcmRpb24tc3VibWVudS1wYXJlbnQnKS5maW5kKCcuaXMtYWNjb3JkaW9uLXN1Ym1lbnUnKS5zbGlkZVRvZ2dsZSgpO1xuXHR9KTtcblxuXHQvLyBkaXNhYmxlIGN1cnJlbnQgeWVhciBvbiBhcmNoaXZlcyBwYWdlXG5cblx0aWYoJCgnYm9keScpLmhhc0NsYXNzKCdhcmNoaXZlJykgJiYgJCgnYm9keScpLmhhc0NsYXNzKCdkYXRlJykpIHtcblx0XHR2YXIgY3VycmVudEFyY2hpdmUgPSB3aW5kb3cubG9jYXRpb24uaHJlZixcblx0XHRcdCRhcmNoaXZlTGlzdCA9ICQoJy5hcmNoaXZlLWxpc3QnKTtcblxuXHRcdCRhcmNoaXZlTGlzdC5maW5kKFwiYVtocmVmPSdcIiArIGN1cnJlbnRBcmNoaXZlICsgXCInXVwiKVxuXHRcdFx0LmFkZENsYXNzKCdkaXNhYmxlZC1saW5rJylcblx0XHRcdC5jbGljayhmdW5jdGlvbiAoZSkge1xuXHRcdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHR9KTtcblx0fVxufSk7XG5cbiQod2luZG93KS5sb2FkKGZ1bmN0aW9uICgpIHtcblx0Ly8gbWFrZSB0aGUgY29udGVudCBhbmQgc2lkZWJhciBoZWlnaHQgZXF1YWxcblx0c2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0dmFyIGVsZW0gPSBuZXcgRm91bmRhdGlvbi5FcXVhbGl6ZXIoJCgnI3BhZ2UsICNzaW5nbGUtcG9zdCcpLCB7XG5cdFx0XHQnZGF0YS1lcXVhbGl6ZS1vbicgOiAnbWVkaXVtJ1xuXHRcdH0pO1xuXHR9LCAwKTtcblxuXHQkKGRvY3VtZW50KS5vbignY2hhbmdlLnpmLnRhYnMgZG93bi56Zi5hY2NvcmRpb24gdXAuemYuYWNjb3JkaW9uIGRvd24uemYuYWNjb3JkaW9uTWVudSB1cC56Zi5hY2NvcmRpb25NZW51JywgZnVuY3Rpb24gKCkge1xuXHRcdG5ldyBGb3VuZGF0aW9uLkVxdWFsaXplcigkKCcjcGFnZSwgI3NpbmdsZS1wb3N0JyksIHtcblx0XHRcdCdkYXRhLWVxdWFsaXplLW9uJyA6ICdtZWRpdW0nXG5cdFx0fSk7XG5cdH0pO1xufSk7XG5cbi8vIHRyaWJlIGV2ZW50cyB0b29sdGlwcyBmb3IgdGhlIG1pbmkgY2FsZW5kYXJcblxudmFyICRldmVudHNXaWRnZXQgPSAkKCAnLmV2ZW50cy13aWRnZXQnICk7XG5cbiRldmVudHNXaWRnZXQub24oICdtb3VzZWVudGVyJywgJy5wYXJpc2gtdG9vbHRpcHMnLGZ1bmN0aW9uKCkge1xuXG5cdHZhciBib3R0b21QYWQgPSAwLFxuXHRcdCR0aGlzID0gJCggdGhpcyApLFxuXHRcdCRib2R5ID0gJCggJ2JvZHknICksXG5cdFx0JHRpcDtcblxuXHRpZiAoICRib2R5Lmhhc0NsYXNzKCAnZXZlbnRzLWdyaWR2aWV3JyApICkgeyAvLyBDYWwgVmlldyBUb29sdGlwc1xuXHRcdGJvdHRvbVBhZCA9ICR0aGlzLmZpbmQoICdhJyApLm91dGVySGVpZ2h0KCkgKyAxODtcblx0fVxuXHRlbHNlIGlmICggJGJvZHkuaXMoICcuc2luZ2xlLXRyaWJlX2V2ZW50cywgLmV2ZW50cy1saXN0LCAudHJpYmUtZXZlbnRzLWRheScgKSApIHsgLy8gU2luZ2xlL0xpc3QgVmlldyBSZWN1cnJpbmcgVG9vbHRpcHNcblx0XHRib3R0b21QYWQgPSAkdGhpcy5vdXRlckhlaWdodCgpICsgMTI7XG5cdH1cblx0ZWxzZSBpZiAoICRib2R5LmlzKCAnLnRyaWJlLWV2ZW50cy1waG90bycgKSApIHsgLy8gUGhvdG8gVmlld1xuXHRcdGJvdHRvbVBhZCA9ICR0aGlzLm91dGVySGVpZ2h0KCkgKyAxMDtcblx0fVxuXG5cdC8vIFdpZGdldCBUb29sdGlwc1xuXHRpZiAoICR0aGlzLnBhcmVudHMoICcudHJpYmUtZXZlbnRzLWNhbGVuZGFyLXdpZGdldCcgKS5sZW5ndGggKSB7XG5cdFx0Ym90dG9tUGFkID0gJHRoaXMub3V0ZXJIZWlnaHQoKSAtIDY7XG5cdH1cblx0aWYgKCAhICRib2R5Lmhhc0NsYXNzKCAndHJpYmUtZXZlbnRzLXdlZWsnICkgKSB7XG5cdFx0JHRpcCA9ICR0aGlzLmZpbmQoICcudHJpYmUtZXZlbnRzLXRvb2x0aXAnICk7XG5cblx0XHRpZiAoICEgJHRpcC5sZW5ndGggKSB7XG5cdFx0XHR2YXIgZGF0YSA9ICR0aGlzLmRhdGEoICd0cmliZWpzb24nICk7XG5cblx0XHRcdGlmKCAhIGRhdGEuaGFzT3duUHJvcGVydHkoJ2V2ZW50SWQnKSApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHR5cGVvZiBkYXRhID09ICdzdHJpbmcnICkge1xuXHRcdFx0XHRkYXRhID0gJC5wYXJzZUpTT04oIGRhdGEgKTtcblx0XHRcdH1cblxuXHRcdFx0JHRoaXMuYXBwZW5kKCB0cmliZV90bXBsKCAndHJpYmVfdG1wbF90b29sdGlwJywgZGF0YSApICk7XG5cblx0XHRcdC8vIGFkZCBsaW5rcyB0byB0b29sdGlwc1xuXG5cdFx0XHRpZiggZGF0YS5oYXNPd25Qcm9wZXJ0eSgncGVybWFsaW5rJykgKSB7XG5cdFx0XHRcdHZhciAkdGl0bGUgPSAkKHRoaXMpLmZpbmQoJy5lbnRyeS10aXRsZScpLFxuXHRcdFx0XHRcdHRpdGxlVGV4dCA9ICR0aXRsZS50ZXh0KCksXG5cdFx0XHRcdFx0bGluayA9IGRhdGEucGVybWFsaW5rO1xuXG5cdFx0XHRcdCR0aXRsZS5odG1sKCc8YSBocmVmPVwiJyArIGxpbmsgKyAnXCI+JyArIHRpdGxlVGV4dCArICc8L2E+Jyk7XG5cdFx0XHR9XG5cblx0XHRcdCR0aXAgPSAkdGhpcy5maW5kKCAnLnRyaWJlLWV2ZW50cy10b29sdGlwJyApO1xuXG5cdFx0XHQkdGlwLmNzcyggJ2JvdHRvbScsIGJvdHRvbVBhZCApLnNob3coKTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHQkdGlwLmNzcyggJ2JvdHRvbScsIGJvdHRvbVBhZCApLnNob3coKTtcblx0XHR9XG5cdH1cblxufSApLm9uKCAnbW91c2VsZWF2ZScsICcucGFyaXNoLXRvb2x0aXBzJywgZnVuY3Rpb24oKSB7XG5cdCQoIHRoaXMgKS5maW5kKCAnLnRyaWJlLWV2ZW50cy10b29sdGlwJyApLnN0b3AoIHRydWUsIGZhbHNlICkuZmFkZU91dCggMjAwICk7XG59ICk7XG4
6780iXX0=

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.