w-json-stream 1.0.13 → 1.0.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- !function(l,Z){"object"==typeof exports&&"undefined"!=typeof module?module.exports=Z(require("worker_threads")):"function"==typeof define&&define.amd?define(["worker_threads"],Z):(l="undefined"!=typeof globalThis?globalThis:l||self)["w-json-stream"]=Z(l.worker_threads)}(this,(function(l){"use strict";function Z(l){return l&&"object"==typeof l&&"default"in l?l:{default:l}}var d=Z(l);function m(l){return(m="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(l){return typeof l}:function(l){return l&&"function"==typeof Symbol&&l.constructor===Symbol&&l!==Symbol.prototype?"symbol":typeof l})(l)}var b="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function c(l){var Z={exports:{}};return l(Z,Z.exports),Z.exports}var G=c((function(l,Z){l.exports=function(l){function Z(l,Z){(null==Z||Z>l.length)&&(Z=l.length);for(var d=0,m=new Array(Z);d<Z;d++)m[d]=l[d];return m}function d(l){return function(l){if(Array.isArray(l))return Z(l)}(l)||function(l){if("undefined"!=typeof Symbol&&null!=l[Symbol.iterator]||null!=l["@@iterator"])return Array.from(l)}(l)||function(l,d){if(l){if("string"==typeof l)return Z(l,d);var m=Object.prototype.toString.call(l).slice(8,-1);return"Object"===m&&l.constructor&&(m=l.constructor.name),"Map"===m||"Set"===m?Array.from(l):"Arguments"===m||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(m)?Z(l,d):void 0}}(l)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function b(l,Z,d,m,b,c,G){try{var X=l[c](G),W=X.value}catch(l){return void d(l)}X.done?Z(W):Promise.resolve(W).then(m,b)}function c(l){return function(){var Z=this,d=arguments;return new Promise((function(m,c){var G=l.apply(Z,d);function X(l){b(G,m,c,X,W,"next",l)}function W(l){b(G,m,c,X,W,"throw",l)}X(void 0)}))}}function G(l){return(G="function"==typeof Symbol&&"symbol"==m(Symbol.iterator)?function(l){return m(l)}:function(l){return l&&"function"==typeof Symbol&&l.constructor===Symbol&&l!==Symbol.prototype?"symbol":m(l)})(l)}function X(l){var Z={exports:{}};return l(Z,Z.exports),Z.exports}var W,u=X((function(l){var Z=function(l){var Z,d=Object.prototype,m=d.hasOwnProperty,b="function"==typeof Symbol?Symbol:{},c=b.iterator||"@@iterator",X=b.asyncIterator||"@@asyncIterator",W=b.toStringTag||"@@toStringTag";function u(l,Z,d){return Object.defineProperty(l,Z,{value:d,enumerable:!0,configurable:!0,writable:!0}),l[Z]}try{u({},"")}catch(l){u=function(l,Z,d){return l[Z]=d}}function i(l,Z,d,m){var b=Z&&Z.prototype instanceof Y?Z:Y,c=Object.create(b.prototype),G=new t(m||[]);return c._invoke=function(l,Z,d){var m=y;return function(b,c){if(m===I)throw new Error("Generator is already running");if(m===h){if("throw"===b)throw c;return N()}for(d.method=b,d.arg=c;;){var G=d.delegate;if(G){var X=S(G,d);if(X){if(X===a)continue;return X}}if("next"===d.method)d.sent=d._sent=d.arg;else if("throw"===d.method){if(m===y)throw m=h,d.arg;d.dispatchException(d.arg)}else"return"===d.method&&d.abrupt("return",d.arg);m=I;var W=p(l,Z,d);if("normal"===W.type){if(m=d.done?h:V,W.arg===a)continue;return{value:W.arg,done:d.done}}"throw"===W.type&&(m=h,d.method="throw",d.arg=W.arg)}}}(l,d,G),c}function p(l,Z,d){try{return{type:"normal",arg:l.call(Z,d)}}catch(l){return{type:"throw",arg:l}}}l.wrap=i;var y="suspendedStart",V="suspendedYield",I="executing",h="completed",a={};function Y(){}function R(){}function o(){}var n={};n[c]=function(){return this};var K=Object.getPrototypeOf,L=K&&K(K(T([])));L&&L!==d&&m.call(L,c)&&(n=L);var J=o.prototype=Y.prototype=Object.create(n);function s(l){["next","throw","return"].forEach((function(Z){u(l,Z,(function(l){return this._invoke(Z,l)}))}))}function H(l,Z){function d(b,c,X,W){var u=p(l[b],l,c);if("throw"!==u.type){var i=u.arg,y=i.value;return y&&"object"===G(y)&&m.call(y,"__await")?Z.resolve(y.__await).then((function(l){d("next",l,X,W)}),(function(l){d("throw",l,X,W)})):Z.resolve(y).then((function(l){i.value=l,X(i)}),(function(l){return d("throw",l,X,W)}))}W(u.arg)}var b;this._invoke=function(l,m){function c(){return new Z((function(Z,b){d(l,m,Z,b)}))}return b=b?b.then(c,c):c()}}function S(l,d){var m=l.iterator[d.method];if(m===Z){if(d.delegate=null,"throw"===d.method){if(l.iterator.return&&(d.method="return",d.arg=Z,S(l,d),"throw"===d.method))return a;d.method="throw",d.arg=new TypeError("The iterator does not provide a 'throw' method")}return a}var b=p(m,l.iterator,d.arg);if("throw"===b.type)return d.method="throw",d.arg=b.arg,d.delegate=null,a;var c=b.arg;return c?c.done?(d[l.resultName]=c.value,d.next=l.nextLoc,"return"!==d.method&&(d.method="next",d.arg=Z),d.delegate=null,a):c:(d.method="throw",d.arg=new TypeError("iterator result is not an object"),d.delegate=null,a)}function x(l){var Z={tryLoc:l[0]};1 in l&&(Z.catchLoc=l[1]),2 in l&&(Z.finallyLoc=l[2],Z.afterLoc=l[3]),this.tryEntries.push(Z)}function C(l){var Z=l.completion||{};Z.type="normal",delete Z.arg,l.completion=Z}function t(l){this.tryEntries=[{tryLoc:"root"}],l.forEach(x,this),this.reset(!0)}function T(l){if(l){var d=l[c];if(d)return d.call(l);if("function"==typeof l.next)return l;if(!isNaN(l.length)){var b=-1,G=function d(){for(;++b<l.length;)if(m.call(l,b))return d.value=l[b],d.done=!1,d;return d.value=Z,d.done=!0,d};return G.next=G}}return{next:N}}function N(){return{value:Z,done:!0}}return R.prototype=J.constructor=o,o.constructor=R,R.displayName=u(o,W,"GeneratorFunction"),l.isGeneratorFunction=function(l){var Z="function"==typeof l&&l.constructor;return!!Z&&(Z===R||"GeneratorFunction"===(Z.displayName||Z.name))},l.mark=function(l){return Object.setPrototypeOf?Object.setPrototypeOf(l,o):(l.__proto__=o,u(l,W,"GeneratorFunction")),l.prototype=Object.create(J),l},l.awrap=function(l){return{__await:l}},s(H.prototype),H.prototype[X]=function(){return this},l.AsyncIterator=H,l.async=function(Z,d,m,b,c){void 0===c&&(c=Promise);var G=new H(i(Z,d,m,b),c);return l.isGeneratorFunction(d)?G:G.next().then((function(l){return l.done?l.value:G.next()}))},s(J),u(J,W,"Generator"),J[c]=function(){return this},J.toString=function(){return"[object Generator]"},l.keys=function(l){var Z=[];for(var d in l)Z.push(d);return Z.reverse(),function d(){for(;Z.length;){var m=Z.pop();if(m in l)return d.value=m,d.done=!1,d}return d.done=!0,d}},l.values=T,t.prototype={constructor:t,reset:function(l){if(this.prev=0,this.next=0,this.sent=this._sent=Z,this.done=!1,this.delegate=null,this.method="next",this.arg=Z,this.tryEntries.forEach(C),!l)for(var d in this)"t"===d.charAt(0)&&m.call(this,d)&&!isNaN(+d.slice(1))&&(this[d]=Z)},stop:function(){this.done=!0;var l=this.tryEntries[0].completion;if("throw"===l.type)throw l.arg;return this.rval},dispatchException:function(l){if(this.done)throw l;var d=this;function b(m,b){return X.type="throw",X.arg=l,d.next=m,b&&(d.method="next",d.arg=Z),!!b}for(var c=this.tryEntries.length-1;c>=0;--c){var G=this.tryEntries[c],X=G.completion;if("root"===G.tryLoc)return b("end");if(G.tryLoc<=this.prev){var W=m.call(G,"catchLoc"),u=m.call(G,"finallyLoc");if(W&&u){if(this.prev<G.catchLoc)return b(G.catchLoc,!0);if(this.prev<G.finallyLoc)return b(G.finallyLoc)}else if(W){if(this.prev<G.catchLoc)return b(G.catchLoc,!0)}else{if(!u)throw new Error("try statement without catch or finally");if(this.prev<G.finallyLoc)return b(G.finallyLoc)}}}},abrupt:function(l,Z){for(var d=this.tryEntries.length-1;d>=0;--d){var b=this.tryEntries[d];if(b.tryLoc<=this.prev&&m.call(b,"finallyLoc")&&this.prev<b.finallyLoc){var c=b;break}}c&&("break"===l||"continue"===l)&&c.tryLoc<=Z&&Z<=c.finallyLoc&&(c=null);var G=c?c.completion:{};return G.type=l,G.arg=Z,c?(this.method="next",this.next=c.finallyLoc,a):this.complete(G)},complete:function(l,Z){if("throw"===l.type)throw l.arg;return"break"===l.type||"continue"===l.type?this.next=l.arg:"return"===l.type?(this.rval=this.arg=l.arg,this.method="return",this.next="end"):"normal"===l.type&&Z&&(this.next=Z),a},finish:function(l){for(var Z=this.tryEntries.length-1;Z>=0;--Z){var d=this.tryEntries[Z];if(d.finallyLoc===l)return this.complete(d.completion,d.afterLoc),C(d),a}},catch:function(l){for(var Z=this.tryEntries.length-1;Z>=0;--Z){var d=this.tryEntries[Z];if(d.tryLoc===l){var m=d.completion;if("throw"===m.type){var b=m.arg;C(d)}return b}}throw new Error("illegal catch attempt")},delegateYield:function(l,d,m){return this.delegate={iterator:T(l),resultName:d,nextLoc:m},"next"===this.method&&(this.arg=Z),a}},l}(l.exports);try{regeneratorRuntime=Z}catch(l){Function("r","regeneratorRuntime = r")(Z)}})),i=X((function(l){var Z=Object.prototype.hasOwnProperty,d="~";function m(){}function b(l,Z,d){this.fn=l,this.context=Z,this.once=d||!1}function c(l,Z,m,c,G){if("function"!=typeof m)throw new TypeError("The listener must be a function");var X=new b(m,c||l,G),W=d?d+Z:Z;return l._events[W]?l._events[W].fn?l._events[W]=[l._events[W],X]:l._events[W].push(X):(l._events[W]=X,l._eventsCount++),l}function G(l,Z){0==--l._eventsCount?l._events=new m:delete l._events[Z]}function X(){this._events=new m,this._eventsCount=0}Object.create&&(m.prototype=Object.create(null),(new m).__proto__||(d=!1)),X.prototype.eventNames=function(){var l,m,b=[];if(0===this._eventsCount)return b;for(m in l=this._events)Z.call(l,m)&&b.push(d?m.slice(1):m);return Object.getOwnPropertySymbols?b.concat(Object.getOwnPropertySymbols(l)):b},X.prototype.listeners=function(l){var Z=d?d+l:l,m=this._events[Z];if(!m)return[];if(m.fn)return[m.fn];for(var b=0,c=m.length,G=new Array(c);b<c;b++)G[b]=m[b].fn;return G},X.prototype.listenerCount=function(l){var Z=d?d+l:l,m=this._events[Z];return m?m.fn?1:m.length:0},X.prototype.emit=function(l,Z,m,b,c,G){var X=d?d+l:l;if(!this._events[X])return!1;var W,u,i=this._events[X],p=arguments.length;if(i.fn){switch(i.once&&this.removeListener(l,i.fn,void 0,!0),p){case 1:return i.fn.call(i.context),!0;case 2:return i.fn.call(i.context,Z),!0;case 3:return i.fn.call(i.context,Z,m),!0;case 4:return i.fn.call(i.context,Z,m,b),!0;case 5:return i.fn.call(i.context,Z,m,b,c),!0;case 6:return i.fn.call(i.context,Z,m,b,c,G),!0}for(u=1,W=new Array(p-1);u<p;u++)W[u-1]=arguments[u];i.fn.apply(i.context,W)}else{var y,V=i.length;for(u=0;u<V;u++)switch(i[u].once&&this.removeListener(l,i[u].fn,void 0,!0),p){case 1:i[u].fn.call(i[u].context);break;case 2:i[u].fn.call(i[u].context,Z);break;case 3:i[u].fn.call(i[u].context,Z,m);break;case 4:i[u].fn.call(i[u].context,Z,m,b);break;default:if(!W)for(y=1,W=new Array(p-1);y<p;y++)W[y-1]=arguments[y];i[u].fn.apply(i[u].context,W)}}return!0},X.prototype.on=function(l,Z,d){return c(this,l,Z,d,!1)},X.prototype.once=function(l,Z,d){return c(this,l,Z,d,!0)},X.prototype.removeListener=function(l,Z,m,b){var c=d?d+l:l;if(!this._events[c])return this;if(!Z)return G(this,c),this;var X=this._events[c];if(X.fn)X.fn!==Z||b&&!X.once||m&&X.context!==m||G(this,c);else{for(var W=0,u=[],i=X.length;W<i;W++)(X[W].fn!==Z||b&&!X[W].once||m&&X[W].context!==m)&&u.push(X[W]);u.length?this._events[c]=1===u.length?u[0]:u:G(this,c)}return this},X.prototype.removeAllListeners=function(l){var Z;return l?(Z=d?d+l:l,this._events[Z]&&G(this,Z)):(this._events=new m,this._eventsCount=0),this},X.prototype.off=X.prototype.removeListener,X.prototype.addListener=X.prototype.on,X.prefixed=d,X.EventEmitter=X,l.exports=X}));return function(){if("nodejs"!=("undefined"!=typeof window&&void 0!==window.document?"browser":"nodejs"))return null;function Z(){return new i}function m(){var l,Z,d=new Promise((function(){l=arguments[0],Z=arguments[1]}));return d.resolve=l,d.reject=Z,d}function b(){for(var l=arguments.length>0&&void 0!==arguments[0]?arguments[0]:10,Z=[],d="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),m=d.length,b=0;b<l;b++)Z[b]=d[0|Math.random()*m];return Z.join("")}var G,X=(G="CgogICAgICAgIGxldCB7IHBhcmVudFBvcnQgfSA9IHJlcXVpcmUoJ3dvcmtlcl90aHJlYWRzJykKICAgICAgICAKCnZhciB0PSJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsP2dsb2JhbDoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6e307ZnVuY3Rpb24gZSgpe3Rocm93IG5ldyBFcnJvcigic2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCIpfWZ1bmN0aW9uIHIoKXt0aHJvdyBuZXcgRXJyb3IoImNsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCIpfXZhciBuPWUsaT1yO2Z1bmN0aW9uIG8odCl7aWYobj09PXNldFRpbWVvdXQpcmV0dXJuIHNldFRpbWVvdXQodCwwKTtpZigobj09PWV8fCFuKSYmc2V0VGltZW91dClyZXR1cm4gbj1zZXRUaW1lb3V0LHNldFRpbWVvdXQodCwwKTt0cnl7cmV0dXJuIG4odCwwKX1jYXRjaChlKXt0cnl7cmV0dXJuIG4uY2FsbChudWxsLHQsMCl9Y2F0Y2goZSl7cmV0dXJuIG4uY2FsbCh0aGlzLHQsMCl9fX0iZnVuY3Rpb24iPT10eXBlb2YgdC5zZXRUaW1lb3V0JiYobj1zZXRUaW1lb3V0KSwiZnVuY3Rpb24iPT10eXBlb2YgdC5jbGVhclRpbWVvdXQmJihpPWNsZWFyVGltZW91dCk7dmFyIGEscz1bXSx1PSExLGY9LTE7ZnVuY3Rpb24gaCgpe3UmJmEmJih1PSExLGEubGVuZ3RoP3M9YS5jb25jYXQocyk6Zj0tMSxzLmxlbmd0aCYmbCgpKX1mdW5jdGlvbiBsKCl7aWYoIXUpe3ZhciB0PW8oaCk7dT0hMDtmb3IodmFyIGU9cy5sZW5ndGg7ZTspe2ZvcihhPXMscz1bXTsrK2Y8ZTspYSYmYVtmXS5ydW4oKTtmPS0xLGU9cy5sZW5ndGh9YT1udWxsLHU9ITEsZnVuY3Rpb24odCl7aWYoaT09PWNsZWFyVGltZW91dClyZXR1cm4gY2xlYXJUaW1lb3V0KHQpO2lmKChpPT09cnx8IWkpJiZjbGVhclRpbWVvdXQpcmV0dXJuIGk9Y2xlYXJUaW1lb3V0LGNsZWFyVGltZW91dCh0KTt0cnl7aSh0KX1jYXRjaChlKXt0cnl7cmV0dXJuIGkuY2FsbChudWxsLHQpfWNhdGNoKGUpe3JldHVybiBpLmNhbGwodGhpcyx0KX19fSh0KX19ZnVuY3Rpb24gYyh0KXt2YXIgZT1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aC0xKTtpZihhcmd1bWVudHMubGVuZ3RoPjEpZm9yKHZhciByPTE7cjxhcmd1bWVudHMubGVuZ3RoO3IrKyllW3ItMV09YXJndW1lbnRzW3JdO3MucHVzaChuZXcgZCh0LGUpKSwxIT09cy5sZW5ndGh8fHV8fG8obCl9ZnVuY3Rpb24gZCh0LGUpe3RoaXMuZnVuPXQsdGhpcy5hcnJheT1lfWQucHJvdG90eXBlLnJ1bj1mdW5jdGlvbigpe3RoaXMuZnVuLmFwcGx5KG51bGwsdGhpcy5hcnJheSl9O2Z1bmN0aW9uIHAoKXt9dmFyIGc9cCx5PXAsYj1wLHY9cCx3PXAsbT1wLF89cDt2YXIgUz10LnBlcmZvcm1hbmNlfHx7fSxFPVMubm93fHxTLm1vek5vd3x8Uy5tc05vd3x8Uy5vTm93fHxTLndlYmtpdE5vd3x8ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUpLmdldFRpbWUoKX07dmFyIGs9bmV3IERhdGU7dmFyIFI9e25leHRUaWNrOmMsdGl0bGU6ImJyb3dzZXIiLGJyb3dzZXI6ITAsZW52Ont9LGFyZ3Y6W10sdmVyc2lvbjoiIix2ZXJzaW9uczp7fSxvbjpnLGFkZExpc3RlbmVyOnksb25jZTpiLG9mZjp2LHJlbW92ZUxpc3RlbmVyOncscmVtb3ZlQWxsTGlzdGVuZXJzOm0sZW1pdDpfLGJpbmRpbmc6ZnVuY3Rpb24odCl7dGhyb3cgbmV3IEVycm9yKCJwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCIpfSxjd2Q6ZnVuY3Rpb24oKXtyZXR1cm4iLyJ9LGNoZGlyOmZ1bmN0aW9uKHQpe3Rocm93IG5ldyBFcnJvcigicHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkIil9LHVtYXNrOmZ1bmN0aW9uKCl7cmV0dXJuIDB9LGhydGltZTpmdW5jdGlvbih0KXt2YXIgZT0uMDAxKkUuY2FsbChTKSxyPU1hdGguZmxvb3IoZSksbj1NYXRoLmZsb29yKGUlMSoxZTkpO3JldHVybiB0JiYoci09dFswXSwobi09dFsxXSk8MCYmKHItLSxuKz0xZTkpKSxbcixuXX0scGxhdGZvcm06ImJyb3dzZXIiLHJlbGVhc2U6e30sY29uZmlnOnt9LHVwdGltZTpmdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZS1rKS8xZTN9fSxqPSJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsVGhpcz9nbG9iYWxUaGlzOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzoidW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbD9nbG9iYWw6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6e307ZnVuY3Rpb24gVCh0KXtpZih0Ll9fZXNNb2R1bGUpcmV0dXJuIHQ7dmFyIGU9T2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtyZXR1cm4gT2JqZWN0LmtleXModCkuZm9yRWFjaCgoZnVuY3Rpb24ocil7dmFyIG49T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LHIpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIsbi5nZXQ/bjp7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdFtyXX19KX0pKSxlfWZ1bmN0aW9uIE8odCl7dmFyIGU9e2V4cG9ydHM6e319O3JldHVybiB0KGUsZS5leHBvcnRzKSxlLmV4cG9ydHN9dmFyIEE9TygoZnVuY3Rpb24odCl7dm9pZCAwPT09Unx8IVIudmVyc2lvbnx8MD09PVIudmVyc2lvbi5pbmRleE9mKCJ2MC4iKXx8MD09PVIudmVyc2lvbi5pbmRleE9mKCJ2MS4iKSYmMCE9PVIudmVyc2lvbi5pbmRleE9mKCJ2MS44LiIpP3QuZXhwb3J0cz17bmV4dFRpY2s6ZnVuY3Rpb24odCxlLHIsbil7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcignImNhbGxiYWNrIiBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTt2YXIgaSxvLGE9YXJndW1lbnRzLmxlbmd0aDtzd2l0Y2goYSl7Y2FzZSAwOmNhc2UgMTpyZXR1cm4gUi5uZXh0VGljayh0KTtjYXNlIDI6cmV0dXJuIFIubmV4dFRpY2soKGZ1bmN0aW9uKCl7dC5jYWxsKG51bGwsZSl9KSk7Y2FzZSAzOnJldHVybiBSLm5leHRUaWNrKChmdW5jdGlvbigpe3QuY2FsbChudWxsLGUscil9KSk7Y2FzZSA0OnJldHVybiBSLm5leHRUaWNrKChmdW5jdGlvbigpe3QuY2FsbChudWxsLGUscixuKX0pKTtkZWZhdWx0OmZvcihpPW5ldyBBcnJheShhLTEpLG89MDtvPGkubGVuZ3RoOylpW28rK109YXJndW1lbnRzW29dO3JldHVybiBSLm5leHRUaWNrKChmdW5jdGlvbigpe3QuYXBwbHkobnVsbCxpKX0pKX19fTp0LmV4cG9ydHM9Un0pKSxDPXt9LnRvU3RyaW5nLE09QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24odCl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09Qy5jYWxsKHQpfTtmdW5jdGlvbiB4KCl7fWZ1bmN0aW9uIEwoKXtMLmluaXQuY2FsbCh0aGlzKX1mdW5jdGlvbiBCKHQpe3JldHVybiB2b2lkIDA9PT10Ll9tYXhMaXN0ZW5lcnM/TC5kZWZhdWx0TWF4TGlzdGVuZXJzOnQuX21heExpc3RlbmVyc31mdW5jdGlvbiBQKHQsZSxyKXtpZihlKXQuY2FsbChyKTtlbHNlIGZvcih2YXIgbj10Lmxlbmd0aCxpPXoodCxuKSxvPTA7bzxuOysrbylpW29dLmNhbGwocil9ZnVuY3Rpb24gVSh0LGUscixuKXtpZihlKXQuY2FsbChyLG4pO2Vsc2UgZm9yKHZhciBpPXQubGVuZ3RoLG89eih0LGkpLGE9MDthPGk7KythKW9bYV0uY2FsbChyLG4pfWZ1bmN0aW9uIE4odCxlLHIsbixpKXtpZihlKXQuY2FsbChyLG4saSk7ZWxzZSBmb3IodmFyIG89dC5sZW5ndGgsYT16KHQsbykscz0wO3M8bzsrK3MpYVtzXS5jYWxsKHIsbixpKX1mdW5jdGlvbiBEKHQsZSxyLG4saSxvKXtpZihlKXQuY2FsbChyLG4saSxvKTtlbHNlIGZvcih2YXIgYT10Lmxlbmd0aCxzPXoodCxhKSx1PTA7dTxhOysrdSlzW3VdLmNhbGwocixuLGksbyl9ZnVuY3Rpb24gSSh0LGUscixuKXtpZihlKXQuYXBwbHkocixuKTtlbHNlIGZvcih2YXIgaT10Lmxlbmd0aCxvPXoodCxpKSxhPTA7YTxpOysrYSlvW2FdLmFwcGx5KHIsbil9ZnVuY3Rpb24gcSh0LGUscixuKXt2YXIgaSxvLGEscztpZigiZnVuY3Rpb24iIT10eXBlb2Ygcil0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdGVuZXIiIGFyZ3VtZW50IG11c3QgYmUgYSBmdW5jdGlvbicpO2lmKChvPXQuX2V2ZW50cyk/KG8ubmV3TGlzdGVuZXImJih0LmVtaXQoIm5ld0xpc3RlbmVyIixlLHIubGlzdGVuZXI/ci5saXN0ZW5lcjpyKSxvPXQuX2V2ZW50cyksYT1vW2VdKToobz10Ll9ldmVudHM9bmV3IHgsdC5fZXZlbnRzQ291bnQ9MCksYSl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGE/YT1vW2VdPW4/W3IsYV06W2Escl06bj9hLnVuc2hpZnQocik6YS5wdXNoKHIpLCFhLndhcm5lZCYmKGk9Qih0KSkmJmk+MCYmYS5sZW5ndGg+aSl7YS53YXJuZWQ9ITA7dmFyIHU9bmV3IEVycm9yKCJQb3NzaWJsZSBFdmVudEVtaXR0ZXIgbWVtb3J5IGxlYWsgZGV0ZWN0ZWQuICIrYS5sZW5ndGgrIiAiK2UrIiBsaXN0ZW5lcnMgYWRkZWQuIFVzZSBlbWl0dGVyLnNldE1heExpc3RlbmVycygpIHRvIGluY3JlYXNlIGxpbWl0Iik7dS5uYW1lPSJNYXhMaXN0ZW5lcnNFeGNlZWRlZFdhcm5pbmciLHUuZW1pdHRlcj10LHUudHlwZT1lLHUuY291bnQ9YS5sZW5ndGgscz11LCJmdW5jdGlvbiI9PXR5cGVvZiBjb25zb2xlLndhcm4/Y29uc29sZS53YXJuKHMpOmNvbnNvbGUubG9nKHMpfX1lbHNlIGE9b1tlXT1yLCsrdC5fZXZlbnRzQ291bnQ7cmV0dXJuIHR9ZnVuY3Rpb24gRih0LGUscil7dmFyIG49ITE7ZnVuY3Rpb24gaSgpe3QucmVtb3ZlTGlzdGVuZXIoZSxpKSxufHwobj0hMCxyLmFwcGx5KHQsYXJndW1lbnRzKSl9cmV0dXJuIGkubGlzdGVuZXI9cixpfWZ1bmN0aW9uIFcodCl7dmFyIGU9dGhpcy5fZXZlbnRzO2lmKGUpe3ZhciByPWVbdF07aWYoImZ1bmN0aW9uIj09dHlwZW9mIHIpcmV0dXJuIDE7aWYocilyZXR1cm4gci5sZW5ndGh9cmV0dXJuIDB9ZnVuY3Rpb24geih0LGUpe2Zvcih2YXIgcj1uZXcgQXJyYXkoZSk7ZS0tOylyW2VdPXRbZV07cmV0dXJuIHJ9eC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShudWxsKSxMLkV2ZW50RW1pdHRlcj1MLEwudXNpbmdEb21haW5zPSExLEwucHJvdG90eXBlLmRvbWFpbj12b2lkIDAsTC5wcm90b3R5cGUuX2V2ZW50cz12b2lkIDAsTC5wcm90b3R5cGUuX21heExpc3RlbmVycz12b2lkIDAsTC5kZWZhdWx0TWF4TGlzdGVuZXJzPTEwLEwuaW5pdD1mdW5jdGlvbigpe3RoaXMuZG9tYWluPW51bGwsTC51c2luZ0RvbWFpbnMmJnVuZGVmaW5lZC5hY3RpdmUsdGhpcy5fZXZlbnRzJiZ0aGlzLl9ldmVudHMhPT1PYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykuX2V2ZW50c3x8KHRoaXMuX2V2ZW50cz1uZXcgeCx0aGlzLl9ldmVudHNDb3VudD0wKSx0aGlzLl9tYXhMaXN0ZW5lcnM9dGhpcy5fbWF4TGlzdGVuZXJzfHx2b2lkIDB9LEwucHJvdG90eXBlLnNldE1heExpc3RlbmVycz1mdW5jdGlvbih0KXtpZigibnVtYmVyIiE9dHlwZW9mIHR8fHQ8MHx8aXNOYU4odCkpdGhyb3cgbmV3IFR5cGVFcnJvcignIm4iIGFyZ3VtZW50IG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXInKTtyZXR1cm4gdGhpcy5fbWF4TGlzdGVuZXJzPXQsdGhpc30sTC5wcm90b3R5cGUuZ2V0TWF4TGlzdGVuZXJzPWZ1bmN0aW9uKCl7cmV0dXJuIEIodGhpcyl9LEwucHJvdG90eXBlLmVtaXQ9ZnVuY3Rpb24odCl7dmFyIGUscixuLGksbyxhLHMsdT0iZXJyb3IiPT09dDtpZihhPXRoaXMuX2V2ZW50cyl1PXUmJm51bGw9PWEuZXJyb3I7ZWxzZSBpZighdSlyZXR1cm4hMTtpZihzPXRoaXMuZG9tYWluLHUpe2lmKGU9YXJndW1lbnRzWzFdLCFzKXtpZihlIGluc3RhbmNlb2YgRXJyb3IpdGhyb3cgZTt2YXIgZj1uZXcgRXJyb3IoJ1VuY2F1Z2h0LCB1bnNwZWNpZmllZCAiZXJyb3IiIGV2ZW50LiAoJytlKyIpIik7dGhyb3cgZi5jb250ZXh0PWUsZn1yZXR1cm4gZXx8KGU9bmV3IEVycm9yKCdVbmNhdWdodCwgdW5zcGVjaWZpZWQgImVycm9yIiBldmVudCcpKSxlLmRvbWFpbkVtaXR0ZXI9dGhpcyxlLmRvbWFpbj1zLGUuZG9tYWluVGhyb3duPSExLHMuZW1pdCgiZXJyb3IiLGUpLCExfWlmKCEocj1hW3RdKSlyZXR1cm4hMTt2YXIgaD0iZnVuY3Rpb24iPT10eXBlb2Ygcjtzd2l0Y2gobj1hcmd1bWVudHMubGVuZ3RoKXtjYXNlIDE6UChyLGgsdGhpcyk7YnJlYWs7Y2FzZSAyOlUocixoLHRoaXMsYXJndW1lbnRzWzFdKTticmVhaztjYXNlIDM6TihyLGgsdGhpcyxhcmd1bWVudHNbMV0sYXJndW1lbnRzWzJdKTticmVhaztjYXNlIDQ6RChyLGgsdGhpcyxhcmd1bWVudHNbMV0sYXJndW1lbnRzWzJdLGFyZ3VtZW50c1szXSk7YnJlYWs7ZGVmYXVsdDpmb3IoaT1uZXcgQXJyYXkobi0xKSxvPTE7bzxuO28rKylpW28tMV09YXJndW1lbnRzW29dO0kocixoLHRoaXMsaSl9cmV0dXJuITB9LEwucHJvdG90eXBlLmFkZExpc3RlbmVyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHEodGhpcyx0LGUsITEpfSxMLnByb3RvdHlwZS5vbj1MLnByb3RvdHlwZS5hZGRMaXN0ZW5lcixMLnByb3RvdHlwZS5wcmVwZW5kTGlzdGVuZXI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gcSh0aGlzLHQsZSwhMCl9LEwucHJvdG90eXBlLm9uY2U9ZnVuY3Rpb24odCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdGVuZXIiIGFyZ3VtZW50IG11c3QgYmUgYSBmdW5jdGlvbicpO3JldHVybiB0aGlzLm9uKHQsRih0aGlzLHQsZSkpLHRoaXN9LEwucHJvdG90eXBlLnByZXBlbmRPbmNlTGlzdGVuZXI9ZnVuY3Rpb24odCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdGVuZXIiIGFyZ3VtZW50IG11c3QgYmUgYSBmdW5jdGlvbicpO3JldHVybiB0aGlzLnByZXBlbmRMaXN0ZW5lcih0LEYodGhpcyx0LGUpKSx0aGlzfSxMLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lcj1mdW5jdGlvbih0LGUpe3ZhciByLG4saSxvLGE7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3RlbmVyIiBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtpZighKG49dGhpcy5fZXZlbnRzKSlyZXR1cm4gdGhpcztpZighKHI9blt0XSkpcmV0dXJuIHRoaXM7aWYocj09PWV8fHIubGlzdGVuZXImJnIubGlzdGVuZXI9PT1lKTA9PS0tdGhpcy5fZXZlbnRzQ291bnQ/dGhpcy5fZXZlbnRzPW5ldyB4OihkZWxldGUgblt0XSxuLnJlbW92ZUxpc3RlbmVyJiZ0aGlzLmVtaXQoInJlbW92ZUxpc3RlbmVyIix0LHIubGlzdGVuZXJ8fGUpKTtlbHNlIGlmKCJmdW5jdGlvbiIhPXR5cGVvZiByKXtmb3IoaT0tMSxvPXIubGVuZ3RoO28tLSA+MDspaWYocltvXT09PWV8fHJbb10ubGlzdGVuZXImJnJbb10ubGlzdGVuZXI9PT1lKXthPXJbb10ubGlzdGVuZXIsaT1vO2JyZWFrfWlmKGk8MClyZXR1cm4gdGhpcztpZigxPT09ci5sZW5ndGgpe2lmKHJbMF09dm9pZCAwLDA9PS0tdGhpcy5fZXZlbnRzQ291bnQpcmV0dXJuIHRoaXMuX2V2ZW50cz1uZXcgeCx0aGlzO2RlbGV0ZSBuW3RdfWVsc2UhZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9ZSxuPXIrMSxpPXQubGVuZ3RoO248aTtyKz0xLG4rPTEpdFtyXT10W25dO3QucG9wKCl9KHIsaSk7bi5yZW1vdmVMaXN0ZW5lciYmdGhpcy5lbWl0KCJyZW1vdmVMaXN0ZW5lciIsdCxhfHxlKX1yZXR1cm4gdGhpc30sTC5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzPWZ1bmN0aW9uKHQpe3ZhciBlLHI7aWYoIShyPXRoaXMuX2V2ZW50cykpcmV0dXJuIHRoaXM7aWYoIXIucmVtb3ZlTGlzdGVuZXIpcmV0dXJuIDA9PT1hcmd1bWVudHMubGVuZ3RoPyh0aGlzLl9ldmVudHM9bmV3IHgsdGhpcy5fZXZlbnRzQ291bnQ9MCk6clt0XSYmKDA9PS0tdGhpcy5fZXZlbnRzQ291bnQ/dGhpcy5fZXZlbnRzPW5ldyB4OmRlbGV0ZSByW3RdKSx0aGlzO2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXtmb3IodmFyIG4saT1PYmplY3Qua2V5cyhyKSxvPTA7bzxpLmxlbmd0aDsrK28pInJlbW92ZUxpc3RlbmVyIiE9PShuPWlbb10pJiZ0aGlzLnJlbW92ZUFsbExpc3RlbmVycyhuKTtyZXR1cm4gdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoInJlbW92ZUxpc3RlbmVyIiksdGhpcy5fZXZlbnRzPW5ldyB4LHRoaXMuX2V2ZW50c0NvdW50PTAsdGhpc31pZigiZnVuY3Rpb24iPT10eXBlb2YoZT1yW3RdKSl0aGlzLnJlbW92ZUxpc3RlbmVyKHQsZSk7ZWxzZSBpZihlKWRve3RoaXMucmVtb3ZlTGlzdGVuZXIodCxlW2UubGVuZ3RoLTFdKX13aGlsZShlWzBdKTtyZXR1cm4gdGhpc30sTC5wcm90b3R5cGUubGlzdGVuZXJzPWZ1bmN0aW9uKHQpe3ZhciBlLHI9dGhpcy5fZXZlbnRzO3JldHVybiByJiYoZT1yW3RdKT8iZnVuY3Rpb24iPT10eXBlb2YgZT9bZS5saXN0ZW5lcnx8ZV06ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW5ldyBBcnJheSh0Lmxlbmd0aCkscj0wO3I8ZS5sZW5ndGg7KytyKWVbcl09dFtyXS5saXN0ZW5lcnx8dFtyXTtyZXR1cm4gZX0oZSk6W119LEwubGlzdGVuZXJDb3VudD1mdW5jdGlvbih0LGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0Lmxpc3RlbmVyQ291bnQ/dC5saXN0ZW5lckNvdW50KGUpOlcuY2FsbCh0LGUpfSxMLnByb3RvdHlwZS5saXN0ZW5lckNvdW50PVcsTC5wcm90b3R5cGUuZXZlbnROYW1lcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ldmVudHNDb3VudD4wP1JlZmxlY3Qub3duS2V5cyh0aGlzLl9ldmVudHMpOltdfTt2YXIgWT1UKE9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGRlZmF1bHQ6TCxFdmVudEVtaXR0ZXI6TH0pKSwkPVkuRXZlbnRFbWl0dGVyLEg9W10sSj1bXSxHPSJ1bmRlZmluZWQiIT10eXBlb2YgVWludDhBcnJheT9VaW50OEFycmF5OkFycmF5LFY9ITE7ZnVuY3Rpb24gSygpe1Y9ITA7Zm9yKHZhciB0PSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIixlPTAscj10Lmxlbmd0aDtlPHI7KytlKUhbZV09dFtlXSxKW3QuY2hhckNvZGVBdChlKV09ZTtKWyItIi5jaGFyQ29kZUF0KDApXT02MixKWyJfIi5jaGFyQ29kZUF0KDApXT02M31mdW5jdGlvbiBaKHQsZSxyKXtmb3IodmFyIG4saSxvPVtdLGE9ZTthPHI7YSs9MyluPSh0W2FdPDwxNikrKHRbYSsxXTw8OCkrdFthKzJdLG8ucHVzaChIWyhpPW4pPj4xOCY2M10rSFtpPj4xMiY2M10rSFtpPj42JjYzXStIWzYzJmldKTtyZXR1cm4gby5qb2luKCIiKX1mdW5jdGlvbiBYKHQpe3ZhciBlO1Z8fEsoKTtmb3IodmFyIHI9dC5sZW5ndGgsbj1yJTMsaT0iIixvPVtdLGE9MTYzODMscz0wLHU9ci1uO3M8dTtzKz1hKW8ucHVzaChaKHQscyxzK2E+dT91OnMrYSkpO3JldHVybiAxPT09bj8oZT10W3ItMV0saSs9SFtlPj4yXSxpKz1IW2U8PDQmNjNdLGkrPSI9PSIpOjI9PT1uJiYoZT0odFtyLTJdPDw4KSt0W3ItMV0saSs9SFtlPj4xMF0saSs9SFtlPj40JjYzXSxpKz1IW2U8PDImNjNdLGkrPSI9Iiksby5wdXNoKGkpLG8uam9pbigiIil9ZnVuY3Rpb24gUSh0LGUscixuLGkpe3ZhciBvLGEscz04Kmktbi0xLHU9KDE8PHMpLTEsZj11Pj4xLGg9LTcsbD1yP2ktMTowLGM9cj8tMToxLGQ9dFtlK2xdO2ZvcihsKz1jLG89ZCYoMTw8LWgpLTEsZD4+PS1oLGgrPXM7aD4wO289MjU2Km8rdFtlK2xdLGwrPWMsaC09OCk7Zm9yKGE9byYoMTw8LWgpLTEsbz4+PS1oLGgrPW47aD4wO2E9MjU2KmErdFtlK2xdLGwrPWMsaC09OCk7aWYoMD09PW8pbz0xLWY7ZWxzZXtpZihvPT09dSlyZXR1cm4gYT9OYU46MS8wKihkPy0xOjEpO2ErPU1hdGgucG93KDIsbiksby09Zn1yZXR1cm4oZD8tMToxKSphKk1hdGgucG93KDIsby1uKX1mdW5jdGlvbiB0dCh0LGUscixuLGksbyl7dmFyIGEscyx1LGY9OCpvLWktMSxoPSgxPDxmKS0xLGw9aD4+MSxjPTIzPT09aT9NYXRoLnBvdygyLC0yNCktTWF0aC5wb3coMiwtNzcpOjAsZD1uPzA6by0xLHA9bj8xOi0xLGc9ZTwwfHwwPT09ZSYmMS9lPDA/MTowO2ZvcihlPU1hdGguYWJzKGUpLGlzTmFOKGUpfHxlPT09MS8wPyhzPWlzTmFOKGUpPzE6MCxhPWgpOihhPU1hdGguZmxvb3IoTWF0aC5sb2coZSkvTWF0aC5MTjIpLGUqKHU9TWF0aC5wb3coMiwtYSkpPDEmJihhLS0sdSo9MiksKGUrPWErbD49MT9jL3U6YypNYXRoLnBvdygyLDEtbCkpKnU+PTImJihhKyssdS89MiksYStsPj1oPyhzPTAsYT1oKTphK2w+PTE/KHM9KGUqdS0xKSpNYXRoLnBvdygyLGkpLGErPWwpOihzPWUqTWF0aC5wb3coMixsLTEpKk1hdGgucG93KDIsaSksYT0wKSk7aT49ODt0W3IrZF09MjU1JnMsZCs9cCxzLz0yNTYsaS09OCk7Zm9yKGE9YTw8aXxzLGYrPWk7Zj4wO3RbcitkXT0yNTUmYSxkKz1wLGEvPTI1NixmLT04KTt0W3IrZC1wXXw9MTI4Kmd9dmFyIGV0PXt9LnRvU3RyaW5nLHJ0PUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKHQpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PWV0LmNhbGwodCl9O2F0LlRZUEVEX0FSUkFZX1NVUFBPUlQ9dm9pZCAwPT09dC5UWVBFRF9BUlJBWV9TVVBQT1JUfHx0LlRZUEVEX0FSUkFZX1NVUFBPUlQ7dmFyIG50PWl0KCk7ZnVuY3Rpb24gaXQoKXtyZXR1cm4gYXQuVFlQRURfQVJSQVlfU1VQUE9SVD8yMTQ3NDgzNjQ3OjEwNzM3NDE4MjN9ZnVuY3Rpb24gb3QodCxlKXtpZihpdCgpPGUpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkludmFsaWQgdHlwZWQgYXJyYXkgbGVuZ3RoIik7cmV0dXJuIGF0LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHQ9bmV3IFVpbnQ4QXJyYXkoZSkpLl9fcHJvdG9fXz1hdC5wcm90b3R5cGU6KG51bGw9PT10JiYodD1uZXcgYXQoZSkpLHQubGVuZ3RoPWUpLHR9ZnVuY3Rpb24gYXQodCxlLHIpe2lmKCEoYXQuVFlQRURfQVJSQVlfU1VQUE9SVHx8dGhpcyBpbnN0YW5jZW9mIGF0KSlyZXR1cm4gbmV3IGF0KHQsZSxyKTtpZigibnVtYmVyIj09dHlwZW9mIHQpe2lmKCJzdHJpbmciPT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3IoIklmIGVuY29kaW5nIGlzIHNwZWNpZmllZCB0aGVuIHRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nIik7cmV0dXJuIGZ0KHRoaXMsdCl9cmV0dXJuIHN0KHRoaXMsdCxlLHIpfWZ1bmN0aW9uIHN0KHQsZSxyLG4pe2lmKCJudW1iZXIiPT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCcidmFsdWUiIGFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJyk7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyP2Z1bmN0aW9uKHQsZSxyLG4pe2lmKGUuYnl0ZUxlbmd0aCxyPDB8fGUuYnl0ZUxlbmd0aDxyKXRocm93IG5ldyBSYW5nZUVycm9yKCInb2Zmc2V0JyBpcyBvdXQgb2YgYm91bmRzIik7aWYoZS5ieXRlTGVuZ3RoPHIrKG58fDApKXRocm93IG5ldyBSYW5nZUVycm9yKCInbGVuZ3RoJyBpcyBvdXQgb2YgYm91bmRzIik7ZT12b2lkIDA9PT1yJiZ2b2lkIDA9PT1uP25ldyBVaW50OEFycmF5KGUpOnZvaWQgMD09PW4/bmV3IFVpbnQ4QXJyYXkoZSxyKTpuZXcgVWludDhBcnJheShlLHIsbik7YXQuVFlQRURfQVJSQVlfU1VQUE9SVD8odD1lKS5fX3Byb3RvX189YXQucHJvdG90eXBlOnQ9aHQodCxlKTtyZXR1cm4gdH0odCxlLHIsbik6InN0cmluZyI9PXR5cGVvZiBlP2Z1bmN0aW9uKHQsZSxyKXsic3RyaW5nIj09dHlwZW9mIHImJiIiIT09cnx8KHI9InV0ZjgiKTtpZighYXQuaXNFbmNvZGluZyhyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCciZW5jb2RpbmciIG11c3QgYmUgYSB2YWxpZCBzdHJpbmcgZW5jb2RpbmcnKTt2YXIgbj0wfGR0KGUsciksaT0odD1vdCh0LG4pKS53cml0ZShlLHIpO2khPT1uJiYodD10LnNsaWNlKDAsaSkpO3JldHVybiB0fSh0LGUscik6ZnVuY3Rpb24odCxlKXtpZihjdChlKSl7dmFyIHI9MHxsdChlLmxlbmd0aCk7cmV0dXJuIDA9PT0odD1vdCh0LHIpKS5sZW5ndGh8fGUuY29weSh0LDAsMCxyKSx0fWlmKGUpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJmUuYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXJ8fCJsZW5ndGgiaW4gZSlyZXR1cm4ibnVtYmVyIiE9dHlwZW9mIGUubGVuZ3RofHwobj1lLmxlbmd0aCkhPW4/b3QodCwwKTpodCh0LGUpO2lmKCJCdWZmZXIiPT09ZS50eXBlJiZydChlLmRhdGEpKXJldHVybiBodCh0LGUuZGF0YSl9dmFyIG47dGhyb3cgbmV3IFR5cGVFcnJvcigiRmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksIG9yIGFycmF5LWxpa2Ugb2JqZWN0LiIpfSh0LGUpfWZ1bmN0aW9uIHV0KHQpe2lmKCJudW1iZXIiIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCcic2l6ZSIgYXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpO2lmKHQ8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcignInNpemUiIGFyZ3VtZW50IG11c3Qgbm90IGJlIG5lZ2F0aXZlJyl9ZnVuY3Rpb24gZnQodCxlKXtpZih1dChlKSx0PW90KHQsZTwwPzA6MHxsdChlKSksIWF0LlRZUEVEX0FSUkFZX1NVUFBPUlQpZm9yKHZhciByPTA7cjxlOysrcil0W3JdPTA7cmV0dXJuIHR9ZnVuY3Rpb24gaHQodCxlKXt2YXIgcj1lLmxlbmd0aDwwPzA6MHxsdChlLmxlbmd0aCk7dD1vdCh0LHIpO2Zvcih2YXIgbj0wO248cjtuKz0xKXRbbl09MjU1JmVbbl07cmV0dXJuIHR9ZnVuY3Rpb24gbHQodCl7aWYodD49aXQoKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXR0ZW1wdCB0byBhbGxvY2F0ZSBCdWZmZXIgbGFyZ2VyIHRoYW4gbWF4aW11bSBzaXplOiAweCIraXQoKS50b1N0cmluZygxNikrIiBieXRlcyIpO3JldHVybiAwfHR9ZnVuY3Rpb24gY3QodCl7cmV0dXJuIShudWxsPT10fHwhdC5faXNCdWZmZXIpfWZ1bmN0aW9uIGR0KHQsZSl7aWYoY3QodCkpcmV0dXJuIHQubGVuZ3RoO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJiJmdW5jdGlvbiI9PXR5cGVvZiBBcnJheUJ1ZmZlci5pc1ZpZXcmJihBcnJheUJ1ZmZlci5pc1ZpZXcodCl8fHQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikpcmV0dXJuIHQuYnl0ZUxlbmd0aDsic3RyaW5nIiE9dHlwZW9mIHQmJih0PSIiK3QpO3ZhciByPXQubGVuZ3RoO2lmKDA9PT1yKXJldHVybiAwO2Zvcih2YXIgbj0hMTs7KXN3aXRjaChlKXtjYXNlImFzY2lpIjpjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiByO2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6Y2FzZSB2b2lkIDA6cmV0dXJuIEl0KHQpLmxlbmd0aDtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuIDIqcjtjYXNlImhleCI6cmV0dXJuIHI+Pj4xO2Nhc2UiYmFzZTY0IjpyZXR1cm4gcXQodCkubGVuZ3RoO2RlZmF1bHQ6aWYobilyZXR1cm4gSXQodCkubGVuZ3RoO2U9KCIiK2UpLnRvTG93ZXJDYXNlKCksbj0hMH19ZnVuY3Rpb24gcHQodCxlLHIpe3ZhciBuPSExO2lmKCh2b2lkIDA9PT1lfHxlPDApJiYoZT0wKSxlPnRoaXMubGVuZ3RoKXJldHVybiIiO2lmKCh2b2lkIDA9PT1yfHxyPnRoaXMubGVuZ3RoKSYmKHI9dGhpcy5sZW5ndGgpLHI8PTApcmV0dXJuIiI7aWYoKHI+Pj49MCk8PShlPj4+PTApKXJldHVybiIiO2Zvcih0fHwodD0idXRmOCIpOzspc3dpdGNoKHQpe2Nhc2UiaGV4IjpyZXR1cm4gT3QodGhpcyxlLHIpO2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6cmV0dXJuIFJ0KHRoaXMsZSxyKTtjYXNlImFzY2lpIjpyZXR1cm4ganQodGhpcyxlLHIpO2Nhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIFR0KHRoaXMsZSxyKTtjYXNlImJhc2U2NCI6cmV0dXJuIGt0KHRoaXMsZSxyKTtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuIEF0KHRoaXMsZSxyKTtkZWZhdWx0OmlmKG4pdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIit0KTt0PSh0KyIiKS50b0xvd2VyQ2FzZSgpLG49ITB9fWZ1bmN0aW9uIGd0KHQsZSxyKXt2YXIgbj10W2VdO3RbZV09dFtyXSx0W3JdPW59ZnVuY3Rpb24geXQodCxlLHIsbixpKXtpZigwPT09dC5sZW5ndGgpcmV0dXJuLTE7aWYoInN0cmluZyI9PXR5cGVvZiByPyhuPXIscj0wKTpyPjIxNDc0ODM2NDc/cj0yMTQ3NDgzNjQ3OnI8LTIxNDc0ODM2NDgmJihyPS0yMTQ3NDgzNjQ4KSxyPStyLGlzTmFOKHIpJiYocj1pPzA6dC5sZW5ndGgtMSkscjwwJiYocj10Lmxlbmd0aCtyKSxyPj10Lmxlbmd0aCl7aWYoaSlyZXR1cm4tMTtyPXQubGVuZ3RoLTF9ZWxzZSBpZihyPDApe2lmKCFpKXJldHVybi0xO3I9MH1pZigic3RyaW5nIj09dHlwZW9mIGUmJihlPWF0LmZyb20oZSxuKSksY3QoZSkpcmV0dXJuIDA9PT1lLmxlbmd0aD8tMTpidCh0LGUscixuLGkpO2lmKCJudW1iZXIiPT10eXBlb2YgZSlyZXR1cm4gZSY9MjU1LGF0LlRZUEVEX0FSUkFZX1NVUFBPUlQmJiJmdW5jdGlvbiI9PXR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mP2k/VWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKHQsZSxyKTpVaW50OEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZi5jYWxsKHQsZSxyKTpidCh0LFtlXSxyLG4saSk7dGhyb3cgbmV3IFR5cGVFcnJvcigidmFsIG11c3QgYmUgc3RyaW5nLCBudW1iZXIgb3IgQnVmZmVyIil9ZnVuY3Rpb24gYnQodCxlLHIsbixpKXt2YXIgbyxhPTEscz10Lmxlbmd0aCx1PWUubGVuZ3RoO2lmKHZvaWQgMCE9PW4mJigidWNzMiI9PT0obj1TdHJpbmcobikudG9Mb3dlckNhc2UoKSl8fCJ1Y3MtMiI9PT1ufHwidXRmMTZsZSI9PT1ufHwidXRmLTE2bGUiPT09bikpe2lmKHQubGVuZ3RoPDJ8fGUubGVuZ3RoPDIpcmV0dXJuLTE7YT0yLHMvPTIsdS89MixyLz0yfWZ1bmN0aW9uIGYodCxlKXtyZXR1cm4gMT09PWE/dFtlXTp0LnJlYWRVSW50MTZCRShlKmEpfWlmKGkpe3ZhciBoPS0xO2ZvcihvPXI7bzxzO28rKylpZihmKHQsbyk9PT1mKGUsLTE9PT1oPzA6by1oKSl7aWYoLTE9PT1oJiYoaD1vKSxvLWgrMT09PXUpcmV0dXJuIGgqYX1lbHNlLTEhPT1oJiYoby09by1oKSxoPS0xfWVsc2UgZm9yKHIrdT5zJiYocj1zLXUpLG89cjtvPj0wO28tLSl7Zm9yKHZhciBsPSEwLGM9MDtjPHU7YysrKWlmKGYodCxvK2MpIT09ZihlLGMpKXtsPSExO2JyZWFrfWlmKGwpcmV0dXJuIG99cmV0dXJuLTF9ZnVuY3Rpb24gdnQodCxlLHIsbil7cj1OdW1iZXIocil8fDA7dmFyIGk9dC5sZW5ndGgtcjtuPyhuPU51bWJlcihuKSk+aSYmKG49aSk6bj1pO3ZhciBvPWUubGVuZ3RoO2lmKG8lMiE9MCl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGhleCBzdHJpbmciKTtuPm8vMiYmKG49by8yKTtmb3IodmFyIGE9MDthPG47KythKXt2YXIgcz1wYXJzZUludChlLnN1YnN0cigyKmEsMiksMTYpO2lmKGlzTmFOKHMpKXJldHVybiBhO3RbcithXT1zfXJldHVybiBhfWZ1bmN0aW9uIHd0KHQsZSxyLG4pe3JldHVybiBGdChJdChlLHQubGVuZ3RoLXIpLHQscixuKX1mdW5jdGlvbiBtdCh0LGUscixuKXtyZXR1cm4gRnQoZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLHI9MDtyPHQubGVuZ3RoOysrcillLnB1c2goMjU1JnQuY2hhckNvZGVBdChyKSk7cmV0dXJuIGV9KGUpLHQscixuKX1mdW5jdGlvbiBfdCh0LGUscixuKXtyZXR1cm4gbXQodCxlLHIsbil9ZnVuY3Rpb24gU3QodCxlLHIsbil7cmV0dXJuIEZ0KHF0KGUpLHQscixuKX1mdW5jdGlvbiBFdCh0LGUscixuKXtyZXR1cm4gRnQoZnVuY3Rpb24odCxlKXtmb3IodmFyIHIsbixpLG89W10sYT0wO2E8dC5sZW5ndGgmJiEoKGUtPTIpPDApOysrYSluPShyPXQuY2hhckNvZGVBdChhKSk+PjgsaT1yJTI1NixvLnB1c2goaSksby5wdXNoKG4pO3JldHVybiBvfShlLHQubGVuZ3RoLXIpLHQscixuKX1mdW5jdGlvbiBrdCh0LGUscil7cmV0dXJuIDA9PT1lJiZyPT09dC5sZW5ndGg/WCh0KTpYKHQuc2xpY2UoZSxyKSl9ZnVuY3Rpb24gUnQodCxlLHIpe3I9TWF0aC5taW4odC5sZW5ndGgscik7Zm9yKHZhciBuPVtdLGk9ZTtpPHI7KXt2YXIgbyxhLHMsdSxmPXRbaV0saD1udWxsLGw9Zj4yMzk/NDpmPjIyMz8zOmY+MTkxPzI6MTtpZihpK2w8PXIpc3dpdGNoKGwpe2Nhc2UgMTpmPDEyOCYmKGg9Zik7YnJlYWs7Y2FzZSAyOjEyOD09KDE5MiYobz10W2krMV0pKSYmKHU9KDMxJmYpPDw2fDYzJm8pPjEyNyYmKGg9dSk7YnJlYWs7Y2FzZSAzOm89dFtpKzFdLGE9dFtpKzJdLDEyOD09KDE5MiZvKSYmMTI4PT0oMTkyJmEpJiYodT0oMTUmZik8PDEyfCg2MyZvKTw8Nnw2MyZhKT4yMDQ3JiYodTw1NTI5Nnx8dT41NzM0MykmJihoPXUpO2JyZWFrO2Nhc2UgNDpvPXRbaSsxXSxhPXRbaSsyXSxzPXRbaSszXSwxMjg9PSgxOTImbykmJjEyOD09KDE5MiZhKSYmMTI4PT0oMTkyJnMpJiYodT0oMTUmZik8PDE4fCg2MyZvKTw8MTJ8KDYzJmEpPDw2fDYzJnMpPjY1NTM1JiZ1PDExMTQxMTImJihoPXUpfW51bGw9PT1oPyhoPTY1NTMzLGw9MSk6aD42NTUzNSYmKGgtPTY1NTM2LG4ucHVzaChoPj4+MTAmMTAyM3w1NTI5NiksaD01NjMyMHwxMDIzJmgpLG4ucHVzaChoKSxpKz1sfXJldHVybiBmdW5jdGlvbih0KXt2YXIgZT10Lmxlbmd0aDtpZihlPD00MDk2KXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyx0KTt2YXIgcj0iIixuPTA7Zm9yKDtuPGU7KXIrPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLHQuc2xpY2UobixuKz00MDk2KSk7cmV0dXJuIHJ9KG4pfWF0LnBvb2xTaXplPTgxOTIsYXQuX2F1Z21lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQuX19wcm90b19fPWF0LnByb3RvdHlwZSx0fSxhdC5mcm9tPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gc3QobnVsbCx0LGUscil9LGF0LlRZUEVEX0FSUkFZX1NVUFBPUlQmJihhdC5wcm90b3R5cGUuX19wcm90b19fPVVpbnQ4QXJyYXkucHJvdG90eXBlLGF0Ll9fcHJvdG9fXz1VaW50OEFycmF5KSxhdC5hbGxvYz1mdW5jdGlvbih0LGUscil7cmV0dXJuIGZ1bmN0aW9uKHQsZSxyLG4pe3JldHVybiB1dChlKSxlPD0wP290KHQsZSk6dm9pZCAwIT09cj8ic3RyaW5nIj09dHlwZW9mIG4/b3QodCxlKS5maWxsKHIsbik6b3QodCxlKS5maWxsKHIpOm90KHQsZSl9KG51bGwsdCxlLHIpfSxhdC5hbGxvY1Vuc2FmZT1mdW5jdGlvbih0KXtyZXR1cm4gZnQobnVsbCx0KX0sYXQuYWxsb2NVbnNhZmVTbG93PWZ1bmN0aW9uKHQpe3JldHVybiBmdChudWxsLHQpfSxhdC5pc0J1ZmZlcj1XdCxhdC5jb21wYXJlPWZ1bmN0aW9uKHQsZSl7aWYoIWN0KHQpfHwhY3QoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnRzIG11c3QgYmUgQnVmZmVycyIpO2lmKHQ9PT1lKXJldHVybiAwO2Zvcih2YXIgcj10Lmxlbmd0aCxuPWUubGVuZ3RoLGk9MCxvPU1hdGgubWluKHIsbik7aTxvOysraSlpZih0W2ldIT09ZVtpXSl7cj10W2ldLG49ZVtpXTticmVha31yZXR1cm4gcjxuPy0xOm48cj8xOjB9LGF0LmlzRW5jb2Rpbmc9ZnVuY3Rpb24odCl7c3dpdGNoKFN0cmluZyh0KS50b0xvd2VyQ2FzZSgpKXtjYXNlImhleCI6Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpjYXNlImFzY2lpIjpjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOmNhc2UiYmFzZTY0IjpjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19LGF0LmNvbmNhdD1mdW5jdGlvbih0LGUpe2lmKCFydCh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJyk7aWYoMD09PXQubGVuZ3RoKXJldHVybiBhdC5hbGxvYygwKTt2YXIgcjtpZih2b2lkIDA9PT1lKWZvcihlPTAscj0wO3I8dC5sZW5ndGg7KytyKWUrPXRbcl0ubGVuZ3RoO3ZhciBuPWF0LmFsbG9jVW5zYWZlKGUpLGk9MDtmb3Iocj0wO3I8dC5sZW5ndGg7KytyKXt2YXIgbz10W3JdO2lmKCFjdChvKSl0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJyk7by5jb3B5KG4saSksaSs9by5sZW5ndGh9cmV0dXJuIG59LGF0LmJ5dGVMZW5ndGg9ZHQsYXQucHJvdG90eXBlLl9pc0J1ZmZlcj0hMCxhdC5wcm90b3R5cGUuc3dhcDE2PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5sZW5ndGg7aWYodCUyIT0wKXRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYtYml0cyIpO2Zvcih2YXIgZT0wO2U8dDtlKz0yKWd0KHRoaXMsZSxlKzEpO3JldHVybiB0aGlzfSxhdC5wcm90b3R5cGUuc3dhcDMyPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5sZW5ndGg7aWYodCU0IT0wKXRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMzItYml0cyIpO2Zvcih2YXIgZT0wO2U8dDtlKz00KWd0KHRoaXMsZSxlKzMpLGd0KHRoaXMsZSsxLGUrMik7cmV0dXJuIHRoaXN9LGF0LnByb3RvdHlwZS5zd2FwNjQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmxlbmd0aDtpZih0JTghPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA2NC1iaXRzIik7Zm9yKHZhciBlPTA7ZTx0O2UrPTgpZ3QodGhpcyxlLGUrNyksZ3QodGhpcyxlKzEsZSs2KSxndCh0aGlzLGUrMixlKzUpLGd0KHRoaXMsZSszLGUrNCk7cmV0dXJuIHRoaXN9LGF0LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3ZhciB0PTB8dGhpcy5sZW5ndGg7cmV0dXJuIDA9PT10PyIiOjA9PT1hcmd1bWVudHMubGVuZ3RoP1J0KHRoaXMsMCx0KTpwdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGF0LnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7aWYoIWN0KHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIiKTtyZXR1cm4gdGhpcz09PXR8fDA9PT1hdC5jb21wYXJlKHRoaXMsdCl9LGF0LnByb3RvdHlwZS5pbnNwZWN0PWZ1bmN0aW9uKCl7dmFyIHQ9IiI7cmV0dXJuIHRoaXMubGVuZ3RoPjAmJih0PXRoaXMudG9TdHJpbmcoImhleCIsMCw1MCkubWF0Y2goLy57Mn0vZykuam9pbigiICIpLHRoaXMubGVuZ3RoPjUwJiYodCs9IiAuLi4gIikpLCI8QnVmZmVyICIrdCsiPiJ9LGF0LnByb3RvdHlwZS5jb21wYXJlPWZ1bmN0aW9uKHQsZSxyLG4saSl7aWYoIWN0KHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIiKTtpZih2b2lkIDA9PT1lJiYoZT0wKSx2b2lkIDA9PT1yJiYocj10P3QubGVuZ3RoOjApLHZvaWQgMD09PW4mJihuPTApLHZvaWQgMD09PWkmJihpPXRoaXMubGVuZ3RoKSxlPDB8fHI+dC5sZW5ndGh8fG48MHx8aT50aGlzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigib3V0IG9mIHJhbmdlIGluZGV4Iik7aWYobj49aSYmZT49cilyZXR1cm4gMDtpZihuPj1pKXJldHVybi0xO2lmKGU+PXIpcmV0dXJuIDE7aWYodGhpcz09PXQpcmV0dXJuIDA7Zm9yKHZhciBvPShpPj4+PTApLShuPj4+PTApLGE9KHI+Pj49MCktKGU+Pj49MCkscz1NYXRoLm1pbihvLGEpLHU9dGhpcy5zbGljZShuLGkpLGY9dC5zbGljZShlLHIpLGg9MDtoPHM7KytoKWlmKHVbaF0hPT1mW2hdKXtvPXVbaF0sYT1mW2hdO2JyZWFrfXJldHVybiBvPGE/LTE6YTxvPzE6MH0sYXQucHJvdG90eXBlLmluY2x1ZGVzPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4tMSE9PXRoaXMuaW5kZXhPZih0LGUscil9LGF0LnByb3RvdHlwZS5pbmRleE9mPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4geXQodGhpcyx0LGUsciwhMCl9LGF0LnByb3RvdHlwZS5sYXN0SW5kZXhPZj1mdW5jdGlvbih0LGUscil7cmV0dXJuIHl0KHRoaXMsdCxlLHIsITEpfSxhdC5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24odCxlLHIsbil7aWYodm9pZCAwPT09ZSluPSJ1dGY4IixyPXRoaXMubGVuZ3RoLGU9MDtlbHNlIGlmKHZvaWQgMD09PXImJiJzdHJpbmciPT10eXBlb2YgZSluPWUscj10aGlzLmxlbmd0aCxlPTA7ZWxzZXtpZighaXNGaW5pdGUoZSkpdGhyb3cgbmV3IEVycm9yKCJCdWZmZXIud3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0WywgbGVuZ3RoXSkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCIpO2V8PTAsaXNGaW5pdGUocik/KHJ8PTAsdm9pZCAwPT09biYmKG49InV0ZjgiKSk6KG49cixyPXZvaWQgMCl9dmFyIGk9dGhpcy5sZW5ndGgtZTtpZigodm9pZCAwPT09cnx8cj5pKSYmKHI9aSksdC5sZW5ndGg+MCYmKHI8MHx8ZTwwKXx8ZT50aGlzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXR0ZW1wdCB0byB3cml0ZSBvdXRzaWRlIGJ1ZmZlciBib3VuZHMiKTtufHwobj0idXRmOCIpO2Zvcih2YXIgbz0hMTs7KXN3aXRjaChuKXtjYXNlImhleCI6cmV0dXJuIHZ0KHRoaXMsdCxlLHIpO2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6cmV0dXJuIHd0KHRoaXMsdCxlLHIpO2Nhc2UiYXNjaWkiOnJldHVybiBtdCh0aGlzLHQsZSxyKTtjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiBfdCh0aGlzLHQsZSxyKTtjYXNlImJhc2U2NCI6cmV0dXJuIFN0KHRoaXMsdCxlLHIpO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gRXQodGhpcyx0LGUscik7ZGVmYXVsdDppZihvKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrbik7bj0oIiIrbikudG9Mb3dlckNhc2UoKSxvPSEwfX0sYXQucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybnt0eXBlOiJCdWZmZXIiLGRhdGE6QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5fYXJyfHx0aGlzLDApfX07ZnVuY3Rpb24ganQodCxlLHIpe3ZhciBuPSIiO3I9TWF0aC5taW4odC5sZW5ndGgscik7Zm9yKHZhciBpPWU7aTxyOysraSluKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDEyNyZ0W2ldKTtyZXR1cm4gbn1mdW5jdGlvbiBUdCh0LGUscil7dmFyIG49IiI7cj1NYXRoLm1pbih0Lmxlbmd0aCxyKTtmb3IodmFyIGk9ZTtpPHI7KytpKW4rPVN0cmluZy5mcm9tQ2hhckNvZGUodFtpXSk7cmV0dXJuIG59ZnVuY3Rpb24gT3QodCxlLHIpe3ZhciBuPXQubGVuZ3RoOyghZXx8ZTwwKSYmKGU9MCksKCFyfHxyPDB8fHI+bikmJihyPW4pO2Zvcih2YXIgaT0iIixvPWU7bzxyOysrbylpKz1EdCh0W29dKTtyZXR1cm4gaX1mdW5jdGlvbiBBdCh0LGUscil7Zm9yKHZhciBuPXQuc2xpY2UoZSxyKSxpPSIiLG89MDtvPG4ubGVuZ3RoO28rPTIpaSs9U3RyaW5nLmZyb21DaGFyQ29kZShuW29dKzI1NipuW28rMV0pO3JldHVybiBpfWZ1bmN0aW9uIEN0KHQsZSxyKXtpZih0JTEhPTB8fHQ8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigib2Zmc2V0IGlzIG5vdCB1aW50Iik7aWYodCtlPnIpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIlRyeWluZyB0byBhY2Nlc3MgYmV5b25kIGJ1ZmZlciBsZW5ndGgiKX1mdW5jdGlvbiBNdCh0LGUscixuLGksbyl7aWYoIWN0KHQpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJidWZmZXIiIGFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIgaW5zdGFuY2UnKTtpZihlPml8fGU8byl0aHJvdyBuZXcgUmFuZ2VFcnJvcignInZhbHVlIiBhcmd1bWVudCBpcyBvdXQgb2YgYm91bmRzJyk7aWYocituPnQubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiB4dCh0LGUscixuKXtlPDAmJihlPTY1NTM1K2UrMSk7Zm9yKHZhciBpPTAsbz1NYXRoLm1pbih0Lmxlbmd0aC1yLDIpO2k8bzsrK2kpdFtyK2ldPShlJjI1NTw8OCoobj9pOjEtaSkpPj4+OCoobj9pOjEtaSl9ZnVuY3Rpb24gTHQodCxlLHIsbil7ZTwwJiYoZT00Mjk0OTY3Mjk1K2UrMSk7Zm9yKHZhciBpPTAsbz1NYXRoLm1pbih0Lmxlbmd0aC1yLDQpO2k8bzsrK2kpdFtyK2ldPWU+Pj44KihuP2k6My1pKSYyNTV9ZnVuY3Rpb24gQnQodCxlLHIsbixpLG8pe2lmKHIrbj50Lmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIik7aWYocjwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBQdCh0LGUscixuLGkpe3JldHVybiBpfHxCdCh0LDAsciw0KSx0dCh0LGUscixuLDIzLDQpLHIrNH1mdW5jdGlvbiBVdCh0LGUscixuLGkpe3JldHVybiBpfHxCdCh0LDAsciw4KSx0dCh0LGUscixuLDUyLDgpLHIrOH1hdC5wcm90b3R5cGUuc2xpY2U9ZnVuY3Rpb24odCxlKXt2YXIgcixuPXRoaXMubGVuZ3RoO2lmKCh0PX5+dCk8MD8odCs9bik8MCYmKHQ9MCk6dD5uJiYodD1uKSwoZT12b2lkIDA9PT1lP246fn5lKTwwPyhlKz1uKTwwJiYoZT0wKTplPm4mJihlPW4pLGU8dCYmKGU9dCksYXQuVFlQRURfQVJSQVlfU1VQUE9SVCkocj10aGlzLnN1YmFycmF5KHQsZSkpLl9fcHJvdG9fXz1hdC5wcm90b3R5cGU7ZWxzZXt2YXIgaT1lLXQ7cj1uZXcgYXQoaSx2b2lkIDApO2Zvcih2YXIgbz0wO288aTsrK28pcltvXT10aGlzW28rdF19cmV0dXJuIHJ9LGF0LnByb3RvdHlwZS5yZWFkVUludExFPWZ1bmN0aW9uKHQsZSxyKXt0fD0wLGV8PTAscnx8Q3QodCxlLHRoaXMubGVuZ3RoKTtmb3IodmFyIG49dGhpc1t0XSxpPTEsbz0wOysrbzxlJiYoaSo9MjU2KTspbis9dGhpc1t0K29dKmk7cmV0dXJuIG59LGF0LnByb3RvdHlwZS5yZWFkVUludEJFPWZ1bmN0aW9uKHQsZSxyKXt0fD0wLGV8PTAscnx8Q3QodCxlLHRoaXMubGVuZ3RoKTtmb3IodmFyIG49dGhpc1t0Ky0tZV0saT0xO2U+MCYmKGkqPTI1Nik7KW4rPXRoaXNbdCstLWVdKmk7cmV0dXJuIG59LGF0LnByb3RvdHlwZS5yZWFkVUludDg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Q3QodCwxLHRoaXMubGVuZ3RoKSx0aGlzW3RdfSxhdC5wcm90b3R5cGUucmVhZFVJbnQxNkxFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEN0KHQsMix0aGlzLmxlbmd0aCksdGhpc1t0XXx0aGlzW3QrMV08PDh9LGF0LnByb3RvdHlwZS5yZWFkVUludDE2QkU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Q3QodCwyLHRoaXMubGVuZ3RoKSx0aGlzW3RdPDw4fHRoaXNbdCsxXX0sYXQucHJvdG90eXBlLnJlYWRVSW50MzJMRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxDdCh0LDQsdGhpcy5sZW5ndGgpLCh0aGlzW3RdfHRoaXNbdCsxXTw8OHx0aGlzW3QrMl08PDE2KSsxNjc3NzIxNip0aGlzW3QrM119LGF0LnByb3RvdHlwZS5yZWFkVUludDMyQkU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Q3QodCw0LHRoaXMubGVuZ3RoKSwxNjc3NzIxNip0aGlzW3RdKyh0aGlzW3QrMV08PDE2fHRoaXNbdCsyXTw8OHx0aGlzW3QrM10pfSxhdC5wcm90b3R5cGUucmVhZEludExFPWZ1bmN0aW9uKHQsZSxyKXt0fD0wLGV8PTAscnx8Q3QodCxlLHRoaXMubGVuZ3RoKTtmb3IodmFyIG49dGhpc1t0XSxpPTEsbz0wOysrbzxlJiYoaSo9MjU2KTspbis9dGhpc1t0K29dKmk7cmV0dXJuIG4+PShpKj0xMjgpJiYobi09TWF0aC5wb3coMiw4KmUpKSxufSxhdC5wcm90b3R5cGUucmVhZEludEJFPWZ1bmN0aW9uKHQsZSxyKXt0fD0wLGV8PTAscnx8Q3QodCxlLHRoaXMubGVuZ3RoKTtmb3IodmFyIG49ZSxpPTEsbz10aGlzW3QrLS1uXTtuPjAmJihpKj0yNTYpOylvKz10aGlzW3QrLS1uXSppO3JldHVybiBvPj0oaSo9MTI4KSYmKG8tPU1hdGgucG93KDIsOCplKSksb30sYXQucHJvdG90eXBlLnJlYWRJbnQ4PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEN0KHQsMSx0aGlzLmxlbmd0aCksMTI4JnRoaXNbdF0/LTEqKDI1NS10aGlzW3RdKzEpOnRoaXNbdF19LGF0LnByb3RvdHlwZS5yZWFkSW50MTZMRT1mdW5jdGlvbih0LGUpe2V8fEN0KHQsMix0aGlzLmxlbmd0aCk7dmFyIHI9dGhpc1t0XXx0aGlzW3QrMV08PDg7cmV0dXJuIDMyNzY4JnI/NDI5NDkwMTc2MHxyOnJ9LGF0LnByb3RvdHlwZS5yZWFkSW50MTZCRT1mdW5jdGlvbih0LGUpe2V8fEN0KHQsMix0aGlzLmxlbmd0aCk7dmFyIHI9dGhpc1t0KzFdfHRoaXNbdF08PDg7cmV0dXJuIDMyNzY4JnI/NDI5NDkwMTc2MHxyOnJ9LGF0LnByb3RvdHlwZS5yZWFkSW50MzJMRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxDdCh0LDQsdGhpcy5sZW5ndGgpLHRoaXNbdF18dGhpc1t0KzFdPDw4fHRoaXNbdCsyXTw8MTZ8dGhpc1t0KzNdPDwyNH0sYXQucHJvdG90eXBlLnJlYWRJbnQzMkJFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEN0KHQsNCx0aGlzLmxlbmd0aCksdGhpc1t0XTw8MjR8dGhpc1t0KzFdPDwxNnx0aGlzW3QrMl08PDh8dGhpc1t0KzNdfSxhdC5wcm90b3R5cGUucmVhZEZsb2F0TEU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Q3QodCw0LHRoaXMubGVuZ3RoKSxRKHRoaXMsdCwhMCwyMyw0KX0sYXQucHJvdG90eXBlLnJlYWRGbG9hdEJFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEN0KHQsNCx0aGlzLmxlbmd0aCksUSh0aGlzLHQsITEsMjMsNCl9LGF0LnByb3RvdHlwZS5yZWFkRG91YmxlTEU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Q3QodCw4LHRoaXMubGVuZ3RoKSxRKHRoaXMsdCwhMCw1Miw4KX0sYXQucHJvdG90eXBlLnJlYWREb3VibGVCRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxDdCh0LDgsdGhpcy5sZW5ndGgpLFEodGhpcyx0LCExLDUyLDgpfSxhdC5wcm90b3R5cGUud3JpdGVVSW50TEU9ZnVuY3Rpb24odCxlLHIsbil7KHQ9K3QsZXw9MCxyfD0wLG4pfHxNdCh0aGlzLHQsZSxyLE1hdGgucG93KDIsOCpyKS0xLDApO3ZhciBpPTEsbz0wO2Zvcih0aGlzW2VdPTI1NSZ0OysrbzxyJiYoaSo9MjU2KTspdGhpc1tlK29dPXQvaSYyNTU7cmV0dXJuIGUrcn0sYXQucHJvdG90eXBlLndyaXRlVUludEJFPWZ1bmN0aW9uKHQsZSxyLG4peyh0PSt0LGV8PTAscnw9MCxuKXx8TXQodGhpcyx0LGUscixNYXRoLnBvdygyLDgqciktMSwwKTt2YXIgaT1yLTEsbz0xO2Zvcih0aGlzW2UraV09MjU1JnQ7LS1pPj0wJiYobyo9MjU2KTspdGhpc1tlK2ldPXQvbyYyNTU7cmV0dXJuIGUrcn0sYXQucHJvdG90eXBlLndyaXRlVUludDg9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGV8PTAscnx8TXQodGhpcyx0LGUsMSwyNTUsMCksYXQuVFlQRURfQVJSQVlfU1VQUE9SVHx8KHQ9TWF0aC5mbG9vcih0KSksdGhpc1tlXT0yNTUmdCxlKzF9LGF0LnByb3RvdHlwZS53cml0ZVVJbnQxNkxFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fE10KHRoaXMsdCxlLDIsNjU1MzUsMCksYXQuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT0yNTUmdCx0aGlzW2UrMV09dD4+PjgpOnh0KHRoaXMsdCxlLCEwKSxlKzJ9LGF0LnByb3RvdHlwZS53cml0ZVVJbnQxNkJFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fE10KHRoaXMsdCxlLDIsNjU1MzUsMCksYXQuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT10Pj4+OCx0aGlzW2UrMV09MjU1JnQpOnh0KHRoaXMsdCxlLCExKSxlKzJ9LGF0LnByb3RvdHlwZS53cml0ZVVJbnQzMkxFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fE10KHRoaXMsdCxlLDQsNDI5NDk2NzI5NSwwKSxhdC5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2UrM109dD4+PjI0LHRoaXNbZSsyXT10Pj4+MTYsdGhpc1tlKzFdPXQ+Pj44LHRoaXNbZV09MjU1JnQpOkx0KHRoaXMsdCxlLCEwKSxlKzR9LGF0LnByb3RvdHlwZS53cml0ZVVJbnQzMkJFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fE10KHRoaXMsdCxlLDQsNDI5NDk2NzI5NSwwKSxhdC5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPXQ+Pj4yNCx0aGlzW2UrMV09dD4+PjE2LHRoaXNbZSsyXT10Pj4+OCx0aGlzW2UrM109MjU1JnQpOkx0KHRoaXMsdCxlLCExKSxlKzR9LGF0LnByb3RvdHlwZS53cml0ZUludExFPWZ1bmN0aW9uKHQsZSxyLG4pe2lmKHQ9K3QsZXw9MCwhbil7dmFyIGk9TWF0aC5wb3coMiw4KnItMSk7TXQodGhpcyx0LGUscixpLTEsLWkpfXZhciBvPTAsYT0xLHM9MDtmb3IodGhpc1tlXT0yNTUmdDsrK288ciYmKGEqPTI1Nik7KXQ8MCYmMD09PXMmJjAhPT10aGlzW2Urby0xXSYmKHM9MSksdGhpc1tlK29dPSh0L2E+PjApLXMmMjU1O3JldHVybiBlK3J9LGF0LnByb3RvdHlwZS53cml0ZUludEJFPWZ1bmN0aW9uKHQsZSxyLG4pe2lmKHQ9K3QsZXw9MCwhbil7dmFyIGk9TWF0aC5wb3coMiw4KnItMSk7TXQodGhpcyx0LGUscixpLTEsLWkpfXZhciBvPXItMSxhPTEscz0wO2Zvcih0aGlzW2Urb109MjU1JnQ7LS1vPj0wJiYoYSo9MjU2KTspdDwwJiYwPT09cyYmMCE9PXRoaXNbZStvKzFdJiYocz0xKSx0aGlzW2Urb109KHQvYT4+MCktcyYyNTU7cmV0dXJuIGUrcn0sYXQucHJvdG90eXBlLndyaXRlSW50OD1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZXw9MCxyfHxNdCh0aGlzLHQsZSwxLDEyNywtMTI4KSxhdC5UWVBFRF9BUlJBWV9TVVBQT1JUfHwodD1NYXRoLmZsb29yKHQpKSx0PDAmJih0PTI1NSt0KzEpLHRoaXNbZV09MjU1JnQsZSsxfSxhdC5wcm90b3R5cGUud3JpdGVJbnQxNkxFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fE10KHRoaXMsdCxlLDIsMzI3NjcsLTMyNzY4KSxhdC5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPTI1NSZ0LHRoaXNbZSsxXT10Pj4+OCk6eHQodGhpcyx0LGUsITApLGUrMn0sYXQucHJvdG90eXBlLndyaXRlSW50MTZCRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZXw9MCxyfHxNdCh0aGlzLHQsZSwyLDMyNzY3LC0zMjc2OCksYXQuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT10Pj4+OCx0aGlzW2UrMV09MjU1JnQpOnh0KHRoaXMsdCxlLCExKSxlKzJ9LGF0LnByb3RvdHlwZS53cml0ZUludDMyTEU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGV8PTAscnx8TXQodGhpcyx0LGUsNCwyMTQ3NDgzNjQ3LC0yMTQ3NDgzNjQ4KSxhdC5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPTI1NSZ0LHRoaXNbZSsxXT10Pj4+OCx0aGlzW2UrMl09dD4+PjE2LHRoaXNbZSszXT10Pj4+MjQpOkx0KHRoaXMsdCxlLCEwKSxlKzR9LGF0LnByb3RvdHlwZS53cml0ZUludDMyQkU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGV8PTAscnx8TXQodGhpcyx0LGUsNCwyMTQ3NDgzNjQ3LC0yMTQ3NDgzNjQ4KSx0PDAmJih0PTQyOTQ5NjcyOTUrdCsxKSxhdC5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPXQ+Pj4yNCx0aGlzW2UrMV09dD4+PjE2LHRoaXNbZSsyXT10Pj4+OCx0aGlzW2UrM109MjU1JnQpOkx0KHRoaXMsdCxlLCExKSxlKzR9LGF0LnByb3RvdHlwZS53cml0ZUZsb2F0TEU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiBQdCh0aGlzLHQsZSwhMCxyKX0sYXQucHJvdG90eXBlLndyaXRlRmxvYXRCRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIFB0KHRoaXMsdCxlLCExLHIpfSxhdC5wcm90b3R5cGUud3JpdGVEb3VibGVMRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIFV0KHRoaXMsdCxlLCEwLHIpfSxhdC5wcm90b3R5cGUud3JpdGVEb3VibGVCRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIFV0KHRoaXMsdCxlLCExLHIpfSxhdC5wcm90b3R5cGUuY29weT1mdW5jdGlvbih0LGUscixuKXtpZihyfHwocj0wKSxufHwwPT09bnx8KG49dGhpcy5sZW5ndGgpLGU+PXQubGVuZ3RoJiYoZT10Lmxlbmd0aCksZXx8KGU9MCksbj4wJiZuPHImJihuPXIpLG49PT1yKXJldHVybiAwO2lmKDA9PT10Lmxlbmd0aHx8MD09PXRoaXMubGVuZ3RoKXJldHVybiAwO2lmKGU8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigidGFyZ2V0U3RhcnQgb3V0IG9mIGJvdW5kcyIpO2lmKHI8MHx8cj49dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInNvdXJjZVN0YXJ0IG91dCBvZiBib3VuZHMiKTtpZihuPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoInNvdXJjZUVuZCBvdXQgb2YgYm91bmRzIik7bj50aGlzLmxlbmd0aCYmKG49dGhpcy5sZW5ndGgpLHQubGVuZ3RoLWU8bi1yJiYobj10Lmxlbmd0aC1lK3IpO3ZhciBpLG89bi1yO2lmKHRoaXM9PT10JiZyPGUmJmU8bilmb3IoaT1vLTE7aT49MDstLWkpdFtpK2VdPXRoaXNbaStyXTtlbHNlIGlmKG88MWUzfHwhYXQuVFlQRURfQVJSQVlfU1VQUE9SVClmb3IoaT0wO2k8bzsrK2kpdFtpK2VdPXRoaXNbaStyXTtlbHNlIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKHQsdGhpcy5zdWJhcnJheShyLHIrbyksZSk7cmV0dXJuIG99LGF0LnByb3RvdHlwZS5maWxsPWZ1bmN0aW9uKHQsZSxyLG4pe2lmKCJzdHJpbmciPT10eXBlb2YgdCl7aWYoInN0cmluZyI9PXR5cGVvZiBlPyhuPWUsZT0wLHI9dGhpcy5sZW5ndGgpOiJzdHJpbmciPT10eXBlb2YgciYmKG49cixyPXRoaXMubGVuZ3RoKSwxPT09dC5sZW5ndGgpe3ZhciBpPXQuY2hhckNvZGVBdCgwKTtpPDI1NiYmKHQ9aSl9aWYodm9pZCAwIT09biYmInN0cmluZyIhPXR5cGVvZiBuKXRocm93IG5ldyBUeXBlRXJyb3IoImVuY29kaW5nIG11c3QgYmUgYSBzdHJpbmciKTtpZigic3RyaW5nIj09dHlwZW9mIG4mJiFhdC5pc0VuY29kaW5nKG4pKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrbil9ZWxzZSJudW1iZXIiPT10eXBlb2YgdCYmKHQmPTI1NSk7aWYoZTwwfHx0aGlzLmxlbmd0aDxlfHx0aGlzLmxlbmd0aDxyKXRocm93IG5ldyBSYW5nZUVycm9yKCJPdXQgb2YgcmFuZ2UgaW5kZXgiKTtpZihyPD1lKXJldHVybiB0aGlzO3ZhciBvO2lmKGU+Pj49MCxyPXZvaWQgMD09PXI/dGhpcy5sZW5ndGg6cj4+PjAsdHx8KHQ9MCksIm51bWJlciI9PXR5cGVvZiB0KWZvcihvPWU7bzxyOysrbyl0aGlzW29dPXQ7ZWxzZXt2YXIgYT1jdCh0KT90Okl0KG5ldyBhdCh0LG4pLnRvU3RyaW5nKCkpLHM9YS5sZW5ndGg7Zm9yKG89MDtvPHItZTsrK28pdGhpc1tvK2VdPWFbbyVzXX1yZXR1cm4gdGhpc307dmFyIE50PS9bXitcLzAtOUEtWmEtei1fXS9nO2Z1bmN0aW9uIER0KHQpe3JldHVybiB0PDE2PyIwIit0LnRvU3RyaW5nKDE2KTp0LnRvU3RyaW5nKDE2KX1mdW5jdGlvbiBJdCh0LGUpe3ZhciByO2U9ZXx8MS8wO2Zvcih2YXIgbj10Lmxlbmd0aCxpPW51bGwsbz1bXSxhPTA7YTxuOysrYSl7aWYoKHI9dC5jaGFyQ29kZUF0KGEpKT41NTI5NSYmcjw1NzM0NCl7aWYoIWkpe2lmKHI+NTYzMTkpeyhlLT0zKT4tMSYmby5wdXNoKDIzOSwxOTEsMTg5KTtjb250aW51ZX1pZihhKzE9PT1uKXsoZS09Myk+LTEmJm8ucHVzaCgyMzksMTkxLDE4OSk7Y29udGludWV9aT1yO2NvbnRpbnVlfWlmKHI8NTYzMjApeyhlLT0zKT4tMSYmby5wdXNoKDIzOSwxOTEsMTg5KSxpPXI7Y29udGludWV9cj02NTUzNisoaS01NTI5Njw8MTB8ci01NjMyMCl9ZWxzZSBpJiYoZS09Myk+LTEmJm8ucHVzaCgyMzksMTkxLDE4OSk7aWYoaT1udWxsLHI8MTI4KXtpZigoZS09MSk8MClicmVhaztvLnB1c2gocil9ZWxzZSBpZihyPDIwNDgpe2lmKChlLT0yKTwwKWJyZWFrO28ucHVzaChyPj42fDE5Miw2MyZyfDEyOCl9ZWxzZSBpZihyPDY1NTM2KXtpZigoZS09Myk8MClicmVhaztvLnB1c2gocj4+MTJ8MjI0LHI+PjYmNjN8MTI4LDYzJnJ8MTI4KX1lbHNle2lmKCEocjwxMTE0MTEyKSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgY29kZSBwb2ludCIpO2lmKChlLT00KTwwKWJyZWFrO28ucHVzaChyPj4xOHwyNDAscj4+MTImNjN8MTI4LHI+PjYmNjN8MTI4LDYzJnJ8MTI4KX19cmV0dXJuIG99ZnVuY3Rpb24gcXQodCl7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlLHIsbixpLG8sYTtWfHxLKCk7dmFyIHM9dC5sZW5ndGg7aWYocyU0PjApdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIHN0cmluZy4gTGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0Iik7bz0iPSI9PT10W3MtMl0/MjoiPSI9PT10W3MtMV0/MTowLGE9bmV3IEcoMypzLzQtbyksbj1vPjA/cy00OnM7dmFyIHU9MDtmb3IoZT0wLHI9MDtlPG47ZSs9NCxyKz0zKWk9Slt0LmNoYXJDb2RlQXQoZSldPDwxOHxKW3QuY2hhckNvZGVBdChlKzEpXTw8MTJ8Slt0LmNoYXJDb2RlQXQoZSsyKV08PDZ8Slt0LmNoYXJDb2RlQXQoZSszKV0sYVt1KytdPWk+PjE2JjI1NSxhW3UrK109aT4+OCYyNTUsYVt1KytdPTI1NSZpO3JldHVybiAyPT09bz8oaT1KW3QuY2hhckNvZGVBdChlKV08PDJ8Slt0LmNoYXJDb2RlQXQoZSsxKV0+PjQsYVt1KytdPTI1NSZpKToxPT09byYmKGk9Slt0LmNoYXJDb2RlQXQoZSldPDwxMHxKW3QuY2hhckNvZGVBdChlKzEpXTw8NHxKW3QuY2hhckNvZGVBdChlKzIpXT4+MixhW3UrK109aT4+OCYyNTUsYVt1KytdPTI1NSZpKSxhfShmdW5jdGlvbih0KXtpZigodD1mdW5jdGlvbih0KXtyZXR1cm4gdC50cmltP3QudHJpbSgpOnQucmVwbGFjZSgvXlxzK3xccyskL2csIiIpfSh0KS5yZXBsYWNlKE50LCIiKSkubGVuZ3RoPDIpcmV0dXJuIiI7Zm9yKDt0Lmxlbmd0aCU0IT0wOyl0Kz0iPSI7cmV0dXJuIHR9KHQpKX1mdW5jdGlvbiBGdCh0LGUscixuKXtmb3IodmFyIGk9MDtpPG4mJiEoaStyPj1lLmxlbmd0aHx8aT49dC5sZW5ndGgpOysraSllW2krcl09dFtpXTtyZXR1cm4gaX1mdW5jdGlvbiBXdCh0KXtyZXR1cm4gbnVsbCE9dCYmKCEhdC5faXNCdWZmZXJ8fHp0KHQpfHxmdW5jdGlvbih0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdC5yZWFkRmxvYXRMRSYmImZ1bmN0aW9uIj09dHlwZW9mIHQuc2xpY2UmJnp0KHQuc2xpY2UoMCwwKSl9KHQpKX1mdW5jdGlvbiB6dCh0KXtyZXR1cm4hIXQuY29uc3RydWN0b3ImJiJmdW5jdGlvbiI9PXR5cGVvZiB0LmNvbnN0cnVjdG9yLmlzQnVmZmVyJiZ0LmNvbnN0cnVjdG9yLmlzQnVmZmVyKHQpfXZhciBZdD1UKE9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLEJ1ZmZlcjphdCxJTlNQRUNUX01BWF9CWVRFUzo1MCxTbG93QnVmZmVyOmZ1bmN0aW9uKHQpe3JldHVybit0IT10JiYodD0wKSxhdC5hbGxvYygrdCl9LGlzQnVmZmVyOld0LGtNYXhMZW5ndGg6bnR9KSksJHQ9TygoZnVuY3Rpb24odCxlKXt2YXIgcj1ZdC5CdWZmZXI7ZnVuY3Rpb24gbih0LGUpe2Zvcih2YXIgciBpbiB0KWVbcl09dFtyXX1mdW5jdGlvbiBpKHQsZSxuKXtyZXR1cm4gcih0LGUsbil9ci5mcm9tJiZyLmFsbG9jJiZyLmFsbG9jVW5zYWZlJiZyLmFsbG9jVW5zYWZlU2xvdz90LmV4cG9ydHM9WXQ6KG4oWXQsZSksZS5CdWZmZXI9aSksbihyLGkpLGkuZnJvbT1mdW5jdGlvbih0LGUsbil7aWYoIm51bWJlciI9PXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyIik7cmV0dXJuIHIodCxlLG4pfSxpLmFsbG9jPWZ1bmN0aW9uKHQsZSxuKXtpZigibnVtYmVyIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlciIpO3ZhciBpPXIodCk7cmV0dXJuIHZvaWQgMCE9PWU/InN0cmluZyI9PXR5cGVvZiBuP2kuZmlsbChlLG4pOmkuZmlsbChlKTppLmZpbGwoMCksaX0saS5hbGxvY1Vuc2FmZT1mdW5jdGlvbih0KXtpZigibnVtYmVyIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlciIpO3JldHVybiByKHQpfSxpLmFsbG9jVW5zYWZlU2xvdz1mdW5jdGlvbih0KXtpZigibnVtYmVyIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlciIpO3JldHVybiBZdC5TbG93QnVmZmVyKHQpfX0pKTtmdW5jdGlvbiBIdCh0KXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfXZhciBKdD17aXNBcnJheTpmdW5jdGlvbih0KXtyZXR1cm4gQXJyYXkuaXNBcnJheT9BcnJheS5pc0FycmF5KHQpOiJbb2JqZWN0IEFycmF5XSI9PT1IdCh0KX0saXNCb29sZWFuOmZ1bmN0aW9uKHQpe3JldHVybiJib29sZWFuIj09dHlwZW9mIHR9LGlzTnVsbDpmdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09PXR9LGlzTnVsbE9yVW5kZWZpbmVkOmZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10fSxpc051bWJlcjpmdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHR9LGlzU3RyaW5nOmZ1bmN0aW9uKHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdH0saXNTeW1ib2w6ZnVuY3Rpb24odCl7cmV0dXJuInN5bWJvbCI9PXR5cGVvZiB0fSxpc1VuZGVmaW5lZDpmdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwPT09dH0saXNSZWdFeHA6ZnVuY3Rpb24odCl7cmV0dXJuIltvYmplY3QgUmVnRXhwXSI9PT1IdCh0KX0saXNPYmplY3Q6ZnVuY3Rpb24odCl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiB0JiZudWxsIT09dH0saXNEYXRlOmZ1bmN0aW9uKHQpe3JldHVybiJbb2JqZWN0IERhdGVdIj09PUh0KHQpfSxpc0Vycm9yOmZ1bmN0aW9uKHQpe3JldHVybiJbb2JqZWN0IEVycm9yXSI9PT1IdCh0KXx8dCBpbnN0YW5jZW9mIEVycm9yfSxpc0Z1bmN0aW9uOmZ1bmN0aW9uKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0fSxpc1ByaW1pdGl2ZTpmdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09PXR8fCJib29sZWFuIj09dHlwZW9mIHR8fCJudW1iZXIiPT10eXBlb2YgdHx8InN0cmluZyI9PXR5cGVvZiB0fHwic3ltYm9sIj09dHlwZW9mIHR8fHZvaWQgMD09PXR9LGlzQnVmZmVyOmF0LmlzQnVmZmVyfSxHdD1PKChmdW5jdGlvbih0KXsiZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmNyZWF0ZT90LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtlJiYodC5zdXBlcl89ZSx0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSl9OnQuZXhwb3J0cz1mdW5jdGlvbih0LGUpe2lmKGUpe3Quc3VwZXJfPWU7dmFyIHI9ZnVuY3Rpb24oKXt9O3IucHJvdG90eXBlPWUucHJvdG90eXBlLHQucHJvdG90eXBlPW5ldyByLHQucHJvdG90eXBlLmNvbnN0cnVjdG9yPXR9fX0pKSxWdD0iZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmNyZWF0ZT9mdW5jdGlvbih0LGUpe3Quc3VwZXJfPWUsdC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSl9OmZ1bmN0aW9uKHQsZSl7dC5zdXBlcl89ZTt2YXIgcj1mdW5jdGlvbigpe307ci5wcm90b3R5cGU9ZS5wcm90b3R5cGUsdC5wcm90b3R5cGU9bmV3IHIsdC5wcm90b3R5cGUuY29uc3RydWN0b3I9dH0sS3Q9LyVbc2RqJV0vZztmdW5jdGlvbiBadCh0KXtpZighZGUodCkpe2Zvcih2YXIgZT1bXSxyPTA7cjxhcmd1bWVudHMubGVuZ3RoO3IrKyllLnB1c2gocmUoYXJndW1lbnRzW3JdKSk7cmV0dXJuIGUuam9pbigiICIpfXI9MTtmb3IodmFyIG49YXJndW1lbnRzLGk9bi5sZW5ndGgsbz1TdHJpbmcodCkucmVwbGFjZShLdCwoZnVuY3Rpb24odCl7aWYoIiUlIj09PXQpcmV0dXJuIiUiO2lmKHI+PWkpcmV0dXJuIHQ7c3dpdGNoKHQpe2Nhc2UiJXMiOnJldHVybiBTdHJpbmcobltyKytdKTtjYXNlIiVkIjpyZXR1cm4gTnVtYmVyKG5bcisrXSk7Y2FzZSIlaiI6dHJ5e3JldHVybiBKU09OLnN0cmluZ2lmeShuW3IrK10pfWNhdGNoKHQpe3JldHVybiJbQ2lyY3VsYXJdIn1kZWZhdWx0OnJldHVybiB0fX0pKSxhPW5bcl07cjxpO2E9blsrK3JdKWhlKGEpfHwhYmUoYSk/bys9IiAiK2E6bys9IiAiK3JlKGEpO3JldHVybiBvfWZ1bmN0aW9uIFh0KGUscil7aWYoZ2UodC5wcm9jZXNzKSlyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gWHQoZSxyKS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O2lmKCEwPT09Ui5ub0RlcHJlY2F0aW9uKXJldHVybiBlO3ZhciBuPSExO3JldHVybiBmdW5jdGlvbigpe2lmKCFuKXtpZihSLnRocm93RGVwcmVjYXRpb24pdGhyb3cgbmV3IEVycm9yKHIpO1IudHJhY2VEZXByZWNhdGlvbj9jb25zb2xlLnRyYWNlKHIpOmNvbnNvbGUuZXJyb3Iociksbj0hMH1yZXR1cm4gZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fXZhciBRdCx0ZT17fTtmdW5jdGlvbiBlZSh0KXtpZihnZShRdCkmJihRdD1SLmVudi5OT0RFX0RFQlVHfHwiIiksdD10LnRvVXBwZXJDYXNlKCksIXRlW3RdKWlmKG5ldyBSZWdFeHAoIlxcYiIrdCsiXFxiIiwiaSIpLnRlc3QoUXQpKXt0ZVt0XT1mdW5jdGlvbigpe3ZhciBlPVp0LmFwcGx5KG51bGwsYXJndW1lbnRzKTtjb25zb2xlLmVycm9yKCIlcyAlZDogJXMiLHQsMCxlKX19ZWxzZSB0ZVt0XT1mdW5jdGlvbigpe307cmV0dXJuIHRlW3RdfWZ1bmN0aW9uIHJlKHQsZSl7dmFyIHI9e3NlZW46W10sc3R5bGl6ZTppZX07cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+PTMmJihyLmRlcHRoPWFyZ3VtZW50c1syXSksYXJndW1lbnRzLmxlbmd0aD49NCYmKHIuY29sb3JzPWFyZ3VtZW50c1szXSksZmUoZSk/ci5zaG93SGlkZGVuPWU6ZSYmT2UocixlKSxnZShyLnNob3dIaWRkZW4pJiYoci5zaG93SGlkZGVuPSExKSxnZShyLmRlcHRoKSYmKHIuZGVwdGg9MiksZ2Uoci5jb2xvcnMpJiYoci5jb2xvcnM9ITEpLGdlKHIuY3VzdG9tSW5zcGVjdCkmJihyLmN1c3RvbUluc3BlY3Q9ITApLHIuY29sb3JzJiYoci5zdHlsaXplPW5lKSxvZShyLHQsci5kZXB0aCl9ZnVuY3Rpb24gbmUodCxlKXt2YXIgcj1yZS5zdHlsZXNbZV07cmV0dXJuIHI/IhtbIityZS5jb2xvcnNbcl1bMF0rIm0iK3QrIhtbIityZS5jb2xvcnNbcl1bMV0rIm0iOnR9ZnVuY3Rpb24gaWUodCxlKXtyZXR1cm4gdH1mdW5jdGlvbiBvZSh0LGUscil7aWYodC5jdXN0b21JbnNwZWN0JiZlJiZtZShlLmluc3BlY3QpJiZlLmluc3BlY3QhPT1yZSYmKCFlLmNvbnN0cnVjdG9yfHxlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSE9PWUpKXt2YXIgbj1lLmluc3BlY3Qocix0KTtyZXR1cm4gZGUobil8fChuPW9lKHQsbixyKSksbn12YXIgaT1mdW5jdGlvbih0LGUpe2lmKGdlKGUpKXJldHVybiB0LnN0eWxpemUoInVuZGVmaW5lZCIsInVuZGVmaW5lZCIpO2lmKGRlKGUpKXt2YXIgcj0iJyIrSlNPTi5zdHJpbmdpZnkoZSkucmVwbGFjZSgvXiJ8IiQvZywiIikucmVwbGFjZSgvJy9nLCJcXCciKS5yZXBsYWNlKC9cXCIvZywnIicpKyInIjtyZXR1cm4gdC5zdHlsaXplKHIsInN0cmluZyIpfWlmKGNlKGUpKXJldHVybiB0LnN0eWxpemUoIiIrZSwibnVtYmVyIik7aWYoZmUoZSkpcmV0dXJuIHQuc3R5bGl6ZSgiIitlLCJib29sZWFuIik7aWYoaGUoZSkpcmV0dXJuIHQuc3R5bGl6ZSgibnVsbCIsIm51bGwiKX0odCxlKTtpZihpKXJldHVybiBpO3ZhciBvPU9iamVjdC5rZXlzKGUpLGE9ZnVuY3Rpb24odCl7dmFyIGU9e307cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCxyKXtlW3RdPSEwfSkpLGV9KG8pO2lmKHQuc2hvd0hpZGRlbiYmKG89T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZSkpLHdlKGUpJiYoby5pbmRleE9mKCJtZXNzYWdlIik+PTB8fG8uaW5kZXhPZigiZGVzY3JpcHRpb24iKT49MCkpcmV0dXJuIGFlKGUpO2lmKDA9PT1vLmxlbmd0aCl7aWYobWUoZSkpe3ZhciBzPWUubmFtZT8iOiAiK2UubmFtZToiIjtyZXR1cm4gdC5zdHlsaXplKCJbRnVuY3Rpb24iK3MrIl0iLCJzcGVjaWFsIil9aWYoeWUoZSkpcmV0dXJuIHQuc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSksInJlZ2V4cCIpO2lmKHZlKGUpKXJldHVybiB0LnN0eWxpemUoRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKSwiZGF0ZSIpO2lmKHdlKGUpKXJldHVybiBhZShlKX12YXIgdSxmPSIiLGg9ITEsbD1bInsiLCJ9Il07KHVlKGUpJiYoaD0hMCxsPVsiWyIsIl0iXSksbWUoZSkpJiYoZj0iIFtGdW5jdGlvbiIrKGUubmFtZT8iOiAiK2UubmFtZToiIikrIl0iKTtyZXR1cm4geWUoZSkmJihmPSIgIitSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSkpLHZlKGUpJiYoZj0iICIrRGF0ZS5wcm90b3R5cGUudG9VVENTdHJpbmcuY2FsbChlKSksd2UoZSkmJihmPSIgIithZShlKSksMCE9PW8ubGVuZ3RofHxoJiYwIT1lLmxlbmd0aD9yPDA/eWUoZSk/dC5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKSwicmVnZXhwIik6dC5zdHlsaXplKCJbT2JqZWN0XSIsInNwZWNpYWwiKToodC5zZWVuLnB1c2goZSksdT1oP2Z1bmN0aW9uKHQsZSxyLG4saSl7Zm9yKHZhciBvPVtdLGE9MCxzPWUubGVuZ3RoO2E8czsrK2EpQWUoZSxTdHJpbmcoYSkpP28ucHVzaChzZSh0LGUscixuLFN0cmluZyhhKSwhMCkpOm8ucHVzaCgiIik7cmV0dXJuIGkuZm9yRWFjaCgoZnVuY3Rpb24oaSl7aS5tYXRjaCgvXlxkKyQvKXx8by5wdXNoKHNlKHQsZSxyLG4saSwhMCkpfSkpLG99KHQsZSxyLGEsbyk6by5tYXAoKGZ1bmN0aW9uKG4pe3JldHVybiBzZSh0LGUscixhLG4saCl9KSksdC5zZWVuLnBvcCgpLGZ1bmN0aW9uKHQsZSxyKXtpZih0LnJlZHVjZSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5pbmRleE9mKCJcbiIpLHQrZS5yZXBsYWNlKC9cdTAwMWJcW1xkXGQ/bS9nLCIiKS5sZW5ndGgrMX0pLDApPjYwKXJldHVybiByWzBdKygiIj09PWU/IiI6ZSsiXG4gIikrIiAiK3Quam9pbigiLFxuICAiKSsiICIrclsxXTtyZXR1cm4gclswXStlKyIgIit0LmpvaW4oIiwgIikrIiAiK3JbMV19KHUsZixsKSk6bFswXStmK2xbMV19ZnVuY3Rpb24gYWUodCl7cmV0dXJuIlsiK0Vycm9yLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpKyJdIn1mdW5jdGlvbiBzZSh0LGUscixuLGksbyl7dmFyIGEscyx1O2lmKCh1PU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSxpKXx8e3ZhbHVlOmVbaV19KS5nZXQ/cz11LnNldD90LnN0eWxpemUoIltHZXR0ZXIvU2V0dGVyXSIsInNwZWNpYWwiKTp0LnN0eWxpemUoIltHZXR0ZXJdIiwic3BlY2lhbCIpOnUuc2V0JiYocz10LnN0eWxpemUoIltTZXR0ZXJdIiwic3BlY2lhbCIpKSxBZShuLGkpfHwoYT0iWyIraSsiXSIpLHN8fCh0LnNlZW4uaW5kZXhPZih1LnZhbHVlKTwwPyhzPWhlKHIpP29lKHQsdS52YWx1ZSxudWxsKTpvZSh0LHUudmFsdWUsci0xKSkuaW5kZXhPZigiXG4iKT4tMSYmKHM9bz9zLnNwbGl0KCJcbiIpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIiAgIit0fSkpLmpvaW4oIlxuIikuc3Vic3RyKDIpOiJcbiIrcy5zcGxpdCgiXG4iKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiIgICAiK3R9KSkuam9pbigiXG4iKSk6cz10LnN0eWxpemUoIltDaXJjdWxhcl0iLCJzcGVjaWFsIikpLGdlKGEpKXtpZihvJiZpLm1hdGNoKC9eXGQrJC8pKXJldHVybiBzOyhhPUpTT04uc3RyaW5naWZ5KCIiK2kpKS5tYXRjaCgvXiIoW2EtekEtWl9dW2EtekEtWl8wLTldKikiJC8pPyhhPWEuc3Vic3RyKDEsYS5sZW5ndGgtMiksYT10LnN0eWxpemUoYSwibmFtZSIpKTooYT1hLnJlcGxhY2UoLycvZywiXFwnIikucmVwbGFjZSgvXFwiL2csJyInKS5yZXBsYWNlKC8oXiJ8IiQpL2csIiciKSxhPXQuc3R5bGl6ZShhLCJzdHJpbmciKSl9cmV0dXJuIGErIjogIitzfWZ1bmN0aW9uIHVlKHQpe3JldHVybiBBcnJheS5pc0FycmF5KHQpfWZ1bmN0aW9uIGZlKHQpe3JldHVybiJib29sZWFuIj09dHlwZW9mIHR9ZnVuY3Rpb24gaGUodCl7cmV0dXJuIG51bGw9PT10fWZ1bmN0aW9uIGxlKHQpe3JldHVybiBudWxsPT10fWZ1bmN0aW9uIGNlKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdH1mdW5jdGlvbiBkZSh0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHR9ZnVuY3Rpb24gcGUodCl7cmV0dXJuInN5bWJvbCI9PXR5cGVvZiB0fWZ1bmN0aW9uIGdlKHQpe3JldHVybiB2b2lkIDA9PT10fWZ1bmN0aW9uIHllKHQpe3JldHVybiBiZSh0KSYmIltvYmplY3QgUmVnRXhwXSI9PT1FZSh0KX1mdW5jdGlvbiBiZSh0KXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQmJm51bGwhPT10fWZ1bmN0aW9uIHZlKHQpe3JldHVybiBiZSh0KSYmIltvYmplY3QgRGF0ZV0iPT09RWUodCl9ZnVuY3Rpb24gd2UodCl7cmV0dXJuIGJlKHQpJiYoIltvYmplY3QgRXJyb3JdIj09PUVlKHQpfHx0IGluc3RhbmNlb2YgRXJyb3IpfWZ1bmN0aW9uIG1lKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0fWZ1bmN0aW9uIF9lKHQpe3JldHVybiBudWxsPT09dHx8ImJvb2xlYW4iPT10eXBlb2YgdHx8Im51bWJlciI9PXR5cGVvZiB0fHwic3RyaW5nIj09dHlwZW9mIHR8fCJzeW1ib2wiPT10eXBlb2YgdHx8dm9pZCAwPT09dH1mdW5jdGlvbiBTZSh0KXtyZXR1cm4gYXQuaXNCdWZmZXIodCl9ZnVuY3Rpb24gRWUodCl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBrZSh0KXtyZXR1cm4gdDwxMD8iMCIrdC50b1N0cmluZygxMCk6dC50b1N0cmluZygxMCl9cmUuY29sb3JzPXtib2xkOlsxLDIyXSxpdGFsaWM6WzMsMjNdLHVuZGVybGluZTpbNCwyNF0saW52ZXJzZTpbNywyN10sd2hpdGU6WzM3LDM5XSxncmV5Ols5MCwzOV0sYmxhY2s6WzMwLDM5XSxibHVlOlszNCwzOV0sY3lhbjpbMzYsMzldLGdyZWVuOlszMiwzOV0sbWFnZW50YTpbMzUsMzldLHJlZDpbMzEsMzldLHllbGxvdzpbMzMsMzldfSxyZS5zdHlsZXM9e3NwZWNpYWw6ImN5YW4iLG51bWJlcjoieWVsbG93Iixib29sZWFuOiJ5ZWxsb3ciLHVuZGVmaW5lZDoiZ3JleSIsbnVsbDoiYm9sZCIsc3RyaW5nOiJncmVlbiIsZGF0ZToibWFnZW50YSIscmVnZXhwOiJyZWQifTt2YXIgUmU9WyJKYW4iLCJGZWIiLCJNYXIiLCJBcHIiLCJNYXkiLCJKdW4iLCJKdWwiLCJBdWciLCJTZXAiLCJPY3QiLCJOb3YiLCJEZWMiXTtmdW5jdGlvbiBqZSgpe3ZhciB0PW5ldyBEYXRlLGU9W2tlKHQuZ2V0SG91cnMoKSksa2UodC5nZXRNaW51dGVzKCkpLGtlKHQuZ2V0U2Vjb25kcygpKV0uam9pbigiOiIpO3JldHVyblt0LmdldERhdGUoKSxSZVt0LmdldE1vbnRoKCldLGVdLmpvaW4oIiAiKX1mdW5jdGlvbiBUZSgpe2NvbnNvbGUubG9nKCIlcyAtICVzIixqZSgpLFp0LmFwcGx5KG51bGwsYXJndW1lbnRzKSl9ZnVuY3Rpb24gT2UodCxlKXtpZighZXx8IWJlKGUpKXJldHVybiB0O2Zvcih2YXIgcj1PYmplY3Qua2V5cyhlKSxuPXIubGVuZ3RoO24tLTspdFtyW25dXT1lW3Jbbl1dO3JldHVybiB0fWZ1bmN0aW9uIEFlKHQsZSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpfXZhciBDZT17aW5oZXJpdHM6VnQsX2V4dGVuZDpPZSxsb2c6VGUsaXNCdWZmZXI6U2UsaXNQcmltaXRpdmU6X2UsaXNGdW5jdGlvbjptZSxpc0Vycm9yOndlLGlzRGF0ZTp2ZSxpc09iamVjdDpiZSxpc1JlZ0V4cDp5ZSxpc1VuZGVmaW5lZDpnZSxpc1N5bWJvbDpwZSxpc1N0cmluZzpkZSxpc051bWJlcjpjZSxpc051bGxPclVuZGVmaW5lZDpsZSxpc051bGw6aGUsaXNCb29sZWFuOmZlLGlzQXJyYXk6dWUsaW5zcGVjdDpyZSxkZXByZWNhdGU6WHQsZm9ybWF0Olp0LGRlYnVnbG9nOmVlfSxNZT1UKE9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGZvcm1hdDpadCxkZXByZWNhdGU6WHQsZGVidWdsb2c6ZWUsaW5zcGVjdDpyZSxpc0FycmF5OnVlLGlzQm9vbGVhbjpmZSxpc051bGw6aGUsaXNOdWxsT3JVbmRlZmluZWQ6bGUsaXNOdW1iZXI6Y2UsaXNTdHJpbmc6ZGUsaXNTeW1ib2w6cGUsaXNVbmRlZmluZWQ6Z2UsaXNSZWdFeHA6eWUsaXNPYmplY3Q6YmUsaXNEYXRlOnZlLGlzRXJyb3I6d2UsaXNGdW5jdGlvbjptZSxpc1ByaW1pdGl2ZTpfZSxpc0J1ZmZlcjpTZSxsb2c6VGUsaW5oZXJpdHM6VnQsX2V4dGVuZDpPZSxkZWZhdWx0OkNlfSkpLHhlPU8oKGZ1bmN0aW9uKHQpe3ZhciBlPSR0LkJ1ZmZlcjt0LmV4cG9ydHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7IWZ1bmN0aW9uKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9KHRoaXMsdCksdGhpcy5oZWFkPW51bGwsdGhpcy50YWlsPW51bGwsdGhpcy5sZW5ndGg9MH1yZXR1cm4gdC5wcm90b3R5cGUucHVzaD1mdW5jdGlvbih0KXt2YXIgZT17ZGF0YTp0LG5leHQ6bnVsbH07dGhpcy5sZW5ndGg+MD90aGlzLnRhaWwubmV4dD1lOnRoaXMuaGVhZD1lLHRoaXMudGFpbD1lLCsrdGhpcy5sZW5ndGh9LHQucHJvdG90eXBlLnVuc2hpZnQ9ZnVuY3Rpb24odCl7dmFyIGU9e2RhdGE6dCxuZXh0OnRoaXMuaGVhZH07MD09PXRoaXMubGVuZ3RoJiYodGhpcy50YWlsPWUpLHRoaXMuaGVhZD1lLCsrdGhpcy5sZW5ndGh9LHQucHJvdG90eXBlLnNoaWZ0PWZ1bmN0aW9uKCl7aWYoMCE9PXRoaXMubGVuZ3RoKXt2YXIgdD10aGlzLmhlYWQuZGF0YTtyZXR1cm4gMT09PXRoaXMubGVuZ3RoP3RoaXMuaGVhZD10aGlzLnRhaWw9bnVsbDp0aGlzLmhlYWQ9dGhpcy5oZWFkLm5leHQsLS10aGlzLmxlbmd0aCx0fX0sdC5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLmhlYWQ9dGhpcy50YWlsPW51bGwsdGhpcy5sZW5ndGg9MH0sdC5wcm90b3R5cGUuam9pbj1mdW5jdGlvbih0KXtpZigwPT09dGhpcy5sZW5ndGgpcmV0dXJuIiI7Zm9yKHZhciBlPXRoaXMuaGVhZCxyPSIiK2UuZGF0YTtlPWUubmV4dDspcis9dCtlLmRhdGE7cmV0dXJuIHJ9LHQucHJvdG90eXBlLmNvbmNhdD1mdW5jdGlvbih0KXtpZigwPT09dGhpcy5sZW5ndGgpcmV0dXJuIGUuYWxsb2MoMCk7aWYoMT09PXRoaXMubGVuZ3RoKXJldHVybiB0aGlzLmhlYWQuZGF0YTtmb3IodmFyIHIsbixpLG89ZS5hbGxvY1Vuc2FmZSh0Pj4+MCksYT10aGlzLmhlYWQscz0wO2E7KXI9YS5kYXRhLG49byxpPXMsci5jb3B5KG4saSkscys9YS5kYXRhLmxlbmd0aCxhPWEubmV4dDtyZXR1cm4gb30sdH0oKSxNZSYmTWUuaW5zcGVjdCYmTWUuaW5zcGVjdC5jdXN0b20mJih0LmV4cG9ydHMucHJvdG90eXBlW01lLmluc3BlY3QuY3VzdG9tXT1mdW5jdGlvbigpe3ZhciB0PU1lLmluc3BlY3Qoe2xlbmd0aDp0aGlzLmxlbmd0aH0pO3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLm5hbWUrIiAiK3R9KX0pKTtmdW5jdGlvbiBMZSh0LGUpe3QuZW1pdCgiZXJyb3IiLGUpfXZhciBCZT1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXMsbj10aGlzLl9yZWFkYWJsZVN0YXRlJiZ0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZCxpPXRoaXMuX3dyaXRhYmxlU3RhdGUmJnRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkO3JldHVybiBufHxpPyhlP2UodCk6IXR8fHRoaXMuX3dyaXRhYmxlU3RhdGUmJnRoaXMuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkfHxBLm5leHRUaWNrKExlLHRoaXMsdCksdGhpcyk6KHRoaXMuX3JlYWRhYmxlU3RhdGUmJih0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZD0hMCksdGhpcy5fd3JpdGFibGVTdGF0ZSYmKHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkPSEwKSx0aGlzLl9kZXN0cm95KHR8fG51bGwsKGZ1bmN0aW9uKHQpeyFlJiZ0PyhBLm5leHRUaWNrKExlLHIsdCksci5fd3JpdGFibGVTdGF0ZSYmKHIuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkPSEwKSk6ZSYmZSh0KX0pKSx0aGlzKX0sUGU9ZnVuY3Rpb24oKXt0aGlzLl9yZWFkYWJsZVN0YXRlJiYodGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQ9ITEsdGhpcy5fcmVhZGFibGVTdGF0ZS5yZWFkaW5nPSExLHRoaXMuX3JlYWRhYmxlU3RhdGUuZW5kZWQ9ITEsdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmRFbWl0dGVkPSExKSx0aGlzLl93cml0YWJsZVN0YXRlJiYodGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQ9ITEsdGhpcy5fd3JpdGFibGVTdGF0ZS5lbmRlZD0hMSx0aGlzLl93cml0YWJsZVN0YXRlLmVuZGluZz0hMSx0aGlzLl93cml0YWJsZVN0YXRlLmZpbmlzaGVkPSExLHRoaXMuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkPSExKX0sVWU9ZnVuY3Rpb24odCxlKXtpZihOZSgibm9EZXByZWNhdGlvbiIpKXJldHVybiB0O3ZhciByPSExO3JldHVybiBmdW5jdGlvbigpe2lmKCFyKXtpZihOZSgidGhyb3dEZXByZWNhdGlvbiIpKXRocm93IG5ldyBFcnJvcihlKTtOZSgidHJhY2VEZXByZWNhdGlvbiIpP2NvbnNvbGUudHJhY2UoZSk6Y29uc29sZS53YXJuKGUpLHI9ITB9cmV0dXJuIHQuYXBwbHkodGhpcyxhcmd1bWVudHMpfX07ZnVuY3Rpb24gTmUodCl7dHJ5e2lmKCFqLmxvY2FsU3RvcmFnZSlyZXR1cm4hMX1jYXRjaCh0KXtyZXR1cm4hMX12YXIgZT1qLmxvY2FsU3RvcmFnZVt0XTtyZXR1cm4gbnVsbCE9ZSYmInRydWUiPT09U3RyaW5nKGUpLnRvTG93ZXJDYXNlKCl9dmFyIERlPVZlO2Z1bmN0aW9uIEllKHQpe3ZhciBlPXRoaXM7dGhpcy5uZXh0PW51bGwsdGhpcy5lbnRyeT1udWxsLHRoaXMuZmluaXNoPWZ1bmN0aW9uKCl7IWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj10LmVudHJ5O3QuZW50cnk9bnVsbDtmb3IoO247KXt2YXIgaT1uLmNhbGxiYWNrO2UucGVuZGluZ2NiLS0saShyKSxuPW4ubmV4dH1lLmNvcmtlZFJlcXVlc3RzRnJlZT9lLmNvcmtlZFJlcXVlc3RzRnJlZS5uZXh0PXQ6ZS5jb3JrZWRSZXF1ZXN0c0ZyZWU9dH0oZSx0KX19dmFyIHFlLEZlPSFSLmJyb3dzZXImJlsidjAuMTAiLCJ2MC45LiJdLmluZGV4T2YoUi52ZXJzaW9uLnNsaWNlKDAsNSkpPi0xP3NldEltbWVkaWF0ZTpBLm5leHRUaWNrO1ZlLldyaXRhYmxlU3RhdGU9R2U7dmFyIFdlPU9iamVjdC5jcmVhdGUoSnQpO1dlLmluaGVyaXRzPUd0O3ZhciB6ZSxZZT17ZGVwcmVjYXRlOlVlfSwkZT0kdC5CdWZmZXIsSGU9ai5VaW50OEFycmF5fHxmdW5jdGlvbigpe307ZnVuY3Rpb24gSmUoKXt9ZnVuY3Rpb24gR2UodCxlKXt0PXR8fHt9O3ZhciByPWUgaW5zdGFuY2VvZihxZT1xZXx8bnIpO3RoaXMub2JqZWN0TW9kZT0hIXQub2JqZWN0TW9kZSxyJiYodGhpcy5vYmplY3RNb2RlPXRoaXMub2JqZWN0TW9kZXx8ISF0LndyaXRhYmxlT2JqZWN0TW9kZSk7dmFyIG49dC5oaWdoV2F0ZXJNYXJrLGk9dC53cml0YWJsZUhpZ2hXYXRlck1hcmssbz10aGlzLm9iamVjdE1vZGU/MTY6MTYzODQ7dGhpcy5oaWdoV2F0ZXJNYXJrPW58fDA9PT1uP246ciYmKGl8fDA9PT1pKT9pOm8sdGhpcy5oaWdoV2F0ZXJNYXJrPU1hdGguZmxvb3IodGhpcy5oaWdoV2F0ZXJNYXJrKSx0aGlzLmZpbmFsQ2FsbGVkPSExLHRoaXMubmVlZERyYWluPSExLHRoaXMuZW5kaW5nPSExLHRoaXMuZW5kZWQ9ITEsdGhpcy5maW5pc2hlZD0hMSx0aGlzLmRlc3Ryb3llZD0hMTt2YXIgYT0hMT09PXQuZGVjb2RlU3RyaW5nczt0aGlzLmRlY29kZVN0cmluZ3M9IWEsdGhpcy5kZWZhdWx0RW5jb2Rpbmc9dC5kZWZhdWx0RW5jb2Rpbmd8fCJ1dGY4Iix0aGlzLmxlbmd0aD0wLHRoaXMud3JpdGluZz0hMSx0aGlzLmNvcmtlZD0wLHRoaXMuc3luYz0hMCx0aGlzLmJ1ZmZlclByb2Nlc3Npbmc9ITEsdGhpcy5vbndyaXRlPWZ1bmN0aW9uKHQpeyFmdW5jdGlvbih0LGUpe3ZhciByPXQuX3dyaXRhYmxlU3RhdGUsbj1yLnN5bmMsaT1yLndyaXRlY2I7aWYoZnVuY3Rpb24odCl7dC53cml0aW5nPSExLHQud3JpdGVjYj1udWxsLHQubGVuZ3RoLT10LndyaXRlbGVuLHQud3JpdGVsZW49MH0ociksZSkhZnVuY3Rpb24odCxlLHIsbixpKXstLWUucGVuZGluZ2NiLHI/KEEubmV4dFRpY2soaSxuKSxBLm5leHRUaWNrKGVyLHQsZSksdC5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQ9ITAsdC5lbWl0KCJlcnJvciIsbikpOihpKG4pLHQuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkPSEwLHQuZW1pdCgiZXJyb3IiLG4pLGVyKHQsZSkpfSh0LHIsbixlLGkpO2Vsc2V7dmFyIG89UWUocik7b3x8ci5jb3JrZWR8fHIuYnVmZmVyUHJvY2Vzc2luZ3x8IXIuYnVmZmVyZWRSZXF1ZXN0fHxYZSh0LHIpLG4/RmUoWmUsdCxyLG8saSk6WmUodCxyLG8saSl9fShlLHQpfSx0aGlzLndyaXRlY2I9bnVsbCx0aGlzLndyaXRlbGVuPTAsdGhpcy5idWZmZXJlZFJlcXVlc3Q9bnVsbCx0aGlzLmxhc3RCdWZmZXJlZFJlcXVlc3Q9bnVsbCx0aGlzLnBlbmRpbmdjYj0wLHRoaXMucHJlZmluaXNoZWQ9ITEsdGhpcy5lcnJvckVtaXR0ZWQ9ITEsdGhpcy5idWZmZXJlZFJlcXVlc3RDb3VudD0wLHRoaXMuY29ya2VkUmVxdWVzdHNGcmVlPW5ldyBJZSh0aGlzKX1mdW5jdGlvbiBWZSh0KXtpZihxZT1xZXx8bnIsISh6ZS5jYWxsKFZlLHRoaXMpfHx0aGlzIGluc3RhbmNlb2YgcWUpKXJldHVybiBuZXcgVmUodCk7dGhpcy5fd3JpdGFibGVTdGF0ZT1uZXcgR2UodCx0aGlzKSx0aGlzLndyaXRhYmxlPSEwLHQmJigiZnVuY3Rpb24iPT10eXBlb2YgdC53cml0ZSYmKHRoaXMuX3dyaXRlPXQud3JpdGUpLCJmdW5jdGlvbiI9PXR5cGVvZiB0LndyaXRldiYmKHRoaXMuX3dyaXRldj10LndyaXRldiksImZ1bmN0aW9uIj09dHlwZW9mIHQuZGVzdHJveSYmKHRoaXMuX2Rlc3Ryb3k9dC5kZXN0cm95KSwiZnVuY3Rpb24iPT10eXBlb2YgdC5maW5hbCYmKHRoaXMuX2ZpbmFsPXQuZmluYWwpKSwkLmNhbGwodGhpcyl9ZnVuY3Rpb24gS2UodCxlLHIsbixpLG8sYSl7ZS53cml0ZWxlbj1uLGUud3JpdGVjYj1hLGUud3JpdGluZz0hMCxlLnN5bmM9ITAscj90Ll93cml0ZXYoaSxlLm9ud3JpdGUpOnQuX3dyaXRlKGksbyxlLm9ud3JpdGUpLGUuc3luYz0hMX1mdW5jdGlvbiBaZSh0LGUscixuKXtyfHxmdW5jdGlvbih0LGUpezA9PT1lLmxlbmd0aCYmZS5uZWVkRHJhaW4mJihlLm5lZWREcmFpbj0hMSx0LmVtaXQoImRyYWluIikpfSh0LGUpLGUucGVuZGluZ2NiLS0sbigpLGVyKHQsZSl9ZnVuY3Rpb24gWGUodCxlKXtlLmJ1ZmZlclByb2Nlc3Npbmc9ITA7dmFyIHI9ZS5idWZmZXJlZFJlcXVlc3Q7aWYodC5fd3JpdGV2JiZyJiZyLm5leHQpe3ZhciBuPWUuYnVmZmVyZWRSZXF1ZXN0Q291bnQsaT1uZXcgQXJyYXkobiksbz1lLmNvcmtlZFJlcXVlc3RzRnJlZTtvLmVudHJ5PXI7Zm9yKHZhciBhPTAscz0hMDtyOylpW2FdPXIsci5pc0J1Znx8KHM9ITEpLHI9ci5uZXh0LGErPTE7aS5hbGxCdWZmZXJzPXMsS2UodCxlLCEwLGUubGVuZ3RoLGksIiIsby5maW5pc2gpLGUucGVuZGluZ2NiKyssZS5sYXN0QnVmZmVyZWRSZXF1ZXN0PW51bGwsby5uZXh0PyhlLmNvcmtlZFJlcXVlc3RzRnJlZT1vLm5leHQsby5uZXh0PW51bGwpOmUuY29ya2VkUmVxdWVzdHNGcmVlPW5ldyBJZShlKSxlLmJ1ZmZlcmVkUmVxdWVzdENvdW50PTB9ZWxzZXtmb3IoO3I7KXt2YXIgdT1yLmNodW5rLGY9ci5lbmNvZGluZyxoPXIuY2FsbGJhY2s7aWYoS2UodCxlLCExLGUub2JqZWN0TW9kZT8xOnUubGVuZ3RoLHUsZixoKSxyPXIubmV4dCxlLmJ1ZmZlcmVkUmVxdWVzdENvdW50LS0sZS53cml0aW5nKWJyZWFrfW51bGw9PT1yJiYoZS5sYXN0QnVmZmVyZWRSZXF1ZXN0PW51bGwpfWUuYnVmZmVyZWRSZXF1ZXN0PXIsZS5idWZmZXJQcm9jZXNzaW5nPSExfWZ1bmN0aW9uIFFlKHQpe3JldHVybiB0LmVuZGluZyYmMD09PXQubGVuZ3RoJiZudWxsPT09dC5idWZmZXJlZFJlcXVlc3QmJiF0LmZpbmlzaGVkJiYhdC53cml0aW5nfWZ1bmN0aW9uIHRyKHQsZSl7dC5fZmluYWwoKGZ1bmN0aW9uKHIpe2UucGVuZGluZ2NiLS0sciYmdC5lbWl0KCJlcnJvciIsciksZS5wcmVmaW5pc2hlZD0hMCx0LmVtaXQoInByZWZpbmlzaCIpLGVyKHQsZSl9KSl9ZnVuY3Rpb24gZXIodCxlKXt2YXIgcj1RZShlKTtyZXR1cm4gciYmKCFmdW5jdGlvbih0LGUpe2UucHJlZmluaXNoZWR8fGUuZmluYWxDYWxsZWR8fCgiZnVuY3Rpb24iPT10eXBlb2YgdC5fZmluYWw/KGUucGVuZGluZ2NiKyssZS5maW5hbENhbGxlZD0hMCxBLm5leHRUaWNrKHRyLHQsZSkpOihlLnByZWZpbmlzaGVkPSEwLHQuZW1pdCgicHJlZmluaXNoIikpKX0odCxlKSwwPT09ZS5wZW5kaW5nY2ImJihlLmZpbmlzaGVkPSEwLHQuZW1pdCgiZmluaXNoIikpKSxyfVdlLmluaGVyaXRzKFZlLCQpLEdlLnByb3RvdHlwZS5nZXRCdWZmZXI9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5idWZmZXJlZFJlcXVlc3QsZT1bXTt0OyllLnB1c2godCksdD10Lm5leHQ7cmV0dXJuIGV9LGZ1bmN0aW9uKCl7dHJ5e09iamVjdC5kZWZpbmVQcm9wZXJ0eShHZS5wcm90b3R5cGUsImJ1ZmZlciIse2dldDpZZS5kZXByZWNhdGUoKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0QnVmZmVyKCl9KSwiX3dyaXRhYmxlU3RhdGUuYnVmZmVyIGlzIGRlcHJlY2F0ZWQuIFVzZSBfd3JpdGFibGVTdGF0ZS5nZXRCdWZmZXIgaW5zdGVhZC4iLCJERVAwMDAzIil9KX1jYXRjaCh0KXt9fSgpLCJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5oYXNJbnN0YW5jZSYmImZ1bmN0aW9uIj09dHlwZW9mIEZ1bmN0aW9uLnByb3RvdHlwZVtTeW1ib2wuaGFzSW5zdGFuY2VdPyh6ZT1GdW5jdGlvbi5wcm90b3R5cGVbU3ltYm9sLmhhc0luc3RhbmNlXSxPYmplY3QuZGVmaW5lUHJvcGVydHkoVmUsU3ltYm9sLmhhc0luc3RhbmNlLHt2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4hIXplLmNhbGwodGhpcyx0KXx8dGhpcz09PVZlJiYodCYmdC5fd3JpdGFibGVTdGF0ZSBpbnN0YW5jZW9mIEdlKX19KSk6emU9ZnVuY3Rpb24odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiB0aGlzfSxWZS5wcm90b3R5cGUucGlwZT1mdW5jdGlvbigpe3RoaXMuZW1pdCgiZXJyb3IiLG5ldyBFcnJvcigiQ2Fubm90IHBpcGUsIG5vdCByZWFkYWJsZSIpKX0sVmUucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj10aGlzLl93cml0YWJsZVN0YXRlLGk9ITEsbz0hbi5vYmplY3RNb2RlJiZmdW5jdGlvbih0KXtyZXR1cm4gJGUuaXNCdWZmZXIodCl8fHQgaW5zdGFuY2VvZiBIZX0odCk7cmV0dXJuIG8mJiEkZS5pc0J1ZmZlcih0KSYmKHQ9ZnVuY3Rpb24odCl7cmV0dXJuICRlLmZyb20odCl9KHQpKSwiZnVuY3Rpb24iPT10eXBlb2YgZSYmKHI9ZSxlPW51bGwpLG8/ZT0iYnVmZmVyIjplfHwoZT1uLmRlZmF1bHRFbmNvZGluZyksImZ1bmN0aW9uIiE9dHlwZW9mIHImJihyPUplKSxuLmVuZGVkP2Z1bmN0aW9uKHQsZSl7dmFyIHI9bmV3IEVycm9yKCJ3cml0ZSBhZnRlciBlbmQiKTt0LmVtaXQoImVycm9yIixyKSxBLm5leHRUaWNrKGUscil9KHRoaXMscik6KG98fGZ1bmN0aW9uKHQsZSxyLG4pe3ZhciBpPSEwLG89ITE7cmV0dXJuIG51bGw9PT1yP289bmV3IFR5cGVFcnJvcigiTWF5IG5vdCB3cml0ZSBudWxsIHZhbHVlcyB0byBzdHJlYW0iKToic3RyaW5nIj09dHlwZW9mIHJ8fHZvaWQgMD09PXJ8fGUub2JqZWN0TW9kZXx8KG89bmV3IFR5cGVFcnJvcigiSW52YWxpZCBub24tc3RyaW5nL2J1ZmZlciBjaHVuayIpKSxvJiYodC5lbWl0KCJlcnJvciIsbyksQS5uZXh0VGljayhuLG8pLGk9ITEpLGl9KHRoaXMsbix0LHIpKSYmKG4ucGVuZGluZ2NiKyssaT1mdW5jdGlvbih0LGUscixuLGksbyl7aWYoIXIpe3ZhciBhPWZ1bmN0aW9uKHQsZSxyKXt0Lm9iamVjdE1vZGV8fCExPT09dC5kZWNvZGVTdHJpbmdzfHwic3RyaW5nIiE9dHlwZW9mIGV8fChlPSRlLmZyb20oZSxyKSk7cmV0dXJuIGV9KGUsbixpKTtuIT09YSYmKHI9ITAsaT0iYnVmZmVyIixuPWEpfXZhciBzPWUub2JqZWN0TW9kZT8xOm4ubGVuZ3RoO2UubGVuZ3RoKz1zO3ZhciB1PWUubGVuZ3RoPGUuaGlnaFdhdGVyTWFyazt1fHwoZS5uZWVkRHJhaW49ITApO2lmKGUud3JpdGluZ3x8ZS5jb3JrZWQpe3ZhciBmPWUubGFzdEJ1ZmZlcmVkUmVxdWVzdDtlLmxhc3RCdWZmZXJlZFJlcXVlc3Q9e2NodW5rOm4sZW5jb2Rpbmc6aSxpc0J1ZjpyLGNhbGxiYWNrOm8sbmV4dDpudWxsfSxmP2YubmV4dD1lLmxhc3RCdWZmZXJlZFJlcXVlc3Q6ZS5idWZmZXJlZFJlcXVlc3Q9ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0LGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQrPTF9ZWxzZSBLZSh0LGUsITEscyxuLGksbyk7cmV0dXJuIHV9KHRoaXMsbixvLHQsZSxyKSksaX0sVmUucHJvdG90eXBlLmNvcms9ZnVuY3Rpb24oKXt0aGlzLl93cml0YWJsZVN0YXRlLmNvcmtlZCsrfSxWZS5wcm90b3R5cGUudW5jb3JrPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fd3JpdGFibGVTdGF0ZTt0LmNvcmtlZCYmKHQuY29ya2VkLS0sdC53cml0aW5nfHx0LmNvcmtlZHx8dC5maW5pc2hlZHx8dC5idWZmZXJQcm9jZXNzaW5nfHwhdC5idWZmZXJlZFJlcXVlc3R8fFhlKHRoaXMsdCkpfSxWZS5wcm90b3R5cGUuc2V0RGVmYXVsdEVuY29kaW5nPWZ1bmN0aW9uKHQpe2lmKCJzdHJpbmciPT10eXBlb2YgdCYmKHQ9dC50b0xvd2VyQ2FzZSgpKSwhKFsiaGV4IiwidXRmOCIsInV0Zi04IiwiYXNjaWkiLCJiaW5hcnkiLCJiYXNlNjQiLCJ1Y3MyIiwidWNzLTIiLCJ1dGYxNmxlIiwidXRmLTE2bGUiLCJyYXciXS5pbmRleE9mKCh0KyIiKS50b0xvd2VyQ2FzZSgpKT4tMSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIit0KTtyZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5kZWZhdWx0RW5jb2Rpbmc9dCx0aGlzfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoVmUucHJvdG90eXBlLCJ3cml0YWJsZUhpZ2hXYXRlck1hcmsiLHtlbnVtZXJhYmxlOiExLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl93cml0YWJsZVN0YXRlLmhpZ2hXYXRlck1hcmt9fSksVmUucHJvdG90eXBlLl93cml0ZT1mdW5jdGlvbih0LGUscil7cihuZXcgRXJyb3IoIl93cml0ZSgpIGlzIG5vdCBpbXBsZW1lbnRlZCIpKX0sVmUucHJvdG90eXBlLl93cml0ZXY9bnVsbCxWZS5wcm90b3R5cGUuZW5kPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj10aGlzLl93cml0YWJsZVN0YXRlOyJmdW5jdGlvbiI9PXR5cGVvZiB0PyhyPXQsdD1udWxsLGU9bnVsbCk6ImZ1bmN0aW9uIj09dHlwZW9mIGUmJihyPWUsZT1udWxsKSxudWxsIT10JiZ0aGlzLndyaXRlKHQsZSksbi5jb3JrZWQmJihuLmNvcmtlZD0xLHRoaXMudW5jb3JrKCkpLG4uZW5kaW5nfHxuLmZpbmlzaGVkfHxmdW5jdGlvbih0LGUscil7ZS5lbmRpbmc9ITAsZXIodCxlKSxyJiYoZS5maW5pc2hlZD9BLm5leHRUaWNrKHIpOnQub25jZSgiZmluaXNoIixyKSk7ZS5lbmRlZD0hMCx0LndyaXRhYmxlPSExfSh0aGlzLG4scil9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShWZS5wcm90b3R5cGUsImRlc3Ryb3llZCIse2dldDpmdW5jdGlvbigpe3JldHVybiB2b2lkIDAhPT10aGlzLl93cml0YWJsZVN0YXRlJiZ0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZH0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX3dyaXRhYmxlU3RhdGUmJih0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZD10KX19KSxWZS5wcm90b3R5cGUuZGVzdHJveT1CZSxWZS5wcm90b3R5cGUuX3VuZGVzdHJveT1QZSxWZS5wcm90b3R5cGUuX2Rlc3Ryb3k9ZnVuY3Rpb24odCxlKXt0aGlzLmVuZCgpLGUodCl9O3ZhciBycj1PYmplY3Qua2V5c3x8ZnVuY3Rpb24odCl7dmFyIGU9W107Zm9yKHZhciByIGluIHQpZS5wdXNoKHIpO3JldHVybiBlfSxucj11cixpcj1PYmplY3QuY3JlYXRlKEp0KTtpci5pbmhlcml0cz1HdCxpci5pbmhlcml0cyh1cixScik7Zm9yKHZhciBvcj1ycihEZS5wcm90b3R5cGUpLGFyPTA7YXI8b3IubGVuZ3RoO2FyKyspe3ZhciBzcj1vclthcl07dXIucHJvdG90eXBlW3NyXXx8KHVyLnByb3RvdHlwZVtzcl09RGUucHJvdG90eXBlW3NyXSl9ZnVuY3Rpb24gdXIodCl7aWYoISh0aGlzIGluc3RhbmNlb2YgdXIpKXJldHVybiBuZXcgdXIodCk7UnIuY2FsbCh0aGlzLHQpLERlLmNhbGwodGhpcyx0KSx0JiYhMT09PXQucmVhZGFibGUmJih0aGlzLnJlYWRhYmxlPSExKSx0JiYhMT09PXQud3JpdGFibGUmJih0aGlzLndyaXRhYmxlPSExKSx0aGlzLmFsbG93SGFsZk9wZW49ITAsdCYmITE9PT10LmFsbG93SGFsZk9wZW4mJih0aGlzLmFsbG93SGFsZk9wZW49ITEpLHRoaXMub25jZSgiZW5kIixmcil9ZnVuY3Rpb24gZnIoKXt0aGlzLmFsbG93SGFsZk9wZW58fHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kZWR8fEEubmV4dFRpY2soaHIsdGhpcyl9ZnVuY3Rpb24gaHIodCl7dC5lbmQoKX1PYmplY3QuZGVmaW5lUHJvcGVydHkodXIucHJvdG90eXBlLCJ3cml0YWJsZUhpZ2hXYXRlck1hcmsiLHtlbnVtZXJhYmxlOiExLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl93cml0YWJsZVN0YXRlLmhpZ2hXYXRlck1hcmt9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHVyLnByb3RvdHlwZSwiZGVzdHJveWVkIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMCE9PXRoaXMuX3JlYWRhYmxlU3RhdGUmJnZvaWQgMCE9PXRoaXMuX3dyaXRhYmxlU3RhdGUmJih0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZCYmdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQpfSxzZXQ6ZnVuY3Rpb24odCl7dm9pZCAwIT09dGhpcy5fcmVhZGFibGVTdGF0ZSYmdm9pZCAwIT09dGhpcy5fd3JpdGFibGVTdGF0ZSYmKHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkPXQsdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQ9dCl9fSksdXIucHJvdG90eXBlLl9kZXN0cm95PWZ1bmN0aW9uKHQsZSl7dGhpcy5wdXNoKG51bGwpLHRoaXMuZW5kKCksQS5uZXh0VGljayhlLHQpfTt2YXIgbHI9JHQuQnVmZmVyLGNyPWxyLmlzRW5jb2Rpbmd8fGZ1bmN0aW9uKHQpe3N3aXRjaCgodD0iIit0KSYmdC50b0xvd2VyQ2FzZSgpKXtjYXNlImhleCI6Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpjYXNlImFzY2lpIjpjYXNlImJpbmFyeSI6Y2FzZSJiYXNlNjQiOmNhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpjYXNlInJhdyI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19O3ZhciBkcj1wcjtmdW5jdGlvbiBwcih0KXt2YXIgZTtzd2l0Y2godGhpcy5lbmNvZGluZz1mdW5jdGlvbih0KXt2YXIgZT1mdW5jdGlvbih0KXtpZighdClyZXR1cm4idXRmOCI7Zm9yKHZhciBlOzspc3dpdGNoKHQpe2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6cmV0dXJuInV0ZjgiO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4idXRmMTZsZSI7Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4ibGF0aW4xIjtjYXNlImJhc2U2NCI6Y2FzZSJhc2NpaSI6Y2FzZSJoZXgiOnJldHVybiB0O2RlZmF1bHQ6aWYoZSlyZXR1cm47dD0oIiIrdCkudG9Mb3dlckNhc2UoKSxlPSEwfX0odCk7aWYoInN0cmluZyIhPXR5cGVvZiBlJiYobHIuaXNFbmNvZGluZz09PWNyfHwhY3IodCkpKXRocm93IG5ldyBFcnJvcigiVW5rbm93biBlbmNvZGluZzogIit0KTtyZXR1cm4gZXx8dH0odCksdGhpcy5lbmNvZGluZyl7Y2FzZSJ1dGYxNmxlIjp0aGlzLnRleHQ9YnIsdGhpcy5lbmQ9dnIsZT00O2JyZWFrO2Nhc2UidXRmOCI6dGhpcy5maWxsTGFzdD15cixlPTQ7YnJlYWs7Y2FzZSJiYXNlNjQiOnRoaXMudGV4dD13cix0aGlzLmVuZD1tcixlPTM7YnJlYWs7ZGVmYXVsdDpyZXR1cm4gdGhpcy53cml0ZT1fcix2b2lkKHRoaXMuZW5kPVNyKX10aGlzLmxhc3ROZWVkPTAsdGhpcy5sYXN0VG90YWw9MCx0aGlzLmxhc3RDaGFyPWxyLmFsbG9jVW5zYWZlKGUpfWZ1bmN0aW9uIGdyKHQpe3JldHVybiB0PD0xMjc/MDp0Pj41PT02PzI6dD4+ND09MTQ/Mzp0Pj4zPT0zMD80OnQ+PjY9PTI/LTE6LTJ9ZnVuY3Rpb24geXIodCl7dmFyIGU9dGhpcy5sYXN0VG90YWwtdGhpcy5sYXN0TmVlZCxyPWZ1bmN0aW9uKHQsZSxyKXtpZigxMjghPSgxOTImZVswXSkpcmV0dXJuIHQubGFzdE5lZWQ9MCwi77+9IjtpZih0Lmxhc3ROZWVkPjEmJmUubGVuZ3RoPjEpe2lmKDEyOCE9KDE5MiZlWzFdKSlyZXR1cm4gdC5sYXN0TmVlZD0xLCLvv70iO2lmKHQubGFzdE5lZWQ+MiYmZS5sZW5ndGg+MiYmMTI4IT0oMTkyJmVbMl0pKXJldHVybiB0Lmxhc3ROZWVkPTIsIu+/vSJ9fSh0aGlzLHQpO3JldHVybiB2b2lkIDAhPT1yP3I6dGhpcy5sYXN0TmVlZDw9dC5sZW5ndGg/KHQuY29weSh0aGlzLmxhc3RDaGFyLGUsMCx0aGlzLmxhc3ROZWVkKSx0aGlzLmxhc3RDaGFyLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcsMCx0aGlzLmxhc3RUb3RhbCkpOih0LmNvcHkodGhpcy5sYXN0Q2hhcixlLDAsdC5sZW5ndGgpLHZvaWQodGhpcy5sYXN0TmVlZC09dC5sZW5ndGgpKX1mdW5jdGlvbiBicih0LGUpe2lmKCh0Lmxlbmd0aC1lKSUyPT0wKXt2YXIgcj10LnRvU3RyaW5nKCJ1dGYxNmxlIixlKTtpZihyKXt2YXIgbj1yLmNoYXJDb2RlQXQoci5sZW5ndGgtMSk7aWYobj49NTUyOTYmJm48PTU2MzE5KXJldHVybiB0aGlzLmxhc3ROZWVkPTIsdGhpcy5sYXN0VG90YWw9NCx0aGlzLmxhc3RDaGFyWzBdPXRbdC5sZW5ndGgtMl0sdGhpcy5sYXN0Q2hhclsxXT10W3QubGVuZ3RoLTFdLHIuc2xpY2UoMCwtMSl9cmV0dXJuIHJ9cmV0dXJuIHRoaXMubGFzdE5lZWQ9MSx0aGlzLmxhc3RUb3RhbD0yLHRoaXMubGFzdENoYXJbMF09dFt0Lmxlbmd0aC0xXSx0LnRvU3RyaW5nKCJ1dGYxNmxlIixlLHQubGVuZ3RoLTEpfWZ1bmN0aW9uIHZyKHQpe3ZhciBlPXQmJnQubGVuZ3RoP3RoaXMud3JpdGUodCk6IiI7aWYodGhpcy5sYXN0TmVlZCl7dmFyIHI9dGhpcy5sYXN0VG90YWwtdGhpcy5sYXN0TmVlZDtyZXR1cm4gZSt0aGlzLmxhc3RDaGFyLnRvU3RyaW5nKCJ1dGYxNmxlIiwwLHIpfXJldHVybiBlfWZ1bmN0aW9uIHdyKHQsZSl7dmFyIHI9KHQubGVuZ3RoLWUpJTM7cmV0dXJuIDA9PT1yP3QudG9TdHJpbmcoImJhc2U2NCIsZSk6KHRoaXMubGFzdE5lZWQ9My1yLHRoaXMubGFzdFRvdGFsPTMsMT09PXI/dGhpcy5sYXN0Q2hhclswXT10W3QubGVuZ3RoLTFdOih0aGlzLmxhc3RDaGFyWzBdPXRbdC5sZW5ndGgtMl0sdGhpcy5sYXN0Q2hhclsxXT10W3QubGVuZ3RoLTFdKSx0LnRvU3RyaW5nKCJiYXNlNjQiLGUsdC5sZW5ndGgtcikpfWZ1bmN0aW9uIG1yKHQpe3ZhciBlPXQmJnQubGVuZ3RoP3RoaXMud3JpdGUodCk6IiI7cmV0dXJuIHRoaXMubGFzdE5lZWQ/ZSt0aGlzLmxhc3RDaGFyLnRvU3RyaW5nKCJiYXNlNjQiLDAsMy10aGlzLmxhc3ROZWVkKTplfWZ1bmN0aW9uIF9yKHQpe3JldHVybiB0LnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcpfWZ1bmN0aW9uIFNyKHQpe3JldHVybiB0JiZ0Lmxlbmd0aD90aGlzLndyaXRlKHQpOiIifXByLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbih0KXtpZigwPT09dC5sZW5ndGgpcmV0dXJuIiI7dmFyIGUscjtpZih0aGlzLmxhc3ROZWVkKXtpZih2b2lkIDA9PT0oZT10aGlzLmZpbGxMYXN0KHQpKSlyZXR1cm4iIjtyPXRoaXMubGFzdE5lZWQsdGhpcy5sYXN0TmVlZD0wfWVsc2Ugcj0wO3JldHVybiByPHQubGVuZ3RoP2U/ZSt0aGlzLnRleHQodCxyKTp0aGlzLnRleHQodCxyKTplfHwiIn0scHIucHJvdG90eXBlLmVuZD1mdW5jdGlvbih0KXt2YXIgZT10JiZ0Lmxlbmd0aD90aGlzLndyaXRlKHQpOiIiO3JldHVybiB0aGlzLmxhc3ROZWVkP2UrIu+/vSI6ZX0scHIucHJvdG90eXBlLnRleHQ9ZnVuY3Rpb24odCxlKXt2YXIgcj1mdW5jdGlvbih0LGUscil7dmFyIG49ZS5sZW5ndGgtMTtpZihuPHIpcmV0dXJuIDA7dmFyIGk9Z3IoZVtuXSk7aWYoaT49MClyZXR1cm4gaT4wJiYodC5sYXN0TmVlZD1pLTEpLGk7aWYoLS1uPHJ8fC0yPT09aSlyZXR1cm4gMDtpZigoaT1ncihlW25dKSk+PTApcmV0dXJuIGk+MCYmKHQubGFzdE5lZWQ9aS0yKSxpO2lmKC0tbjxyfHwtMj09PWkpcmV0dXJuIDA7aWYoKGk9Z3IoZVtuXSkpPj0wKXJldHVybiBpPjAmJigyPT09aT9pPTA6dC5sYXN0TmVlZD1pLTMpLGk7cmV0dXJuIDB9KHRoaXMsdCxlKTtpZighdGhpcy5sYXN0TmVlZClyZXR1cm4gdC50b1N0cmluZygidXRmOCIsZSk7dGhpcy5sYXN0VG90YWw9cjt2YXIgbj10Lmxlbmd0aC0oci10aGlzLmxhc3ROZWVkKTtyZXR1cm4gdC5jb3B5KHRoaXMubGFzdENoYXIsMCxuKSx0LnRvU3RyaW5nKCJ1dGY4IixlLG4pfSxwci5wcm90b3R5cGUuZmlsbExhc3Q9ZnVuY3Rpb24odCl7aWYodGhpcy5sYXN0TmVlZDw9dC5sZW5ndGgpcmV0dXJuIHQuY29weSh0aGlzLmxhc3RDaGFyLHRoaXMubGFzdFRvdGFsLXRoaXMubGFzdE5lZWQsMCx0aGlzLmxhc3ROZWVkKSx0aGlzLmxhc3RDaGFyLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcsMCx0aGlzLmxhc3RUb3RhbCk7dC5jb3B5KHRoaXMubGFzdENoYXIsdGhpcy5sYXN0VG90YWwtdGhpcy5sYXN0TmVlZCwwLHQubGVuZ3RoKSx0aGlzLmxhc3ROZWVkLT10Lmxlbmd0aH07dmFyIEVyLGtyPXtTdHJpbmdEZWNvZGVyOmRyfSxScj1CcjtCci5SZWFkYWJsZVN0YXRlPUxyLFkuRXZlbnRFbWl0dGVyO3ZhciBqcj1mdW5jdGlvbih0LGUpe3JldHVybiB0Lmxpc3RlbmVycyhlKS5sZW5ndGh9LFRyPSR0LkJ1ZmZlcixPcj1qLlVpbnQ4QXJyYXl8fGZ1bmN0aW9uKCl7fTt2YXIgQXI9T2JqZWN0LmNyZWF0ZShKdCk7QXIuaW5oZXJpdHM9R3Q7dmFyIENyLE1yPXZvaWQgMDtNcj1NZSYmTWUuZGVidWdsb2c/TWUuZGVidWdsb2coInN0cmVhbSIpOmZ1bmN0aW9uKCl7fSxBci5pbmhlcml0cyhCciwkKTt2YXIgeHI9WyJlcnJvciIsImNsb3NlIiwiZGVzdHJveSIsInBhdXNlIiwicmVzdW1lIl07ZnVuY3Rpb24gTHIodCxlKXt0PXR8fHt9O3ZhciByPWUgaW5zdGFuY2VvZihFcj1Fcnx8bnIpO3RoaXMub2JqZWN0TW9kZT0hIXQub2JqZWN0TW9kZSxyJiYodGhpcy5vYmplY3RNb2RlPXRoaXMub2JqZWN0TW9kZXx8ISF0LnJlYWRhYmxlT2JqZWN0TW9kZSk7dmFyIG49dC5oaWdoV2F0ZXJNYXJrLGk9dC5yZWFkYWJsZUhpZ2hXYXRlck1hcmssbz10aGlzLm9iamVjdE1vZGU/MTY6MTYzODQ7dGhpcy5oaWdoV2F0ZXJNYXJrPW58fDA9PT1uP246ciYmKGl8fDA9PT1pKT9pOm8sdGhpcy5oaWdoV2F0ZXJNYXJrPU1hdGguZmxvb3IodGhpcy5oaWdoV2F0ZXJNYXJrKSx0aGlzLmJ1ZmZlcj1uZXcgeGUsdGhpcy5sZW5ndGg9MCx0aGlzLnBpcGVzPW51bGwsdGhpcy5waXBlc0NvdW50PTAsdGhpcy5mbG93aW5nPW51bGwsdGhpcy5lbmRlZD0hMSx0aGlzLmVuZEVtaXR0ZWQ9ITEsdGhpcy5yZWFkaW5nPSExLHRoaXMuc3luYz0hMCx0aGlzLm5lZWRSZWFkYWJsZT0hMSx0aGlzLmVtaXR0ZWRSZWFkYWJsZT0hMSx0aGlzLnJlYWRhYmxlTGlzdGVuaW5nPSExLHRoaXMucmVzdW1lU2NoZWR1bGVkPSExLHRoaXMuZGVzdHJveWVkPSExLHRoaXMuZGVmYXVsdEVuY29kaW5nPXQuZGVmYXVsdEVuY29kaW5nfHwidXRmOCIsdGhpcy5hd2FpdERyYWluPTAsdGhpcy5yZWFkaW5nTW9yZT0hMSx0aGlzLmRlY29kZXI9bnVsbCx0aGlzLmVuY29kaW5nPW51bGwsdC5lbmNvZGluZyYmKENyfHwoQ3I9a3IuU3RyaW5nRGVjb2RlciksdGhpcy5kZWNvZGVyPW5ldyBDcih0LmVuY29kaW5nKSx0aGlzLmVuY29kaW5nPXQuZW5jb2RpbmcpfWZ1bmN0aW9uIEJyKHQpe2lmKEVyPUVyfHxuciwhKHRoaXMgaW5zdGFuY2VvZiBCcikpcmV0dXJuIG5ldyBCcih0KTt0aGlzLl9yZWFkYWJsZVN0YXRlPW5ldyBMcih0LHRoaXMpLHRoaXMucmVhZGFibGU9ITAsdCYmKCJmdW5jdGlvbiI9PXR5cGVvZiB0LnJlYWQmJih0aGlzLl9yZWFkPXQucmVhZCksImZ1bmN0aW9uIj09dHlwZW9mIHQuZGVzdHJveSYmKHRoaXMuX2Rlc3Ryb3k9dC5kZXN0cm95KSksJC5jYWxsKHRoaXMpfWZ1bmN0aW9uIFByKHQsZSxyLG4saSl7dmFyIG8sYT10Ll9yZWFkYWJsZVN0YXRlO251bGw9PT1lPyhhLnJlYWRpbmc9ITEsZnVuY3Rpb24odCxlKXtpZihlLmVuZGVkKXJldHVybjtpZihlLmRlY29kZXIpe3ZhciByPWUuZGVjb2Rlci5lbmQoKTtyJiZyLmxlbmd0aCYmKGUuYnVmZmVyLnB1c2gociksZS5sZW5ndGgrPWUub2JqZWN0TW9kZT8xOnIubGVuZ3RoKX1lLmVuZGVkPSEwLERyKHQpfSh0LGEpKTooaXx8KG89ZnVuY3Rpb24odCxlKXt2YXIgcjsoZnVuY3Rpb24odCl7cmV0dXJuIFRyLmlzQnVmZmVyKHQpfHx0IGluc3RhbmNlb2YgT3J9KShlKXx8InN0cmluZyI9PXR5cGVvZiBlfHx2b2lkIDA9PT1lfHx0Lm9iamVjdE1vZGV8fChyPW5ldyBUeXBlRXJyb3IoIkludmFsaWQgbm9uLXN0cmluZy9idWZmZXIgY2h1bmsiKSk7cmV0dXJuIHJ9KGEsZSkpLG8/dC5lbWl0KCJlcnJvciIsbyk6YS5vYmplY3RNb2RlfHxlJiZlLmxlbmd0aD4wPygic3RyaW5nIj09dHlwZW9mIGV8fGEub2JqZWN0TW9kZXx8T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpPT09VHIucHJvdG90eXBlfHwoZT1mdW5jdGlvbih0KXtyZXR1cm4gVHIuZnJvbSh0KX0oZSkpLG4/YS5lbmRFbWl0dGVkP3QuZW1pdCgiZXJyb3IiLG5ldyBFcnJvcigic3RyZWFtLnVuc2hpZnQoKSBhZnRlciBlbmQgZXZlbnQiKSk6VXIodCxhLGUsITApOmEuZW5kZWQ/dC5lbWl0KCJlcnJvciIsbmV3IEVycm9yKCJzdHJlYW0ucHVzaCgpIGFmdGVyIEVPRiIpKTooYS5yZWFkaW5nPSExLGEuZGVjb2RlciYmIXI/KGU9YS5kZWNvZGVyLndyaXRlKGUpLGEub2JqZWN0TW9kZXx8MCE9PWUubGVuZ3RoP1VyKHQsYSxlLCExKTpxcih0LGEpKTpVcih0LGEsZSwhMSkpKTpufHwoYS5yZWFkaW5nPSExKSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiF0LmVuZGVkJiYodC5uZWVkUmVhZGFibGV8fHQubGVuZ3RoPHQuaGlnaFdhdGVyTWFya3x8MD09PXQubGVuZ3RoKX0oYSl9ZnVuY3Rpb24gVXIodCxlLHIsbil7ZS5mbG93aW5nJiYwPT09ZS5sZW5ndGgmJiFlLnN5bmM/KHQuZW1pdCgiZGF0YSIsciksdC5yZWFkKDApKTooZS5sZW5ndGgrPWUub2JqZWN0TW9kZT8xOnIubGVuZ3RoLG4/ZS5idWZmZXIudW5zaGlmdChyKTplLmJ1ZmZlci5wdXNoKHIpLGUubmVlZFJlYWRhYmxlJiZEcih0KSkscXIodCxlKX1PYmplY3QuZGVmaW5lUHJvcGVydHkoQnIucHJvdG90eXBlLCJkZXN0cm95ZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdm9pZCAwIT09dGhpcy5fcmVhZGFibGVTdGF0ZSYmdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWR9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9yZWFkYWJsZVN0YXRlJiYodGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQ9dCl9fSksQnIucHJvdG90eXBlLmRlc3Ryb3k9QmUsQnIucHJvdG90eXBlLl91bmRlc3Ryb3k9UGUsQnIucHJvdG90eXBlLl9kZXN0cm95PWZ1bmN0aW9uKHQsZSl7dGhpcy5wdXNoKG51bGwpLGUodCl9LEJyLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKHQsZSl7dmFyIHIsbj10aGlzLl9yZWFkYWJsZVN0YXRlO3JldHVybiBuLm9iamVjdE1vZGU/cj0hMDoic3RyaW5nIj09dHlwZW9mIHQmJigoZT1lfHxuLmRlZmF1bHRFbmNvZGluZykhPT1uLmVuY29kaW5nJiYodD1Uci5mcm9tKHQsZSksZT0iIikscj0hMCksUHIodGhpcyx0LGUsITEscil9LEJyLnByb3RvdHlwZS51bnNoaWZ0PWZ1bmN0aW9uKHQpe3JldHVybiBQcih0aGlzLHQsbnVsbCwhMCwhMSl9LEJyLnByb3RvdHlwZS5pc1BhdXNlZD1mdW5jdGlvbigpe3JldHVybiExPT09dGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nfSxCci5wcm90b3R5cGUuc2V0RW5jb2Rpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIENyfHwoQ3I9a3IuU3RyaW5nRGVjb2RlciksdGhpcy5fcmVhZGFibGVTdGF0ZS5kZWNvZGVyPW5ldyBDcih0KSx0aGlzLl9yZWFkYWJsZVN0YXRlLmVuY29kaW5nPXQsdGhpc307ZnVuY3Rpb24gTnIodCxlKXtyZXR1cm4gdDw9MHx8MD09PWUubGVuZ3RoJiZlLmVuZGVkPzA6ZS5vYmplY3RNb2RlPzE6dCE9dD9lLmZsb3dpbmcmJmUubGVuZ3RoP2UuYnVmZmVyLmhlYWQuZGF0YS5sZW5ndGg6ZS5sZW5ndGg6KHQ+ZS5oaWdoV2F0ZXJNYXJrJiYoZS5oaWdoV2F0ZXJNYXJrPWZ1bmN0aW9uKHQpe3JldHVybiB0Pj04Mzg4NjA4P3Q9ODM4ODYwODoodC0tLHR8PXQ+Pj4xLHR8PXQ+Pj4yLHR8PXQ+Pj40LHR8PXQ+Pj44LHR8PXQ+Pj4xNix0KyspLHR9KHQpKSx0PD1lLmxlbmd0aD90OmUuZW5kZWQ/ZS5sZW5ndGg6KGUubmVlZFJlYWRhYmxlPSEwLDApKX1mdW5jdGlvbiBEcih0KXt2YXIgZT10Ll9yZWFkYWJsZVN0YXRlO2UubmVlZFJlYWRhYmxlPSExLGUuZW1pdHRlZFJlYWRhYmxlfHwoTXIoImVtaXRSZWFkYWJsZSIsZS5mbG93aW5nKSxlLmVtaXR0ZWRSZWFkYWJsZT0hMCxlLnN5bmM/QS5uZXh0VGljayhJcix0KTpJcih0KSl9ZnVuY3Rpb24gSXIodCl7TXIoImVtaXQgcmVhZGFibGUiKSx0LmVtaXQoInJlYWRhYmxlIiksWXIodCl9ZnVuY3Rpb24gcXIodCxlKXtlLnJlYWRpbmdNb3JlfHwoZS5yZWFkaW5nTW9yZT0hMCxBLm5leHRUaWNrKEZyLHQsZSkpfWZ1bmN0aW9uIEZyKHQsZSl7Zm9yKHZhciByPWUubGVuZ3RoOyFlLnJlYWRpbmcmJiFlLmZsb3dpbmcmJiFlLmVuZGVkJiZlLmxlbmd0aDxlLmhpZ2hXYXRlck1hcmsmJihNcigibWF5YmVSZWFkTW9yZSByZWFkIDAiKSx0LnJlYWQoMCksciE9PWUubGVuZ3RoKTspcj1lLmxlbmd0aDtlLnJlYWRpbmdNb3JlPSExfWZ1bmN0aW9uIFdyKHQpe01yKCJyZWFkYWJsZSBuZXh0dGljayByZWFkIDAiKSx0LnJlYWQoMCl9ZnVuY3Rpb24genIodCxlKXtlLnJlYWRpbmd8fChNcigicmVzdW1lIHJlYWQgMCIpLHQucmVhZCgwKSksZS5yZXN1bWVTY2hlZHVsZWQ9ITEsZS5hd2FpdERyYWluPTAsdC5lbWl0KCJyZXN1bWUiKSxZcih0KSxlLmZsb3dpbmcmJiFlLnJlYWRpbmcmJnQucmVhZCgwKX1mdW5jdGlvbiBZcih0KXt2YXIgZT10Ll9yZWFkYWJsZVN0YXRlO2ZvcihNcigiZmxvdyIsZS5mbG93aW5nKTtlLmZsb3dpbmcmJm51bGwhPT10LnJlYWQoKTspO31mdW5jdGlvbiAkcih0LGUpe3JldHVybiAwPT09ZS5sZW5ndGg/bnVsbDooZS5vYmplY3RNb2RlP3I9ZS5idWZmZXIuc2hpZnQoKTohdHx8dD49ZS5sZW5ndGg/KHI9ZS5kZWNvZGVyP2UuYnVmZmVyLmpvaW4oIiIpOjE9PT1lLmJ1ZmZlci5sZW5ndGg/ZS5idWZmZXIuaGVhZC5kYXRhOmUuYnVmZmVyLmNvbmNhdChlLmxlbmd0aCksZS5idWZmZXIuY2xlYXIoKSk6cj1mdW5jdGlvbih0LGUscil7dmFyIG47dDxlLmhlYWQuZGF0YS5sZW5ndGg/KG49ZS5oZWFkLmRhdGEuc2xpY2UoMCx0KSxlLmhlYWQuZGF0YT1lLmhlYWQuZGF0YS5zbGljZSh0KSk6bj10PT09ZS5oZWFkLmRhdGEubGVuZ3RoP2Uuc2hpZnQoKTpyP2Z1bmN0aW9uKHQsZSl7dmFyIHI9ZS5oZWFkLG49MSxpPXIuZGF0YTt0LT1pLmxlbmd0aDtmb3IoO3I9ci5uZXh0Oyl7dmFyIG89ci5kYXRhLGE9dD5vLmxlbmd0aD9vLmxlbmd0aDp0O2lmKGE9PT1vLmxlbmd0aD9pKz1vOmkrPW8uc2xpY2UoMCx0KSwwPT09KHQtPWEpKXthPT09by5sZW5ndGg/KCsrbixyLm5leHQ/ZS5oZWFkPXIubmV4dDplLmhlYWQ9ZS50YWlsPW51bGwpOihlLmhlYWQ9cixyLmRhdGE9by5zbGljZShhKSk7YnJlYWt9KytufXJldHVybiBlLmxlbmd0aC09bixpfSh0LGUpOmZ1bmN0aW9uKHQsZSl7dmFyIHI9VHIuYWxsb2NVbnNhZmUodCksbj1lLmhlYWQsaT0xO24uZGF0YS5jb3B5KHIpLHQtPW4uZGF0YS5sZW5ndGg7Zm9yKDtuPW4ubmV4dDspe3ZhciBvPW4uZGF0YSxhPXQ+by5sZW5ndGg/by5sZW5ndGg6dDtpZihvLmNvcHkocixyLmxlbmd0aC10LDAsYSksMD09PSh0LT1hKSl7YT09PW8ubGVuZ3RoPygrK2ksbi5uZXh0P2UuaGVhZD1uLm5leHQ6ZS5oZWFkPWUudGFpbD1udWxsKTooZS5oZWFkPW4sbi5kYXRhPW8uc2xpY2UoYSkpO2JyZWFrfSsraX1yZXR1cm4gZS5sZW5ndGgtPWkscn0odCxlKTtyZXR1cm4gbn0odCxlLmJ1ZmZlcixlLmRlY29kZXIpLHIpO3ZhciByfWZ1bmN0aW9uIEhyKHQpe3ZhciBlPXQuX3JlYWRhYmxlU3RhdGU7aWYoZS5sZW5ndGg+MCl0aHJvdyBuZXcgRXJyb3IoJyJlbmRSZWFkYWJsZSgpIiBjYWxsZWQgb24gbm9uLWVtcHR5IHN0cmVhbScpO2UuZW5kRW1pdHRlZHx8KGUuZW5kZWQ9ITAsQS5uZXh0VGljayhKcixlLHQpKX1mdW5jdGlvbiBKcih0LGUpe3QuZW5kRW1pdHRlZHx8MCE9PXQubGVuZ3RofHwodC5lbmRFbWl0dGVkPSEwLGUucmVhZGFibGU9ITEsZS5lbWl0KCJlbmQiKSl9ZnVuY3Rpb24gR3IodCxlKXtmb3IodmFyIHI9MCxuPXQubGVuZ3RoO3I8bjtyKyspaWYodFtyXT09PWUpcmV0dXJuIHI7cmV0dXJuLTF9QnIucHJvdG90eXBlLnJlYWQ9ZnVuY3Rpb24odCl7TXIoInJlYWQiLHQpLHQ9cGFyc2VJbnQodCwxMCk7dmFyIGU9dGhpcy5fcmVhZGFibGVTdGF0ZSxyPXQ7aWYoMCE9PXQmJihlLmVtaXR0ZWRSZWFkYWJsZT0hMSksMD09PXQmJmUubmVlZFJlYWRhYmxlJiYoZS5sZW5ndGg+PWUuaGlnaFdhdGVyTWFya3x8ZS5lbmRlZCkpcmV0dXJuIE1yKCJyZWFkOiBlbWl0UmVhZGFibGUiLGUubGVuZ3RoLGUuZW5kZWQpLDA9PT1lLmxlbmd0aCYmZS5lbmRlZD9Icih0aGlzKTpEcih0aGlzKSxudWxsO2lmKDA9PT0odD1Ocih0LGUpKSYmZS5lbmRlZClyZXR1cm4gMD09PWUubGVuZ3RoJiZIcih0aGlzKSxudWxsO3ZhciBuLGk9ZS5uZWVkUmVhZGFibGU7cmV0dXJuIE1yKCJuZWVkIHJlYWRhYmxlIixpKSwoMD09PWUubGVuZ3RofHxlLmxlbmd0aC10PGUuaGlnaFdhdGVyTWFyaykmJk1yKCJsZW5ndGggbGVzcyB0aGFuIHdhdGVybWFyayIsaT0hMCksZS5lbmRlZHx8ZS5yZWFkaW5nP01yKCJyZWFkaW5nIG9yIGVuZGVkIixpPSExKTppJiYoTXIoImRvIHJlYWQiKSxlLnJlYWRpbmc9ITAsZS5zeW5jPSEwLDA9PT1lLmxlbmd0aCYmKGUubmVlZFJlYWRhYmxlPSEwKSx0aGlzLl9yZWFkKGUuaGlnaFdhdGVyTWFyayksZS5zeW5jPSExLGUucmVhZGluZ3x8KHQ9TnIocixlKSkpLG51bGw9PT0obj10PjA/JHIodCxlKTpudWxsKT8oZS5uZWVkUmVhZGFibGU9ITAsdD0wKTplLmxlbmd0aC09dCwwPT09ZS5sZW5ndGgmJihlLmVuZGVkfHwoZS5uZWVkUmVhZGFibGU9ITApLHIhPT10JiZlLmVuZGVkJiZIcih0aGlzKSksbnVsbCE9PW4mJnRoaXMuZW1pdCgiZGF0YSIsbiksbn0sQnIucHJvdG90eXBlLl9yZWFkPWZ1bmN0aW9uKHQpe3RoaXMuZW1pdCgiZXJyb3IiLG5ldyBFcnJvcigiX3JlYWQoKSBpcyBub3QgaW1wbGVtZW50ZWQiKSl9LEJyLnByb3RvdHlwZS5waXBlPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcyxuPXRoaXMuX3JlYWRhYmxlU3RhdGU7c3dpdGNoKG4ucGlwZXNDb3VudCl7Y2FzZSAwOm4ucGlwZXM9dDticmVhaztjYXNlIDE6bi5waXBlcz1bbi5waXBlcyx0XTticmVhaztkZWZhdWx0Om4ucGlwZXMucHVzaCh0KX1uLnBpcGVzQ291bnQrPTEsTXIoInBpcGUgY291bnQ9JWQgb3B0cz0laiIsbi5waXBlc0NvdW50LGUpO3ZhciBpPSghZXx8ITEhPT1lLmVuZCkmJnQhPT1SLnN0ZG91dCYmdCE9PVIuc3RkZXJyP2E6cDtmdW5jdGlvbiBvKGUsaSl7TXIoIm9udW5waXBlIiksZT09PXImJmkmJiExPT09aS5oYXNVbnBpcGVkJiYoaS5oYXNVbnBpcGVkPSEwLE1yKCJjbGVhbnVwIiksdC5yZW1vdmVMaXN0ZW5lcigiY2xvc2UiLGMpLHQucmVtb3ZlTGlzdGVuZXIoImZpbmlzaCIsZCksdC5yZW1vdmVMaXN0ZW5lcigiZHJhaW4iLHMpLHQucmVtb3ZlTGlzdGVuZXIoImVycm9yIixsKSx0LnJlbW92ZUxpc3RlbmVyKCJ1bnBpcGUiLG8pLHIucmVtb3ZlTGlzdGVuZXIoImVuZCIsYSksci5yZW1vdmVMaXN0ZW5lcigiZW5kIixwKSxyLnJlbW92ZUxpc3RlbmVyKCJkYXRhIixoKSx1PSEwLCFuLmF3YWl0RHJhaW58fHQuX3dyaXRhYmxlU3RhdGUmJiF0Ll93cml0YWJsZVN0YXRlLm5lZWREcmFpbnx8cygpKX1mdW5jdGlvbiBhKCl7TXIoIm9uZW5kIiksdC5lbmQoKX1uLmVuZEVtaXR0ZWQ/QS5uZXh0VGljayhpKTpyLm9uY2UoImVuZCIsaSksdC5vbigidW5waXBlIixvKTt2YXIgcz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10Ll9yZWFkYWJsZVN0YXRlO01yKCJwaXBlT25EcmFpbiIsZS5hd2FpdERyYWluKSxlLmF3YWl0RHJhaW4mJmUuYXdhaXREcmFpbi0tLDA9PT1lLmF3YWl0RHJhaW4mJmpyKHQsImRhdGEiKSYmKGUuZmxvd2luZz0hMCxZcih0KSl9fShyKTt0Lm9uKCJkcmFpbiIscyk7dmFyIHU9ITE7dmFyIGY9ITE7ZnVuY3Rpb24gaChlKXtNcigib25kYXRhIiksZj0hMSwhMSE9PXQud3JpdGUoZSl8fGZ8fCgoMT09PW4ucGlwZXNDb3VudCYmbi5waXBlcz09PXR8fG4ucGlwZXNDb3VudD4xJiYtMSE9PUdyKG4ucGlwZXMsdCkpJiYhdSYmKE1yKCJmYWxzZSB3cml0ZSByZXNwb25zZSwgcGF1c2UiLHIuX3JlYWRhYmxlU3RhdGUuYXdhaXREcmFpbiksci5fcmVhZGFibGVTdGF0ZS5hd2FpdERyYWluKyssZj0hMCksci5wYXVzZSgpKX1mdW5jdGlvbiBsKGUpe01yKCJvbmVycm9yIixlKSxwKCksdC5yZW1vdmVMaXN0ZW5lcigiZXJyb3IiLGwpLDA9PT1qcih0LCJlcnJvciIpJiZ0LmVtaXQoImVycm9yIixlKX1mdW5jdGlvbiBjKCl7dC5yZW1vdmVMaXN0ZW5lcigiZmluaXNoIixkKSxwKCl9ZnVuY3Rpb24gZCgpe01yKCJvbmZpbmlzaCIpLHQucmVtb3ZlTGlzdGVuZXIoImNsb3NlIixjKSxwKCl9ZnVuY3Rpb24gcCgpe01yKCJ1bnBpcGUiKSxyLnVucGlwZSh0KX1yZXR1cm4gci5vbigiZGF0YSIsaCksZnVuY3Rpb24odCxlLHIpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0LnByZXBlbmRMaXN0ZW5lcilyZXR1cm4gdC5wcmVwZW5kTGlzdGVuZXIoZSxyKTt0Ll9ldmVudHMmJnQuX2V2ZW50c1tlXT9NKHQuX2V2ZW50c1tlXSk/dC5fZXZlbnRzW2VdLnVuc2hpZnQocik6dC5fZXZlbnRzW2VdPVtyLHQuX2V2ZW50c1tlXV06dC5vbihlLHIpfSh0LCJlcnJvciIsbCksdC5vbmNlKCJjbG9zZSIsYyksdC5vbmNlKCJmaW5pc2giLGQpLHQuZW1pdCgicGlwZSIsciksbi5mbG93aW5nfHwoTXIoInBpcGUgcmVzdW1lIiksci5yZXN1bWUoKSksdH0sQnIucHJvdG90eXBlLnVucGlwZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9yZWFkYWJsZVN0YXRlLHI9e2hhc1VucGlwZWQ6ITF9O2lmKDA9PT1lLnBpcGVzQ291bnQpcmV0dXJuIHRoaXM7aWYoMT09PWUucGlwZXNDb3VudClyZXR1cm4gdCYmdCE9PWUucGlwZXN8fCh0fHwodD1lLnBpcGVzKSxlLnBpcGVzPW51bGwsZS5waXBlc0NvdW50PTAsZS5mbG93aW5nPSExLHQmJnQuZW1pdCgidW5waXBlIix0aGlzLHIpKSx0aGlzO2lmKCF0KXt2YXIgbj1lLnBpcGVzLGk9ZS5waXBlc0NvdW50O2UucGlwZXM9bnVsbCxlLnBpcGVzQ291bnQ9MCxlLmZsb3dpbmc9ITE7Zm9yKHZhciBvPTA7bzxpO28rKyluW29dLmVtaXQoInVucGlwZSIsdGhpcyxyKTtyZXR1cm4gdGhpc312YXIgYT1HcihlLnBpcGVzLHQpO3JldHVybi0xPT09YXx8KGUucGlwZXMuc3BsaWNlKGEsMSksZS5waXBlc0NvdW50LT0xLDE9PT1lLnBpcGVzQ291bnQmJihlLnBpcGVzPWUucGlwZXNbMF0pLHQuZW1pdCgidW5waXBlIix0aGlzLHIpKSx0aGlzfSxCci5wcm90b3R5cGUub249ZnVuY3Rpb24odCxlKXt2YXIgcj0kLnByb3RvdHlwZS5vbi5jYWxsKHRoaXMsdCxlKTtpZigiZGF0YSI9PT10KSExIT09dGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nJiZ0aGlzLnJlc3VtZSgpO2Vsc2UgaWYoInJlYWRhYmxlIj09PXQpe3ZhciBuPXRoaXMuX3JlYWRhYmxlU3RhdGU7bi5lbmRFbWl0dGVkfHxuLnJlYWRhYmxlTGlzdGVuaW5nfHwobi5yZWFkYWJsZUxpc3RlbmluZz1uLm5lZWRSZWFkYWJsZT0hMCxuLmVtaXR0ZWRSZWFkYWJsZT0hMSxuLnJlYWRpbmc/bi5sZW5ndGgmJkRyKHRoaXMpOkEubmV4dFRpY2soV3IsdGhpcykpfXJldHVybiByfSxCci5wcm90b3R5cGUuYWRkTGlzdGVuZXI9QnIucHJvdG90eXBlLm9uLEJyLnByb3RvdHlwZS5yZXN1bWU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9yZWFkYWJsZVN0YXRlO3JldHVybiB0LmZsb3dpbmd8fChNcigicmVzdW1lIiksdC5mbG93aW5nPSEwLGZ1bmN0aW9uKHQsZSl7ZS5yZXN1bWVTY2hlZHVsZWR8fChlLnJlc3VtZVNjaGVkdWxlZD0hMCxBLm5leHRUaWNrKHpyLHQsZSkpfSh0aGlzLHQpKSx0aGlzfSxCci5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXtyZXR1cm4gTXIoImNhbGwgcGF1c2UgZmxvd2luZz0laiIsdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nKSwhMSE9PXRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyYmKE1yKCJwYXVzZSIpLHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZz0hMSx0aGlzLmVtaXQoInBhdXNlIikpLHRoaXN9LEJyLnByb3RvdHlwZS53cmFwPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMscj10aGlzLl9yZWFkYWJsZVN0YXRlLG49ITE7Zm9yKHZhciBpIGluIHQub24oImVuZCIsKGZ1bmN0aW9uKCl7aWYoTXIoIndyYXBwZWQgZW5kIiksci5kZWNvZGVyJiYhci5lbmRlZCl7dmFyIHQ9ci5kZWNvZGVyLmVuZCgpO3QmJnQubGVuZ3RoJiZlLnB1c2godCl9ZS5wdXNoKG51bGwpfSkpLHQub24oImRhdGEiLChmdW5jdGlvbihpKXsoTXIoIndyYXBwZWQgZGF0YSIpLHIuZGVjb2RlciYmKGk9ci5kZWNvZGVyLndyaXRlKGkpKSxyLm9iamVjdE1vZGUmJm51bGw9PWkpfHwoci5vYmplY3RNb2RlfHxpJiZpLmxlbmd0aCkmJihlLnB1c2goaSl8fChuPSEwLHQucGF1c2UoKSkpfSkpLHQpdm9pZCAwPT09dGhpc1tpXSYmImZ1bmN0aW9uIj09dHlwZW9mIHRbaV0mJih0aGlzW2ldPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0W2VdLmFwcGx5KHQsYXJndW1lbnRzKX19KGkpKTtmb3IodmFyIG89MDtvPHhyLmxlbmd0aDtvKyspdC5vbih4cltvXSx0aGlzLmVtaXQuYmluZCh0aGlzLHhyW29dKSk7cmV0dXJuIHRoaXMuX3JlYWQ9ZnVuY3Rpb24oZSl7TXIoIndyYXBwZWQgX3JlYWQiLGUpLG4mJihuPSExLHQucmVzdW1lKCkpfSx0aGlzfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoQnIucHJvdG90eXBlLCJyZWFkYWJsZUhpZ2hXYXRlck1hcmsiLHtlbnVtZXJhYmxlOiExLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmhpZ2hXYXRlck1hcmt9fSksQnIuX2Zyb21MaXN0PSRyO3ZhciBWcj1YcixLcj1PYmplY3QuY3JlYXRlKEp0KTtmdW5jdGlvbiBacih0LGUpe3ZhciByPXRoaXMuX3RyYW5zZm9ybVN0YXRlO3IudHJhbnNmb3JtaW5nPSExO3ZhciBuPXIud3JpdGVjYjtpZighbilyZXR1cm4gdGhpcy5lbWl0KCJlcnJvciIsbmV3IEVycm9yKCJ3cml0ZSBjYWxsYmFjayBjYWxsZWQgbXVsdGlwbGUgdGltZXMiKSk7ci53cml0ZWNodW5rPW51bGwsci53cml0ZWNiPW51bGwsbnVsbCE9ZSYmdGhpcy5wdXNoKGUpLG4odCk7dmFyIGk9dGhpcy5fcmVhZGFibGVTdGF0ZTtpLnJlYWRpbmc9ITEsKGkubmVlZFJlYWRhYmxlfHxpLmxlbmd0aDxpLmhpZ2hXYXRlck1hcmspJiZ0aGlzLl9yZWFkKGkuaGlnaFdhdGVyTWFyayl9ZnVuY3Rpb24gWHIodCl7aWYoISh0aGlzIGluc3RhbmNlb2YgWHIpKXJldHVybiBuZXcgWHIodCk7bnIuY2FsbCh0aGlzLHQpLHRoaXMuX3RyYW5zZm9ybVN0YXRlPXthZnRlclRyYW5zZm9ybTpaci5iaW5kKHRoaXMpLG5lZWRUcmFuc2Zvcm06ITEsdHJhbnNmb3JtaW5nOiExLHdyaXRlY2I6bnVsbCx3cml0ZWNodW5rOm51bGwsd3JpdGVlbmNvZGluZzpudWxsfSx0aGlzLl9yZWFkYWJsZVN0YXRlLm5lZWRSZWFkYWJsZT0hMCx0aGlzLl9yZWFkYWJsZVN0YXRlLnN5bmM9ITEsdCYmKCJmdW5jdGlvbiI9PXR5cGVvZiB0LnRyYW5zZm9ybSYmKHRoaXMuX3RyYW5zZm9ybT10LnRyYW5zZm9ybSksImZ1bmN0aW9uIj09dHlwZW9mIHQuZmx1c2gmJih0aGlzLl9mbHVzaD10LmZsdXNoKSksdGhpcy5vbigicHJlZmluaXNoIixRcil9ZnVuY3Rpb24gUXIoKXt2YXIgdD10aGlzOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLl9mbHVzaD90aGlzLl9mbHVzaCgoZnVuY3Rpb24oZSxyKXt0bih0LGUscil9KSk6dG4odGhpcyxudWxsLG51bGwpfWZ1bmN0aW9uIHRuKHQsZSxyKXtpZihlKXJldHVybiB0LmVtaXQoImVycm9yIixlKTtpZihudWxsIT1yJiZ0LnB1c2gociksdC5fd3JpdGFibGVTdGF0ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJDYWxsaW5nIHRyYW5zZm9ybSBkb25lIHdoZW4gd3MubGVuZ3RoICE9IDAiKTtpZih0Ll90cmFuc2Zvcm1TdGF0ZS50cmFuc2Zvcm1pbmcpdGhyb3cgbmV3IEVycm9yKCJDYWxsaW5nIHRyYW5zZm9ybSBkb25lIHdoZW4gc3RpbGwgdHJhbnNmb3JtaW5nIik7cmV0dXJuIHQucHVzaChudWxsKX1Lci5pbmhlcml0cz1HdCxLci5pbmhlcml0cyhYcixuciksWHIucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fdHJhbnNmb3JtU3RhdGUubmVlZFRyYW5zZm9ybT0hMSxuci5wcm90b3R5cGUucHVzaC5jYWxsKHRoaXMsdCxlKX0sWHIucHJvdG90eXBlLl90cmFuc2Zvcm09ZnVuY3Rpb24odCxlLHIpe3Rocm93IG5ldyBFcnJvcigiX3RyYW5zZm9ybSgpIGlzIG5vdCBpbXBsZW1lbnRlZCIpfSxYci5wcm90b3R5cGUuX3dyaXRlPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj10aGlzLl90cmFuc2Zvcm1TdGF0ZTtpZihuLndyaXRlY2I9cixuLndyaXRlY2h1bms9dCxuLndyaXRlZW5jb2Rpbmc9ZSwhbi50cmFuc2Zvcm1pbmcpe3ZhciBpPXRoaXMuX3JlYWRhYmxlU3RhdGU7KG4ubmVlZFRyYW5zZm9ybXx8aS5uZWVkUmVhZGFibGV8fGkubGVuZ3RoPGkuaGlnaFdhdGVyTWFyaykmJnRoaXMuX3JlYWQoaS5oaWdoV2F0ZXJNYXJrKX19LFhyLnByb3RvdHlwZS5fcmVhZD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl90cmFuc2Zvcm1TdGF0ZTtudWxsIT09ZS53cml0ZWNodW5rJiZlLndyaXRlY2ImJiFlLnRyYW5zZm9ybWluZz8oZS50cmFuc2Zvcm1pbmc9ITAsdGhpcy5fdHJhbnNmb3JtKGUud3JpdGVjaHVuayxlLndyaXRlZW5jb2RpbmcsZS5hZnRlclRyYW5zZm9ybSkpOmUubmVlZFRyYW5zZm9ybT0hMH0sWHIucHJvdG90eXBlLl9kZXN0cm95PWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcztuci5wcm90b3R5cGUuX2Rlc3Ryb3kuY2FsbCh0aGlzLHQsKGZ1bmN0aW9uKHQpe2UodCksci5lbWl0KCJjbG9zZSIpfSkpfTt2YXIgZW49bm4scm49T2JqZWN0LmNyZWF0ZShKdCk7ZnVuY3Rpb24gbm4odCl7aWYoISh0aGlzIGluc3RhbmNlb2Ygbm4pKXJldHVybiBuZXcgbm4odCk7VnIuY2FsbCh0aGlzLHQpfXJuLmluaGVyaXRzPUd0LHJuLmluaGVyaXRzKG5uLFZyKSxubi5wcm90b3R5cGUuX3RyYW5zZm9ybT1mdW5jdGlvbih0LGUscil7cihudWxsLHQpfTt2YXIgb249TygoZnVuY3Rpb24odCxlKXsoZT10LmV4cG9ydHM9UnIpLlN0cmVhbT1lLGUuUmVhZGFibGU9ZSxlLldyaXRhYmxlPURlLGUuRHVwbGV4PW5yLGUuVHJhbnNmb3JtPVZyLGUuUGFzc1Rocm91Z2g9ZW59KSkuUmVhZGFibGUsYW49dW47dW4uY3Rvcj1mbix1bi5vYmo9ZnVuY3Rpb24odCxlKXsoImZ1bmN0aW9uIj09dHlwZW9mIHR8fEFycmF5LmlzQXJyYXkodCkpJiYoZT10LHQ9e30pO3JldHVybih0PWxuKHQpKS5vYmplY3RNb2RlPSEwLHQuaGlnaFdhdGVyTWFyaz0xNix1bih0LGUpfTt2YXIgc249Zm4oKTtmdW5jdGlvbiB1bih0LGUpeygib2JqZWN0IiE9dHlwZW9mIHR8fEFycmF5LmlzQXJyYXkodCkpJiYoZT10LHQ9e30pO3ZhciByLG49bmV3IHNuKHQpO3JldHVybiBuLl9mcm9tPUFycmF5LmlzQXJyYXkoZSk/KHI9KHI9ZSkuc2xpY2UoKSxmdW5jdGlvbih0LGUpe3ZhciBuPW51bGwsaT1yLmxlbmd0aD9yLnNoaWZ0KCk6bnVsbDtpIGluc3RhbmNlb2YgRXJyb3ImJihuPWksaT1udWxsKSxlKG4saSl9KTplfHxobixufWZ1bmN0aW9uIGZuKHQsZSl7ZnVuY3Rpb24gcihlKXtpZighKHRoaXMgaW5zdGFuY2VvZiByKSlyZXR1cm4gbmV3IHIoZSk7dGhpcy5fcmVhZGluZz0hMSx0aGlzLl9jYWxsYmFjaz1mdW5jdGlvbih0LGUpe2lmKG4uZGVzdHJveWVkKXJldHVybjtpZih0KXJldHVybiBuLmRlc3Ryb3kodCk7aWYobnVsbD09PWUpcmV0dXJuIG4ucHVzaChudWxsKTtuLl9yZWFkaW5nPSExLG4ucHVzaChlKSYmbi5fcmVhZChpKX0sdGhpcy5kZXN0cm95ZWQ9ITEsb24uY2FsbCh0aGlzLGV8fHQpO3ZhciBuPXRoaXMsaT10aGlzLl9yZWFkYWJsZVN0YXRlLmhpZ2hXYXRlck1hcmt9cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQmJihlPXQsdD17fSksdD1sbih0KSxHdChyLG9uKSxyLnByb3RvdHlwZS5fZnJvbT1lfHxobixyLnByb3RvdHlwZS5fcmVhZD1mdW5jdGlvbih0KXt0aGlzLl9yZWFkaW5nfHx0aGlzLmRlc3Ryb3llZHx8KHRoaXMuX3JlYWRpbmc9ITAsdGhpcy5fZnJvbSh0LHRoaXMuX2NhbGxiYWNrKSl9LHIucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24odCl7aWYoIXRoaXMuZGVzdHJveWVkKXt0aGlzLmRlc3Ryb3llZD0hMDt2YXIgZT10aGlzO1IubmV4dFRpY2soKGZ1bmN0aW9uKCl7dCYmZS5lbWl0KCJlcnJvciIsdCksZS5lbWl0KCJjbG9zZSIpfSkpfX0scn1mdW5jdGlvbiBobigpe31mdW5jdGlvbiBsbih0KXtyZXR1cm4gdD10fHx7fX12YXIgY24sZG49MSxwbj17fSxnbj0hMSx5bj10LmRvY3VtZW50O2Z1bmN0aW9uIGJuKHQpeyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1uZXcgRnVuY3Rpb24oIiIrdCkpO2Zvcih2YXIgZT1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aC0xKSxyPTA7cjxlLmxlbmd0aDtyKyspZVtyXT1hcmd1bWVudHNbcisxXTt2YXIgbj17Y2FsbGJhY2s6dCxhcmdzOmV9O3JldHVybiBwbltkbl09bixjbihkbiksZG4rK31mdW5jdGlvbiB2bih0KXtpZihnbilzZXRUaW1lb3V0KHZuLDAsdCk7ZWxzZXt2YXIgZT1wblt0XTtpZihlKXtnbj0hMDt0cnl7IWZ1bmN0aW9uKHQpe3ZhciBlPXQuY2FsbGJhY2sscj10LmFyZ3M7c3dpdGNoKHIubGVuZ3RoKXtjYXNlIDA6ZSgpO2JyZWFrO2Nhc2UgMTplKHJbMF0pO2JyZWFrO2Nhc2UgMjplKHJbMF0sclsxXSk7YnJlYWs7Y2FzZSAzOmUoclswXSxyWzFdLHJbMl0pO2JyZWFrO2RlZmF1bHQ6ZS5hcHBseSh2b2lkIDAscil9fShlKX1maW5hbGx5eyFmdW5jdGlvbih0KXtkZWxldGUgcG5bdF19KHQpLGduPSExfX19fXZhciB3bixtbixfbixTbixFbj1PYmplY3QuZ2V0UHJvdG90eXBlT2YmJk9iamVjdC5nZXRQcm90b3R5cGVPZih0KTtmdW5jdGlvbiBrbih0KXtsZXQgZSxyPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KTtpZihlPSJbb2JqZWN0IFByb21pc2VdIj09PXIsZSlyZXR1cm4hMDtpZigiW29iamVjdCBGdW5jdGlvbl0iIT09cilyZXR1cm4hMTt0cnl7ZT0iZnVuY3Rpb24iIT10eXBlb2YgdC5zdWJzY3JpYmUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LnRoZW59Y2F0Y2godCl7fXJldHVybiBlfWZ1bmN0aW9uIFJuKHQpe2xldCBlLHIsbjtmdW5jdGlvbiBpKGkpeygodD1pKWluc3RhbmNlb2YgQXJyYXlCdWZmZXJ8fEFycmF5QnVmZmVyLmlzVmlldyh0KSYmIWF0LmlzQnVmZmVyKHQpKSYmKHQ9YXQuZnJvbSh0KSksZT1rbih0KT90Om51bGw7Y29uc3Qgbz0hZSYmdFtTeW1ib2wuaXRlcmF0b3JdJiYic3RyaW5nIiE9dHlwZW9mIHQmJiFhdC5pc0J1ZmZlcih0KTtyPW8/dFtTeW1ib2wuaXRlcmF0b3JdKCk6bnVsbDtjb25zdCBhPSFlJiZ0W1N5bWJvbC5hc3luY0l0ZXJhdG9yXTtuPWE/dFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTpudWxsfXJldHVybiBBcnJheS5pc0FycmF5KHQpJiYodD10LnNsaWNlKCkpLGkodCksYW4oKGZ1bmN0aW9uIG8oYSxzKXtpZihlKXJldHVybiB2b2lkKGFzeW5jKCk9Pnt0cnl7YXdhaXQgaShhd2FpdCBlKSxvLmNhbGwodGhpcyxhLHMpfWNhdGNoKHQpe3ModCl9fSkoKTtpZihyKXtjb25zdCB0PXIubmV4dCgpO3JldHVybiB2b2lkIGJuKHMsbnVsbCx0LmRvbmU/bnVsbDp0LnZhbHVlKX1pZihuKXJldHVybiB2b2lkKGFzeW5jKCk9Pnt0cnl7Y29uc3QgdD1hd2FpdCBuLm5leHQoKTtibihzLG51bGwsdC5kb25lP251bGw6dC52YWx1ZSl9Y2F0Y2godCl7Ym4ocyx0KX19KSgpO2lmKDA9PT10Lmxlbmd0aClyZXR1cm4gdm9pZCBibihzLG51bGwsbnVsbCk7Y29uc3QgdT10LnNsaWNlKDAsYSk7dD10LnNsaWNlKGEpLGJuKHMsbnVsbCx1KX0pKX1Fbj1FbiYmRW4uc2V0VGltZW91dD9Fbjp0LCJbb2JqZWN0IHByb2Nlc3NdIj09PXt9LnRvU3RyaW5nLmNhbGwodC5wcm9jZXNzKT9jbj1mdW5jdGlvbih0KXtSLm5leHRUaWNrKChmdW5jdGlvbigpe3ZuKHQpfSkpfTohZnVuY3Rpb24oKXtpZih0LnBvc3RNZXNzYWdlJiYhdC5pbXBvcnRTY3JpcHRzKXt2YXIgZT0hMCxyPXQub25tZXNzYWdlO3JldHVybiB0Lm9ubWVzc2FnZT1mdW5jdGlvbigpe2U9ITF9LHQucG9zdE1lc3NhZ2UoIiIsIioiKSx0Lm9ubWVzc2FnZT1yLGV9fSgpP3QuTWVzc2FnZUNoYW5uZWw/KChtbj1uZXcgTWVzc2FnZUNoYW5uZWwpLnBvcnQxLm9ubWVzc2FnZT1mdW5jdGlvbih0KXt2bih0LmRhdGEpfSxjbj1mdW5jdGlvbih0KXttbi5wb3J0Mi5wb3N0TWVzc2FnZSh0KX0pOnluJiYib25yZWFkeXN0YXRlY2hhbmdlImluIHluLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpPyh3bj15bi5kb2N1bWVudEVsZW1lbnQsY249ZnVuY3Rpb24odCl7dmFyIGU9eW4uY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZS5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXt2bih0KSxlLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLHduLnJlbW92ZUNoaWxkKGUpLGU9bnVsbH0sd24uYXBwZW5kQ2hpbGQoZSl9KTpjbj1mdW5jdGlvbih0KXtzZXRUaW1lb3V0KHZuLDAsdCl9Oihfbj0ic2V0SW1tZWRpYXRlJCIrTWF0aC5yYW5kb20oKSsiJCIsU249ZnVuY3Rpb24oZSl7ZS5zb3VyY2U9PT10JiYic3RyaW5nIj09dHlwZW9mIGUuZGF0YSYmMD09PWUuZGF0YS5pbmRleE9mKF9uKSYmdm4oK2UuZGF0YS5zbGljZShfbi5sZW5ndGgpKX0sdC5hZGRFdmVudExpc3RlbmVyP3QuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsU24sITEpOnQuYXR0YWNoRXZlbnQoIm9ubWVzc2FnZSIsU24pLGNuPWZ1bmN0aW9uKGUpe3QucG9zdE1lc3NhZ2UoX24rZSwiKiIpfSksUm4ub2JqZWN0PXQ9PntsZXQgZSxyLG47ZnVuY3Rpb24gaShpKXtlPWtuKHQ9aSk/dDpudWxsLHI9IWUmJnRbU3ltYm9sLml0ZXJhdG9yXT90W1N5bWJvbC5pdGVyYXRvcl0oKTpudWxsLG49IWUmJnRbU3ltYm9sLmFzeW5jSXRlcmF0b3JdP3RbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk6bnVsbH1yZXR1cm4gQXJyYXkuaXNBcnJheSh0KSYmKHQ9dC5zbGljZSgpKSxpKHQpLGFuLm9iaigoZnVuY3Rpb24gbyhhLHMpe2lmKGUpKGFzeW5jKCk9Pnt0cnl7YXdhaXQgaShhd2FpdCBlKSxvLmNhbGwodGhpcyxhLHMpfWNhdGNoKHQpe3ModCl9fSkoKTtlbHNlIGlmKHIpe2NvbnN0IHQ9ci5uZXh0KCk7Ym4ocyxudWxsLHQuZG9uZT9udWxsOnQudmFsdWUpfWVsc2Ugbj8oYXN5bmMoKT0+e3RyeXtjb25zdCB0PWF3YWl0IG4ubmV4dCgpO2JuKHMsbnVsbCx0LmRvbmU/bnVsbDp0LnZhbHVlKX1jYXRjaCh0KXtibihzLHQpfX0pKCk6KHRoaXMucHVzaCh0KSxibihzLG51bGwsbnVsbCkpfSkpfTt2YXIgam49e30sVG49am4uTEVGVF9CUkFDRT0xLE9uPWpuLlJJR0hUX0JSQUNFPTIsQW49am4uTEVGVF9CUkFDS0VUPTMsQ249am4uUklHSFRfQlJBQ0tFVD00LE1uPWpuLkNPTE9OPTUseG49am4uQ09NTUE9NixMbj1qbi5UUlVFPTcsQm49am4uRkFMU0U9OCxQbj1qbi5OVUxMPTksVW49am4uU1RSSU5HPTEwLE5uPWpuLk5VTUJFUj0xMSxEbj1qbi5TVEFSVD0xNyxJbj1qbi5TVE9QPTE4LHFuPWpuLlRSVUUxPTMzLEZuPWpuLlRSVUUyPTM0LFduPWpuLlRSVUUzPTM1LHpuPWpuLkZBTFNFMT00OSxZbj1qbi5GQUxTRTI9NTAsJG49am4uRkFMU0UzPTUxLEhuPWpuLkZBTFNFND01MixKbj1qbi5OVUxMMT02NSxHbj1qbi5OVUxMMj02NixWbj1qbi5OVUxMMz02NyxLbj1qbi5OVU1CRVIxPTgxLFpuPWpuLk5VTUJFUjM9ODMsWG49am4uU1RSSU5HMT05NyxRbj1qbi5TVFJJTkcyPTk4LHRpPWpuLlNUUklORzM9OTksZWk9am4uU1RSSU5HND0xMDAscmk9am4uU1RSSU5HNT0xMDEsbmk9am4uU1RSSU5HNj0xMDIsaWk9am4uVkFMVUU9MTEzLG9pPWpuLktFWT0xMTQsYWk9am4uT0JKRUNUPTEyOSxzaT1qbi5BUlJBWT0xMzAsdWk9IlxcIi5jaGFyQ29kZUF0KDApLGZpPSIvIi5jaGFyQ29kZUF0KDApLGhpPSJcYiIuY2hhckNvZGVBdCgwKSxsaT0iXGYiLmNoYXJDb2RlQXQoMCksY2k9IlxuIi5jaGFyQ29kZUF0KDApLGRpPSJcciIuY2hhckNvZGVBdCgwKSxwaT0iXHQiLmNoYXJDb2RlQXQoMCk7ZnVuY3Rpb24gZ2koKXt0aGlzLnRTdGF0ZT1Ebix0aGlzLnZhbHVlPXZvaWQgMCx0aGlzLnN0cmluZz12b2lkIDAsdGhpcy5zdHJpbmdCdWZmZXI9YXQuYWxsb2M/YXQuYWxsb2MoNjU1MzYpOm5ldyBhdCg2NTUzNiksdGhpcy5zdHJpbmdCdWZmZXJPZmZzZXQ9MCx0aGlzLnVuaWNvZGU9dm9pZCAwLHRoaXMuaGlnaFN1cnJvZ2F0ZT12b2lkIDAsdGhpcy5rZXk9dm9pZCAwLHRoaXMubW9kZT12b2lkIDAsdGhpcy5zdGFjaz1bXSx0aGlzLnN0YXRlPWlpLHRoaXMuYnl0ZXNfcmVtYWluaW5nPTAsdGhpcy5ieXRlc19pbl9zZXF1ZW5jZT0wLHRoaXMudGVtcF9idWZmcz17MjpuZXcgYXQoMiksMzpuZXcgYXQoMyksNDpuZXcgYXQoNCl9LHRoaXMub2Zmc2V0PS0xfWdpLnRva25hbT1mdW5jdGlvbih0KXtmb3IodmFyIGU9T2JqZWN0LmtleXMoam4pLHI9MCxuPWUubGVuZ3RoO3I8bjtyKyspe3ZhciBpPWVbcl07aWYoam5baV09PT10KXJldHVybiBpfXJldHVybiB0JiYiMHgiK3QudG9TdHJpbmcoMTYpfTt2YXIgeWk9Z2kucHJvdG90eXBlO3lpLm9uRXJyb3I9ZnVuY3Rpb24odCl7dGhyb3cgdH0seWkuY2hhckVycm9yPWZ1bmN0aW9uKHQsZSl7dGhpcy50U3RhdGU9SW4sdGhpcy5vbkVycm9yKG5ldyBFcnJvcigiVW5leHBlY3RlZCAiK0pTT04uc3RyaW5naWZ5KFN0cmluZy5mcm9tQ2hhckNvZGUodFtlXSkpKyIgYXQgcG9zaXRpb24gIitlKyIgaW4gc3RhdGUgIitnaS50b2tuYW0odGhpcy50U3RhdGUpKSl9LHlpLmFwcGVuZFN0cmluZ0NoYXI9ZnVuY3Rpb24odCl7dGhpcy5zdHJpbmdCdWZmZXJPZmZzZXQ+PTY1NTM2JiYodGhpcy5zdHJpbmcrPXRoaXMuc3RyaW5nQnVmZmVyLnRvU3RyaW5nKCJ1dGY4IiksdGhpcy5zdHJpbmdCdWZmZXJPZmZzZXQ9MCksdGhpcy5zdHJpbmdCdWZmZXJbdGhpcy5zdHJpbmdCdWZmZXJPZmZzZXQrK109dH0seWkuYXBwZW5kU3RyaW5nQnVmPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj10Lmxlbmd0aDsibnVtYmVyIj09dHlwZW9mIGUmJihuPSJudW1iZXIiPT10eXBlb2Ygcj9yPDA/dC5sZW5ndGgtZStyOnItZTp0Lmxlbmd0aC1lKSxuPDAmJihuPTApLHRoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0K24+NjU1MzYmJih0aGlzLnN0cmluZys9dGhpcy5zdHJpbmdCdWZmZXIudG9TdHJpbmcoInV0ZjgiLDAsdGhpcy5zdHJpbmdCdWZmZXJPZmZzZXQpLHRoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0PTApLHQuY29weSh0aGlzLnN0cmluZ0J1ZmZlcix0aGlzLnN0cmluZ0J1ZmZlck9mZnNldCxlLHIpLHRoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0Kz1ufSx5aS53cml0ZT1mdW5jdGlvbih0KXt2YXIgZTsic3RyaW5nIj09dHlwZW9mIHQmJih0PW5ldyBhdCh0KSk7Zm9yKHZhciByPTAsbj10Lmxlbmd0aDtyPG47cisrKWlmKHRoaXMudFN0YXRlPT09RG4pe2lmKGU9dFtyXSx0aGlzLm9mZnNldCsrLDEyMz09PWUpdGhpcy5vblRva2VuKFRuLCJ7Iik7ZWxzZSBpZigxMjU9PT1lKXRoaXMub25Ub2tlbihPbiwifSIpO2Vsc2UgaWYoOTE9PT1lKXRoaXMub25Ub2tlbihBbiwiWyIpO2Vsc2UgaWYoOTM9PT1lKXRoaXMub25Ub2tlbihDbiwiXSIpO2Vsc2UgaWYoNTg9PT1lKXRoaXMub25Ub2tlbihNbiwiOiIpO2Vsc2UgaWYoNDQ9PT1lKXRoaXMub25Ub2tlbih4biwiLCIpO2Vsc2UgaWYoMTE2PT09ZSl0aGlzLnRTdGF0ZT1xbjtlbHNlIGlmKDEwMj09PWUpdGhpcy50U3RhdGU9em47ZWxzZSBpZigxMTA9PT1lKXRoaXMudFN0YXRlPUpuO2Vsc2UgaWYoMzQ9PT1lKXRoaXMuc3RyaW5nPSIiLHRoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0PTAsdGhpcy50U3RhdGU9WG47ZWxzZSBpZig0NT09PWUpdGhpcy5zdHJpbmc9Ii0iLHRoaXMudFN0YXRlPUtuO2Vsc2UgaWYoZT49NDgmJmU8NjQpdGhpcy5zdHJpbmc9U3RyaW5nLmZyb21DaGFyQ29kZShlKSx0aGlzLnRTdGF0ZT1abjtlbHNlIGlmKDMyIT09ZSYmOSE9PWUmJjEwIT09ZSYmMTMhPT1lKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpfWVsc2UgaWYodGhpcy50U3RhdGU9PT1YbilpZihlPXRbcl0sdGhpcy5ieXRlc19yZW1haW5pbmc+MCl7Zm9yKHZhciBpPTA7aTx0aGlzLmJ5dGVzX3JlbWFpbmluZztpKyspdGhpcy50ZW1wX2J1ZmZzW3RoaXMuYnl0ZXNfaW5fc2VxdWVuY2VdW3RoaXMuYnl0ZXNfaW5fc2VxdWVuY2UtdGhpcy5ieXRlc19yZW1haW5pbmcraV09dFtpXTt0aGlzLmFwcGVuZFN0cmluZ0J1Zih0aGlzLnRlbXBfYnVmZnNbdGhpcy5ieXRlc19pbl9zZXF1ZW5jZV0pLHRoaXMuYnl0ZXNfaW5fc2VxdWVuY2U9dGhpcy5ieXRlc19yZW1haW5pbmc9MCxyPXIraS0xfWVsc2UgaWYoMD09PXRoaXMuYnl0ZXNfcmVtYWluaW5nJiZlPj0xMjgpe2lmKGU8PTE5M3x8ZT4yNDQpcmV0dXJuIHRoaXMub25FcnJvcihuZXcgRXJyb3IoIkludmFsaWQgVVRGLTggY2hhcmFjdGVyIGF0IHBvc2l0aW9uICIrcisiIGluIHN0YXRlICIrZ2kudG9rbmFtKHRoaXMudFN0YXRlKSkpO2lmKGU+PTE5NCYmZTw9MjIzJiYodGhpcy5ieXRlc19pbl9zZXF1ZW5jZT0yKSxlPj0yMjQmJmU8PTIzOSYmKHRoaXMuYnl0ZXNfaW5fc2VxdWVuY2U9MyksZT49MjQwJiZlPD0yNDQmJih0aGlzLmJ5dGVzX2luX3NlcXVlbmNlPTQpLHRoaXMuYnl0ZXNfaW5fc2VxdWVuY2Urcj50Lmxlbmd0aCl7Zm9yKHZhciBvPTA7bzw9dC5sZW5ndGgtMS1yO28rKyl0aGlzLnRlbXBfYnVmZnNbdGhpcy5ieXRlc19pbl9zZXF1ZW5jZV1bb109dFtyK29dO3RoaXMuYnl0ZXNfcmVtYWluaW5nPXIrdGhpcy5ieXRlc19pbl9zZXF1ZW5jZS10Lmxlbmd0aCxyPXQubGVuZ3RoLTF9ZWxzZSB0aGlzLmFwcGVuZFN0cmluZ0J1Zih0LHIscit0aGlzLmJ5dGVzX2luX3NlcXVlbmNlKSxyPXIrdGhpcy5ieXRlc19pbl9zZXF1ZW5jZS0xfWVsc2UgaWYoMzQ9PT1lKXRoaXMudFN0YXRlPURuLHRoaXMuc3RyaW5nKz10aGlzLnN0cmluZ0J1ZmZlci50b1N0cmluZygidXRmOCIsMCx0aGlzLnN0cmluZ0J1ZmZlck9mZnNldCksdGhpcy5zdHJpbmdCdWZmZXJPZmZzZXQ9MCx0aGlzLm9uVG9rZW4oVW4sdGhpcy5zdHJpbmcpLHRoaXMub2Zmc2V0Kz1hdC5ieXRlTGVuZ3RoKHRoaXMuc3RyaW5nLCJ1dGY4IikrMSx0aGlzLnN0cmluZz12b2lkIDA7ZWxzZSBpZig5Mj09PWUpdGhpcy50U3RhdGU9UW47ZWxzZXtpZighKGU+PTMyKSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLmFwcGVuZFN0cmluZ0NoYXIoZSl9ZWxzZSBpZih0aGlzLnRTdGF0ZT09PVFuKWlmKDM0PT09KGU9dFtyXSkpdGhpcy5hcHBlbmRTdHJpbmdDaGFyKGUpLHRoaXMudFN0YXRlPVhuO2Vsc2UgaWYoOTI9PT1lKXRoaXMuYXBwZW5kU3RyaW5nQ2hhcih1aSksdGhpcy50U3RhdGU9WG47ZWxzZSBpZig0Nz09PWUpdGhpcy5hcHBlbmRTdHJpbmdDaGFyKGZpKSx0aGlzLnRTdGF0ZT1YbjtlbHNlIGlmKDk4PT09ZSl0aGlzLmFwcGVuZFN0cmluZ0NoYXIoaGkpLHRoaXMudFN0YXRlPVhuO2Vsc2UgaWYoMTAyPT09ZSl0aGlzLmFwcGVuZFN0cmluZ0NoYXIobGkpLHRoaXMudFN0YXRlPVhuO2Vsc2UgaWYoMTEwPT09ZSl0aGlzLmFwcGVuZFN0cmluZ0NoYXIoY2kpLHRoaXMudFN0YXRlPVhuO2Vsc2UgaWYoMTE0PT09ZSl0aGlzLmFwcGVuZFN0cmluZ0NoYXIoZGkpLHRoaXMudFN0YXRlPVhuO2Vsc2UgaWYoMTE2PT09ZSl0aGlzLmFwcGVuZFN0cmluZ0NoYXIocGkpLHRoaXMudFN0YXRlPVhuO2Vsc2V7aWYoMTE3IT09ZSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnVuaWNvZGU9IiIsdGhpcy50U3RhdGU9dGl9ZWxzZSBpZih0aGlzLnRTdGF0ZT09PXRpfHx0aGlzLnRTdGF0ZT09PWVpfHx0aGlzLnRTdGF0ZT09PXJpfHx0aGlzLnRTdGF0ZT09PW5pKXtpZighKChlPXRbcl0pPj00OCYmZTw2NHx8ZT42NCYmZTw9NzB8fGU+OTYmJmU8PTEwMikpcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7aWYodGhpcy51bmljb2RlKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGUpLHRoaXMudFN0YXRlKys9PT1uaSl7dmFyIGE9cGFyc2VJbnQodGhpcy51bmljb2RlLDE2KTt0aGlzLnVuaWNvZGU9dm9pZCAwLHZvaWQgMCE9PXRoaXMuaGlnaFN1cnJvZ2F0ZSYmYT49NTYzMjAmJmE8NTczNDQ/KHRoaXMuYXBwZW5kU3RyaW5nQnVmKG5ldyBhdChTdHJpbmcuZnJvbUNoYXJDb2RlKHRoaXMuaGlnaFN1cnJvZ2F0ZSxhKSkpLHRoaXMuaGlnaFN1cnJvZ2F0ZT12b2lkIDApOnZvaWQgMD09PXRoaXMuaGlnaFN1cnJvZ2F0ZSYmYT49NTUyOTYmJmE8NTYzMjA/dGhpcy5oaWdoU3Vycm9nYXRlPWE6KHZvaWQgMCE9PXRoaXMuaGlnaFN1cnJvZ2F0ZSYmKHRoaXMuYXBwZW5kU3RyaW5nQnVmKG5ldyBhdChTdHJpbmcuZnJvbUNoYXJDb2RlKHRoaXMuaGlnaFN1cnJvZ2F0ZSkpKSx0aGlzLmhpZ2hTdXJyb2dhdGU9dm9pZCAwKSx0aGlzLmFwcGVuZFN0cmluZ0J1ZihuZXcgYXQoU3RyaW5nLmZyb21DaGFyQ29kZShhKSkpKSx0aGlzLnRTdGF0ZT1Ybn19ZWxzZSBpZih0aGlzLnRTdGF0ZT09PUtufHx0aGlzLnRTdGF0ZT09PVpuKXN3aXRjaChlPXRbcl0pe2Nhc2UgNDg6Y2FzZSA0OTpjYXNlIDUwOmNhc2UgNTE6Y2FzZSA1MjpjYXNlIDUzOmNhc2UgNTQ6Y2FzZSA1NTpjYXNlIDU2OmNhc2UgNTc6Y2FzZSA0NjpjYXNlIDEwMTpjYXNlIDY5OmNhc2UgNDM6Y2FzZSA0NTp0aGlzLnN0cmluZys9U3RyaW5nLmZyb21DaGFyQ29kZShlKSx0aGlzLnRTdGF0ZT1abjticmVhaztkZWZhdWx0OnRoaXMudFN0YXRlPURuO3ZhciBzPU51bWJlcih0aGlzLnN0cmluZyk7aWYoaXNOYU4ocykpcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy5zdHJpbmcubWF0Y2goL1swLTldKy8pPT10aGlzLnN0cmluZyYmcy50b1N0cmluZygpIT10aGlzLnN0cmluZz90aGlzLm9uVG9rZW4oVW4sdGhpcy5zdHJpbmcpOnRoaXMub25Ub2tlbihObixzKSx0aGlzLm9mZnNldCs9dGhpcy5zdHJpbmcubGVuZ3RoLTEsdGhpcy5zdHJpbmc9dm9pZCAwLHItLX1lbHNlIGlmKHRoaXMudFN0YXRlPT09cW4pe2lmKDExNCE9PXRbcl0pcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy50U3RhdGU9Rm59ZWxzZSBpZih0aGlzLnRTdGF0ZT09PUZuKXtpZigxMTchPT10W3JdKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudFN0YXRlPVdufWVsc2UgaWYodGhpcy50U3RhdGU9PT1Xbil7aWYoMTAxIT09dFtyXSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnRTdGF0ZT1Ebix0aGlzLm9uVG9rZW4oTG4sITApLHRoaXMub2Zmc2V0Kz0zfWVsc2UgaWYodGhpcy50U3RhdGU9PT16bil7aWYoOTchPT10W3JdKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudFN0YXRlPVlufWVsc2UgaWYodGhpcy50U3RhdGU9PT1Zbil7aWYoMTA4IT09dFtyXSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnRTdGF0ZT0kbn1lbHNlIGlmKHRoaXMudFN0YXRlPT09JG4pe2lmKDExNSE9PXRbcl0pcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy50U3RhdGU9SG59ZWxzZSBpZih0aGlzLnRTdGF0ZT09PUhuKXtpZigxMDEhPT10W3JdKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudFN0YXRlPURuLHRoaXMub25Ub2tlbihCbiwhMSksdGhpcy5vZmZzZXQrPTR9ZWxzZSBpZih0aGlzLnRTdGF0ZT09PUpuKXtpZigxMTchPT10W3JdKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudFN0YXRlPUdufWVsc2UgaWYodGhpcy50U3RhdGU9PT1Hbil7aWYoMTA4IT09dFtyXSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnRTdGF0ZT1Wbn1lbHNlIGlmKHRoaXMudFN0YXRlPT09Vm4pe2lmKDEwOCE9PXRbcl0pcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy50U3RhdGU9RG4sdGhpcy5vblRva2VuKFBuLG51bGwpLHRoaXMub2Zmc2V0Kz0zfX0seWkub25Ub2tlbj1mdW5jdGlvbih0LGUpe30seWkucGFyc2VFcnJvcj1mdW5jdGlvbih0LGUpe3RoaXMudFN0YXRlPUluLHRoaXMub25FcnJvcihuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgIitnaS50b2tuYW0odCkrKGU/IigiK0pTT04uc3RyaW5naWZ5KGUpKyIpIjoiIikrIiBpbiBzdGF0ZSAiK2dpLnRva25hbSh0aGlzLnN0YXRlKSkpfSx5aS5wdXNoPWZ1bmN0aW9uKCl7dGhpcy5zdGFjay5wdXNoKHt2YWx1ZTp0aGlzLnZhbHVlLGtleTp0aGlzLmtleSxtb2RlOnRoaXMubW9kZX0pfSx5aS5wb3A9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnZhbHVlLGU9dGhpcy5zdGFjay5wb3AoKTt0aGlzLnZhbHVlPWUudmFsdWUsdGhpcy5rZXk9ZS5rZXksdGhpcy5tb2RlPWUubW9kZSx0aGlzLmVtaXQodCksdGhpcy5tb2RlfHwodGhpcy5zdGF0ZT1paSl9LHlpLmVtaXQ9ZnVuY3Rpb24odCl7dGhpcy5tb2RlJiYodGhpcy5zdGF0ZT14biksdGhpcy5vblZhbHVlKHQpfSx5aS5vblZhbHVlPWZ1bmN0aW9uKHQpe30seWkub25Ub2tlbj1mdW5jdGlvbih0LGUpe2lmKHRoaXMuc3RhdGU9PT1paSlpZih0PT09VW58fHQ9PT1Obnx8dD09PUxufHx0PT09Qm58fHQ9PT1Qbil0aGlzLnZhbHVlJiYodGhpcy52YWx1ZVt0aGlzLmtleV09ZSksdGhpcy5lbWl0KGUpO2Vsc2UgaWYodD09PVRuKXRoaXMucHVzaCgpLHRoaXMudmFsdWU/dGhpcy52YWx1ZT10aGlzLnZhbHVlW3RoaXMua2V5XT17fTp0aGlzLnZhbHVlPXt9LHRoaXMua2V5PXZvaWQgMCx0aGlzLnN0YXRlPW9pLHRoaXMubW9kZT1haTtlbHNlIGlmKHQ9PT1Bbil0aGlzLnB1c2goKSx0aGlzLnZhbHVlP3RoaXMudmFsdWU9dGhpcy52YWx1ZVt0aGlzLmtleV09W106dGhpcy52YWx1ZT1bXSx0aGlzLmtleT0wLHRoaXMubW9kZT1zaSx0aGlzLnN0YXRlPWlpO2Vsc2UgaWYodD09PU9uKXtpZih0aGlzLm1vZGUhPT1haSlyZXR1cm4gdGhpcy5wYXJzZUVycm9yKHQsZSk7dGhpcy5wb3AoKX1lbHNle2lmKHQhPT1DbilyZXR1cm4gdGhpcy5wYXJzZUVycm9yKHQsZSk7aWYodGhpcy5tb2RlIT09c2kpcmV0dXJuIHRoaXMucGFyc2VFcnJvcih0LGUpO3RoaXMucG9wKCl9ZWxzZSBpZih0aGlzLnN0YXRlPT09b2kpaWYodD09PVVuKXRoaXMua2V5PWUsdGhpcy5zdGF0ZT1NbjtlbHNle2lmKHQhPT1PbilyZXR1cm4gdGhpcy5wYXJzZUVycm9yKHQsZSk7dGhpcy5wb3AoKX1lbHNlIGlmKHRoaXMuc3RhdGU9PT1Nbil7aWYodCE9PU1uKXJldHVybiB0aGlzLnBhcnNlRXJyb3IodCxlKTt0aGlzLnN0YXRlPWlpfWVsc2V7aWYodGhpcy5zdGF0ZSE9PXhuKXJldHVybiB0aGlzLnBhcnNlRXJyb3IodCxlKTtpZih0PT09eG4pdGhpcy5tb2RlPT09c2k/KHRoaXMua2V5KyssdGhpcy5zdGF0ZT1paSk6dGhpcy5tb2RlPT09YWkmJih0aGlzLnN0YXRlPW9pKTtlbHNle2lmKCEodD09PUNuJiZ0aGlzLm1vZGU9PT1zaXx8dD09PU9uJiZ0aGlzLm1vZGU9PT1haSkpcmV0dXJuIHRoaXMucGFyc2VFcnJvcih0LGUpO3RoaXMucG9wKCl9fX0sZ2kuQz1qbjt2YXIgYmk9Z2k7ZnVuY3Rpb24gdmkoKXt0aGlzLmhlYWQ9bnVsbCx0aGlzLnRhaWw9bnVsbCx0aGlzLmxlbmd0aD0wfXZpLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKHQpe3ZhciBlPXtkYXRhOnQsbmV4dDpudWxsfTt0aGlzLmxlbmd0aD4wP3RoaXMudGFpbC5uZXh0PWU6dGhpcy5oZWFkPWUsdGhpcy50YWlsPWUsKyt0aGlzLmxlbmd0aH0sdmkucHJvdG90eXBlLnVuc2hpZnQ9ZnVuY3Rpb24odCl7dmFyIGU9e2RhdGE6dCxuZXh0OnRoaXMuaGVhZH07MD09PXRoaXMubGVuZ3RoJiYodGhpcy50YWlsPWUpLHRoaXMuaGVhZD1lLCsrdGhpcy5sZW5ndGh9LHZpLnByb3RvdHlwZS5zaGlmdD1mdW5jdGlvbigpe2lmKDAhPT10aGlzLmxlbmd0aCl7dmFyIHQ9dGhpcy5oZWFkLmRhdGE7cmV0dXJuIDE9PT10aGlzLmxlbmd0aD90aGlzLmhlYWQ9dGhpcy50YWlsPW51bGw6dGhpcy5oZWFkPXRoaXMuaGVhZC5uZXh0LC0tdGhpcy5sZW5ndGgsdH19LHZpLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuaGVhZD10aGlzLnRhaWw9bnVsbCx0aGlzLmxlbmd0aD0wfSx2aS5wcm90b3R5cGUuam9pbj1mdW5jdGlvbih0KXtpZigwPT09dGhpcy5sZW5ndGgpcmV0dXJuIiI7Zm9yKHZhciBlPXRoaXMuaGVhZCxyPSIiK2UuZGF0YTtlPWUubmV4dDspcis9dCtlLmRhdGE7cmV0dXJuIHJ9LHZpLnByb3RvdHlwZS5jb25jYXQ9ZnVuY3Rpb24odCl7aWYoMD09PXRoaXMubGVuZ3RoKXJldHVybiBhdC5hbGxvYygwKTtpZigxPT09dGhpcy5sZW5ndGgpcmV0dXJuIHRoaXMuaGVhZC5kYXRhO2Zvcih2YXIgZT1hdC5hbGxvY1Vuc2FmZSh0Pj4+MCkscj10aGlzLmhlYWQsbj0wO3I7KXIuZGF0YS5jb3B5KGUsbiksbis9ci5kYXRhLmxlbmd0aCxyPXIubmV4dDtyZXR1cm4gZX07dmFyIHdpPWF0LmlzRW5jb2Rpbmd8fGZ1bmN0aW9uKHQpe3N3aXRjaCh0JiZ0LnRvTG93ZXJDYXNlKCkpe2Nhc2UiaGV4IjpjYXNlInV0ZjgiOmNhc2UidXRmLTgiOmNhc2UiYXNjaWkiOmNhc2UiYmluYXJ5IjpjYXNlImJhc2U2NCI6Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOmNhc2UicmF3IjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX07ZnVuY3Rpb24gbWkodCl7c3dpdGNoKHRoaXMuZW5jb2Rpbmc9KHR8fCJ1dGY4IikudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bLV9dLywiIiksZnVuY3Rpb24odCl7aWYodCYmIXdpKHQpKXRocm93IG5ldyBFcnJvcigiVW5rbm93biBlbmNvZGluZzogIit0KX0odCksdGhpcy5lbmNvZGluZyl7Y2FzZSJ1dGY4Ijp0aGlzLnN1cnJvZ2F0ZVNpemU9MzticmVhaztjYXNlInVjczIiOmNhc2UidXRmMTZsZSI6dGhpcy5zdXJyb2dhdGVTaXplPTIsdGhpcy5kZXRlY3RJbmNvbXBsZXRlQ2hhcj1TaTticmVhaztjYXNlImJhc2U2NCI6dGhpcy5zdXJyb2dhdGVTaXplPTMsdGhpcy5kZXRlY3RJbmNvbXBsZXRlQ2hhcj1FaTticmVhaztkZWZhdWx0OnJldHVybiB2b2lkKHRoaXMud3JpdGU9X2kpfXRoaXMuY2hhckJ1ZmZlcj1uZXcgYXQoNiksdGhpcy5jaGFyUmVjZWl2ZWQ9MCx0aGlzLmNoYXJMZW5ndGg9MH1mdW5jdGlvbiBfaSh0KXtyZXR1cm4gdC50b1N0cmluZyh0aGlzLmVuY29kaW5nKX1mdW5jdGlvbiBTaSh0KXt0aGlzLmNoYXJSZWNlaXZlZD10Lmxlbmd0aCUyLHRoaXMuY2hhckxlbmd0aD10aGlzLmNoYXJSZWNlaXZlZD8yOjB9ZnVuY3Rpb24gRWkodCl7dGhpcy5jaGFyUmVjZWl2ZWQ9dC5sZW5ndGglMyx0aGlzLmNoYXJMZW5ndGg9dGhpcy5jaGFyUmVjZWl2ZWQ/MzowfW1pLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9IiI7dGhpcy5jaGFyTGVuZ3RoOyl7dmFyIHI9dC5sZW5ndGg+PXRoaXMuY2hhckxlbmd0aC10aGlzLmNoYXJSZWNlaXZlZD90aGlzLmNoYXJMZW5ndGgtdGhpcy5jaGFyUmVjZWl2ZWQ6dC5sZW5ndGg7aWYodC5jb3B5KHRoaXMuY2hhckJ1ZmZlcix0aGlzLmNoYXJSZWNlaXZlZCwwLHIpLHRoaXMuY2hhclJlY2VpdmVkKz1yLHRoaXMuY2hhclJlY2VpdmVkPHRoaXMuY2hhckxlbmd0aClyZXR1cm4iIjtpZih0PXQuc2xpY2Uocix0Lmxlbmd0aCksISgoaT0oZT10aGlzLmNoYXJCdWZmZXIuc2xpY2UoMCx0aGlzLmNoYXJMZW5ndGgpLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcpKS5jaGFyQ29kZUF0KGUubGVuZ3RoLTEpKT49NTUyOTYmJmk8PTU2MzE5KSl7aWYodGhpcy5jaGFyUmVjZWl2ZWQ9dGhpcy5jaGFyTGVuZ3RoPTAsMD09PXQubGVuZ3RoKXJldHVybiBlO2JyZWFrfXRoaXMuY2hhckxlbmd0aCs9dGhpcy5zdXJyb2dhdGVTaXplLGU9IiJ9dGhpcy5kZXRlY3RJbmNvbXBsZXRlQ2hhcih0KTt2YXIgbj10Lmxlbmd0aDt0aGlzLmNoYXJMZW5ndGgmJih0LmNvcHkodGhpcy5jaGFyQnVmZmVyLDAsdC5sZW5ndGgtdGhpcy5jaGFyUmVjZWl2ZWQsbiksbi09dGhpcy5jaGFyUmVjZWl2ZWQpO3ZhciBpO249KGUrPXQudG9TdHJpbmcodGhpcy5lbmNvZGluZywwLG4pKS5sZW5ndGgtMTtpZigoaT1lLmNoYXJDb2RlQXQobikpPj01NTI5NiYmaTw9NTYzMTkpe3ZhciBvPXRoaXMuc3Vycm9nYXRlU2l6ZTtyZXR1cm4gdGhpcy5jaGFyTGVuZ3RoKz1vLHRoaXMuY2hhclJlY2VpdmVkKz1vLHRoaXMuY2hhckJ1ZmZlci5jb3B5KHRoaXMuY2hhckJ1ZmZlcixvLDAsbyksdC5jb3B5KHRoaXMuY2hhckJ1ZmZlciwwLDAsbyksZS5zdWJzdHJpbmcoMCxuKX1yZXR1cm4gZX0sbWkucHJvdG90eXBlLmRldGVjdEluY29tcGxldGVDaGFyPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10Lmxlbmd0aD49Mz8zOnQubGVuZ3RoO2U+MDtlLS0pe3ZhciByPXRbdC5sZW5ndGgtZV07aWYoMT09ZSYmcj4+NT09Nil7dGhpcy5jaGFyTGVuZ3RoPTI7YnJlYWt9aWYoZTw9MiYmcj4+ND09MTQpe3RoaXMuY2hhckxlbmd0aD0zO2JyZWFrfWlmKGU8PTMmJnI+PjM9PTMwKXt0aGlzLmNoYXJMZW5ndGg9NDticmVha319dGhpcy5jaGFyUmVjZWl2ZWQ9ZX0sbWkucHJvdG90eXBlLmVuZD1mdW5jdGlvbih0KXt2YXIgZT0iIjtpZih0JiZ0Lmxlbmd0aCYmKGU9dGhpcy53cml0ZSh0KSksdGhpcy5jaGFyUmVjZWl2ZWQpe3ZhciByPXRoaXMuY2hhclJlY2VpdmVkLG49dGhpcy5jaGFyQnVmZmVyLGk9dGhpcy5lbmNvZGluZztlKz1uLnNsaWNlKDAscikudG9TdHJpbmcoaSl9cmV0dXJuIGV9LGppLlJlYWRhYmxlU3RhdGU9Umk7dmFyIGtpPWVlKCJzdHJlYW0iKTtmdW5jdGlvbiBSaSh0LGUpe3Q9dHx8e30sdGhpcy5vYmplY3RNb2RlPSEhdC5vYmplY3RNb2RlLGUgaW5zdGFuY2VvZiBRaSYmKHRoaXMub2JqZWN0TW9kZT10aGlzLm9iamVjdE1vZGV8fCEhdC5yZWFkYWJsZU9iamVjdE1vZGUpO3ZhciByPXQuaGlnaFdhdGVyTWFyayxuPXRoaXMub2JqZWN0TW9kZT8xNjoxNjM4NDt0aGlzLmhpZ2hXYXRlck1hcms9cnx8MD09PXI/cjpuLHRoaXMuaGlnaFdhdGVyTWFyaz1+fnRoaXMuaGlnaFdhdGVyTWFyayx0aGlzLmJ1ZmZlcj1uZXcgdmksdGhpcy5sZW5ndGg9MCx0aGlzLnBpcGVzPW51bGwsdGhpcy5waXBlc0NvdW50PTAsdGhpcy5mbG93aW5nPW51bGwsdGhpcy5lbmRlZD0hMSx0aGlzLmVuZEVtaXR0ZWQ9ITEsdGhpcy5yZWFkaW5nPSExLHRoaXMuc3luYz0hMCx0aGlzLm5lZWRSZWFkYWJsZT0hMSx0aGlzLmVtaXR0ZWRSZWFkYWJsZT0hMSx0aGlzLnJlYWRhYmxlTGlzdGVuaW5nPSExLHRoaXMucmVzdW1lU2NoZWR1bGVkPSExLHRoaXMuZGVmYXVsdEVuY29kaW5nPXQuZGVmYXVsdEVuY29kaW5nfHwidXRmOCIsdGhpcy5yYW5PdXQ9ITEsdGhpcy5hd2FpdERyYWluPTAsdGhpcy5yZWFkaW5nTW9yZT0hMSx0aGlzLmRlY29kZXI9bnVsbCx0aGlzLmVuY29kaW5nPW51bGwsdC5lbmNvZGluZyYmKHRoaXMuZGVjb2Rlcj1uZXcgbWkodC5lbmNvZGluZyksdGhpcy5lbmNvZGluZz10LmVuY29kaW5nKX1mdW5jdGlvbiBqaSh0KXtpZighKHRoaXMgaW5zdGFuY2VvZiBqaSkpcmV0dXJuIG5ldyBqaSh0KTt0aGlzLl9yZWFkYWJsZVN0YXRlPW5ldyBSaSh0LHRoaXMpLHRoaXMucmVhZGFibGU9ITAsdCYmImZ1bmN0aW9uIj09dHlwZW9mIHQucmVhZCYmKHRoaXMuX3JlYWQ9dC5yZWFkKSxMLmNhbGwodGhpcyl9ZnVuY3Rpb24gVGkodCxlLHIsbixpKXt2YXIgbz1mdW5jdGlvbih0LGUpe3ZhciByPW51bGw7YXQuaXNCdWZmZXIoZSl8fCJzdHJpbmciPT10eXBlb2YgZXx8bnVsbD09ZXx8dC5vYmplY3RNb2RlfHwocj1uZXcgVHlwZUVycm9yKCJJbnZhbGlkIG5vbi1zdHJpbmcvYnVmZmVyIGNodW5rIikpO3JldHVybiByfShlLHIpO2lmKG8pdC5lbWl0KCJlcnJvciIsbyk7ZWxzZSBpZihudWxsPT09cillLnJlYWRpbmc9ITEsZnVuY3Rpb24odCxlKXtpZihlLmVuZGVkKXJldHVybjtpZihlLmRlY29kZXIpe3ZhciByPWUuZGVjb2Rlci5lbmQoKTtyJiZyLmxlbmd0aCYmKGUuYnVmZmVyLnB1c2gociksZS5sZW5ndGgrPWUub2JqZWN0TW9kZT8xOnIubGVuZ3RoKX1lLmVuZGVkPSEwLEFpKHQpfSh0LGUpO2Vsc2UgaWYoZS5vYmplY3RNb2RlfHxyJiZyLmxlbmd0aD4wKWlmKGUuZW5kZWQmJiFpKXt2YXIgYT1uZXcgRXJyb3IoInN0cmVhbS5wdXNoKCkgYWZ0ZXIgRU9GIik7dC5lbWl0KCJlcnJvciIsYSl9ZWxzZSBpZihlLmVuZEVtaXR0ZWQmJmkpe3ZhciBzPW5ldyBFcnJvcigic3RyZWFtLnVuc2hpZnQoKSBhZnRlciBlbmQgZXZlbnQiKTt0LmVtaXQoImVycm9yIixzKX1lbHNle3ZhciB1OyFlLmRlY29kZXJ8fGl8fG58fChyPWUuZGVjb2Rlci53cml0ZShyKSx1PSFlLm9iamVjdE1vZGUmJjA9PT1yLmxlbmd0aCksaXx8KGUucmVhZGluZz0hMSksdXx8KGUuZmxvd2luZyYmMD09PWUubGVuZ3RoJiYhZS5zeW5jPyh0LmVtaXQoImRhdGEiLHIpLHQucmVhZCgwKSk6KGUubGVuZ3RoKz1lLm9iamVjdE1vZGU/MTpyLmxlbmd0aCxpP2UuYnVmZmVyLnVuc2hpZnQocik6ZS5idWZmZXIucHVzaChyKSxlLm5lZWRSZWFkYWJsZSYmQWkodCkpKSxmdW5jdGlvbih0LGUpe2UucmVhZGluZ01vcmV8fChlLnJlYWRpbmdNb3JlPSEwLGMoTWksdCxlKSl9KHQsZSl9ZWxzZSBpfHwoZS5yZWFkaW5nPSExKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIXQuZW5kZWQmJih0Lm5lZWRSZWFkYWJsZXx8dC5sZW5ndGg8dC5oaWdoV2F0ZXJNYXJrfHwwPT09dC5sZW5ndGgpfShlKX1WdChqaSxMKSxqaS5wcm90b3R5cGUucHVzaD1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuX3JlYWRhYmxlU3RhdGU7cmV0dXJuIHIub2JqZWN0TW9kZXx8InN0cmluZyIhPXR5cGVvZiB0fHwoZT1lfHxyLmRlZmF1bHRFbmNvZGluZykhPT1yLmVuY29kaW5nJiYodD1hdC5mcm9tKHQsZSksZT0iIiksVGkodGhpcyxyLHQsZSwhMSl9LGppLnByb3RvdHlwZS51bnNoaWZ0PWZ1bmN0aW9uKHQpe3JldHVybiBUaSh0aGlzLHRoaXMuX3JlYWRhYmxlU3RhdGUsdCwiIiwhMCl9LGppLnByb3RvdHlwZS5pc1BhdXNlZD1mdW5jdGlvbigpe3JldHVybiExPT09dGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nfSxqaS5wcm90b3R5cGUuc2V0RW5jb2Rpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVjb2Rlcj1uZXcgbWkodCksdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmNvZGluZz10LHRoaXN9O2Z1bmN0aW9uIE9pKHQsZSl7cmV0dXJuIHQ8PTB8fDA9PT1lLmxlbmd0aCYmZS5lbmRlZD8wOmUub2JqZWN0TW9kZT8xOnQhPXQ/ZS5mbG93aW5nJiZlLmxlbmd0aD9lLmJ1ZmZlci5oZWFkLmRhdGEubGVuZ3RoOmUubGVuZ3RoOih0PmUuaGlnaFdhdGVyTWFyayYmKGUuaGlnaFdhdGVyTWFyaz1mdW5jdGlvbih0KXtyZXR1cm4gdD49ODM4ODYwOD90PTgzODg2MDg6KHQtLSx0fD10Pj4+MSx0fD10Pj4+Mix0fD10Pj4+NCx0fD10Pj4+OCx0fD10Pj4+MTYsdCsrKSx0fSh0KSksdDw9ZS5sZW5ndGg/dDplLmVuZGVkP2UubGVuZ3RoOihlLm5lZWRSZWFkYWJsZT0hMCwwKSl9ZnVuY3Rpb24gQWkodCl7dmFyIGU9dC5fcmVhZGFibGVTdGF0ZTtlLm5lZWRSZWFkYWJsZT0hMSxlLmVtaXR0ZWRSZWFkYWJsZXx8KGtpKCJlbWl0UmVhZGFibGUiLGUuZmxvd2luZyksZS5lbWl0dGVkUmVhZGFibGU9ITAsZS5zeW5jP2MoQ2ksdCk6Q2kodCkpfWZ1bmN0aW9uIENpKHQpe2tpKCJlbWl0IHJlYWRhYmxlIiksdC5lbWl0KCJyZWFkYWJsZSIpLEJpKHQpfWZ1bmN0aW9uIE1pKHQsZSl7Zm9yKHZhciByPWUubGVuZ3RoOyFlLnJlYWRpbmcmJiFlLmZsb3dpbmcmJiFlLmVuZGVkJiZlLmxlbmd0aDxlLmhpZ2hXYXRlck1hcmsmJihraSgibWF5YmVSZWFkTW9yZSByZWFkIDAiKSx0LnJlYWQoMCksciE9PWUubGVuZ3RoKTspcj1lLmxlbmd0aDtlLnJlYWRpbmdNb3JlPSExfWZ1bmN0aW9uIHhpKHQpe2tpKCJyZWFkYWJsZSBuZXh0dGljayByZWFkIDAiKSx0LnJlYWQoMCl9ZnVuY3Rpb24gTGkodCxlKXtlLnJlYWRpbmd8fChraSgicmVzdW1lIHJlYWQgMCIpLHQucmVhZCgwKSksZS5yZXN1bWVTY2hlZHVsZWQ9ITEsZS5hd2FpdERyYWluPTAsdC5lbWl0KCJyZXN1bWUiKSxCaSh0KSxlLmZsb3dpbmcmJiFlLnJlYWRpbmcmJnQucmVhZCgwKX1mdW5jdGlvbiBCaSh0KXt2YXIgZT10Ll9yZWFkYWJsZVN0YXRlO2ZvcihraSgiZmxvdyIsZS5mbG93aW5nKTtlLmZsb3dpbmcmJm51bGwhPT10LnJlYWQoKTspO31mdW5jdGlvbiBQaSh0LGUpe3JldHVybiAwPT09ZS5sZW5ndGg/bnVsbDooZS5vYmplY3RNb2RlP3I9ZS5idWZmZXIuc2hpZnQoKTohdHx8dD49ZS5sZW5ndGg/KHI9ZS5kZWNvZGVyP2UuYnVmZmVyLmpvaW4oIiIpOjE9PT1lLmJ1ZmZlci5sZW5ndGg/ZS5idWZmZXIuaGVhZC5kYXRhOmUuYnVmZmVyLmNvbmNhdChlLmxlbmd0aCksZS5idWZmZXIuY2xlYXIoKSk6cj1mdW5jdGlvbih0LGUscil7dmFyIG47dDxlLmhlYWQuZGF0YS5sZW5ndGg/KG49ZS5oZWFkLmRhdGEuc2xpY2UoMCx0KSxlLmhlYWQuZGF0YT1lLmhlYWQuZGF0YS5zbGljZSh0KSk6bj10PT09ZS5oZWFkLmRhdGEubGVuZ3RoP2Uuc2hpZnQoKTpyP2Z1bmN0aW9uKHQsZSl7dmFyIHI9ZS5oZWFkLG49MSxpPXIuZGF0YTt0LT1pLmxlbmd0aDtmb3IoO3I9ci5uZXh0Oyl7dmFyIG89ci5kYXRhLGE9dD5vLmxlbmd0aD9vLmxlbmd0aDp0O2lmKGE9PT1vLmxlbmd0aD9pKz1vOmkrPW8uc2xpY2UoMCx0KSwwPT09KHQtPWEpKXthPT09by5sZW5ndGg/KCsrbixyLm5leHQ/ZS5oZWFkPXIubmV4dDplLmhlYWQ9ZS50YWlsPW51bGwpOihlLmhlYWQ9cixyLmRhdGE9by5zbGljZShhKSk7YnJlYWt9KytufXJldHVybiBlLmxlbmd0aC09bixpfSh0LGUpOmZ1bmN0aW9uKHQsZSl7dmFyIHI9YXQuYWxsb2NVbnNhZmUodCksbj1lLmhlYWQsaT0xO24uZGF0YS5jb3B5KHIpLHQtPW4uZGF0YS5sZW5ndGg7Zm9yKDtuPW4ubmV4dDspe3ZhciBvPW4uZGF0YSxhPXQ+by5sZW5ndGg/by5sZW5ndGg6dDtpZihvLmNvcHkocixyLmxlbmd0aC10LDAsYSksMD09PSh0LT1hKSl7YT09PW8ubGVuZ3RoPygrK2ksbi5uZXh0P2UuaGVhZD1uLm5leHQ6ZS5oZWFkPWUudGFpbD1udWxsKTooZS5oZWFkPW4sbi5kYXRhPW8uc2xpY2UoYSkpO2JyZWFrfSsraX1yZXR1cm4gZS5sZW5ndGgtPWkscn0odCxlKTtyZXR1cm4gbn0odCxlLmJ1ZmZlcixlLmRlY29kZXIpLHIpO3ZhciByfWZ1bmN0aW9uIFVpKHQpe3ZhciBlPXQuX3JlYWRhYmxlU3RhdGU7aWYoZS5sZW5ndGg+MCl0aHJvdyBuZXcgRXJyb3IoJyJlbmRSZWFkYWJsZSgpIiBjYWxsZWQgb24gbm9uLWVtcHR5IHN0cmVhbScpO2UuZW5kRW1pdHRlZHx8KGUuZW5kZWQ9ITAsYyhOaSxlLHQpKX1mdW5jdGlvbiBOaSh0LGUpe3QuZW5kRW1pdHRlZHx8MCE9PXQubGVuZ3RofHwodC5lbmRFbWl0dGVkPSEwLGUucmVhZGFibGU9ITEsZS5lbWl0KCJlbmQiKSl9ZnVuY3Rpb24gRGkodCxlKXtmb3IodmFyIHI9MCxuPXQubGVuZ3RoO3I8bjtyKyspaWYodFtyXT09PWUpcmV0dXJuIHI7cmV0dXJuLTF9ZnVuY3Rpb24gSWkoKXt9ZnVuY3Rpb24gcWkodCxlLHIpe3RoaXMuY2h1bms9dCx0aGlzLmVuY29kaW5nPWUsdGhpcy5jYWxsYmFjaz1yLHRoaXMubmV4dD1udWxsfWZ1bmN0aW9uIEZpKHQsZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImJ1ZmZlciIse2dldDpYdCgoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRCdWZmZXIoKX0pLCJfd3JpdGFibGVTdGF0ZS5idWZmZXIgaXMgZGVwcmVjYXRlZC4gVXNlIF93cml0YWJsZVN0YXRlLmdldEJ1ZmZlciBpbnN0ZWFkLiIpfSksdD10fHx7fSx0aGlzLm9iamVjdE1vZGU9ISF0Lm9iamVjdE1vZGUsZSBpbnN0YW5jZW9mIFFpJiYodGhpcy5vYmplY3RNb2RlPXRoaXMub2JqZWN0TW9kZXx8ISF0LndyaXRhYmxlT2JqZWN0TW9kZSk7dmFyIHI9dC5oaWdoV2F0ZXJNYXJrLG49dGhpcy5vYmplY3RNb2RlPzE2OjE2Mzg0O3RoaXMuaGlnaFdhdGVyTWFyaz1yfHwwPT09cj9yOm4sdGhpcy5oaWdoV2F0ZXJNYXJrPX5+dGhpcy5oaWdoV2F0ZXJNYXJrLHRoaXMubmVlZERyYWluPSExLHRoaXMuZW5kaW5nPSExLHRoaXMuZW5kZWQ9ITEsdGhpcy5maW5pc2hlZD0hMTt2YXIgaT0hMT09PXQuZGVjb2RlU3RyaW5nczt0aGlzLmRlY29kZVN0cmluZ3M9IWksdGhpcy5kZWZhdWx0RW5jb2Rpbmc9dC5kZWZhdWx0RW5jb2Rpbmd8fCJ1dGY4Iix0aGlzLmxlbmd0aD0wLHRoaXMud3JpdGluZz0hMSx0aGlzLmNvcmtlZD0wLHRoaXMuc3luYz0hMCx0aGlzLmJ1ZmZlclByb2Nlc3Npbmc9ITEsdGhpcy5vbndyaXRlPWZ1bmN0aW9uKHQpeyFmdW5jdGlvbih0LGUpe3ZhciByPXQuX3dyaXRhYmxlU3RhdGUsbj1yLnN5bmMsaT1yLndyaXRlY2I7aWYoZnVuY3Rpb24odCl7dC53cml0aW5nPSExLHQud3JpdGVjYj1udWxsLHQubGVuZ3RoLT10LndyaXRlbGVuLHQud3JpdGVsZW49MH0ociksZSkhZnVuY3Rpb24odCxlLHIsbixpKXstLWUucGVuZGluZ2NiLHI/YyhpLG4pOmkobik7dC5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQ9ITAsdC5lbWl0KCJlcnJvciIsbil9KHQscixuLGUsaSk7ZWxzZXt2YXIgbz1IaShyKTtvfHxyLmNvcmtlZHx8ci5idWZmZXJQcm9jZXNzaW5nfHwhci5idWZmZXJlZFJlcXVlc3R8fCRpKHQsciksbj9jKFlpLHQscixvLGkpOllpKHQscixvLGkpfX0oZSx0KX0sdGhpcy53cml0ZWNiPW51bGwsdGhpcy53cml0ZWxlbj0wLHRoaXMuYnVmZmVyZWRSZXF1ZXN0PW51bGwsdGhpcy5sYXN0QnVmZmVyZWRSZXF1ZXN0PW51bGwsdGhpcy5wZW5kaW5nY2I9MCx0aGlzLnByZWZpbmlzaGVkPSExLHRoaXMuZXJyb3JFbWl0dGVkPSExLHRoaXMuYnVmZmVyZWRSZXF1ZXN0Q291bnQ9MCx0aGlzLmNvcmtlZFJlcXVlc3RzRnJlZT1uZXcgVmkodGhpcyl9ZnVuY3Rpb24gV2kodCl7aWYoISh0aGlzIGluc3RhbmNlb2YgV2l8fHRoaXMgaW5zdGFuY2VvZiBRaSkpcmV0dXJuIG5ldyBXaSh0KTt0aGlzLl93cml0YWJsZVN0YXRlPW5ldyBGaSh0LHRoaXMpLHRoaXMud3JpdGFibGU9ITAsdCYmKCJmdW5jdGlvbiI9PXR5cGVvZiB0LndyaXRlJiYodGhpcy5fd3JpdGU9dC53cml0ZSksImZ1bmN0aW9uIj09dHlwZW9mIHQud3JpdGV2JiYodGhpcy5fd3JpdGV2PXQud3JpdGV2KSksTC5jYWxsKHRoaXMpfWZ1bmN0aW9uIHppKHQsZSxyLG4saSxvLGEpe2Uud3JpdGVsZW49bixlLndyaXRlY2I9YSxlLndyaXRpbmc9ITAsZS5zeW5jPSEwLHI/dC5fd3JpdGV2KGksZS5vbndyaXRlKTp0Ll93cml0ZShpLG8sZS5vbndyaXRlKSxlLnN5bmM9ITF9ZnVuY3Rpb24gWWkodCxlLHIsbil7cnx8ZnVuY3Rpb24odCxlKXswPT09ZS5sZW5ndGgmJmUubmVlZERyYWluJiYoZS5uZWVkRHJhaW49ITEsdC5lbWl0KCJkcmFpbiIpKX0odCxlKSxlLnBlbmRpbmdjYi0tLG4oKSxHaSh0LGUpfWZ1bmN0aW9uICRpKHQsZSl7ZS5idWZmZXJQcm9jZXNzaW5nPSEwO3ZhciByPWUuYnVmZmVyZWRSZXF1ZXN0O2lmKHQuX3dyaXRldiYmciYmci5uZXh0KXt2YXIgbj1lLmJ1ZmZlcmVkUmVxdWVzdENvdW50LGk9bmV3IEFycmF5KG4pLG89ZS5jb3JrZWRSZXF1ZXN0c0ZyZWU7by5lbnRyeT1yO2Zvcih2YXIgYT0wO3I7KWlbYV09cixyPXIubmV4dCxhKz0xO3ppKHQsZSwhMCxlLmxlbmd0aCxpLCIiLG8uZmluaXNoKSxlLnBlbmRpbmdjYisrLGUubGFzdEJ1ZmZlcmVkUmVxdWVzdD1udWxsLG8ubmV4dD8oZS5jb3JrZWRSZXF1ZXN0c0ZyZWU9by5uZXh0LG8ubmV4dD1udWxsKTplLmNvcmtlZFJlcXVlc3RzRnJlZT1uZXcgVmkoZSl9ZWxzZXtmb3IoO3I7KXt2YXIgcz1yLmNodW5rLHU9ci5lbmNvZGluZyxmPXIuY2FsbGJhY2s7aWYoemkodCxlLCExLGUub2JqZWN0TW9kZT8xOnMubGVuZ3RoLHMsdSxmKSxyPXIubmV4dCxlLndyaXRpbmcpYnJlYWt9bnVsbD09PXImJihlLmxhc3RCdWZmZXJlZFJlcXVlc3Q9bnVsbCl9ZS5idWZmZXJlZFJlcXVlc3RDb3VudD0wLGUuYnVmZmVyZWRSZXF1ZXN0PXIsZS5idWZmZXJQcm9jZXNzaW5nPSExfWZ1bmN0aW9uIEhpKHQpe3JldHVybiB0LmVuZGluZyYmMD09PXQubGVuZ3RoJiZudWxsPT09dC5idWZmZXJlZFJlcXVlc3QmJiF0LmZpbmlzaGVkJiYhdC53cml0aW5nfWZ1bmN0aW9uIEppKHQsZSl7ZS5wcmVmaW5pc2hlZHx8KGUucHJlZmluaXNoZWQ9ITAsdC5lbWl0KCJwcmVmaW5pc2giKSl9ZnVuY3Rpb24gR2kodCxlKXt2YXIgcj1IaShlKTtyZXR1cm4gciYmKDA9PT1lLnBlbmRpbmdjYj8oSmkodCxlKSxlLmZpbmlzaGVkPSEwLHQuZW1pdCgiZmluaXNoIikpOkppKHQsZSkpLHJ9ZnVuY3Rpb24gVmkodCl7dmFyIGU9dGhpczt0aGlzLm5leHQ9bnVsbCx0aGlzLmVudHJ5PW51bGwsdGhpcy5maW5pc2g9ZnVuY3Rpb24ocil7dmFyIG49ZS5lbnRyeTtmb3IoZS5lbnRyeT1udWxsO247KXt2YXIgaT1uLmNhbGxiYWNrO3QucGVuZGluZ2NiLS0saShyKSxuPW4ubmV4dH10LmNvcmtlZFJlcXVlc3RzRnJlZT90LmNvcmtlZFJlcXVlc3RzRnJlZS5uZXh0PWU6dC5jb3JrZWRSZXF1ZXN0c0ZyZWU9ZX19amkucHJvdG90eXBlLnJlYWQ9ZnVuY3Rpb24odCl7a2koInJlYWQiLHQpLHQ9cGFyc2VJbnQodCwxMCk7dmFyIGU9dGhpcy5fcmVhZGFibGVTdGF0ZSxyPXQ7aWYoMCE9PXQmJihlLmVtaXR0ZWRSZWFkYWJsZT0hMSksMD09PXQmJmUubmVlZFJlYWRhYmxlJiYoZS5sZW5ndGg+PWUuaGlnaFdhdGVyTWFya3x8ZS5lbmRlZCkpcmV0dXJuIGtpKCJyZWFkOiBlbWl0UmVhZGFibGUiLGUubGVuZ3RoLGUuZW5kZWQpLDA9PT1lLmxlbmd0aCYmZS5lbmRlZD9VaSh0aGlzKTpBaSh0aGlzKSxudWxsO2lmKDA9PT0odD1PaSh0LGUpKSYmZS5lbmRlZClyZXR1cm4gMD09PWUubGVuZ3RoJiZVaSh0aGlzKSxudWxsO3ZhciBuLGk9ZS5uZWVkUmVhZGFibGU7cmV0dXJuIGtpKCJuZWVkIHJlYWRhYmxlIixpKSwoMD09PWUubGVuZ3RofHxlLmxlbmd0aC10PGUuaGlnaFdhdGVyTWFyaykmJmtpKCJsZW5ndGggbGVzcyB0aGFuIHdhdGVybWFyayIsaT0hMCksZS5lbmRlZHx8ZS5yZWFkaW5nP2tpKCJyZWFkaW5nIG9yIGVuZGVkIixpPSExKTppJiYoa2koImRvIHJlYWQiKSxlLnJlYWRpbmc9ITAsZS5zeW5jPSEwLDA9PT1lLmxlbmd0aCYmKGUubmVlZFJlYWRhYmxlPSEwKSx0aGlzLl9yZWFkKGUuaGlnaFdhdGVyTWFyayksZS5zeW5jPSExLGUucmVhZGluZ3x8KHQ9T2kocixlKSkpLG51bGw9PT0obj10PjA/UGkodCxlKTpudWxsKT8oZS5uZWVkUmVhZGFibGU9ITAsdD0wKTplLmxlbmd0aC09dCwwPT09ZS5sZW5ndGgmJihlLmVuZGVkfHwoZS5uZWVkUmVhZGFibGU9ITApLHIhPT10JiZlLmVuZGVkJiZVaSh0aGlzKSksbnVsbCE9PW4mJnRoaXMuZW1pdCgiZGF0YSIsbiksbn0samkucHJvdG90eXBlLl9yZWFkPWZ1bmN0aW9uKHQpe3RoaXMuZW1pdCgiZXJyb3IiLG5ldyBFcnJvcigibm90IGltcGxlbWVudGVkIikpfSxqaS5wcm90b3R5cGUucGlwZT1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXMsbj10aGlzLl9yZWFkYWJsZVN0YXRlO3N3aXRjaChuLnBpcGVzQ291bnQpe2Nhc2UgMDpuLnBpcGVzPXQ7YnJlYWs7Y2FzZSAxOm4ucGlwZXM9W24ucGlwZXMsdF07YnJlYWs7ZGVmYXVsdDpuLnBpcGVzLnB1c2godCl9bi5waXBlc0NvdW50Kz0xLGtpKCJwaXBlIGNvdW50PSVkIG9wdHM9JWoiLG4ucGlwZXNDb3VudCxlKTt2YXIgaT0hZXx8ITEhPT1lLmVuZD9hOmY7ZnVuY3Rpb24gbyh0KXtraSgib251bnBpcGUiKSx0PT09ciYmZigpfWZ1bmN0aW9uIGEoKXtraSgib25lbmQiKSx0LmVuZCgpfW4uZW5kRW1pdHRlZD9jKGkpOnIub25jZSgiZW5kIixpKSx0Lm9uKCJ1bnBpcGUiLG8pO3ZhciBzPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXQuX3JlYWRhYmxlU3RhdGU7a2koInBpcGVPbkRyYWluIixlLmF3YWl0RHJhaW4pLGUuYXdhaXREcmFpbiYmZS5hd2FpdERyYWluLS0sMD09PWUuYXdhaXREcmFpbiYmdC5saXN0ZW5lcnMoImRhdGEiKS5sZW5ndGgmJihlLmZsb3dpbmc9ITAsQmkodCkpfX0ocik7dC5vbigiZHJhaW4iLHMpO3ZhciB1PSExO2Z1bmN0aW9uIGYoKXtraSgiY2xlYW51cCIpLHQucmVtb3ZlTGlzdGVuZXIoImNsb3NlIixwKSx0LnJlbW92ZUxpc3RlbmVyKCJmaW5pc2giLGcpLHQucmVtb3ZlTGlzdGVuZXIoImRyYWluIixzKSx0LnJlbW92ZUxpc3RlbmVyKCJlcnJvciIsZCksdC5yZW1vdmVMaXN0ZW5lcigidW5waXBlIixvKSxyLnJlbW92ZUxpc3RlbmVyKCJlbmQiLGEpLHIucmVtb3ZlTGlzdGVuZXIoImVuZCIsZiksci5yZW1vdmVMaXN0ZW5lcigiZGF0YSIsbCksdT0hMCwhbi5hd2FpdERyYWlufHx0Ll93cml0YWJsZVN0YXRlJiYhdC5fd3JpdGFibGVTdGF0ZS5uZWVkRHJhaW58fHMoKX12YXIgaD0hMTtmdW5jdGlvbiBsKGUpe2tpKCJvbmRhdGEiKSxoPSExLCExIT09dC53cml0ZShlKXx8aHx8KCgxPT09bi5waXBlc0NvdW50JiZuLnBpcGVzPT09dHx8bi5waXBlc0NvdW50PjEmJi0xIT09RGkobi5waXBlcyx0KSkmJiF1JiYoa2koImZhbHNlIHdyaXRlIHJlc3BvbnNlLCBwYXVzZSIsci5fcmVhZGFibGVTdGF0ZS5hd2FpdERyYWluKSxyLl9yZWFkYWJsZVN0YXRlLmF3YWl0RHJhaW4rKyxoPSEwKSxyLnBhdXNlKCkpfWZ1bmN0aW9uIGQoZSl7dmFyIHI7a2koIm9uZXJyb3IiLGUpLHkoKSx0LnJlbW92ZUxpc3RlbmVyKCJlcnJvciIsZCksMD09PShyPSJlcnJvciIsdC5saXN0ZW5lcnMocikubGVuZ3RoKSYmdC5lbWl0KCJlcnJvciIsZSl9ZnVuY3Rpb24gcCgpe3QucmVtb3ZlTGlzdGVuZXIoImZpbmlzaCIsZykseSgpfWZ1bmN0aW9uIGcoKXtraSgib25maW5pc2giKSx0LnJlbW92ZUxpc3RlbmVyKCJjbG9zZSIscCkseSgpfWZ1bmN0aW9uIHkoKXtraSgidW5waXBlIiksci51bnBpcGUodCl9cmV0dXJuIHIub24oImRhdGEiLGwpLGZ1bmN0aW9uKHQsZSxyKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgdC5wcmVwZW5kTGlzdGVuZXIpcmV0dXJuIHQucHJlcGVuZExpc3RlbmVyKGUscik7dC5fZXZlbnRzJiZ0Ll9ldmVudHNbZV0/QXJyYXkuaXNBcnJheSh0Ll9ldmVudHNbZV0pP3QuX2V2ZW50c1tlXS51bnNoaWZ0KHIpOnQuX2V2ZW50c1tlXT1bcix0Ll9ldmVudHNbZV1dOnQub24oZSxyKX0odCwiZXJyb3IiLGQpLHQub25jZSgiY2xvc2UiLHApLHQub25jZSgiZmluaXNoIixnKSx0LmVtaXQoInBpcGUiLHIpLG4uZmxvd2luZ3x8KGtpKCJwaXBlIHJlc3VtZSIpLHIucmVzdW1lKCkpLHR9LGppLnByb3RvdHlwZS51bnBpcGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fcmVhZGFibGVTdGF0ZTtpZigwPT09ZS5waXBlc0NvdW50KXJldHVybiB0aGlzO2lmKDE9PT1lLnBpcGVzQ291bnQpcmV0dXJuIHQmJnQhPT1lLnBpcGVzfHwodHx8KHQ9ZS5waXBlcyksZS5waXBlcz1udWxsLGUucGlwZXNDb3VudD0wLGUuZmxvd2luZz0hMSx0JiZ0LmVtaXQoInVucGlwZSIsdGhpcykpLHRoaXM7aWYoIXQpe3ZhciByPWUucGlwZXMsbj1lLnBpcGVzQ291bnQ7ZS5waXBlcz1udWxsLGUucGlwZXNDb3VudD0wLGUuZmxvd2luZz0hMTtmb3IodmFyIGk9MDtpPG47aSsrKXJbaV0uZW1pdCgidW5waXBlIix0aGlzKTtyZXR1cm4gdGhpc312YXIgbz1EaShlLnBpcGVzLHQpO3JldHVybi0xPT09b3x8KGUucGlwZXMuc3BsaWNlKG8sMSksZS5waXBlc0NvdW50LT0xLDE9PT1lLnBpcGVzQ291bnQmJihlLnBpcGVzPWUucGlwZXNbMF0pLHQuZW1pdCgidW5waXBlIix0aGlzKSksdGhpc30samkucHJvdG90eXBlLm9uPWZ1bmN0aW9uKHQsZSl7dmFyIHI9TC5wcm90b3R5cGUub24uY2FsbCh0aGlzLHQsZSk7aWYoImRhdGEiPT09dCkhMSE9PXRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyYmdGhpcy5yZXN1bWUoKTtlbHNlIGlmKCJyZWFkYWJsZSI9PT10KXt2YXIgbj10aGlzLl9yZWFkYWJsZVN0YXRlO24uZW5kRW1pdHRlZHx8bi5yZWFkYWJsZUxpc3RlbmluZ3x8KG4ucmVhZGFibGVMaXN0ZW5pbmc9bi5uZWVkUmVhZGFibGU9ITAsbi5lbWl0dGVkUmVhZGFibGU9ITEsbi5yZWFkaW5nP24ubGVuZ3RoJiZBaSh0aGlzKTpjKHhpLHRoaXMpKX1yZXR1cm4gcn0samkucHJvdG90eXBlLmFkZExpc3RlbmVyPWppLnByb3RvdHlwZS5vbixqaS5wcm90b3R5cGUucmVzdW1lPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fcmVhZGFibGVTdGF0ZTtyZXR1cm4gdC5mbG93aW5nfHwoa2koInJlc3VtZSIpLHQuZmxvd2luZz0hMCxmdW5jdGlvbih0LGUpe2UucmVzdW1lU2NoZWR1bGVkfHwoZS5yZXN1bWVTY2hlZHVsZWQ9ITAsYyhMaSx0LGUpKX0odGhpcyx0KSksdGhpc30samkucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7cmV0dXJuIGtpKCJjYWxsIHBhdXNlIGZsb3dpbmc9JWoiLHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyksITEhPT10aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcmJihraSgicGF1c2UiKSx0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmc9ITEsdGhpcy5lbWl0KCJwYXVzZSIpKSx0aGlzfSxqaS5wcm90b3R5cGUud3JhcD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9yZWFkYWJsZVN0YXRlLHI9ITEsbj10aGlzO2Zvcih2YXIgaSBpbiB0Lm9uKCJlbmQiLChmdW5jdGlvbigpe2lmKGtpKCJ3cmFwcGVkIGVuZCIpLGUuZGVjb2RlciYmIWUuZW5kZWQpe3ZhciB0PWUuZGVjb2Rlci5lbmQoKTt0JiZ0Lmxlbmd0aCYmbi5wdXNoKHQpfW4ucHVzaChudWxsKX0pKSx0Lm9uKCJkYXRhIiwoZnVuY3Rpb24oaSl7KGtpKCJ3cmFwcGVkIGRhdGEiKSxlLmRlY29kZXImJihpPWUuZGVjb2Rlci53cml0ZShpKSksZS5vYmplY3RNb2RlJiZudWxsPT1pKXx8KGUub2JqZWN0TW9kZXx8aSYmaS5sZW5ndGgpJiYobi5wdXNoKGkpfHwocj0hMCx0LnBhdXNlKCkpKX0pKSx0KXZvaWQgMD09PXRoaXNbaV0mJiJmdW5jdGlvbiI9PXR5cGVvZiB0W2ldJiYodGhpc1tpXT1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdFtlXS5hcHBseSh0LGFyZ3VtZW50cyl9fShpKSk7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPTAsbj10Lmxlbmd0aDtyPG47cisrKWUodFtyXSxyKX0oWyJlcnJvciIsImNsb3NlIiwiZGVzdHJveSIsInBhdXNlIiwicmVzdW1lIl0sKGZ1bmN0aW9uKGUpe3Qub24oZSxuLmVtaXQuYmluZChuLGUpKX0pKSxuLl9yZWFkPWZ1bmN0aW9uKGUpe2tpKCJ3cmFwcGVkIF9yZWFkIixlKSxyJiYocj0hMSx0LnJlc3VtZSgpKX0sbn0samkuX2Zyb21MaXN0PVBpLFdpLldyaXRhYmxlU3RhdGU9RmksVnQoV2ksTCksRmkucHJvdG90eXBlLmdldEJ1ZmZlcj1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLmJ1ZmZlcmVkUmVxdWVzdCxlPVtdO3Q7KWUucHVzaCh0KSx0PXQubmV4dDtyZXR1cm4gZX0sV2kucHJvdG90eXBlLnBpcGU9ZnVuY3Rpb24oKXt0aGlzLmVtaXQoImVycm9yIixuZXcgRXJyb3IoIkNhbm5vdCBwaXBlLCBub3QgcmVhZGFibGUiKSl9LFdpLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbih0LGUscil7dmFyIG49dGhpcy5fd3JpdGFibGVTdGF0ZSxpPSExO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlJiYocj1lLGU9bnVsbCksYXQuaXNCdWZmZXIodCk/ZT0iYnVmZmVyIjplfHwoZT1uLmRlZmF1bHRFbmNvZGluZyksImZ1bmN0aW9uIiE9dHlwZW9mIHImJihyPUlpKSxuLmVuZGVkP2Z1bmN0aW9uKHQsZSl7dmFyIHI9bmV3IEVycm9yKCJ3cml0ZSBhZnRlciBlbmQiKTt0LmVtaXQoImVycm9yIixyKSxjKGUscil9KHRoaXMscik6ZnVuY3Rpb24odCxlLHIsbil7dmFyIGk9ITAsbz0hMTtyZXR1cm4gbnVsbD09PXI/bz1uZXcgVHlwZUVycm9yKCJNYXkgbm90IHdyaXRlIG51bGwgdmFsdWVzIHRvIHN0cmVhbSIpOmF0LmlzQnVmZmVyKHIpfHwic3RyaW5nIj09dHlwZW9mIHJ8fHZvaWQgMD09PXJ8fGUub2JqZWN0TW9kZXx8KG89bmV3IFR5cGVFcnJvcigiSW52YWxpZCBub24tc3RyaW5nL2J1ZmZlciBjaHVuayIpKSxvJiYodC5lbWl0KCJlcnJvciIsbyksYyhuLG8pLGk9ITEpLGl9KHRoaXMsbix0LHIpJiYobi5wZW5kaW5nY2IrKyxpPWZ1bmN0aW9uKHQsZSxyLG4saSl7cj1mdW5jdGlvbih0LGUscil7dC5vYmplY3RNb2RlfHwhMT09PXQuZGVjb2RlU3RyaW5nc3x8InN0cmluZyIhPXR5cGVvZiBlfHwoZT1hdC5mcm9tKGUscikpO3JldHVybiBlfShlLHIsbiksYXQuaXNCdWZmZXIocikmJihuPSJidWZmZXIiKTt2YXIgbz1lLm9iamVjdE1vZGU/MTpyLmxlbmd0aDtlLmxlbmd0aCs9bzt2YXIgYT1lLmxlbmd0aDxlLmhpZ2hXYXRlck1hcms7YXx8KGUubmVlZERyYWluPSEwKTtpZihlLndyaXRpbmd8fGUuY29ya2VkKXt2YXIgcz1lLmxhc3RCdWZmZXJlZFJlcXVlc3Q7ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0PW5ldyBxaShyLG4saSkscz9zLm5leHQ9ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0OmUuYnVmZmVyZWRSZXF1ZXN0PWUubGFzdEJ1ZmZlcmVkUmVxdWVzdCxlLmJ1ZmZlcmVkUmVxdWVzdENvdW50Kz0xfWVsc2UgemkodCxlLCExLG8scixuLGkpO3JldHVybiBhfSh0aGlzLG4sdCxlLHIpKSxpfSxXaS5wcm90b3R5cGUuY29yaz1mdW5jdGlvbigpe3RoaXMuX3dyaXRhYmxlU3RhdGUuY29ya2VkKyt9LFdpLnByb3RvdHlwZS51bmNvcms9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl93cml0YWJsZVN0YXRlO3QuY29ya2VkJiYodC5jb3JrZWQtLSx0LndyaXRpbmd8fHQuY29ya2VkfHx0LmZpbmlzaGVkfHx0LmJ1ZmZlclByb2Nlc3Npbmd8fCF0LmJ1ZmZlcmVkUmVxdWVzdHx8JGkodGhpcyx0KSl9LFdpLnByb3RvdHlwZS5zZXREZWZhdWx0RW5jb2Rpbmc9ZnVuY3Rpb24odCl7aWYoInN0cmluZyI9PXR5cGVvZiB0JiYodD10LnRvTG93ZXJDYXNlKCkpLCEoWyJoZXgiLCJ1dGY4IiwidXRmLTgiLCJhc2NpaSIsImJpbmFyeSIsImJhc2U2NCIsInVjczIiLCJ1Y3MtMiIsInV0ZjE2bGUiLCJ1dGYtMTZsZSIsInJhdyJdLmluZGV4T2YoKHQrIiIpLnRvTG93ZXJDYXNlKCkpPi0xKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK3QpO3JldHVybiB0aGlzLl93cml0YWJsZVN0YXRlLmRlZmF1bHRFbmNvZGluZz10LHRoaXN9LFdpLnByb3RvdHlwZS5fd3JpdGU9ZnVuY3Rpb24odCxlLHIpe3IobmV3IEVycm9yKCJub3QgaW1wbGVtZW50ZWQiKSl9LFdpLnByb3RvdHlwZS5fd3JpdGV2PW51bGwsV2kucHJvdG90eXBlLmVuZD1mdW5jdGlvbih0LGUscil7dmFyIG49dGhpcy5fd3JpdGFibGVTdGF0ZTsiZnVuY3Rpb24iPT10eXBlb2YgdD8ocj10LHQ9bnVsbCxlPW51bGwpOiJmdW5jdGlvbiI9PXR5cGVvZiBlJiYocj1lLGU9bnVsbCksbnVsbCE9dCYmdGhpcy53cml0ZSh0LGUpLG4uY29ya2VkJiYobi5jb3JrZWQ9MSx0aGlzLnVuY29yaygpKSxuLmVuZGluZ3x8bi5maW5pc2hlZHx8ZnVuY3Rpb24odCxlLHIpe2UuZW5kaW5nPSEwLEdpKHQsZSksciYmKGUuZmluaXNoZWQ/YyhyKTp0Lm9uY2UoImZpbmlzaCIscikpO2UuZW5kZWQ9ITAsdC53cml0YWJsZT0hMX0odGhpcyxuLHIpfSxWdChRaSxqaSk7Zm9yKHZhciBLaT1PYmplY3Qua2V5cyhXaS5wcm90b3R5cGUpLFppPTA7Wmk8S2kubGVuZ3RoO1ppKyspe3ZhciBYaT1LaVtaaV07UWkucHJvdG90eXBlW1hpXXx8KFFpLnByb3RvdHlwZVtYaV09V2kucHJvdG90eXBlW1hpXSl9ZnVuY3Rpb24gUWkodCl7aWYoISh0aGlzIGluc3RhbmNlb2YgUWkpKXJldHVybiBuZXcgUWkodCk7amkuY2FsbCh0aGlzLHQpLFdpLmNhbGwodGhpcyx0KSx0JiYhMT09PXQucmVhZGFibGUmJih0aGlzLnJlYWRhYmxlPSExKSx0JiYhMT09PXQud3JpdGFibGUmJih0aGlzLndyaXRhYmxlPSExKSx0aGlzLmFsbG93SGFsZk9wZW49ITAsdCYmITE9PT10LmFsbG93SGFsZk9wZW4mJih0aGlzLmFsbG93SGFsZk9wZW49ITEpLHRoaXMub25jZSgiZW5kIix0byl9ZnVuY3Rpb24gdG8oKXt0aGlzLmFsbG93SGFsZk9wZW58fHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kZWR8fGMoZW8sdGhpcyl9ZnVuY3Rpb24gZW8odCl7dC5lbmQoKX1mdW5jdGlvbiBybyh0KXt0aGlzLmFmdGVyVHJhbnNmb3JtPWZ1bmN0aW9uKGUscil7cmV0dXJuIGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj10Ll90cmFuc2Zvcm1TdGF0ZTtuLnRyYW5zZm9ybWluZz0hMTt2YXIgaT1uLndyaXRlY2I7aWYoIWkpcmV0dXJuIHQuZW1pdCgiZXJyb3IiLG5ldyBFcnJvcigibm8gd3JpdGVjYiBpbiBUcmFuc2Zvcm0gY2xhc3MiKSk7bi53cml0ZWNodW5rPW51bGwsbi53cml0ZWNiPW51bGwsbnVsbCE9ciYmdC5wdXNoKHIpO2koZSk7dmFyIG89dC5fcmVhZGFibGVTdGF0ZTtvLnJlYWRpbmc9ITEsKG8ubmVlZFJlYWRhYmxlfHxvLmxlbmd0aDxvLmhpZ2hXYXRlck1hcmspJiZ0Ll9yZWFkKG8uaGlnaFdhdGVyTWFyayl9KHQsZSxyKX0sdGhpcy5uZWVkVHJhbnNmb3JtPSExLHRoaXMudHJhbnNmb3JtaW5nPSExLHRoaXMud3JpdGVjYj1udWxsLHRoaXMud3JpdGVjaHVuaz1udWxsLHRoaXMud3JpdGVlbmNvZGluZz1udWxsfWZ1bmN0aW9uIG5vKHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIG5vKSlyZXR1cm4gbmV3IG5vKHQpO1FpLmNhbGwodGhpcyx0KSx0aGlzLl90cmFuc2Zvcm1TdGF0ZT1uZXcgcm8odGhpcyk7dmFyIGU9dGhpczt0aGlzLl9yZWFkYWJsZVN0YXRlLm5lZWRSZWFkYWJsZT0hMCx0aGlzLl9yZWFkYWJsZVN0YXRlLnN5bmM9ITEsdCYmKCJmdW5jdGlvbiI9PXR5cGVvZiB0LnRyYW5zZm9ybSYmKHRoaXMuX3RyYW5zZm9ybT10LnRyYW5zZm9ybSksImZ1bmN0aW9uIj09dHlwZW9mIHQuZmx1c2gmJih0aGlzLl9mbHVzaD10LmZsdXNoKSksdGhpcy5vbmNlKCJwcmVmaW5pc2giLChmdW5jdGlvbigpeyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLl9mbHVzaD90aGlzLl9mbHVzaCgoZnVuY3Rpb24odCl7aW8oZSx0KX0pKTppbyhlKX0pKX1mdW5jdGlvbiBpbyh0LGUpe2lmKGUpcmV0dXJuIHQuZW1pdCgiZXJyb3IiLGUpO3ZhciByPXQuX3dyaXRhYmxlU3RhdGUsbj10Ll90cmFuc2Zvcm1TdGF0ZTtpZihyLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkNhbGxpbmcgdHJhbnNmb3JtIGRvbmUgd2hlbiB3cy5sZW5ndGggIT0gMCIpO2lmKG4udHJhbnNmb3JtaW5nKXRocm93IG5ldyBFcnJvcigiQ2FsbGluZyB0cmFuc2Zvcm0gZG9uZSB3aGVuIHN0aWxsIHRyYW5zZm9ybWluZyIpO3JldHVybiB0LnB1c2gobnVsbCl9ZnVuY3Rpb24gb28odCl7aWYoISh0aGlzIGluc3RhbmNlb2Ygb28pKXJldHVybiBuZXcgb28odCk7bm8uY2FsbCh0aGlzLHQpfWZ1bmN0aW9uIGFvKCl7TC5jYWxsKHRoaXMpfWZ1bmN0aW9uIHNvKHQsZSxyKXt0PXR8fGZ1bmN0aW9uKHQpe3RoaXMucXVldWUodCl9LGU9ZXx8ZnVuY3Rpb24oKXt0aGlzLnF1ZXVlKG51bGwpfTtsZXQgbj0hMSxpPSExLG89W10sYT0hMSxzPW5ldyBhbztmdW5jdGlvbiB1KCl7Zm9yKDtvLmxlbmd0aCYmIXMucGF1c2VkOyl7bGV0IHQ9by5zaGlmdCgpO2lmKG51bGw9PT10KXJldHVybiBzLmVtaXQoImVuZCIpO3MuZW1pdCgiZGF0YSIsdCl9fWZ1bmN0aW9uIGYoKXtzLndyaXRhYmxlPSExLGUuY2FsbChzKSwhcy5yZWFkYWJsZSYmcy5hdXRvRGVzdHJveSYmcy5kZXN0cm95KCl9cmV0dXJuIHMucmVhZGFibGU9cy53cml0YWJsZT0hMCxzLnBhdXNlZD0hMSxzLmF1dG9EZXN0cm95PSEociYmITE9PT1yLmF1dG9EZXN0cm95KSxzLndyaXRlPWZ1bmN0aW9uKGUpe3JldHVybiB0LmNhbGwodGhpcyxlKSwhcy5wYXVzZWR9LHMucXVldWU9cy5wdXNoPWZ1bmN0aW9uKHQpe3JldHVybiBhfHwobnVsbD09PXQmJihhPSEwKSxvLnB1c2godCksdSgpKSxzfSxzLm9uKCJlbmQiLChmdW5jdGlvbigpe3MucmVhZGFibGU9ITEsIXMud3JpdGFibGUmJnMuYXV0b0Rlc3Ryb3kmJlIubmV4dFRpY2soKGZ1bmN0aW9uKCl7cy5kZXN0cm95KCl9KSl9KSkscy5lbmQ9ZnVuY3Rpb24odCl7aWYoIW4pcmV0dXJuIG49ITAsYXJndW1lbnRzLmxlbmd0aCYmcy53cml0ZSh0KSxmKCksc30scy5kZXN0cm95PWZ1bmN0aW9uKCl7aWYoIWkpcmV0dXJuIGk9ITAsbj0hMCxvLmxlbmd0aD0wLHMud3JpdGFibGU9cy5yZWFkYWJsZT0hMSxzLmVtaXQoImNsb3NlIiksc30scy5wYXVzZT1mdW5jdGlvbigpe2lmKCFzLnBhdXNlZClyZXR1cm4gcy5wYXVzZWQ9ITAsc30scy5yZXN1bWU9ZnVuY3Rpb24oKXtyZXR1cm4gcy5wYXVzZWQmJihzLnBhdXNlZD0hMSxzLmVtaXQoInJlc3VtZSIpKSx1KCkscy5wYXVzZWR8fHMuZW1pdCgiZHJhaW4iKSxzfSxzfVZ0KG5vLFFpKSxuby5wcm90b3R5cGUucHVzaD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5uZWVkVHJhbnNmb3JtPSExLFFpLnByb3RvdHlwZS5wdXNoLmNhbGwodGhpcyx0LGUpfSxuby5wcm90b3R5cGUuX3RyYW5zZm9ybT1mdW5jdGlvbih0LGUscil7dGhyb3cgbmV3IEVycm9yKCJOb3QgaW1wbGVtZW50ZWQiKX0sbm8ucHJvdG90eXBlLl93cml0ZT1mdW5jdGlvbih0LGUscil7dmFyIG49dGhpcy5fdHJhbnNmb3JtU3RhdGU7aWYobi53cml0ZWNiPXIsbi53cml0ZWNodW5rPXQsbi53cml0ZWVuY29kaW5nPWUsIW4udHJhbnNmb3JtaW5nKXt2YXIgaT10aGlzLl9yZWFkYWJsZVN0YXRlOyhuLm5lZWRUcmFuc2Zvcm18fGkubmVlZFJlYWRhYmxlfHxpLmxlbmd0aDxpLmhpZ2hXYXRlck1hcmspJiZ0aGlzLl9yZWFkKGkuaGlnaFdhdGVyTWFyayl9fSxuby5wcm90b3R5cGUuX3JlYWQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fdHJhbnNmb3JtU3RhdGU7bnVsbCE9PWUud3JpdGVjaHVuayYmZS53cml0ZWNiJiYhZS50cmFuc2Zvcm1pbmc/KGUudHJhbnNmb3JtaW5nPSEwLHRoaXMuX3RyYW5zZm9ybShlLndyaXRlY2h1bmssZS53cml0ZWVuY29kaW5nLGUuYWZ0ZXJUcmFuc2Zvcm0pKTplLm5lZWRUcmFuc2Zvcm09ITB9LFZ0KG9vLG5vKSxvby5wcm90b3R5cGUuX3RyYW5zZm9ybT1mdW5jdGlvbih0LGUscil7cihudWxsLHQpfSxWdChhbyxMKSxhby5SZWFkYWJsZT1qaSxhby5Xcml0YWJsZT1XaSxhby5EdXBsZXg9UWksYW8uVHJhbnNmb3JtPW5vLGFvLlBhc3NUaHJvdWdoPW9vLGFvLlN0cmVhbT1hbyxhby5wcm90b3R5cGUucGlwZT1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXM7ZnVuY3Rpb24gbihlKXt0LndyaXRhYmxlJiYhMT09PXQud3JpdGUoZSkmJnIucGF1c2UmJnIucGF1c2UoKX1mdW5jdGlvbiBpKCl7ci5yZWFkYWJsZSYmci5yZXN1bWUmJnIucmVzdW1lKCl9ci5vbigiZGF0YSIsbiksdC5vbigiZHJhaW4iLGkpLHQuX2lzU3RkaW98fGUmJiExPT09ZS5lbmR8fChyLm9uKCJlbmQiLGEpLHIub24oImNsb3NlIixzKSk7dmFyIG89ITE7ZnVuY3Rpb24gYSgpe298fChvPSEwLHQuZW5kKCkpfWZ1bmN0aW9uIHMoKXtvfHwobz0hMCwiZnVuY3Rpb24iPT10eXBlb2YgdC5kZXN0cm95JiZ0LmRlc3Ryb3koKSl9ZnVuY3Rpb24gdSh0KXtpZihmKCksMD09PUwubGlzdGVuZXJDb3VudCh0aGlzLCJlcnJvciIpKXRocm93IHR9ZnVuY3Rpb24gZigpe3IucmVtb3ZlTGlzdGVuZXIoImRhdGEiLG4pLHQucmVtb3ZlTGlzdGVuZXIoImRyYWluIixpKSxyLnJlbW92ZUxpc3RlbmVyKCJlbmQiLGEpLHIucmVtb3ZlTGlzdGVuZXIoImNsb3NlIixzKSxyLnJlbW92ZUxpc3RlbmVyKCJlcnJvciIsdSksdC5yZW1vdmVMaXN0ZW5lcigiZXJyb3IiLHUpLHIucmVtb3ZlTGlzdGVuZXIoImVuZCIsZiksci5yZW1vdmVMaXN0ZW5lcigiY2xvc2UiLGYpLHQucmVtb3ZlTGlzdGVuZXIoImNsb3NlIixmKX1yZXR1cm4gci5vbigiZXJyb3IiLHUpLHQub24oImVycm9yIix1KSxyLm9uKCJlbmQiLGYpLHIub24oImNsb3NlIixmKSx0Lm9uKCJjbG9zZSIsZiksdC5lbWl0KCJwaXBlIixyKSx0fSxzby50aHJvdWdoPXNvO2xldCB1bz17cGFyc2U6ZnVuY3Rpb24odCxlKXtsZXQgcixuO2Z1bmN0aW9uIGkodCxlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/ZT09PXQ6dCYmImZ1bmN0aW9uIj09dHlwZW9mIHQuZXhlYz90LmV4ZWMoZSk6ImJvb2xlYW4iPT10eXBlb2YgdHx8Im9iamVjdCI9PXR5cGVvZiB0P3Q6ImZ1bmN0aW9uIj09dHlwZW9mIHQmJnQoZSl9bGV0IG89bmV3IGJpLGE9c28oKGZ1bmN0aW9uKHQpeyJzdHJpbmciPT10eXBlb2YgdCYmKHQ9YXQuZnJvbSh0KSksby53cml0ZSh0KX0pLChmdW5jdGlvbih0KXt0JiZhLndyaXRlKHQpLHImJmEuZW1pdCgiaGVhZGVyIixyKSxuJiZhLmVtaXQoImZvb3RlciIsbiksYS5xdWV1ZShudWxsKX0pKTtmdW5jdGlvbiBzKHQsZSl7ITEhPT1yJiYocj1yfHx7fSxyW3RdPWUpLCExIT09biYmITE9PT1yJiYobj1ufHx7fSxuW3RdPWUpfXJldHVybiJzdHJpbmciPT10eXBlb2YgdCYmKHQ9dC5zcGxpdCgiLiIpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIiQqIj09PXQ/e2VtaXRLZXk6ITB9OiIqIj09PXR8fCgiIj09PXQ/e3JlY3Vyc2U6ITB9OnQpfSkpKSx0JiZ0Lmxlbmd0aHx8KHQ9bnVsbCksby5vblZhbHVlPWZ1bmN0aW9uKG4pe2lmKHRoaXMucm9vdHx8KGEucm9vdD1uKSwhdClyZXR1cm47bGV0IG89MCx1PTAsZj0hMSxoPSExO2Zvcig7bzx0Lmxlbmd0aDspe2xldCBlLHI9dFtvXTtpZih1KyssciYmIXIucmVjdXJzZSl7aWYoZT11PT09dGhpcy5zdGFjay5sZW5ndGg/dGhpczp0aGlzLnN0YWNrW3VdLCFlKXJldHVybjtpZighaShyLGUua2V5KSlyZXR1cm4gdm9pZCBzKGUua2V5LG4pO2Y9ISFyLmVtaXRLZXksaD0hIXIuZW1pdFBhdGgsbysrfWVsc2V7bysrO2xldCByPXRbb107aWYoIXIpcmV0dXJuO2Zvcig7Oyl7aWYoZT11PT09dGhpcy5zdGFjay5sZW5ndGg/dGhpczp0aGlzLnN0YWNrW3VdLCFlKXJldHVybjtpZihpKHIsZS5rZXkpKXtvKyssT2JqZWN0LmlzRnJvemVuKHRoaXMuc3RhY2tbdV0pfHwodGhpcy5zdGFja1t1XS52YWx1ZT1udWxsKTticmVha31zKGUua2V5LG4pLHUrK319fWlmKHImJihhLmVtaXQoImhlYWRlciIscikscj0hMSksdSE9PXRoaXMuc3RhY2subGVuZ3RoKXJldHVybjtsZXQgbD10aGlzLnN0YWNrLnNsaWNlKDEpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQua2V5fSkpLmNvbmNhdChbdGhpcy5rZXldKSxjPW47bnVsbCE9YyYmbnVsbCE9KGM9ZT9lKGMsbCk6YykmJigoZnx8aCkmJihjPXt2YWx1ZTpjfSxmJiYoYy5rZXk9dGhpcy5rZXkpLGgmJihjLnBhdGg9bCkpLGEucXVldWUoYykpLHRoaXMudmFsdWUmJmRlbGV0ZSB0aGlzLnZhbHVlW3RoaXMua2V5XTtmb3IobGV0IHQgaW4gdGhpcy5zdGFjaylPYmplY3QuaXNGcm96ZW4odGhpcy5zdGFja1t0XSl8fCh0aGlzLnN0YWNrW3RdLnZhbHVlPW51bGwpfSxvLl9vblRva2VuPW8ub25Ub2tlbixvLm9uVG9rZW49ZnVuY3Rpb24oZSxyKXtvLl9vblRva2VuKGUsciksMD09PXRoaXMuc3RhY2subGVuZ3RoJiZhLnJvb3QmJih0fHxhLnF1ZXVlKGEucm9vdCksYS5yb290PW51bGwpfSxvLm9uRXJyb3I9ZnVuY3Rpb24odCl7dC5tZXNzYWdlLmluZGV4T2YoImF0IHBvc2l0aW9uIik+LTEmJih0Lm1lc3NhZ2U9IkludmFsaWQgSlNPTiAoIit0Lm1lc3NhZ2UrIikiKSxhLmVtaXQoImVycm9yIix0KX0sYX19LGZvPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZvPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2ZvcihsZXQgciBpbiBlKWUuaGFzT3duUHJvcGVydHkocikmJih0W3JdPWVbcl0pfSxmbyh0LGUpfTtsZXQgaG8sbG89L1tcXCJcdTAwMDAtXHUwMDFmXHUwMDdmLVx1MDA5Zlx1MDBhZFx1MDYwMC1cdTA2MDRcdTA3MGZcdTE3YjRcdTE3YjVcdTIwMGMtXHUyMDBmXHUyMDI4LVx1MjAyZlx1MjA2MC1cdTIwNmZcdWZlZmZcdWZmZjAtXHVmZmZmXS9nLGNvPXsiXGIiOiJcXGIiLCJcdCI6IlxcdCIsIlxuIjoiXFxuIiwiXGYiOiJcXGYiLCJcciI6IlxcciIsJyInOidcXCInLCJcXCI6IlxcXFwifTtmdW5jdGlvbiBwbyh0KXtyZXR1cm4gdD8iZnVuY3Rpb24iPT10eXBlb2YgdC50aGVuP2hvLlByb21pc2U6ZnVuY3Rpb24odCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQucmVhZCYmImZ1bmN0aW9uIj09dHlwZW9mIHQucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHQucGlwZSYmImZ1bmN0aW9uIj09dHlwZW9mIHQub25jZSYmImZ1bmN0aW9uIj09dHlwZW9mIHQucmVtb3ZlTGlzdGVuZXJ9KHQpP3QuX3JlYWRhYmxlU3RhdGUub2JqZWN0TW9kZT9oby5SZWFkYWJsZU9iamVjdDpoby5SZWFkYWJsZVN0cmluZzpBcnJheS5pc0FycmF5KHQpP2hvLkFycmF5OiJvYmplY3QiPT10eXBlb2YgdHx8dCBpbnN0YW5jZW9mIE9iamVjdD9oby5PYmplY3Q6aG8uUHJpbWl0aXZlOmhvLlByaW1pdGl2ZX0hZnVuY3Rpb24odCl7dFt0LkFycmF5PTBdPSJBcnJheSIsdFt0Lk9iamVjdD0xXT0iT2JqZWN0Iix0W3QuUmVhZGFibGVTdHJpbmc9Ml09IlJlYWRhYmxlU3RyaW5nIix0W3QuUmVhZGFibGVPYmplY3Q9M109IlJlYWRhYmxlT2JqZWN0Iix0W3QuUHJpbWl0aXZlPTRdPSJQcmltaXRpdmUiLHRbdC5Qcm9taXNlPTVdPSJQcm9taXNlIn0oaG98fChobz17fSkpO2xldCBnbz1bXTtnb1toby5BcnJheV09IlsiLGdvW2hvLk9iamVjdF09InsiLGdvW2hvLlJlYWRhYmxlU3RyaW5nXT0nIicsZ29baG8uUmVhZGFibGVPYmplY3RdPSJbIjtsZXQgeW89W107eW9baG8uQXJyYXldPSJdIix5b1toby5PYmplY3RdPSJ9Iix5b1toby5SZWFkYWJsZVN0cmluZ109JyInLHlvW2hvLlJlYWRhYmxlT2JqZWN0XT0iXSI7bGV0IGJvPVtdO2ZvcihsZXQgdD0wLGU9T2JqZWN0LmVudHJpZXMoaG8pO3Q8ZS5sZW5ndGg7dCsrKXtsZXQgcj1lW3RdLG49clswXSxpPXJbMV07Im51bWJlciI9PXR5cGVvZiBpJiYoYm9baV09InByb2Nlc3MiK24pfWZ1bmN0aW9uIHZvKHQpe3JldHVybiB0LnJlcGxhY2UobG8sKGZ1bmN0aW9uKHQpe2xldCBlPWNvW3RdO3JldHVybiJzdHJpbmciPT10eXBlb2YgZT9lOiJcXHUiK3QuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikucGFkU3RhcnQoNCwiMCIpfSkpfWZ1bmN0aW9uIHdvKHQpe3JldHVybiciJyt2byh0KSsnIid9ZnVuY3Rpb24gbW8odCxlKXtsZXQgcj10LnJlYWQoZSk7cmV0dXJuIG51bGw9PT1yP25ldyBQcm9taXNlKChmdW5jdGlvbihlLHIpe2xldCBuPWZ1bmN0aW9uKCl7cmV0dXJuIGUobnVsbCl9O3Qub25jZSgiZW5kIixuKSx0Lm9uY2UoImVycm9yIixyKSx0Lm9uY2UoInJlYWRhYmxlIiwoZnVuY3Rpb24oKXt0LnJlbW92ZUxpc3RlbmVyKCJlbmQiLG4pLHQucmVtb3ZlTGlzdGVuZXIoImVycm9yIixyKSxlKHQucmVhZCgpKX0pKX0pKTpQcm9taXNlLnJlc29sdmUocil9ZnVuY3Rpb24gX28odCl7cmV0dXJuIHQudGhlbigoZnVuY3Rpb24odCl7cmV0dXJuIHBvKHQpPT09aG8uUHJvbWlzZT9fbyh0KTp0fSkpfWxldCBTbz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUscixuLGkpe3ZvaWQgMD09PWkmJihpPSExKTtsZXQgbz10LmNhbGwodGhpcyl8fHRoaXM7by5jeWNsZT1pLG8uc3RhY2s9W10sby5kZXB0aD0wLG8ucHVzaENhbGxlZD0hMSxvLmVuZD0hMSxvLmlzUmVhZGluZz0hMSxvLnJlYWRNb3JlPSExO2xldCBhPXR5cGVvZiBuO3JldHVybiJzdHJpbmciIT09YSYmIm51bWJlciIhPT1hfHwoby5nYXA9TnVtYmVyLmlzRmluaXRlKG4pPyIgIi5yZXBlYXQobik6biksT2JqZWN0LmFzc2lnbihvLHt2aXNpdGVkOmk/bmV3IFdlYWtNYXA6bmV3IFdlYWtTZXQscmVwbGFjZXJGdW5jdGlvbjpyIGluc3RhbmNlb2YgRnVuY3Rpb24mJnIscmVwbGFjZXJBcnJheTpBcnJheS5pc0FycmF5KHIpJiZyfSksciBpbnN0YW5jZW9mIEZ1bmN0aW9uJiYoby5yZXBsYWNlckZ1bmN0aW9uPXIpLEFycmF5LmlzQXJyYXkocikmJihvLnJlcGxhY2VyQXJyYXk9ciksby5hZGRUb1N0YWNrKGUpLG99cmV0dXJuIGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gcigpe3RoaXMuY29uc3RydWN0b3I9dH1mbyh0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KHIucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyByKX0oZSx0KSxlLnByb3RvdHlwZS5jeWNsZXI9ZnVuY3Rpb24odCxlKXtsZXQgcj10aGlzLnZpc2l0ZWQuZ2V0KGUpO2lmKHIpcmV0dXJueyRyZWY6cn07bGV0IG49dGhpcy5wYXRoKCk7cmV0dXJuIHZvaWQgMCE9PXQmJm4ucHVzaCh0KSxuPW4ubWFwKChmdW5jdGlvbih0KXtyZXR1cm4iWyIrKE51bWJlci5pc0ludGVnZXIodCk/dDp3byh0KSkrIl0ifSkpLHRoaXMudmlzaXRlZC5zZXQoZSxuLmxlbmd0aD8iJCIrbi5qb2luKCIiKToiJCIpLGV9LGUucHJvdG90eXBlLmFkZFRvU3RhY2s9ZnVuY3Rpb24odCxlLHIsbil7bGV0IGksbyxhPXRoaXMscz10O3RoaXMucmVwbGFjZXJGdW5jdGlvbiYmKHM9dGhpcy5yZXBsYWNlckZ1bmN0aW9uKGV8fHIscyx0aGlzKSkscyYmcy50b0pTT04gaW5zdGFuY2VvZiBGdW5jdGlvbiYmKHM9cy50b0pTT04oKSksKHMgaW5zdGFuY2VvZiBGdW5jdGlvbnx8InN5bWJvbCI9PXR5cGVvZiB0KSYmKHM9dm9pZCAwKSx2b2lkIDAhPT1lJiZ0aGlzLnJlcGxhY2VyQXJyYXkmJih0aGlzLnJlcGxhY2VyQXJyYXkuaW5jbHVkZXMoZSl8fChzPXZvaWQgMCkpO2xldCB1PXBvKHMpO2lmKChuJiZuLnR5cGU9PT1oby5BcnJheXx8dm9pZCAwIT09cykmJnUhPT1oby5Qcm9taXNlJiYobiYmIW4uZmlyc3QmJnRoaXMuX3B1c2goIiwiKSxuJiYobi5maXJzdD0hMSkpLHZvaWQgMCE9PXMmJnUhPT1oby5Qcm9taXNlJiZlJiYodGhpcy5nYXA/dGhpcy5fcHVzaCgiXG4iK3RoaXMuZ2FwLnJlcGVhdCh0aGlzLmRlcHRoKSsnIicrdm8oZSkrJyI6ICcpOnRoaXMuX3B1c2goJyInK3ZvKGUpKyciOicpKSx1IT09aG8uUHJpbWl0aXZlKWlmKHRoaXMuY3ljbGUpcz10aGlzLmN5Y2xlcihlfHxyLHMpLHU9cG8ocyk7ZWxzZXtpZih0aGlzLnZpc2l0ZWQuaGFzKHMpKXRocm93IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKCJDb252ZXJ0aW5nIGNpcmN1bGFyIHN0cnVjdHVyZSB0byBKU09OIikse3JlYWxWYWx1ZTpzLGtleTplfHxyfSk7dGhpcy52aXNpdGVkLmFkZChzKX0hZSYmcj4tMSYmdGhpcy5kZXB0aCYmdGhpcy5nYXAmJnRoaXMuX3B1c2goIlxuIit0aGlzLmdhcC5yZXBlYXQodGhpcy5kZXB0aCkpO2xldCBmPWdvW3VdO2YmJnRoaXMuX3B1c2goZik7bGV0IGg9e2tleTplLGluZGV4OnIsdHlwZTp1LHBhcmVudDpuLHZhbHVlOnMsZmlyc3Q6ITB9O3JldHVybiB1PT09aG8uT2JqZWN0Pyh0aGlzLmRlcHRoKz0xLGgudW5yZWFkPU9iamVjdC5rZXlzKHMpLGguaXNFbXB0eT0haC51bnJlYWQubGVuZ3RoKTp1PT09aG8uQXJyYXk/KHRoaXMuZGVwdGgrPTEsaC51bnJlYWQ9cy5sZW5ndGgsaC5hcnJheUxlbmd0aD1oLnVucmVhZCxoLmlzRW1wdHk9IWgudW5yZWFkKTp1IT09aG8uUmVhZGFibGVTdHJpbmcmJnUhPT1oby5SZWFkYWJsZU9iamVjdHx8KHRoaXMuZGVwdGgrPTEscy5yZWFkYWJsZUVuZGVkfHwobnVsbD09PShpPXMuX3JlYWRhYmxlU3RhdGUpfHx2b2lkIDA9PT1pP3ZvaWQgMDppLmVuZEVtaXR0ZWQpP3RoaXMuZW1pdCgiZXJyb3IiLG5ldyBFcnJvcigiUmVhZGFibGUgU3RyZWFtIGhhcyBlbmRlZCBiZWZvcmUgaXQgd2FzIHNlcmlhbGl6ZWQuIEFsbCBzdHJlYW0gZGF0YSBoYXZlIGJlZW4gbG9zdCIpLHMsZXx8cik6KHMucmVhZGFibGVGbG93aW5nfHwobnVsbD09PShvPXMuX3JlYWRhYmxlU3RhdGUpfHx2b2lkIDA9PT1vP3ZvaWQgMDpvLmZsb3dpbmcpKSYmKHMucGF1c2UoKSx0aGlzLmVtaXQoImVycm9yIixuZXcgRXJyb3IoIlJlYWRhYmxlIFN0cmVhbSBpcyBpbiBmbG93aW5nIG1vZGUsIGRhdGEgbWF5IGhhdmUgYmVlbiBsb3N0LiBUcnlpbmcgdG8gcGF1c2Ugc3RyZWFtLiIpLHMsZXx8cikpLGgucmVhZENvdW50PTAscy5vbmNlKCJlbmQiLChmdW5jdGlvbigpe2guZW5kPSEwLGEuX19yZWFkKCl9KSkscy5vbmNlKCJlcnJvciIsKGZ1bmN0aW9uKHQpe2EuZXJyb3I9ITAsYS5lbWl0KCJlcnJvciIsdCl9KSkpLHRoaXMuc3RhY2sudW5zaGlmdChoKSxofSxlLnByb3RvdHlwZS5yZW1vdmVGcm9tU3RhY2s9ZnVuY3Rpb24odCl7bGV0IGU9dC50eXBlLHI9ZT09PWhvLk9iamVjdHx8ZT09PWhvLkFycmF5fHxlPT09aG8uUmVhZGFibGVTdHJpbmd8fGU9PT1oby5SZWFkYWJsZU9iamVjdDtlIT09aG8uUHJpbWl0aXZlJiYodGhpcy5jeWNsZXx8dGhpcy52aXNpdGVkLmRlbGV0ZSh0LnZhbHVlKSxyJiYodGhpcy5kZXB0aC09MSkpO2xldCBuPXlvW2VdO3ImJiF0LmlzRW1wdHkmJnRoaXMuZ2FwJiZ0aGlzLl9wdXNoKCJcbiIrdGhpcy5nYXAucmVwZWF0KHRoaXMuZGVwdGgpKSxuJiZ0aGlzLl9wdXNoKG4pO2xldCBpPXRoaXMuc3RhY2suaW5kZXhPZih0KTt0aGlzLnN0YWNrLnNwbGljZShpLDEpfSxlLnByb3RvdHlwZS5fcHVzaD1mdW5jdGlvbih0KXt0aGlzLnB1c2hDYWxsZWQ9ITAsdGhpcy5wdXNoKHQpfSxlLnByb3RvdHlwZS5wcm9jZXNzUmVhZGFibGVPYmplY3Q9ZnVuY3Rpb24odCxlKXtsZXQgcj10aGlzO2lmKCF0LmVuZClyZXR1cm4gbW8odC52YWx1ZSxlKS50aGVuKChmdW5jdGlvbihlKXtudWxsIT09ZSYmKHQuZmlyc3R8fHIuX3B1c2goIiwiKSx0LmZpcnN0PSExLHIuYWRkVG9TdGFjayhlLHZvaWQgMCx0LnJlYWRDb3VudCksdC5yZWFkQ291bnQrPTEpfSkpO3RoaXMucmVtb3ZlRnJvbVN0YWNrKHQpfSxlLnByb3RvdHlwZS5wcm9jZXNzT2JqZWN0PWZ1bmN0aW9uKHQpe2lmKCF0LnVucmVhZC5sZW5ndGgpcmV0dXJuIHZvaWQgdGhpcy5yZW1vdmVGcm9tU3RhY2sodCk7bGV0IGU9dC51bnJlYWQuc2hpZnQoKSxyPXQudmFsdWVbZV07dGhpcy5hZGRUb1N0YWNrKHIsZSx2b2lkIDAsdCl9LGUucHJvdG90eXBlLnByb2Nlc3NBcnJheT1mdW5jdGlvbih0KXtsZXQgZT10LnVucmVhZDtpZighZSlyZXR1cm4gdm9pZCB0aGlzLnJlbW92ZUZyb21TdGFjayh0KTtsZXQgcj10LmFycmF5TGVuZ3RoLWUsbj10LnZhbHVlW3JdO3QudW5yZWFkLT0xLHRoaXMuYWRkVG9TdGFjayhuLHZvaWQgMCxyLHQpfSxlLnByb3RvdHlwZS5wcm9jZXNzUHJpbWl0aXZlPWZ1bmN0aW9uKHQpe2lmKHZvaWQgMCE9PXQudmFsdWUpe2xldCBlLHI9dHlwZW9mIHQudmFsdWU7c3dpdGNoKHIpe2Nhc2Uic3RyaW5nIjplPXdvKHQudmFsdWUpO2JyZWFrO2Nhc2UibnVtYmVyIjplPU51bWJlci5pc0Zpbml0ZSh0LnZhbHVlKT9TdHJpbmcodC52YWx1ZSk6Im51bGwiO2JyZWFrO2Nhc2UiYm9vbGVhbiI6ZT1TdHJpbmcodC52YWx1ZSk7YnJlYWs7Y2FzZSJvYmplY3QiOnQudmFsdWV8fChlPSJudWxsIik7YnJlYWs7ZGVmYXVsdDp0aHJvdyBPYmplY3QuYXNzaWduKG5ldyBFcnJvcignVW5rbm93biB0eXBlICInK3IrJyIuIFBsZWFzZSBmaWxlIGFuIGlzc3VlIScpLHt2YWx1ZTp0LnZhbHVlfSl9dGhpcy5fcHVzaChlKX1lbHNlIXRoaXMuc3RhY2tbMV18fHRoaXMuc3RhY2tbMV0udHlwZSE9PWhvLkFycmF5JiZ0aGlzLnN0YWNrWzFdLnR5cGUhPT1oby5SZWFkYWJsZU9iamVjdD90LmFkZFNlcGFyYXRvckFmdGVyRW5kPSExOnRoaXMuX3B1c2goIm51bGwiKTt0aGlzLnJlbW92ZUZyb21TdGFjayh0KX0sZS5wcm90b3R5cGUucHJvY2Vzc1JlYWRhYmxlU3RyaW5nPWZ1bmN0aW9uKHQsZSl7bGV0IHI9dGhpcztpZighdC5lbmQpcmV0dXJuIG1vKHQudmFsdWUsZSkudGhlbigoZnVuY3Rpb24odCl7dCYmci5fcHVzaCh2byh0LnRvU3RyaW5nKCkpKX0pKTt0aGlzLnJlbW92ZUZyb21TdGFjayh0KX0sZS5wcm90b3R5cGUucHJvY2Vzc1Byb21pc2U9ZnVuY3Rpb24odCl7bGV0IGU9dGhpcztyZXR1cm4gX28odC52YWx1ZSkudGhlbigoZnVuY3Rpb24ocil7ZS5yZW1vdmVGcm9tU3RhY2sodCksZS5hZGRUb1N0YWNrKHIsdC5rZXksdC5pbmRleCx0LnBhcmVudCl9KSl9LGUucHJvdG90eXBlLnByb2Nlc3NTdGFja1RvcEl0ZW09ZnVuY3Rpb24odCl7bGV0IGUscj10aGlzLG49dGhpcy5zdGFja1swXTtpZighbnx8dGhpcy5lcnJvcilyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7dHJ5e2U9dGhpc1tib1tuLnR5cGVdXShuLHQpfWNhdGNoKHQpe3JldHVybiBQcm9taXNlLnJlamVjdCh0KX1yZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGUpLnRoZW4oKGZ1bmN0aW9uKCl7MD09PXIuc3RhY2subGVuZ3RoJiYoci5lbmQ9ITAsci5fcHVzaChudWxsKSl9KSl9LGUucHJvdG90eXBlLl9fcmVhZD1mdW5jdGlvbih0KXtsZXQgZT10aGlzO2lmKCF0aGlzLmlzUmVhZGluZyYmIXRoaXMuZXJyb3IpcmV0dXJuIHRoaXMuaXNSZWFkaW5nPSEwLHRoaXMucmVhZE1vcmU9ITEsdGhpcy5wcm9jZXNzU3RhY2tUb3BJdGVtKHQpLnRoZW4oKGZ1bmN0aW9uKCl7IWUuZW5kJiYhZS5lcnJvciYmKGUucmVhZE1vcmV8fCFlLnB1c2hDYWxsZWQpP2JuKChmdW5jdGlvbigpe2UuaXNSZWFkaW5nPSExLGUuX19yZWFkKCl9KSk6ZS5pc1JlYWRpbmc9ITF9KSkuY2F0Y2goKGZ1bmN0aW9uKHQpe2UuZXJyb3I9ITAsZS5lbWl0KCJlcnJvciIsdCl9KSk7dGhpcy5yZWFkTW9yZT0hMH0sZS5wcm90b3R5cGUuX3JlYWQ9ZnVuY3Rpb24odCl7dGhpcy5wdXNoQ2FsbGVkPSExLHRoaXMuX19yZWFkKHQpfSxlLnByb3RvdHlwZS5wYXRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhY2subWFwKChmdW5jdGlvbih0KXtsZXQgZT10LmtleSxyPXQuaW5kZXg7cmV0dXJuIGV8fHJ9KSkuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gdHx8dD4tMX0pKS5yZXZlcnNlKCl9LGV9KGppKTt2YXIgRW89QXJyYXkuaXNBcnJheSxrbz0ib2JqZWN0Ij09dHlwZW9mIGomJmomJmouT2JqZWN0PT09T2JqZWN0JiZqLFJvPSJvYmplY3QiPT10eXBlb2Ygc2VsZiYmc2VsZiYmc2VsZi5PYmplY3Q9PT1PYmplY3QmJnNlbGYsam89a298fFJvfHxGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpLFRvPWpvLlN5bWJvbCxPbz1PYmplY3QucHJvdG90eXBlLEFvPU9vLmhhc093blByb3BlcnR5LENvPU9vLnRvU3RyaW5nLE1vPVRvP1RvLnRvU3RyaW5nVGFnOnZvaWQgMDt2YXIgeG89ZnVuY3Rpb24odCl7dmFyIGU9QW8uY2FsbCh0LE1vKSxyPXRbTW9dO3RyeXt0W01vXT12b2lkIDA7dmFyIG49ITB9Y2F0Y2godCl7fXZhciBpPUNvLmNhbGwodCk7cmV0dXJuIG4mJihlP3RbTW9dPXI6ZGVsZXRlIHRbTW9dKSxpfSxMbz1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO3ZhciBCbz1mdW5jdGlvbih0KXtyZXR1cm4gTG8uY2FsbCh0KX0sUG89VG8/VG8udG9TdHJpbmdUYWc6dm9pZCAwO3ZhciBVbz1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD92b2lkIDA9PT10PyJbb2JqZWN0IFVuZGVmaW5lZF0iOiJbb2JqZWN0IE51bGxdIjpQbyYmUG8gaW4gT2JqZWN0KHQpP3hvKHQpOkJvKHQpfTt2YXIgTm89ZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPXQmJiJvYmplY3QiPT10eXBlb2YgdH07dmFyIERvPWZ1bmN0aW9uKHQpe3JldHVybiJzeW1ib2wiPT10eXBlb2YgdHx8Tm8odCkmJiJbb2JqZWN0IFN5bWJvbF0iPT1Vbyh0KX0sSW89L1wufFxbKD86W15bXF1dKnwoWyInXSkoPzooPyFcMSlbXlxcXXxcXC4pKj9cMSlcXS8scW89L15cdyokLzt2YXIgRm89ZnVuY3Rpb24odCxlKXtpZihFbyh0KSlyZXR1cm4hMTt2YXIgcj10eXBlb2YgdDtyZXR1cm4hKCJudW1iZXIiIT1yJiYic3ltYm9sIiE9ciYmImJvb2xlYW4iIT1yJiZudWxsIT10JiYhRG8odCkpfHwocW8udGVzdCh0KXx8IUlvLnRlc3QodCl8fG51bGwhPWUmJnQgaW4gT2JqZWN0KGUpKX07dmFyIFdvPWZ1bmN0aW9uKHQpe3ZhciBlPXR5cGVvZiB0O3JldHVybiBudWxsIT10JiYoIm9iamVjdCI9PWV8fCJmdW5jdGlvbiI9PWUpfTt2YXIgem8sWW89ZnVuY3Rpb24odCl7aWYoIVdvKHQpKXJldHVybiExO3ZhciBlPVVvKHQpO3JldHVybiJbb2JqZWN0IEZ1bmN0aW9uXSI9PWV8fCJbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSI9PWV8fCJbb2JqZWN0IEFzeW5jRnVuY3Rpb25dIj09ZXx8IltvYmplY3QgUHJveHldIj09ZX0sJG89am9bIl9fY29yZS1qc19zaGFyZWRfXyJdLEhvPSh6bz0vW14uXSskLy5leGVjKCRvJiYkby5rZXlzJiYkby5rZXlzLklFX1BST1RPfHwiIikpPyJTeW1ib2woc3JjKV8xLiIrem86IiI7dmFyIEpvPWZ1bmN0aW9uKHQpe3JldHVybiEhSG8mJkhvIGluIHR9LEdvPUZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZzt2YXIgVm89ZnVuY3Rpb24odCl7aWYobnVsbCE9dCl7dHJ5e3JldHVybiBHby5jYWxsKHQpfWNhdGNoKHQpe310cnl7cmV0dXJuIHQrIiJ9Y2F0Y2godCl7fX1yZXR1cm4iIn0sS289L15cW29iamVjdCAuKz9Db25zdHJ1Y3RvclxdJC8sWm89RnVuY3Rpb24ucHJvdG90eXBlLFhvPU9iamVjdC5wcm90b3R5cGUsUW89Wm8udG9TdHJpbmcsdGE9WG8uaGFzT3duUHJvcGVydHksZWE9UmVnRXhwKCJeIitRby5jYWxsKHRhKS5yZXBsYWNlKC9bXFxeJC4qKz8oKVtcXXt9fF0vZywiXFwkJiIpLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFwoKXwgZm9yIC4rPyg/PVxcXF0pL2csIiQxLio/IikrIiQiKTt2YXIgcmE9ZnVuY3Rpb24odCl7cmV0dXJuISghV28odCl8fEpvKHQpKSYmKFlvKHQpP2VhOktvKS50ZXN0KFZvKHQpKX07dmFyIG5hPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PXQ/dm9pZCAwOnRbZV19O3ZhciBpYT1mdW5jdGlvbih0LGUpe3ZhciByPW5hKHQsZSk7cmV0dXJuIHJhKHIpP3I6dm9pZCAwfSxvYT1pYShPYmplY3QsImNyZWF0ZSIpO3ZhciBhYT1mdW5jdGlvbigpe3RoaXMuX19kYXRhX189b2E/b2EobnVsbCk6e30sdGhpcy5zaXplPTB9O3ZhciBzYT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmhhcyh0KSYmZGVsZXRlIHRoaXMuX19kYXRhX19bdF07cmV0dXJuIHRoaXMuc2l6ZS09ZT8xOjAsZX0sdWE9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgZmE9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXztpZihvYSl7dmFyIHI9ZVt0XTtyZXR1cm4iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyI9PT1yP3ZvaWQgMDpyfXJldHVybiB1YS5jYWxsKGUsdCk/ZVt0XTp2b2lkIDB9LGhhPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIGxhPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX187cmV0dXJuIG9hP3ZvaWQgMCE9PWVbdF06aGEuY2FsbChlLHQpfTt2YXIgY2E9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLl9fZGF0YV9fO3JldHVybiB0aGlzLnNpemUrPXRoaXMuaGFzKHQpPzA6MSxyW3RdPW9hJiZ2b2lkIDA9PT1lPyJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIjplLHRoaXN9O2Z1bmN0aW9uIGRhKHQpe3ZhciBlPS0xLHI9bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPHI7KXt2YXIgbj10W2VdO3RoaXMuc2V0KG5bMF0sblsxXSl9fWRhLnByb3RvdHlwZS5jbGVhcj1hYSxkYS5wcm90b3R5cGUuZGVsZXRlPXNhLGRhLnByb3RvdHlwZS5nZXQ9ZmEsZGEucHJvdG90eXBlLmhhcz1sYSxkYS5wcm90b3R5cGUuc2V0PWNhO3ZhciBwYT1kYTt2YXIgZ2E9ZnVuY3Rpb24oKXt0aGlzLl9fZGF0YV9fPVtdLHRoaXMuc2l6ZT0wfTt2YXIgeWE9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD09PWV8fHQhPXQmJmUhPWV9O3ZhciBiYT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj10Lmxlbmd0aDtyLS07KWlmKHlhKHRbcl1bMF0sZSkpcmV0dXJuIHI7cmV0dXJuLTF9LHZhPUFycmF5LnByb3RvdHlwZS5zcGxpY2U7dmFyIHdhPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX18scj1iYShlLHQpO3JldHVybiEocjwwKSYmKHI9PWUubGVuZ3RoLTE/ZS5wb3AoKTp2YS5jYWxsKGUsciwxKSwtLXRoaXMuc2l6ZSwhMCl9O3ZhciBtYT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fLHI9YmEoZSx0KTtyZXR1cm4gcjwwP3ZvaWQgMDplW3JdWzFdfTt2YXIgX2E9ZnVuY3Rpb24odCl7cmV0dXJuIGJhKHRoaXMuX19kYXRhX18sdCk+LTF9O3ZhciBTYT1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuX19kYXRhX18sbj1iYShyLHQpO3JldHVybiBuPDA/KCsrdGhpcy5zaXplLHIucHVzaChbdCxlXSkpOnJbbl1bMV09ZSx0aGlzfTtmdW5jdGlvbiBFYSh0KXt2YXIgZT0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxyOyl7dmFyIG49dFtlXTt0aGlzLnNldChuWzBdLG5bMV0pfX1FYS5wcm90b3R5cGUuY2xlYXI9Z2EsRWEucHJvdG90eXBlLmRlbGV0ZT13YSxFYS5wcm90b3R5cGUuZ2V0PW1hLEVhLnByb3RvdHlwZS5oYXM9X2EsRWEucHJvdG90eXBlLnNldD1TYTt2YXIga2E9RWEsUmE9aWEoam8sIk1hcCIpO3ZhciBqYT1mdW5jdGlvbigpe3RoaXMuc2l6ZT0wLHRoaXMuX19kYXRhX189e2hhc2g6bmV3IHBhLG1hcDpuZXcoUmF8fGthKSxzdHJpbmc6bmV3IHBhfX07dmFyIFRhPWZ1bmN0aW9uKHQpe3ZhciBlPXR5cGVvZiB0O3JldHVybiJzdHJpbmciPT1lfHwibnVtYmVyIj09ZXx8InN5bWJvbCI9PWV8fCJib29sZWFuIj09ZT8iX19wcm90b19fIiE9PXQ6bnVsbD09PXR9O3ZhciBPYT1mdW5jdGlvbih0LGUpe3ZhciByPXQuX19kYXRhX187cmV0dXJuIFRhKGUpP3JbInN0cmluZyI9PXR5cGVvZiBlPyJzdHJpbmciOiJoYXNoIl06ci5tYXB9O3ZhciBBYT1mdW5jdGlvbih0KXt2YXIgZT1PYSh0aGlzLHQpLmRlbGV0ZSh0KTtyZXR1cm4gdGhpcy5zaXplLT1lPzE6MCxlfTt2YXIgQ2E9ZnVuY3Rpb24odCl7cmV0dXJuIE9hKHRoaXMsdCkuZ2V0KHQpfTt2YXIgTWE9ZnVuY3Rpb24odCl7cmV0dXJuIE9hKHRoaXMsdCkuaGFzKHQpfTt2YXIgeGE9ZnVuY3Rpb24odCxlKXt2YXIgcj1PYSh0aGlzLHQpLG49ci5zaXplO3JldHVybiByLnNldCh0LGUpLHRoaXMuc2l6ZSs9ci5zaXplPT1uPzA6MSx0aGlzfTtmdW5jdGlvbiBMYSh0KXt2YXIgZT0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxyOyl7dmFyIG49dFtlXTt0aGlzLnNldChuWzBdLG5bMV0pfX1MYS5wcm90b3R5cGUuY2xlYXI9amEsTGEucHJvdG90eXBlLmRlbGV0ZT1BYSxMYS5wcm90b3R5cGUuZ2V0PUNhLExhLnByb3RvdHlwZS5oYXM9TWEsTGEucHJvdG90eXBlLnNldD14YTt2YXIgQmE9TGE7ZnVuY3Rpb24gUGEodCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdHx8bnVsbCE9ZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiRXhwZWN0ZWQgYSBmdW5jdGlvbiIpO3ZhciByPWZ1bmN0aW9uKCl7dmFyIG49YXJndW1lbnRzLGk9ZT9lLmFwcGx5KHRoaXMsbik6blswXSxvPXIuY2FjaGU7aWYoby5oYXMoaSkpcmV0dXJuIG8uZ2V0KGkpO3ZhciBhPXQuYXBwbHkodGhpcyxuKTtyZXR1cm4gci5jYWNoZT1vLnNldChpLGEpfHxvLGF9O3JldHVybiByLmNhY2hlPW5ldyhQYS5DYWNoZXx8QmEpLHJ9UGEuQ2FjaGU9QmE7dmFyIFVhPVBhO3ZhciBOYT0vW14uW1xdXSt8XFsoPzooLT9cZCsoPzpcLlxkKyk/KXwoWyInXSkoKD86KD8hXDIpW15cXF18XFwuKSo/KVwyKVxdfCg/PSg/OlwufFxbXF0pKD86XC58XFtcXXwkKSkvZyxEYT0vXFwoXFwpPy9nLElhPWZ1bmN0aW9uKHQpe3ZhciBlPVVhKHQsKGZ1bmN0aW9uKHQpe3JldHVybiA1MDA9PT1yLnNpemUmJnIuY2xlYXIoKSx0fSkpLHI9ZS5jYWNoZTtyZXR1cm4gZX0oKGZ1bmN0aW9uKHQpe3ZhciBlPVtdO3JldHVybiA0Nj09PXQuY2hhckNvZGVBdCgwKSYmZS5wdXNoKCIiKSx0LnJlcGxhY2UoTmEsKGZ1bmN0aW9uKHQscixuLGkpe2UucHVzaChuP2kucmVwbGFjZShEYSwiJDEiKTpyfHx0KX0pKSxlfSkpO3ZhciBxYT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aCxpPUFycmF5KG4pOysrcjxuOylpW3JdPWUodFtyXSxyLHQpO3JldHVybiBpfSxGYT1Ubz9Uby5wcm90b3R5cGU6dm9pZCAwLFdhPUZhP0ZhLnRvU3RyaW5nOnZvaWQgMDt2YXIgemE9ZnVuY3Rpb24gdChlKXtpZigic3RyaW5nIj09dHlwZW9mIGUpcmV0dXJuIGU7aWYoRW8oZSkpcmV0dXJuIHFhKGUsdCkrIiI7aWYoRG8oZSkpcmV0dXJuIFdhP1dhLmNhbGwoZSk6IiI7dmFyIHI9ZSsiIjtyZXR1cm4iMCI9PXImJjEvZT09LUluZmluaXR5PyItMCI6cn07dmFyIFlhPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10PyIiOnphKHQpfTt2YXIgJGE9ZnVuY3Rpb24odCxlKXtyZXR1cm4gRW8odCk/dDpGbyh0LGUpP1t0XTpJYShZYSh0KSl9O3ZhciBIYT1mdW5jdGlvbih0KXtpZigic3RyaW5nIj09dHlwZW9mIHR8fERvKHQpKXJldHVybiB0O3ZhciBlPXQrIiI7cmV0dXJuIjAiPT1lJiYxL3Q9PS1JbmZpbml0eT8iLTAiOmV9O3ZhciBKYT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0wLG49KGU9JGEoZSx0KSkubGVuZ3RoO251bGwhPXQmJnI8bjspdD10W0hhKGVbcisrXSldO3JldHVybiByJiZyPT1uP3Q6dm9pZCAwfTt2YXIgR2E9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPW51bGw9PXQ/dm9pZCAwOkphKHQsZSk7cmV0dXJuIHZvaWQgMD09PW4/cjpufTt2YXIgVmE9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0fHxObyh0KSYmIltvYmplY3QgTnVtYmVyXSI9PVVvKHQpfTtmdW5jdGlvbiBLYSh0KXtyZXR1cm4iW29iamVjdCBTdHJpbmddIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBaYSh0KXtyZXR1cm4hKCFLYSh0KXx8IiI9PT10KX1mdW5jdGlvbiBYYSh0KXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIFFhKHQpe3JldHVybiJbb2JqZWN0IFVuZGVmaW5lZF0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIHRzKHQpe3JldHVybiJbb2JqZWN0IE9iamVjdF0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIGVzKHQpe3JldHVybiEoIUthKHQpfHwiIiE9PXQpfWZ1bmN0aW9uIHJzKHQpe3JldHVybiEhUWEodCl8fCghIWZ1bmN0aW9uKHQpe3JldHVybiJbb2JqZWN0IE51bGxdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX0odCl8fCghIWZ1bmN0aW9uKHQpe2lmKHRzKHQpKXtmb3IobGV0IGUgaW4gdClyZXR1cm4hMTtyZXR1cm4hMH1yZXR1cm4hMX0odCl8fCghIWVzKHQpfHwhIWZ1bmN0aW9uKHQpe3JldHVybiEhWGEodCkmJjA9PT10Lmxlbmd0aH0odCkpKSl9ZnVuY3Rpb24gbnMoKXtsZXQgdCxlLHI9bmV3IFByb21pc2UoKGZ1bmN0aW9uKCl7dD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV19KSk7cmV0dXJuIHIucmVzb2x2ZT10LHIucmVqZWN0PWUscn1sZXQgV0pzb25TdHJlYW09e3BhcnNlOmFzeW5jIGZ1bmN0aW9uKHQpe2lmKCFaYSh0KSlyZXR1cm57fTtsZXQgZT17fTt0cnl7ZT1KU09OLnBhcnNlKHQpfWNhdGNoKHQpe2U9e319cmV0dXJuIGV9LHBhcnNlQnlTdHJlYW06ZnVuY3Rpb24odCl7bGV0IGU9e307aWYoIm51bGwiPT09dClyZXR1cm4gbnVsbDtpZigiIj09PXQpcmV0dXJue307bGV0IHI9Il9fc3lzdGVtX18iLG49YHsiX19zeXN0ZW1fXyI6JHt0fX1gLGk9bnMoKSxvPVJuKG4pLGE9dW8ucGFyc2UoIiQqIik7cmV0dXJuIGEub24oImRhdGEiLChmdW5jdGlvbih0KXtlW3Qua2V5XT10LnZhbHVlfSkpLGEub24oImVuZCIsKGZ1bmN0aW9uKCl7bGV0IHQ9R2EoZSxyKTtpLnJlc29sdmUodCl9KSksYS5vbigiZXJyb3IiLChmdW5jdGlvbih0KXtpLnJlamVjdCh0KX0pKSxvLnBpcGUoYSksaX0sY3JlYXRlUGFyc2VTdHJlYW06ZnVuY3Rpb24odCl7cmV0dXJuIFphKHQpfHxmdW5jdGlvbih0KXtyZXR1cm4hKCFYYSh0KXx8MD09PXQubGVuZ3RofHwxPT09dC5sZW5ndGgmJnJzKHRbMF0pKX0odCl8fCh0PSIkKiIpLHVvLnBhcnNlKHQpfSxzdHJpbmdpZnk6YXN5bmMgZnVuY3Rpb24odCl7aWYoUWEodCkpcmV0dXJuIiI7bGV0IGU9IiI7dHJ5e2U9SlNPTi5zdHJpbmdpZnkodCl9Y2F0Y2godCl7ZT0iIn1yZXR1cm4gZX0sc3RyaW5naWZ5QnlTdHJlYW06ZnVuY3Rpb24odCl7bGV0IGU9IiI7aWYoUWEodCkpcmV0dXJuIiI7aWYobnVsbD09PXQpcmV0dXJuIm51bGwiO2lmKGVzKHQpKXJldHVybiciIic7aWYoVmEodCkpcmV0dXJuYCR7dH1gO2lmKEthKHQpKXJldHVybmAiJHt0fSJgO2xldCByPW5zKCksbj1uZXcgU28odCxudWxsLG51bGwsITEpO3JldHVybiBuLm9uKCJkYXRhIiwoZnVuY3Rpb24odCl7ZSs9dH0pKSxuLm9uKCJlbmQiLChmdW5jdGlvbigpe3IucmVzb2x2ZShlKX0pKSxuLm9uKCJlcnJvciIsKGZ1bmN0aW9uKHQpe3IucmVqZWN0KHQpfSkpLHJ9LGNyZWF0ZVN0cmluZ2lmeVN0cmVhbTpmdW5jdGlvbih0KXtpZighdHModCkmJiFYYSh0KSl0aHJvdyBuZXcgRXJyb3IoImRhdGEgaXMgbm90IG9iamVjdCBvciBhcnJheSIpO3JldHVybiBuZXcgU28odCxudWxsLG51bGwsITEpfX07CgpsZXQgaW5zdGFuY2UgPSBudWxsCmZ1bmN0aW9uIGluaXQoaW5wdXQpewoKICAgIC8vaW5pdAogICAgbGV0IHIKICAgIAogICAgICAgIHIgPSBXSnNvblN0cmVhbSguLi5pbnB1dCkKICAgICAgICAKCiAgICAvL29uCiAgICAKCiAgICAvL3NhdmUKICAgIGluc3RhbmNlID0gcgoKfQoKZnVuY3Rpb24gc2VuZE1lc3NhZ2UoZGF0YSkgewogICAgCiAgICAgICAgcGFyZW50UG9ydC5wb3N0TWVzc2FnZShkYXRhKQogICAgICAgIAp9Cgphc3luYyBmdW5jdGlvbiBydW4oZGF0YSkgewogICAgLy8gY29uc29sZS5sb2coJ2lubmVyIHdvcmtlciBydW4nLGRhdGEpCgogICAgLy9tb2RlCiAgICBsZXQgbW9kZSA9IGRhdGEubW9kZQoKICAgIC8vY2hlY2sKICAgIGlmKG1vZGUgIT09ICdpbml0JyAmJiBtb2RlICE9PSAnY2FsbCcpewogICAgICAgIHJldHVybgogICAgfQoKICAgIC8vaW5pdAogICAgaWYobW9kZSA9PT0gJ2luaXQnKXsKICAgICAgICAKICAgICAgICB0cnl7CgogICAgICAgICAgICAvL3R5cGUKICAgICAgICAgICAgbGV0IHR5cGUgPSBkYXRhLnR5cGUKCiAgICAgICAgICAgIC8vaW5wdXQKICAgICAgICAgICAgbGV0IGlucHV0ID0gZGF0YS5pbnB1dAogICAgCiAgICAgICAgICAgIC8vaW5zdGFuY2UKICAgICAgICAgICAgaWYodHlwZSA9PT0gJ2Z1bmN0aW9uJyl7CiAgICAgICAgICAgICAgICBpbml0KC4uLmlucHV0KQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYodHlwZSA9PT0gJ29iamVjdCcpewogICAgICAgICAgICAgICAgaW5zdGFuY2UgPSBXSnNvblN0cmVhbQogICAgICAgICAgICB9CgogICAgICAgIH0KICAgICAgICBjYXRjaChlcnIpewogICAgICAgIAogICAgICAgICAgICAvL3NlbmRNZXNzYWdlCiAgICAgICAgICAgIGxldCByZXMgPSB7CiAgICAgICAgICAgICAgICBtb2RlOiAnZW1pdCcsCiAgICAgICAgICAgICAgICBldk5hbWU6ICdlcnJvcicsCiAgICAgICAgICAgICAgICBtc2c6IGVyciwKICAgICAgICAgICAgfQogICAgICAgICAgICBzZW5kTWVzc2FnZShyZXMpCgogICAgICAgIH0KICAgICAgICAgICAgCiAgICB9CgogICAgLy9jaGVjawogICAgaWYobW9kZSA9PT0gJ2NhbGwnKXsKICAgICAgICBsZXQgc3RhdGUgPSAnJwogICAgICAgIGxldCBtc2cgPSBudWxsCgogICAgICAgIHRyeXsKCiAgICAgICAgICAgIC8vZnVuCiAgICAgICAgICAgIGxldCBmdW4gPSBpbnN0YW5jZVtkYXRhLmZ1bl0KCiAgICAgICAgICAgIC8vaW5wdXQKICAgICAgICAgICAgbGV0IGlucHV0ID0gZGF0YS5pbnB1dAoKICAgICAgICAgICAgLy9leGVjCiAgICAgICAgICAgIGF3YWl0IGZ1biguLi5pbnB1dCkKICAgICAgICAgICAgICAgIC50aGVuKChzdWMpID0+IHsKICAgICAgICAgICAgICAgICAgICBzdGF0ZT0nc3VjY2VzcycKICAgICAgICAgICAgICAgICAgICBtc2c9c3VjCiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgLmNhdGNoKChlcnIpID0+IHsKICAgICAgICAgICAgICAgICAgICBzdGF0ZT0nZXJyb3InCiAgICAgICAgICAgICAgICAgICAgbXNnPWVycgogICAgICAgICAgICAgICAgfSkKCiAgICAgICAgfQogICAgICAgIGNhdGNoKGVycil7CiAgICAgICAgICAgIHN0YXRlID0gJ2Vycm9yJwogICAgICAgICAgICBtc2cgPSBlcnIKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy9zZW5kTWVzc2FnZQogICAgICAgIGxldCByZXMgPSB7CiAgICAgICAgICAgIG1vZGU6ICdyZXR1cm4nLAogICAgICAgICAgICBpZDogZGF0YS5pZCwKICAgICAgICAgICAgZnVuOiBkYXRhLmZ1biwKICAgICAgICAgICAgc3RhdGUsCiAgICAgICAgICAgIG1zZywKICAgICAgICB9CiAgICAgICAgc2VuZE1lc3NhZ2UocmVzKQoKICAgIH0KCn0KCmZ1bmN0aW9uIHJlY3ZNZXNzYWdlKGRhdGEpIHsKICAgIC8vIGNvbnNvbGUubG9nKCdpbm5lciB3b3JrZXIgcmVjdjonLCBkYXRhKQoKICAgIC8vZGF0YVJlY3YKICAgIGxldCBkYXRhUmVjdiA9IGRhdGEKCiAgICAvL3J1bgogICAgcnVuKGRhdGFSZWN2KQoKfQoKCiAgICAgICAgcGFyZW50UG9ydC5vbignbWVzc2FnZScsIHJlY3ZNZXNzYWdlKQogICAgICAgIAoK",Buffer.from(G,"base64").toString("utf8"));function p(){var d=Z();function c(Z){try{return new l.Worker(Z,{eval:!0})}catch(l){V(l)}}var G=c(X);if(!G)return V("invalid worker"),null;function W(){G?(G.terminate(),G=void 0):V("worker has been terminated")}function u(){var l={mode:"init",type:"object",input:Array.prototype.slice.call(arguments)};G.postMessage(l)}function i(){var l=m(),Z=b(),c={mode:"call",id:Z,fun:"stringify",input:Array.prototype.slice.call(arguments)};return G.postMessage(c),d.once(Z,(function(Z){"success"===Z.state?l.resolve(Z.msg):l.reject(Z.msg)})),l}function p(){var l=m(),Z=b(),c={mode:"call",id:Z,fun:"parse",input:Array.prototype.slice.call(arguments)};return G.postMessage(c),d.once(Z,(function(Z){"success"===Z.state?l.resolve(Z.msg):l.reject(Z.msg)})),l}function y(l){var Z=l,m=Z.mode;"emit"!==m&&"return"!==m||("emit"===m&&d.emit(Z.evName,Z.msg),"return"===m&&d.emit(Z.id,Z))}function V(l){d.emit("error",l)}return G.on("message",y),G.on("error",V),u(Array.prototype.slice.call(arguments)),d.stringify=i,d.parse=p,d.terminate=W,d}var y,V,I={stringify:(V=c(u.mark((function l(){var Z,m,b,c=arguments;return u.wrap((function(l){for(;;)switch(l.prev=l.next){case 0:return Z=Array.prototype.slice.call(c),m=p(),l.next=4,m.stringify.apply(m,d(Z)).finally((function(){m.terminate()}));case 4:return b=l.sent,l.abrupt("return",b);case 6:case"end":return l.stop()}}),l)}))),function(){return V.apply(this,arguments)}),parse:(y=c(u.mark((function l(){var Z,m,b,c=arguments;return u.wrap((function(l){for(;;)switch(l.prev=l.next){case 0:return Z=Array.prototype.slice.call(c),m=p(),l.next=4,m.parse.apply(m,d(Z)).finally((function(){m.terminate()}));case 4:return b=l.sent,l.abrupt("return",b);case 6:case"end":return l.stop()}}),l)}))),function(){return y.apply(this,arguments)})};for(var h in W=Z(),I){var a=I[h];W[h]=a}}(),W}(d.default)})),X=c((function(l,Z){l.exports=function(){function l(l,Z){(null==Z||Z>l.length)&&(Z=l.length);for(var d=0,m=new Array(Z);d<Z;d++)m[d]=l[d];return m}function Z(Z){return function(Z){if(Array.isArray(Z))return l(Z)}(Z)||function(l){if("undefined"!=typeof Symbol&&null!=l[Symbol.iterator]||null!=l["@@iterator"])return Array.from(l)}(Z)||function(Z,d){if(Z){if("string"==typeof Z)return l(Z,d);var m=Object.prototype.toString.call(Z).slice(8,-1);return"Object"===m&&Z.constructor&&(m=Z.constructor.name),"Map"===m||"Set"===m?Array.from(Z):"Arguments"===m||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(m)?l(Z,d):void 0}}(Z)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function d(l,Z,d,m,b,c,G){try{var X=l[c](G),W=X.value}catch(l){return void d(l)}X.done?Z(W):Promise.resolve(W).then(m,b)}function c(l){return function(){var Z=this,m=arguments;return new Promise((function(b,c){var G=l.apply(Z,m);function X(l){d(G,b,c,X,W,"next",l)}function W(l){d(G,b,c,X,W,"throw",l)}X(void 0)}))}}function G(l){return(G="function"==typeof Symbol&&"symbol"==m(Symbol.iterator)?function(l){return m(l)}:function(l){return l&&"function"==typeof Symbol&&l.constructor===Symbol&&l!==Symbol.prototype?"symbol":m(l)})(l)}var X="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:void 0!==b?b:"undefined"!=typeof self?self:{};function W(l){var Z={exports:{}};return l(Z,Z.exports),Z.exports}var u,i=W((function(l){var Z=function(l){var Z,d=Object.prototype,m=d.hasOwnProperty,b="function"==typeof Symbol?Symbol:{},c=b.iterator||"@@iterator",X=b.asyncIterator||"@@asyncIterator",W=b.toStringTag||"@@toStringTag";function u(l,Z,d){return Object.defineProperty(l,Z,{value:d,enumerable:!0,configurable:!0,writable:!0}),l[Z]}try{u({},"")}catch(l){u=function(l,Z,d){return l[Z]=d}}function i(l,Z,d,m){var b=Z&&Z.prototype instanceof Y?Z:Y,c=Object.create(b.prototype),G=new t(m||[]);return c._invoke=function(l,Z,d){var m=y;return function(b,c){if(m===I)throw new Error("Generator is already running");if(m===h){if("throw"===b)throw c;return N()}for(d.method=b,d.arg=c;;){var G=d.delegate;if(G){var X=S(G,d);if(X){if(X===a)continue;return X}}if("next"===d.method)d.sent=d._sent=d.arg;else if("throw"===d.method){if(m===y)throw m=h,d.arg;d.dispatchException(d.arg)}else"return"===d.method&&d.abrupt("return",d.arg);m=I;var W=p(l,Z,d);if("normal"===W.type){if(m=d.done?h:V,W.arg===a)continue;return{value:W.arg,done:d.done}}"throw"===W.type&&(m=h,d.method="throw",d.arg=W.arg)}}}(l,d,G),c}function p(l,Z,d){try{return{type:"normal",arg:l.call(Z,d)}}catch(l){return{type:"throw",arg:l}}}l.wrap=i;var y="suspendedStart",V="suspendedYield",I="executing",h="completed",a={};function Y(){}function R(){}function o(){}var n={};n[c]=function(){return this};var K=Object.getPrototypeOf,L=K&&K(K(T([])));L&&L!==d&&m.call(L,c)&&(n=L);var J=o.prototype=Y.prototype=Object.create(n);function s(l){["next","throw","return"].forEach((function(Z){u(l,Z,(function(l){return this._invoke(Z,l)}))}))}function H(l,Z){function d(b,c,X,W){var u=p(l[b],l,c);if("throw"!==u.type){var i=u.arg,y=i.value;return y&&"object"===G(y)&&m.call(y,"__await")?Z.resolve(y.__await).then((function(l){d("next",l,X,W)}),(function(l){d("throw",l,X,W)})):Z.resolve(y).then((function(l){i.value=l,X(i)}),(function(l){return d("throw",l,X,W)}))}W(u.arg)}var b;this._invoke=function(l,m){function c(){return new Z((function(Z,b){d(l,m,Z,b)}))}return b=b?b.then(c,c):c()}}function S(l,d){var m=l.iterator[d.method];if(m===Z){if(d.delegate=null,"throw"===d.method){if(l.iterator.return&&(d.method="return",d.arg=Z,S(l,d),"throw"===d.method))return a;d.method="throw",d.arg=new TypeError("The iterator does not provide a 'throw' method")}return a}var b=p(m,l.iterator,d.arg);if("throw"===b.type)return d.method="throw",d.arg=b.arg,d.delegate=null,a;var c=b.arg;return c?c.done?(d[l.resultName]=c.value,d.next=l.nextLoc,"return"!==d.method&&(d.method="next",d.arg=Z),d.delegate=null,a):c:(d.method="throw",d.arg=new TypeError("iterator result is not an object"),d.delegate=null,a)}function x(l){var Z={tryLoc:l[0]};1 in l&&(Z.catchLoc=l[1]),2 in l&&(Z.finallyLoc=l[2],Z.afterLoc=l[3]),this.tryEntries.push(Z)}function C(l){var Z=l.completion||{};Z.type="normal",delete Z.arg,l.completion=Z}function t(l){this.tryEntries=[{tryLoc:"root"}],l.forEach(x,this),this.reset(!0)}function T(l){if(l){var d=l[c];if(d)return d.call(l);if("function"==typeof l.next)return l;if(!isNaN(l.length)){var b=-1,G=function d(){for(;++b<l.length;)if(m.call(l,b))return d.value=l[b],d.done=!1,d;return d.value=Z,d.done=!0,d};return G.next=G}}return{next:N}}function N(){return{value:Z,done:!0}}return R.prototype=J.constructor=o,o.constructor=R,R.displayName=u(o,W,"GeneratorFunction"),l.isGeneratorFunction=function(l){var Z="function"==typeof l&&l.constructor;return!!Z&&(Z===R||"GeneratorFunction"===(Z.displayName||Z.name))},l.mark=function(l){return Object.setPrototypeOf?Object.setPrototypeOf(l,o):(l.__proto__=o,u(l,W,"GeneratorFunction")),l.prototype=Object.create(J),l},l.awrap=function(l){return{__await:l}},s(H.prototype),H.prototype[X]=function(){return this},l.AsyncIterator=H,l.async=function(Z,d,m,b,c){void 0===c&&(c=Promise);var G=new H(i(Z,d,m,b),c);return l.isGeneratorFunction(d)?G:G.next().then((function(l){return l.done?l.value:G.next()}))},s(J),u(J,W,"Generator"),J[c]=function(){return this},J.toString=function(){return"[object Generator]"},l.keys=function(l){var Z=[];for(var d in l)Z.push(d);return Z.reverse(),function d(){for(;Z.length;){var m=Z.pop();if(m in l)return d.value=m,d.done=!1,d}return d.done=!0,d}},l.values=T,t.prototype={constructor:t,reset:function(l){if(this.prev=0,this.next=0,this.sent=this._sent=Z,this.done=!1,this.delegate=null,this.method="next",this.arg=Z,this.tryEntries.forEach(C),!l)for(var d in this)"t"===d.charAt(0)&&m.call(this,d)&&!isNaN(+d.slice(1))&&(this[d]=Z)},stop:function(){this.done=!0;var l=this.tryEntries[0].completion;if("throw"===l.type)throw l.arg;return this.rval},dispatchException:function(l){if(this.done)throw l;var d=this;function b(m,b){return X.type="throw",X.arg=l,d.next=m,b&&(d.method="next",d.arg=Z),!!b}for(var c=this.tryEntries.length-1;c>=0;--c){var G=this.tryEntries[c],X=G.completion;if("root"===G.tryLoc)return b("end");if(G.tryLoc<=this.prev){var W=m.call(G,"catchLoc"),u=m.call(G,"finallyLoc");if(W&&u){if(this.prev<G.catchLoc)return b(G.catchLoc,!0);if(this.prev<G.finallyLoc)return b(G.finallyLoc)}else if(W){if(this.prev<G.catchLoc)return b(G.catchLoc,!0)}else{if(!u)throw new Error("try statement without catch or finally");if(this.prev<G.finallyLoc)return b(G.finallyLoc)}}}},abrupt:function(l,Z){for(var d=this.tryEntries.length-1;d>=0;--d){var b=this.tryEntries[d];if(b.tryLoc<=this.prev&&m.call(b,"finallyLoc")&&this.prev<b.finallyLoc){var c=b;break}}c&&("break"===l||"continue"===l)&&c.tryLoc<=Z&&Z<=c.finallyLoc&&(c=null);var G=c?c.completion:{};return G.type=l,G.arg=Z,c?(this.method="next",this.next=c.finallyLoc,a):this.complete(G)},complete:function(l,Z){if("throw"===l.type)throw l.arg;return"break"===l.type||"continue"===l.type?this.next=l.arg:"return"===l.type?(this.rval=this.arg=l.arg,this.method="return",this.next="end"):"normal"===l.type&&Z&&(this.next=Z),a},finish:function(l){for(var Z=this.tryEntries.length-1;Z>=0;--Z){var d=this.tryEntries[Z];if(d.finallyLoc===l)return this.complete(d.completion,d.afterLoc),C(d),a}},catch:function(l){for(var Z=this.tryEntries.length-1;Z>=0;--Z){var d=this.tryEntries[Z];if(d.tryLoc===l){var m=d.completion;if("throw"===m.type){var b=m.arg;C(d)}return b}}throw new Error("illegal catch attempt")},delegateYield:function(l,d,m){return this.delegate={iterator:T(l),resultName:d,nextLoc:m},"next"===this.method&&(this.arg=Z),a}},l}(l.exports);try{regeneratorRuntime=Z}catch(l){Function("r","regeneratorRuntime = r")(Z)}})),p=W((function(l,Z){!function(Z,d){l.exports=function(Z){var d,m=(Z=Z||{}).Base64,b="2.6.4",c="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",G=function(l){for(var Z={},d=0,m=l.length;d<m;d++)Z[l.charAt(d)]=d;return Z}(c),X=String.fromCharCode,W=function(l){if(l.length<2)return(Z=l.charCodeAt(0))<128?l:Z<2048?X(192|Z>>>6)+X(128|63&Z):X(224|Z>>>12&15)+X(128|Z>>>6&63)+X(128|63&Z);var Z=65536+1024*(l.charCodeAt(0)-55296)+(l.charCodeAt(1)-56320);return X(240|Z>>>18&7)+X(128|Z>>>12&63)+X(128|Z>>>6&63)+X(128|63&Z)},u=/[\uD800-\uDBFF][\uDC00-\uDFFFF]|[^\x00-\x7F]/g,i=function(l){return l.replace(u,W)},p=function(l){var Z=[0,2,1][l.length%3],d=l.charCodeAt(0)<<16|(l.length>1?l.charCodeAt(1):0)<<8|(l.length>2?l.charCodeAt(2):0);return[c.charAt(d>>>18),c.charAt(d>>>12&63),Z>=2?"=":c.charAt(d>>>6&63),Z>=1?"=":c.charAt(63&d)].join("")},y=Z.btoa&&"function"==typeof Z.btoa?function(l){return Z.btoa(l)}:function(l){if(l.match(/[^\x00-\xFF]/))throw new RangeError("The string contains invalid characters.");return l.replace(/[\s\S]{1,3}/g,p)},V=function(l){return y(i(String(l)))},I=function(l){return l.replace(/[+\/]/g,(function(l){return"+"==l?"-":"_"})).replace(/=/g,"")},h=function(l,Z){return Z?I(V(l)):V(l)},a=function(l){return h(l,!0)};Z.Uint8Array&&(d=function(l,Z){for(var d="",m=0,b=l.length;m<b;m+=3){var G=l[m],X=l[m+1],W=l[m+2],u=G<<16|X<<8|W;d+=c.charAt(u>>>18)+c.charAt(u>>>12&63)+(void 0!==X?c.charAt(u>>>6&63):"=")+(void 0!==W?c.charAt(63&u):"=")}return Z?I(d):d});var Y,R=/[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3}/g,o=function(l){switch(l.length){case 4:var Z=((7&l.charCodeAt(0))<<18|(63&l.charCodeAt(1))<<12|(63&l.charCodeAt(2))<<6|63&l.charCodeAt(3))-65536;return X(55296+(Z>>>10))+X(56320+(1023&Z));case 3:return X((15&l.charCodeAt(0))<<12|(63&l.charCodeAt(1))<<6|63&l.charCodeAt(2));default:return X((31&l.charCodeAt(0))<<6|63&l.charCodeAt(1))}},n=function(l){return l.replace(R,o)},K=function(l){var Z=l.length,d=Z%4,m=(Z>0?G[l.charAt(0)]<<18:0)|(Z>1?G[l.charAt(1)]<<12:0)|(Z>2?G[l.charAt(2)]<<6:0)|(Z>3?G[l.charAt(3)]:0),b=[X(m>>>16),X(m>>>8&255),X(255&m)];return b.length-=[0,0,2,1][d],b.join("")},L=Z.atob&&"function"==typeof Z.atob?function(l){return Z.atob(l)}:function(l){return l.replace(/\S{1,4}/g,K)},J=function(l){return L(String(l).replace(/[^A-Za-z0-9\+\/]/g,""))},s=function(l){return n(L(l))},H=function(l){return String(l).replace(/[-_]/g,(function(l){return"-"==l?"+":"/"})).replace(/[^A-Za-z0-9\+\/]/g,"")},S=function(l){return s(H(l))};Z.Uint8Array&&(Y=function(l){return Uint8Array.from(J(H(l)),(function(l){return l.charCodeAt(0)}))});var x=function(){var l=Z.Base64;return Z.Base64=m,l};if(Z.Base64={VERSION:b,atob:J,btoa:y,fromBase64:S,toBase64:h,utob:i,encode:h,encodeURI:a,btou:n,decode:S,noConflict:x,fromUint8Array:d,toUint8Array:Y},"function"==typeof Object.defineProperty){var C=function(l){return{value:l,enumerable:!1,writable:!0,configurable:!0}};Z.Base64.extendString=function(){Object.defineProperty(String.prototype,"fromBase64",C((function(){return S(this)}))),Object.defineProperty(String.prototype,"toBase64",C((function(l){return h(this,l)}))),Object.defineProperty(String.prototype,"toBase64URI",C((function(){return h(this,!0)})))}}return Z.Meteor&&(Base64=Z.Base64),l.exports&&(l.exports.Base64=Z.Base64),{Base64:Z.Base64}}(Z)}("undefined"!=typeof self?self:"undefined"!=typeof window?window:X)})),y=W((function(l){var Z=Object.prototype.hasOwnProperty,d="~";function m(){}function b(l,Z,d){this.fn=l,this.context=Z,this.once=d||!1}function c(l,Z,m,c,G){if("function"!=typeof m)throw new TypeError("The listener must be a function");var X=new b(m,c||l,G),W=d?d+Z:Z;return l._events[W]?l._events[W].fn?l._events[W]=[l._events[W],X]:l._events[W].push(X):(l._events[W]=X,l._eventsCount++),l}function G(l,Z){0==--l._eventsCount?l._events=new m:delete l._events[Z]}function X(){this._events=new m,this._eventsCount=0}Object.create&&(m.prototype=Object.create(null),(new m).__proto__||(d=!1)),X.prototype.eventNames=function(){var l,m,b=[];if(0===this._eventsCount)return b;for(m in l=this._events)Z.call(l,m)&&b.push(d?m.slice(1):m);return Object.getOwnPropertySymbols?b.concat(Object.getOwnPropertySymbols(l)):b},X.prototype.listeners=function(l){var Z=d?d+l:l,m=this._events[Z];if(!m)return[];if(m.fn)return[m.fn];for(var b=0,c=m.length,G=new Array(c);b<c;b++)G[b]=m[b].fn;return G},X.prototype.listenerCount=function(l){var Z=d?d+l:l,m=this._events[Z];return m?m.fn?1:m.length:0},X.prototype.emit=function(l,Z,m,b,c,G){var X=d?d+l:l;if(!this._events[X])return!1;var W,u,i=this._events[X],p=arguments.length;if(i.fn){switch(i.once&&this.removeListener(l,i.fn,void 0,!0),p){case 1:return i.fn.call(i.context),!0;case 2:return i.fn.call(i.context,Z),!0;case 3:return i.fn.call(i.context,Z,m),!0;case 4:return i.fn.call(i.context,Z,m,b),!0;case 5:return i.fn.call(i.context,Z,m,b,c),!0;case 6:return i.fn.call(i.context,Z,m,b,c,G),!0}for(u=1,W=new Array(p-1);u<p;u++)W[u-1]=arguments[u];i.fn.apply(i.context,W)}else{var y,V=i.length;for(u=0;u<V;u++)switch(i[u].once&&this.removeListener(l,i[u].fn,void 0,!0),p){case 1:i[u].fn.call(i[u].context);break;case 2:i[u].fn.call(i[u].context,Z);break;case 3:i[u].fn.call(i[u].context,Z,m);break;case 4:i[u].fn.call(i[u].context,Z,m,b);break;default:if(!W)for(y=1,W=new Array(p-1);y<p;y++)W[y-1]=arguments[y];i[u].fn.apply(i[u].context,W)}}return!0},X.prototype.on=function(l,Z,d){return c(this,l,Z,d,!1)},X.prototype.once=function(l,Z,d){return c(this,l,Z,d,!0)},X.prototype.removeListener=function(l,Z,m,b){var c=d?d+l:l;if(!this._events[c])return this;if(!Z)return G(this,c),this;var X=this._events[c];if(X.fn)X.fn!==Z||b&&!X.once||m&&X.context!==m||G(this,c);else{for(var W=0,u=[],i=X.length;W<i;W++)(X[W].fn!==Z||b&&!X[W].once||m&&X[W].context!==m)&&u.push(X[W]);u.length?this._events[c]=1===u.length?u[0]:u:G(this,c)}return this},X.prototype.removeAllListeners=function(l){var Z;return l?(Z=d?d+l:l,this._events[Z]&&G(this,Z)):(this._events=new m,this._eventsCount=0),this},X.prototype.off=X.prototype.removeListener,X.prototype.addListener=X.prototype.on,X.prefixed=d,X.EventEmitter=X,l.exports=X}));return function(){if("browser"!=("undefined"!=typeof window&&void 0!==window.document?"browser":"nodejs"))return null;function l(){return new y}function d(){var l,Z,d=new Promise((function(){l=arguments[0],Z=arguments[1]}));return d.resolve=l,d.reject=Z,d}function m(){for(var l=arguments.length>0&&void 0!==arguments[0]?arguments[0]:10,Z=[],d="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),m=d.length,b=0;b<l;b++)Z[b]=d[0|Math.random()*m];return Z.join("")}var b,G=(b="CgoKdmFyIHQ9InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWw/Z2xvYmFsOiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp7fTtmdW5jdGlvbiBlKCl7dGhyb3cgbmV3IEVycm9yKCJzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkIil9ZnVuY3Rpb24gcigpe3Rocm93IG5ldyBFcnJvcigiY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkIil9dmFyIG49ZSxpPXI7ZnVuY3Rpb24gbyh0KXtpZihuPT09c2V0VGltZW91dClyZXR1cm4gc2V0VGltZW91dCh0LDApO2lmKChuPT09ZXx8IW4pJiZzZXRUaW1lb3V0KXJldHVybiBuPXNldFRpbWVvdXQsc2V0VGltZW91dCh0LDApO3RyeXtyZXR1cm4gbih0LDApfWNhdGNoKGUpe3RyeXtyZXR1cm4gbi5jYWxsKG51bGwsdCwwKX1jYXRjaChlKXtyZXR1cm4gbi5jYWxsKHRoaXMsdCwwKX19fSJmdW5jdGlvbiI9PXR5cGVvZiB0LnNldFRpbWVvdXQmJihuPXNldFRpbWVvdXQpLCJmdW5jdGlvbiI9PXR5cGVvZiB0LmNsZWFyVGltZW91dCYmKGk9Y2xlYXJUaW1lb3V0KTt2YXIgYSxzPVtdLHU9ITEsZj0tMTtmdW5jdGlvbiBoKCl7dSYmYSYmKHU9ITEsYS5sZW5ndGg/cz1hLmNvbmNhdChzKTpmPS0xLHMubGVuZ3RoJiZsKCkpfWZ1bmN0aW9uIGwoKXtpZighdSl7dmFyIHQ9byhoKTt1PSEwO2Zvcih2YXIgZT1zLmxlbmd0aDtlOyl7Zm9yKGE9cyxzPVtdOysrZjxlOylhJiZhW2ZdLnJ1bigpO2Y9LTEsZT1zLmxlbmd0aH1hPW51bGwsdT0hMSxmdW5jdGlvbih0KXtpZihpPT09Y2xlYXJUaW1lb3V0KXJldHVybiBjbGVhclRpbWVvdXQodCk7aWYoKGk9PT1yfHwhaSkmJmNsZWFyVGltZW91dClyZXR1cm4gaT1jbGVhclRpbWVvdXQsY2xlYXJUaW1lb3V0KHQpO3RyeXtpKHQpfWNhdGNoKGUpe3RyeXtyZXR1cm4gaS5jYWxsKG51bGwsdCl9Y2F0Y2goZSl7cmV0dXJuIGkuY2FsbCh0aGlzLHQpfX19KHQpfX1mdW5jdGlvbiBjKHQpe3ZhciBlPW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoLTEpO2lmKGFyZ3VtZW50cy5sZW5ndGg+MSlmb3IodmFyIHI9MTtyPGFyZ3VtZW50cy5sZW5ndGg7cisrKWVbci0xXT1hcmd1bWVudHNbcl07cy5wdXNoKG5ldyBkKHQsZSkpLDEhPT1zLmxlbmd0aHx8dXx8byhsKX1mdW5jdGlvbiBkKHQsZSl7dGhpcy5mdW49dCx0aGlzLmFycmF5PWV9ZC5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKCl7dGhpcy5mdW4uYXBwbHkobnVsbCx0aGlzLmFycmF5KX07ZnVuY3Rpb24gcCgpe312YXIgZz1wLHk9cCxiPXAsdj1wLHc9cCxtPXAsXz1wO3ZhciBTPXQucGVyZm9ybWFuY2V8fHt9LEU9Uy5ub3d8fFMubW96Tm93fHxTLm1zTm93fHxTLm9Ob3d8fFMud2Via2l0Tm93fHxmdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZSkuZ2V0VGltZSgpfTt2YXIgaz1uZXcgRGF0ZTt2YXIgUj17bmV4dFRpY2s6Yyx0aXRsZToiYnJvd3NlciIsYnJvd3NlcjohMCxlbnY6e30sYXJndjpbXSx2ZXJzaW9uOiIiLHZlcnNpb25zOnt9LG9uOmcsYWRkTGlzdGVuZXI6eSxvbmNlOmIsb2ZmOnYscmVtb3ZlTGlzdGVuZXI6dyxyZW1vdmVBbGxMaXN0ZW5lcnM6bSxlbWl0Ol8sYmluZGluZzpmdW5jdGlvbih0KXt0aHJvdyBuZXcgRXJyb3IoInByb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkIil9LGN3ZDpmdW5jdGlvbigpe3JldHVybiIvIn0sY2hkaXI6ZnVuY3Rpb24odCl7dGhyb3cgbmV3IEVycm9yKCJwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQiKX0sdW1hc2s6ZnVuY3Rpb24oKXtyZXR1cm4gMH0saHJ0aW1lOmZ1bmN0aW9uKHQpe3ZhciBlPS4wMDEqRS5jYWxsKFMpLHI9TWF0aC5mbG9vcihlKSxuPU1hdGguZmxvb3IoZSUxKjFlOSk7cmV0dXJuIHQmJihyLT10WzBdLChuLT10WzFdKTwwJiYoci0tLG4rPTFlOSkpLFtyLG5dfSxwbGF0Zm9ybToiYnJvd3NlciIscmVsZWFzZTp7fSxjb25maWc6e30sdXB0aW1lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBEYXRlLWspLzFlM319LGo9InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWxUaGlzP2dsb2JhbFRoaXM6InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OiJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsP2dsb2JhbDoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjp7fTtmdW5jdGlvbiBUKHQpe2lmKHQuX19lc01vZHVsZSlyZXR1cm4gdDt2YXIgZT1PYmplY3QuZGVmaW5lUHJvcGVydHkoe30sIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3JldHVybiBPYmplY3Qua2V5cyh0KS5mb3JFYWNoKChmdW5jdGlvbihyKXt2YXIgbj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQscik7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUscixuLmdldD9uOntlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0W3JdfX0pfSkpLGV9ZnVuY3Rpb24gTyh0KXt2YXIgZT17ZXhwb3J0czp7fX07cmV0dXJuIHQoZSxlLmV4cG9ydHMpLGUuZXhwb3J0c312YXIgQT1PKChmdW5jdGlvbih0KXt2b2lkIDA9PT1SfHwhUi52ZXJzaW9ufHwwPT09Ui52ZXJzaW9uLmluZGV4T2YoInYwLiIpfHwwPT09Ui52ZXJzaW9uLmluZGV4T2YoInYxLiIpJiYwIT09Ui52ZXJzaW9uLmluZGV4T2YoInYxLjguIik/dC5leHBvcnRzPXtuZXh0VGljazpmdW5jdGlvbih0LGUscixuKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCciY2FsbGJhY2siIGFyZ3VtZW50IG11c3QgYmUgYSBmdW5jdGlvbicpO3ZhciBpLG8sYT1hcmd1bWVudHMubGVuZ3RoO3N3aXRjaChhKXtjYXNlIDA6Y2FzZSAxOnJldHVybiBSLm5leHRUaWNrKHQpO2Nhc2UgMjpyZXR1cm4gUi5uZXh0VGljaygoZnVuY3Rpb24oKXt0LmNhbGwobnVsbCxlKX0pKTtjYXNlIDM6cmV0dXJuIFIubmV4dFRpY2soKGZ1bmN0aW9uKCl7dC5jYWxsKG51bGwsZSxyKX0pKTtjYXNlIDQ6cmV0dXJuIFIubmV4dFRpY2soKGZ1bmN0aW9uKCl7dC5jYWxsKG51bGwsZSxyLG4pfSkpO2RlZmF1bHQ6Zm9yKGk9bmV3IEFycmF5KGEtMSksbz0wO288aS5sZW5ndGg7KWlbbysrXT1hcmd1bWVudHNbb107cmV0dXJuIFIubmV4dFRpY2soKGZ1bmN0aW9uKCl7dC5hcHBseShudWxsLGkpfSkpfX19OnQuZXhwb3J0cz1SfSkpLEM9e30udG9TdHJpbmcsTT1BcnJheS5pc0FycmF5fHxmdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT1DLmNhbGwodCl9O2Z1bmN0aW9uIHgoKXt9ZnVuY3Rpb24gTCgpe0wuaW5pdC5jYWxsKHRoaXMpfWZ1bmN0aW9uIEIodCl7cmV0dXJuIHZvaWQgMD09PXQuX21heExpc3RlbmVycz9MLmRlZmF1bHRNYXhMaXN0ZW5lcnM6dC5fbWF4TGlzdGVuZXJzfWZ1bmN0aW9uIFAodCxlLHIpe2lmKGUpdC5jYWxsKHIpO2Vsc2UgZm9yKHZhciBuPXQubGVuZ3RoLGk9eih0LG4pLG89MDtvPG47KytvKWlbb10uY2FsbChyKX1mdW5jdGlvbiBVKHQsZSxyLG4pe2lmKGUpdC5jYWxsKHIsbik7ZWxzZSBmb3IodmFyIGk9dC5sZW5ndGgsbz16KHQsaSksYT0wO2E8aTsrK2Epb1thXS5jYWxsKHIsbil9ZnVuY3Rpb24gTih0LGUscixuLGkpe2lmKGUpdC5jYWxsKHIsbixpKTtlbHNlIGZvcih2YXIgbz10Lmxlbmd0aCxhPXoodCxvKSxzPTA7czxvOysrcylhW3NdLmNhbGwocixuLGkpfWZ1bmN0aW9uIEQodCxlLHIsbixpLG8pe2lmKGUpdC5jYWxsKHIsbixpLG8pO2Vsc2UgZm9yKHZhciBhPXQubGVuZ3RoLHM9eih0LGEpLHU9MDt1PGE7Kyt1KXNbdV0uY2FsbChyLG4saSxvKX1mdW5jdGlvbiBJKHQsZSxyLG4pe2lmKGUpdC5hcHBseShyLG4pO2Vsc2UgZm9yKHZhciBpPXQubGVuZ3RoLG89eih0LGkpLGE9MDthPGk7KythKW9bYV0uYXBwbHkocixuKX1mdW5jdGlvbiBxKHQsZSxyLG4pe3ZhciBpLG8sYSxzO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiByKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0ZW5lciIgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7aWYoKG89dC5fZXZlbnRzKT8oby5uZXdMaXN0ZW5lciYmKHQuZW1pdCgibmV3TGlzdGVuZXIiLGUsci5saXN0ZW5lcj9yLmxpc3RlbmVyOnIpLG89dC5fZXZlbnRzKSxhPW9bZV0pOihvPXQuX2V2ZW50cz1uZXcgeCx0Ll9ldmVudHNDb3VudD0wKSxhKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYT9hPW9bZV09bj9bcixhXTpbYSxyXTpuP2EudW5zaGlmdChyKTphLnB1c2gociksIWEud2FybmVkJiYoaT1CKHQpKSYmaT4wJiZhLmxlbmd0aD5pKXthLndhcm5lZD0hMDt2YXIgdT1uZXcgRXJyb3IoIlBvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgbGVhayBkZXRlY3RlZC4gIithLmxlbmd0aCsiICIrZSsiIGxpc3RlbmVycyBhZGRlZC4gVXNlIGVtaXR0ZXIuc2V0TWF4TGlzdGVuZXJzKCkgdG8gaW5jcmVhc2UgbGltaXQiKTt1Lm5hbWU9Ik1heExpc3RlbmVyc0V4Y2VlZGVkV2FybmluZyIsdS5lbWl0dGVyPXQsdS50eXBlPWUsdS5jb3VudD1hLmxlbmd0aCxzPXUsImZ1bmN0aW9uIj09dHlwZW9mIGNvbnNvbGUud2Fybj9jb25zb2xlLndhcm4ocyk6Y29uc29sZS5sb2cocyl9fWVsc2UgYT1vW2VdPXIsKyt0Ll9ldmVudHNDb3VudDtyZXR1cm4gdH1mdW5jdGlvbiBGKHQsZSxyKXt2YXIgbj0hMTtmdW5jdGlvbiBpKCl7dC5yZW1vdmVMaXN0ZW5lcihlLGkpLG58fChuPSEwLHIuYXBwbHkodCxhcmd1bWVudHMpKX1yZXR1cm4gaS5saXN0ZW5lcj1yLGl9ZnVuY3Rpb24gVyh0KXt2YXIgZT10aGlzLl9ldmVudHM7aWYoZSl7dmFyIHI9ZVt0XTtpZigiZnVuY3Rpb24iPT10eXBlb2YgcilyZXR1cm4gMTtpZihyKXJldHVybiByLmxlbmd0aH1yZXR1cm4gMH1mdW5jdGlvbiB6KHQsZSl7Zm9yKHZhciByPW5ldyBBcnJheShlKTtlLS07KXJbZV09dFtlXTtyZXR1cm4gcn14LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG51bGwpLEwuRXZlbnRFbWl0dGVyPUwsTC51c2luZ0RvbWFpbnM9ITEsTC5wcm90b3R5cGUuZG9tYWluPXZvaWQgMCxMLnByb3RvdHlwZS5fZXZlbnRzPXZvaWQgMCxMLnByb3RvdHlwZS5fbWF4TGlzdGVuZXJzPXZvaWQgMCxMLmRlZmF1bHRNYXhMaXN0ZW5lcnM9MTAsTC5pbml0PWZ1bmN0aW9uKCl7dGhpcy5kb21haW49bnVsbCxMLnVzaW5nRG9tYWlucyYmdW5kZWZpbmVkLmFjdGl2ZSx0aGlzLl9ldmVudHMmJnRoaXMuX2V2ZW50cyE9PU9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKS5fZXZlbnRzfHwodGhpcy5fZXZlbnRzPW5ldyB4LHRoaXMuX2V2ZW50c0NvdW50PTApLHRoaXMuX21heExpc3RlbmVycz10aGlzLl9tYXhMaXN0ZW5lcnN8fHZvaWQgMH0sTC5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzPWZ1bmN0aW9uKHQpe2lmKCJudW1iZXIiIT10eXBlb2YgdHx8dDwwfHxpc05hTih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCcibiIgYXJndW1lbnQgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlcicpO3JldHVybiB0aGlzLl9tYXhMaXN0ZW5lcnM9dCx0aGlzfSxMLnByb3RvdHlwZS5nZXRNYXhMaXN0ZW5lcnM9ZnVuY3Rpb24oKXtyZXR1cm4gQih0aGlzKX0sTC5wcm90b3R5cGUuZW1pdD1mdW5jdGlvbih0KXt2YXIgZSxyLG4saSxvLGEscyx1PSJlcnJvciI9PT10O2lmKGE9dGhpcy5fZXZlbnRzKXU9dSYmbnVsbD09YS5lcnJvcjtlbHNlIGlmKCF1KXJldHVybiExO2lmKHM9dGhpcy5kb21haW4sdSl7aWYoZT1hcmd1bWVudHNbMV0sIXMpe2lmKGUgaW5zdGFuY2VvZiBFcnJvcil0aHJvdyBlO3ZhciBmPW5ldyBFcnJvcignVW5jYXVnaHQsIHVuc3BlY2lmaWVkICJlcnJvciIgZXZlbnQuICgnK2UrIikiKTt0aHJvdyBmLmNvbnRleHQ9ZSxmfXJldHVybiBlfHwoZT1uZXcgRXJyb3IoJ1VuY2F1Z2h0LCB1bnNwZWNpZmllZCAiZXJyb3IiIGV2ZW50JykpLGUuZG9tYWluRW1pdHRlcj10aGlzLGUuZG9tYWluPXMsZS5kb21haW5UaHJvd249ITEscy5lbWl0KCJlcnJvciIsZSksITF9aWYoIShyPWFbdF0pKXJldHVybiExO3ZhciBoPSJmdW5jdGlvbiI9PXR5cGVvZiByO3N3aXRjaChuPWFyZ3VtZW50cy5sZW5ndGgpe2Nhc2UgMTpQKHIsaCx0aGlzKTticmVhaztjYXNlIDI6VShyLGgsdGhpcyxhcmd1bWVudHNbMV0pO2JyZWFrO2Nhc2UgMzpOKHIsaCx0aGlzLGFyZ3VtZW50c1sxXSxhcmd1bWVudHNbMl0pO2JyZWFrO2Nhc2UgNDpEKHIsaCx0aGlzLGFyZ3VtZW50c1sxXSxhcmd1bWVudHNbMl0sYXJndW1lbnRzWzNdKTticmVhaztkZWZhdWx0OmZvcihpPW5ldyBBcnJheShuLTEpLG89MTtvPG47bysrKWlbby0xXT1hcmd1bWVudHNbb107SShyLGgsdGhpcyxpKX1yZXR1cm4hMH0sTC5wcm90b3R5cGUuYWRkTGlzdGVuZXI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gcSh0aGlzLHQsZSwhMSl9LEwucHJvdG90eXBlLm9uPUwucHJvdG90eXBlLmFkZExpc3RlbmVyLEwucHJvdG90eXBlLnByZXBlbmRMaXN0ZW5lcj1mdW5jdGlvbih0LGUpe3JldHVybiBxKHRoaXMsdCxlLCEwKX0sTC5wcm90b3R5cGUub25jZT1mdW5jdGlvbih0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0ZW5lciIgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7cmV0dXJuIHRoaXMub24odCxGKHRoaXMsdCxlKSksdGhpc30sTC5wcm90b3R5cGUucHJlcGVuZE9uY2VMaXN0ZW5lcj1mdW5jdGlvbih0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0ZW5lciIgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7cmV0dXJuIHRoaXMucHJlcGVuZExpc3RlbmVyKHQsRih0aGlzLHQsZSkpLHRoaXN9LEwucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyPWZ1bmN0aW9uKHQsZSl7dmFyIHIsbixpLG8sYTtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdGVuZXIiIGFyZ3VtZW50IG11c3QgYmUgYSBmdW5jdGlvbicpO2lmKCEobj10aGlzLl9ldmVudHMpKXJldHVybiB0aGlzO2lmKCEocj1uW3RdKSlyZXR1cm4gdGhpcztpZihyPT09ZXx8ci5saXN0ZW5lciYmci5saXN0ZW5lcj09PWUpMD09LS10aGlzLl9ldmVudHNDb3VudD90aGlzLl9ldmVudHM9bmV3IHg6KGRlbGV0ZSBuW3RdLG4ucmVtb3ZlTGlzdGVuZXImJnRoaXMuZW1pdCgicmVtb3ZlTGlzdGVuZXIiLHQsci5saXN0ZW5lcnx8ZSkpO2Vsc2UgaWYoImZ1bmN0aW9uIiE9dHlwZW9mIHIpe2ZvcihpPS0xLG89ci5sZW5ndGg7by0tID4wOylpZihyW29dPT09ZXx8cltvXS5saXN0ZW5lciYmcltvXS5saXN0ZW5lcj09PWUpe2E9cltvXS5saXN0ZW5lcixpPW87YnJlYWt9aWYoaTwwKXJldHVybiB0aGlzO2lmKDE9PT1yLmxlbmd0aCl7aWYoclswXT12b2lkIDAsMD09LS10aGlzLl9ldmVudHNDb3VudClyZXR1cm4gdGhpcy5fZXZlbnRzPW5ldyB4LHRoaXM7ZGVsZXRlIG5bdF19ZWxzZSFmdW5jdGlvbih0LGUpe2Zvcih2YXIgcj1lLG49cisxLGk9dC5sZW5ndGg7bjxpO3IrPTEsbis9MSl0W3JdPXRbbl07dC5wb3AoKX0ocixpKTtuLnJlbW92ZUxpc3RlbmVyJiZ0aGlzLmVtaXQoInJlbW92ZUxpc3RlbmVyIix0LGF8fGUpfXJldHVybiB0aGlzfSxMLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnM9ZnVuY3Rpb24odCl7dmFyIGUscjtpZighKHI9dGhpcy5fZXZlbnRzKSlyZXR1cm4gdGhpcztpZighci5yZW1vdmVMaXN0ZW5lcilyZXR1cm4gMD09PWFyZ3VtZW50cy5sZW5ndGg/KHRoaXMuX2V2ZW50cz1uZXcgeCx0aGlzLl9ldmVudHNDb3VudD0wKTpyW3RdJiYoMD09LS10aGlzLl9ldmVudHNDb3VudD90aGlzLl9ldmVudHM9bmV3IHg6ZGVsZXRlIHJbdF0pLHRoaXM7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcih2YXIgbixpPU9iamVjdC5rZXlzKHIpLG89MDtvPGkubGVuZ3RoOysrbykicmVtb3ZlTGlzdGVuZXIiIT09KG49aVtvXSkmJnRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKG4pO3JldHVybiB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygicmVtb3ZlTGlzdGVuZXIiKSx0aGlzLl9ldmVudHM9bmV3IHgsdGhpcy5fZXZlbnRzQ291bnQ9MCx0aGlzfWlmKCJmdW5jdGlvbiI9PXR5cGVvZihlPXJbdF0pKXRoaXMucmVtb3ZlTGlzdGVuZXIodCxlKTtlbHNlIGlmKGUpZG97dGhpcy5yZW1vdmVMaXN0ZW5lcih0LGVbZS5sZW5ndGgtMV0pfXdoaWxlKGVbMF0pO3JldHVybiB0aGlzfSxMLnByb3RvdHlwZS5saXN0ZW5lcnM9ZnVuY3Rpb24odCl7dmFyIGUscj10aGlzLl9ldmVudHM7cmV0dXJuIHImJihlPXJbdF0pPyJmdW5jdGlvbiI9PXR5cGVvZiBlP1tlLmxpc3RlbmVyfHxlXTpmdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IEFycmF5KHQubGVuZ3RoKSxyPTA7cjxlLmxlbmd0aDsrK3IpZVtyXT10W3JdLmxpc3RlbmVyfHx0W3JdO3JldHVybiBlfShlKTpbXX0sTC5saXN0ZW5lckNvdW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQubGlzdGVuZXJDb3VudD90Lmxpc3RlbmVyQ291bnQoZSk6Vy5jYWxsKHQsZSl9LEwucHJvdG90eXBlLmxpc3RlbmVyQ291bnQ9VyxMLnByb3RvdHlwZS5ldmVudE5hbWVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2V2ZW50c0NvdW50PjA/UmVmbGVjdC5vd25LZXlzKHRoaXMuX2V2ZW50cyk6W119O3ZhciBZPVQoT2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsZGVmYXVsdDpMLEV2ZW50RW1pdHRlcjpMfSkpLCQ9WS5FdmVudEVtaXR0ZXIsSD1bXSxKPVtdLEc9InVuZGVmaW5lZCIhPXR5cGVvZiBVaW50OEFycmF5P1VpbnQ4QXJyYXk6QXJyYXksVj0hMTtmdW5jdGlvbiBLKCl7Vj0hMDtmb3IodmFyIHQ9IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iLGU9MCxyPXQubGVuZ3RoO2U8cjsrK2UpSFtlXT10W2VdLEpbdC5jaGFyQ29kZUF0KGUpXT1lO0pbIi0iLmNoYXJDb2RlQXQoMCldPTYyLEpbIl8iLmNoYXJDb2RlQXQoMCldPTYzfWZ1bmN0aW9uIFoodCxlLHIpe2Zvcih2YXIgbixpLG89W10sYT1lO2E8cjthKz0zKW49KHRbYV08PDE2KSsodFthKzFdPDw4KSt0W2ErMl0sby5wdXNoKEhbKGk9bik+PjE4JjYzXStIW2k+PjEyJjYzXStIW2k+PjYmNjNdK0hbNjMmaV0pO3JldHVybiBvLmpvaW4oIiIpfWZ1bmN0aW9uIFgodCl7dmFyIGU7Vnx8SygpO2Zvcih2YXIgcj10Lmxlbmd0aCxuPXIlMyxpPSIiLG89W10sYT0xNjM4MyxzPTAsdT1yLW47czx1O3MrPWEpby5wdXNoKFoodCxzLHMrYT51P3U6cythKSk7cmV0dXJuIDE9PT1uPyhlPXRbci0xXSxpKz1IW2U+PjJdLGkrPUhbZTw8NCY2M10saSs9Ij09Iik6Mj09PW4mJihlPSh0W3ItMl08PDgpK3Rbci0xXSxpKz1IW2U+PjEwXSxpKz1IW2U+PjQmNjNdLGkrPUhbZTw8MiY2M10saSs9Ij0iKSxvLnB1c2goaSksby5qb2luKCIiKX1mdW5jdGlvbiBRKHQsZSxyLG4saSl7dmFyIG8sYSxzPTgqaS1uLTEsdT0oMTw8cyktMSxmPXU+PjEsaD0tNyxsPXI/aS0xOjAsYz1yPy0xOjEsZD10W2UrbF07Zm9yKGwrPWMsbz1kJigxPDwtaCktMSxkPj49LWgsaCs9cztoPjA7bz0yNTYqbyt0W2UrbF0sbCs9YyxoLT04KTtmb3IoYT1vJigxPDwtaCktMSxvPj49LWgsaCs9bjtoPjA7YT0yNTYqYSt0W2UrbF0sbCs9YyxoLT04KTtpZigwPT09bylvPTEtZjtlbHNle2lmKG89PT11KXJldHVybiBhP05hTjoxLzAqKGQ/LTE6MSk7YSs9TWF0aC5wb3coMixuKSxvLT1mfXJldHVybihkPy0xOjEpKmEqTWF0aC5wb3coMixvLW4pfWZ1bmN0aW9uIHR0KHQsZSxyLG4saSxvKXt2YXIgYSxzLHUsZj04Km8taS0xLGg9KDE8PGYpLTEsbD1oPj4xLGM9MjM9PT1pP01hdGgucG93KDIsLTI0KS1NYXRoLnBvdygyLC03Nyk6MCxkPW4/MDpvLTEscD1uPzE6LTEsZz1lPDB8fDA9PT1lJiYxL2U8MD8xOjA7Zm9yKGU9TWF0aC5hYnMoZSksaXNOYU4oZSl8fGU9PT0xLzA/KHM9aXNOYU4oZSk/MTowLGE9aCk6KGE9TWF0aC5mbG9vcihNYXRoLmxvZyhlKS9NYXRoLkxOMiksZSoodT1NYXRoLnBvdygyLC1hKSk8MSYmKGEtLSx1Kj0yKSwoZSs9YStsPj0xP2MvdTpjKk1hdGgucG93KDIsMS1sKSkqdT49MiYmKGErKyx1Lz0yKSxhK2w+PWg/KHM9MCxhPWgpOmErbD49MT8ocz0oZSp1LTEpKk1hdGgucG93KDIsaSksYSs9bCk6KHM9ZSpNYXRoLnBvdygyLGwtMSkqTWF0aC5wb3coMixpKSxhPTApKTtpPj04O3RbcitkXT0yNTUmcyxkKz1wLHMvPTI1NixpLT04KTtmb3IoYT1hPDxpfHMsZis9aTtmPjA7dFtyK2RdPTI1NSZhLGQrPXAsYS89MjU2LGYtPTgpO3RbcitkLXBdfD0xMjgqZ312YXIgZXQ9e30udG9TdHJpbmcscnQ9QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24odCl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09ZXQuY2FsbCh0KX07YXQuVFlQRURfQVJSQVlfU1VQUE9SVD12b2lkIDA9PT10LlRZUEVEX0FSUkFZX1NVUFBPUlR8fHQuVFlQRURfQVJSQVlfU1VQUE9SVDt2YXIgbnQ9aXQoKTtmdW5jdGlvbiBpdCgpe3JldHVybiBhdC5UWVBFRF9BUlJBWV9TVVBQT1JUPzIxNDc0ODM2NDc6MTA3Mzc0MTgyM31mdW5jdGlvbiBvdCh0LGUpe2lmKGl0KCk8ZSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW52YWxpZCB0eXBlZCBhcnJheSBsZW5ndGgiKTtyZXR1cm4gYXQuVFlQRURfQVJSQVlfU1VQUE9SVD8odD1uZXcgVWludDhBcnJheShlKSkuX19wcm90b19fPWF0LnByb3RvdHlwZToobnVsbD09PXQmJih0PW5ldyBhdChlKSksdC5sZW5ndGg9ZSksdH1mdW5jdGlvbiBhdCh0LGUscil7aWYoIShhdC5UWVBFRF9BUlJBWV9TVVBQT1JUfHx0aGlzIGluc3RhbmNlb2YgYXQpKXJldHVybiBuZXcgYXQodCxlLHIpO2lmKCJudW1iZXIiPT10eXBlb2YgdCl7aWYoInN0cmluZyI9PXR5cGVvZiBlKXRocm93IG5ldyBFcnJvcigiSWYgZW5jb2RpbmcgaXMgc3BlY2lmaWVkIHRoZW4gdGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmciKTtyZXR1cm4gZnQodGhpcyx0KX1yZXR1cm4gc3QodGhpcyx0LGUscil9ZnVuY3Rpb24gc3QodCxlLHIsbil7aWYoIm51bWJlciI9PXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoJyJ2YWx1ZSIgYXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXInKTtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiZlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXI/ZnVuY3Rpb24odCxlLHIsbil7aWYoZS5ieXRlTGVuZ3RoLHI8MHx8ZS5ieXRlTGVuZ3RoPHIpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIidvZmZzZXQnIGlzIG91dCBvZiBib3VuZHMiKTtpZihlLmJ5dGVMZW5ndGg8cisobnx8MCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIidsZW5ndGgnIGlzIG91dCBvZiBib3VuZHMiKTtlPXZvaWQgMD09PXImJnZvaWQgMD09PW4/bmV3IFVpbnQ4QXJyYXkoZSk6dm9pZCAwPT09bj9uZXcgVWludDhBcnJheShlLHIpOm5ldyBVaW50OEFycmF5KGUscixuKTthdC5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0PWUpLl9fcHJvdG9fXz1hdC5wcm90b3R5cGU6dD1odCh0LGUpO3JldHVybiB0fSh0LGUscixuKToic3RyaW5nIj09dHlwZW9mIGU/ZnVuY3Rpb24odCxlLHIpeyJzdHJpbmciPT10eXBlb2YgciYmIiIhPT1yfHwocj0idXRmOCIpO2lmKCFhdC5pc0VuY29kaW5nKHIpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJlbmNvZGluZyIgbXVzdCBiZSBhIHZhbGlkIHN0cmluZyBlbmNvZGluZycpO3ZhciBuPTB8ZHQoZSxyKSxpPSh0PW90KHQsbikpLndyaXRlKGUscik7aSE9PW4mJih0PXQuc2xpY2UoMCxpKSk7cmV0dXJuIHR9KHQsZSxyKTpmdW5jdGlvbih0LGUpe2lmKGN0KGUpKXt2YXIgcj0wfGx0KGUubGVuZ3RoKTtyZXR1cm4gMD09PSh0PW90KHQscikpLmxlbmd0aHx8ZS5jb3B5KHQsMCwwLHIpLHR9aWYoZSl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmZS5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcnx8Imxlbmd0aCJpbiBlKXJldHVybiJudW1iZXIiIT10eXBlb2YgZS5sZW5ndGh8fChuPWUubGVuZ3RoKSE9bj9vdCh0LDApOmh0KHQsZSk7aWYoIkJ1ZmZlciI9PT1lLnR5cGUmJnJ0KGUuZGF0YSkpcmV0dXJuIGh0KHQsZS5kYXRhKX12YXIgbjt0aHJvdyBuZXcgVHlwZUVycm9yKCJGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgb3IgYXJyYXktbGlrZSBvYmplY3QuIil9KHQsZSl9ZnVuY3Rpb24gdXQodCl7aWYoIm51bWJlciIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoJyJzaXplIiBhcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJyk7aWYodDwwKXRocm93IG5ldyBSYW5nZUVycm9yKCcic2l6ZSIgYXJndW1lbnQgbXVzdCBub3QgYmUgbmVnYXRpdmUnKX1mdW5jdGlvbiBmdCh0LGUpe2lmKHV0KGUpLHQ9b3QodCxlPDA/MDowfGx0KGUpKSwhYXQuVFlQRURfQVJSQVlfU1VQUE9SVClmb3IodmFyIHI9MDtyPGU7KytyKXRbcl09MDtyZXR1cm4gdH1mdW5jdGlvbiBodCh0LGUpe3ZhciByPWUubGVuZ3RoPDA/MDowfGx0KGUubGVuZ3RoKTt0PW90KHQscik7Zm9yKHZhciBuPTA7bjxyO24rPTEpdFtuXT0yNTUmZVtuXTtyZXR1cm4gdH1mdW5jdGlvbiBsdCh0KXtpZih0Pj1pdCgpKXRocm93IG5ldyBSYW5nZUVycm9yKCJBdHRlbXB0IHRvIGFsbG9jYXRlIEJ1ZmZlciBsYXJnZXIgdGhhbiBtYXhpbXVtIHNpemU6IDB4IitpdCgpLnRvU3RyaW5nKDE2KSsiIGJ5dGVzIik7cmV0dXJuIDB8dH1mdW5jdGlvbiBjdCh0KXtyZXR1cm4hKG51bGw9PXR8fCF0Ll9pc0J1ZmZlcil9ZnVuY3Rpb24gZHQodCxlKXtpZihjdCh0KSlyZXR1cm4gdC5sZW5ndGg7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmImZ1bmN0aW9uIj09dHlwZW9mIEFycmF5QnVmZmVyLmlzVmlldyYmKEFycmF5QnVmZmVyLmlzVmlldyh0KXx8dCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSlyZXR1cm4gdC5ieXRlTGVuZ3RoOyJzdHJpbmciIT10eXBlb2YgdCYmKHQ9IiIrdCk7dmFyIHI9dC5sZW5ndGg7aWYoMD09PXIpcmV0dXJuIDA7Zm9yKHZhciBuPSExOzspc3dpdGNoKGUpe2Nhc2UiYXNjaWkiOmNhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIHI7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpjYXNlIHZvaWQgMDpyZXR1cm4gSXQodCkubGVuZ3RoO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gMipyO2Nhc2UiaGV4IjpyZXR1cm4gcj4+PjE7Y2FzZSJiYXNlNjQiOnJldHVybiBxdCh0KS5sZW5ndGg7ZGVmYXVsdDppZihuKXJldHVybiBJdCh0KS5sZW5ndGg7ZT0oIiIrZSkudG9Mb3dlckNhc2UoKSxuPSEwfX1mdW5jdGlvbiBwdCh0LGUscil7dmFyIG49ITE7aWYoKHZvaWQgMD09PWV8fGU8MCkmJihlPTApLGU+dGhpcy5sZW5ndGgpcmV0dXJuIiI7aWYoKHZvaWQgMD09PXJ8fHI+dGhpcy5sZW5ndGgpJiYocj10aGlzLmxlbmd0aCkscjw9MClyZXR1cm4iIjtpZigocj4+Pj0wKTw9KGU+Pj49MCkpcmV0dXJuIiI7Zm9yKHR8fCh0PSJ1dGY4Iik7Oylzd2l0Y2godCl7Y2FzZSJoZXgiOnJldHVybiBPdCh0aGlzLGUscik7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpyZXR1cm4gUnQodGhpcyxlLHIpO2Nhc2UiYXNjaWkiOnJldHVybiBqdCh0aGlzLGUscik7Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gVHQodGhpcyxlLHIpO2Nhc2UiYmFzZTY0IjpyZXR1cm4ga3QodGhpcyxlLHIpO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gQXQodGhpcyxlLHIpO2RlZmF1bHQ6aWYobil0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK3QpO3Q9KHQrIiIpLnRvTG93ZXJDYXNlKCksbj0hMH19ZnVuY3Rpb24gZ3QodCxlLHIpe3ZhciBuPXRbZV07dFtlXT10W3JdLHRbcl09bn1mdW5jdGlvbiB5dCh0LGUscixuLGkpe2lmKDA9PT10Lmxlbmd0aClyZXR1cm4tMTtpZigic3RyaW5nIj09dHlwZW9mIHI/KG49cixyPTApOnI+MjE0NzQ4MzY0Nz9yPTIxNDc0ODM2NDc6cjwtMjE0NzQ4MzY0OCYmKHI9LTIxNDc0ODM2NDgpLHI9K3IsaXNOYU4ocikmJihyPWk/MDp0Lmxlbmd0aC0xKSxyPDAmJihyPXQubGVuZ3RoK3IpLHI+PXQubGVuZ3RoKXtpZihpKXJldHVybi0xO3I9dC5sZW5ndGgtMX1lbHNlIGlmKHI8MCl7aWYoIWkpcmV0dXJuLTE7cj0wfWlmKCJzdHJpbmciPT10eXBlb2YgZSYmKGU9YXQuZnJvbShlLG4pKSxjdChlKSlyZXR1cm4gMD09PWUubGVuZ3RoPy0xOmJ0KHQsZSxyLG4saSk7aWYoIm51bWJlciI9PXR5cGVvZiBlKXJldHVybiBlJj0yNTUsYXQuVFlQRURfQVJSQVlfU1VQUE9SVCYmImZ1bmN0aW9uIj09dHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2Y/aT9VaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwodCxlLHIpOlVpbnQ4QXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mLmNhbGwodCxlLHIpOmJ0KHQsW2VdLHIsbixpKTt0aHJvdyBuZXcgVHlwZUVycm9yKCJ2YWwgbXVzdCBiZSBzdHJpbmcsIG51bWJlciBvciBCdWZmZXIiKX1mdW5jdGlvbiBidCh0LGUscixuLGkpe3ZhciBvLGE9MSxzPXQubGVuZ3RoLHU9ZS5sZW5ndGg7aWYodm9pZCAwIT09biYmKCJ1Y3MyIj09PShuPVN0cmluZyhuKS50b0xvd2VyQ2FzZSgpKXx8InVjcy0yIj09PW58fCJ1dGYxNmxlIj09PW58fCJ1dGYtMTZsZSI9PT1uKSl7aWYodC5sZW5ndGg8Mnx8ZS5sZW5ndGg8MilyZXR1cm4tMTthPTIscy89Mix1Lz0yLHIvPTJ9ZnVuY3Rpb24gZih0LGUpe3JldHVybiAxPT09YT90W2VdOnQucmVhZFVJbnQxNkJFKGUqYSl9aWYoaSl7dmFyIGg9LTE7Zm9yKG89cjtvPHM7bysrKWlmKGYodCxvKT09PWYoZSwtMT09PWg/MDpvLWgpKXtpZigtMT09PWgmJihoPW8pLG8taCsxPT09dSlyZXR1cm4gaCphfWVsc2UtMSE9PWgmJihvLT1vLWgpLGg9LTF9ZWxzZSBmb3Iocit1PnMmJihyPXMtdSksbz1yO28+PTA7by0tKXtmb3IodmFyIGw9ITAsYz0wO2M8dTtjKyspaWYoZih0LG8rYykhPT1mKGUsYykpe2w9ITE7YnJlYWt9aWYobClyZXR1cm4gb31yZXR1cm4tMX1mdW5jdGlvbiB2dCh0LGUscixuKXtyPU51bWJlcihyKXx8MDt2YXIgaT10Lmxlbmd0aC1yO24/KG49TnVtYmVyKG4pKT5pJiYobj1pKTpuPWk7dmFyIG89ZS5sZW5ndGg7aWYobyUyIT0wKXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgaGV4IHN0cmluZyIpO24+by8yJiYobj1vLzIpO2Zvcih2YXIgYT0wO2E8bjsrK2Epe3ZhciBzPXBhcnNlSW50KGUuc3Vic3RyKDIqYSwyKSwxNik7aWYoaXNOYU4ocykpcmV0dXJuIGE7dFtyK2FdPXN9cmV0dXJuIGF9ZnVuY3Rpb24gd3QodCxlLHIsbil7cmV0dXJuIEZ0KEl0KGUsdC5sZW5ndGgtciksdCxyLG4pfWZ1bmN0aW9uIG10KHQsZSxyLG4pe3JldHVybiBGdChmdW5jdGlvbih0KXtmb3IodmFyIGU9W10scj0wO3I8dC5sZW5ndGg7KytyKWUucHVzaCgyNTUmdC5jaGFyQ29kZUF0KHIpKTtyZXR1cm4gZX0oZSksdCxyLG4pfWZ1bmN0aW9uIF90KHQsZSxyLG4pe3JldHVybiBtdCh0LGUscixuKX1mdW5jdGlvbiBTdCh0LGUscixuKXtyZXR1cm4gRnQocXQoZSksdCxyLG4pfWZ1bmN0aW9uIEV0KHQsZSxyLG4pe3JldHVybiBGdChmdW5jdGlvbih0LGUpe2Zvcih2YXIgcixuLGksbz1bXSxhPTA7YTx0Lmxlbmd0aCYmISgoZS09Mik8MCk7KythKW49KHI9dC5jaGFyQ29kZUF0KGEpKT4+OCxpPXIlMjU2LG8ucHVzaChpKSxvLnB1c2gobik7cmV0dXJuIG99KGUsdC5sZW5ndGgtciksdCxyLG4pfWZ1bmN0aW9uIGt0KHQsZSxyKXtyZXR1cm4gMD09PWUmJnI9PT10Lmxlbmd0aD9YKHQpOlgodC5zbGljZShlLHIpKX1mdW5jdGlvbiBSdCh0LGUscil7cj1NYXRoLm1pbih0Lmxlbmd0aCxyKTtmb3IodmFyIG49W10saT1lO2k8cjspe3ZhciBvLGEscyx1LGY9dFtpXSxoPW51bGwsbD1mPjIzOT80OmY+MjIzPzM6Zj4xOTE/MjoxO2lmKGkrbDw9cilzd2l0Y2gobCl7Y2FzZSAxOmY8MTI4JiYoaD1mKTticmVhaztjYXNlIDI6MTI4PT0oMTkyJihvPXRbaSsxXSkpJiYodT0oMzEmZik8PDZ8NjMmbyk+MTI3JiYoaD11KTticmVhaztjYXNlIDM6bz10W2krMV0sYT10W2krMl0sMTI4PT0oMTkyJm8pJiYxMjg9PSgxOTImYSkmJih1PSgxNSZmKTw8MTJ8KDYzJm8pPDw2fDYzJmEpPjIwNDcmJih1PDU1Mjk2fHx1PjU3MzQzKSYmKGg9dSk7YnJlYWs7Y2FzZSA0Om89dFtpKzFdLGE9dFtpKzJdLHM9dFtpKzNdLDEyOD09KDE5MiZvKSYmMTI4PT0oMTkyJmEpJiYxMjg9PSgxOTImcykmJih1PSgxNSZmKTw8MTh8KDYzJm8pPDwxMnwoNjMmYSk8PDZ8NjMmcyk+NjU1MzUmJnU8MTExNDExMiYmKGg9dSl9bnVsbD09PWg/KGg9NjU1MzMsbD0xKTpoPjY1NTM1JiYoaC09NjU1MzYsbi5wdXNoKGg+Pj4xMCYxMDIzfDU1Mjk2KSxoPTU2MzIwfDEwMjMmaCksbi5wdXNoKGgpLGkrPWx9cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPXQubGVuZ3RoO2lmKGU8PTQwOTYpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLHQpO3ZhciByPSIiLG49MDtmb3IoO248ZTspcis9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsdC5zbGljZShuLG4rPTQwOTYpKTtyZXR1cm4gcn0obil9YXQucG9vbFNpemU9ODE5MixhdC5fYXVnbWVudD1mdW5jdGlvbih0KXtyZXR1cm4gdC5fX3Byb3RvX189YXQucHJvdG90eXBlLHR9LGF0LmZyb209ZnVuY3Rpb24odCxlLHIpe3JldHVybiBzdChudWxsLHQsZSxyKX0sYXQuVFlQRURfQVJSQVlfU1VQUE9SVCYmKGF0LnByb3RvdHlwZS5fX3Byb3RvX189VWludDhBcnJheS5wcm90b3R5cGUsYXQuX19wcm90b19fPVVpbnQ4QXJyYXkpLGF0LmFsbG9jPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gZnVuY3Rpb24odCxlLHIsbil7cmV0dXJuIHV0KGUpLGU8PTA/b3QodCxlKTp2b2lkIDAhPT1yPyJzdHJpbmciPT10eXBlb2Ygbj9vdCh0LGUpLmZpbGwocixuKTpvdCh0LGUpLmZpbGwocik6b3QodCxlKX0obnVsbCx0LGUscil9LGF0LmFsbG9jVW5zYWZlPWZ1bmN0aW9uKHQpe3JldHVybiBmdChudWxsLHQpfSxhdC5hbGxvY1Vuc2FmZVNsb3c9ZnVuY3Rpb24odCl7cmV0dXJuIGZ0KG51bGwsdCl9LGF0LmlzQnVmZmVyPVd0LGF0LmNvbXBhcmU9ZnVuY3Rpb24odCxlKXtpZighY3QodCl8fCFjdChlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudHMgbXVzdCBiZSBCdWZmZXJzIik7aWYodD09PWUpcmV0dXJuIDA7Zm9yKHZhciByPXQubGVuZ3RoLG49ZS5sZW5ndGgsaT0wLG89TWF0aC5taW4ocixuKTtpPG87KytpKWlmKHRbaV0hPT1lW2ldKXtyPXRbaV0sbj1lW2ldO2JyZWFrfXJldHVybiByPG4/LTE6bjxyPzE6MH0sYXQuaXNFbmNvZGluZz1mdW5jdGlvbih0KXtzd2l0Y2goU3RyaW5nKHQpLnRvTG93ZXJDYXNlKCkpe2Nhc2UiaGV4IjpjYXNlInV0ZjgiOmNhc2UidXRmLTgiOmNhc2UiYXNjaWkiOmNhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6Y2FzZSJiYXNlNjQiOmNhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX0sYXQuY29uY2F0PWZ1bmN0aW9uKHQsZSl7aWYoIXJ0KHQpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0IiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTtpZigwPT09dC5sZW5ndGgpcmV0dXJuIGF0LmFsbG9jKDApO3ZhciByO2lmKHZvaWQgMD09PWUpZm9yKGU9MCxyPTA7cjx0Lmxlbmd0aDsrK3IpZSs9dFtyXS5sZW5ndGg7dmFyIG49YXQuYWxsb2NVbnNhZmUoZSksaT0wO2ZvcihyPTA7cjx0Lmxlbmd0aDsrK3Ipe3ZhciBvPXRbcl07aWYoIWN0KG8pKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0IiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTtvLmNvcHkobixpKSxpKz1vLmxlbmd0aH1yZXR1cm4gbn0sYXQuYnl0ZUxlbmd0aD1kdCxhdC5wcm90b3R5cGUuX2lzQnVmZmVyPSEwLGF0LnByb3RvdHlwZS5zd2FwMTY9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmxlbmd0aDtpZih0JTIhPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi1iaXRzIik7Zm9yKHZhciBlPTA7ZTx0O2UrPTIpZ3QodGhpcyxlLGUrMSk7cmV0dXJuIHRoaXN9LGF0LnByb3RvdHlwZS5zd2FwMzI9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmxlbmd0aDtpZih0JTQhPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzIik7Zm9yKHZhciBlPTA7ZTx0O2UrPTQpZ3QodGhpcyxlLGUrMyksZ3QodGhpcyxlKzEsZSsyKTtyZXR1cm4gdGhpc30sYXQucHJvdG90eXBlLnN3YXA2ND1mdW5jdGlvbigpe3ZhciB0PXRoaXMubGVuZ3RoO2lmKHQlOCE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDY0LWJpdHMiKTtmb3IodmFyIGU9MDtlPHQ7ZSs9OClndCh0aGlzLGUsZSs3KSxndCh0aGlzLGUrMSxlKzYpLGd0KHRoaXMsZSsyLGUrNSksZ3QodGhpcyxlKzMsZSs0KTtyZXR1cm4gdGhpc30sYXQucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIHQ9MHx0aGlzLmxlbmd0aDtyZXR1cm4gMD09PXQ/IiI6MD09PWFyZ3VtZW50cy5sZW5ndGg/UnQodGhpcywwLHQpOnB0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sYXQucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbih0KXtpZighY3QodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciIpO3JldHVybiB0aGlzPT09dHx8MD09PWF0LmNvbXBhcmUodGhpcyx0KX0sYXQucHJvdG90eXBlLmluc3BlY3Q9ZnVuY3Rpb24oKXt2YXIgdD0iIjtyZXR1cm4gdGhpcy5sZW5ndGg+MCYmKHQ9dGhpcy50b1N0cmluZygiaGV4IiwwLDUwKS5tYXRjaCgvLnsyfS9nKS5qb2luKCIgIiksdGhpcy5sZW5ndGg+NTAmJih0Kz0iIC4uLiAiKSksIjxCdWZmZXIgIit0KyI+In0sYXQucHJvdG90eXBlLmNvbXBhcmU9ZnVuY3Rpb24odCxlLHIsbixpKXtpZighY3QodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciIpO2lmKHZvaWQgMD09PWUmJihlPTApLHZvaWQgMD09PXImJihyPXQ/dC5sZW5ndGg6MCksdm9pZCAwPT09biYmKG49MCksdm9pZCAwPT09aSYmKGk9dGhpcy5sZW5ndGgpLGU8MHx8cj50Lmxlbmd0aHx8bjwwfHxpPnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJvdXQgb2YgcmFuZ2UgaW5kZXgiKTtpZihuPj1pJiZlPj1yKXJldHVybiAwO2lmKG4+PWkpcmV0dXJuLTE7aWYoZT49cilyZXR1cm4gMTtpZih0aGlzPT09dClyZXR1cm4gMDtmb3IodmFyIG89KGk+Pj49MCktKG4+Pj49MCksYT0ocj4+Pj0wKS0oZT4+Pj0wKSxzPU1hdGgubWluKG8sYSksdT10aGlzLnNsaWNlKG4saSksZj10LnNsaWNlKGUsciksaD0wO2g8czsrK2gpaWYodVtoXSE9PWZbaF0pe289dVtoXSxhPWZbaF07YnJlYWt9cmV0dXJuIG88YT8tMTphPG8/MTowfSxhdC5wcm90b3R5cGUuaW5jbHVkZXM9ZnVuY3Rpb24odCxlLHIpe3JldHVybi0xIT09dGhpcy5pbmRleE9mKHQsZSxyKX0sYXQucHJvdG90eXBlLmluZGV4T2Y9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB5dCh0aGlzLHQsZSxyLCEwKX0sYXQucHJvdG90eXBlLmxhc3RJbmRleE9mPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4geXQodGhpcyx0LGUsciwhMSl9LGF0LnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbih0LGUscixuKXtpZih2b2lkIDA9PT1lKW49InV0ZjgiLHI9dGhpcy5sZW5ndGgsZT0wO2Vsc2UgaWYodm9pZCAwPT09ciYmInN0cmluZyI9PXR5cGVvZiBlKW49ZSxyPXRoaXMubGVuZ3RoLGU9MDtlbHNle2lmKCFpc0Zpbml0ZShlKSl0aHJvdyBuZXcgRXJyb3IoIkJ1ZmZlci53cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXRbLCBsZW5ndGhdKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkIik7ZXw9MCxpc0Zpbml0ZShyKT8ocnw9MCx2b2lkIDA9PT1uJiYobj0idXRmOCIpKToobj1yLHI9dm9pZCAwKX12YXIgaT10aGlzLmxlbmd0aC1lO2lmKCh2b2lkIDA9PT1yfHxyPmkpJiYocj1pKSx0Lmxlbmd0aD4wJiYocjwwfHxlPDApfHxlPnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcyIpO258fChuPSJ1dGY4Iik7Zm9yKHZhciBvPSExOzspc3dpdGNoKG4pe2Nhc2UiaGV4IjpyZXR1cm4gdnQodGhpcyx0LGUscik7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpyZXR1cm4gd3QodGhpcyx0LGUscik7Y2FzZSJhc2NpaSI6cmV0dXJuIG10KHRoaXMsdCxlLHIpO2Nhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIF90KHRoaXMsdCxlLHIpO2Nhc2UiYmFzZTY0IjpyZXR1cm4gU3QodGhpcyx0LGUscik7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiBFdCh0aGlzLHQsZSxyKTtkZWZhdWx0OmlmKG8pdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIituKTtuPSgiIituKS50b0xvd2VyQ2FzZSgpLG89ITB9fSxhdC5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6IkJ1ZmZlciIsZGF0YTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLl9hcnJ8fHRoaXMsMCl9fTtmdW5jdGlvbiBqdCh0LGUscil7dmFyIG49IiI7cj1NYXRoLm1pbih0Lmxlbmd0aCxyKTtmb3IodmFyIGk9ZTtpPHI7KytpKW4rPVN0cmluZy5mcm9tQ2hhckNvZGUoMTI3JnRbaV0pO3JldHVybiBufWZ1bmN0aW9uIFR0KHQsZSxyKXt2YXIgbj0iIjtyPU1hdGgubWluKHQubGVuZ3RoLHIpO2Zvcih2YXIgaT1lO2k8cjsrK2kpbis9U3RyaW5nLmZyb21DaGFyQ29kZSh0W2ldKTtyZXR1cm4gbn1mdW5jdGlvbiBPdCh0LGUscil7dmFyIG49dC5sZW5ndGg7KCFlfHxlPDApJiYoZT0wKSwoIXJ8fHI8MHx8cj5uKSYmKHI9bik7Zm9yKHZhciBpPSIiLG89ZTtvPHI7KytvKWkrPUR0KHRbb10pO3JldHVybiBpfWZ1bmN0aW9uIEF0KHQsZSxyKXtmb3IodmFyIG49dC5zbGljZShlLHIpLGk9IiIsbz0wO288bi5sZW5ndGg7bys9MilpKz1TdHJpbmcuZnJvbUNoYXJDb2RlKG5bb10rMjU2Km5bbysxXSk7cmV0dXJuIGl9ZnVuY3Rpb24gQ3QodCxlLHIpe2lmKHQlMSE9MHx8dDwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJvZmZzZXQgaXMgbm90IHVpbnQiKTtpZih0K2U+cil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCIpfWZ1bmN0aW9uIE10KHQsZSxyLG4saSxvKXtpZighY3QodCkpdGhyb3cgbmV3IFR5cGVFcnJvcignImJ1ZmZlciIgYXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpO2lmKGU+aXx8ZTxvKXRocm93IG5ldyBSYW5nZUVycm9yKCcidmFsdWUiIGFyZ3VtZW50IGlzIG91dCBvZiBib3VuZHMnKTtpZihyK24+dC5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpfWZ1bmN0aW9uIHh0KHQsZSxyLG4pe2U8MCYmKGU9NjU1MzUrZSsxKTtmb3IodmFyIGk9MCxvPU1hdGgubWluKHQubGVuZ3RoLXIsMik7aTxvOysraSl0W3IraV09KGUmMjU1PDw4KihuP2k6MS1pKSk+Pj44KihuP2k6MS1pKX1mdW5jdGlvbiBMdCh0LGUscixuKXtlPDAmJihlPTQyOTQ5NjcyOTUrZSsxKTtmb3IodmFyIGk9MCxvPU1hdGgubWluKHQubGVuZ3RoLXIsNCk7aTxvOysraSl0W3IraV09ZT4+PjgqKG4/aTozLWkpJjI1NX1mdW5jdGlvbiBCdCh0LGUscixuLGksbyl7aWYocituPnQubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKTtpZihyPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpfWZ1bmN0aW9uIFB0KHQsZSxyLG4saSl7cmV0dXJuIGl8fEJ0KHQsMCxyLDQpLHR0KHQsZSxyLG4sMjMsNCkscis0fWZ1bmN0aW9uIFV0KHQsZSxyLG4saSl7cmV0dXJuIGl8fEJ0KHQsMCxyLDgpLHR0KHQsZSxyLG4sNTIsOCkscis4fWF0LnByb3RvdHlwZS5zbGljZT1mdW5jdGlvbih0LGUpe3ZhciByLG49dGhpcy5sZW5ndGg7aWYoKHQ9fn50KTwwPyh0Kz1uKTwwJiYodD0wKTp0Pm4mJih0PW4pLChlPXZvaWQgMD09PWU/bjp+fmUpPDA/KGUrPW4pPDAmJihlPTApOmU+biYmKGU9biksZTx0JiYoZT10KSxhdC5UWVBFRF9BUlJBWV9TVVBQT1JUKShyPXRoaXMuc3ViYXJyYXkodCxlKSkuX19wcm90b19fPWF0LnByb3RvdHlwZTtlbHNle3ZhciBpPWUtdDtyPW5ldyBhdChpLHZvaWQgMCk7Zm9yKHZhciBvPTA7bzxpOysrbylyW29dPXRoaXNbbyt0XX1yZXR1cm4gcn0sYXQucHJvdG90eXBlLnJlYWRVSW50TEU9ZnVuY3Rpb24odCxlLHIpe3R8PTAsZXw9MCxyfHxDdCh0LGUsdGhpcy5sZW5ndGgpO2Zvcih2YXIgbj10aGlzW3RdLGk9MSxvPTA7KytvPGUmJihpKj0yNTYpOyluKz10aGlzW3Qrb10qaTtyZXR1cm4gbn0sYXQucHJvdG90eXBlLnJlYWRVSW50QkU9ZnVuY3Rpb24odCxlLHIpe3R8PTAsZXw9MCxyfHxDdCh0LGUsdGhpcy5sZW5ndGgpO2Zvcih2YXIgbj10aGlzW3QrLS1lXSxpPTE7ZT4wJiYoaSo9MjU2KTspbis9dGhpc1t0Ky0tZV0qaTtyZXR1cm4gbn0sYXQucHJvdG90eXBlLnJlYWRVSW50OD1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxDdCh0LDEsdGhpcy5sZW5ndGgpLHRoaXNbdF19LGF0LnByb3RvdHlwZS5yZWFkVUludDE2TEU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Q3QodCwyLHRoaXMubGVuZ3RoKSx0aGlzW3RdfHRoaXNbdCsxXTw8OH0sYXQucHJvdG90eXBlLnJlYWRVSW50MTZCRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxDdCh0LDIsdGhpcy5sZW5ndGgpLHRoaXNbdF08PDh8dGhpc1t0KzFdfSxhdC5wcm90b3R5cGUucmVhZFVJbnQzMkxFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEN0KHQsNCx0aGlzLmxlbmd0aCksKHRoaXNbdF18dGhpc1t0KzFdPDw4fHRoaXNbdCsyXTw8MTYpKzE2Nzc3MjE2KnRoaXNbdCszXX0sYXQucHJvdG90eXBlLnJlYWRVSW50MzJCRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxDdCh0LDQsdGhpcy5sZW5ndGgpLDE2Nzc3MjE2KnRoaXNbdF0rKHRoaXNbdCsxXTw8MTZ8dGhpc1t0KzJdPDw4fHRoaXNbdCszXSl9LGF0LnByb3RvdHlwZS5yZWFkSW50TEU9ZnVuY3Rpb24odCxlLHIpe3R8PTAsZXw9MCxyfHxDdCh0LGUsdGhpcy5sZW5ndGgpO2Zvcih2YXIgbj10aGlzW3RdLGk9MSxvPTA7KytvPGUmJihpKj0yNTYpOyluKz10aGlzW3Qrb10qaTtyZXR1cm4gbj49KGkqPTEyOCkmJihuLT1NYXRoLnBvdygyLDgqZSkpLG59LGF0LnByb3RvdHlwZS5yZWFkSW50QkU9ZnVuY3Rpb24odCxlLHIpe3R8PTAsZXw9MCxyfHxDdCh0LGUsdGhpcy5sZW5ndGgpO2Zvcih2YXIgbj1lLGk9MSxvPXRoaXNbdCstLW5dO24+MCYmKGkqPTI1Nik7KW8rPXRoaXNbdCstLW5dKmk7cmV0dXJuIG8+PShpKj0xMjgpJiYoby09TWF0aC5wb3coMiw4KmUpKSxvfSxhdC5wcm90b3R5cGUucmVhZEludDg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Q3QodCwxLHRoaXMubGVuZ3RoKSwxMjgmdGhpc1t0XT8tMSooMjU1LXRoaXNbdF0rMSk6dGhpc1t0XX0sYXQucHJvdG90eXBlLnJlYWRJbnQxNkxFPWZ1bmN0aW9uKHQsZSl7ZXx8Q3QodCwyLHRoaXMubGVuZ3RoKTt2YXIgcj10aGlzW3RdfHRoaXNbdCsxXTw8ODtyZXR1cm4gMzI3Njgmcj80Mjk0OTAxNzYwfHI6cn0sYXQucHJvdG90eXBlLnJlYWRJbnQxNkJFPWZ1bmN0aW9uKHQsZSl7ZXx8Q3QodCwyLHRoaXMubGVuZ3RoKTt2YXIgcj10aGlzW3QrMV18dGhpc1t0XTw8ODtyZXR1cm4gMzI3Njgmcj80Mjk0OTAxNzYwfHI6cn0sYXQucHJvdG90eXBlLnJlYWRJbnQzMkxFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEN0KHQsNCx0aGlzLmxlbmd0aCksdGhpc1t0XXx0aGlzW3QrMV08PDh8dGhpc1t0KzJdPDwxNnx0aGlzW3QrM108PDI0fSxhdC5wcm90b3R5cGUucmVhZEludDMyQkU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Q3QodCw0LHRoaXMubGVuZ3RoKSx0aGlzW3RdPDwyNHx0aGlzW3QrMV08PDE2fHRoaXNbdCsyXTw8OHx0aGlzW3QrM119LGF0LnByb3RvdHlwZS5yZWFkRmxvYXRMRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxDdCh0LDQsdGhpcy5sZW5ndGgpLFEodGhpcyx0LCEwLDIzLDQpfSxhdC5wcm90b3R5cGUucmVhZEZsb2F0QkU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Q3QodCw0LHRoaXMubGVuZ3RoKSxRKHRoaXMsdCwhMSwyMyw0KX0sYXQucHJvdG90eXBlLnJlYWREb3VibGVMRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxDdCh0LDgsdGhpcy5sZW5ndGgpLFEodGhpcyx0LCEwLDUyLDgpfSxhdC5wcm90b3R5cGUucmVhZERvdWJsZUJFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEN0KHQsOCx0aGlzLmxlbmd0aCksUSh0aGlzLHQsITEsNTIsOCl9LGF0LnByb3RvdHlwZS53cml0ZVVJbnRMRT1mdW5jdGlvbih0LGUscixuKXsodD0rdCxlfD0wLHJ8PTAsbil8fE10KHRoaXMsdCxlLHIsTWF0aC5wb3coMiw4KnIpLTEsMCk7dmFyIGk9MSxvPTA7Zm9yKHRoaXNbZV09MjU1JnQ7KytvPHImJihpKj0yNTYpOyl0aGlzW2Urb109dC9pJjI1NTtyZXR1cm4gZStyfSxhdC5wcm90b3R5cGUud3JpdGVVSW50QkU9ZnVuY3Rpb24odCxlLHIsbil7KHQ9K3QsZXw9MCxyfD0wLG4pfHxNdCh0aGlzLHQsZSxyLE1hdGgucG93KDIsOCpyKS0xLDApO3ZhciBpPXItMSxvPTE7Zm9yKHRoaXNbZStpXT0yNTUmdDstLWk+PTAmJihvKj0yNTYpOyl0aGlzW2UraV09dC9vJjI1NTtyZXR1cm4gZStyfSxhdC5wcm90b3R5cGUud3JpdGVVSW50OD1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZXw9MCxyfHxNdCh0aGlzLHQsZSwxLDI1NSwwKSxhdC5UWVBFRF9BUlJBWV9TVVBQT1JUfHwodD1NYXRoLmZsb29yKHQpKSx0aGlzW2VdPTI1NSZ0LGUrMX0sYXQucHJvdG90eXBlLndyaXRlVUludDE2TEU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGV8PTAscnx8TXQodGhpcyx0LGUsMiw2NTUzNSwwKSxhdC5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPTI1NSZ0LHRoaXNbZSsxXT10Pj4+OCk6eHQodGhpcyx0LGUsITApLGUrMn0sYXQucHJvdG90eXBlLndyaXRlVUludDE2QkU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGV8PTAscnx8TXQodGhpcyx0LGUsMiw2NTUzNSwwKSxhdC5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPXQ+Pj44LHRoaXNbZSsxXT0yNTUmdCk6eHQodGhpcyx0LGUsITEpLGUrMn0sYXQucHJvdG90eXBlLndyaXRlVUludDMyTEU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGV8PTAscnx8TXQodGhpcyx0LGUsNCw0Mjk0OTY3Mjk1LDApLGF0LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZSszXT10Pj4+MjQsdGhpc1tlKzJdPXQ+Pj4xNix0aGlzW2UrMV09dD4+PjgsdGhpc1tlXT0yNTUmdCk6THQodGhpcyx0LGUsITApLGUrNH0sYXQucHJvdG90eXBlLndyaXRlVUludDMyQkU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGV8PTAscnx8TXQodGhpcyx0LGUsNCw0Mjk0OTY3Mjk1LDApLGF0LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09dD4+PjI0LHRoaXNbZSsxXT10Pj4+MTYsdGhpc1tlKzJdPXQ+Pj44LHRoaXNbZSszXT0yNTUmdCk6THQodGhpcyx0LGUsITEpLGUrNH0sYXQucHJvdG90eXBlLndyaXRlSW50TEU9ZnVuY3Rpb24odCxlLHIsbil7aWYodD0rdCxlfD0wLCFuKXt2YXIgaT1NYXRoLnBvdygyLDgqci0xKTtNdCh0aGlzLHQsZSxyLGktMSwtaSl9dmFyIG89MCxhPTEscz0wO2Zvcih0aGlzW2VdPTI1NSZ0OysrbzxyJiYoYSo9MjU2KTspdDwwJiYwPT09cyYmMCE9PXRoaXNbZStvLTFdJiYocz0xKSx0aGlzW2Urb109KHQvYT4+MCktcyYyNTU7cmV0dXJuIGUrcn0sYXQucHJvdG90eXBlLndyaXRlSW50QkU9ZnVuY3Rpb24odCxlLHIsbil7aWYodD0rdCxlfD0wLCFuKXt2YXIgaT1NYXRoLnBvdygyLDgqci0xKTtNdCh0aGlzLHQsZSxyLGktMSwtaSl9dmFyIG89ci0xLGE9MSxzPTA7Zm9yKHRoaXNbZStvXT0yNTUmdDstLW8+PTAmJihhKj0yNTYpOyl0PDAmJjA9PT1zJiYwIT09dGhpc1tlK28rMV0mJihzPTEpLHRoaXNbZStvXT0odC9hPj4wKS1zJjI1NTtyZXR1cm4gZStyfSxhdC5wcm90b3R5cGUud3JpdGVJbnQ4PWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fE10KHRoaXMsdCxlLDEsMTI3LC0xMjgpLGF0LlRZUEVEX0FSUkFZX1NVUFBPUlR8fCh0PU1hdGguZmxvb3IodCkpLHQ8MCYmKHQ9MjU1K3QrMSksdGhpc1tlXT0yNTUmdCxlKzF9LGF0LnByb3RvdHlwZS53cml0ZUludDE2TEU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGV8PTAscnx8TXQodGhpcyx0LGUsMiwzMjc2NywtMzI3NjgpLGF0LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09MjU1JnQsdGhpc1tlKzFdPXQ+Pj44KTp4dCh0aGlzLHQsZSwhMCksZSsyfSxhdC5wcm90b3R5cGUud3JpdGVJbnQxNkJFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fE10KHRoaXMsdCxlLDIsMzI3NjcsLTMyNzY4KSxhdC5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPXQ+Pj44LHRoaXNbZSsxXT0yNTUmdCk6eHQodGhpcyx0LGUsITEpLGUrMn0sYXQucHJvdG90eXBlLndyaXRlSW50MzJMRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZXw9MCxyfHxNdCh0aGlzLHQsZSw0LDIxNDc0ODM2NDcsLTIxNDc0ODM2NDgpLGF0LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09MjU1JnQsdGhpc1tlKzFdPXQ+Pj44LHRoaXNbZSsyXT10Pj4+MTYsdGhpc1tlKzNdPXQ+Pj4yNCk6THQodGhpcyx0LGUsITApLGUrNH0sYXQucHJvdG90eXBlLndyaXRlSW50MzJCRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZXw9MCxyfHxNdCh0aGlzLHQsZSw0LDIxNDc0ODM2NDcsLTIxNDc0ODM2NDgpLHQ8MCYmKHQ9NDI5NDk2NzI5NSt0KzEpLGF0LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09dD4+PjI0LHRoaXNbZSsxXT10Pj4+MTYsdGhpc1tlKzJdPXQ+Pj44LHRoaXNbZSszXT0yNTUmdCk6THQodGhpcyx0LGUsITEpLGUrNH0sYXQucHJvdG90eXBlLndyaXRlRmxvYXRMRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIFB0KHRoaXMsdCxlLCEwLHIpfSxhdC5wcm90b3R5cGUud3JpdGVGbG9hdEJFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gUHQodGhpcyx0LGUsITEscil9LGF0LnByb3RvdHlwZS53cml0ZURvdWJsZUxFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gVXQodGhpcyx0LGUsITAscil9LGF0LnByb3RvdHlwZS53cml0ZURvdWJsZUJFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gVXQodGhpcyx0LGUsITEscil9LGF0LnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKHQsZSxyLG4pe2lmKHJ8fChyPTApLG58fDA9PT1ufHwobj10aGlzLmxlbmd0aCksZT49dC5sZW5ndGgmJihlPXQubGVuZ3RoKSxlfHwoZT0wKSxuPjAmJm48ciYmKG49ciksbj09PXIpcmV0dXJuIDA7aWYoMD09PXQubGVuZ3RofHwwPT09dGhpcy5sZW5ndGgpcmV0dXJuIDA7aWYoZTwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJ0YXJnZXRTdGFydCBvdXQgb2YgYm91bmRzIik7aWYocjwwfHxyPj10aGlzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigic291cmNlU3RhcnQgb3V0IG9mIGJvdW5kcyIpO2lmKG48MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigic291cmNlRW5kIG91dCBvZiBib3VuZHMiKTtuPnRoaXMubGVuZ3RoJiYobj10aGlzLmxlbmd0aCksdC5sZW5ndGgtZTxuLXImJihuPXQubGVuZ3RoLWUrcik7dmFyIGksbz1uLXI7aWYodGhpcz09PXQmJnI8ZSYmZTxuKWZvcihpPW8tMTtpPj0wOy0taSl0W2krZV09dGhpc1tpK3JdO2Vsc2UgaWYobzwxZTN8fCFhdC5UWVBFRF9BUlJBWV9TVVBQT1JUKWZvcihpPTA7aTxvOysraSl0W2krZV09dGhpc1tpK3JdO2Vsc2UgVWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwodCx0aGlzLnN1YmFycmF5KHIscitvKSxlKTtyZXR1cm4gb30sYXQucHJvdG90eXBlLmZpbGw9ZnVuY3Rpb24odCxlLHIsbil7aWYoInN0cmluZyI9PXR5cGVvZiB0KXtpZigic3RyaW5nIj09dHlwZW9mIGU/KG49ZSxlPTAscj10aGlzLmxlbmd0aCk6InN0cmluZyI9PXR5cGVvZiByJiYobj1yLHI9dGhpcy5sZW5ndGgpLDE9PT10Lmxlbmd0aCl7dmFyIGk9dC5jaGFyQ29kZUF0KDApO2k8MjU2JiYodD1pKX1pZih2b2lkIDAhPT1uJiYic3RyaW5nIiE9dHlwZW9mIG4pdGhyb3cgbmV3IFR5cGVFcnJvcigiZW5jb2RpbmcgbXVzdCBiZSBhIHN0cmluZyIpO2lmKCJzdHJpbmciPT10eXBlb2YgbiYmIWF0LmlzRW5jb2RpbmcobikpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIituKX1lbHNlIm51bWJlciI9PXR5cGVvZiB0JiYodCY9MjU1KTtpZihlPDB8fHRoaXMubGVuZ3RoPGV8fHRoaXMubGVuZ3RoPHIpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk91dCBvZiByYW5nZSBpbmRleCIpO2lmKHI8PWUpcmV0dXJuIHRoaXM7dmFyIG87aWYoZT4+Pj0wLHI9dm9pZCAwPT09cj90aGlzLmxlbmd0aDpyPj4+MCx0fHwodD0wKSwibnVtYmVyIj09dHlwZW9mIHQpZm9yKG89ZTtvPHI7KytvKXRoaXNbb109dDtlbHNle3ZhciBhPWN0KHQpP3Q6SXQobmV3IGF0KHQsbikudG9TdHJpbmcoKSkscz1hLmxlbmd0aDtmb3Iobz0wO288ci1lOysrbyl0aGlzW28rZV09YVtvJXNdfXJldHVybiB0aGlzfTt2YXIgTnQ9L1teK1wvMC05QS1aYS16LV9dL2c7ZnVuY3Rpb24gRHQodCl7cmV0dXJuIHQ8MTY/IjAiK3QudG9TdHJpbmcoMTYpOnQudG9TdHJpbmcoMTYpfWZ1bmN0aW9uIEl0KHQsZSl7dmFyIHI7ZT1lfHwxLzA7Zm9yKHZhciBuPXQubGVuZ3RoLGk9bnVsbCxvPVtdLGE9MDthPG47KythKXtpZigocj10LmNoYXJDb2RlQXQoYSkpPjU1Mjk1JiZyPDU3MzQ0KXtpZighaSl7aWYocj41NjMxOSl7KGUtPTMpPi0xJiZvLnB1c2goMjM5LDE5MSwxODkpO2NvbnRpbnVlfWlmKGErMT09PW4peyhlLT0zKT4tMSYmby5wdXNoKDIzOSwxOTEsMTg5KTtjb250aW51ZX1pPXI7Y29udGludWV9aWYocjw1NjMyMCl7KGUtPTMpPi0xJiZvLnB1c2goMjM5LDE5MSwxODkpLGk9cjtjb250aW51ZX1yPTY1NTM2KyhpLTU1Mjk2PDwxMHxyLTU2MzIwKX1lbHNlIGkmJihlLT0zKT4tMSYmby5wdXNoKDIzOSwxOTEsMTg5KTtpZihpPW51bGwscjwxMjgpe2lmKChlLT0xKTwwKWJyZWFrO28ucHVzaChyKX1lbHNlIGlmKHI8MjA0OCl7aWYoKGUtPTIpPDApYnJlYWs7by5wdXNoKHI+PjZ8MTkyLDYzJnJ8MTI4KX1lbHNlIGlmKHI8NjU1MzYpe2lmKChlLT0zKTwwKWJyZWFrO28ucHVzaChyPj4xMnwyMjQscj4+NiY2M3wxMjgsNjMmcnwxMjgpfWVsc2V7aWYoIShyPDExMTQxMTIpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBjb2RlIHBvaW50Iik7aWYoKGUtPTQpPDApYnJlYWs7by5wdXNoKHI+PjE4fDI0MCxyPj4xMiY2M3wxMjgscj4+NiY2M3wxMjgsNjMmcnwxMjgpfX1yZXR1cm4gb31mdW5jdGlvbiBxdCh0KXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIGUscixuLGksbyxhO1Z8fEsoKTt2YXIgcz10Lmxlbmd0aDtpZihzJTQ+MCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgc3RyaW5nLiBMZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQiKTtvPSI9Ij09PXRbcy0yXT8yOiI9Ij09PXRbcy0xXT8xOjAsYT1uZXcgRygzKnMvNC1vKSxuPW8+MD9zLTQ6czt2YXIgdT0wO2ZvcihlPTAscj0wO2U8bjtlKz00LHIrPTMpaT1KW3QuY2hhckNvZGVBdChlKV08PDE4fEpbdC5jaGFyQ29kZUF0KGUrMSldPDwxMnxKW3QuY2hhckNvZGVBdChlKzIpXTw8NnxKW3QuY2hhckNvZGVBdChlKzMpXSxhW3UrK109aT4+MTYmMjU1LGFbdSsrXT1pPj44JjI1NSxhW3UrK109MjU1Jmk7cmV0dXJuIDI9PT1vPyhpPUpbdC5jaGFyQ29kZUF0KGUpXTw8MnxKW3QuY2hhckNvZGVBdChlKzEpXT4+NCxhW3UrK109MjU1JmkpOjE9PT1vJiYoaT1KW3QuY2hhckNvZGVBdChlKV08PDEwfEpbdC5jaGFyQ29kZUF0KGUrMSldPDw0fEpbdC5jaGFyQ29kZUF0KGUrMildPj4yLGFbdSsrXT1pPj44JjI1NSxhW3UrK109MjU1JmkpLGF9KGZ1bmN0aW9uKHQpe2lmKCh0PWZ1bmN0aW9uKHQpe3JldHVybiB0LnRyaW0/dC50cmltKCk6dC5yZXBsYWNlKC9eXHMrfFxzKyQvZywiIil9KHQpLnJlcGxhY2UoTnQsIiIpKS5sZW5ndGg8MilyZXR1cm4iIjtmb3IoO3QubGVuZ3RoJTQhPTA7KXQrPSI9IjtyZXR1cm4gdH0odCkpfWZ1bmN0aW9uIEZ0KHQsZSxyLG4pe2Zvcih2YXIgaT0wO2k8biYmIShpK3I+PWUubGVuZ3RofHxpPj10Lmxlbmd0aCk7KytpKWVbaStyXT10W2ldO3JldHVybiBpfWZ1bmN0aW9uIFd0KHQpe3JldHVybiBudWxsIT10JiYoISF0Ll9pc0J1ZmZlcnx8enQodCl8fGZ1bmN0aW9uKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0LnJlYWRGbG9hdExFJiYiZnVuY3Rpb24iPT10eXBlb2YgdC5zbGljZSYmenQodC5zbGljZSgwLDApKX0odCkpfWZ1bmN0aW9uIHp0KHQpe3JldHVybiEhdC5jb25zdHJ1Y3RvciYmImZ1bmN0aW9uIj09dHlwZW9mIHQuY29uc3RydWN0b3IuaXNCdWZmZXImJnQuY29uc3RydWN0b3IuaXNCdWZmZXIodCl9dmFyIFl0PVQoT2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsQnVmZmVyOmF0LElOU1BFQ1RfTUFYX0JZVEVTOjUwLFNsb3dCdWZmZXI6ZnVuY3Rpb24odCl7cmV0dXJuK3QhPXQmJih0PTApLGF0LmFsbG9jKCt0KX0saXNCdWZmZXI6V3Qsa01heExlbmd0aDpudH0pKSwkdD1PKChmdW5jdGlvbih0LGUpe3ZhciByPVl0LkJ1ZmZlcjtmdW5jdGlvbiBuKHQsZSl7Zm9yKHZhciByIGluIHQpZVtyXT10W3JdfWZ1bmN0aW9uIGkodCxlLG4pe3JldHVybiByKHQsZSxuKX1yLmZyb20mJnIuYWxsb2MmJnIuYWxsb2NVbnNhZmUmJnIuYWxsb2NVbnNhZmVTbG93P3QuZXhwb3J0cz1ZdDoobihZdCxlKSxlLkJ1ZmZlcj1pKSxuKHIsaSksaS5mcm9tPWZ1bmN0aW9uKHQsZSxuKXtpZigibnVtYmVyIj09dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXIiKTtyZXR1cm4gcih0LGUsbil9LGkuYWxsb2M9ZnVuY3Rpb24odCxlLG4pe2lmKCJudW1iZXIiIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyIik7dmFyIGk9cih0KTtyZXR1cm4gdm9pZCAwIT09ZT8ic3RyaW5nIj09dHlwZW9mIG4/aS5maWxsKGUsbik6aS5maWxsKGUpOmkuZmlsbCgwKSxpfSxpLmFsbG9jVW5zYWZlPWZ1bmN0aW9uKHQpe2lmKCJudW1iZXIiIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyIik7cmV0dXJuIHIodCl9LGkuYWxsb2NVbnNhZmVTbG93PWZ1bmN0aW9uKHQpe2lmKCJudW1iZXIiIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyIik7cmV0dXJuIFl0LlNsb3dCdWZmZXIodCl9fSkpO2Z1bmN0aW9uIEh0KHQpe3JldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9dmFyIEp0PXtpc0FycmF5OmZ1bmN0aW9uKHQpe3JldHVybiBBcnJheS5pc0FycmF5P0FycmF5LmlzQXJyYXkodCk6IltvYmplY3QgQXJyYXldIj09PUh0KHQpfSxpc0Jvb2xlYW46ZnVuY3Rpb24odCl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgdH0saXNOdWxsOmZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT09dH0saXNOdWxsT3JVbmRlZmluZWQ6ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXR9LGlzTnVtYmVyOmZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdH0saXNTdHJpbmc6ZnVuY3Rpb24odCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0fSxpc1N5bWJvbDpmdW5jdGlvbih0KXtyZXR1cm4ic3ltYm9sIj09dHlwZW9mIHR9LGlzVW5kZWZpbmVkOmZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDA9PT10fSxpc1JlZ0V4cDpmdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBSZWdFeHBdIj09PUh0KHQpfSxpc09iamVjdDpmdW5jdGlvbih0KXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQmJm51bGwhPT10fSxpc0RhdGU6ZnVuY3Rpb24odCl7cmV0dXJuIltvYmplY3QgRGF0ZV0iPT09SHQodCl9LGlzRXJyb3I6ZnVuY3Rpb24odCl7cmV0dXJuIltvYmplY3QgRXJyb3JdIj09PUh0KHQpfHx0IGluc3RhbmNlb2YgRXJyb3J9LGlzRnVuY3Rpb246ZnVuY3Rpb24odCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHR9LGlzUHJpbWl0aXZlOmZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT09dHx8ImJvb2xlYW4iPT10eXBlb2YgdHx8Im51bWJlciI9PXR5cGVvZiB0fHwic3RyaW5nIj09dHlwZW9mIHR8fCJzeW1ib2wiPT10eXBlb2YgdHx8dm9pZCAwPT09dH0saXNCdWZmZXI6YXQuaXNCdWZmZXJ9LEd0PU8oKGZ1bmN0aW9uKHQpeyJmdW5jdGlvbiI9PXR5cGVvZiBPYmplY3QuY3JlYXRlP3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe2UmJih0LnN1cGVyXz1lLHQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pKX06dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7aWYoZSl7dC5zdXBlcl89ZTt2YXIgcj1mdW5jdGlvbigpe307ci5wcm90b3R5cGU9ZS5wcm90b3R5cGUsdC5wcm90b3R5cGU9bmV3IHIsdC5wcm90b3R5cGUuY29uc3RydWN0b3I9dH19fSkpLFZ0PSJmdW5jdGlvbiI9PXR5cGVvZiBPYmplY3QuY3JlYXRlP2Z1bmN0aW9uKHQsZSl7dC5zdXBlcl89ZSx0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KX06ZnVuY3Rpb24odCxlKXt0LnN1cGVyXz1lO3ZhciByPWZ1bmN0aW9uKCl7fTtyLnByb3RvdHlwZT1lLnByb3RvdHlwZSx0LnByb3RvdHlwZT1uZXcgcix0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj10fSxLdD0vJVtzZGolXS9nO2Z1bmN0aW9uIFp0KHQpe2lmKCFkZSh0KSl7Zm9yKHZhciBlPVtdLHI9MDtyPGFyZ3VtZW50cy5sZW5ndGg7cisrKWUucHVzaChyZShhcmd1bWVudHNbcl0pKTtyZXR1cm4gZS5qb2luKCIgIil9cj0xO2Zvcih2YXIgbj1hcmd1bWVudHMsaT1uLmxlbmd0aCxvPVN0cmluZyh0KS5yZXBsYWNlKEt0LChmdW5jdGlvbih0KXtpZigiJSUiPT09dClyZXR1cm4iJSI7aWYocj49aSlyZXR1cm4gdDtzd2l0Y2godCl7Y2FzZSIlcyI6cmV0dXJuIFN0cmluZyhuW3IrK10pO2Nhc2UiJWQiOnJldHVybiBOdW1iZXIobltyKytdKTtjYXNlIiVqIjp0cnl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KG5bcisrXSl9Y2F0Y2godCl7cmV0dXJuIltDaXJjdWxhcl0ifWRlZmF1bHQ6cmV0dXJuIHR9fSkpLGE9bltyXTtyPGk7YT1uWysrcl0paGUoYSl8fCFiZShhKT9vKz0iICIrYTpvKz0iICIrcmUoYSk7cmV0dXJuIG99ZnVuY3Rpb24gWHQoZSxyKXtpZihnZSh0LnByb2Nlc3MpKXJldHVybiBmdW5jdGlvbigpe3JldHVybiBYdChlLHIpLmFwcGx5KHRoaXMsYXJndW1lbnRzKX07aWYoITA9PT1SLm5vRGVwcmVjYXRpb24pcmV0dXJuIGU7dmFyIG49ITE7cmV0dXJuIGZ1bmN0aW9uKCl7aWYoIW4pe2lmKFIudGhyb3dEZXByZWNhdGlvbil0aHJvdyBuZXcgRXJyb3Iocik7Ui50cmFjZURlcHJlY2F0aW9uP2NvbnNvbGUudHJhY2Uocik6Y29uc29sZS5lcnJvcihyKSxuPSEwfXJldHVybiBlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19dmFyIFF0LHRlPXt9O2Z1bmN0aW9uIGVlKHQpe2lmKGdlKFF0KSYmKFF0PVIuZW52Lk5PREVfREVCVUd8fCIiKSx0PXQudG9VcHBlckNhc2UoKSwhdGVbdF0paWYobmV3IFJlZ0V4cCgiXFxiIit0KyJcXGIiLCJpIikudGVzdChRdCkpe3RlW3RdPWZ1bmN0aW9uKCl7dmFyIGU9WnQuYXBwbHkobnVsbCxhcmd1bWVudHMpO2NvbnNvbGUuZXJyb3IoIiVzICVkOiAlcyIsdCwwLGUpfX1lbHNlIHRlW3RdPWZ1bmN0aW9uKCl7fTtyZXR1cm4gdGVbdF19ZnVuY3Rpb24gcmUodCxlKXt2YXIgcj17c2VlbjpbXSxzdHlsaXplOmllfTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD49MyYmKHIuZGVwdGg9YXJndW1lbnRzWzJdKSxhcmd1bWVudHMubGVuZ3RoPj00JiYoci5jb2xvcnM9YXJndW1lbnRzWzNdKSxmZShlKT9yLnNob3dIaWRkZW49ZTplJiZPZShyLGUpLGdlKHIuc2hvd0hpZGRlbikmJihyLnNob3dIaWRkZW49ITEpLGdlKHIuZGVwdGgpJiYoci5kZXB0aD0yKSxnZShyLmNvbG9ycykmJihyLmNvbG9ycz0hMSksZ2Uoci5jdXN0b21JbnNwZWN0KSYmKHIuY3VzdG9tSW5zcGVjdD0hMCksci5jb2xvcnMmJihyLnN0eWxpemU9bmUpLG9lKHIsdCxyLmRlcHRoKX1mdW5jdGlvbiBuZSh0LGUpe3ZhciByPXJlLnN0eWxlc1tlXTtyZXR1cm4gcj8iG1siK3JlLmNvbG9yc1tyXVswXSsibSIrdCsiG1siK3JlLmNvbG9yc1tyXVsxXSsibSI6dH1mdW5jdGlvbiBpZSh0LGUpe3JldHVybiB0fWZ1bmN0aW9uIG9lKHQsZSxyKXtpZih0LmN1c3RvbUluc3BlY3QmJmUmJm1lKGUuaW5zcGVjdCkmJmUuaW5zcGVjdCE9PXJlJiYoIWUuY29uc3RydWN0b3J8fGUuY29uc3RydWN0b3IucHJvdG90eXBlIT09ZSkpe3ZhciBuPWUuaW5zcGVjdChyLHQpO3JldHVybiBkZShuKXx8KG49b2UodCxuLHIpKSxufXZhciBpPWZ1bmN0aW9uKHQsZSl7aWYoZ2UoZSkpcmV0dXJuIHQuc3R5bGl6ZSgidW5kZWZpbmVkIiwidW5kZWZpbmVkIik7aWYoZGUoZSkpe3ZhciByPSInIitKU09OLnN0cmluZ2lmeShlKS5yZXBsYWNlKC9eInwiJC9nLCIiKS5yZXBsYWNlKC8nL2csIlxcJyIpLnJlcGxhY2UoL1xcIi9nLCciJykrIiciO3JldHVybiB0LnN0eWxpemUociwic3RyaW5nIil9aWYoY2UoZSkpcmV0dXJuIHQuc3R5bGl6ZSgiIitlLCJudW1iZXIiKTtpZihmZShlKSlyZXR1cm4gdC5zdHlsaXplKCIiK2UsImJvb2xlYW4iKTtpZihoZShlKSlyZXR1cm4gdC5zdHlsaXplKCJudWxsIiwibnVsbCIpfSh0LGUpO2lmKGkpcmV0dXJuIGk7dmFyIG89T2JqZWN0LmtleXMoZSksYT1mdW5jdGlvbih0KXt2YXIgZT17fTtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0LHIpe2VbdF09ITB9KSksZX0obyk7aWYodC5zaG93SGlkZGVuJiYobz1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlKSksd2UoZSkmJihvLmluZGV4T2YoIm1lc3NhZ2UiKT49MHx8by5pbmRleE9mKCJkZXNjcmlwdGlvbiIpPj0wKSlyZXR1cm4gYWUoZSk7aWYoMD09PW8ubGVuZ3RoKXtpZihtZShlKSl7dmFyIHM9ZS5uYW1lPyI6ICIrZS5uYW1lOiIiO3JldHVybiB0LnN0eWxpemUoIltGdW5jdGlvbiIrcysiXSIsInNwZWNpYWwiKX1pZih5ZShlKSlyZXR1cm4gdC5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKSwicmVnZXhwIik7aWYodmUoZSkpcmV0dXJuIHQuc3R5bGl6ZShEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLCJkYXRlIik7aWYod2UoZSkpcmV0dXJuIGFlKGUpfXZhciB1LGY9IiIsaD0hMSxsPVsieyIsIn0iXTsodWUoZSkmJihoPSEwLGw9WyJbIiwiXSJdKSxtZShlKSkmJihmPSIgW0Z1bmN0aW9uIisoZS5uYW1lPyI6ICIrZS5uYW1lOiIiKSsiXSIpO3JldHVybiB5ZShlKSYmKGY9IiAiK1JlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKSksdmUoZSkmJihmPSIgIitEYXRlLnByb3RvdHlwZS50b1VUQ1N0cmluZy5jYWxsKGUpKSx3ZShlKSYmKGY9IiAiK2FlKGUpKSwwIT09by5sZW5ndGh8fGgmJjAhPWUubGVuZ3RoP3I8MD95ZShlKT90LnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLCJyZWdleHAiKTp0LnN0eWxpemUoIltPYmplY3RdIiwic3BlY2lhbCIpOih0LnNlZW4ucHVzaChlKSx1PWg/ZnVuY3Rpb24odCxlLHIsbixpKXtmb3IodmFyIG89W10sYT0wLHM9ZS5sZW5ndGg7YTxzOysrYSlBZShlLFN0cmluZyhhKSk/by5wdXNoKHNlKHQsZSxyLG4sU3RyaW5nKGEpLCEwKSk6by5wdXNoKCIiKTtyZXR1cm4gaS5mb3JFYWNoKChmdW5jdGlvbihpKXtpLm1hdGNoKC9eXGQrJC8pfHxvLnB1c2goc2UodCxlLHIsbixpLCEwKSl9KSksb30odCxlLHIsYSxvKTpvLm1hcCgoZnVuY3Rpb24obil7cmV0dXJuIHNlKHQsZSxyLGEsbixoKX0pKSx0LnNlZW4ucG9wKCksZnVuY3Rpb24odCxlLHIpe2lmKHQucmVkdWNlKChmdW5jdGlvbih0LGUpe3JldHVybiBlLmluZGV4T2YoIlxuIiksdCtlLnJlcGxhY2UoL1x1MDAxYlxbXGRcZD9tL2csIiIpLmxlbmd0aCsxfSksMCk+NjApcmV0dXJuIHJbMF0rKCIiPT09ZT8iIjplKyJcbiAiKSsiICIrdC5qb2luKCIsXG4gICIpKyIgIityWzFdO3JldHVybiByWzBdK2UrIiAiK3Quam9pbigiLCAiKSsiICIrclsxXX0odSxmLGwpKTpsWzBdK2YrbFsxXX1mdW5jdGlvbiBhZSh0KXtyZXR1cm4iWyIrRXJyb3IucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkrIl0ifWZ1bmN0aW9uIHNlKHQsZSxyLG4saSxvKXt2YXIgYSxzLHU7aWYoKHU9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLGkpfHx7dmFsdWU6ZVtpXX0pLmdldD9zPXUuc2V0P3Quc3R5bGl6ZSgiW0dldHRlci9TZXR0ZXJdIiwic3BlY2lhbCIpOnQuc3R5bGl6ZSgiW0dldHRlcl0iLCJzcGVjaWFsIik6dS5zZXQmJihzPXQuc3R5bGl6ZSgiW1NldHRlcl0iLCJzcGVjaWFsIikpLEFlKG4saSl8fChhPSJbIitpKyJdIiksc3x8KHQuc2Vlbi5pbmRleE9mKHUudmFsdWUpPDA/KHM9aGUocik/b2UodCx1LnZhbHVlLG51bGwpOm9lKHQsdS52YWx1ZSxyLTEpKS5pbmRleE9mKCJcbiIpPi0xJiYocz1vP3Muc3BsaXQoIlxuIikubWFwKChmdW5jdGlvbih0KXtyZXR1cm4iICAiK3R9KSkuam9pbigiXG4iKS5zdWJzdHIoMik6IlxuIitzLnNwbGl0KCJcbiIpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIiAgICIrdH0pKS5qb2luKCJcbiIpKTpzPXQuc3R5bGl6ZSgiW0NpcmN1bGFyXSIsInNwZWNpYWwiKSksZ2UoYSkpe2lmKG8mJmkubWF0Y2goL15cZCskLykpcmV0dXJuIHM7KGE9SlNPTi5zdHJpbmdpZnkoIiIraSkpLm1hdGNoKC9eIihbYS16QS1aX11bYS16QS1aXzAtOV0qKSIkLyk/KGE9YS5zdWJzdHIoMSxhLmxlbmd0aC0yKSxhPXQuc3R5bGl6ZShhLCJuYW1lIikpOihhPWEucmVwbGFjZSgvJy9nLCJcXCciKS5yZXBsYWNlKC9cXCIvZywnIicpLnJlcGxhY2UoLyheInwiJCkvZywiJyIpLGE9dC5zdHlsaXplKGEsInN0cmluZyIpKX1yZXR1cm4gYSsiOiAiK3N9ZnVuY3Rpb24gdWUodCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCl9ZnVuY3Rpb24gZmUodCl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgdH1mdW5jdGlvbiBoZSh0KXtyZXR1cm4gbnVsbD09PXR9ZnVuY3Rpb24gbGUodCl7cmV0dXJuIG51bGw9PXR9ZnVuY3Rpb24gY2UodCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0fWZ1bmN0aW9uIGRlKHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdH1mdW5jdGlvbiBwZSh0KXtyZXR1cm4ic3ltYm9sIj09dHlwZW9mIHR9ZnVuY3Rpb24gZ2UodCl7cmV0dXJuIHZvaWQgMD09PXR9ZnVuY3Rpb24geWUodCl7cmV0dXJuIGJlKHQpJiYiW29iamVjdCBSZWdFeHBdIj09PUVlKHQpfWZ1bmN0aW9uIGJlKHQpe3JldHVybiJvYmplY3QiPT10eXBlb2YgdCYmbnVsbCE9PXR9ZnVuY3Rpb24gdmUodCl7cmV0dXJuIGJlKHQpJiYiW29iamVjdCBEYXRlXSI9PT1FZSh0KX1mdW5jdGlvbiB3ZSh0KXtyZXR1cm4gYmUodCkmJigiW29iamVjdCBFcnJvcl0iPT09RWUodCl8fHQgaW5zdGFuY2VvZiBFcnJvcil9ZnVuY3Rpb24gbWUodCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHR9ZnVuY3Rpb24gX2UodCl7cmV0dXJuIG51bGw9PT10fHwiYm9vbGVhbiI9PXR5cGVvZiB0fHwibnVtYmVyIj09dHlwZW9mIHR8fCJzdHJpbmciPT10eXBlb2YgdHx8InN5bWJvbCI9PXR5cGVvZiB0fHx2b2lkIDA9PT10fWZ1bmN0aW9uIFNlKHQpe3JldHVybiBhdC5pc0J1ZmZlcih0KX1mdW5jdGlvbiBFZSh0KXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIGtlKHQpe3JldHVybiB0PDEwPyIwIit0LnRvU3RyaW5nKDEwKTp0LnRvU3RyaW5nKDEwKX1yZS5jb2xvcnM9e2JvbGQ6WzEsMjJdLGl0YWxpYzpbMywyM10sdW5kZXJsaW5lOls0LDI0XSxpbnZlcnNlOls3LDI3XSx3aGl0ZTpbMzcsMzldLGdyZXk6WzkwLDM5XSxibGFjazpbMzAsMzldLGJsdWU6WzM0LDM5XSxjeWFuOlszNiwzOV0sZ3JlZW46WzMyLDM5XSxtYWdlbnRhOlszNSwzOV0scmVkOlszMSwzOV0seWVsbG93OlszMywzOV19LHJlLnN0eWxlcz17c3BlY2lhbDoiY3lhbiIsbnVtYmVyOiJ5ZWxsb3ciLGJvb2xlYW46InllbGxvdyIsdW5kZWZpbmVkOiJncmV5IixudWxsOiJib2xkIixzdHJpbmc6ImdyZWVuIixkYXRlOiJtYWdlbnRhIixyZWdleHA6InJlZCJ9O3ZhciBSZT1bIkphbiIsIkZlYiIsIk1hciIsIkFwciIsIk1heSIsIkp1biIsIkp1bCIsIkF1ZyIsIlNlcCIsIk9jdCIsIk5vdiIsIkRlYyJdO2Z1bmN0aW9uIGplKCl7dmFyIHQ9bmV3IERhdGUsZT1ba2UodC5nZXRIb3VycygpKSxrZSh0LmdldE1pbnV0ZXMoKSksa2UodC5nZXRTZWNvbmRzKCkpXS5qb2luKCI6Iik7cmV0dXJuW3QuZ2V0RGF0ZSgpLFJlW3QuZ2V0TW9udGgoKV0sZV0uam9pbigiICIpfWZ1bmN0aW9uIFRlKCl7Y29uc29sZS5sb2coIiVzIC0gJXMiLGplKCksWnQuYXBwbHkobnVsbCxhcmd1bWVudHMpKX1mdW5jdGlvbiBPZSh0LGUpe2lmKCFlfHwhYmUoZSkpcmV0dXJuIHQ7Zm9yKHZhciByPU9iamVjdC5rZXlzKGUpLG49ci5sZW5ndGg7bi0tOyl0W3Jbbl1dPWVbcltuXV07cmV0dXJuIHR9ZnVuY3Rpb24gQWUodCxlKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsZSl9dmFyIENlPXtpbmhlcml0czpWdCxfZXh0ZW5kOk9lLGxvZzpUZSxpc0J1ZmZlcjpTZSxpc1ByaW1pdGl2ZTpfZSxpc0Z1bmN0aW9uOm1lLGlzRXJyb3I6d2UsaXNEYXRlOnZlLGlzT2JqZWN0OmJlLGlzUmVnRXhwOnllLGlzVW5kZWZpbmVkOmdlLGlzU3ltYm9sOnBlLGlzU3RyaW5nOmRlLGlzTnVtYmVyOmNlLGlzTnVsbE9yVW5kZWZpbmVkOmxlLGlzTnVsbDpoZSxpc0Jvb2xlYW46ZmUsaXNBcnJheTp1ZSxpbnNwZWN0OnJlLGRlcHJlY2F0ZTpYdCxmb3JtYXQ6WnQsZGVidWdsb2c6ZWV9LE1lPVQoT2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsZm9ybWF0Olp0LGRlcHJlY2F0ZTpYdCxkZWJ1Z2xvZzplZSxpbnNwZWN0OnJlLGlzQXJyYXk6dWUsaXNCb29sZWFuOmZlLGlzTnVsbDpoZSxpc051bGxPclVuZGVmaW5lZDpsZSxpc051bWJlcjpjZSxpc1N0cmluZzpkZSxpc1N5bWJvbDpwZSxpc1VuZGVmaW5lZDpnZSxpc1JlZ0V4cDp5ZSxpc09iamVjdDpiZSxpc0RhdGU6dmUsaXNFcnJvcjp3ZSxpc0Z1bmN0aW9uOm1lLGlzUHJpbWl0aXZlOl9lLGlzQnVmZmVyOlNlLGxvZzpUZSxpbmhlcml0czpWdCxfZXh0ZW5kOk9lLGRlZmF1bHQ6Q2V9KSkseGU9TygoZnVuY3Rpb24odCl7dmFyIGU9JHQuQnVmZmVyO3QuZXhwb3J0cz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXshZnVuY3Rpb24odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX0odGhpcyx0KSx0aGlzLmhlYWQ9bnVsbCx0aGlzLnRhaWw9bnVsbCx0aGlzLmxlbmd0aD0wfXJldHVybiB0LnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKHQpe3ZhciBlPXtkYXRhOnQsbmV4dDpudWxsfTt0aGlzLmxlbmd0aD4wP3RoaXMudGFpbC5uZXh0PWU6dGhpcy5oZWFkPWUsdGhpcy50YWlsPWUsKyt0aGlzLmxlbmd0aH0sdC5wcm90b3R5cGUudW5zaGlmdD1mdW5jdGlvbih0KXt2YXIgZT17ZGF0YTp0LG5leHQ6dGhpcy5oZWFkfTswPT09dGhpcy5sZW5ndGgmJih0aGlzLnRhaWw9ZSksdGhpcy5oZWFkPWUsKyt0aGlzLmxlbmd0aH0sdC5wcm90b3R5cGUuc2hpZnQ9ZnVuY3Rpb24oKXtpZigwIT09dGhpcy5sZW5ndGgpe3ZhciB0PXRoaXMuaGVhZC5kYXRhO3JldHVybiAxPT09dGhpcy5sZW5ndGg/dGhpcy5oZWFkPXRoaXMudGFpbD1udWxsOnRoaXMuaGVhZD10aGlzLmhlYWQubmV4dCwtLXRoaXMubGVuZ3RoLHR9fSx0LnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuaGVhZD10aGlzLnRhaWw9bnVsbCx0aGlzLmxlbmd0aD0wfSx0LnByb3RvdHlwZS5qb2luPWZ1bmN0aW9uKHQpe2lmKDA9PT10aGlzLmxlbmd0aClyZXR1cm4iIjtmb3IodmFyIGU9dGhpcy5oZWFkLHI9IiIrZS5kYXRhO2U9ZS5uZXh0OylyKz10K2UuZGF0YTtyZXR1cm4gcn0sdC5wcm90b3R5cGUuY29uY2F0PWZ1bmN0aW9uKHQpe2lmKDA9PT10aGlzLmxlbmd0aClyZXR1cm4gZS5hbGxvYygwKTtpZigxPT09dGhpcy5sZW5ndGgpcmV0dXJuIHRoaXMuaGVhZC5kYXRhO2Zvcih2YXIgcixuLGksbz1lLmFsbG9jVW5zYWZlKHQ+Pj4wKSxhPXRoaXMuaGVhZCxzPTA7YTspcj1hLmRhdGEsbj1vLGk9cyxyLmNvcHkobixpKSxzKz1hLmRhdGEubGVuZ3RoLGE9YS5uZXh0O3JldHVybiBvfSx0fSgpLE1lJiZNZS5pbnNwZWN0JiZNZS5pbnNwZWN0LmN1c3RvbSYmKHQuZXhwb3J0cy5wcm90b3R5cGVbTWUuaW5zcGVjdC5jdXN0b21dPWZ1bmN0aW9uKCl7dmFyIHQ9TWUuaW5zcGVjdCh7bGVuZ3RoOnRoaXMubGVuZ3RofSk7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IubmFtZSsiICIrdH0pfSkpO2Z1bmN0aW9uIExlKHQsZSl7dC5lbWl0KCJlcnJvciIsZSl9dmFyIEJlPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcyxuPXRoaXMuX3JlYWRhYmxlU3RhdGUmJnRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkLGk9dGhpcy5fd3JpdGFibGVTdGF0ZSYmdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQ7cmV0dXJuIG58fGk/KGU/ZSh0KTohdHx8dGhpcy5fd3JpdGFibGVTdGF0ZSYmdGhpcy5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWR8fEEubmV4dFRpY2soTGUsdGhpcyx0KSx0aGlzKToodGhpcy5fcmVhZGFibGVTdGF0ZSYmKHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkPSEwKSx0aGlzLl93cml0YWJsZVN0YXRlJiYodGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQ9ITApLHRoaXMuX2Rlc3Ryb3kodHx8bnVsbCwoZnVuY3Rpb24odCl7IWUmJnQ/KEEubmV4dFRpY2soTGUscix0KSxyLl93cml0YWJsZVN0YXRlJiYoci5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQ9ITApKTplJiZlKHQpfSkpLHRoaXMpfSxQZT1mdW5jdGlvbigpe3RoaXMuX3JlYWRhYmxlU3RhdGUmJih0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZD0hMSx0aGlzLl9yZWFkYWJsZVN0YXRlLnJlYWRpbmc9ITEsdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmRlZD0hMSx0aGlzLl9yZWFkYWJsZVN0YXRlLmVuZEVtaXR0ZWQ9ITEpLHRoaXMuX3dyaXRhYmxlU3RhdGUmJih0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZD0hMSx0aGlzLl93cml0YWJsZVN0YXRlLmVuZGVkPSExLHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kaW5nPSExLHRoaXMuX3dyaXRhYmxlU3RhdGUuZmluaXNoZWQ9ITEsdGhpcy5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQ9ITEpfSxVZT1mdW5jdGlvbih0LGUpe2lmKE5lKCJub0RlcHJlY2F0aW9uIikpcmV0dXJuIHQ7dmFyIHI9ITE7cmV0dXJuIGZ1bmN0aW9uKCl7aWYoIXIpe2lmKE5lKCJ0aHJvd0RlcHJlY2F0aW9uIikpdGhyb3cgbmV3IEVycm9yKGUpO05lKCJ0cmFjZURlcHJlY2F0aW9uIik/Y29uc29sZS50cmFjZShlKTpjb25zb2xlLndhcm4oZSkscj0hMH1yZXR1cm4gdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fTtmdW5jdGlvbiBOZSh0KXt0cnl7aWYoIWoubG9jYWxTdG9yYWdlKXJldHVybiExfWNhdGNoKHQpe3JldHVybiExfXZhciBlPWoubG9jYWxTdG9yYWdlW3RdO3JldHVybiBudWxsIT1lJiYidHJ1ZSI9PT1TdHJpbmcoZSkudG9Mb3dlckNhc2UoKX12YXIgRGU9VmU7ZnVuY3Rpb24gSWUodCl7dmFyIGU9dGhpczt0aGlzLm5leHQ9bnVsbCx0aGlzLmVudHJ5PW51bGwsdGhpcy5maW5pc2g9ZnVuY3Rpb24oKXshZnVuY3Rpb24odCxlLHIpe3ZhciBuPXQuZW50cnk7dC5lbnRyeT1udWxsO2Zvcig7bjspe3ZhciBpPW4uY2FsbGJhY2s7ZS5wZW5kaW5nY2ItLSxpKHIpLG49bi5uZXh0fWUuY29ya2VkUmVxdWVzdHNGcmVlP2UuY29ya2VkUmVxdWVzdHNGcmVlLm5leHQ9dDplLmNvcmtlZFJlcXVlc3RzRnJlZT10fShlLHQpfX12YXIgcWUsRmU9IVIuYnJvd3NlciYmWyJ2MC4xMCIsInYwLjkuIl0uaW5kZXhPZihSLnZlcnNpb24uc2xpY2UoMCw1KSk+LTE/c2V0SW1tZWRpYXRlOkEubmV4dFRpY2s7VmUuV3JpdGFibGVTdGF0ZT1HZTt2YXIgV2U9T2JqZWN0LmNyZWF0ZShKdCk7V2UuaW5oZXJpdHM9R3Q7dmFyIHplLFllPXtkZXByZWNhdGU6VWV9LCRlPSR0LkJ1ZmZlcixIZT1qLlVpbnQ4QXJyYXl8fGZ1bmN0aW9uKCl7fTtmdW5jdGlvbiBKZSgpe31mdW5jdGlvbiBHZSh0LGUpe3Q9dHx8e307dmFyIHI9ZSBpbnN0YW5jZW9mKHFlPXFlfHxucik7dGhpcy5vYmplY3RNb2RlPSEhdC5vYmplY3RNb2RlLHImJih0aGlzLm9iamVjdE1vZGU9dGhpcy5vYmplY3RNb2RlfHwhIXQud3JpdGFibGVPYmplY3RNb2RlKTt2YXIgbj10LmhpZ2hXYXRlck1hcmssaT10LndyaXRhYmxlSGlnaFdhdGVyTWFyayxvPXRoaXMub2JqZWN0TW9kZT8xNjoxNjM4NDt0aGlzLmhpZ2hXYXRlck1hcms9bnx8MD09PW4/bjpyJiYoaXx8MD09PWkpP2k6byx0aGlzLmhpZ2hXYXRlck1hcms9TWF0aC5mbG9vcih0aGlzLmhpZ2hXYXRlck1hcmspLHRoaXMuZmluYWxDYWxsZWQ9ITEsdGhpcy5uZWVkRHJhaW49ITEsdGhpcy5lbmRpbmc9ITEsdGhpcy5lbmRlZD0hMSx0aGlzLmZpbmlzaGVkPSExLHRoaXMuZGVzdHJveWVkPSExO3ZhciBhPSExPT09dC5kZWNvZGVTdHJpbmdzO3RoaXMuZGVjb2RlU3RyaW5ncz0hYSx0aGlzLmRlZmF1bHRFbmNvZGluZz10LmRlZmF1bHRFbmNvZGluZ3x8InV0ZjgiLHRoaXMubGVuZ3RoPTAsdGhpcy53cml0aW5nPSExLHRoaXMuY29ya2VkPTAsdGhpcy5zeW5jPSEwLHRoaXMuYnVmZmVyUHJvY2Vzc2luZz0hMSx0aGlzLm9ud3JpdGU9ZnVuY3Rpb24odCl7IWZ1bmN0aW9uKHQsZSl7dmFyIHI9dC5fd3JpdGFibGVTdGF0ZSxuPXIuc3luYyxpPXIud3JpdGVjYjtpZihmdW5jdGlvbih0KXt0LndyaXRpbmc9ITEsdC53cml0ZWNiPW51bGwsdC5sZW5ndGgtPXQud3JpdGVsZW4sdC53cml0ZWxlbj0wfShyKSxlKSFmdW5jdGlvbih0LGUscixuLGkpey0tZS5wZW5kaW5nY2Iscj8oQS5uZXh0VGljayhpLG4pLEEubmV4dFRpY2soZXIsdCxlKSx0Ll93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZD0hMCx0LmVtaXQoImVycm9yIixuKSk6KGkobiksdC5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQ9ITAsdC5lbWl0KCJlcnJvciIsbiksZXIodCxlKSl9KHQscixuLGUsaSk7ZWxzZXt2YXIgbz1RZShyKTtvfHxyLmNvcmtlZHx8ci5idWZmZXJQcm9jZXNzaW5nfHwhci5idWZmZXJlZFJlcXVlc3R8fFhlKHQsciksbj9GZShaZSx0LHIsbyxpKTpaZSh0LHIsbyxpKX19KGUsdCl9LHRoaXMud3JpdGVjYj1udWxsLHRoaXMud3JpdGVsZW49MCx0aGlzLmJ1ZmZlcmVkUmVxdWVzdD1udWxsLHRoaXMubGFzdEJ1ZmZlcmVkUmVxdWVzdD1udWxsLHRoaXMucGVuZGluZ2NiPTAsdGhpcy5wcmVmaW5pc2hlZD0hMSx0aGlzLmVycm9yRW1pdHRlZD0hMSx0aGlzLmJ1ZmZlcmVkUmVxdWVzdENvdW50PTAsdGhpcy5jb3JrZWRSZXF1ZXN0c0ZyZWU9bmV3IEllKHRoaXMpfWZ1bmN0aW9uIFZlKHQpe2lmKHFlPXFlfHxuciwhKHplLmNhbGwoVmUsdGhpcyl8fHRoaXMgaW5zdGFuY2VvZiBxZSkpcmV0dXJuIG5ldyBWZSh0KTt0aGlzLl93cml0YWJsZVN0YXRlPW5ldyBHZSh0LHRoaXMpLHRoaXMud3JpdGFibGU9ITAsdCYmKCJmdW5jdGlvbiI9PXR5cGVvZiB0LndyaXRlJiYodGhpcy5fd3JpdGU9dC53cml0ZSksImZ1bmN0aW9uIj09dHlwZW9mIHQud3JpdGV2JiYodGhpcy5fd3JpdGV2PXQud3JpdGV2KSwiZnVuY3Rpb24iPT10eXBlb2YgdC5kZXN0cm95JiYodGhpcy5fZGVzdHJveT10LmRlc3Ryb3kpLCJmdW5jdGlvbiI9PXR5cGVvZiB0LmZpbmFsJiYodGhpcy5fZmluYWw9dC5maW5hbCkpLCQuY2FsbCh0aGlzKX1mdW5jdGlvbiBLZSh0LGUscixuLGksbyxhKXtlLndyaXRlbGVuPW4sZS53cml0ZWNiPWEsZS53cml0aW5nPSEwLGUuc3luYz0hMCxyP3QuX3dyaXRldihpLGUub253cml0ZSk6dC5fd3JpdGUoaSxvLGUub253cml0ZSksZS5zeW5jPSExfWZ1bmN0aW9uIFplKHQsZSxyLG4pe3J8fGZ1bmN0aW9uKHQsZSl7MD09PWUubGVuZ3RoJiZlLm5lZWREcmFpbiYmKGUubmVlZERyYWluPSExLHQuZW1pdCgiZHJhaW4iKSl9KHQsZSksZS5wZW5kaW5nY2ItLSxuKCksZXIodCxlKX1mdW5jdGlvbiBYZSh0LGUpe2UuYnVmZmVyUHJvY2Vzc2luZz0hMDt2YXIgcj1lLmJ1ZmZlcmVkUmVxdWVzdDtpZih0Ll93cml0ZXYmJnImJnIubmV4dCl7dmFyIG49ZS5idWZmZXJlZFJlcXVlc3RDb3VudCxpPW5ldyBBcnJheShuKSxvPWUuY29ya2VkUmVxdWVzdHNGcmVlO28uZW50cnk9cjtmb3IodmFyIGE9MCxzPSEwO3I7KWlbYV09cixyLmlzQnVmfHwocz0hMSkscj1yLm5leHQsYSs9MTtpLmFsbEJ1ZmZlcnM9cyxLZSh0LGUsITAsZS5sZW5ndGgsaSwiIixvLmZpbmlzaCksZS5wZW5kaW5nY2IrKyxlLmxhc3RCdWZmZXJlZFJlcXVlc3Q9bnVsbCxvLm5leHQ/KGUuY29ya2VkUmVxdWVzdHNGcmVlPW8ubmV4dCxvLm5leHQ9bnVsbCk6ZS5jb3JrZWRSZXF1ZXN0c0ZyZWU9bmV3IEllKGUpLGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQ9MH1lbHNle2Zvcig7cjspe3ZhciB1PXIuY2h1bmssZj1yLmVuY29kaW5nLGg9ci5jYWxsYmFjaztpZihLZSh0LGUsITEsZS5vYmplY3RNb2RlPzE6dS5sZW5ndGgsdSxmLGgpLHI9ci5uZXh0LGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQtLSxlLndyaXRpbmcpYnJlYWt9bnVsbD09PXImJihlLmxhc3RCdWZmZXJlZFJlcXVlc3Q9bnVsbCl9ZS5idWZmZXJlZFJlcXVlc3Q9cixlLmJ1ZmZlclByb2Nlc3Npbmc9ITF9ZnVuY3Rpb24gUWUodCl7cmV0dXJuIHQuZW5kaW5nJiYwPT09dC5sZW5ndGgmJm51bGw9PT10LmJ1ZmZlcmVkUmVxdWVzdCYmIXQuZmluaXNoZWQmJiF0LndyaXRpbmd9ZnVuY3Rpb24gdHIodCxlKXt0Ll9maW5hbCgoZnVuY3Rpb24ocil7ZS5wZW5kaW5nY2ItLSxyJiZ0LmVtaXQoImVycm9yIixyKSxlLnByZWZpbmlzaGVkPSEwLHQuZW1pdCgicHJlZmluaXNoIiksZXIodCxlKX0pKX1mdW5jdGlvbiBlcih0LGUpe3ZhciByPVFlKGUpO3JldHVybiByJiYoIWZ1bmN0aW9uKHQsZSl7ZS5wcmVmaW5pc2hlZHx8ZS5maW5hbENhbGxlZHx8KCJmdW5jdGlvbiI9PXR5cGVvZiB0Ll9maW5hbD8oZS5wZW5kaW5nY2IrKyxlLmZpbmFsQ2FsbGVkPSEwLEEubmV4dFRpY2sodHIsdCxlKSk6KGUucHJlZmluaXNoZWQ9ITAsdC5lbWl0KCJwcmVmaW5pc2giKSkpfSh0LGUpLDA9PT1lLnBlbmRpbmdjYiYmKGUuZmluaXNoZWQ9ITAsdC5lbWl0KCJmaW5pc2giKSkpLHJ9V2UuaW5oZXJpdHMoVmUsJCksR2UucHJvdG90eXBlLmdldEJ1ZmZlcj1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLmJ1ZmZlcmVkUmVxdWVzdCxlPVtdO3Q7KWUucHVzaCh0KSx0PXQubmV4dDtyZXR1cm4gZX0sZnVuY3Rpb24oKXt0cnl7T2JqZWN0LmRlZmluZVByb3BlcnR5KEdlLnByb3RvdHlwZSwiYnVmZmVyIix7Z2V0OlllLmRlcHJlY2F0ZSgoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRCdWZmZXIoKX0pLCJfd3JpdGFibGVTdGF0ZS5idWZmZXIgaXMgZGVwcmVjYXRlZC4gVXNlIF93cml0YWJsZVN0YXRlLmdldEJ1ZmZlciBpbnN0ZWFkLiIsIkRFUDAwMDMiKX0pfWNhdGNoKHQpe319KCksImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmU3ltYm9sLmhhc0luc3RhbmNlJiYiZnVuY3Rpb24iPT10eXBlb2YgRnVuY3Rpb24ucHJvdG90eXBlW1N5bWJvbC5oYXNJbnN0YW5jZV0/KHplPUZ1bmN0aW9uLnByb3RvdHlwZVtTeW1ib2wuaGFzSW5zdGFuY2VdLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShWZSxTeW1ib2wuaGFzSW5zdGFuY2Use3ZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiEhemUuY2FsbCh0aGlzLHQpfHx0aGlzPT09VmUmJih0JiZ0Ll93cml0YWJsZVN0YXRlIGluc3RhbmNlb2YgR2UpfX0pKTp6ZT1mdW5jdGlvbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIHRoaXN9LFZlLnByb3RvdHlwZS5waXBlPWZ1bmN0aW9uKCl7dGhpcy5lbWl0KCJlcnJvciIsbmV3IEVycm9yKCJDYW5ub3QgcGlwZSwgbm90IHJlYWRhYmxlIikpfSxWZS5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXRoaXMuX3dyaXRhYmxlU3RhdGUsaT0hMSxvPSFuLm9iamVjdE1vZGUmJmZ1bmN0aW9uKHQpe3JldHVybiAkZS5pc0J1ZmZlcih0KXx8dCBpbnN0YW5jZW9mIEhlfSh0KTtyZXR1cm4gbyYmISRlLmlzQnVmZmVyKHQpJiYodD1mdW5jdGlvbih0KXtyZXR1cm4gJGUuZnJvbSh0KX0odCkpLCJmdW5jdGlvbiI9PXR5cGVvZiBlJiYocj1lLGU9bnVsbCksbz9lPSJidWZmZXIiOmV8fChlPW4uZGVmYXVsdEVuY29kaW5nKSwiZnVuY3Rpb24iIT10eXBlb2YgciYmKHI9SmUpLG4uZW5kZWQ/ZnVuY3Rpb24odCxlKXt2YXIgcj1uZXcgRXJyb3IoIndyaXRlIGFmdGVyIGVuZCIpO3QuZW1pdCgiZXJyb3IiLHIpLEEubmV4dFRpY2soZSxyKX0odGhpcyxyKToob3x8ZnVuY3Rpb24odCxlLHIsbil7dmFyIGk9ITAsbz0hMTtyZXR1cm4gbnVsbD09PXI/bz1uZXcgVHlwZUVycm9yKCJNYXkgbm90IHdyaXRlIG51bGwgdmFsdWVzIHRvIHN0cmVhbSIpOiJzdHJpbmciPT10eXBlb2Ygcnx8dm9pZCAwPT09cnx8ZS5vYmplY3RNb2RlfHwobz1uZXcgVHlwZUVycm9yKCJJbnZhbGlkIG5vbi1zdHJpbmcvYnVmZmVyIGNodW5rIikpLG8mJih0LmVtaXQoImVycm9yIixvKSxBLm5leHRUaWNrKG4sbyksaT0hMSksaX0odGhpcyxuLHQscikpJiYobi5wZW5kaW5nY2IrKyxpPWZ1bmN0aW9uKHQsZSxyLG4saSxvKXtpZighcil7dmFyIGE9ZnVuY3Rpb24odCxlLHIpe3Qub2JqZWN0TW9kZXx8ITE9PT10LmRlY29kZVN0cmluZ3N8fCJzdHJpbmciIT10eXBlb2YgZXx8KGU9JGUuZnJvbShlLHIpKTtyZXR1cm4gZX0oZSxuLGkpO24hPT1hJiYocj0hMCxpPSJidWZmZXIiLG49YSl9dmFyIHM9ZS5vYmplY3RNb2RlPzE6bi5sZW5ndGg7ZS5sZW5ndGgrPXM7dmFyIHU9ZS5sZW5ndGg8ZS5oaWdoV2F0ZXJNYXJrO3V8fChlLm5lZWREcmFpbj0hMCk7aWYoZS53cml0aW5nfHxlLmNvcmtlZCl7dmFyIGY9ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0O2UubGFzdEJ1ZmZlcmVkUmVxdWVzdD17Y2h1bms6bixlbmNvZGluZzppLGlzQnVmOnIsY2FsbGJhY2s6byxuZXh0Om51bGx9LGY/Zi5uZXh0PWUubGFzdEJ1ZmZlcmVkUmVxdWVzdDplLmJ1ZmZlcmVkUmVxdWVzdD1lLmxhc3RCdWZmZXJlZFJlcXVlc3QsZS5idWZmZXJlZFJlcXVlc3RDb3VudCs9MX1lbHNlIEtlKHQsZSwhMSxzLG4saSxvKTtyZXR1cm4gdX0odGhpcyxuLG8sdCxlLHIpKSxpfSxWZS5wcm90b3R5cGUuY29yaz1mdW5jdGlvbigpe3RoaXMuX3dyaXRhYmxlU3RhdGUuY29ya2VkKyt9LFZlLnByb3RvdHlwZS51bmNvcms9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl93cml0YWJsZVN0YXRlO3QuY29ya2VkJiYodC5jb3JrZWQtLSx0LndyaXRpbmd8fHQuY29ya2VkfHx0LmZpbmlzaGVkfHx0LmJ1ZmZlclByb2Nlc3Npbmd8fCF0LmJ1ZmZlcmVkUmVxdWVzdHx8WGUodGhpcyx0KSl9LFZlLnByb3RvdHlwZS5zZXREZWZhdWx0RW5jb2Rpbmc9ZnVuY3Rpb24odCl7aWYoInN0cmluZyI9PXR5cGVvZiB0JiYodD10LnRvTG93ZXJDYXNlKCkpLCEoWyJoZXgiLCJ1dGY4IiwidXRmLTgiLCJhc2NpaSIsImJpbmFyeSIsImJhc2U2NCIsInVjczIiLCJ1Y3MtMiIsInV0ZjE2bGUiLCJ1dGYtMTZsZSIsInJhdyJdLmluZGV4T2YoKHQrIiIpLnRvTG93ZXJDYXNlKCkpPi0xKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK3QpO3JldHVybiB0aGlzLl93cml0YWJsZVN0YXRlLmRlZmF1bHRFbmNvZGluZz10LHRoaXN9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShWZS5wcm90b3R5cGUsIndyaXRhYmxlSGlnaFdhdGVyTWFyayIse2VudW1lcmFibGU6ITEsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUuaGlnaFdhdGVyTWFya319KSxWZS5wcm90b3R5cGUuX3dyaXRlPWZ1bmN0aW9uKHQsZSxyKXtyKG5ldyBFcnJvcigiX3dyaXRlKCkgaXMgbm90IGltcGxlbWVudGVkIikpfSxWZS5wcm90b3R5cGUuX3dyaXRldj1udWxsLFZlLnByb3RvdHlwZS5lbmQ9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXRoaXMuX3dyaXRhYmxlU3RhdGU7ImZ1bmN0aW9uIj09dHlwZW9mIHQ/KHI9dCx0PW51bGwsZT1udWxsKToiZnVuY3Rpb24iPT10eXBlb2YgZSYmKHI9ZSxlPW51bGwpLG51bGwhPXQmJnRoaXMud3JpdGUodCxlKSxuLmNvcmtlZCYmKG4uY29ya2VkPTEsdGhpcy51bmNvcmsoKSksbi5lbmRpbmd8fG4uZmluaXNoZWR8fGZ1bmN0aW9uKHQsZSxyKXtlLmVuZGluZz0hMCxlcih0LGUpLHImJihlLmZpbmlzaGVkP0EubmV4dFRpY2socik6dC5vbmNlKCJmaW5pc2giLHIpKTtlLmVuZGVkPSEwLHQud3JpdGFibGU9ITF9KHRoaXMsbixyKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KFZlLnByb3RvdHlwZSwiZGVzdHJveWVkIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMCE9PXRoaXMuX3dyaXRhYmxlU3RhdGUmJnRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fd3JpdGFibGVTdGF0ZSYmKHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkPXQpfX0pLFZlLnByb3RvdHlwZS5kZXN0cm95PUJlLFZlLnByb3RvdHlwZS5fdW5kZXN0cm95PVBlLFZlLnByb3RvdHlwZS5fZGVzdHJveT1mdW5jdGlvbih0LGUpe3RoaXMuZW5kKCksZSh0KX07dmFyIHJyPU9iamVjdC5rZXlzfHxmdW5jdGlvbih0KXt2YXIgZT1bXTtmb3IodmFyIHIgaW4gdCllLnB1c2gocik7cmV0dXJuIGV9LG5yPXVyLGlyPU9iamVjdC5jcmVhdGUoSnQpO2lyLmluaGVyaXRzPUd0LGlyLmluaGVyaXRzKHVyLFJyKTtmb3IodmFyIG9yPXJyKERlLnByb3RvdHlwZSksYXI9MDthcjxvci5sZW5ndGg7YXIrKyl7dmFyIHNyPW9yW2FyXTt1ci5wcm90b3R5cGVbc3JdfHwodXIucHJvdG90eXBlW3NyXT1EZS5wcm90b3R5cGVbc3JdKX1mdW5jdGlvbiB1cih0KXtpZighKHRoaXMgaW5zdGFuY2VvZiB1cikpcmV0dXJuIG5ldyB1cih0KTtSci5jYWxsKHRoaXMsdCksRGUuY2FsbCh0aGlzLHQpLHQmJiExPT09dC5yZWFkYWJsZSYmKHRoaXMucmVhZGFibGU9ITEpLHQmJiExPT09dC53cml0YWJsZSYmKHRoaXMud3JpdGFibGU9ITEpLHRoaXMuYWxsb3dIYWxmT3Blbj0hMCx0JiYhMT09PXQuYWxsb3dIYWxmT3BlbiYmKHRoaXMuYWxsb3dIYWxmT3Blbj0hMSksdGhpcy5vbmNlKCJlbmQiLGZyKX1mdW5jdGlvbiBmcigpe3RoaXMuYWxsb3dIYWxmT3Blbnx8dGhpcy5fd3JpdGFibGVTdGF0ZS5lbmRlZHx8QS5uZXh0VGljayhocix0aGlzKX1mdW5jdGlvbiBocih0KXt0LmVuZCgpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh1ci5wcm90b3R5cGUsIndyaXRhYmxlSGlnaFdhdGVyTWFyayIse2VudW1lcmFibGU6ITEsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUuaGlnaFdhdGVyTWFya319KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodXIucHJvdG90eXBlLCJkZXN0cm95ZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdm9pZCAwIT09dGhpcy5fcmVhZGFibGVTdGF0ZSYmdm9pZCAwIT09dGhpcy5fd3JpdGFibGVTdGF0ZSYmKHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkJiZ0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZCl9LHNldDpmdW5jdGlvbih0KXt2b2lkIDAhPT10aGlzLl9yZWFkYWJsZVN0YXRlJiZ2b2lkIDAhPT10aGlzLl93cml0YWJsZVN0YXRlJiYodGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQ9dCx0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZD10KX19KSx1ci5wcm90b3R5cGUuX2Rlc3Ryb3k9ZnVuY3Rpb24odCxlKXt0aGlzLnB1c2gobnVsbCksdGhpcy5lbmQoKSxBLm5leHRUaWNrKGUsdCl9O3ZhciBscj0kdC5CdWZmZXIsY3I9bHIuaXNFbmNvZGluZ3x8ZnVuY3Rpb24odCl7c3dpdGNoKCh0PSIiK3QpJiZ0LnRvTG93ZXJDYXNlKCkpe2Nhc2UiaGV4IjpjYXNlInV0ZjgiOmNhc2UidXRmLTgiOmNhc2UiYXNjaWkiOmNhc2UiYmluYXJ5IjpjYXNlImJhc2U2NCI6Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOmNhc2UicmF3IjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX07dmFyIGRyPXByO2Z1bmN0aW9uIHByKHQpe3ZhciBlO3N3aXRjaCh0aGlzLmVuY29kaW5nPWZ1bmN0aW9uKHQpe3ZhciBlPWZ1bmN0aW9uKHQpe2lmKCF0KXJldHVybiJ1dGY4Ijtmb3IodmFyIGU7Oylzd2l0Y2godCl7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpyZXR1cm4idXRmOCI7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiJ1dGYxNmxlIjtjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiJsYXRpbjEiO2Nhc2UiYmFzZTY0IjpjYXNlImFzY2lpIjpjYXNlImhleCI6cmV0dXJuIHQ7ZGVmYXVsdDppZihlKXJldHVybjt0PSgiIit0KS50b0xvd2VyQ2FzZSgpLGU9ITB9fSh0KTtpZigic3RyaW5nIiE9dHlwZW9mIGUmJihsci5pc0VuY29kaW5nPT09Y3J8fCFjcih0KSkpdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK3QpO3JldHVybiBlfHx0fSh0KSx0aGlzLmVuY29kaW5nKXtjYXNlInV0ZjE2bGUiOnRoaXMudGV4dD1icix0aGlzLmVuZD12cixlPTQ7YnJlYWs7Y2FzZSJ1dGY4Ijp0aGlzLmZpbGxMYXN0PXlyLGU9NDticmVhaztjYXNlImJhc2U2NCI6dGhpcy50ZXh0PXdyLHRoaXMuZW5kPW1yLGU9MzticmVhaztkZWZhdWx0OnJldHVybiB0aGlzLndyaXRlPV9yLHZvaWQodGhpcy5lbmQ9U3IpfXRoaXMubGFzdE5lZWQ9MCx0aGlzLmxhc3RUb3RhbD0wLHRoaXMubGFzdENoYXI9bHIuYWxsb2NVbnNhZmUoZSl9ZnVuY3Rpb24gZ3IodCl7cmV0dXJuIHQ8PTEyNz8wOnQ+PjU9PTY/Mjp0Pj40PT0xND8zOnQ+PjM9PTMwPzQ6dD4+Nj09Mj8tMTotMn1mdW5jdGlvbiB5cih0KXt2YXIgZT10aGlzLmxhc3RUb3RhbC10aGlzLmxhc3ROZWVkLHI9ZnVuY3Rpb24odCxlLHIpe2lmKDEyOCE9KDE5MiZlWzBdKSlyZXR1cm4gdC5sYXN0TmVlZD0wLCLvv70iO2lmKHQubGFzdE5lZWQ+MSYmZS5sZW5ndGg+MSl7aWYoMTI4IT0oMTkyJmVbMV0pKXJldHVybiB0Lmxhc3ROZWVkPTEsIu+/vSI7aWYodC5sYXN0TmVlZD4yJiZlLmxlbmd0aD4yJiYxMjghPSgxOTImZVsyXSkpcmV0dXJuIHQubGFzdE5lZWQ9Miwi77+9In19KHRoaXMsdCk7cmV0dXJuIHZvaWQgMCE9PXI/cjp0aGlzLmxhc3ROZWVkPD10Lmxlbmd0aD8odC5jb3B5KHRoaXMubGFzdENoYXIsZSwwLHRoaXMubGFzdE5lZWQpLHRoaXMubGFzdENoYXIudG9TdHJpbmcodGhpcy5lbmNvZGluZywwLHRoaXMubGFzdFRvdGFsKSk6KHQuY29weSh0aGlzLmxhc3RDaGFyLGUsMCx0Lmxlbmd0aCksdm9pZCh0aGlzLmxhc3ROZWVkLT10Lmxlbmd0aCkpfWZ1bmN0aW9uIGJyKHQsZSl7aWYoKHQubGVuZ3RoLWUpJTI9PTApe3ZhciByPXQudG9TdHJpbmcoInV0ZjE2bGUiLGUpO2lmKHIpe3ZhciBuPXIuY2hhckNvZGVBdChyLmxlbmd0aC0xKTtpZihuPj01NTI5NiYmbjw9NTYzMTkpcmV0dXJuIHRoaXMubGFzdE5lZWQ9Mix0aGlzLmxhc3RUb3RhbD00LHRoaXMubGFzdENoYXJbMF09dFt0Lmxlbmd0aC0yXSx0aGlzLmxhc3RDaGFyWzFdPXRbdC5sZW5ndGgtMV0sci5zbGljZSgwLC0xKX1yZXR1cm4gcn1yZXR1cm4gdGhpcy5sYXN0TmVlZD0xLHRoaXMubGFzdFRvdGFsPTIsdGhpcy5sYXN0Q2hhclswXT10W3QubGVuZ3RoLTFdLHQudG9TdHJpbmcoInV0ZjE2bGUiLGUsdC5sZW5ndGgtMSl9ZnVuY3Rpb24gdnIodCl7dmFyIGU9dCYmdC5sZW5ndGg/dGhpcy53cml0ZSh0KToiIjtpZih0aGlzLmxhc3ROZWVkKXt2YXIgcj10aGlzLmxhc3RUb3RhbC10aGlzLmxhc3ROZWVkO3JldHVybiBlK3RoaXMubGFzdENoYXIudG9TdHJpbmcoInV0ZjE2bGUiLDAscil9cmV0dXJuIGV9ZnVuY3Rpb24gd3IodCxlKXt2YXIgcj0odC5sZW5ndGgtZSklMztyZXR1cm4gMD09PXI/dC50b1N0cmluZygiYmFzZTY0IixlKToodGhpcy5sYXN0TmVlZD0zLXIsdGhpcy5sYXN0VG90YWw9MywxPT09cj90aGlzLmxhc3RDaGFyWzBdPXRbdC5sZW5ndGgtMV06KHRoaXMubGFzdENoYXJbMF09dFt0Lmxlbmd0aC0yXSx0aGlzLmxhc3RDaGFyWzFdPXRbdC5sZW5ndGgtMV0pLHQudG9TdHJpbmcoImJhc2U2NCIsZSx0Lmxlbmd0aC1yKSl9ZnVuY3Rpb24gbXIodCl7dmFyIGU9dCYmdC5sZW5ndGg/dGhpcy53cml0ZSh0KToiIjtyZXR1cm4gdGhpcy5sYXN0TmVlZD9lK3RoaXMubGFzdENoYXIudG9TdHJpbmcoImJhc2U2NCIsMCwzLXRoaXMubGFzdE5lZWQpOmV9ZnVuY3Rpb24gX3IodCl7cmV0dXJuIHQudG9TdHJpbmcodGhpcy5lbmNvZGluZyl9ZnVuY3Rpb24gU3IodCl7cmV0dXJuIHQmJnQubGVuZ3RoP3RoaXMud3JpdGUodCk6IiJ9cHIucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKHQpe2lmKDA9PT10Lmxlbmd0aClyZXR1cm4iIjt2YXIgZSxyO2lmKHRoaXMubGFzdE5lZWQpe2lmKHZvaWQgMD09PShlPXRoaXMuZmlsbExhc3QodCkpKXJldHVybiIiO3I9dGhpcy5sYXN0TmVlZCx0aGlzLmxhc3ROZWVkPTB9ZWxzZSByPTA7cmV0dXJuIHI8dC5sZW5ndGg/ZT9lK3RoaXMudGV4dCh0LHIpOnRoaXMudGV4dCh0LHIpOmV8fCIifSxwci5wcm90b3R5cGUuZW5kPWZ1bmN0aW9uKHQpe3ZhciBlPXQmJnQubGVuZ3RoP3RoaXMud3JpdGUodCk6IiI7cmV0dXJuIHRoaXMubGFzdE5lZWQ/ZSsi77+9IjplfSxwci5wcm90b3R5cGUudGV4dD1mdW5jdGlvbih0LGUpe3ZhciByPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1lLmxlbmd0aC0xO2lmKG48cilyZXR1cm4gMDt2YXIgaT1ncihlW25dKTtpZihpPj0wKXJldHVybiBpPjAmJih0Lmxhc3ROZWVkPWktMSksaTtpZigtLW48cnx8LTI9PT1pKXJldHVybiAwO2lmKChpPWdyKGVbbl0pKT49MClyZXR1cm4gaT4wJiYodC5sYXN0TmVlZD1pLTIpLGk7aWYoLS1uPHJ8fC0yPT09aSlyZXR1cm4gMDtpZigoaT1ncihlW25dKSk+PTApcmV0dXJuIGk+MCYmKDI9PT1pP2k9MDp0Lmxhc3ROZWVkPWktMyksaTtyZXR1cm4gMH0odGhpcyx0LGUpO2lmKCF0aGlzLmxhc3ROZWVkKXJldHVybiB0LnRvU3RyaW5nKCJ1dGY4IixlKTt0aGlzLmxhc3RUb3RhbD1yO3ZhciBuPXQubGVuZ3RoLShyLXRoaXMubGFzdE5lZWQpO3JldHVybiB0LmNvcHkodGhpcy5sYXN0Q2hhciwwLG4pLHQudG9TdHJpbmcoInV0ZjgiLGUsbil9LHByLnByb3RvdHlwZS5maWxsTGFzdD1mdW5jdGlvbih0KXtpZih0aGlzLmxhc3ROZWVkPD10Lmxlbmd0aClyZXR1cm4gdC5jb3B5KHRoaXMubGFzdENoYXIsdGhpcy5sYXN0VG90YWwtdGhpcy5sYXN0TmVlZCwwLHRoaXMubGFzdE5lZWQpLHRoaXMubGFzdENoYXIudG9TdHJpbmcodGhpcy5lbmNvZGluZywwLHRoaXMubGFzdFRvdGFsKTt0LmNvcHkodGhpcy5sYXN0Q2hhcix0aGlzLmxhc3RUb3RhbC10aGlzLmxhc3ROZWVkLDAsdC5sZW5ndGgpLHRoaXMubGFzdE5lZWQtPXQubGVuZ3RofTt2YXIgRXIsa3I9e1N0cmluZ0RlY29kZXI6ZHJ9LFJyPUJyO0JyLlJlYWRhYmxlU3RhdGU9THIsWS5FdmVudEVtaXR0ZXI7dmFyIGpyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQubGlzdGVuZXJzKGUpLmxlbmd0aH0sVHI9JHQuQnVmZmVyLE9yPWouVWludDhBcnJheXx8ZnVuY3Rpb24oKXt9O3ZhciBBcj1PYmplY3QuY3JlYXRlKEp0KTtBci5pbmhlcml0cz1HdDt2YXIgQ3IsTXI9dm9pZCAwO01yPU1lJiZNZS5kZWJ1Z2xvZz9NZS5kZWJ1Z2xvZygic3RyZWFtIik6ZnVuY3Rpb24oKXt9LEFyLmluaGVyaXRzKEJyLCQpO3ZhciB4cj1bImVycm9yIiwiY2xvc2UiLCJkZXN0cm95IiwicGF1c2UiLCJyZXN1bWUiXTtmdW5jdGlvbiBMcih0LGUpe3Q9dHx8e307dmFyIHI9ZSBpbnN0YW5jZW9mKEVyPUVyfHxucik7dGhpcy5vYmplY3RNb2RlPSEhdC5vYmplY3RNb2RlLHImJih0aGlzLm9iamVjdE1vZGU9dGhpcy5vYmplY3RNb2RlfHwhIXQucmVhZGFibGVPYmplY3RNb2RlKTt2YXIgbj10LmhpZ2hXYXRlck1hcmssaT10LnJlYWRhYmxlSGlnaFdhdGVyTWFyayxvPXRoaXMub2JqZWN0TW9kZT8xNjoxNjM4NDt0aGlzLmhpZ2hXYXRlck1hcms9bnx8MD09PW4/bjpyJiYoaXx8MD09PWkpP2k6byx0aGlzLmhpZ2hXYXRlck1hcms9TWF0aC5mbG9vcih0aGlzLmhpZ2hXYXRlck1hcmspLHRoaXMuYnVmZmVyPW5ldyB4ZSx0aGlzLmxlbmd0aD0wLHRoaXMucGlwZXM9bnVsbCx0aGlzLnBpcGVzQ291bnQ9MCx0aGlzLmZsb3dpbmc9bnVsbCx0aGlzLmVuZGVkPSExLHRoaXMuZW5kRW1pdHRlZD0hMSx0aGlzLnJlYWRpbmc9ITEsdGhpcy5zeW5jPSEwLHRoaXMubmVlZFJlYWRhYmxlPSExLHRoaXMuZW1pdHRlZFJlYWRhYmxlPSExLHRoaXMucmVhZGFibGVMaXN0ZW5pbmc9ITEsdGhpcy5yZXN1bWVTY2hlZHVsZWQ9ITEsdGhpcy5kZXN0cm95ZWQ9ITEsdGhpcy5kZWZhdWx0RW5jb2Rpbmc9dC5kZWZhdWx0RW5jb2Rpbmd8fCJ1dGY4Iix0aGlzLmF3YWl0RHJhaW49MCx0aGlzLnJlYWRpbmdNb3JlPSExLHRoaXMuZGVjb2Rlcj1udWxsLHRoaXMuZW5jb2Rpbmc9bnVsbCx0LmVuY29kaW5nJiYoQ3J8fChDcj1rci5TdHJpbmdEZWNvZGVyKSx0aGlzLmRlY29kZXI9bmV3IENyKHQuZW5jb2RpbmcpLHRoaXMuZW5jb2Rpbmc9dC5lbmNvZGluZyl9ZnVuY3Rpb24gQnIodCl7aWYoRXI9RXJ8fG5yLCEodGhpcyBpbnN0YW5jZW9mIEJyKSlyZXR1cm4gbmV3IEJyKHQpO3RoaXMuX3JlYWRhYmxlU3RhdGU9bmV3IExyKHQsdGhpcyksdGhpcy5yZWFkYWJsZT0hMCx0JiYoImZ1bmN0aW9uIj09dHlwZW9mIHQucmVhZCYmKHRoaXMuX3JlYWQ9dC5yZWFkKSwiZnVuY3Rpb24iPT10eXBlb2YgdC5kZXN0cm95JiYodGhpcy5fZGVzdHJveT10LmRlc3Ryb3kpKSwkLmNhbGwodGhpcyl9ZnVuY3Rpb24gUHIodCxlLHIsbixpKXt2YXIgbyxhPXQuX3JlYWRhYmxlU3RhdGU7bnVsbD09PWU/KGEucmVhZGluZz0hMSxmdW5jdGlvbih0LGUpe2lmKGUuZW5kZWQpcmV0dXJuO2lmKGUuZGVjb2Rlcil7dmFyIHI9ZS5kZWNvZGVyLmVuZCgpO3ImJnIubGVuZ3RoJiYoZS5idWZmZXIucHVzaChyKSxlLmxlbmd0aCs9ZS5vYmplY3RNb2RlPzE6ci5sZW5ndGgpfWUuZW5kZWQ9ITAsRHIodCl9KHQsYSkpOihpfHwobz1mdW5jdGlvbih0LGUpe3ZhciByOyhmdW5jdGlvbih0KXtyZXR1cm4gVHIuaXNCdWZmZXIodCl8fHQgaW5zdGFuY2VvZiBPcn0pKGUpfHwic3RyaW5nIj09dHlwZW9mIGV8fHZvaWQgMD09PWV8fHQub2JqZWN0TW9kZXx8KHI9bmV3IFR5cGVFcnJvcigiSW52YWxpZCBub24tc3RyaW5nL2J1ZmZlciBjaHVuayIpKTtyZXR1cm4gcn0oYSxlKSksbz90LmVtaXQoImVycm9yIixvKTphLm9iamVjdE1vZGV8fGUmJmUubGVuZ3RoPjA/KCJzdHJpbmciPT10eXBlb2YgZXx8YS5vYmplY3RNb2RlfHxPYmplY3QuZ2V0UHJvdG90eXBlT2YoZSk9PT1Uci5wcm90b3R5cGV8fChlPWZ1bmN0aW9uKHQpe3JldHVybiBUci5mcm9tKHQpfShlKSksbj9hLmVuZEVtaXR0ZWQ/dC5lbWl0KCJlcnJvciIsbmV3IEVycm9yKCJzdHJlYW0udW5zaGlmdCgpIGFmdGVyIGVuZCBldmVudCIpKTpVcih0LGEsZSwhMCk6YS5lbmRlZD90LmVtaXQoImVycm9yIixuZXcgRXJyb3IoInN0cmVhbS5wdXNoKCkgYWZ0ZXIgRU9GIikpOihhLnJlYWRpbmc9ITEsYS5kZWNvZGVyJiYhcj8oZT1hLmRlY29kZXIud3JpdGUoZSksYS5vYmplY3RNb2RlfHwwIT09ZS5sZW5ndGg/VXIodCxhLGUsITEpOnFyKHQsYSkpOlVyKHQsYSxlLCExKSkpOm58fChhLnJlYWRpbmc9ITEpKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIXQuZW5kZWQmJih0Lm5lZWRSZWFkYWJsZXx8dC5sZW5ndGg8dC5oaWdoV2F0ZXJNYXJrfHwwPT09dC5sZW5ndGgpfShhKX1mdW5jdGlvbiBVcih0LGUscixuKXtlLmZsb3dpbmcmJjA9PT1lLmxlbmd0aCYmIWUuc3luYz8odC5lbWl0KCJkYXRhIixyKSx0LnJlYWQoMCkpOihlLmxlbmd0aCs9ZS5vYmplY3RNb2RlPzE6ci5sZW5ndGgsbj9lLmJ1ZmZlci51bnNoaWZ0KHIpOmUuYnVmZmVyLnB1c2gociksZS5uZWVkUmVhZGFibGUmJkRyKHQpKSxxcih0LGUpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShCci5wcm90b3R5cGUsImRlc3Ryb3llZCIse2dldDpmdW5jdGlvbigpe3JldHVybiB2b2lkIDAhPT10aGlzLl9yZWFkYWJsZVN0YXRlJiZ0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZH0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX3JlYWRhYmxlU3RhdGUmJih0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZD10KX19KSxCci5wcm90b3R5cGUuZGVzdHJveT1CZSxCci5wcm90b3R5cGUuX3VuZGVzdHJveT1QZSxCci5wcm90b3R5cGUuX2Rlc3Ryb3k9ZnVuY3Rpb24odCxlKXt0aGlzLnB1c2gobnVsbCksZSh0KX0sQnIucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24odCxlKXt2YXIgcixuPXRoaXMuX3JlYWRhYmxlU3RhdGU7cmV0dXJuIG4ub2JqZWN0TW9kZT9yPSEwOiJzdHJpbmciPT10eXBlb2YgdCYmKChlPWV8fG4uZGVmYXVsdEVuY29kaW5nKSE9PW4uZW5jb2RpbmcmJih0PVRyLmZyb20odCxlKSxlPSIiKSxyPSEwKSxQcih0aGlzLHQsZSwhMSxyKX0sQnIucHJvdG90eXBlLnVuc2hpZnQ9ZnVuY3Rpb24odCl7cmV0dXJuIFByKHRoaXMsdCxudWxsLCEwLCExKX0sQnIucHJvdG90eXBlLmlzUGF1c2VkPWZ1bmN0aW9uKCl7cmV0dXJuITE9PT10aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmd9LEJyLnByb3RvdHlwZS5zZXRFbmNvZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gQ3J8fChDcj1rci5TdHJpbmdEZWNvZGVyKSx0aGlzLl9yZWFkYWJsZVN0YXRlLmRlY29kZXI9bmV3IENyKHQpLHRoaXMuX3JlYWRhYmxlU3RhdGUuZW5jb2Rpbmc9dCx0aGlzfTtmdW5jdGlvbiBOcih0LGUpe3JldHVybiB0PD0wfHwwPT09ZS5sZW5ndGgmJmUuZW5kZWQ/MDplLm9iamVjdE1vZGU/MTp0IT10P2UuZmxvd2luZyYmZS5sZW5ndGg/ZS5idWZmZXIuaGVhZC5kYXRhLmxlbmd0aDplLmxlbmd0aDoodD5lLmhpZ2hXYXRlck1hcmsmJihlLmhpZ2hXYXRlck1hcms9ZnVuY3Rpb24odCl7cmV0dXJuIHQ+PTgzODg2MDg/dD04Mzg4NjA4Oih0LS0sdHw9dD4+PjEsdHw9dD4+PjIsdHw9dD4+PjQsdHw9dD4+PjgsdHw9dD4+PjE2LHQrKyksdH0odCkpLHQ8PWUubGVuZ3RoP3Q6ZS5lbmRlZD9lLmxlbmd0aDooZS5uZWVkUmVhZGFibGU9ITAsMCkpfWZ1bmN0aW9uIERyKHQpe3ZhciBlPXQuX3JlYWRhYmxlU3RhdGU7ZS5uZWVkUmVhZGFibGU9ITEsZS5lbWl0dGVkUmVhZGFibGV8fChNcigiZW1pdFJlYWRhYmxlIixlLmZsb3dpbmcpLGUuZW1pdHRlZFJlYWRhYmxlPSEwLGUuc3luYz9BLm5leHRUaWNrKElyLHQpOklyKHQpKX1mdW5jdGlvbiBJcih0KXtNcigiZW1pdCByZWFkYWJsZSIpLHQuZW1pdCgicmVhZGFibGUiKSxZcih0KX1mdW5jdGlvbiBxcih0LGUpe2UucmVhZGluZ01vcmV8fChlLnJlYWRpbmdNb3JlPSEwLEEubmV4dFRpY2soRnIsdCxlKSl9ZnVuY3Rpb24gRnIodCxlKXtmb3IodmFyIHI9ZS5sZW5ndGg7IWUucmVhZGluZyYmIWUuZmxvd2luZyYmIWUuZW5kZWQmJmUubGVuZ3RoPGUuaGlnaFdhdGVyTWFyayYmKE1yKCJtYXliZVJlYWRNb3JlIHJlYWQgMCIpLHQucmVhZCgwKSxyIT09ZS5sZW5ndGgpOylyPWUubGVuZ3RoO2UucmVhZGluZ01vcmU9ITF9ZnVuY3Rpb24gV3IodCl7TXIoInJlYWRhYmxlIG5leHR0aWNrIHJlYWQgMCIpLHQucmVhZCgwKX1mdW5jdGlvbiB6cih0LGUpe2UucmVhZGluZ3x8KE1yKCJyZXN1bWUgcmVhZCAwIiksdC5yZWFkKDApKSxlLnJlc3VtZVNjaGVkdWxlZD0hMSxlLmF3YWl0RHJhaW49MCx0LmVtaXQoInJlc3VtZSIpLFlyKHQpLGUuZmxvd2luZyYmIWUucmVhZGluZyYmdC5yZWFkKDApfWZ1bmN0aW9uIFlyKHQpe3ZhciBlPXQuX3JlYWRhYmxlU3RhdGU7Zm9yKE1yKCJmbG93IixlLmZsb3dpbmcpO2UuZmxvd2luZyYmbnVsbCE9PXQucmVhZCgpOyk7fWZ1bmN0aW9uICRyKHQsZSl7cmV0dXJuIDA9PT1lLmxlbmd0aD9udWxsOihlLm9iamVjdE1vZGU/cj1lLmJ1ZmZlci5zaGlmdCgpOiF0fHx0Pj1lLmxlbmd0aD8ocj1lLmRlY29kZXI/ZS5idWZmZXIuam9pbigiIik6MT09PWUuYnVmZmVyLmxlbmd0aD9lLmJ1ZmZlci5oZWFkLmRhdGE6ZS5idWZmZXIuY29uY2F0KGUubGVuZ3RoKSxlLmJ1ZmZlci5jbGVhcigpKTpyPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbjt0PGUuaGVhZC5kYXRhLmxlbmd0aD8obj1lLmhlYWQuZGF0YS5zbGljZSgwLHQpLGUuaGVhZC5kYXRhPWUuaGVhZC5kYXRhLnNsaWNlKHQpKTpuPXQ9PT1lLmhlYWQuZGF0YS5sZW5ndGg/ZS5zaGlmdCgpOnI/ZnVuY3Rpb24odCxlKXt2YXIgcj1lLmhlYWQsbj0xLGk9ci5kYXRhO3QtPWkubGVuZ3RoO2Zvcig7cj1yLm5leHQ7KXt2YXIgbz1yLmRhdGEsYT10Pm8ubGVuZ3RoP28ubGVuZ3RoOnQ7aWYoYT09PW8ubGVuZ3RoP2krPW86aSs9by5zbGljZSgwLHQpLDA9PT0odC09YSkpe2E9PT1vLmxlbmd0aD8oKytuLHIubmV4dD9lLmhlYWQ9ci5uZXh0OmUuaGVhZD1lLnRhaWw9bnVsbCk6KGUuaGVhZD1yLHIuZGF0YT1vLnNsaWNlKGEpKTticmVha30rK259cmV0dXJuIGUubGVuZ3RoLT1uLGl9KHQsZSk6ZnVuY3Rpb24odCxlKXt2YXIgcj1Uci5hbGxvY1Vuc2FmZSh0KSxuPWUuaGVhZCxpPTE7bi5kYXRhLmNvcHkociksdC09bi5kYXRhLmxlbmd0aDtmb3IoO249bi5uZXh0Oyl7dmFyIG89bi5kYXRhLGE9dD5vLmxlbmd0aD9vLmxlbmd0aDp0O2lmKG8uY29weShyLHIubGVuZ3RoLXQsMCxhKSwwPT09KHQtPWEpKXthPT09by5sZW5ndGg/KCsraSxuLm5leHQ/ZS5oZWFkPW4ubmV4dDplLmhlYWQ9ZS50YWlsPW51bGwpOihlLmhlYWQ9bixuLmRhdGE9by5zbGljZShhKSk7YnJlYWt9KytpfXJldHVybiBlLmxlbmd0aC09aSxyfSh0LGUpO3JldHVybiBufSh0LGUuYnVmZmVyLGUuZGVjb2Rlcikscik7dmFyIHJ9ZnVuY3Rpb24gSHIodCl7dmFyIGU9dC5fcmVhZGFibGVTdGF0ZTtpZihlLmxlbmd0aD4wKXRocm93IG5ldyBFcnJvcignImVuZFJlYWRhYmxlKCkiIGNhbGxlZCBvbiBub24tZW1wdHkgc3RyZWFtJyk7ZS5lbmRFbWl0dGVkfHwoZS5lbmRlZD0hMCxBLm5leHRUaWNrKEpyLGUsdCkpfWZ1bmN0aW9uIEpyKHQsZSl7dC5lbmRFbWl0dGVkfHwwIT09dC5sZW5ndGh8fCh0LmVuZEVtaXR0ZWQ9ITAsZS5yZWFkYWJsZT0hMSxlLmVtaXQoImVuZCIpKX1mdW5jdGlvbiBHcih0LGUpe2Zvcih2YXIgcj0wLG49dC5sZW5ndGg7cjxuO3IrKylpZih0W3JdPT09ZSlyZXR1cm4gcjtyZXR1cm4tMX1Cci5wcm90b3R5cGUucmVhZD1mdW5jdGlvbih0KXtNcigicmVhZCIsdCksdD1wYXJzZUludCh0LDEwKTt2YXIgZT10aGlzLl9yZWFkYWJsZVN0YXRlLHI9dDtpZigwIT09dCYmKGUuZW1pdHRlZFJlYWRhYmxlPSExKSwwPT09dCYmZS5uZWVkUmVhZGFibGUmJihlLmxlbmd0aD49ZS5oaWdoV2F0ZXJNYXJrfHxlLmVuZGVkKSlyZXR1cm4gTXIoInJlYWQ6IGVtaXRSZWFkYWJsZSIsZS5sZW5ndGgsZS5lbmRlZCksMD09PWUubGVuZ3RoJiZlLmVuZGVkP0hyKHRoaXMpOkRyKHRoaXMpLG51bGw7aWYoMD09PSh0PU5yKHQsZSkpJiZlLmVuZGVkKXJldHVybiAwPT09ZS5sZW5ndGgmJkhyKHRoaXMpLG51bGw7dmFyIG4saT1lLm5lZWRSZWFkYWJsZTtyZXR1cm4gTXIoIm5lZWQgcmVhZGFibGUiLGkpLCgwPT09ZS5sZW5ndGh8fGUubGVuZ3RoLXQ8ZS5oaWdoV2F0ZXJNYXJrKSYmTXIoImxlbmd0aCBsZXNzIHRoYW4gd2F0ZXJtYXJrIixpPSEwKSxlLmVuZGVkfHxlLnJlYWRpbmc/TXIoInJlYWRpbmcgb3IgZW5kZWQiLGk9ITEpOmkmJihNcigiZG8gcmVhZCIpLGUucmVhZGluZz0hMCxlLnN5bmM9ITAsMD09PWUubGVuZ3RoJiYoZS5uZWVkUmVhZGFibGU9ITApLHRoaXMuX3JlYWQoZS5oaWdoV2F0ZXJNYXJrKSxlLnN5bmM9ITEsZS5yZWFkaW5nfHwodD1OcihyLGUpKSksbnVsbD09PShuPXQ+MD8kcih0LGUpOm51bGwpPyhlLm5lZWRSZWFkYWJsZT0hMCx0PTApOmUubGVuZ3RoLT10LDA9PT1lLmxlbmd0aCYmKGUuZW5kZWR8fChlLm5lZWRSZWFkYWJsZT0hMCksciE9PXQmJmUuZW5kZWQmJkhyKHRoaXMpKSxudWxsIT09biYmdGhpcy5lbWl0KCJkYXRhIixuKSxufSxCci5wcm90b3R5cGUuX3JlYWQ9ZnVuY3Rpb24odCl7dGhpcy5lbWl0KCJlcnJvciIsbmV3IEVycm9yKCJfcmVhZCgpIGlzIG5vdCBpbXBsZW1lbnRlZCIpKX0sQnIucHJvdG90eXBlLnBpcGU9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLG49dGhpcy5fcmVhZGFibGVTdGF0ZTtzd2l0Y2gobi5waXBlc0NvdW50KXtjYXNlIDA6bi5waXBlcz10O2JyZWFrO2Nhc2UgMTpuLnBpcGVzPVtuLnBpcGVzLHRdO2JyZWFrO2RlZmF1bHQ6bi5waXBlcy5wdXNoKHQpfW4ucGlwZXNDb3VudCs9MSxNcigicGlwZSBjb3VudD0lZCBvcHRzPSVqIixuLnBpcGVzQ291bnQsZSk7dmFyIGk9KCFlfHwhMSE9PWUuZW5kKSYmdCE9PVIuc3Rkb3V0JiZ0IT09Ui5zdGRlcnI/YTpwO2Z1bmN0aW9uIG8oZSxpKXtNcigib251bnBpcGUiKSxlPT09ciYmaSYmITE9PT1pLmhhc1VucGlwZWQmJihpLmhhc1VucGlwZWQ9ITAsTXIoImNsZWFudXAiKSx0LnJlbW92ZUxpc3RlbmVyKCJjbG9zZSIsYyksdC5yZW1vdmVMaXN0ZW5lcigiZmluaXNoIixkKSx0LnJlbW92ZUxpc3RlbmVyKCJkcmFpbiIscyksdC5yZW1vdmVMaXN0ZW5lcigiZXJyb3IiLGwpLHQucmVtb3ZlTGlzdGVuZXIoInVucGlwZSIsbyksci5yZW1vdmVMaXN0ZW5lcigiZW5kIixhKSxyLnJlbW92ZUxpc3RlbmVyKCJlbmQiLHApLHIucmVtb3ZlTGlzdGVuZXIoImRhdGEiLGgpLHU9ITAsIW4uYXdhaXREcmFpbnx8dC5fd3JpdGFibGVTdGF0ZSYmIXQuX3dyaXRhYmxlU3RhdGUubmVlZERyYWlufHxzKCkpfWZ1bmN0aW9uIGEoKXtNcigib25lbmQiKSx0LmVuZCgpfW4uZW5kRW1pdHRlZD9BLm5leHRUaWNrKGkpOnIub25jZSgiZW5kIixpKSx0Lm9uKCJ1bnBpcGUiLG8pO3ZhciBzPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXQuX3JlYWRhYmxlU3RhdGU7TXIoInBpcGVPbkRyYWluIixlLmF3YWl0RHJhaW4pLGUuYXdhaXREcmFpbiYmZS5hd2FpdERyYWluLS0sMD09PWUuYXdhaXREcmFpbiYmanIodCwiZGF0YSIpJiYoZS5mbG93aW5nPSEwLFlyKHQpKX19KHIpO3Qub24oImRyYWluIixzKTt2YXIgdT0hMTt2YXIgZj0hMTtmdW5jdGlvbiBoKGUpe01yKCJvbmRhdGEiKSxmPSExLCExIT09dC53cml0ZShlKXx8Znx8KCgxPT09bi5waXBlc0NvdW50JiZuLnBpcGVzPT09dHx8bi5waXBlc0NvdW50PjEmJi0xIT09R3Iobi5waXBlcyx0KSkmJiF1JiYoTXIoImZhbHNlIHdyaXRlIHJlc3BvbnNlLCBwYXVzZSIsci5fcmVhZGFibGVTdGF0ZS5hd2FpdERyYWluKSxyLl9yZWFkYWJsZVN0YXRlLmF3YWl0RHJhaW4rKyxmPSEwKSxyLnBhdXNlKCkpfWZ1bmN0aW9uIGwoZSl7TXIoIm9uZXJyb3IiLGUpLHAoKSx0LnJlbW92ZUxpc3RlbmVyKCJlcnJvciIsbCksMD09PWpyKHQsImVycm9yIikmJnQuZW1pdCgiZXJyb3IiLGUpfWZ1bmN0aW9uIGMoKXt0LnJlbW92ZUxpc3RlbmVyKCJmaW5pc2giLGQpLHAoKX1mdW5jdGlvbiBkKCl7TXIoIm9uZmluaXNoIiksdC5yZW1vdmVMaXN0ZW5lcigiY2xvc2UiLGMpLHAoKX1mdW5jdGlvbiBwKCl7TXIoInVucGlwZSIpLHIudW5waXBlKHQpfXJldHVybiByLm9uKCJkYXRhIixoKSxmdW5jdGlvbih0LGUscil7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHQucHJlcGVuZExpc3RlbmVyKXJldHVybiB0LnByZXBlbmRMaXN0ZW5lcihlLHIpO3QuX2V2ZW50cyYmdC5fZXZlbnRzW2VdP00odC5fZXZlbnRzW2VdKT90Ll9ldmVudHNbZV0udW5zaGlmdChyKTp0Ll9ldmVudHNbZV09W3IsdC5fZXZlbnRzW2VdXTp0Lm9uKGUscil9KHQsImVycm9yIixsKSx0Lm9uY2UoImNsb3NlIixjKSx0Lm9uY2UoImZpbmlzaCIsZCksdC5lbWl0KCJwaXBlIixyKSxuLmZsb3dpbmd8fChNcigicGlwZSByZXN1bWUiKSxyLnJlc3VtZSgpKSx0fSxCci5wcm90b3R5cGUudW5waXBlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3JlYWRhYmxlU3RhdGUscj17aGFzVW5waXBlZDohMX07aWYoMD09PWUucGlwZXNDb3VudClyZXR1cm4gdGhpcztpZigxPT09ZS5waXBlc0NvdW50KXJldHVybiB0JiZ0IT09ZS5waXBlc3x8KHR8fCh0PWUucGlwZXMpLGUucGlwZXM9bnVsbCxlLnBpcGVzQ291bnQ9MCxlLmZsb3dpbmc9ITEsdCYmdC5lbWl0KCJ1bnBpcGUiLHRoaXMscikpLHRoaXM7aWYoIXQpe3ZhciBuPWUucGlwZXMsaT1lLnBpcGVzQ291bnQ7ZS5waXBlcz1udWxsLGUucGlwZXNDb3VudD0wLGUuZmxvd2luZz0hMTtmb3IodmFyIG89MDtvPGk7bysrKW5bb10uZW1pdCgidW5waXBlIix0aGlzLHIpO3JldHVybiB0aGlzfXZhciBhPUdyKGUucGlwZXMsdCk7cmV0dXJuLTE9PT1hfHwoZS5waXBlcy5zcGxpY2UoYSwxKSxlLnBpcGVzQ291bnQtPTEsMT09PWUucGlwZXNDb3VudCYmKGUucGlwZXM9ZS5waXBlc1swXSksdC5lbWl0KCJ1bnBpcGUiLHRoaXMscikpLHRoaXN9LEJyLnByb3RvdHlwZS5vbj1mdW5jdGlvbih0LGUpe3ZhciByPSQucHJvdG90eXBlLm9uLmNhbGwodGhpcyx0LGUpO2lmKCJkYXRhIj09PXQpITEhPT10aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcmJnRoaXMucmVzdW1lKCk7ZWxzZSBpZigicmVhZGFibGUiPT09dCl7dmFyIG49dGhpcy5fcmVhZGFibGVTdGF0ZTtuLmVuZEVtaXR0ZWR8fG4ucmVhZGFibGVMaXN0ZW5pbmd8fChuLnJlYWRhYmxlTGlzdGVuaW5nPW4ubmVlZFJlYWRhYmxlPSEwLG4uZW1pdHRlZFJlYWRhYmxlPSExLG4ucmVhZGluZz9uLmxlbmd0aCYmRHIodGhpcyk6QS5uZXh0VGljayhXcix0aGlzKSl9cmV0dXJuIHJ9LEJyLnByb3RvdHlwZS5hZGRMaXN0ZW5lcj1Cci5wcm90b3R5cGUub24sQnIucHJvdG90eXBlLnJlc3VtZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX3JlYWRhYmxlU3RhdGU7cmV0dXJuIHQuZmxvd2luZ3x8KE1yKCJyZXN1bWUiKSx0LmZsb3dpbmc9ITAsZnVuY3Rpb24odCxlKXtlLnJlc3VtZVNjaGVkdWxlZHx8KGUucmVzdW1lU2NoZWR1bGVkPSEwLEEubmV4dFRpY2soenIsdCxlKSl9KHRoaXMsdCkpLHRoaXN9LEJyLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe3JldHVybiBNcigiY2FsbCBwYXVzZSBmbG93aW5nPSVqIix0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcpLCExIT09dGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nJiYoTXIoInBhdXNlIiksdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nPSExLHRoaXMuZW1pdCgicGF1c2UiKSksdGhpc30sQnIucHJvdG90eXBlLndyYXA9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxyPXRoaXMuX3JlYWRhYmxlU3RhdGUsbj0hMTtmb3IodmFyIGkgaW4gdC5vbigiZW5kIiwoZnVuY3Rpb24oKXtpZihNcigid3JhcHBlZCBlbmQiKSxyLmRlY29kZXImJiFyLmVuZGVkKXt2YXIgdD1yLmRlY29kZXIuZW5kKCk7dCYmdC5sZW5ndGgmJmUucHVzaCh0KX1lLnB1c2gobnVsbCl9KSksdC5vbigiZGF0YSIsKGZ1bmN0aW9uKGkpeyhNcigid3JhcHBlZCBkYXRhIiksci5kZWNvZGVyJiYoaT1yLmRlY29kZXIud3JpdGUoaSkpLHIub2JqZWN0TW9kZSYmbnVsbD09aSl8fChyLm9iamVjdE1vZGV8fGkmJmkubGVuZ3RoKSYmKGUucHVzaChpKXx8KG49ITAsdC5wYXVzZSgpKSl9KSksdCl2b2lkIDA9PT10aGlzW2ldJiYiZnVuY3Rpb24iPT10eXBlb2YgdFtpXSYmKHRoaXNbaV09ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRbZV0uYXBwbHkodCxhcmd1bWVudHMpfX0oaSkpO2Zvcih2YXIgbz0wO288eHIubGVuZ3RoO28rKyl0Lm9uKHhyW29dLHRoaXMuZW1pdC5iaW5kKHRoaXMseHJbb10pKTtyZXR1cm4gdGhpcy5fcmVhZD1mdW5jdGlvbihlKXtNcigid3JhcHBlZCBfcmVhZCIsZSksbiYmKG49ITEsdC5yZXN1bWUoKSl9LHRoaXN9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShCci5wcm90b3R5cGUsInJlYWRhYmxlSGlnaFdhdGVyTWFyayIse2VudW1lcmFibGU6ITEsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuaGlnaFdhdGVyTWFya319KSxCci5fZnJvbUxpc3Q9JHI7dmFyIFZyPVhyLEtyPU9iamVjdC5jcmVhdGUoSnQpO2Z1bmN0aW9uIFpyKHQsZSl7dmFyIHI9dGhpcy5fdHJhbnNmb3JtU3RhdGU7ci50cmFuc2Zvcm1pbmc9ITE7dmFyIG49ci53cml0ZWNiO2lmKCFuKXJldHVybiB0aGlzLmVtaXQoImVycm9yIixuZXcgRXJyb3IoIndyaXRlIGNhbGxiYWNrIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyIpKTtyLndyaXRlY2h1bms9bnVsbCxyLndyaXRlY2I9bnVsbCxudWxsIT1lJiZ0aGlzLnB1c2goZSksbih0KTt2YXIgaT10aGlzLl9yZWFkYWJsZVN0YXRlO2kucmVhZGluZz0hMSwoaS5uZWVkUmVhZGFibGV8fGkubGVuZ3RoPGkuaGlnaFdhdGVyTWFyaykmJnRoaXMuX3JlYWQoaS5oaWdoV2F0ZXJNYXJrKX1mdW5jdGlvbiBYcih0KXtpZighKHRoaXMgaW5zdGFuY2VvZiBYcikpcmV0dXJuIG5ldyBYcih0KTtuci5jYWxsKHRoaXMsdCksdGhpcy5fdHJhbnNmb3JtU3RhdGU9e2FmdGVyVHJhbnNmb3JtOlpyLmJpbmQodGhpcyksbmVlZFRyYW5zZm9ybTohMSx0cmFuc2Zvcm1pbmc6ITEsd3JpdGVjYjpudWxsLHdyaXRlY2h1bms6bnVsbCx3cml0ZWVuY29kaW5nOm51bGx9LHRoaXMuX3JlYWRhYmxlU3RhdGUubmVlZFJlYWRhYmxlPSEwLHRoaXMuX3JlYWRhYmxlU3RhdGUuc3luYz0hMSx0JiYoImZ1bmN0aW9uIj09dHlwZW9mIHQudHJhbnNmb3JtJiYodGhpcy5fdHJhbnNmb3JtPXQudHJhbnNmb3JtKSwiZnVuY3Rpb24iPT10eXBlb2YgdC5mbHVzaCYmKHRoaXMuX2ZsdXNoPXQuZmx1c2gpKSx0aGlzLm9uKCJwcmVmaW5pc2giLFFyKX1mdW5jdGlvbiBRcigpe3ZhciB0PXRoaXM7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuX2ZsdXNoP3RoaXMuX2ZsdXNoKChmdW5jdGlvbihlLHIpe3RuKHQsZSxyKX0pKTp0bih0aGlzLG51bGwsbnVsbCl9ZnVuY3Rpb24gdG4odCxlLHIpe2lmKGUpcmV0dXJuIHQuZW1pdCgiZXJyb3IiLGUpO2lmKG51bGwhPXImJnQucHVzaChyKSx0Ll93cml0YWJsZVN0YXRlLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkNhbGxpbmcgdHJhbnNmb3JtIGRvbmUgd2hlbiB3cy5sZW5ndGggIT0gMCIpO2lmKHQuX3RyYW5zZm9ybVN0YXRlLnRyYW5zZm9ybWluZyl0aHJvdyBuZXcgRXJyb3IoIkNhbGxpbmcgdHJhbnNmb3JtIGRvbmUgd2hlbiBzdGlsbCB0cmFuc2Zvcm1pbmciKTtyZXR1cm4gdC5wdXNoKG51bGwpfUtyLmluaGVyaXRzPUd0LEtyLmluaGVyaXRzKFhyLG5yKSxYci5wcm90b3R5cGUucHVzaD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5uZWVkVHJhbnNmb3JtPSExLG5yLnByb3RvdHlwZS5wdXNoLmNhbGwodGhpcyx0LGUpfSxYci5wcm90b3R5cGUuX3RyYW5zZm9ybT1mdW5jdGlvbih0LGUscil7dGhyb3cgbmV3IEVycm9yKCJfdHJhbnNmb3JtKCkgaXMgbm90IGltcGxlbWVudGVkIil9LFhyLnByb3RvdHlwZS5fd3JpdGU9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXRoaXMuX3RyYW5zZm9ybVN0YXRlO2lmKG4ud3JpdGVjYj1yLG4ud3JpdGVjaHVuaz10LG4ud3JpdGVlbmNvZGluZz1lLCFuLnRyYW5zZm9ybWluZyl7dmFyIGk9dGhpcy5fcmVhZGFibGVTdGF0ZTsobi5uZWVkVHJhbnNmb3JtfHxpLm5lZWRSZWFkYWJsZXx8aS5sZW5ndGg8aS5oaWdoV2F0ZXJNYXJrKSYmdGhpcy5fcmVhZChpLmhpZ2hXYXRlck1hcmspfX0sWHIucHJvdG90eXBlLl9yZWFkPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3RyYW5zZm9ybVN0YXRlO251bGwhPT1lLndyaXRlY2h1bmsmJmUud3JpdGVjYiYmIWUudHJhbnNmb3JtaW5nPyhlLnRyYW5zZm9ybWluZz0hMCx0aGlzLl90cmFuc2Zvcm0oZS53cml0ZWNodW5rLGUud3JpdGVlbmNvZGluZyxlLmFmdGVyVHJhbnNmb3JtKSk6ZS5uZWVkVHJhbnNmb3JtPSEwfSxYci5wcm90b3R5cGUuX2Rlc3Ryb3k9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzO25yLnByb3RvdHlwZS5fZGVzdHJveS5jYWxsKHRoaXMsdCwoZnVuY3Rpb24odCl7ZSh0KSxyLmVtaXQoImNsb3NlIil9KSl9O3ZhciBlbj1ubixybj1PYmplY3QuY3JlYXRlKEp0KTtmdW5jdGlvbiBubih0KXtpZighKHRoaXMgaW5zdGFuY2VvZiBubikpcmV0dXJuIG5ldyBubih0KTtWci5jYWxsKHRoaXMsdCl9cm4uaW5oZXJpdHM9R3Qscm4uaW5oZXJpdHMobm4sVnIpLG5uLnByb3RvdHlwZS5fdHJhbnNmb3JtPWZ1bmN0aW9uKHQsZSxyKXtyKG51bGwsdCl9O3ZhciBvbj1PKChmdW5jdGlvbih0LGUpeyhlPXQuZXhwb3J0cz1ScikuU3RyZWFtPWUsZS5SZWFkYWJsZT1lLGUuV3JpdGFibGU9RGUsZS5EdXBsZXg9bnIsZS5UcmFuc2Zvcm09VnIsZS5QYXNzVGhyb3VnaD1lbn0pKS5SZWFkYWJsZSxhbj11bjt1bi5jdG9yPWZuLHVuLm9iaj1mdW5jdGlvbih0LGUpeygiZnVuY3Rpb24iPT10eXBlb2YgdHx8QXJyYXkuaXNBcnJheSh0KSkmJihlPXQsdD17fSk7cmV0dXJuKHQ9bG4odCkpLm9iamVjdE1vZGU9ITAsdC5oaWdoV2F0ZXJNYXJrPTE2LHVuKHQsZSl9O3ZhciBzbj1mbigpO2Z1bmN0aW9uIHVuKHQsZSl7KCJvYmplY3QiIT10eXBlb2YgdHx8QXJyYXkuaXNBcnJheSh0KSkmJihlPXQsdD17fSk7dmFyIHIsbj1uZXcgc24odCk7cmV0dXJuIG4uX2Zyb209QXJyYXkuaXNBcnJheShlKT8ocj0ocj1lKS5zbGljZSgpLGZ1bmN0aW9uKHQsZSl7dmFyIG49bnVsbCxpPXIubGVuZ3RoP3Iuc2hpZnQoKTpudWxsO2kgaW5zdGFuY2VvZiBFcnJvciYmKG49aSxpPW51bGwpLGUobixpKX0pOmV8fGhuLG59ZnVuY3Rpb24gZm4odCxlKXtmdW5jdGlvbiByKGUpe2lmKCEodGhpcyBpbnN0YW5jZW9mIHIpKXJldHVybiBuZXcgcihlKTt0aGlzLl9yZWFkaW5nPSExLHRoaXMuX2NhbGxiYWNrPWZ1bmN0aW9uKHQsZSl7aWYobi5kZXN0cm95ZWQpcmV0dXJuO2lmKHQpcmV0dXJuIG4uZGVzdHJveSh0KTtpZihudWxsPT09ZSlyZXR1cm4gbi5wdXNoKG51bGwpO24uX3JlYWRpbmc9ITEsbi5wdXNoKGUpJiZuLl9yZWFkKGkpfSx0aGlzLmRlc3Ryb3llZD0hMSxvbi5jYWxsKHRoaXMsZXx8dCk7dmFyIG49dGhpcyxpPXRoaXMuX3JlYWRhYmxlU3RhdGUuaGlnaFdhdGVyTWFya31yZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdCYmKGU9dCx0PXt9KSx0PWxuKHQpLEd0KHIsb24pLHIucHJvdG90eXBlLl9mcm9tPWV8fGhuLHIucHJvdG90eXBlLl9yZWFkPWZ1bmN0aW9uKHQpe3RoaXMuX3JlYWRpbmd8fHRoaXMuZGVzdHJveWVkfHwodGhpcy5fcmVhZGluZz0hMCx0aGlzLl9mcm9tKHQsdGhpcy5fY2FsbGJhY2spKX0sci5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbih0KXtpZighdGhpcy5kZXN0cm95ZWQpe3RoaXMuZGVzdHJveWVkPSEwO3ZhciBlPXRoaXM7Ui5uZXh0VGljaygoZnVuY3Rpb24oKXt0JiZlLmVtaXQoImVycm9yIix0KSxlLmVtaXQoImNsb3NlIil9KSl9fSxyfWZ1bmN0aW9uIGhuKCl7fWZ1bmN0aW9uIGxuKHQpe3JldHVybiB0PXR8fHt9fXZhciBjbixkbj0xLHBuPXt9LGduPSExLHluPXQuZG9jdW1lbnQ7ZnVuY3Rpb24gYm4odCl7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PW5ldyBGdW5jdGlvbigiIit0KSk7Zm9yKHZhciBlPW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoLTEpLHI9MDtyPGUubGVuZ3RoO3IrKyllW3JdPWFyZ3VtZW50c1tyKzFdO3ZhciBuPXtjYWxsYmFjazp0LGFyZ3M6ZX07cmV0dXJuIHBuW2RuXT1uLGNuKGRuKSxkbisrfWZ1bmN0aW9uIHZuKHQpe2lmKGduKXNldFRpbWVvdXQodm4sMCx0KTtlbHNle3ZhciBlPXBuW3RdO2lmKGUpe2duPSEwO3RyeXshZnVuY3Rpb24odCl7dmFyIGU9dC5jYWxsYmFjayxyPXQuYXJncztzd2l0Y2goci5sZW5ndGgpe2Nhc2UgMDplKCk7YnJlYWs7Y2FzZSAxOmUoclswXSk7YnJlYWs7Y2FzZSAyOmUoclswXSxyWzFdKTticmVhaztjYXNlIDM6ZShyWzBdLHJbMV0sclsyXSk7YnJlYWs7ZGVmYXVsdDplLmFwcGx5KHZvaWQgMCxyKX19KGUpfWZpbmFsbHl7IWZ1bmN0aW9uKHQpe2RlbGV0ZSBwblt0XX0odCksZ249ITF9fX19dmFyIHduLG1uLF9uLFNuLEVuPU9iamVjdC5nZXRQcm90b3R5cGVPZiYmT2JqZWN0LmdldFByb3RvdHlwZU9mKHQpO2Z1bmN0aW9uIGtuKHQpe2xldCBlLHI9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpO2lmKGU9IltvYmplY3QgUHJvbWlzZV0iPT09cixlKXJldHVybiEwO2lmKCJbb2JqZWN0IEZ1bmN0aW9uXSIhPT1yKXJldHVybiExO3RyeXtlPSJmdW5jdGlvbiIhPXR5cGVvZiB0LnN1YnNjcmliZSYmImZ1bmN0aW9uIj09dHlwZW9mIHQudGhlbn1jYXRjaCh0KXt9cmV0dXJuIGV9ZnVuY3Rpb24gUm4odCl7bGV0IGUscixuO2Z1bmN0aW9uIGkoaSl7KCh0PWkpaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcnx8QXJyYXlCdWZmZXIuaXNWaWV3KHQpJiYhYXQuaXNCdWZmZXIodCkpJiYodD1hdC5mcm9tKHQpKSxlPWtuKHQpP3Q6bnVsbDtjb25zdCBvPSFlJiZ0W1N5bWJvbC5pdGVyYXRvcl0mJiJzdHJpbmciIT10eXBlb2YgdCYmIWF0LmlzQnVmZmVyKHQpO3I9bz90W1N5bWJvbC5pdGVyYXRvcl0oKTpudWxsO2NvbnN0IGE9IWUmJnRbU3ltYm9sLmFzeW5jSXRlcmF0b3JdO249YT90W1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpOm51bGx9cmV0dXJuIEFycmF5LmlzQXJyYXkodCkmJih0PXQuc2xpY2UoKSksaSh0KSxhbigoZnVuY3Rpb24gbyhhLHMpe2lmKGUpcmV0dXJuIHZvaWQoYXN5bmMoKT0+e3RyeXthd2FpdCBpKGF3YWl0IGUpLG8uY2FsbCh0aGlzLGEscyl9Y2F0Y2godCl7cyh0KX19KSgpO2lmKHIpe2NvbnN0IHQ9ci5uZXh0KCk7cmV0dXJuIHZvaWQgYm4ocyxudWxsLHQuZG9uZT9udWxsOnQudmFsdWUpfWlmKG4pcmV0dXJuIHZvaWQoYXN5bmMoKT0+e3RyeXtjb25zdCB0PWF3YWl0IG4ubmV4dCgpO2JuKHMsbnVsbCx0LmRvbmU/bnVsbDp0LnZhbHVlKX1jYXRjaCh0KXtibihzLHQpfX0pKCk7aWYoMD09PXQubGVuZ3RoKXJldHVybiB2b2lkIGJuKHMsbnVsbCxudWxsKTtjb25zdCB1PXQuc2xpY2UoMCxhKTt0PXQuc2xpY2UoYSksYm4ocyxudWxsLHUpfSkpfUVuPUVuJiZFbi5zZXRUaW1lb3V0P0VuOnQsIltvYmplY3QgcHJvY2Vzc10iPT09e30udG9TdHJpbmcuY2FsbCh0LnByb2Nlc3MpP2NuPWZ1bmN0aW9uKHQpe1IubmV4dFRpY2soKGZ1bmN0aW9uKCl7dm4odCl9KSl9OiFmdW5jdGlvbigpe2lmKHQucG9zdE1lc3NhZ2UmJiF0LmltcG9ydFNjcmlwdHMpe3ZhciBlPSEwLHI9dC5vbm1lc3NhZ2U7cmV0dXJuIHQub25tZXNzYWdlPWZ1bmN0aW9uKCl7ZT0hMX0sdC5wb3N0TWVzc2FnZSgiIiwiKiIpLHQub25tZXNzYWdlPXIsZX19KCk/dC5NZXNzYWdlQ2hhbm5lbD8oKG1uPW5ldyBNZXNzYWdlQ2hhbm5lbCkucG9ydDEub25tZXNzYWdlPWZ1bmN0aW9uKHQpe3ZuKHQuZGF0YSl9LGNuPWZ1bmN0aW9uKHQpe21uLnBvcnQyLnBvc3RNZXNzYWdlKHQpfSk6eW4mJiJvbnJlYWR5c3RhdGVjaGFuZ2UiaW4geW4uY3JlYXRlRWxlbWVudCgic2NyaXB0Iik/KHduPXluLmRvY3VtZW50RWxlbWVudCxjbj1mdW5jdGlvbih0KXt2YXIgZT15bi5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtlLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe3ZuKHQpLGUub25yZWFkeXN0YXRlY2hhbmdlPW51bGwsd24ucmVtb3ZlQ2hpbGQoZSksZT1udWxsfSx3bi5hcHBlbmRDaGlsZChlKX0pOmNuPWZ1bmN0aW9uKHQpe3NldFRpbWVvdXQodm4sMCx0KX06KF9uPSJzZXRJbW1lZGlhdGUkIitNYXRoLnJhbmRvbSgpKyIkIixTbj1mdW5jdGlvbihlKXtlLnNvdXJjZT09PXQmJiJzdHJpbmciPT10eXBlb2YgZS5kYXRhJiYwPT09ZS5kYXRhLmluZGV4T2YoX24pJiZ2bigrZS5kYXRhLnNsaWNlKF9uLmxlbmd0aCkpfSx0LmFkZEV2ZW50TGlzdGVuZXI/dC5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixTbiwhMSk6dC5hdHRhY2hFdmVudCgib25tZXNzYWdlIixTbiksY249ZnVuY3Rpb24oZSl7dC5wb3N0TWVzc2FnZShfbitlLCIqIil9KSxSbi5vYmplY3Q9dD0+e2xldCBlLHIsbjtmdW5jdGlvbiBpKGkpe2U9a24odD1pKT90Om51bGwscj0hZSYmdFtTeW1ib2wuaXRlcmF0b3JdP3RbU3ltYm9sLml0ZXJhdG9yXSgpOm51bGwsbj0hZSYmdFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0/dFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTpudWxsfXJldHVybiBBcnJheS5pc0FycmF5KHQpJiYodD10LnNsaWNlKCkpLGkodCksYW4ub2JqKChmdW5jdGlvbiBvKGEscyl7aWYoZSkoYXN5bmMoKT0+e3RyeXthd2FpdCBpKGF3YWl0IGUpLG8uY2FsbCh0aGlzLGEscyl9Y2F0Y2godCl7cyh0KX19KSgpO2Vsc2UgaWYocil7Y29uc3QgdD1yLm5leHQoKTtibihzLG51bGwsdC5kb25lP251bGw6dC52YWx1ZSl9ZWxzZSBuPyhhc3luYygpPT57dHJ5e2NvbnN0IHQ9YXdhaXQgbi5uZXh0KCk7Ym4ocyxudWxsLHQuZG9uZT9udWxsOnQudmFsdWUpfWNhdGNoKHQpe2JuKHMsdCl9fSkoKToodGhpcy5wdXNoKHQpLGJuKHMsbnVsbCxudWxsKSl9KSl9O3ZhciBqbj17fSxUbj1qbi5MRUZUX0JSQUNFPTEsT249am4uUklHSFRfQlJBQ0U9MixBbj1qbi5MRUZUX0JSQUNLRVQ9MyxDbj1qbi5SSUdIVF9CUkFDS0VUPTQsTW49am4uQ09MT049NSx4bj1qbi5DT01NQT02LExuPWpuLlRSVUU9NyxCbj1qbi5GQUxTRT04LFBuPWpuLk5VTEw9OSxVbj1qbi5TVFJJTkc9MTAsTm49am4uTlVNQkVSPTExLERuPWpuLlNUQVJUPTE3LEluPWpuLlNUT1A9MTgscW49am4uVFJVRTE9MzMsRm49am4uVFJVRTI9MzQsV249am4uVFJVRTM9MzUsem49am4uRkFMU0UxPTQ5LFluPWpuLkZBTFNFMj01MCwkbj1qbi5GQUxTRTM9NTEsSG49am4uRkFMU0U0PTUyLEpuPWpuLk5VTEwxPTY1LEduPWpuLk5VTEwyPTY2LFZuPWpuLk5VTEwzPTY3LEtuPWpuLk5VTUJFUjE9ODEsWm49am4uTlVNQkVSMz04MyxYbj1qbi5TVFJJTkcxPTk3LFFuPWpuLlNUUklORzI9OTgsdGk9am4uU1RSSU5HMz05OSxlaT1qbi5TVFJJTkc0PTEwMCxyaT1qbi5TVFJJTkc1PTEwMSxuaT1qbi5TVFJJTkc2PTEwMixpaT1qbi5WQUxVRT0xMTMsb2k9am4uS0VZPTExNCxhaT1qbi5PQkpFQ1Q9MTI5LHNpPWpuLkFSUkFZPTEzMCx1aT0iXFwiLmNoYXJDb2RlQXQoMCksZmk9Ii8iLmNoYXJDb2RlQXQoMCksaGk9IlxiIi5jaGFyQ29kZUF0KDApLGxpPSJcZiIuY2hhckNvZGVBdCgwKSxjaT0iXG4iLmNoYXJDb2RlQXQoMCksZGk9IlxyIi5jaGFyQ29kZUF0KDApLHBpPSJcdCIuY2hhckNvZGVBdCgwKTtmdW5jdGlvbiBnaSgpe3RoaXMudFN0YXRlPURuLHRoaXMudmFsdWU9dm9pZCAwLHRoaXMuc3RyaW5nPXZvaWQgMCx0aGlzLnN0cmluZ0J1ZmZlcj1hdC5hbGxvYz9hdC5hbGxvYyg2NTUzNik6bmV3IGF0KDY1NTM2KSx0aGlzLnN0cmluZ0J1ZmZlck9mZnNldD0wLHRoaXMudW5pY29kZT12b2lkIDAsdGhpcy5oaWdoU3Vycm9nYXRlPXZvaWQgMCx0aGlzLmtleT12b2lkIDAsdGhpcy5tb2RlPXZvaWQgMCx0aGlzLnN0YWNrPVtdLHRoaXMuc3RhdGU9aWksdGhpcy5ieXRlc19yZW1haW5pbmc9MCx0aGlzLmJ5dGVzX2luX3NlcXVlbmNlPTAsdGhpcy50ZW1wX2J1ZmZzPXsyOm5ldyBhdCgyKSwzOm5ldyBhdCgzKSw0Om5ldyBhdCg0KX0sdGhpcy5vZmZzZXQ9LTF9Z2kudG9rbmFtPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1PYmplY3Qua2V5cyhqbikscj0wLG49ZS5sZW5ndGg7cjxuO3IrKyl7dmFyIGk9ZVtyXTtpZihqbltpXT09PXQpcmV0dXJuIGl9cmV0dXJuIHQmJiIweCIrdC50b1N0cmluZygxNil9O3ZhciB5aT1naS5wcm90b3R5cGU7eWkub25FcnJvcj1mdW5jdGlvbih0KXt0aHJvdyB0fSx5aS5jaGFyRXJyb3I9ZnVuY3Rpb24odCxlKXt0aGlzLnRTdGF0ZT1Jbix0aGlzLm9uRXJyb3IobmV3IEVycm9yKCJVbmV4cGVjdGVkICIrSlNPTi5zdHJpbmdpZnkoU3RyaW5nLmZyb21DaGFyQ29kZSh0W2VdKSkrIiBhdCBwb3NpdGlvbiAiK2UrIiBpbiBzdGF0ZSAiK2dpLnRva25hbSh0aGlzLnRTdGF0ZSkpKX0seWkuYXBwZW5kU3RyaW5nQ2hhcj1mdW5jdGlvbih0KXt0aGlzLnN0cmluZ0J1ZmZlck9mZnNldD49NjU1MzYmJih0aGlzLnN0cmluZys9dGhpcy5zdHJpbmdCdWZmZXIudG9TdHJpbmcoInV0ZjgiKSx0aGlzLnN0cmluZ0J1ZmZlck9mZnNldD0wKSx0aGlzLnN0cmluZ0J1ZmZlclt0aGlzLnN0cmluZ0J1ZmZlck9mZnNldCsrXT10fSx5aS5hcHBlbmRTdHJpbmdCdWY9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXQubGVuZ3RoOyJudW1iZXIiPT10eXBlb2YgZSYmKG49Im51bWJlciI9PXR5cGVvZiByP3I8MD90Lmxlbmd0aC1lK3I6ci1lOnQubGVuZ3RoLWUpLG48MCYmKG49MCksdGhpcy5zdHJpbmdCdWZmZXJPZmZzZXQrbj42NTUzNiYmKHRoaXMuc3RyaW5nKz10aGlzLnN0cmluZ0J1ZmZlci50b1N0cmluZygidXRmOCIsMCx0aGlzLnN0cmluZ0J1ZmZlck9mZnNldCksdGhpcy5zdHJpbmdCdWZmZXJPZmZzZXQ9MCksdC5jb3B5KHRoaXMuc3RyaW5nQnVmZmVyLHRoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0LGUsciksdGhpcy5zdHJpbmdCdWZmZXJPZmZzZXQrPW59LHlpLndyaXRlPWZ1bmN0aW9uKHQpe3ZhciBlOyJzdHJpbmciPT10eXBlb2YgdCYmKHQ9bmV3IGF0KHQpKTtmb3IodmFyIHI9MCxuPXQubGVuZ3RoO3I8bjtyKyspaWYodGhpcy50U3RhdGU9PT1Ebil7aWYoZT10W3JdLHRoaXMub2Zmc2V0KyssMTIzPT09ZSl0aGlzLm9uVG9rZW4oVG4sInsiKTtlbHNlIGlmKDEyNT09PWUpdGhpcy5vblRva2VuKE9uLCJ9Iik7ZWxzZSBpZig5MT09PWUpdGhpcy5vblRva2VuKEFuLCJbIik7ZWxzZSBpZig5Mz09PWUpdGhpcy5vblRva2VuKENuLCJdIik7ZWxzZSBpZig1OD09PWUpdGhpcy5vblRva2VuKE1uLCI6Iik7ZWxzZSBpZig0ND09PWUpdGhpcy5vblRva2VuKHhuLCIsIik7ZWxzZSBpZigxMTY9PT1lKXRoaXMudFN0YXRlPXFuO2Vsc2UgaWYoMTAyPT09ZSl0aGlzLnRTdGF0ZT16bjtlbHNlIGlmKDExMD09PWUpdGhpcy50U3RhdGU9Sm47ZWxzZSBpZigzND09PWUpdGhpcy5zdHJpbmc9IiIsdGhpcy5zdHJpbmdCdWZmZXJPZmZzZXQ9MCx0aGlzLnRTdGF0ZT1YbjtlbHNlIGlmKDQ1PT09ZSl0aGlzLnN0cmluZz0iLSIsdGhpcy50U3RhdGU9S247ZWxzZSBpZihlPj00OCYmZTw2NCl0aGlzLnN0cmluZz1TdHJpbmcuZnJvbUNoYXJDb2RlKGUpLHRoaXMudFN0YXRlPVpuO2Vsc2UgaWYoMzIhPT1lJiY5IT09ZSYmMTAhPT1lJiYxMyE9PWUpcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscil9ZWxzZSBpZih0aGlzLnRTdGF0ZT09PVhuKWlmKGU9dFtyXSx0aGlzLmJ5dGVzX3JlbWFpbmluZz4wKXtmb3IodmFyIGk9MDtpPHRoaXMuYnl0ZXNfcmVtYWluaW5nO2krKyl0aGlzLnRlbXBfYnVmZnNbdGhpcy5ieXRlc19pbl9zZXF1ZW5jZV1bdGhpcy5ieXRlc19pbl9zZXF1ZW5jZS10aGlzLmJ5dGVzX3JlbWFpbmluZytpXT10W2ldO3RoaXMuYXBwZW5kU3RyaW5nQnVmKHRoaXMudGVtcF9idWZmc1t0aGlzLmJ5dGVzX2luX3NlcXVlbmNlXSksdGhpcy5ieXRlc19pbl9zZXF1ZW5jZT10aGlzLmJ5dGVzX3JlbWFpbmluZz0wLHI9citpLTF9ZWxzZSBpZigwPT09dGhpcy5ieXRlc19yZW1haW5pbmcmJmU+PTEyOCl7aWYoZTw9MTkzfHxlPjI0NClyZXR1cm4gdGhpcy5vbkVycm9yKG5ldyBFcnJvcigiSW52YWxpZCBVVEYtOCBjaGFyYWN0ZXIgYXQgcG9zaXRpb24gIityKyIgaW4gc3RhdGUgIitnaS50b2tuYW0odGhpcy50U3RhdGUpKSk7aWYoZT49MTk0JiZlPD0yMjMmJih0aGlzLmJ5dGVzX2luX3NlcXVlbmNlPTIpLGU+PTIyNCYmZTw9MjM5JiYodGhpcy5ieXRlc19pbl9zZXF1ZW5jZT0zKSxlPj0yNDAmJmU8PTI0NCYmKHRoaXMuYnl0ZXNfaW5fc2VxdWVuY2U9NCksdGhpcy5ieXRlc19pbl9zZXF1ZW5jZStyPnQubGVuZ3RoKXtmb3IodmFyIG89MDtvPD10Lmxlbmd0aC0xLXI7bysrKXRoaXMudGVtcF9idWZmc1t0aGlzLmJ5dGVzX2luX3NlcXVlbmNlXVtvXT10W3Irb107dGhpcy5ieXRlc19yZW1haW5pbmc9cit0aGlzLmJ5dGVzX2luX3NlcXVlbmNlLXQubGVuZ3RoLHI9dC5sZW5ndGgtMX1lbHNlIHRoaXMuYXBwZW5kU3RyaW5nQnVmKHQscixyK3RoaXMuYnl0ZXNfaW5fc2VxdWVuY2UpLHI9cit0aGlzLmJ5dGVzX2luX3NlcXVlbmNlLTF9ZWxzZSBpZigzND09PWUpdGhpcy50U3RhdGU9RG4sdGhpcy5zdHJpbmcrPXRoaXMuc3RyaW5nQnVmZmVyLnRvU3RyaW5nKCJ1dGY4IiwwLHRoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0KSx0aGlzLnN0cmluZ0J1ZmZlck9mZnNldD0wLHRoaXMub25Ub2tlbihVbix0aGlzLnN0cmluZyksdGhpcy5vZmZzZXQrPWF0LmJ5dGVMZW5ndGgodGhpcy5zdHJpbmcsInV0ZjgiKSsxLHRoaXMuc3RyaW5nPXZvaWQgMDtlbHNlIGlmKDkyPT09ZSl0aGlzLnRTdGF0ZT1RbjtlbHNle2lmKCEoZT49MzIpKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMuYXBwZW5kU3RyaW5nQ2hhcihlKX1lbHNlIGlmKHRoaXMudFN0YXRlPT09UW4paWYoMzQ9PT0oZT10W3JdKSl0aGlzLmFwcGVuZFN0cmluZ0NoYXIoZSksdGhpcy50U3RhdGU9WG47ZWxzZSBpZig5Mj09PWUpdGhpcy5hcHBlbmRTdHJpbmdDaGFyKHVpKSx0aGlzLnRTdGF0ZT1YbjtlbHNlIGlmKDQ3PT09ZSl0aGlzLmFwcGVuZFN0cmluZ0NoYXIoZmkpLHRoaXMudFN0YXRlPVhuO2Vsc2UgaWYoOTg9PT1lKXRoaXMuYXBwZW5kU3RyaW5nQ2hhcihoaSksdGhpcy50U3RhdGU9WG47ZWxzZSBpZigxMDI9PT1lKXRoaXMuYXBwZW5kU3RyaW5nQ2hhcihsaSksdGhpcy50U3RhdGU9WG47ZWxzZSBpZigxMTA9PT1lKXRoaXMuYXBwZW5kU3RyaW5nQ2hhcihjaSksdGhpcy50U3RhdGU9WG47ZWxzZSBpZigxMTQ9PT1lKXRoaXMuYXBwZW5kU3RyaW5nQ2hhcihkaSksdGhpcy50U3RhdGU9WG47ZWxzZSBpZigxMTY9PT1lKXRoaXMuYXBwZW5kU3RyaW5nQ2hhcihwaSksdGhpcy50U3RhdGU9WG47ZWxzZXtpZigxMTchPT1lKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudW5pY29kZT0iIix0aGlzLnRTdGF0ZT10aX1lbHNlIGlmKHRoaXMudFN0YXRlPT09dGl8fHRoaXMudFN0YXRlPT09ZWl8fHRoaXMudFN0YXRlPT09cml8fHRoaXMudFN0YXRlPT09bmkpe2lmKCEoKGU9dFtyXSk+PTQ4JiZlPDY0fHxlPjY0JiZlPD03MHx8ZT45NiYmZTw9MTAyKSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTtpZih0aGlzLnVuaWNvZGUrPVN0cmluZy5mcm9tQ2hhckNvZGUoZSksdGhpcy50U3RhdGUrKz09PW5pKXt2YXIgYT1wYXJzZUludCh0aGlzLnVuaWNvZGUsMTYpO3RoaXMudW5pY29kZT12b2lkIDAsdm9pZCAwIT09dGhpcy5oaWdoU3Vycm9nYXRlJiZhPj01NjMyMCYmYTw1NzM0ND8odGhpcy5hcHBlbmRTdHJpbmdCdWYobmV3IGF0KFN0cmluZy5mcm9tQ2hhckNvZGUodGhpcy5oaWdoU3Vycm9nYXRlLGEpKSksdGhpcy5oaWdoU3Vycm9nYXRlPXZvaWQgMCk6dm9pZCAwPT09dGhpcy5oaWdoU3Vycm9nYXRlJiZhPj01NTI5NiYmYTw1NjMyMD90aGlzLmhpZ2hTdXJyb2dhdGU9YToodm9pZCAwIT09dGhpcy5oaWdoU3Vycm9nYXRlJiYodGhpcy5hcHBlbmRTdHJpbmdCdWYobmV3IGF0KFN0cmluZy5mcm9tQ2hhckNvZGUodGhpcy5oaWdoU3Vycm9nYXRlKSkpLHRoaXMuaGlnaFN1cnJvZ2F0ZT12b2lkIDApLHRoaXMuYXBwZW5kU3RyaW5nQnVmKG5ldyBhdChTdHJpbmcuZnJvbUNoYXJDb2RlKGEpKSkpLHRoaXMudFN0YXRlPVhufX1lbHNlIGlmKHRoaXMudFN0YXRlPT09S258fHRoaXMudFN0YXRlPT09Wm4pc3dpdGNoKGU9dFtyXSl7Y2FzZSA0ODpjYXNlIDQ5OmNhc2UgNTA6Y2FzZSA1MTpjYXNlIDUyOmNhc2UgNTM6Y2FzZSA1NDpjYXNlIDU1OmNhc2UgNTY6Y2FzZSA1NzpjYXNlIDQ2OmNhc2UgMTAxOmNhc2UgNjk6Y2FzZSA0MzpjYXNlIDQ1OnRoaXMuc3RyaW5nKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGUpLHRoaXMudFN0YXRlPVpuO2JyZWFrO2RlZmF1bHQ6dGhpcy50U3RhdGU9RG47dmFyIHM9TnVtYmVyKHRoaXMuc3RyaW5nKTtpZihpc05hTihzKSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnN0cmluZy5tYXRjaCgvWzAtOV0rLyk9PXRoaXMuc3RyaW5nJiZzLnRvU3RyaW5nKCkhPXRoaXMuc3RyaW5nP3RoaXMub25Ub2tlbihVbix0aGlzLnN0cmluZyk6dGhpcy5vblRva2VuKE5uLHMpLHRoaXMub2Zmc2V0Kz10aGlzLnN0cmluZy5sZW5ndGgtMSx0aGlzLnN0cmluZz12b2lkIDAsci0tfWVsc2UgaWYodGhpcy50U3RhdGU9PT1xbil7aWYoMTE0IT09dFtyXSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnRTdGF0ZT1Gbn1lbHNlIGlmKHRoaXMudFN0YXRlPT09Rm4pe2lmKDExNyE9PXRbcl0pcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy50U3RhdGU9V259ZWxzZSBpZih0aGlzLnRTdGF0ZT09PVduKXtpZigxMDEhPT10W3JdKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudFN0YXRlPURuLHRoaXMub25Ub2tlbihMbiwhMCksdGhpcy5vZmZzZXQrPTN9ZWxzZSBpZih0aGlzLnRTdGF0ZT09PXpuKXtpZig5NyE9PXRbcl0pcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy50U3RhdGU9WW59ZWxzZSBpZih0aGlzLnRTdGF0ZT09PVluKXtpZigxMDghPT10W3JdKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudFN0YXRlPSRufWVsc2UgaWYodGhpcy50U3RhdGU9PT0kbil7aWYoMTE1IT09dFtyXSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnRTdGF0ZT1Ibn1lbHNlIGlmKHRoaXMudFN0YXRlPT09SG4pe2lmKDEwMSE9PXRbcl0pcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy50U3RhdGU9RG4sdGhpcy5vblRva2VuKEJuLCExKSx0aGlzLm9mZnNldCs9NH1lbHNlIGlmKHRoaXMudFN0YXRlPT09Sm4pe2lmKDExNyE9PXRbcl0pcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy50U3RhdGU9R259ZWxzZSBpZih0aGlzLnRTdGF0ZT09PUduKXtpZigxMDghPT10W3JdKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudFN0YXRlPVZufWVsc2UgaWYodGhpcy50U3RhdGU9PT1Wbil7aWYoMTA4IT09dFtyXSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnRTdGF0ZT1Ebix0aGlzLm9uVG9rZW4oUG4sbnVsbCksdGhpcy5vZmZzZXQrPTN9fSx5aS5vblRva2VuPWZ1bmN0aW9uKHQsZSl7fSx5aS5wYXJzZUVycm9yPWZ1bmN0aW9uKHQsZSl7dGhpcy50U3RhdGU9SW4sdGhpcy5vbkVycm9yKG5ldyBFcnJvcigiVW5leHBlY3RlZCAiK2dpLnRva25hbSh0KSsoZT8iKCIrSlNPTi5zdHJpbmdpZnkoZSkrIikiOiIiKSsiIGluIHN0YXRlICIrZ2kudG9rbmFtKHRoaXMuc3RhdGUpKSl9LHlpLnB1c2g9ZnVuY3Rpb24oKXt0aGlzLnN0YWNrLnB1c2goe3ZhbHVlOnRoaXMudmFsdWUsa2V5OnRoaXMua2V5LG1vZGU6dGhpcy5tb2RlfSl9LHlpLnBvcD1mdW5jdGlvbigpe3ZhciB0PXRoaXMudmFsdWUsZT10aGlzLnN0YWNrLnBvcCgpO3RoaXMudmFsdWU9ZS52YWx1ZSx0aGlzLmtleT1lLmtleSx0aGlzLm1vZGU9ZS5tb2RlLHRoaXMuZW1pdCh0KSx0aGlzLm1vZGV8fCh0aGlzLnN0YXRlPWlpKX0seWkuZW1pdD1mdW5jdGlvbih0KXt0aGlzLm1vZGUmJih0aGlzLnN0YXRlPXhuKSx0aGlzLm9uVmFsdWUodCl9LHlpLm9uVmFsdWU9ZnVuY3Rpb24odCl7fSx5aS5vblRva2VuPWZ1bmN0aW9uKHQsZSl7aWYodGhpcy5zdGF0ZT09PWlpKWlmKHQ9PT1Vbnx8dD09PU5ufHx0PT09TG58fHQ9PT1Cbnx8dD09PVBuKXRoaXMudmFsdWUmJih0aGlzLnZhbHVlW3RoaXMua2V5XT1lKSx0aGlzLmVtaXQoZSk7ZWxzZSBpZih0PT09VG4pdGhpcy5wdXNoKCksdGhpcy52YWx1ZT90aGlzLnZhbHVlPXRoaXMudmFsdWVbdGhpcy5rZXldPXt9OnRoaXMudmFsdWU9e30sdGhpcy5rZXk9dm9pZCAwLHRoaXMuc3RhdGU9b2ksdGhpcy5tb2RlPWFpO2Vsc2UgaWYodD09PUFuKXRoaXMucHVzaCgpLHRoaXMudmFsdWU/dGhpcy52YWx1ZT10aGlzLnZhbHVlW3RoaXMua2V5XT1bXTp0aGlzLnZhbHVlPVtdLHRoaXMua2V5PTAsdGhpcy5tb2RlPXNpLHRoaXMuc3RhdGU9aWk7ZWxzZSBpZih0PT09T24pe2lmKHRoaXMubW9kZSE9PWFpKXJldHVybiB0aGlzLnBhcnNlRXJyb3IodCxlKTt0aGlzLnBvcCgpfWVsc2V7aWYodCE9PUNuKXJldHVybiB0aGlzLnBhcnNlRXJyb3IodCxlKTtpZih0aGlzLm1vZGUhPT1zaSlyZXR1cm4gdGhpcy5wYXJzZUVycm9yKHQsZSk7dGhpcy5wb3AoKX1lbHNlIGlmKHRoaXMuc3RhdGU9PT1vaSlpZih0PT09VW4pdGhpcy5rZXk9ZSx0aGlzLnN0YXRlPU1uO2Vsc2V7aWYodCE9PU9uKXJldHVybiB0aGlzLnBhcnNlRXJyb3IodCxlKTt0aGlzLnBvcCgpfWVsc2UgaWYodGhpcy5zdGF0ZT09PU1uKXtpZih0IT09TW4pcmV0dXJuIHRoaXMucGFyc2VFcnJvcih0LGUpO3RoaXMuc3RhdGU9aWl9ZWxzZXtpZih0aGlzLnN0YXRlIT09eG4pcmV0dXJuIHRoaXMucGFyc2VFcnJvcih0LGUpO2lmKHQ9PT14bil0aGlzLm1vZGU9PT1zaT8odGhpcy5rZXkrKyx0aGlzLnN0YXRlPWlpKTp0aGlzLm1vZGU9PT1haSYmKHRoaXMuc3RhdGU9b2kpO2Vsc2V7aWYoISh0PT09Q24mJnRoaXMubW9kZT09PXNpfHx0PT09T24mJnRoaXMubW9kZT09PWFpKSlyZXR1cm4gdGhpcy5wYXJzZUVycm9yKHQsZSk7dGhpcy5wb3AoKX19fSxnaS5DPWpuO3ZhciBiaT1naTtmdW5jdGlvbiB2aSgpe3RoaXMuaGVhZD1udWxsLHRoaXMudGFpbD1udWxsLHRoaXMubGVuZ3RoPTB9dmkucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24odCl7dmFyIGU9e2RhdGE6dCxuZXh0Om51bGx9O3RoaXMubGVuZ3RoPjA/dGhpcy50YWlsLm5leHQ9ZTp0aGlzLmhlYWQ9ZSx0aGlzLnRhaWw9ZSwrK3RoaXMubGVuZ3RofSx2aS5wcm90b3R5cGUudW5zaGlmdD1mdW5jdGlvbih0KXt2YXIgZT17ZGF0YTp0LG5leHQ6dGhpcy5oZWFkfTswPT09dGhpcy5sZW5ndGgmJih0aGlzLnRhaWw9ZSksdGhpcy5oZWFkPWUsKyt0aGlzLmxlbmd0aH0sdmkucHJvdG90eXBlLnNoaWZ0PWZ1bmN0aW9uKCl7aWYoMCE9PXRoaXMubGVuZ3RoKXt2YXIgdD10aGlzLmhlYWQuZGF0YTtyZXR1cm4gMT09PXRoaXMubGVuZ3RoP3RoaXMuaGVhZD10aGlzLnRhaWw9bnVsbDp0aGlzLmhlYWQ9dGhpcy5oZWFkLm5leHQsLS10aGlzLmxlbmd0aCx0fX0sdmkucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5oZWFkPXRoaXMudGFpbD1udWxsLHRoaXMubGVuZ3RoPTB9LHZpLnByb3RvdHlwZS5qb2luPWZ1bmN0aW9uKHQpe2lmKDA9PT10aGlzLmxlbmd0aClyZXR1cm4iIjtmb3IodmFyIGU9dGhpcy5oZWFkLHI9IiIrZS5kYXRhO2U9ZS5uZXh0OylyKz10K2UuZGF0YTtyZXR1cm4gcn0sdmkucHJvdG90eXBlLmNvbmNhdD1mdW5jdGlvbih0KXtpZigwPT09dGhpcy5sZW5ndGgpcmV0dXJuIGF0LmFsbG9jKDApO2lmKDE9PT10aGlzLmxlbmd0aClyZXR1cm4gdGhpcy5oZWFkLmRhdGE7Zm9yKHZhciBlPWF0LmFsbG9jVW5zYWZlKHQ+Pj4wKSxyPXRoaXMuaGVhZCxuPTA7cjspci5kYXRhLmNvcHkoZSxuKSxuKz1yLmRhdGEubGVuZ3RoLHI9ci5uZXh0O3JldHVybiBlfTt2YXIgd2k9YXQuaXNFbmNvZGluZ3x8ZnVuY3Rpb24odCl7c3dpdGNoKHQmJnQudG9Mb3dlckNhc2UoKSl7Y2FzZSJoZXgiOmNhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6Y2FzZSJhc2NpaSI6Y2FzZSJiaW5hcnkiOmNhc2UiYmFzZTY0IjpjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6Y2FzZSJyYXciOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fTtmdW5jdGlvbiBtaSh0KXtzd2l0Y2godGhpcy5lbmNvZGluZz0odHx8InV0ZjgiKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1stX10vLCIiKSxmdW5jdGlvbih0KXtpZih0JiYhd2kodCkpdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK3QpfSh0KSx0aGlzLmVuY29kaW5nKXtjYXNlInV0ZjgiOnRoaXMuc3Vycm9nYXRlU2l6ZT0zO2JyZWFrO2Nhc2UidWNzMiI6Y2FzZSJ1dGYxNmxlIjp0aGlzLnN1cnJvZ2F0ZVNpemU9Mix0aGlzLmRldGVjdEluY29tcGxldGVDaGFyPVNpO2JyZWFrO2Nhc2UiYmFzZTY0Ijp0aGlzLnN1cnJvZ2F0ZVNpemU9Myx0aGlzLmRldGVjdEluY29tcGxldGVDaGFyPUVpO2JyZWFrO2RlZmF1bHQ6cmV0dXJuIHZvaWQodGhpcy53cml0ZT1faSl9dGhpcy5jaGFyQnVmZmVyPW5ldyBhdCg2KSx0aGlzLmNoYXJSZWNlaXZlZD0wLHRoaXMuY2hhckxlbmd0aD0wfWZ1bmN0aW9uIF9pKHQpe3JldHVybiB0LnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcpfWZ1bmN0aW9uIFNpKHQpe3RoaXMuY2hhclJlY2VpdmVkPXQubGVuZ3RoJTIsdGhpcy5jaGFyTGVuZ3RoPXRoaXMuY2hhclJlY2VpdmVkPzI6MH1mdW5jdGlvbiBFaSh0KXt0aGlzLmNoYXJSZWNlaXZlZD10Lmxlbmd0aCUzLHRoaXMuY2hhckxlbmd0aD10aGlzLmNoYXJSZWNlaXZlZD8zOjB9bWkucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0iIjt0aGlzLmNoYXJMZW5ndGg7KXt2YXIgcj10Lmxlbmd0aD49dGhpcy5jaGFyTGVuZ3RoLXRoaXMuY2hhclJlY2VpdmVkP3RoaXMuY2hhckxlbmd0aC10aGlzLmNoYXJSZWNlaXZlZDp0Lmxlbmd0aDtpZih0LmNvcHkodGhpcy5jaGFyQnVmZmVyLHRoaXMuY2hhclJlY2VpdmVkLDAsciksdGhpcy5jaGFyUmVjZWl2ZWQrPXIsdGhpcy5jaGFyUmVjZWl2ZWQ8dGhpcy5jaGFyTGVuZ3RoKXJldHVybiIiO2lmKHQ9dC5zbGljZShyLHQubGVuZ3RoKSwhKChpPShlPXRoaXMuY2hhckJ1ZmZlci5zbGljZSgwLHRoaXMuY2hhckxlbmd0aCkudG9TdHJpbmcodGhpcy5lbmNvZGluZykpLmNoYXJDb2RlQXQoZS5sZW5ndGgtMSkpPj01NTI5NiYmaTw9NTYzMTkpKXtpZih0aGlzLmNoYXJSZWNlaXZlZD10aGlzLmNoYXJMZW5ndGg9MCwwPT09dC5sZW5ndGgpcmV0dXJuIGU7YnJlYWt9dGhpcy5jaGFyTGVuZ3RoKz10aGlzLnN1cnJvZ2F0ZVNpemUsZT0iIn10aGlzLmRldGVjdEluY29tcGxldGVDaGFyKHQpO3ZhciBuPXQubGVuZ3RoO3RoaXMuY2hhckxlbmd0aCYmKHQuY29weSh0aGlzLmNoYXJCdWZmZXIsMCx0Lmxlbmd0aC10aGlzLmNoYXJSZWNlaXZlZCxuKSxuLT10aGlzLmNoYXJSZWNlaXZlZCk7dmFyIGk7bj0oZSs9dC50b1N0cmluZyh0aGlzLmVuY29kaW5nLDAsbikpLmxlbmd0aC0xO2lmKChpPWUuY2hhckNvZGVBdChuKSk+PTU1Mjk2JiZpPD01NjMxOSl7dmFyIG89dGhpcy5zdXJyb2dhdGVTaXplO3JldHVybiB0aGlzLmNoYXJMZW5ndGgrPW8sdGhpcy5jaGFyUmVjZWl2ZWQrPW8sdGhpcy5jaGFyQnVmZmVyLmNvcHkodGhpcy5jaGFyQnVmZmVyLG8sMCxvKSx0LmNvcHkodGhpcy5jaGFyQnVmZmVyLDAsMCxvKSxlLnN1YnN0cmluZygwLG4pfXJldHVybiBlfSxtaS5wcm90b3R5cGUuZGV0ZWN0SW5jb21wbGV0ZUNoYXI9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQubGVuZ3RoPj0zPzM6dC5sZW5ndGg7ZT4wO2UtLSl7dmFyIHI9dFt0Lmxlbmd0aC1lXTtpZigxPT1lJiZyPj41PT02KXt0aGlzLmNoYXJMZW5ndGg9MjticmVha31pZihlPD0yJiZyPj40PT0xNCl7dGhpcy5jaGFyTGVuZ3RoPTM7YnJlYWt9aWYoZTw9MyYmcj4+Mz09MzApe3RoaXMuY2hhckxlbmd0aD00O2JyZWFrfX10aGlzLmNoYXJSZWNlaXZlZD1lfSxtaS5wcm90b3R5cGUuZW5kPWZ1bmN0aW9uKHQpe3ZhciBlPSIiO2lmKHQmJnQubGVuZ3RoJiYoZT10aGlzLndyaXRlKHQpKSx0aGlzLmNoYXJSZWNlaXZlZCl7dmFyIHI9dGhpcy5jaGFyUmVjZWl2ZWQsbj10aGlzLmNoYXJCdWZmZXIsaT10aGlzLmVuY29kaW5nO2UrPW4uc2xpY2UoMCxyKS50b1N0cmluZyhpKX1yZXR1cm4gZX0samkuUmVhZGFibGVTdGF0ZT1SaTt2YXIga2k9ZWUoInN0cmVhbSIpO2Z1bmN0aW9uIFJpKHQsZSl7dD10fHx7fSx0aGlzLm9iamVjdE1vZGU9ISF0Lm9iamVjdE1vZGUsZSBpbnN0YW5jZW9mIFFpJiYodGhpcy5vYmplY3RNb2RlPXRoaXMub2JqZWN0TW9kZXx8ISF0LnJlYWRhYmxlT2JqZWN0TW9kZSk7dmFyIHI9dC5oaWdoV2F0ZXJNYXJrLG49dGhpcy5vYmplY3RNb2RlPzE2OjE2Mzg0O3RoaXMuaGlnaFdhdGVyTWFyaz1yfHwwPT09cj9yOm4sdGhpcy5oaWdoV2F0ZXJNYXJrPX5+dGhpcy5oaWdoV2F0ZXJNYXJrLHRoaXMuYnVmZmVyPW5ldyB2aSx0aGlzLmxlbmd0aD0wLHRoaXMucGlwZXM9bnVsbCx0aGlzLnBpcGVzQ291bnQ9MCx0aGlzLmZsb3dpbmc9bnVsbCx0aGlzLmVuZGVkPSExLHRoaXMuZW5kRW1pdHRlZD0hMSx0aGlzLnJlYWRpbmc9ITEsdGhpcy5zeW5jPSEwLHRoaXMubmVlZFJlYWRhYmxlPSExLHRoaXMuZW1pdHRlZFJlYWRhYmxlPSExLHRoaXMucmVhZGFibGVMaXN0ZW5pbmc9ITEsdGhpcy5yZXN1bWVTY2hlZHVsZWQ9ITEsdGhpcy5kZWZhdWx0RW5jb2Rpbmc9dC5kZWZhdWx0RW5jb2Rpbmd8fCJ1dGY4Iix0aGlzLnJhbk91dD0hMSx0aGlzLmF3YWl0RHJhaW49MCx0aGlzLnJlYWRpbmdNb3JlPSExLHRoaXMuZGVjb2Rlcj1udWxsLHRoaXMuZW5jb2Rpbmc9bnVsbCx0LmVuY29kaW5nJiYodGhpcy5kZWNvZGVyPW5ldyBtaSh0LmVuY29kaW5nKSx0aGlzLmVuY29kaW5nPXQuZW5jb2RpbmcpfWZ1bmN0aW9uIGppKHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIGppKSlyZXR1cm4gbmV3IGppKHQpO3RoaXMuX3JlYWRhYmxlU3RhdGU9bmV3IFJpKHQsdGhpcyksdGhpcy5yZWFkYWJsZT0hMCx0JiYiZnVuY3Rpb24iPT10eXBlb2YgdC5yZWFkJiYodGhpcy5fcmVhZD10LnJlYWQpLEwuY2FsbCh0aGlzKX1mdW5jdGlvbiBUaSh0LGUscixuLGkpe3ZhciBvPWZ1bmN0aW9uKHQsZSl7dmFyIHI9bnVsbDthdC5pc0J1ZmZlcihlKXx8InN0cmluZyI9PXR5cGVvZiBlfHxudWxsPT1lfHx0Lm9iamVjdE1vZGV8fChyPW5ldyBUeXBlRXJyb3IoIkludmFsaWQgbm9uLXN0cmluZy9idWZmZXIgY2h1bmsiKSk7cmV0dXJuIHJ9KGUscik7aWYobyl0LmVtaXQoImVycm9yIixvKTtlbHNlIGlmKG51bGw9PT1yKWUucmVhZGluZz0hMSxmdW5jdGlvbih0LGUpe2lmKGUuZW5kZWQpcmV0dXJuO2lmKGUuZGVjb2Rlcil7dmFyIHI9ZS5kZWNvZGVyLmVuZCgpO3ImJnIubGVuZ3RoJiYoZS5idWZmZXIucHVzaChyKSxlLmxlbmd0aCs9ZS5vYmplY3RNb2RlPzE6ci5sZW5ndGgpfWUuZW5kZWQ9ITAsQWkodCl9KHQsZSk7ZWxzZSBpZihlLm9iamVjdE1vZGV8fHImJnIubGVuZ3RoPjApaWYoZS5lbmRlZCYmIWkpe3ZhciBhPW5ldyBFcnJvcigic3RyZWFtLnB1c2goKSBhZnRlciBFT0YiKTt0LmVtaXQoImVycm9yIixhKX1lbHNlIGlmKGUuZW5kRW1pdHRlZCYmaSl7dmFyIHM9bmV3IEVycm9yKCJzdHJlYW0udW5zaGlmdCgpIGFmdGVyIGVuZCBldmVudCIpO3QuZW1pdCgiZXJyb3IiLHMpfWVsc2V7dmFyIHU7IWUuZGVjb2Rlcnx8aXx8bnx8KHI9ZS5kZWNvZGVyLndyaXRlKHIpLHU9IWUub2JqZWN0TW9kZSYmMD09PXIubGVuZ3RoKSxpfHwoZS5yZWFkaW5nPSExKSx1fHwoZS5mbG93aW5nJiYwPT09ZS5sZW5ndGgmJiFlLnN5bmM/KHQuZW1pdCgiZGF0YSIsciksdC5yZWFkKDApKTooZS5sZW5ndGgrPWUub2JqZWN0TW9kZT8xOnIubGVuZ3RoLGk/ZS5idWZmZXIudW5zaGlmdChyKTplLmJ1ZmZlci5wdXNoKHIpLGUubmVlZFJlYWRhYmxlJiZBaSh0KSkpLGZ1bmN0aW9uKHQsZSl7ZS5yZWFkaW5nTW9yZXx8KGUucmVhZGluZ01vcmU9ITAsYyhNaSx0LGUpKX0odCxlKX1lbHNlIGl8fChlLnJlYWRpbmc9ITEpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4hdC5lbmRlZCYmKHQubmVlZFJlYWRhYmxlfHx0Lmxlbmd0aDx0LmhpZ2hXYXRlck1hcmt8fDA9PT10Lmxlbmd0aCl9KGUpfVZ0KGppLEwpLGppLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5fcmVhZGFibGVTdGF0ZTtyZXR1cm4gci5vYmplY3RNb2RlfHwic3RyaW5nIiE9dHlwZW9mIHR8fChlPWV8fHIuZGVmYXVsdEVuY29kaW5nKSE9PXIuZW5jb2RpbmcmJih0PWF0LmZyb20odCxlKSxlPSIiKSxUaSh0aGlzLHIsdCxlLCExKX0samkucHJvdG90eXBlLnVuc2hpZnQ9ZnVuY3Rpb24odCl7cmV0dXJuIFRpKHRoaXMsdGhpcy5fcmVhZGFibGVTdGF0ZSx0LCIiLCEwKX0samkucHJvdG90eXBlLmlzUGF1c2VkPWZ1bmN0aW9uKCl7cmV0dXJuITE9PT10aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmd9LGppLnByb3RvdHlwZS5zZXRFbmNvZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5kZWNvZGVyPW5ldyBtaSh0KSx0aGlzLl9yZWFkYWJsZVN0YXRlLmVuY29kaW5nPXQsdGhpc307ZnVuY3Rpb24gT2kodCxlKXtyZXR1cm4gdDw9MHx8MD09PWUubGVuZ3RoJiZlLmVuZGVkPzA6ZS5vYmplY3RNb2RlPzE6dCE9dD9lLmZsb3dpbmcmJmUubGVuZ3RoP2UuYnVmZmVyLmhlYWQuZGF0YS5sZW5ndGg6ZS5sZW5ndGg6KHQ+ZS5oaWdoV2F0ZXJNYXJrJiYoZS5oaWdoV2F0ZXJNYXJrPWZ1bmN0aW9uKHQpe3JldHVybiB0Pj04Mzg4NjA4P3Q9ODM4ODYwODoodC0tLHR8PXQ+Pj4xLHR8PXQ+Pj4yLHR8PXQ+Pj40LHR8PXQ+Pj44LHR8PXQ+Pj4xNix0KyspLHR9KHQpKSx0PD1lLmxlbmd0aD90OmUuZW5kZWQ/ZS5sZW5ndGg6KGUubmVlZFJlYWRhYmxlPSEwLDApKX1mdW5jdGlvbiBBaSh0KXt2YXIgZT10Ll9yZWFkYWJsZVN0YXRlO2UubmVlZFJlYWRhYmxlPSExLGUuZW1pdHRlZFJlYWRhYmxlfHwoa2koImVtaXRSZWFkYWJsZSIsZS5mbG93aW5nKSxlLmVtaXR0ZWRSZWFkYWJsZT0hMCxlLnN5bmM/YyhDaSx0KTpDaSh0KSl9ZnVuY3Rpb24gQ2kodCl7a2koImVtaXQgcmVhZGFibGUiKSx0LmVtaXQoInJlYWRhYmxlIiksQmkodCl9ZnVuY3Rpb24gTWkodCxlKXtmb3IodmFyIHI9ZS5sZW5ndGg7IWUucmVhZGluZyYmIWUuZmxvd2luZyYmIWUuZW5kZWQmJmUubGVuZ3RoPGUuaGlnaFdhdGVyTWFyayYmKGtpKCJtYXliZVJlYWRNb3JlIHJlYWQgMCIpLHQucmVhZCgwKSxyIT09ZS5sZW5ndGgpOylyPWUubGVuZ3RoO2UucmVhZGluZ01vcmU9ITF9ZnVuY3Rpb24geGkodCl7a2koInJlYWRhYmxlIG5leHR0aWNrIHJlYWQgMCIpLHQucmVhZCgwKX1mdW5jdGlvbiBMaSh0LGUpe2UucmVhZGluZ3x8KGtpKCJyZXN1bWUgcmVhZCAwIiksdC5yZWFkKDApKSxlLnJlc3VtZVNjaGVkdWxlZD0hMSxlLmF3YWl0RHJhaW49MCx0LmVtaXQoInJlc3VtZSIpLEJpKHQpLGUuZmxvd2luZyYmIWUucmVhZGluZyYmdC5yZWFkKDApfWZ1bmN0aW9uIEJpKHQpe3ZhciBlPXQuX3JlYWRhYmxlU3RhdGU7Zm9yKGtpKCJmbG93IixlLmZsb3dpbmcpO2UuZmxvd2luZyYmbnVsbCE9PXQucmVhZCgpOyk7fWZ1bmN0aW9uIFBpKHQsZSl7cmV0dXJuIDA9PT1lLmxlbmd0aD9udWxsOihlLm9iamVjdE1vZGU/cj1lLmJ1ZmZlci5zaGlmdCgpOiF0fHx0Pj1lLmxlbmd0aD8ocj1lLmRlY29kZXI/ZS5idWZmZXIuam9pbigiIik6MT09PWUuYnVmZmVyLmxlbmd0aD9lLmJ1ZmZlci5oZWFkLmRhdGE6ZS5idWZmZXIuY29uY2F0KGUubGVuZ3RoKSxlLmJ1ZmZlci5jbGVhcigpKTpyPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbjt0PGUuaGVhZC5kYXRhLmxlbmd0aD8obj1lLmhlYWQuZGF0YS5zbGljZSgwLHQpLGUuaGVhZC5kYXRhPWUuaGVhZC5kYXRhLnNsaWNlKHQpKTpuPXQ9PT1lLmhlYWQuZGF0YS5sZW5ndGg/ZS5zaGlmdCgpOnI/ZnVuY3Rpb24odCxlKXt2YXIgcj1lLmhlYWQsbj0xLGk9ci5kYXRhO3QtPWkubGVuZ3RoO2Zvcig7cj1yLm5leHQ7KXt2YXIgbz1yLmRhdGEsYT10Pm8ubGVuZ3RoP28ubGVuZ3RoOnQ7aWYoYT09PW8ubGVuZ3RoP2krPW86aSs9by5zbGljZSgwLHQpLDA9PT0odC09YSkpe2E9PT1vLmxlbmd0aD8oKytuLHIubmV4dD9lLmhlYWQ9ci5uZXh0OmUuaGVhZD1lLnRhaWw9bnVsbCk6KGUuaGVhZD1yLHIuZGF0YT1vLnNsaWNlKGEpKTticmVha30rK259cmV0dXJuIGUubGVuZ3RoLT1uLGl9KHQsZSk6ZnVuY3Rpb24odCxlKXt2YXIgcj1hdC5hbGxvY1Vuc2FmZSh0KSxuPWUuaGVhZCxpPTE7bi5kYXRhLmNvcHkociksdC09bi5kYXRhLmxlbmd0aDtmb3IoO249bi5uZXh0Oyl7dmFyIG89bi5kYXRhLGE9dD5vLmxlbmd0aD9vLmxlbmd0aDp0O2lmKG8uY29weShyLHIubGVuZ3RoLXQsMCxhKSwwPT09KHQtPWEpKXthPT09by5sZW5ndGg/KCsraSxuLm5leHQ/ZS5oZWFkPW4ubmV4dDplLmhlYWQ9ZS50YWlsPW51bGwpOihlLmhlYWQ9bixuLmRhdGE9by5zbGljZShhKSk7YnJlYWt9KytpfXJldHVybiBlLmxlbmd0aC09aSxyfSh0LGUpO3JldHVybiBufSh0LGUuYnVmZmVyLGUuZGVjb2Rlcikscik7dmFyIHJ9ZnVuY3Rpb24gVWkodCl7dmFyIGU9dC5fcmVhZGFibGVTdGF0ZTtpZihlLmxlbmd0aD4wKXRocm93IG5ldyBFcnJvcignImVuZFJlYWRhYmxlKCkiIGNhbGxlZCBvbiBub24tZW1wdHkgc3RyZWFtJyk7ZS5lbmRFbWl0dGVkfHwoZS5lbmRlZD0hMCxjKE5pLGUsdCkpfWZ1bmN0aW9uIE5pKHQsZSl7dC5lbmRFbWl0dGVkfHwwIT09dC5sZW5ndGh8fCh0LmVuZEVtaXR0ZWQ9ITAsZS5yZWFkYWJsZT0hMSxlLmVtaXQoImVuZCIpKX1mdW5jdGlvbiBEaSh0LGUpe2Zvcih2YXIgcj0wLG49dC5sZW5ndGg7cjxuO3IrKylpZih0W3JdPT09ZSlyZXR1cm4gcjtyZXR1cm4tMX1mdW5jdGlvbiBJaSgpe31mdW5jdGlvbiBxaSh0LGUscil7dGhpcy5jaHVuaz10LHRoaXMuZW5jb2Rpbmc9ZSx0aGlzLmNhbGxiYWNrPXIsdGhpcy5uZXh0PW51bGx9ZnVuY3Rpb24gRmkodCxlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiYnVmZmVyIix7Z2V0Olh0KChmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEJ1ZmZlcigpfSksIl93cml0YWJsZVN0YXRlLmJ1ZmZlciBpcyBkZXByZWNhdGVkLiBVc2UgX3dyaXRhYmxlU3RhdGUuZ2V0QnVmZmVyIGluc3RlYWQuIil9KSx0PXR8fHt9LHRoaXMub2JqZWN0TW9kZT0hIXQub2JqZWN0TW9kZSxlIGluc3RhbmNlb2YgUWkmJih0aGlzLm9iamVjdE1vZGU9dGhpcy5vYmplY3RNb2RlfHwhIXQud3JpdGFibGVPYmplY3RNb2RlKTt2YXIgcj10LmhpZ2hXYXRlck1hcmssbj10aGlzLm9iamVjdE1vZGU/MTY6MTYzODQ7dGhpcy5oaWdoV2F0ZXJNYXJrPXJ8fDA9PT1yP3I6bix0aGlzLmhpZ2hXYXRlck1hcms9fn50aGlzLmhpZ2hXYXRlck1hcmssdGhpcy5uZWVkRHJhaW49ITEsdGhpcy5lbmRpbmc9ITEsdGhpcy5lbmRlZD0hMSx0aGlzLmZpbmlzaGVkPSExO3ZhciBpPSExPT09dC5kZWNvZGVTdHJpbmdzO3RoaXMuZGVjb2RlU3RyaW5ncz0haSx0aGlzLmRlZmF1bHRFbmNvZGluZz10LmRlZmF1bHRFbmNvZGluZ3x8InV0ZjgiLHRoaXMubGVuZ3RoPTAsdGhpcy53cml0aW5nPSExLHRoaXMuY29ya2VkPTAsdGhpcy5zeW5jPSEwLHRoaXMuYnVmZmVyUHJvY2Vzc2luZz0hMSx0aGlzLm9ud3JpdGU9ZnVuY3Rpb24odCl7IWZ1bmN0aW9uKHQsZSl7dmFyIHI9dC5fd3JpdGFibGVTdGF0ZSxuPXIuc3luYyxpPXIud3JpdGVjYjtpZihmdW5jdGlvbih0KXt0LndyaXRpbmc9ITEsdC53cml0ZWNiPW51bGwsdC5sZW5ndGgtPXQud3JpdGVsZW4sdC53cml0ZWxlbj0wfShyKSxlKSFmdW5jdGlvbih0LGUscixuLGkpey0tZS5wZW5kaW5nY2Iscj9jKGksbik6aShuKTt0Ll93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZD0hMCx0LmVtaXQoImVycm9yIixuKX0odCxyLG4sZSxpKTtlbHNle3ZhciBvPUhpKHIpO298fHIuY29ya2VkfHxyLmJ1ZmZlclByb2Nlc3Npbmd8fCFyLmJ1ZmZlcmVkUmVxdWVzdHx8JGkodCxyKSxuP2MoWWksdCxyLG8saSk6WWkodCxyLG8saSl9fShlLHQpfSx0aGlzLndyaXRlY2I9bnVsbCx0aGlzLndyaXRlbGVuPTAsdGhpcy5idWZmZXJlZFJlcXVlc3Q9bnVsbCx0aGlzLmxhc3RCdWZmZXJlZFJlcXVlc3Q9bnVsbCx0aGlzLnBlbmRpbmdjYj0wLHRoaXMucHJlZmluaXNoZWQ9ITEsdGhpcy5lcnJvckVtaXR0ZWQ9ITEsdGhpcy5idWZmZXJlZFJlcXVlc3RDb3VudD0wLHRoaXMuY29ya2VkUmVxdWVzdHNGcmVlPW5ldyBWaSh0aGlzKX1mdW5jdGlvbiBXaSh0KXtpZighKHRoaXMgaW5zdGFuY2VvZiBXaXx8dGhpcyBpbnN0YW5jZW9mIFFpKSlyZXR1cm4gbmV3IFdpKHQpO3RoaXMuX3dyaXRhYmxlU3RhdGU9bmV3IEZpKHQsdGhpcyksdGhpcy53cml0YWJsZT0hMCx0JiYoImZ1bmN0aW9uIj09dHlwZW9mIHQud3JpdGUmJih0aGlzLl93cml0ZT10LndyaXRlKSwiZnVuY3Rpb24iPT10eXBlb2YgdC53cml0ZXYmJih0aGlzLl93cml0ZXY9dC53cml0ZXYpKSxMLmNhbGwodGhpcyl9ZnVuY3Rpb24gemkodCxlLHIsbixpLG8sYSl7ZS53cml0ZWxlbj1uLGUud3JpdGVjYj1hLGUud3JpdGluZz0hMCxlLnN5bmM9ITAscj90Ll93cml0ZXYoaSxlLm9ud3JpdGUpOnQuX3dyaXRlKGksbyxlLm9ud3JpdGUpLGUuc3luYz0hMX1mdW5jdGlvbiBZaSh0LGUscixuKXtyfHxmdW5jdGlvbih0LGUpezA9PT1lLmxlbmd0aCYmZS5uZWVkRHJhaW4mJihlLm5lZWREcmFpbj0hMSx0LmVtaXQoImRyYWluIikpfSh0LGUpLGUucGVuZGluZ2NiLS0sbigpLEdpKHQsZSl9ZnVuY3Rpb24gJGkodCxlKXtlLmJ1ZmZlclByb2Nlc3Npbmc9ITA7dmFyIHI9ZS5idWZmZXJlZFJlcXVlc3Q7aWYodC5fd3JpdGV2JiZyJiZyLm5leHQpe3ZhciBuPWUuYnVmZmVyZWRSZXF1ZXN0Q291bnQsaT1uZXcgQXJyYXkobiksbz1lLmNvcmtlZFJlcXVlc3RzRnJlZTtvLmVudHJ5PXI7Zm9yKHZhciBhPTA7cjspaVthXT1yLHI9ci5uZXh0LGErPTE7emkodCxlLCEwLGUubGVuZ3RoLGksIiIsby5maW5pc2gpLGUucGVuZGluZ2NiKyssZS5sYXN0QnVmZmVyZWRSZXF1ZXN0PW51bGwsby5uZXh0PyhlLmNvcmtlZFJlcXVlc3RzRnJlZT1vLm5leHQsby5uZXh0PW51bGwpOmUuY29ya2VkUmVxdWVzdHNGcmVlPW5ldyBWaShlKX1lbHNle2Zvcig7cjspe3ZhciBzPXIuY2h1bmssdT1yLmVuY29kaW5nLGY9ci5jYWxsYmFjaztpZih6aSh0LGUsITEsZS5vYmplY3RNb2RlPzE6cy5sZW5ndGgscyx1LGYpLHI9ci5uZXh0LGUud3JpdGluZylicmVha31udWxsPT09ciYmKGUubGFzdEJ1ZmZlcmVkUmVxdWVzdD1udWxsKX1lLmJ1ZmZlcmVkUmVxdWVzdENvdW50PTAsZS5idWZmZXJlZFJlcXVlc3Q9cixlLmJ1ZmZlclByb2Nlc3Npbmc9ITF9ZnVuY3Rpb24gSGkodCl7cmV0dXJuIHQuZW5kaW5nJiYwPT09dC5sZW5ndGgmJm51bGw9PT10LmJ1ZmZlcmVkUmVxdWVzdCYmIXQuZmluaXNoZWQmJiF0LndyaXRpbmd9ZnVuY3Rpb24gSmkodCxlKXtlLnByZWZpbmlzaGVkfHwoZS5wcmVmaW5pc2hlZD0hMCx0LmVtaXQoInByZWZpbmlzaCIpKX1mdW5jdGlvbiBHaSh0LGUpe3ZhciByPUhpKGUpO3JldHVybiByJiYoMD09PWUucGVuZGluZ2NiPyhKaSh0LGUpLGUuZmluaXNoZWQ9ITAsdC5lbWl0KCJmaW5pc2giKSk6SmkodCxlKSkscn1mdW5jdGlvbiBWaSh0KXt2YXIgZT10aGlzO3RoaXMubmV4dD1udWxsLHRoaXMuZW50cnk9bnVsbCx0aGlzLmZpbmlzaD1mdW5jdGlvbihyKXt2YXIgbj1lLmVudHJ5O2ZvcihlLmVudHJ5PW51bGw7bjspe3ZhciBpPW4uY2FsbGJhY2s7dC5wZW5kaW5nY2ItLSxpKHIpLG49bi5uZXh0fXQuY29ya2VkUmVxdWVzdHNGcmVlP3QuY29ya2VkUmVxdWVzdHNGcmVlLm5leHQ9ZTp0LmNvcmtlZFJlcXVlc3RzRnJlZT1lfX1qaS5wcm90b3R5cGUucmVhZD1mdW5jdGlvbih0KXtraSgicmVhZCIsdCksdD1wYXJzZUludCh0LDEwKTt2YXIgZT10aGlzLl9yZWFkYWJsZVN0YXRlLHI9dDtpZigwIT09dCYmKGUuZW1pdHRlZFJlYWRhYmxlPSExKSwwPT09dCYmZS5uZWVkUmVhZGFibGUmJihlLmxlbmd0aD49ZS5oaWdoV2F0ZXJNYXJrfHxlLmVuZGVkKSlyZXR1cm4ga2koInJlYWQ6IGVtaXRSZWFkYWJsZSIsZS5sZW5ndGgsZS5lbmRlZCksMD09PWUubGVuZ3RoJiZlLmVuZGVkP1VpKHRoaXMpOkFpKHRoaXMpLG51bGw7aWYoMD09PSh0PU9pKHQsZSkpJiZlLmVuZGVkKXJldHVybiAwPT09ZS5sZW5ndGgmJlVpKHRoaXMpLG51bGw7dmFyIG4saT1lLm5lZWRSZWFkYWJsZTtyZXR1cm4ga2koIm5lZWQgcmVhZGFibGUiLGkpLCgwPT09ZS5sZW5ndGh8fGUubGVuZ3RoLXQ8ZS5oaWdoV2F0ZXJNYXJrKSYma2koImxlbmd0aCBsZXNzIHRoYW4gd2F0ZXJtYXJrIixpPSEwKSxlLmVuZGVkfHxlLnJlYWRpbmc/a2koInJlYWRpbmcgb3IgZW5kZWQiLGk9ITEpOmkmJihraSgiZG8gcmVhZCIpLGUucmVhZGluZz0hMCxlLnN5bmM9ITAsMD09PWUubGVuZ3RoJiYoZS5uZWVkUmVhZGFibGU9ITApLHRoaXMuX3JlYWQoZS5oaWdoV2F0ZXJNYXJrKSxlLnN5bmM9ITEsZS5yZWFkaW5nfHwodD1PaShyLGUpKSksbnVsbD09PShuPXQ+MD9QaSh0LGUpOm51bGwpPyhlLm5lZWRSZWFkYWJsZT0hMCx0PTApOmUubGVuZ3RoLT10LDA9PT1lLmxlbmd0aCYmKGUuZW5kZWR8fChlLm5lZWRSZWFkYWJsZT0hMCksciE9PXQmJmUuZW5kZWQmJlVpKHRoaXMpKSxudWxsIT09biYmdGhpcy5lbWl0KCJkYXRhIixuKSxufSxqaS5wcm90b3R5cGUuX3JlYWQ9ZnVuY3Rpb24odCl7dGhpcy5lbWl0KCJlcnJvciIsbmV3IEVycm9yKCJub3QgaW1wbGVtZW50ZWQiKSl9LGppLnByb3RvdHlwZS5waXBlPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcyxuPXRoaXMuX3JlYWRhYmxlU3RhdGU7c3dpdGNoKG4ucGlwZXNDb3VudCl7Y2FzZSAwOm4ucGlwZXM9dDticmVhaztjYXNlIDE6bi5waXBlcz1bbi5waXBlcyx0XTticmVhaztkZWZhdWx0Om4ucGlwZXMucHVzaCh0KX1uLnBpcGVzQ291bnQrPTEsa2koInBpcGUgY291bnQ9JWQgb3B0cz0laiIsbi5waXBlc0NvdW50LGUpO3ZhciBpPSFlfHwhMSE9PWUuZW5kP2E6ZjtmdW5jdGlvbiBvKHQpe2tpKCJvbnVucGlwZSIpLHQ9PT1yJiZmKCl9ZnVuY3Rpb24gYSgpe2tpKCJvbmVuZCIpLHQuZW5kKCl9bi5lbmRFbWl0dGVkP2MoaSk6ci5vbmNlKCJlbmQiLGkpLHQub24oInVucGlwZSIsbyk7dmFyIHM9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9dC5fcmVhZGFibGVTdGF0ZTtraSgicGlwZU9uRHJhaW4iLGUuYXdhaXREcmFpbiksZS5hd2FpdERyYWluJiZlLmF3YWl0RHJhaW4tLSwwPT09ZS5hd2FpdERyYWluJiZ0Lmxpc3RlbmVycygiZGF0YSIpLmxlbmd0aCYmKGUuZmxvd2luZz0hMCxCaSh0KSl9fShyKTt0Lm9uKCJkcmFpbiIscyk7dmFyIHU9ITE7ZnVuY3Rpb24gZigpe2tpKCJjbGVhbnVwIiksdC5yZW1vdmVMaXN0ZW5lcigiY2xvc2UiLHApLHQucmVtb3ZlTGlzdGVuZXIoImZpbmlzaCIsZyksdC5yZW1vdmVMaXN0ZW5lcigiZHJhaW4iLHMpLHQucmVtb3ZlTGlzdGVuZXIoImVycm9yIixkKSx0LnJlbW92ZUxpc3RlbmVyKCJ1bnBpcGUiLG8pLHIucmVtb3ZlTGlzdGVuZXIoImVuZCIsYSksci5yZW1vdmVMaXN0ZW5lcigiZW5kIixmKSxyLnJlbW92ZUxpc3RlbmVyKCJkYXRhIixsKSx1PSEwLCFuLmF3YWl0RHJhaW58fHQuX3dyaXRhYmxlU3RhdGUmJiF0Ll93cml0YWJsZVN0YXRlLm5lZWREcmFpbnx8cygpfXZhciBoPSExO2Z1bmN0aW9uIGwoZSl7a2koIm9uZGF0YSIpLGg9ITEsITEhPT10LndyaXRlKGUpfHxofHwoKDE9PT1uLnBpcGVzQ291bnQmJm4ucGlwZXM9PT10fHxuLnBpcGVzQ291bnQ+MSYmLTEhPT1EaShuLnBpcGVzLHQpKSYmIXUmJihraSgiZmFsc2Ugd3JpdGUgcmVzcG9uc2UsIHBhdXNlIixyLl9yZWFkYWJsZVN0YXRlLmF3YWl0RHJhaW4pLHIuX3JlYWRhYmxlU3RhdGUuYXdhaXREcmFpbisrLGg9ITApLHIucGF1c2UoKSl9ZnVuY3Rpb24gZChlKXt2YXIgcjtraSgib25lcnJvciIsZSkseSgpLHQucmVtb3ZlTGlzdGVuZXIoImVycm9yIixkKSwwPT09KHI9ImVycm9yIix0Lmxpc3RlbmVycyhyKS5sZW5ndGgpJiZ0LmVtaXQoImVycm9yIixlKX1mdW5jdGlvbiBwKCl7dC5yZW1vdmVMaXN0ZW5lcigiZmluaXNoIixnKSx5KCl9ZnVuY3Rpb24gZygpe2tpKCJvbmZpbmlzaCIpLHQucmVtb3ZlTGlzdGVuZXIoImNsb3NlIixwKSx5KCl9ZnVuY3Rpb24geSgpe2tpKCJ1bnBpcGUiKSxyLnVucGlwZSh0KX1yZXR1cm4gci5vbigiZGF0YSIsbCksZnVuY3Rpb24odCxlLHIpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0LnByZXBlbmRMaXN0ZW5lcilyZXR1cm4gdC5wcmVwZW5kTGlzdGVuZXIoZSxyKTt0Ll9ldmVudHMmJnQuX2V2ZW50c1tlXT9BcnJheS5pc0FycmF5KHQuX2V2ZW50c1tlXSk/dC5fZXZlbnRzW2VdLnVuc2hpZnQocik6dC5fZXZlbnRzW2VdPVtyLHQuX2V2ZW50c1tlXV06dC5vbihlLHIpfSh0LCJlcnJvciIsZCksdC5vbmNlKCJjbG9zZSIscCksdC5vbmNlKCJmaW5pc2giLGcpLHQuZW1pdCgicGlwZSIsciksbi5mbG93aW5nfHwoa2koInBpcGUgcmVzdW1lIiksci5yZXN1bWUoKSksdH0samkucHJvdG90eXBlLnVucGlwZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9yZWFkYWJsZVN0YXRlO2lmKDA9PT1lLnBpcGVzQ291bnQpcmV0dXJuIHRoaXM7aWYoMT09PWUucGlwZXNDb3VudClyZXR1cm4gdCYmdCE9PWUucGlwZXN8fCh0fHwodD1lLnBpcGVzKSxlLnBpcGVzPW51bGwsZS5waXBlc0NvdW50PTAsZS5mbG93aW5nPSExLHQmJnQuZW1pdCgidW5waXBlIix0aGlzKSksdGhpcztpZighdCl7dmFyIHI9ZS5waXBlcyxuPWUucGlwZXNDb3VudDtlLnBpcGVzPW51bGwsZS5waXBlc0NvdW50PTAsZS5mbG93aW5nPSExO2Zvcih2YXIgaT0wO2k8bjtpKyspcltpXS5lbWl0KCJ1bnBpcGUiLHRoaXMpO3JldHVybiB0aGlzfXZhciBvPURpKGUucGlwZXMsdCk7cmV0dXJuLTE9PT1vfHwoZS5waXBlcy5zcGxpY2UobywxKSxlLnBpcGVzQ291bnQtPTEsMT09PWUucGlwZXNDb3VudCYmKGUucGlwZXM9ZS5waXBlc1swXSksdC5lbWl0KCJ1bnBpcGUiLHRoaXMpKSx0aGlzfSxqaS5wcm90b3R5cGUub249ZnVuY3Rpb24odCxlKXt2YXIgcj1MLnByb3RvdHlwZS5vbi5jYWxsKHRoaXMsdCxlKTtpZigiZGF0YSI9PT10KSExIT09dGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nJiZ0aGlzLnJlc3VtZSgpO2Vsc2UgaWYoInJlYWRhYmxlIj09PXQpe3ZhciBuPXRoaXMuX3JlYWRhYmxlU3RhdGU7bi5lbmRFbWl0dGVkfHxuLnJlYWRhYmxlTGlzdGVuaW5nfHwobi5yZWFkYWJsZUxpc3RlbmluZz1uLm5lZWRSZWFkYWJsZT0hMCxuLmVtaXR0ZWRSZWFkYWJsZT0hMSxuLnJlYWRpbmc/bi5sZW5ndGgmJkFpKHRoaXMpOmMoeGksdGhpcykpfXJldHVybiByfSxqaS5wcm90b3R5cGUuYWRkTGlzdGVuZXI9amkucHJvdG90eXBlLm9uLGppLnByb3RvdHlwZS5yZXN1bWU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9yZWFkYWJsZVN0YXRlO3JldHVybiB0LmZsb3dpbmd8fChraSgicmVzdW1lIiksdC5mbG93aW5nPSEwLGZ1bmN0aW9uKHQsZSl7ZS5yZXN1bWVTY2hlZHVsZWR8fChlLnJlc3VtZVNjaGVkdWxlZD0hMCxjKExpLHQsZSkpfSh0aGlzLHQpKSx0aGlzfSxqaS5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXtyZXR1cm4ga2koImNhbGwgcGF1c2UgZmxvd2luZz0laiIsdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nKSwhMSE9PXRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyYmKGtpKCJwYXVzZSIpLHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZz0hMSx0aGlzLmVtaXQoInBhdXNlIikpLHRoaXN9LGppLnByb3RvdHlwZS53cmFwPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3JlYWRhYmxlU3RhdGUscj0hMSxuPXRoaXM7Zm9yKHZhciBpIGluIHQub24oImVuZCIsKGZ1bmN0aW9uKCl7aWYoa2koIndyYXBwZWQgZW5kIiksZS5kZWNvZGVyJiYhZS5lbmRlZCl7dmFyIHQ9ZS5kZWNvZGVyLmVuZCgpO3QmJnQubGVuZ3RoJiZuLnB1c2godCl9bi5wdXNoKG51bGwpfSkpLHQub24oImRhdGEiLChmdW5jdGlvbihpKXsoa2koIndyYXBwZWQgZGF0YSIpLGUuZGVjb2RlciYmKGk9ZS5kZWNvZGVyLndyaXRlKGkpKSxlLm9iamVjdE1vZGUmJm51bGw9PWkpfHwoZS5vYmplY3RNb2RlfHxpJiZpLmxlbmd0aCkmJihuLnB1c2goaSl8fChyPSEwLHQucGF1c2UoKSkpfSkpLHQpdm9pZCAwPT09dGhpc1tpXSYmImZ1bmN0aW9uIj09dHlwZW9mIHRbaV0mJih0aGlzW2ldPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0W2VdLmFwcGx5KHQsYXJndW1lbnRzKX19KGkpKTtyZXR1cm4gZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9MCxuPXQubGVuZ3RoO3I8bjtyKyspZSh0W3JdLHIpfShbImVycm9yIiwiY2xvc2UiLCJkZXN0cm95IiwicGF1c2UiLCJyZXN1bWUiXSwoZnVuY3Rpb24oZSl7dC5vbihlLG4uZW1pdC5iaW5kKG4sZSkpfSkpLG4uX3JlYWQ9ZnVuY3Rpb24oZSl7a2koIndyYXBwZWQgX3JlYWQiLGUpLHImJihyPSExLHQucmVzdW1lKCkpfSxufSxqaS5fZnJvbUxpc3Q9UGksV2kuV3JpdGFibGVTdGF0ZT1GaSxWdChXaSxMKSxGaS5wcm90b3R5cGUuZ2V0QnVmZmVyPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuYnVmZmVyZWRSZXF1ZXN0LGU9W107dDspZS5wdXNoKHQpLHQ9dC5uZXh0O3JldHVybiBlfSxXaS5wcm90b3R5cGUucGlwZT1mdW5jdGlvbigpe3RoaXMuZW1pdCgiZXJyb3IiLG5ldyBFcnJvcigiQ2Fubm90IHBpcGUsIG5vdCByZWFkYWJsZSIpKX0sV2kucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj10aGlzLl93cml0YWJsZVN0YXRlLGk9ITE7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGUmJihyPWUsZT1udWxsKSxhdC5pc0J1ZmZlcih0KT9lPSJidWZmZXIiOmV8fChlPW4uZGVmYXVsdEVuY29kaW5nKSwiZnVuY3Rpb24iIT10eXBlb2YgciYmKHI9SWkpLG4uZW5kZWQ/ZnVuY3Rpb24odCxlKXt2YXIgcj1uZXcgRXJyb3IoIndyaXRlIGFmdGVyIGVuZCIpO3QuZW1pdCgiZXJyb3IiLHIpLGMoZSxyKX0odGhpcyxyKTpmdW5jdGlvbih0LGUscixuKXt2YXIgaT0hMCxvPSExO3JldHVybiBudWxsPT09cj9vPW5ldyBUeXBlRXJyb3IoIk1heSBub3Qgd3JpdGUgbnVsbCB2YWx1ZXMgdG8gc3RyZWFtIik6YXQuaXNCdWZmZXIocil8fCJzdHJpbmciPT10eXBlb2Ygcnx8dm9pZCAwPT09cnx8ZS5vYmplY3RNb2RlfHwobz1uZXcgVHlwZUVycm9yKCJJbnZhbGlkIG5vbi1zdHJpbmcvYnVmZmVyIGNodW5rIikpLG8mJih0LmVtaXQoImVycm9yIixvKSxjKG4sbyksaT0hMSksaX0odGhpcyxuLHQscikmJihuLnBlbmRpbmdjYisrLGk9ZnVuY3Rpb24odCxlLHIsbixpKXtyPWZ1bmN0aW9uKHQsZSxyKXt0Lm9iamVjdE1vZGV8fCExPT09dC5kZWNvZGVTdHJpbmdzfHwic3RyaW5nIiE9dHlwZW9mIGV8fChlPWF0LmZyb20oZSxyKSk7cmV0dXJuIGV9KGUscixuKSxhdC5pc0J1ZmZlcihyKSYmKG49ImJ1ZmZlciIpO3ZhciBvPWUub2JqZWN0TW9kZT8xOnIubGVuZ3RoO2UubGVuZ3RoKz1vO3ZhciBhPWUubGVuZ3RoPGUuaGlnaFdhdGVyTWFyazthfHwoZS5uZWVkRHJhaW49ITApO2lmKGUud3JpdGluZ3x8ZS5jb3JrZWQpe3ZhciBzPWUubGFzdEJ1ZmZlcmVkUmVxdWVzdDtlLmxhc3RCdWZmZXJlZFJlcXVlc3Q9bmV3IHFpKHIsbixpKSxzP3MubmV4dD1lLmxhc3RCdWZmZXJlZFJlcXVlc3Q6ZS5idWZmZXJlZFJlcXVlc3Q9ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0LGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQrPTF9ZWxzZSB6aSh0LGUsITEsbyxyLG4saSk7cmV0dXJuIGF9KHRoaXMsbix0LGUscikpLGl9LFdpLnByb3RvdHlwZS5jb3JrPWZ1bmN0aW9uKCl7dGhpcy5fd3JpdGFibGVTdGF0ZS5jb3JrZWQrK30sV2kucHJvdG90eXBlLnVuY29yaz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX3dyaXRhYmxlU3RhdGU7dC5jb3JrZWQmJih0LmNvcmtlZC0tLHQud3JpdGluZ3x8dC5jb3JrZWR8fHQuZmluaXNoZWR8fHQuYnVmZmVyUHJvY2Vzc2luZ3x8IXQuYnVmZmVyZWRSZXF1ZXN0fHwkaSh0aGlzLHQpKX0sV2kucHJvdG90eXBlLnNldERlZmF1bHRFbmNvZGluZz1mdW5jdGlvbih0KXtpZigic3RyaW5nIj09dHlwZW9mIHQmJih0PXQudG9Mb3dlckNhc2UoKSksIShbImhleCIsInV0ZjgiLCJ1dGYtOCIsImFzY2lpIiwiYmluYXJ5IiwiYmFzZTY0IiwidWNzMiIsInVjcy0yIiwidXRmMTZsZSIsInV0Zi0xNmxlIiwicmF3Il0uaW5kZXhPZigodCsiIikudG9Mb3dlckNhc2UoKSk+LTEpKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrdCk7cmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVmYXVsdEVuY29kaW5nPXQsdGhpc30sV2kucHJvdG90eXBlLl93cml0ZT1mdW5jdGlvbih0LGUscil7cihuZXcgRXJyb3IoIm5vdCBpbXBsZW1lbnRlZCIpKX0sV2kucHJvdG90eXBlLl93cml0ZXY9bnVsbCxXaS5wcm90b3R5cGUuZW5kPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj10aGlzLl93cml0YWJsZVN0YXRlOyJmdW5jdGlvbiI9PXR5cGVvZiB0PyhyPXQsdD1udWxsLGU9bnVsbCk6ImZ1bmN0aW9uIj09dHlwZW9mIGUmJihyPWUsZT1udWxsKSxudWxsIT10JiZ0aGlzLndyaXRlKHQsZSksbi5jb3JrZWQmJihuLmNvcmtlZD0xLHRoaXMudW5jb3JrKCkpLG4uZW5kaW5nfHxuLmZpbmlzaGVkfHxmdW5jdGlvbih0LGUscil7ZS5lbmRpbmc9ITAsR2kodCxlKSxyJiYoZS5maW5pc2hlZD9jKHIpOnQub25jZSgiZmluaXNoIixyKSk7ZS5lbmRlZD0hMCx0LndyaXRhYmxlPSExfSh0aGlzLG4scil9LFZ0KFFpLGppKTtmb3IodmFyIEtpPU9iamVjdC5rZXlzKFdpLnByb3RvdHlwZSksWmk9MDtaaTxLaS5sZW5ndGg7WmkrKyl7dmFyIFhpPUtpW1ppXTtRaS5wcm90b3R5cGVbWGldfHwoUWkucHJvdG90eXBlW1hpXT1XaS5wcm90b3R5cGVbWGldKX1mdW5jdGlvbiBRaSh0KXtpZighKHRoaXMgaW5zdGFuY2VvZiBRaSkpcmV0dXJuIG5ldyBRaSh0KTtqaS5jYWxsKHRoaXMsdCksV2kuY2FsbCh0aGlzLHQpLHQmJiExPT09dC5yZWFkYWJsZSYmKHRoaXMucmVhZGFibGU9ITEpLHQmJiExPT09dC53cml0YWJsZSYmKHRoaXMud3JpdGFibGU9ITEpLHRoaXMuYWxsb3dIYWxmT3Blbj0hMCx0JiYhMT09PXQuYWxsb3dIYWxmT3BlbiYmKHRoaXMuYWxsb3dIYWxmT3Blbj0hMSksdGhpcy5vbmNlKCJlbmQiLHRvKX1mdW5jdGlvbiB0bygpe3RoaXMuYWxsb3dIYWxmT3Blbnx8dGhpcy5fd3JpdGFibGVTdGF0ZS5lbmRlZHx8Yyhlbyx0aGlzKX1mdW5jdGlvbiBlbyh0KXt0LmVuZCgpfWZ1bmN0aW9uIHJvKHQpe3RoaXMuYWZ0ZXJUcmFuc2Zvcm09ZnVuY3Rpb24oZSxyKXtyZXR1cm4gZnVuY3Rpb24odCxlLHIpe3ZhciBuPXQuX3RyYW5zZm9ybVN0YXRlO24udHJhbnNmb3JtaW5nPSExO3ZhciBpPW4ud3JpdGVjYjtpZighaSlyZXR1cm4gdC5lbWl0KCJlcnJvciIsbmV3IEVycm9yKCJubyB3cml0ZWNiIGluIFRyYW5zZm9ybSBjbGFzcyIpKTtuLndyaXRlY2h1bms9bnVsbCxuLndyaXRlY2I9bnVsbCxudWxsIT1yJiZ0LnB1c2gocik7aShlKTt2YXIgbz10Ll9yZWFkYWJsZVN0YXRlO28ucmVhZGluZz0hMSwoby5uZWVkUmVhZGFibGV8fG8ubGVuZ3RoPG8uaGlnaFdhdGVyTWFyaykmJnQuX3JlYWQoby5oaWdoV2F0ZXJNYXJrKX0odCxlLHIpfSx0aGlzLm5lZWRUcmFuc2Zvcm09ITEsdGhpcy50cmFuc2Zvcm1pbmc9ITEsdGhpcy53cml0ZWNiPW51bGwsdGhpcy53cml0ZWNodW5rPW51bGwsdGhpcy53cml0ZWVuY29kaW5nPW51bGx9ZnVuY3Rpb24gbm8odCl7aWYoISh0aGlzIGluc3RhbmNlb2Ygbm8pKXJldHVybiBuZXcgbm8odCk7UWkuY2FsbCh0aGlzLHQpLHRoaXMuX3RyYW5zZm9ybVN0YXRlPW5ldyBybyh0aGlzKTt2YXIgZT10aGlzO3RoaXMuX3JlYWRhYmxlU3RhdGUubmVlZFJlYWRhYmxlPSEwLHRoaXMuX3JlYWRhYmxlU3RhdGUuc3luYz0hMSx0JiYoImZ1bmN0aW9uIj09dHlwZW9mIHQudHJhbnNmb3JtJiYodGhpcy5fdHJhbnNmb3JtPXQudHJhbnNmb3JtKSwiZnVuY3Rpb24iPT10eXBlb2YgdC5mbHVzaCYmKHRoaXMuX2ZsdXNoPXQuZmx1c2gpKSx0aGlzLm9uY2UoInByZWZpbmlzaCIsKGZ1bmN0aW9uKCl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuX2ZsdXNoP3RoaXMuX2ZsdXNoKChmdW5jdGlvbih0KXtpbyhlLHQpfSkpOmlvKGUpfSkpfWZ1bmN0aW9uIGlvKHQsZSl7aWYoZSlyZXR1cm4gdC5lbWl0KCJlcnJvciIsZSk7dmFyIHI9dC5fd3JpdGFibGVTdGF0ZSxuPXQuX3RyYW5zZm9ybVN0YXRlO2lmKHIubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiQ2FsbGluZyB0cmFuc2Zvcm0gZG9uZSB3aGVuIHdzLmxlbmd0aCAhPSAwIik7aWYobi50cmFuc2Zvcm1pbmcpdGhyb3cgbmV3IEVycm9yKCJDYWxsaW5nIHRyYW5zZm9ybSBkb25lIHdoZW4gc3RpbGwgdHJhbnNmb3JtaW5nIik7cmV0dXJuIHQucHVzaChudWxsKX1mdW5jdGlvbiBvbyh0KXtpZighKHRoaXMgaW5zdGFuY2VvZiBvbykpcmV0dXJuIG5ldyBvbyh0KTtuby5jYWxsKHRoaXMsdCl9ZnVuY3Rpb24gYW8oKXtMLmNhbGwodGhpcyl9ZnVuY3Rpb24gc28odCxlLHIpe3Q9dHx8ZnVuY3Rpb24odCl7dGhpcy5xdWV1ZSh0KX0sZT1lfHxmdW5jdGlvbigpe3RoaXMucXVldWUobnVsbCl9O2xldCBuPSExLGk9ITEsbz1bXSxhPSExLHM9bmV3IGFvO2Z1bmN0aW9uIHUoKXtmb3IoO28ubGVuZ3RoJiYhcy5wYXVzZWQ7KXtsZXQgdD1vLnNoaWZ0KCk7aWYobnVsbD09PXQpcmV0dXJuIHMuZW1pdCgiZW5kIik7cy5lbWl0KCJkYXRhIix0KX19ZnVuY3Rpb24gZigpe3Mud3JpdGFibGU9ITEsZS5jYWxsKHMpLCFzLnJlYWRhYmxlJiZzLmF1dG9EZXN0cm95JiZzLmRlc3Ryb3koKX1yZXR1cm4gcy5yZWFkYWJsZT1zLndyaXRhYmxlPSEwLHMucGF1c2VkPSExLHMuYXV0b0Rlc3Ryb3k9IShyJiYhMT09PXIuYXV0b0Rlc3Ryb3kpLHMud3JpdGU9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuY2FsbCh0aGlzLGUpLCFzLnBhdXNlZH0scy5xdWV1ZT1zLnB1c2g9ZnVuY3Rpb24odCl7cmV0dXJuIGF8fChudWxsPT09dCYmKGE9ITApLG8ucHVzaCh0KSx1KCkpLHN9LHMub24oImVuZCIsKGZ1bmN0aW9uKCl7cy5yZWFkYWJsZT0hMSwhcy53cml0YWJsZSYmcy5hdXRvRGVzdHJveSYmUi5uZXh0VGljaygoZnVuY3Rpb24oKXtzLmRlc3Ryb3koKX0pKX0pKSxzLmVuZD1mdW5jdGlvbih0KXtpZighbilyZXR1cm4gbj0hMCxhcmd1bWVudHMubGVuZ3RoJiZzLndyaXRlKHQpLGYoKSxzfSxzLmRlc3Ryb3k9ZnVuY3Rpb24oKXtpZighaSlyZXR1cm4gaT0hMCxuPSEwLG8ubGVuZ3RoPTAscy53cml0YWJsZT1zLnJlYWRhYmxlPSExLHMuZW1pdCgiY2xvc2UiKSxzfSxzLnBhdXNlPWZ1bmN0aW9uKCl7aWYoIXMucGF1c2VkKXJldHVybiBzLnBhdXNlZD0hMCxzfSxzLnJlc3VtZT1mdW5jdGlvbigpe3JldHVybiBzLnBhdXNlZCYmKHMucGF1c2VkPSExLHMuZW1pdCgicmVzdW1lIikpLHUoKSxzLnBhdXNlZHx8cy5lbWl0KCJkcmFpbiIpLHN9LHN9VnQobm8sUWkpLG5vLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX3RyYW5zZm9ybVN0YXRlLm5lZWRUcmFuc2Zvcm09ITEsUWkucHJvdG90eXBlLnB1c2guY2FsbCh0aGlzLHQsZSl9LG5vLnByb3RvdHlwZS5fdHJhbnNmb3JtPWZ1bmN0aW9uKHQsZSxyKXt0aHJvdyBuZXcgRXJyb3IoIk5vdCBpbXBsZW1lbnRlZCIpfSxuby5wcm90b3R5cGUuX3dyaXRlPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj10aGlzLl90cmFuc2Zvcm1TdGF0ZTtpZihuLndyaXRlY2I9cixuLndyaXRlY2h1bms9dCxuLndyaXRlZW5jb2Rpbmc9ZSwhbi50cmFuc2Zvcm1pbmcpe3ZhciBpPXRoaXMuX3JlYWRhYmxlU3RhdGU7KG4ubmVlZFRyYW5zZm9ybXx8aS5uZWVkUmVhZGFibGV8fGkubGVuZ3RoPGkuaGlnaFdhdGVyTWFyaykmJnRoaXMuX3JlYWQoaS5oaWdoV2F0ZXJNYXJrKX19LG5vLnByb3RvdHlwZS5fcmVhZD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl90cmFuc2Zvcm1TdGF0ZTtudWxsIT09ZS53cml0ZWNodW5rJiZlLndyaXRlY2ImJiFlLnRyYW5zZm9ybWluZz8oZS50cmFuc2Zvcm1pbmc9ITAsdGhpcy5fdHJhbnNmb3JtKGUud3JpdGVjaHVuayxlLndyaXRlZW5jb2RpbmcsZS5hZnRlclRyYW5zZm9ybSkpOmUubmVlZFRyYW5zZm9ybT0hMH0sVnQob28sbm8pLG9vLnByb3RvdHlwZS5fdHJhbnNmb3JtPWZ1bmN0aW9uKHQsZSxyKXtyKG51bGwsdCl9LFZ0KGFvLEwpLGFvLlJlYWRhYmxlPWppLGFvLldyaXRhYmxlPVdpLGFvLkR1cGxleD1RaSxhby5UcmFuc2Zvcm09bm8sYW8uUGFzc1Rocm91Z2g9b28sYW8uU3RyZWFtPWFvLGFvLnByb3RvdHlwZS5waXBlPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcztmdW5jdGlvbiBuKGUpe3Qud3JpdGFibGUmJiExPT09dC53cml0ZShlKSYmci5wYXVzZSYmci5wYXVzZSgpfWZ1bmN0aW9uIGkoKXtyLnJlYWRhYmxlJiZyLnJlc3VtZSYmci5yZXN1bWUoKX1yLm9uKCJkYXRhIixuKSx0Lm9uKCJkcmFpbiIsaSksdC5faXNTdGRpb3x8ZSYmITE9PT1lLmVuZHx8KHIub24oImVuZCIsYSksci5vbigiY2xvc2UiLHMpKTt2YXIgbz0hMTtmdW5jdGlvbiBhKCl7b3x8KG89ITAsdC5lbmQoKSl9ZnVuY3Rpb24gcygpe298fChvPSEwLCJmdW5jdGlvbiI9PXR5cGVvZiB0LmRlc3Ryb3kmJnQuZGVzdHJveSgpKX1mdW5jdGlvbiB1KHQpe2lmKGYoKSwwPT09TC5saXN0ZW5lckNvdW50KHRoaXMsImVycm9yIikpdGhyb3cgdH1mdW5jdGlvbiBmKCl7ci5yZW1vdmVMaXN0ZW5lcigiZGF0YSIsbiksdC5yZW1vdmVMaXN0ZW5lcigiZHJhaW4iLGkpLHIucmVtb3ZlTGlzdGVuZXIoImVuZCIsYSksci5yZW1vdmVMaXN0ZW5lcigiY2xvc2UiLHMpLHIucmVtb3ZlTGlzdGVuZXIoImVycm9yIix1KSx0LnJlbW92ZUxpc3RlbmVyKCJlcnJvciIsdSksci5yZW1vdmVMaXN0ZW5lcigiZW5kIixmKSxyLnJlbW92ZUxpc3RlbmVyKCJjbG9zZSIsZiksdC5yZW1vdmVMaXN0ZW5lcigiY2xvc2UiLGYpfXJldHVybiByLm9uKCJlcnJvciIsdSksdC5vbigiZXJyb3IiLHUpLHIub24oImVuZCIsZiksci5vbigiY2xvc2UiLGYpLHQub24oImNsb3NlIixmKSx0LmVtaXQoInBpcGUiLHIpLHR9LHNvLnRocm91Z2g9c287bGV0IHVvPXtwYXJzZTpmdW5jdGlvbih0LGUpe2xldCByLG47ZnVuY3Rpb24gaSh0LGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdD9lPT09dDp0JiYiZnVuY3Rpb24iPT10eXBlb2YgdC5leGVjP3QuZXhlYyhlKToiYm9vbGVhbiI9PXR5cGVvZiB0fHwib2JqZWN0Ij09dHlwZW9mIHQ/dDoiZnVuY3Rpb24iPT10eXBlb2YgdCYmdChlKX1sZXQgbz1uZXcgYmksYT1zbygoZnVuY3Rpb24odCl7InN0cmluZyI9PXR5cGVvZiB0JiYodD1hdC5mcm9tKHQpKSxvLndyaXRlKHQpfSksKGZ1bmN0aW9uKHQpe3QmJmEud3JpdGUodCksciYmYS5lbWl0KCJoZWFkZXIiLHIpLG4mJmEuZW1pdCgiZm9vdGVyIixuKSxhLnF1ZXVlKG51bGwpfSkpO2Z1bmN0aW9uIHModCxlKXshMSE9PXImJihyPXJ8fHt9LHJbdF09ZSksITEhPT1uJiYhMT09PXImJihuPW58fHt9LG5bdF09ZSl9cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0JiYodD10LnNwbGl0KCIuIikubWFwKChmdW5jdGlvbih0KXtyZXR1cm4iJCoiPT09dD97ZW1pdEtleTohMH06IioiPT09dHx8KCIiPT09dD97cmVjdXJzZTohMH06dCl9KSkpLHQmJnQubGVuZ3RofHwodD1udWxsKSxvLm9uVmFsdWU9ZnVuY3Rpb24obil7aWYodGhpcy5yb290fHwoYS5yb290PW4pLCF0KXJldHVybjtsZXQgbz0wLHU9MCxmPSExLGg9ITE7Zm9yKDtvPHQubGVuZ3RoOyl7bGV0IGUscj10W29dO2lmKHUrKyxyJiYhci5yZWN1cnNlKXtpZihlPXU9PT10aGlzLnN0YWNrLmxlbmd0aD90aGlzOnRoaXMuc3RhY2tbdV0sIWUpcmV0dXJuO2lmKCFpKHIsZS5rZXkpKXJldHVybiB2b2lkIHMoZS5rZXksbik7Zj0hIXIuZW1pdEtleSxoPSEhci5lbWl0UGF0aCxvKyt9ZWxzZXtvKys7bGV0IHI9dFtvXTtpZighcilyZXR1cm47Zm9yKDs7KXtpZihlPXU9PT10aGlzLnN0YWNrLmxlbmd0aD90aGlzOnRoaXMuc3RhY2tbdV0sIWUpcmV0dXJuO2lmKGkocixlLmtleSkpe28rKyxPYmplY3QuaXNGcm96ZW4odGhpcy5zdGFja1t1XSl8fCh0aGlzLnN0YWNrW3VdLnZhbHVlPW51bGwpO2JyZWFrfXMoZS5rZXksbiksdSsrfX19aWYociYmKGEuZW1pdCgiaGVhZGVyIixyKSxyPSExKSx1IT09dGhpcy5zdGFjay5sZW5ndGgpcmV0dXJuO2xldCBsPXRoaXMuc3RhY2suc2xpY2UoMSkubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdC5rZXl9KSkuY29uY2F0KFt0aGlzLmtleV0pLGM9bjtudWxsIT1jJiZudWxsIT0oYz1lP2UoYyxsKTpjKSYmKChmfHxoKSYmKGM9e3ZhbHVlOmN9LGYmJihjLmtleT10aGlzLmtleSksaCYmKGMucGF0aD1sKSksYS5xdWV1ZShjKSksdGhpcy52YWx1ZSYmZGVsZXRlIHRoaXMudmFsdWVbdGhpcy5rZXldO2ZvcihsZXQgdCBpbiB0aGlzLnN0YWNrKU9iamVjdC5pc0Zyb3plbih0aGlzLnN0YWNrW3RdKXx8KHRoaXMuc3RhY2tbdF0udmFsdWU9bnVsbCl9LG8uX29uVG9rZW49by5vblRva2VuLG8ub25Ub2tlbj1mdW5jdGlvbihlLHIpe28uX29uVG9rZW4oZSxyKSwwPT09dGhpcy5zdGFjay5sZW5ndGgmJmEucm9vdCYmKHR8fGEucXVldWUoYS5yb290KSxhLnJvb3Q9bnVsbCl9LG8ub25FcnJvcj1mdW5jdGlvbih0KXt0Lm1lc3NhZ2UuaW5kZXhPZigiYXQgcG9zaXRpb24iKT4tMSYmKHQubWVzc2FnZT0iSW52YWxpZCBKU09OICgiK3QubWVzc2FnZSsiKSIpLGEuZW1pdCgiZXJyb3IiLHQpfSxhfX0sZm89ZnVuY3Rpb24odCxlKXtyZXR1cm4gZm89T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKHQsZSl7dC5fX3Byb3RvX189ZX18fGZ1bmN0aW9uKHQsZSl7Zm9yKGxldCByIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShyKSYmKHRbcl09ZVtyXSl9LGZvKHQsZSl9O2xldCBobyxsbz0vW1xcIlx1MDAwMC1cdTAwMWZcdTAwN2YtXHUwMDlmXHUwMGFkXHUwNjAwLVx1MDYwNFx1MDcwZlx1MTdiNFx1MTdiNVx1MjAwYy1cdTIwMGZcdTIwMjgtXHUyMDJmXHUyMDYwLVx1MjA2Zlx1ZmVmZlx1ZmZmMC1cdWZmZmZdL2csY289eyJcYiI6IlxcYiIsIlx0IjoiXFx0IiwiXG4iOiJcXG4iLCJcZiI6IlxcZiIsIlxyIjoiXFxyIiwnIic6J1xcIicsIlxcIjoiXFxcXCJ9O2Z1bmN0aW9uIHBvKHQpe3JldHVybiB0PyJmdW5jdGlvbiI9PXR5cGVvZiB0LnRoZW4/aG8uUHJvbWlzZTpmdW5jdGlvbih0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdC5yZWFkJiYiZnVuY3Rpb24iPT10eXBlb2YgdC5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHQucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdC5waXBlJiYiZnVuY3Rpb24iPT10eXBlb2YgdC5vbmNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdC5yZW1vdmVMaXN0ZW5lcn0odCk/dC5fcmVhZGFibGVTdGF0ZS5vYmplY3RNb2RlP2hvLlJlYWRhYmxlT2JqZWN0OmhvLlJlYWRhYmxlU3RyaW5nOkFycmF5LmlzQXJyYXkodCk/aG8uQXJyYXk6Im9iamVjdCI9PXR5cGVvZiB0fHx0IGluc3RhbmNlb2YgT2JqZWN0P2hvLk9iamVjdDpoby5QcmltaXRpdmU6aG8uUHJpbWl0aXZlfSFmdW5jdGlvbih0KXt0W3QuQXJyYXk9MF09IkFycmF5Iix0W3QuT2JqZWN0PTFdPSJPYmplY3QiLHRbdC5SZWFkYWJsZVN0cmluZz0yXT0iUmVhZGFibGVTdHJpbmciLHRbdC5SZWFkYWJsZU9iamVjdD0zXT0iUmVhZGFibGVPYmplY3QiLHRbdC5QcmltaXRpdmU9NF09IlByaW1pdGl2ZSIsdFt0LlByb21pc2U9NV09IlByb21pc2UifShob3x8KGhvPXt9KSk7bGV0IGdvPVtdO2dvW2hvLkFycmF5XT0iWyIsZ29baG8uT2JqZWN0XT0ieyIsZ29baG8uUmVhZGFibGVTdHJpbmddPSciJyxnb1toby5SZWFkYWJsZU9iamVjdF09IlsiO2xldCB5bz1bXTt5b1toby5BcnJheV09Il0iLHlvW2hvLk9iamVjdF09In0iLHlvW2hvLlJlYWRhYmxlU3RyaW5nXT0nIicseW9baG8uUmVhZGFibGVPYmplY3RdPSJdIjtsZXQgYm89W107Zm9yKGxldCB0PTAsZT1PYmplY3QuZW50cmllcyhobyk7dDxlLmxlbmd0aDt0Kyspe2xldCByPWVbdF0sbj1yWzBdLGk9clsxXTsibnVtYmVyIj09dHlwZW9mIGkmJihib1tpXT0icHJvY2VzcyIrbil9ZnVuY3Rpb24gdm8odCl7cmV0dXJuIHQucmVwbGFjZShsbywoZnVuY3Rpb24odCl7bGV0IGU9Y29bdF07cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlP2U6IlxcdSIrdC5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KS5wYWRTdGFydCg0LCIwIil9KSl9ZnVuY3Rpb24gd28odCl7cmV0dXJuJyInK3ZvKHQpKyciJ31mdW5jdGlvbiBtbyh0LGUpe2xldCByPXQucmVhZChlKTtyZXR1cm4gbnVsbD09PXI/bmV3IFByb21pc2UoKGZ1bmN0aW9uKGUscil7bGV0IG49ZnVuY3Rpb24oKXtyZXR1cm4gZShudWxsKX07dC5vbmNlKCJlbmQiLG4pLHQub25jZSgiZXJyb3IiLHIpLHQub25jZSgicmVhZGFibGUiLChmdW5jdGlvbigpe3QucmVtb3ZlTGlzdGVuZXIoImVuZCIsbiksdC5yZW1vdmVMaXN0ZW5lcigiZXJyb3IiLHIpLGUodC5yZWFkKCkpfSkpfSkpOlByb21pc2UucmVzb2x2ZShyKX1mdW5jdGlvbiBfbyh0KXtyZXR1cm4gdC50aGVuKChmdW5jdGlvbih0KXtyZXR1cm4gcG8odCk9PT1oby5Qcm9taXNlP19vKHQpOnR9KSl9bGV0IFNvPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxyLG4saSl7dm9pZCAwPT09aSYmKGk9ITEpO2xldCBvPXQuY2FsbCh0aGlzKXx8dGhpcztvLmN5Y2xlPWksby5zdGFjaz1bXSxvLmRlcHRoPTAsby5wdXNoQ2FsbGVkPSExLG8uZW5kPSExLG8uaXNSZWFkaW5nPSExLG8ucmVhZE1vcmU9ITE7bGV0IGE9dHlwZW9mIG47cmV0dXJuInN0cmluZyIhPT1hJiYibnVtYmVyIiE9PWF8fChvLmdhcD1OdW1iZXIuaXNGaW5pdGUobik/IiAiLnJlcGVhdChuKTpuKSxPYmplY3QuYXNzaWduKG8se3Zpc2l0ZWQ6aT9uZXcgV2Vha01hcDpuZXcgV2Vha1NldCxyZXBsYWNlckZ1bmN0aW9uOnIgaW5zdGFuY2VvZiBGdW5jdGlvbiYmcixyZXBsYWNlckFycmF5OkFycmF5LmlzQXJyYXkocikmJnJ9KSxyIGluc3RhbmNlb2YgRnVuY3Rpb24mJihvLnJlcGxhY2VyRnVuY3Rpb249ciksQXJyYXkuaXNBcnJheShyKSYmKG8ucmVwbGFjZXJBcnJheT1yKSxvLmFkZFRvU3RhY2soZSksb31yZXR1cm4gZnVuY3Rpb24odCxlKXtmdW5jdGlvbiByKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWZvKHQsZSksdC5wcm90b3R5cGU9bnVsbD09PWU/T2JqZWN0LmNyZWF0ZShlKTooci5wcm90b3R5cGU9ZS5wcm90b3R5cGUsbmV3IHIpfShlLHQpLGUucHJvdG90eXBlLmN5Y2xlcj1mdW5jdGlvbih0LGUpe2xldCByPXRoaXMudmlzaXRlZC5nZXQoZSk7aWYocilyZXR1cm57JHJlZjpyfTtsZXQgbj10aGlzLnBhdGgoKTtyZXR1cm4gdm9pZCAwIT09dCYmbi5wdXNoKHQpLG49bi5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiJbIisoTnVtYmVyLmlzSW50ZWdlcih0KT90OndvKHQpKSsiXSJ9KSksdGhpcy52aXNpdGVkLnNldChlLG4ubGVuZ3RoPyIkIituLmpvaW4oIiIpOiIkIiksZX0sZS5wcm90b3R5cGUuYWRkVG9TdGFjaz1mdW5jdGlvbih0LGUscixuKXtsZXQgaSxvLGE9dGhpcyxzPXQ7dGhpcy5yZXBsYWNlckZ1bmN0aW9uJiYocz10aGlzLnJlcGxhY2VyRnVuY3Rpb24oZXx8cixzLHRoaXMpKSxzJiZzLnRvSlNPTiBpbnN0YW5jZW9mIEZ1bmN0aW9uJiYocz1zLnRvSlNPTigpKSwocyBpbnN0YW5jZW9mIEZ1bmN0aW9ufHwic3ltYm9sIj09dHlwZW9mIHQpJiYocz12b2lkIDApLHZvaWQgMCE9PWUmJnRoaXMucmVwbGFjZXJBcnJheSYmKHRoaXMucmVwbGFjZXJBcnJheS5pbmNsdWRlcyhlKXx8KHM9dm9pZCAwKSk7bGV0IHU9cG8ocyk7aWYoKG4mJm4udHlwZT09PWhvLkFycmF5fHx2b2lkIDAhPT1zKSYmdSE9PWhvLlByb21pc2UmJihuJiYhbi5maXJzdCYmdGhpcy5fcHVzaCgiLCIpLG4mJihuLmZpcnN0PSExKSksdm9pZCAwIT09cyYmdSE9PWhvLlByb21pc2UmJmUmJih0aGlzLmdhcD90aGlzLl9wdXNoKCJcbiIrdGhpcy5nYXAucmVwZWF0KHRoaXMuZGVwdGgpKyciJyt2byhlKSsnIjogJyk6dGhpcy5fcHVzaCgnIicrdm8oZSkrJyI6JykpLHUhPT1oby5QcmltaXRpdmUpaWYodGhpcy5jeWNsZSlzPXRoaXMuY3ljbGVyKGV8fHIscyksdT1wbyhzKTtlbHNle2lmKHRoaXMudmlzaXRlZC5oYXMocykpdGhyb3cgT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoIkNvbnZlcnRpbmcgY2lyY3VsYXIgc3RydWN0dXJlIHRvIEpTT04iKSx7cmVhbFZhbHVlOnMsa2V5OmV8fHJ9KTt0aGlzLnZpc2l0ZWQuYWRkKHMpfSFlJiZyPi0xJiZ0aGlzLmRlcHRoJiZ0aGlzLmdhcCYmdGhpcy5fcHVzaCgiXG4iK3RoaXMuZ2FwLnJlcGVhdCh0aGlzLmRlcHRoKSk7bGV0IGY9Z29bdV07ZiYmdGhpcy5fcHVzaChmKTtsZXQgaD17a2V5OmUsaW5kZXg6cix0eXBlOnUscGFyZW50Om4sdmFsdWU6cyxmaXJzdDohMH07cmV0dXJuIHU9PT1oby5PYmplY3Q/KHRoaXMuZGVwdGgrPTEsaC51bnJlYWQ9T2JqZWN0LmtleXMocyksaC5pc0VtcHR5PSFoLnVucmVhZC5sZW5ndGgpOnU9PT1oby5BcnJheT8odGhpcy5kZXB0aCs9MSxoLnVucmVhZD1zLmxlbmd0aCxoLmFycmF5TGVuZ3RoPWgudW5yZWFkLGguaXNFbXB0eT0haC51bnJlYWQpOnUhPT1oby5SZWFkYWJsZVN0cmluZyYmdSE9PWhvLlJlYWRhYmxlT2JqZWN0fHwodGhpcy5kZXB0aCs9MSxzLnJlYWRhYmxlRW5kZWR8fChudWxsPT09KGk9cy5fcmVhZGFibGVTdGF0ZSl8fHZvaWQgMD09PWk/dm9pZCAwOmkuZW5kRW1pdHRlZCk/dGhpcy5lbWl0KCJlcnJvciIsbmV3IEVycm9yKCJSZWFkYWJsZSBTdHJlYW0gaGFzIGVuZGVkIGJlZm9yZSBpdCB3YXMgc2VyaWFsaXplZC4gQWxsIHN0cmVhbSBkYXRhIGhhdmUgYmVlbiBsb3N0IikscyxlfHxyKToocy5yZWFkYWJsZUZsb3dpbmd8fChudWxsPT09KG89cy5fcmVhZGFibGVTdGF0ZSl8fHZvaWQgMD09PW8/dm9pZCAwOm8uZmxvd2luZykpJiYocy5wYXVzZSgpLHRoaXMuZW1pdCgiZXJyb3IiLG5ldyBFcnJvcigiUmVhZGFibGUgU3RyZWFtIGlzIGluIGZsb3dpbmcgbW9kZSwgZGF0YSBtYXkgaGF2ZSBiZWVuIGxvc3QuIFRyeWluZyB0byBwYXVzZSBzdHJlYW0uIikscyxlfHxyKSksaC5yZWFkQ291bnQ9MCxzLm9uY2UoImVuZCIsKGZ1bmN0aW9uKCl7aC5lbmQ9ITAsYS5fX3JlYWQoKX0pKSxzLm9uY2UoImVycm9yIiwoZnVuY3Rpb24odCl7YS5lcnJvcj0hMCxhLmVtaXQoImVycm9yIix0KX0pKSksdGhpcy5zdGFjay51bnNoaWZ0KGgpLGh9LGUucHJvdG90eXBlLnJlbW92ZUZyb21TdGFjaz1mdW5jdGlvbih0KXtsZXQgZT10LnR5cGUscj1lPT09aG8uT2JqZWN0fHxlPT09aG8uQXJyYXl8fGU9PT1oby5SZWFkYWJsZVN0cmluZ3x8ZT09PWhvLlJlYWRhYmxlT2JqZWN0O2UhPT1oby5QcmltaXRpdmUmJih0aGlzLmN5Y2xlfHx0aGlzLnZpc2l0ZWQuZGVsZXRlKHQudmFsdWUpLHImJih0aGlzLmRlcHRoLT0xKSk7bGV0IG49eW9bZV07ciYmIXQuaXNFbXB0eSYmdGhpcy5nYXAmJnRoaXMuX3B1c2goIlxuIit0aGlzLmdhcC5yZXBlYXQodGhpcy5kZXB0aCkpLG4mJnRoaXMuX3B1c2gobik7bGV0IGk9dGhpcy5zdGFjay5pbmRleE9mKHQpO3RoaXMuc3RhY2suc3BsaWNlKGksMSl9LGUucHJvdG90eXBlLl9wdXNoPWZ1bmN0aW9uKHQpe3RoaXMucHVzaENhbGxlZD0hMCx0aGlzLnB1c2godCl9LGUucHJvdG90eXBlLnByb2Nlc3NSZWFkYWJsZU9iamVjdD1mdW5jdGlvbih0LGUpe2xldCByPXRoaXM7aWYoIXQuZW5kKXJldHVybiBtbyh0LnZhbHVlLGUpLnRoZW4oKGZ1bmN0aW9uKGUpe251bGwhPT1lJiYodC5maXJzdHx8ci5fcHVzaCgiLCIpLHQuZmlyc3Q9ITEsci5hZGRUb1N0YWNrKGUsdm9pZCAwLHQucmVhZENvdW50KSx0LnJlYWRDb3VudCs9MSl9KSk7dGhpcy5yZW1vdmVGcm9tU3RhY2sodCl9LGUucHJvdG90eXBlLnByb2Nlc3NPYmplY3Q9ZnVuY3Rpb24odCl7aWYoIXQudW5yZWFkLmxlbmd0aClyZXR1cm4gdm9pZCB0aGlzLnJlbW92ZUZyb21TdGFjayh0KTtsZXQgZT10LnVucmVhZC5zaGlmdCgpLHI9dC52YWx1ZVtlXTt0aGlzLmFkZFRvU3RhY2socixlLHZvaWQgMCx0KX0sZS5wcm90b3R5cGUucHJvY2Vzc0FycmF5PWZ1bmN0aW9uKHQpe2xldCBlPXQudW5yZWFkO2lmKCFlKXJldHVybiB2b2lkIHRoaXMucmVtb3ZlRnJvbVN0YWNrKHQpO2xldCByPXQuYXJyYXlMZW5ndGgtZSxuPXQudmFsdWVbcl07dC51bnJlYWQtPTEsdGhpcy5hZGRUb1N0YWNrKG4sdm9pZCAwLHIsdCl9LGUucHJvdG90eXBlLnByb2Nlc3NQcmltaXRpdmU9ZnVuY3Rpb24odCl7aWYodm9pZCAwIT09dC52YWx1ZSl7bGV0IGUscj10eXBlb2YgdC52YWx1ZTtzd2l0Y2gocil7Y2FzZSJzdHJpbmciOmU9d28odC52YWx1ZSk7YnJlYWs7Y2FzZSJudW1iZXIiOmU9TnVtYmVyLmlzRmluaXRlKHQudmFsdWUpP1N0cmluZyh0LnZhbHVlKToibnVsbCI7YnJlYWs7Y2FzZSJib29sZWFuIjplPVN0cmluZyh0LnZhbHVlKTticmVhaztjYXNlIm9iamVjdCI6dC52YWx1ZXx8KGU9Im51bGwiKTticmVhaztkZWZhdWx0OnRocm93IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKCdVbmtub3duIHR5cGUgIicrcisnIi4gUGxlYXNlIGZpbGUgYW4gaXNzdWUhJykse3ZhbHVlOnQudmFsdWV9KX10aGlzLl9wdXNoKGUpfWVsc2UhdGhpcy5zdGFja1sxXXx8dGhpcy5zdGFja1sxXS50eXBlIT09aG8uQXJyYXkmJnRoaXMuc3RhY2tbMV0udHlwZSE9PWhvLlJlYWRhYmxlT2JqZWN0P3QuYWRkU2VwYXJhdG9yQWZ0ZXJFbmQ9ITE6dGhpcy5fcHVzaCgibnVsbCIpO3RoaXMucmVtb3ZlRnJvbVN0YWNrKHQpfSxlLnByb3RvdHlwZS5wcm9jZXNzUmVhZGFibGVTdHJpbmc9ZnVuY3Rpb24odCxlKXtsZXQgcj10aGlzO2lmKCF0LmVuZClyZXR1cm4gbW8odC52YWx1ZSxlKS50aGVuKChmdW5jdGlvbih0KXt0JiZyLl9wdXNoKHZvKHQudG9TdHJpbmcoKSkpfSkpO3RoaXMucmVtb3ZlRnJvbVN0YWNrKHQpfSxlLnByb3RvdHlwZS5wcm9jZXNzUHJvbWlzZT1mdW5jdGlvbih0KXtsZXQgZT10aGlzO3JldHVybiBfbyh0LnZhbHVlKS50aGVuKChmdW5jdGlvbihyKXtlLnJlbW92ZUZyb21TdGFjayh0KSxlLmFkZFRvU3RhY2socix0LmtleSx0LmluZGV4LHQucGFyZW50KX0pKX0sZS5wcm90b3R5cGUucHJvY2Vzc1N0YWNrVG9wSXRlbT1mdW5jdGlvbih0KXtsZXQgZSxyPXRoaXMsbj10aGlzLnN0YWNrWzBdO2lmKCFufHx0aGlzLmVycm9yKXJldHVybiBQcm9taXNlLnJlc29sdmUoKTt0cnl7ZT10aGlzW2JvW24udHlwZV1dKG4sdCl9Y2F0Y2godCl7cmV0dXJuIFByb21pc2UucmVqZWN0KHQpfXJldHVybiBQcm9taXNlLnJlc29sdmUoZSkudGhlbigoZnVuY3Rpb24oKXswPT09ci5zdGFjay5sZW5ndGgmJihyLmVuZD0hMCxyLl9wdXNoKG51bGwpKX0pKX0sZS5wcm90b3R5cGUuX19yZWFkPWZ1bmN0aW9uKHQpe2xldCBlPXRoaXM7aWYoIXRoaXMuaXNSZWFkaW5nJiYhdGhpcy5lcnJvcilyZXR1cm4gdGhpcy5pc1JlYWRpbmc9ITAsdGhpcy5yZWFkTW9yZT0hMSx0aGlzLnByb2Nlc3NTdGFja1RvcEl0ZW0odCkudGhlbigoZnVuY3Rpb24oKXshZS5lbmQmJiFlLmVycm9yJiYoZS5yZWFkTW9yZXx8IWUucHVzaENhbGxlZCk/Ym4oKGZ1bmN0aW9uKCl7ZS5pc1JlYWRpbmc9ITEsZS5fX3JlYWQoKX0pKTplLmlzUmVhZGluZz0hMX0pKS5jYXRjaCgoZnVuY3Rpb24odCl7ZS5lcnJvcj0hMCxlLmVtaXQoImVycm9yIix0KX0pKTt0aGlzLnJlYWRNb3JlPSEwfSxlLnByb3RvdHlwZS5fcmVhZD1mdW5jdGlvbih0KXt0aGlzLnB1c2hDYWxsZWQ9ITEsdGhpcy5fX3JlYWQodCl9LGUucHJvdG90eXBlLnBhdGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGFjay5tYXAoKGZ1bmN0aW9uKHQpe2xldCBlPXQua2V5LHI9dC5pbmRleDtyZXR1cm4gZXx8cn0pKS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiB0fHx0Pi0xfSkpLnJldmVyc2UoKX0sZX0oamkpO3ZhciBFbz1BcnJheS5pc0FycmF5LGtvPSJvYmplY3QiPT10eXBlb2YgaiYmaiYmai5PYmplY3Q9PT1PYmplY3QmJmosUm89Im9iamVjdCI9PXR5cGVvZiBzZWxmJiZzZWxmJiZzZWxmLk9iamVjdD09PU9iamVjdCYmc2VsZixqbz1rb3x8Um98fEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCksVG89am8uU3ltYm9sLE9vPU9iamVjdC5wcm90b3R5cGUsQW89T28uaGFzT3duUHJvcGVydHksQ289T28udG9TdHJpbmcsTW89VG8/VG8udG9TdHJpbmdUYWc6dm9pZCAwO3ZhciB4bz1mdW5jdGlvbih0KXt2YXIgZT1Bby5jYWxsKHQsTW8pLHI9dFtNb107dHJ5e3RbTW9dPXZvaWQgMDt2YXIgbj0hMH1jYXRjaCh0KXt9dmFyIGk9Q28uY2FsbCh0KTtyZXR1cm4gbiYmKGU/dFtNb109cjpkZWxldGUgdFtNb10pLGl9LExvPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7dmFyIEJvPWZ1bmN0aW9uKHQpe3JldHVybiBMby5jYWxsKHQpfSxQbz1Ubz9Uby50b1N0cmluZ1RhZzp2b2lkIDA7dmFyIFVvPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3ZvaWQgMD09PXQ/IltvYmplY3QgVW5kZWZpbmVkXSI6IltvYmplY3QgTnVsbF0iOlBvJiZQbyBpbiBPYmplY3QodCk/eG8odCk6Qm8odCl9O3ZhciBObz1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dCYmIm9iamVjdCI9PXR5cGVvZiB0fTt2YXIgRG89ZnVuY3Rpb24odCl7cmV0dXJuInN5bWJvbCI9PXR5cGVvZiB0fHxObyh0KSYmIltvYmplY3QgU3ltYm9sXSI9PVVvKHQpfSxJbz0vXC58XFsoPzpbXltcXV0qfChbIiddKSg/Oig/IVwxKVteXFxdfFxcLikqP1wxKVxdLyxxbz0vXlx3KiQvO3ZhciBGbz1mdW5jdGlvbih0LGUpe2lmKEVvKHQpKXJldHVybiExO3ZhciByPXR5cGVvZiB0O3JldHVybiEoIm51bWJlciIhPXImJiJzeW1ib2wiIT1yJiYiYm9vbGVhbiIhPXImJm51bGwhPXQmJiFEbyh0KSl8fChxby50ZXN0KHQpfHwhSW8udGVzdCh0KXx8bnVsbCE9ZSYmdCBpbiBPYmplY3QoZSkpfTt2YXIgV289ZnVuY3Rpb24odCl7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuIG51bGwhPXQmJigib2JqZWN0Ij09ZXx8ImZ1bmN0aW9uIj09ZSl9O3ZhciB6byxZbz1mdW5jdGlvbih0KXtpZighV28odCkpcmV0dXJuITE7dmFyIGU9VW8odCk7cmV0dXJuIltvYmplY3QgRnVuY3Rpb25dIj09ZXx8IltvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dIj09ZXx8IltvYmplY3QgQXN5bmNGdW5jdGlvbl0iPT1lfHwiW29iamVjdCBQcm94eV0iPT1lfSwkbz1qb1siX19jb3JlLWpzX3NoYXJlZF9fIl0sSG89KHpvPS9bXi5dKyQvLmV4ZWMoJG8mJiRvLmtleXMmJiRvLmtleXMuSUVfUFJPVE98fCIiKSk/IlN5bWJvbChzcmMpXzEuIit6bzoiIjt2YXIgSm89ZnVuY3Rpb24odCl7cmV0dXJuISFIbyYmSG8gaW4gdH0sR289RnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nO3ZhciBWbz1mdW5jdGlvbih0KXtpZihudWxsIT10KXt0cnl7cmV0dXJuIEdvLmNhbGwodCl9Y2F0Y2godCl7fXRyeXtyZXR1cm4gdCsiIn1jYXRjaCh0KXt9fXJldHVybiIifSxLbz0vXlxbb2JqZWN0IC4rP0NvbnN0cnVjdG9yXF0kLyxabz1GdW5jdGlvbi5wcm90b3R5cGUsWG89T2JqZWN0LnByb3RvdHlwZSxRbz1aby50b1N0cmluZyx0YT1Yby5oYXNPd25Qcm9wZXJ0eSxlYT1SZWdFeHAoIl4iK1FvLmNhbGwodGEpLnJlcGxhY2UoL1tcXF4kLiorPygpW1xde318XS9nLCJcXCQmIikucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXCgpfCBmb3IgLis/KD89XFxcXSkvZywiJDEuKj8iKSsiJCIpO3ZhciByYT1mdW5jdGlvbih0KXtyZXR1cm4hKCFXbyh0KXx8Sm8odCkpJiYoWW8odCk/ZWE6S28pLnRlc3QoVm8odCkpfTt2YXIgbmE9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09dD92b2lkIDA6dFtlXX07dmFyIGlhPWZ1bmN0aW9uKHQsZSl7dmFyIHI9bmEodCxlKTtyZXR1cm4gcmEocik/cjp2b2lkIDB9LG9hPWlhKE9iamVjdCwiY3JlYXRlIik7dmFyIGFhPWZ1bmN0aW9uKCl7dGhpcy5fX2RhdGFfXz1vYT9vYShudWxsKTp7fSx0aGlzLnNpemU9MH07dmFyIHNhPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuaGFzKHQpJiZkZWxldGUgdGhpcy5fX2RhdGFfX1t0XTtyZXR1cm4gdGhpcy5zaXplLT1lPzE6MCxlfSx1YT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciBmYT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fO2lmKG9hKXt2YXIgcj1lW3RdO3JldHVybiJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIj09PXI/dm9pZCAwOnJ9cmV0dXJuIHVhLmNhbGwoZSx0KT9lW3RdOnZvaWQgMH0saGE9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgbGE9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXztyZXR1cm4gb2E/dm9pZCAwIT09ZVt0XTpoYS5jYWxsKGUsdCl9O3ZhciBjYT1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuX19kYXRhX187cmV0dXJuIHRoaXMuc2l6ZSs9dGhpcy5oYXModCk/MDoxLHJbdF09b2EmJnZvaWQgMD09PWU/Il9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iOmUsdGhpc307ZnVuY3Rpb24gZGEodCl7dmFyIGU9LTEscj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8cjspe3ZhciBuPXRbZV07dGhpcy5zZXQoblswXSxuWzFdKX19ZGEucHJvdG90eXBlLmNsZWFyPWFhLGRhLnByb3RvdHlwZS5kZWxldGU9c2EsZGEucHJvdG90eXBlLmdldD1mYSxkYS5wcm90b3R5cGUuaGFzPWxhLGRhLnByb3RvdHlwZS5zZXQ9Y2E7dmFyIHBhPWRhO3ZhciBnYT1mdW5jdGlvbigpe3RoaXMuX19kYXRhX189W10sdGhpcy5zaXplPTB9O3ZhciB5YT1mdW5jdGlvbih0LGUpe3JldHVybiB0PT09ZXx8dCE9dCYmZSE9ZX07dmFyIGJhPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPXQubGVuZ3RoO3ItLTspaWYoeWEodFtyXVswXSxlKSlyZXR1cm4gcjtyZXR1cm4tMX0sdmE9QXJyYXkucHJvdG90eXBlLnNwbGljZTt2YXIgd2E9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxyPWJhKGUsdCk7cmV0dXJuIShyPDApJiYocj09ZS5sZW5ndGgtMT9lLnBvcCgpOnZhLmNhbGwoZSxyLDEpLC0tdGhpcy5zaXplLCEwKX07dmFyIG1hPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX18scj1iYShlLHQpO3JldHVybiByPDA/dm9pZCAwOmVbcl1bMV19O3ZhciBfYT1mdW5jdGlvbih0KXtyZXR1cm4gYmEodGhpcy5fX2RhdGFfXyx0KT4tMX07dmFyIFNhPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5fX2RhdGFfXyxuPWJhKHIsdCk7cmV0dXJuIG48MD8oKyt0aGlzLnNpemUsci5wdXNoKFt0LGVdKSk6cltuXVsxXT1lLHRoaXN9O2Z1bmN0aW9uIEVhKHQpe3ZhciBlPS0xLHI9bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPHI7KXt2YXIgbj10W2VdO3RoaXMuc2V0KG5bMF0sblsxXSl9fUVhLnByb3RvdHlwZS5jbGVhcj1nYSxFYS5wcm90b3R5cGUuZGVsZXRlPXdhLEVhLnByb3RvdHlwZS5nZXQ9bWEsRWEucHJvdG90eXBlLmhhcz1fYSxFYS5wcm90b3R5cGUuc2V0PVNhO3ZhciBrYT1FYSxSYT1pYShqbywiTWFwIik7dmFyIGphPWZ1bmN0aW9uKCl7dGhpcy5zaXplPTAsdGhpcy5fX2RhdGFfXz17aGFzaDpuZXcgcGEsbWFwOm5ldyhSYXx8a2EpLHN0cmluZzpuZXcgcGF9fTt2YXIgVGE9ZnVuY3Rpb24odCl7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuInN0cmluZyI9PWV8fCJudW1iZXIiPT1lfHwic3ltYm9sIj09ZXx8ImJvb2xlYW4iPT1lPyJfX3Byb3RvX18iIT09dDpudWxsPT09dH07dmFyIE9hPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dC5fX2RhdGFfXztyZXR1cm4gVGEoZSk/clsic3RyaW5nIj09dHlwZW9mIGU/InN0cmluZyI6Imhhc2giXTpyLm1hcH07dmFyIEFhPWZ1bmN0aW9uKHQpe3ZhciBlPU9hKHRoaXMsdCkuZGVsZXRlKHQpO3JldHVybiB0aGlzLnNpemUtPWU/MTowLGV9O3ZhciBDYT1mdW5jdGlvbih0KXtyZXR1cm4gT2EodGhpcyx0KS5nZXQodCl9O3ZhciBNYT1mdW5jdGlvbih0KXtyZXR1cm4gT2EodGhpcyx0KS5oYXModCl9O3ZhciB4YT1mdW5jdGlvbih0LGUpe3ZhciByPU9hKHRoaXMsdCksbj1yLnNpemU7cmV0dXJuIHIuc2V0KHQsZSksdGhpcy5zaXplKz1yLnNpemU9PW4/MDoxLHRoaXN9O2Z1bmN0aW9uIExhKHQpe3ZhciBlPS0xLHI9bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPHI7KXt2YXIgbj10W2VdO3RoaXMuc2V0KG5bMF0sblsxXSl9fUxhLnByb3RvdHlwZS5jbGVhcj1qYSxMYS5wcm90b3R5cGUuZGVsZXRlPUFhLExhLnByb3RvdHlwZS5nZXQ9Q2EsTGEucHJvdG90eXBlLmhhcz1NYSxMYS5wcm90b3R5cGUuc2V0PXhhO3ZhciBCYT1MYTtmdW5jdGlvbiBQYSh0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0fHxudWxsIT1lJiYiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJFeHBlY3RlZCBhIGZ1bmN0aW9uIik7dmFyIHI9ZnVuY3Rpb24oKXt2YXIgbj1hcmd1bWVudHMsaT1lP2UuYXBwbHkodGhpcyxuKTpuWzBdLG89ci5jYWNoZTtpZihvLmhhcyhpKSlyZXR1cm4gby5nZXQoaSk7dmFyIGE9dC5hcHBseSh0aGlzLG4pO3JldHVybiByLmNhY2hlPW8uc2V0KGksYSl8fG8sYX07cmV0dXJuIHIuY2FjaGU9bmV3KFBhLkNhY2hlfHxCYSkscn1QYS5DYWNoZT1CYTt2YXIgVWE9UGE7dmFyIE5hPS9bXi5bXF1dK3xcWyg/OigtP1xkKyg/OlwuXGQrKT8pfChbIiddKSgoPzooPyFcMilbXlxcXXxcXC4pKj8pXDIpXF18KD89KD86XC58XFtcXSkoPzpcLnxcW1xdfCQpKS9nLERhPS9cXChcXCk/L2csSWE9ZnVuY3Rpb24odCl7dmFyIGU9VWEodCwoZnVuY3Rpb24odCl7cmV0dXJuIDUwMD09PXIuc2l6ZSYmci5jbGVhcigpLHR9KSkscj1lLmNhY2hlO3JldHVybiBlfSgoZnVuY3Rpb24odCl7dmFyIGU9W107cmV0dXJuIDQ2PT09dC5jaGFyQ29kZUF0KDApJiZlLnB1c2goIiIpLHQucmVwbGFjZShOYSwoZnVuY3Rpb24odCxyLG4saSl7ZS5wdXNoKG4/aS5yZXBsYWNlKERhLCIkMSIpOnJ8fHQpfSkpLGV9KSk7dmFyIHFhPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPS0xLG49bnVsbD09dD8wOnQubGVuZ3RoLGk9QXJyYXkobik7KytyPG47KWlbcl09ZSh0W3JdLHIsdCk7cmV0dXJuIGl9LEZhPVRvP1RvLnByb3RvdHlwZTp2b2lkIDAsV2E9RmE/RmEudG9TdHJpbmc6dm9pZCAwO3ZhciB6YT1mdW5jdGlvbiB0KGUpe2lmKCJzdHJpbmciPT10eXBlb2YgZSlyZXR1cm4gZTtpZihFbyhlKSlyZXR1cm4gcWEoZSx0KSsiIjtpZihEbyhlKSlyZXR1cm4gV2E/V2EuY2FsbChlKToiIjt2YXIgcj1lKyIiO3JldHVybiIwIj09ciYmMS9lPT0tSW5maW5pdHk/Ii0wIjpyfTt2YXIgWWE9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/IiI6emEodCl9O3ZhciAkYT1mdW5jdGlvbih0LGUpe3JldHVybiBFbyh0KT90OkZvKHQsZSk/W3RdOklhKFlhKHQpKX07dmFyIEhhPWZ1bmN0aW9uKHQpe2lmKCJzdHJpbmciPT10eXBlb2YgdHx8RG8odCkpcmV0dXJuIHQ7dmFyIGU9dCsiIjtyZXR1cm4iMCI9PWUmJjEvdD09LUluZmluaXR5PyItMCI6ZX07dmFyIEphPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPTAsbj0oZT0kYShlLHQpKS5sZW5ndGg7bnVsbCE9dCYmcjxuOyl0PXRbSGEoZVtyKytdKV07cmV0dXJuIHImJnI9PW4/dDp2b2lkIDB9O3ZhciBHYT1mdW5jdGlvbih0LGUscil7dmFyIG49bnVsbD09dD92b2lkIDA6SmEodCxlKTtyZXR1cm4gdm9pZCAwPT09bj9yOm59O3ZhciBWYT1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHR8fE5vKHQpJiYiW29iamVjdCBOdW1iZXJdIj09VW8odCl9O2Z1bmN0aW9uIEthKHQpe3JldHVybiJbb2JqZWN0IFN0cmluZ10iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIFphKHQpe3JldHVybiEoIUthKHQpfHwiIj09PXQpfWZ1bmN0aW9uIFhhKHQpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZnVuY3Rpb24gUWEodCl7cmV0dXJuIltvYmplY3QgVW5kZWZpbmVkXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZnVuY3Rpb24gdHModCl7cmV0dXJuIltvYmplY3QgT2JqZWN0XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZnVuY3Rpb24gZXModCl7cmV0dXJuISghS2EodCl8fCIiIT09dCl9ZnVuY3Rpb24gcnModCl7cmV0dXJuISFRYSh0KXx8KCEhZnVuY3Rpb24odCl7cmV0dXJuIltvYmplY3QgTnVsbF0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfSh0KXx8KCEhZnVuY3Rpb24odCl7aWYodHModCkpe2ZvcihsZXQgZSBpbiB0KXJldHVybiExO3JldHVybiEwfXJldHVybiExfSh0KXx8KCEhZXModCl8fCEhZnVuY3Rpb24odCl7cmV0dXJuISFYYSh0KSYmMD09PXQubGVuZ3RofSh0KSkpKX1mdW5jdGlvbiBucygpe2xldCB0LGUscj1uZXcgUHJvbWlzZSgoZnVuY3Rpb24oKXt0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXX0pKTtyZXR1cm4gci5yZXNvbHZlPXQsci5yZWplY3Q9ZSxyfWxldCBXSnNvblN0cmVhbT17cGFyc2U6YXN5bmMgZnVuY3Rpb24odCl7aWYoIVphKHQpKXJldHVybnt9O2xldCBlPXt9O3RyeXtlPUpTT04ucGFyc2UodCl9Y2F0Y2godCl7ZT17fX1yZXR1cm4gZX0scGFyc2VCeVN0cmVhbTpmdW5jdGlvbih0KXtsZXQgZT17fTtpZigibnVsbCI9PT10KXJldHVybiBudWxsO2lmKCIiPT09dClyZXR1cm57fTtsZXQgcj0iX19zeXN0ZW1fXyIsbj1geyJfX3N5c3RlbV9fIjoke3R9fWAsaT1ucygpLG89Um4obiksYT11by5wYXJzZSgiJCoiKTtyZXR1cm4gYS5vbigiZGF0YSIsKGZ1bmN0aW9uKHQpe2VbdC5rZXldPXQudmFsdWV9KSksYS5vbigiZW5kIiwoZnVuY3Rpb24oKXtsZXQgdD1HYShlLHIpO2kucmVzb2x2ZSh0KX0pKSxhLm9uKCJlcnJvciIsKGZ1bmN0aW9uKHQpe2kucmVqZWN0KHQpfSkpLG8ucGlwZShhKSxpfSxjcmVhdGVQYXJzZVN0cmVhbTpmdW5jdGlvbih0KXtyZXR1cm4gWmEodCl8fGZ1bmN0aW9uKHQpe3JldHVybiEoIVhhKHQpfHwwPT09dC5sZW5ndGh8fDE9PT10Lmxlbmd0aCYmcnModFswXSkpfSh0KXx8KHQ9IiQqIiksdW8ucGFyc2UodCl9LHN0cmluZ2lmeTphc3luYyBmdW5jdGlvbih0KXtpZihRYSh0KSlyZXR1cm4iIjtsZXQgZT0iIjt0cnl7ZT1KU09OLnN0cmluZ2lmeSh0KX1jYXRjaCh0KXtlPSIifXJldHVybiBlfSxzdHJpbmdpZnlCeVN0cmVhbTpmdW5jdGlvbih0KXtsZXQgZT0iIjtpZihRYSh0KSlyZXR1cm4iIjtpZihudWxsPT09dClyZXR1cm4ibnVsbCI7aWYoZXModCkpcmV0dXJuJyIiJztpZihWYSh0KSlyZXR1cm5gJHt0fWA7aWYoS2EodCkpcmV0dXJuYCIke3R9ImA7bGV0IHI9bnMoKSxuPW5ldyBTbyh0LG51bGwsbnVsbCwhMSk7cmV0dXJuIG4ub24oImRhdGEiLChmdW5jdGlvbih0KXtlKz10fSkpLG4ub24oImVuZCIsKGZ1bmN0aW9uKCl7ci5yZXNvbHZlKGUpfSkpLG4ub24oImVycm9yIiwoZnVuY3Rpb24odCl7ci5yZWplY3QodCl9KSkscn0sY3JlYXRlU3RyaW5naWZ5U3RyZWFtOmZ1bmN0aW9uKHQpe2lmKCF0cyh0KSYmIVhhKHQpKXRocm93IG5ldyBFcnJvcigiZGF0YSBpcyBub3Qgb2JqZWN0IG9yIGFycmF5Iik7cmV0dXJuIG5ldyBTbyh0LG51bGwsbnVsbCwhMSl9fTsKCmxldCBpbnN0YW5jZSA9IG51bGwKZnVuY3Rpb24gaW5pdChpbnB1dCl7CgogICAgLy9pbml0CiAgICBsZXQgcgogICAgCiAgICAgICAgciA9IFdKc29uU3RyZWFtKC4uLmlucHV0KQogICAgICAgIAoKICAgIC8vb24KICAgIAoKICAgIC8vc2F2ZQogICAgaW5zdGFuY2UgPSByCgp9CgpmdW5jdGlvbiBzZW5kTWVzc2FnZShkYXRhKSB7CiAgICAKICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKGRhdGEpCiAgICAgICAgCn0KCmFzeW5jIGZ1bmN0aW9uIHJ1bihkYXRhKSB7CiAgICAvLyBjb25zb2xlLmxvZygnaW5uZXIgd29ya2VyIHJ1bicsZGF0YSkKCiAgICAvL21vZGUKICAgIGxldCBtb2RlID0gZGF0YS5tb2RlCgogICAgLy9jaGVjawogICAgaWYobW9kZSAhPT0gJ2luaXQnICYmIG1vZGUgIT09ICdjYWxsJyl7CiAgICAgICAgcmV0dXJuCiAgICB9CgogICAgLy9pbml0CiAgICBpZihtb2RlID09PSAnaW5pdCcpewogICAgICAgIAogICAgICAgIHRyeXsKCiAgICAgICAgICAgIC8vdHlwZQogICAgICAgICAgICBsZXQgdHlwZSA9IGRhdGEudHlwZQoKICAgICAgICAgICAgLy9pbnB1dAogICAgICAgICAgICBsZXQgaW5wdXQgPSBkYXRhLmlucHV0CiAgICAKICAgICAgICAgICAgLy9pbnN0YW5jZQogICAgICAgICAgICBpZih0eXBlID09PSAnZnVuY3Rpb24nKXsKICAgICAgICAgICAgICAgIGluaXQoLi4uaW5wdXQpCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZih0eXBlID09PSAnb2JqZWN0Jyl7CiAgICAgICAgICAgICAgICBpbnN0YW5jZSA9IFdKc29uU3RyZWFtCiAgICAgICAgICAgIH0KCiAgICAgICAgfQogICAgICAgIGNhdGNoKGVycil7CiAgICAgICAgCiAgICAgICAgICAgIC8vc2VuZE1lc3NhZ2UKICAgICAgICAgICAgbGV0IHJlcyA9IHsKICAgICAgICAgICAgICAgIG1vZGU6ICdlbWl0JywKICAgICAgICAgICAgICAgIGV2TmFtZTogJ2Vycm9yJywKICAgICAgICAgICAgICAgIG1zZzogZXJyLAogICAgICAgICAgICB9CiAgICAgICAgICAgIHNlbmRNZXNzYWdlKHJlcykKCiAgICAgICAgfQogICAgICAgICAgICAKICAgIH0KCiAgICAvL2NoZWNrCiAgICBpZihtb2RlID09PSAnY2FsbCcpewogICAgICAgIGxldCBzdGF0ZSA9ICcnCiAgICAgICAgbGV0IG1zZyA9IG51bGwKCiAgICAgICAgdHJ5ewoKICAgICAgICAgICAgLy9mdW4KICAgICAgICAgICAgbGV0IGZ1biA9IGluc3RhbmNlW2RhdGEuZnVuXQoKICAgICAgICAgICAgLy9pbnB1dAogICAgICAgICAgICBsZXQgaW5wdXQgPSBkYXRhLmlucHV0CgogICAgICAgICAgICAvL2V4ZWMKICAgICAgICAgICAgYXdhaXQgZnVuKC4uLmlucHV0KQogICAgICAgICAgICAgICAgLnRoZW4oKHN1YykgPT4gewogICAgICAgICAgICAgICAgICAgIHN0YXRlPSdzdWNjZXNzJwogICAgICAgICAgICAgICAgICAgIG1zZz1zdWMKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAuY2F0Y2goKGVycikgPT4gewogICAgICAgICAgICAgICAgICAgIHN0YXRlPSdlcnJvcicKICAgICAgICAgICAgICAgICAgICBtc2c9ZXJyCiAgICAgICAgICAgICAgICB9KQoKICAgICAgICB9CiAgICAgICAgY2F0Y2goZXJyKXsKICAgICAgICAgICAgc3RhdGUgPSAnZXJyb3InCiAgICAgICAgICAgIG1zZyA9IGVycgogICAgICAgIH0KICAgICAgICAKICAgICAgICAvL3NlbmRNZXNzYWdlCiAgICAgICAgbGV0IHJlcyA9IHsKICAgICAgICAgICAgbW9kZTogJ3JldHVybicsCiAgICAgICAgICAgIGlkOiBkYXRhLmlkLAogICAgICAgICAgICBmdW46IGRhdGEuZnVuLAogICAgICAgICAgICBzdGF0ZSwKICAgICAgICAgICAgbXNnLAogICAgICAgIH0KICAgICAgICBzZW5kTWVzc2FnZShyZXMpCgogICAgfQoKfQoKZnVuY3Rpb24gcmVjdk1lc3NhZ2UoZGF0YSkgewogICAgLy8gY29uc29sZS5sb2coJ2lubmVyIHdvcmtlciByZWN2OicsIGRhdGEpCgogICAgLy9kYXRhUmVjdgogICAgbGV0IGRhdGFSZWN2ID0gZGF0YQoKICAgIC8vcnVuCiAgICBydW4oZGF0YVJlY3YpCgp9CgoKICAgICAgICBzZWxmLm9ubWVzc2FnZSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIHJlY3ZNZXNzYWdlKGUuZGF0YSkKICAgICAgICB9CiAgICAgICAgCgo=",p.Base64.decode(b));function X(){var Z=l();function b(l){try{var Z=new Blob([l]),d=window.URL||window.webkitURL;return new Worker(d.createObjectURL(Z))}catch(l){y(l)}}var c=b(G);if(!c)return y("invalid worker"),null;function X(){c?(c.terminate(),c=void 0):y("worker has been terminated")}function W(){var l={mode:"init",type:"object",input:Array.prototype.slice.call(arguments)};c.postMessage(l)}function u(){var l=d(),b=m(),G={mode:"call",id:b,fun:"stringify",input:Array.prototype.slice.call(arguments)};return c.postMessage(G),Z.once(b,(function(Z){"success"===Z.state?l.resolve(Z.msg):l.reject(Z.msg)})),l}function i(){var l=d(),b=m(),G={mode:"call",id:b,fun:"parse",input:Array.prototype.slice.call(arguments)};return c.postMessage(G),Z.once(b,(function(Z){"success"===Z.state?l.resolve(Z.msg):l.reject(Z.msg)})),l}function p(l){var d=l,m=d.mode;"emit"!==m&&"return"!==m||("emit"===m&&Z.emit(d.evName,d.msg),"return"===m&&Z.emit(d.id,d))}function y(l){Z.emit("error",l)}return c.onmessage=function(l){p(l.data)},c.onerror=y,W(Array.prototype.slice.call(arguments)),Z.stringify=u,Z.parse=i,Z.terminate=X,Z}var W,V,I={stringify:(V=c(i.mark((function l(){var d,m,b,c=arguments;return i.wrap((function(l){for(;;)switch(l.prev=l.next){case 0:return d=Array.prototype.slice.call(c),m=X(),l.next=4,m.stringify.apply(m,Z(d)).finally((function(){m.terminate()}));case 4:return b=l.sent,l.abrupt("return",b);case 6:case"end":return l.stop()}}),l)}))),function(){return V.apply(this,arguments)}),parse:(W=c(i.mark((function l(){var d,m,b,c=arguments;return i.wrap((function(l){for(;;)switch(l.prev=l.next){case 0:return d=Array.prototype.slice.call(c),m=X(),l.next=4,m.parse.apply(m,Z(d)).finally((function(){m.terminate()}));case 4:return b=l.sent,l.abrupt("return",b);case 6:case"end":return l.stop()}}),l)}))),function(){return W.apply(this,arguments)})};for(var h in u=l(),I){var a=I[h];u[h]=a}}(),u}()}));return"undefined"!=typeof window&&void 0!==window.document?X:G}));
1
+ !function(l,Z){"object"==typeof exports&&"undefined"!=typeof module?module.exports=Z(require("worker_threads")):"function"==typeof define&&define.amd?define(["worker_threads"],Z):(l="undefined"!=typeof globalThis?globalThis:l||self)["w-json-stream"]=Z(l.worker_threads)}(this,(function(l){"use strict";function Z(l){return l&&"object"==typeof l&&"default"in l?l:{default:l}}var d=Z(l);function m(l){return m="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(l){return typeof l}:function(l){return l&&"function"==typeof Symbol&&l.constructor===Symbol&&l!==Symbol.prototype?"symbol":typeof l},m(l)}"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;function c(l){var Z={exports:{}};return l(Z,Z.exports),Z.exports}var b=c((function(l,Z){l.exports=function(l){function Z(l,Z){(null==Z||Z>l.length)&&(Z=l.length);for(var d=0,m=new Array(Z);d<Z;d++)m[d]=l[d];return m}function d(l){return function(l){if(Array.isArray(l))return Z(l)}(l)||function(l){if("undefined"!=typeof Symbol&&null!=l[Symbol.iterator]||null!=l["@@iterator"])return Array.from(l)}(l)||function(l,d){if(l){if("string"==typeof l)return Z(l,d);var m=Object.prototype.toString.call(l).slice(8,-1);return"Object"===m&&l.constructor&&(m=l.constructor.name),"Map"===m||"Set"===m?Array.from(l):"Arguments"===m||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(m)?Z(l,d):void 0}}(l)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function c(l,Z,d,m,c,b,G){try{var X=l[b](G),i=X.value}catch(l){return void d(l)}X.done?Z(i):Promise.resolve(i).then(m,c)}function b(l){return function(){var Z=this,d=arguments;return new Promise((function(m,b){var G=l.apply(Z,d);function X(l){c(G,m,b,X,i,"next",l)}function i(l){c(G,m,b,X,i,"throw",l)}X(void 0)}))}}function G(l){return G="function"==typeof Symbol&&"symbol"==m(Symbol.iterator)?function(l){return m(l)}:function(l){return l&&"function"==typeof Symbol&&l.constructor===Symbol&&l!==Symbol.prototype?"symbol":m(l)},G(l)}function X(l){var Z={exports:{}};return l(Z,Z.exports),Z.exports}var i,W=X((function(l){var Z=function(l){var Z,d=Object.prototype,m=d.hasOwnProperty,c="function"==typeof Symbol?Symbol:{},b=c.iterator||"@@iterator",X=c.asyncIterator||"@@asyncIterator",i=c.toStringTag||"@@toStringTag";function W(l,Z,d){return Object.defineProperty(l,Z,{value:d,enumerable:!0,configurable:!0,writable:!0}),l[Z]}try{W({},"")}catch(l){W=function(l,Z,d){return l[Z]=d}}function u(l,Z,d,m){var c=Z&&Z.prototype instanceof n?Z:n,b=Object.create(c.prototype),G=new x(m||[]);return b._invoke=function(l,Z,d){var m=I;return function(c,b){if(m===V)throw new Error("Generator is already running");if(m===h){if("throw"===c)throw b;return g()}for(d.method=c,d.arg=b;;){var G=d.delegate;if(G){var X=H(G,d);if(X){if(X===a)continue;return X}}if("next"===d.method)d.sent=d._sent=d.arg;else if("throw"===d.method){if(m===I)throw m=h,d.arg;d.dispatchException(d.arg)}else"return"===d.method&&d.abrupt("return",d.arg);m=V;var i=y(l,Z,d);if("normal"===i.type){if(m=d.done?h:p,i.arg===a)continue;return{value:i.arg,done:d.done}}"throw"===i.type&&(m=h,d.method="throw",d.arg=i.arg)}}}(l,d,G),b}function y(l,Z,d){try{return{type:"normal",arg:l.call(Z,d)}}catch(l){return{type:"throw",arg:l}}}l.wrap=u;var I="suspendedStart",p="suspendedYield",V="executing",h="completed",a={};function n(){}function o(){}function K(){}var Y={};W(Y,b,(function(){return this}));var R=Object.getPrototypeOf,L=R&&R(R(T([])));L&&L!==d&&m.call(L,b)&&(Y=L);var s=K.prototype=n.prototype=Object.create(Y);function J(l){["next","throw","return"].forEach((function(Z){W(l,Z,(function(l){return this._invoke(Z,l)}))}))}function t(l,Z){function d(c,b,X,i){var W=y(l[c],l,b);if("throw"!==W.type){var u=W.arg,I=u.value;return I&&"object"===G(I)&&m.call(I,"__await")?Z.resolve(I.__await).then((function(l){d("next",l,X,i)}),(function(l){d("throw",l,X,i)})):Z.resolve(I).then((function(l){u.value=l,X(u)}),(function(l){return d("throw",l,X,i)}))}i(W.arg)}var c;this._invoke=function(l,m){function b(){return new Z((function(Z,c){d(l,m,Z,c)}))}return c=c?c.then(b,b):b()}}function H(l,d){var m=l.iterator[d.method];if(m===Z){if(d.delegate=null,"throw"===d.method){if(l.iterator.return&&(d.method="return",d.arg=Z,H(l,d),"throw"===d.method))return a;d.method="throw",d.arg=new TypeError("The iterator does not provide a 'throw' method")}return a}var c=y(m,l.iterator,d.arg);if("throw"===c.type)return d.method="throw",d.arg=c.arg,d.delegate=null,a;var b=c.arg;return b?b.done?(d[l.resultName]=b.value,d.next=l.nextLoc,"return"!==d.method&&(d.method="next",d.arg=Z),d.delegate=null,a):b:(d.method="throw",d.arg=new TypeError("iterator result is not an object"),d.delegate=null,a)}function S(l){var Z={tryLoc:l[0]};1 in l&&(Z.catchLoc=l[1]),2 in l&&(Z.finallyLoc=l[2],Z.afterLoc=l[3]),this.tryEntries.push(Z)}function C(l){var Z=l.completion||{};Z.type="normal",delete Z.arg,l.completion=Z}function x(l){this.tryEntries=[{tryLoc:"root"}],l.forEach(S,this),this.reset(!0)}function T(l){if(l){var d=l[b];if(d)return d.call(l);if("function"==typeof l.next)return l;if(!isNaN(l.length)){var c=-1,G=function d(){for(;++c<l.length;)if(m.call(l,c))return d.value=l[c],d.done=!1,d;return d.value=Z,d.done=!0,d};return G.next=G}}return{next:g}}function g(){return{value:Z,done:!0}}return o.prototype=K,W(s,"constructor",K),W(K,"constructor",o),o.displayName=W(K,i,"GeneratorFunction"),l.isGeneratorFunction=function(l){var Z="function"==typeof l&&l.constructor;return!!Z&&(Z===o||"GeneratorFunction"===(Z.displayName||Z.name))},l.mark=function(l){return Object.setPrototypeOf?Object.setPrototypeOf(l,K):(l.__proto__=K,W(l,i,"GeneratorFunction")),l.prototype=Object.create(s),l},l.awrap=function(l){return{__await:l}},J(t.prototype),W(t.prototype,X,(function(){return this})),l.AsyncIterator=t,l.async=function(Z,d,m,c,b){void 0===b&&(b=Promise);var G=new t(u(Z,d,m,c),b);return l.isGeneratorFunction(d)?G:G.next().then((function(l){return l.done?l.value:G.next()}))},J(s),W(s,i,"Generator"),W(s,b,(function(){return this})),W(s,"toString",(function(){return"[object Generator]"})),l.keys=function(l){var Z=[];for(var d in l)Z.push(d);return Z.reverse(),function d(){for(;Z.length;){var m=Z.pop();if(m in l)return d.value=m,d.done=!1,d}return d.done=!0,d}},l.values=T,x.prototype={constructor:x,reset:function(l){if(this.prev=0,this.next=0,this.sent=this._sent=Z,this.done=!1,this.delegate=null,this.method="next",this.arg=Z,this.tryEntries.forEach(C),!l)for(var d in this)"t"===d.charAt(0)&&m.call(this,d)&&!isNaN(+d.slice(1))&&(this[d]=Z)},stop:function(){this.done=!0;var l=this.tryEntries[0].completion;if("throw"===l.type)throw l.arg;return this.rval},dispatchException:function(l){if(this.done)throw l;var d=this;function c(m,c){return X.type="throw",X.arg=l,d.next=m,c&&(d.method="next",d.arg=Z),!!c}for(var b=this.tryEntries.length-1;b>=0;--b){var G=this.tryEntries[b],X=G.completion;if("root"===G.tryLoc)return c("end");if(G.tryLoc<=this.prev){var i=m.call(G,"catchLoc"),W=m.call(G,"finallyLoc");if(i&&W){if(this.prev<G.catchLoc)return c(G.catchLoc,!0);if(this.prev<G.finallyLoc)return c(G.finallyLoc)}else if(i){if(this.prev<G.catchLoc)return c(G.catchLoc,!0)}else{if(!W)throw new Error("try statement without catch or finally");if(this.prev<G.finallyLoc)return c(G.finallyLoc)}}}},abrupt:function(l,Z){for(var d=this.tryEntries.length-1;d>=0;--d){var c=this.tryEntries[d];if(c.tryLoc<=this.prev&&m.call(c,"finallyLoc")&&this.prev<c.finallyLoc){var b=c;break}}b&&("break"===l||"continue"===l)&&b.tryLoc<=Z&&Z<=b.finallyLoc&&(b=null);var G=b?b.completion:{};return G.type=l,G.arg=Z,b?(this.method="next",this.next=b.finallyLoc,a):this.complete(G)},complete:function(l,Z){if("throw"===l.type)throw l.arg;return"break"===l.type||"continue"===l.type?this.next=l.arg:"return"===l.type?(this.rval=this.arg=l.arg,this.method="return",this.next="end"):"normal"===l.type&&Z&&(this.next=Z),a},finish:function(l){for(var Z=this.tryEntries.length-1;Z>=0;--Z){var d=this.tryEntries[Z];if(d.finallyLoc===l)return this.complete(d.completion,d.afterLoc),C(d),a}},catch:function(l){for(var Z=this.tryEntries.length-1;Z>=0;--Z){var d=this.tryEntries[Z];if(d.tryLoc===l){var m=d.completion;if("throw"===m.type){var c=m.arg;C(d)}return c}}throw new Error("illegal catch attempt")},delegateYield:function(l,d,m){return this.delegate={iterator:T(l),resultName:d,nextLoc:m},"next"===this.method&&(this.arg=Z),a}},l}(l.exports);try{regeneratorRuntime=Z}catch(l){"object"===("undefined"==typeof globalThis?"undefined":G(globalThis))?globalThis.regeneratorRuntime=Z:Function("r","regeneratorRuntime = r")(Z)}})),u=X((function(l){var Z=Object.prototype.hasOwnProperty,d="~";function m(){}function c(l,Z,d){this.fn=l,this.context=Z,this.once=d||!1}function b(l,Z,m,b,G){if("function"!=typeof m)throw new TypeError("The listener must be a function");var X=new c(m,b||l,G),i=d?d+Z:Z;return l._events[i]?l._events[i].fn?l._events[i]=[l._events[i],X]:l._events[i].push(X):(l._events[i]=X,l._eventsCount++),l}function G(l,Z){0==--l._eventsCount?l._events=new m:delete l._events[Z]}function X(){this._events=new m,this._eventsCount=0}Object.create&&(m.prototype=Object.create(null),(new m).__proto__||(d=!1)),X.prototype.eventNames=function(){var l,m,c=[];if(0===this._eventsCount)return c;for(m in l=this._events)Z.call(l,m)&&c.push(d?m.slice(1):m);return Object.getOwnPropertySymbols?c.concat(Object.getOwnPropertySymbols(l)):c},X.prototype.listeners=function(l){var Z=d?d+l:l,m=this._events[Z];if(!m)return[];if(m.fn)return[m.fn];for(var c=0,b=m.length,G=new Array(b);c<b;c++)G[c]=m[c].fn;return G},X.prototype.listenerCount=function(l){var Z=d?d+l:l,m=this._events[Z];return m?m.fn?1:m.length:0},X.prototype.emit=function(l,Z,m,c,b,G){var X=d?d+l:l;if(!this._events[X])return!1;var i,W,u=this._events[X],y=arguments.length;if(u.fn){switch(u.once&&this.removeListener(l,u.fn,void 0,!0),y){case 1:return u.fn.call(u.context),!0;case 2:return u.fn.call(u.context,Z),!0;case 3:return u.fn.call(u.context,Z,m),!0;case 4:return u.fn.call(u.context,Z,m,c),!0;case 5:return u.fn.call(u.context,Z,m,c,b),!0;case 6:return u.fn.call(u.context,Z,m,c,b,G),!0}for(W=1,i=new Array(y-1);W<y;W++)i[W-1]=arguments[W];u.fn.apply(u.context,i)}else{var I,p=u.length;for(W=0;W<p;W++)switch(u[W].once&&this.removeListener(l,u[W].fn,void 0,!0),y){case 1:u[W].fn.call(u[W].context);break;case 2:u[W].fn.call(u[W].context,Z);break;case 3:u[W].fn.call(u[W].context,Z,m);break;case 4:u[W].fn.call(u[W].context,Z,m,c);break;default:if(!i)for(I=1,i=new Array(y-1);I<y;I++)i[I-1]=arguments[I];u[W].fn.apply(u[W].context,i)}}return!0},X.prototype.on=function(l,Z,d){return b(this,l,Z,d,!1)},X.prototype.once=function(l,Z,d){return b(this,l,Z,d,!0)},X.prototype.removeListener=function(l,Z,m,c){var b=d?d+l:l;if(!this._events[b])return this;if(!Z)return G(this,b),this;var X=this._events[b];if(X.fn)X.fn!==Z||c&&!X.once||m&&X.context!==m||G(this,b);else{for(var i=0,W=[],u=X.length;i<u;i++)(X[i].fn!==Z||c&&!X[i].once||m&&X[i].context!==m)&&W.push(X[i]);W.length?this._events[b]=1===W.length?W[0]:W:G(this,b)}return this},X.prototype.removeAllListeners=function(l){var Z;return l?(Z=d?d+l:l,this._events[Z]&&G(this,Z)):(this._events=new m,this._eventsCount=0),this},X.prototype.off=X.prototype.removeListener,X.prototype.addListener=X.prototype.on,X.prefixed=d,X.EventEmitter=X,l.exports=X}));return function(){if("nodejs"!=("undefined"!=typeof window&&void 0!==window.document?"browser":"nodejs"))return null;function Z(){return new u}function m(){var l,Z,d=new Promise((function(){l=arguments[0],Z=arguments[1]}));return d.resolve=l,d.reject=Z,d}function c(){for(var l=arguments.length>0&&void 0!==arguments[0]?arguments[0]:10,Z=[],d="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),m=d.length,c=0;c<l;c++)Z[c]=d[0|Math.random()*m];return Z.join("")}var G,X=(G="CgogICAgICAgIGxldCB7IHBhcmVudFBvcnQgfSA9IHJlcXVpcmUoJ3dvcmtlcl90aHJlYWRzJykKICAgICAgICAKCmZ1bmN0aW9uIHQoKXt9ZnVuY3Rpb24gZSgpe2UuaW5pdC5jYWxsKHRoaXMpfWZ1bmN0aW9uIHIodCl7cmV0dXJuIHZvaWQgMD09PXQuX21heExpc3RlbmVycz9lLmRlZmF1bHRNYXhMaXN0ZW5lcnM6dC5fbWF4TGlzdGVuZXJzfWZ1bmN0aW9uIG4odCxlLHIpe2lmKGUpdC5jYWxsKHIpO2Vsc2UgZm9yKHZhciBuPXQubGVuZ3RoLGk9Yyh0LG4pLG89MDtvPG47KytvKWlbb10uY2FsbChyKX1mdW5jdGlvbiBpKHQsZSxyLG4pe2lmKGUpdC5jYWxsKHIsbik7ZWxzZSBmb3IodmFyIGk9dC5sZW5ndGgsbz1jKHQsaSkscz0wO3M8aTsrK3Mpb1tzXS5jYWxsKHIsbil9ZnVuY3Rpb24gbyh0LGUscixuLGkpe2lmKGUpdC5jYWxsKHIsbixpKTtlbHNlIGZvcih2YXIgbz10Lmxlbmd0aCxzPWModCxvKSxhPTA7YTxvOysrYSlzW2FdLmNhbGwocixuLGkpfWZ1bmN0aW9uIHModCxlLHIsbixpLG8pe2lmKGUpdC5jYWxsKHIsbixpLG8pO2Vsc2UgZm9yKHZhciBzPXQubGVuZ3RoLGE9Yyh0LHMpLHU9MDt1PHM7Kyt1KWFbdV0uY2FsbChyLG4saSxvKX1mdW5jdGlvbiBhKHQsZSxyLG4pe2lmKGUpdC5hcHBseShyLG4pO2Vsc2UgZm9yKHZhciBpPXQubGVuZ3RoLG89Yyh0LGkpLHM9MDtzPGk7KytzKW9bc10uYXBwbHkocixuKX1mdW5jdGlvbiB1KGUsbixpLG8pe3ZhciBzLGEsdSxoO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0ZW5lciIgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7aWYoKGE9ZS5fZXZlbnRzKT8oYS5uZXdMaXN0ZW5lciYmKGUuZW1pdCgibmV3TGlzdGVuZXIiLG4saS5saXN0ZW5lcj9pLmxpc3RlbmVyOmkpLGE9ZS5fZXZlbnRzKSx1PWFbbl0pOihhPWUuX2V2ZW50cz1uZXcgdCxlLl9ldmVudHNDb3VudD0wKSx1KXtpZigiZnVuY3Rpb24iPT10eXBlb2YgdT91PWFbbl09bz9baSx1XTpbdSxpXTpvP3UudW5zaGlmdChpKTp1LnB1c2goaSksIXUud2FybmVkJiYocz1yKGUpKSYmcz4wJiZ1Lmxlbmd0aD5zKXt1Lndhcm5lZD0hMDt2YXIgZj1uZXcgRXJyb3IoIlBvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgbGVhayBkZXRlY3RlZC4gIit1Lmxlbmd0aCsiICIrbisiIGxpc3RlbmVycyBhZGRlZC4gVXNlIGVtaXR0ZXIuc2V0TWF4TGlzdGVuZXJzKCkgdG8gaW5jcmVhc2UgbGltaXQiKTtmLm5hbWU9Ik1heExpc3RlbmVyc0V4Y2VlZGVkV2FybmluZyIsZi5lbWl0dGVyPWUsZi50eXBlPW4sZi5jb3VudD11Lmxlbmd0aCxoPWYsImZ1bmN0aW9uIj09dHlwZW9mIGNvbnNvbGUud2Fybj9jb25zb2xlLndhcm4oaCk6Y29uc29sZS5sb2coaCl9fWVsc2UgdT1hW25dPWksKytlLl9ldmVudHNDb3VudDtyZXR1cm4gZX1mdW5jdGlvbiBoKHQsZSxyKXt2YXIgbj0hMTtmdW5jdGlvbiBpKCl7dC5yZW1vdmVMaXN0ZW5lcihlLGkpLG58fChuPSEwLHIuYXBwbHkodCxhcmd1bWVudHMpKX1yZXR1cm4gaS5saXN0ZW5lcj1yLGl9ZnVuY3Rpb24gZih0KXt2YXIgZT10aGlzLl9ldmVudHM7aWYoZSl7dmFyIHI9ZVt0XTtpZigiZnVuY3Rpb24iPT10eXBlb2YgcilyZXR1cm4gMTtpZihyKXJldHVybiByLmxlbmd0aH1yZXR1cm4gMH1mdW5jdGlvbiBjKHQsZSl7Zm9yKHZhciByPW5ldyBBcnJheShlKTtlLS07KXJbZV09dFtlXTtyZXR1cm4gcn10LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG51bGwpLGUuRXZlbnRFbWl0dGVyPWUsZS51c2luZ0RvbWFpbnM9ITEsZS5wcm90b3R5cGUuZG9tYWluPXZvaWQgMCxlLnByb3RvdHlwZS5fZXZlbnRzPXZvaWQgMCxlLnByb3RvdHlwZS5fbWF4TGlzdGVuZXJzPXZvaWQgMCxlLmRlZmF1bHRNYXhMaXN0ZW5lcnM9MTAsZS5pbml0PWZ1bmN0aW9uKCl7dGhpcy5kb21haW49bnVsbCxlLnVzaW5nRG9tYWlucyYmdW5kZWZpbmVkLmFjdGl2ZSx0aGlzLl9ldmVudHMmJnRoaXMuX2V2ZW50cyE9PU9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKS5fZXZlbnRzfHwodGhpcy5fZXZlbnRzPW5ldyB0LHRoaXMuX2V2ZW50c0NvdW50PTApLHRoaXMuX21heExpc3RlbmVycz10aGlzLl9tYXhMaXN0ZW5lcnN8fHZvaWQgMH0sZS5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzPWZ1bmN0aW9uKHQpe2lmKCJudW1iZXIiIT10eXBlb2YgdHx8dDwwfHxpc05hTih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCcibiIgYXJndW1lbnQgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlcicpO3JldHVybiB0aGlzLl9tYXhMaXN0ZW5lcnM9dCx0aGlzfSxlLnByb3RvdHlwZS5nZXRNYXhMaXN0ZW5lcnM9ZnVuY3Rpb24oKXtyZXR1cm4gcih0aGlzKX0sZS5wcm90b3R5cGUuZW1pdD1mdW5jdGlvbih0KXt2YXIgZSxyLHUsaCxmLGMsbCxwPSJlcnJvciI9PT10O2lmKGM9dGhpcy5fZXZlbnRzKXA9cCYmbnVsbD09Yy5lcnJvcjtlbHNlIGlmKCFwKXJldHVybiExO2lmKGw9dGhpcy5kb21haW4scCl7aWYoZT1hcmd1bWVudHNbMV0sIWwpe2lmKGUgaW5zdGFuY2VvZiBFcnJvcil0aHJvdyBlO3ZhciBkPW5ldyBFcnJvcignVW5jYXVnaHQsIHVuc3BlY2lmaWVkICJlcnJvciIgZXZlbnQuICgnK2UrIikiKTt0aHJvdyBkLmNvbnRleHQ9ZSxkfXJldHVybiBlfHwoZT1uZXcgRXJyb3IoJ1VuY2F1Z2h0LCB1bnNwZWNpZmllZCAiZXJyb3IiIGV2ZW50JykpLGUuZG9tYWluRW1pdHRlcj10aGlzLGUuZG9tYWluPWwsZS5kb21haW5UaHJvd249ITEsbC5lbWl0KCJlcnJvciIsZSksITF9aWYoIShyPWNbdF0pKXJldHVybiExO3ZhciBnPSJmdW5jdGlvbiI9PXR5cGVvZiByO3N3aXRjaCh1PWFyZ3VtZW50cy5sZW5ndGgpe2Nhc2UgMTpuKHIsZyx0aGlzKTticmVhaztjYXNlIDI6aShyLGcsdGhpcyxhcmd1bWVudHNbMV0pO2JyZWFrO2Nhc2UgMzpvKHIsZyx0aGlzLGFyZ3VtZW50c1sxXSxhcmd1bWVudHNbMl0pO2JyZWFrO2Nhc2UgNDpzKHIsZyx0aGlzLGFyZ3VtZW50c1sxXSxhcmd1bWVudHNbMl0sYXJndW1lbnRzWzNdKTticmVhaztkZWZhdWx0OmZvcihoPW5ldyBBcnJheSh1LTEpLGY9MTtmPHU7ZisrKWhbZi0xXT1hcmd1bWVudHNbZl07YShyLGcsdGhpcyxoKX1yZXR1cm4hMH0sZS5wcm90b3R5cGUuYWRkTGlzdGVuZXI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdSh0aGlzLHQsZSwhMSl9LGUucHJvdG90eXBlLm9uPWUucHJvdG90eXBlLmFkZExpc3RlbmVyLGUucHJvdG90eXBlLnByZXBlbmRMaXN0ZW5lcj1mdW5jdGlvbih0LGUpe3JldHVybiB1KHRoaXMsdCxlLCEwKX0sZS5wcm90b3R5cGUub25jZT1mdW5jdGlvbih0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0ZW5lciIgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7cmV0dXJuIHRoaXMub24odCxoKHRoaXMsdCxlKSksdGhpc30sZS5wcm90b3R5cGUucHJlcGVuZE9uY2VMaXN0ZW5lcj1mdW5jdGlvbih0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0ZW5lciIgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7cmV0dXJuIHRoaXMucHJlcGVuZExpc3RlbmVyKHQsaCh0aGlzLHQsZSkpLHRoaXN9LGUucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyPWZ1bmN0aW9uKGUscil7dmFyIG4saSxvLHMsYTtpZigiZnVuY3Rpb24iIT10eXBlb2Ygcil0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdGVuZXIiIGFyZ3VtZW50IG11c3QgYmUgYSBmdW5jdGlvbicpO2lmKCEoaT10aGlzLl9ldmVudHMpKXJldHVybiB0aGlzO2lmKCEobj1pW2VdKSlyZXR1cm4gdGhpcztpZihuPT09cnx8bi5saXN0ZW5lciYmbi5saXN0ZW5lcj09PXIpMD09LS10aGlzLl9ldmVudHNDb3VudD90aGlzLl9ldmVudHM9bmV3IHQ6KGRlbGV0ZSBpW2VdLGkucmVtb3ZlTGlzdGVuZXImJnRoaXMuZW1pdCgicmVtb3ZlTGlzdGVuZXIiLGUsbi5saXN0ZW5lcnx8cikpO2Vsc2UgaWYoImZ1bmN0aW9uIiE9dHlwZW9mIG4pe2ZvcihvPS0xLHM9bi5sZW5ndGg7cy0tID4wOylpZihuW3NdPT09cnx8bltzXS5saXN0ZW5lciYmbltzXS5saXN0ZW5lcj09PXIpe2E9bltzXS5saXN0ZW5lcixvPXM7YnJlYWt9aWYobzwwKXJldHVybiB0aGlzO2lmKDE9PT1uLmxlbmd0aCl7aWYoblswXT12b2lkIDAsMD09LS10aGlzLl9ldmVudHNDb3VudClyZXR1cm4gdGhpcy5fZXZlbnRzPW5ldyB0LHRoaXM7ZGVsZXRlIGlbZV19ZWxzZSFmdW5jdGlvbih0LGUpe2Zvcih2YXIgcj1lLG49cisxLGk9dC5sZW5ndGg7bjxpO3IrPTEsbis9MSl0W3JdPXRbbl07dC5wb3AoKX0obixvKTtpLnJlbW92ZUxpc3RlbmVyJiZ0aGlzLmVtaXQoInJlbW92ZUxpc3RlbmVyIixlLGF8fHIpfXJldHVybiB0aGlzfSxlLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnM9ZnVuY3Rpb24oZSl7dmFyIHIsbjtpZighKG49dGhpcy5fZXZlbnRzKSlyZXR1cm4gdGhpcztpZighbi5yZW1vdmVMaXN0ZW5lcilyZXR1cm4gMD09PWFyZ3VtZW50cy5sZW5ndGg/KHRoaXMuX2V2ZW50cz1uZXcgdCx0aGlzLl9ldmVudHNDb3VudD0wKTpuW2VdJiYoMD09LS10aGlzLl9ldmVudHNDb3VudD90aGlzLl9ldmVudHM9bmV3IHQ6ZGVsZXRlIG5bZV0pLHRoaXM7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcih2YXIgaSxvPU9iamVjdC5rZXlzKG4pLHM9MDtzPG8ubGVuZ3RoOysrcykicmVtb3ZlTGlzdGVuZXIiIT09KGk9b1tzXSkmJnRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKGkpO3JldHVybiB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygicmVtb3ZlTGlzdGVuZXIiKSx0aGlzLl9ldmVudHM9bmV3IHQsdGhpcy5fZXZlbnRzQ291bnQ9MCx0aGlzfWlmKCJmdW5jdGlvbiI9PXR5cGVvZihyPW5bZV0pKXRoaXMucmVtb3ZlTGlzdGVuZXIoZSxyKTtlbHNlIGlmKHIpZG97dGhpcy5yZW1vdmVMaXN0ZW5lcihlLHJbci5sZW5ndGgtMV0pfXdoaWxlKHJbMF0pO3JldHVybiB0aGlzfSxlLnByb3RvdHlwZS5saXN0ZW5lcnM9ZnVuY3Rpb24odCl7dmFyIGUscj10aGlzLl9ldmVudHM7cmV0dXJuIHImJihlPXJbdF0pPyJmdW5jdGlvbiI9PXR5cGVvZiBlP1tlLmxpc3RlbmVyfHxlXTpmdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IEFycmF5KHQubGVuZ3RoKSxyPTA7cjxlLmxlbmd0aDsrK3IpZVtyXT10W3JdLmxpc3RlbmVyfHx0W3JdO3JldHVybiBlfShlKTpbXX0sZS5saXN0ZW5lckNvdW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQubGlzdGVuZXJDb3VudD90Lmxpc3RlbmVyQ291bnQoZSk6Zi5jYWxsKHQsZSl9LGUucHJvdG90eXBlLmxpc3RlbmVyQ291bnQ9ZixlLnByb3RvdHlwZS5ldmVudE5hbWVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2V2ZW50c0NvdW50PjA/UmVmbGVjdC5vd25LZXlzKHRoaXMuX2V2ZW50cyk6W119O3ZhciBsPSJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsP2dsb2JhbDoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6e30scD1bXSxkPVtdLGc9InVuZGVmaW5lZCIhPXR5cGVvZiBVaW50OEFycmF5P1VpbnQ4QXJyYXk6QXJyYXkseT0hMTtmdW5jdGlvbiB2KCl7eT0hMDtmb3IodmFyIHQ9IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iLGU9MCxyPXQubGVuZ3RoO2U8cjsrK2UpcFtlXT10W2VdLGRbdC5jaGFyQ29kZUF0KGUpXT1lO2RbIi0iLmNoYXJDb2RlQXQoMCldPTYyLGRbIl8iLmNoYXJDb2RlQXQoMCldPTYzfWZ1bmN0aW9uIGIodCxlLHIpe2Zvcih2YXIgbixpLG89W10scz1lO3M8cjtzKz0zKW49KHRbc108PDE2KSsodFtzKzFdPDw4KSt0W3MrMl0sby5wdXNoKHBbKGk9bik+PjE4JjYzXStwW2k+PjEyJjYzXStwW2k+PjYmNjNdK3BbNjMmaV0pO3JldHVybiBvLmpvaW4oIiIpfWZ1bmN0aW9uIG0odCl7dmFyIGU7eXx8digpO2Zvcih2YXIgcj10Lmxlbmd0aCxuPXIlMyxpPSIiLG89W10scz0xNjM4MyxhPTAsdT1yLW47YTx1O2ErPXMpby5wdXNoKGIodCxhLGErcz51P3U6YStzKSk7cmV0dXJuIDE9PT1uPyhlPXRbci0xXSxpKz1wW2U+PjJdLGkrPXBbZTw8NCY2M10saSs9Ij09Iik6Mj09PW4mJihlPSh0W3ItMl08PDgpK3Rbci0xXSxpKz1wW2U+PjEwXSxpKz1wW2U+PjQmNjNdLGkrPXBbZTw8MiY2M10saSs9Ij0iKSxvLnB1c2goaSksby5qb2luKCIiKX1mdW5jdGlvbiB3KHQsZSxyLG4saSl7dmFyIG8scyxhPTgqaS1uLTEsdT0oMTw8YSktMSxoPXU+PjEsZj0tNyxjPXI/aS0xOjAsbD1yPy0xOjEscD10W2UrY107Zm9yKGMrPWwsbz1wJigxPDwtZiktMSxwPj49LWYsZis9YTtmPjA7bz0yNTYqbyt0W2UrY10sYys9bCxmLT04KTtmb3Iocz1vJigxPDwtZiktMSxvPj49LWYsZis9bjtmPjA7cz0yNTYqcyt0W2UrY10sYys9bCxmLT04KTtpZigwPT09bylvPTEtaDtlbHNle2lmKG89PT11KXJldHVybiBzP05hTjoxLzAqKHA/LTE6MSk7cys9TWF0aC5wb3coMixuKSxvLT1ofXJldHVybihwPy0xOjEpKnMqTWF0aC5wb3coMixvLW4pfWZ1bmN0aW9uIF8odCxlLHIsbixpLG8pe3ZhciBzLGEsdSxoPTgqby1pLTEsZj0oMTw8aCktMSxjPWY+PjEsbD0yMz09PWk/TWF0aC5wb3coMiwtMjQpLU1hdGgucG93KDIsLTc3KTowLHA9bj8wOm8tMSxkPW4/MTotMSxnPWU8MHx8MD09PWUmJjEvZTwwPzE6MDtmb3IoZT1NYXRoLmFicyhlKSxpc05hTihlKXx8ZT09PTEvMD8oYT1pc05hTihlKT8xOjAscz1mKToocz1NYXRoLmZsb29yKE1hdGgubG9nKGUpL01hdGguTE4yKSxlKih1PU1hdGgucG93KDIsLXMpKTwxJiYocy0tLHUqPTIpLChlKz1zK2M+PTE/bC91OmwqTWF0aC5wb3coMiwxLWMpKSp1Pj0yJiYocysrLHUvPTIpLHMrYz49Zj8oYT0wLHM9Zik6cytjPj0xPyhhPShlKnUtMSkqTWF0aC5wb3coMixpKSxzKz1jKTooYT1lKk1hdGgucG93KDIsYy0xKSpNYXRoLnBvdygyLGkpLHM9MCkpO2k+PTg7dFtyK3BdPTI1NSZhLHArPWQsYS89MjU2LGktPTgpO2ZvcihzPXM8PGl8YSxoKz1pO2g+MDt0W3IrcF09MjU1JnMscCs9ZCxzLz0yNTYsaC09OCk7dFtyK3AtZF18PTEyOCpnfXZhciBTPXt9LnRvU3RyaW5nLEU9QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24odCl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09Uy5jYWxsKHQpfTtmdW5jdGlvbiBrKCl7cmV0dXJuIEEuVFlQRURfQVJSQVlfU1VQUE9SVD8yMTQ3NDgzNjQ3OjEwNzM3NDE4MjN9ZnVuY3Rpb24gUih0LGUpe2lmKGsoKTxlKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbnZhbGlkIHR5cGVkIGFycmF5IGxlbmd0aCIpO3JldHVybiBBLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHQ9bmV3IFVpbnQ4QXJyYXkoZSkpLl9fcHJvdG9fXz1BLnByb3RvdHlwZToobnVsbD09PXQmJih0PW5ldyBBKGUpKSx0Lmxlbmd0aD1lKSx0fWZ1bmN0aW9uIEEodCxlLHIpe2lmKCEoQS5UWVBFRF9BUlJBWV9TVVBQT1JUfHx0aGlzIGluc3RhbmNlb2YgQSkpcmV0dXJuIG5ldyBBKHQsZSxyKTtpZigibnVtYmVyIj09dHlwZW9mIHQpe2lmKCJzdHJpbmciPT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3IoIklmIGVuY29kaW5nIGlzIHNwZWNpZmllZCB0aGVuIHRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nIik7cmV0dXJuIGoodGhpcyx0KX1yZXR1cm4gVCh0aGlzLHQsZSxyKX1mdW5jdGlvbiBUKHQsZSxyLG4pe2lmKCJudW1iZXIiPT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCcidmFsdWUiIGFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJyk7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyP2Z1bmN0aW9uKHQsZSxyLG4pe2lmKGUuYnl0ZUxlbmd0aCxyPDB8fGUuYnl0ZUxlbmd0aDxyKXRocm93IG5ldyBSYW5nZUVycm9yKCInb2Zmc2V0JyBpcyBvdXQgb2YgYm91bmRzIik7aWYoZS5ieXRlTGVuZ3RoPHIrKG58fDApKXRocm93IG5ldyBSYW5nZUVycm9yKCInbGVuZ3RoJyBpcyBvdXQgb2YgYm91bmRzIik7ZT12b2lkIDA9PT1yJiZ2b2lkIDA9PT1uP25ldyBVaW50OEFycmF5KGUpOnZvaWQgMD09PW4/bmV3IFVpbnQ4QXJyYXkoZSxyKTpuZXcgVWludDhBcnJheShlLHIsbik7QS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0PWUpLl9fcHJvdG9fXz1BLnByb3RvdHlwZTp0PUwodCxlKTtyZXR1cm4gdH0odCxlLHIsbik6InN0cmluZyI9PXR5cGVvZiBlP2Z1bmN0aW9uKHQsZSxyKXsic3RyaW5nIj09dHlwZW9mIHImJiIiIT09cnx8KHI9InV0ZjgiKTtpZighQS5pc0VuY29kaW5nKHIpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJlbmNvZGluZyIgbXVzdCBiZSBhIHZhbGlkIHN0cmluZyBlbmNvZGluZycpO3ZhciBuPTB8TShlLHIpLGk9KHQ9Uih0LG4pKS53cml0ZShlLHIpO2khPT1uJiYodD10LnNsaWNlKDAsaSkpO3JldHVybiB0fSh0LGUscik6ZnVuY3Rpb24odCxlKXtpZihQKGUpKXt2YXIgcj0wfEMoZS5sZW5ndGgpO3JldHVybiAwPT09KHQ9Uih0LHIpKS5sZW5ndGh8fGUuY29weSh0LDAsMCxyKSx0fWlmKGUpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJmUuYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXJ8fCJsZW5ndGgiaW4gZSlyZXR1cm4ibnVtYmVyIiE9dHlwZW9mIGUubGVuZ3RofHwobj1lLmxlbmd0aCkhPW4/Uih0LDApOkwodCxlKTtpZigiQnVmZmVyIj09PWUudHlwZSYmRShlLmRhdGEpKXJldHVybiBMKHQsZS5kYXRhKX12YXIgbjt0aHJvdyBuZXcgVHlwZUVycm9yKCJGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgb3IgYXJyYXktbGlrZSBvYmplY3QuIil9KHQsZSl9ZnVuY3Rpb24gTyh0KXtpZigibnVtYmVyIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcignInNpemUiIGFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKTtpZih0PDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoJyJzaXplIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBuZWdhdGl2ZScpfWZ1bmN0aW9uIGoodCxlKXtpZihPKGUpLHQ9Uih0LGU8MD8wOjB8QyhlKSksIUEuVFlQRURfQVJSQVlfU1VQUE9SVClmb3IodmFyIHI9MDtyPGU7KytyKXRbcl09MDtyZXR1cm4gdH1mdW5jdGlvbiBMKHQsZSl7dmFyIHI9ZS5sZW5ndGg8MD8wOjB8QyhlLmxlbmd0aCk7dD1SKHQscik7Zm9yKHZhciBuPTA7bjxyO24rPTEpdFtuXT0yNTUmZVtuXTtyZXR1cm4gdH1mdW5jdGlvbiBDKHQpe2lmKHQ+PWsoKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXR0ZW1wdCB0byBhbGxvY2F0ZSBCdWZmZXIgbGFyZ2VyIHRoYW4gbWF4aW11bSBzaXplOiAweCIraygpLnRvU3RyaW5nKDE2KSsiIGJ5dGVzIik7cmV0dXJuIDB8dH1mdW5jdGlvbiBQKHQpe3JldHVybiEobnVsbD09dHx8IXQuX2lzQnVmZmVyKX1mdW5jdGlvbiBNKHQsZSl7aWYoUCh0KSlyZXR1cm4gdC5sZW5ndGg7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmImZ1bmN0aW9uIj09dHlwZW9mIEFycmF5QnVmZmVyLmlzVmlldyYmKEFycmF5QnVmZmVyLmlzVmlldyh0KXx8dCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSlyZXR1cm4gdC5ieXRlTGVuZ3RoOyJzdHJpbmciIT10eXBlb2YgdCYmKHQ9IiIrdCk7dmFyIHI9dC5sZW5ndGg7aWYoMD09PXIpcmV0dXJuIDA7Zm9yKHZhciBuPSExOzspc3dpdGNoKGUpe2Nhc2UiYXNjaWkiOmNhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIHI7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpjYXNlIHZvaWQgMDpyZXR1cm4gb3QodCkubGVuZ3RoO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gMipyO2Nhc2UiaGV4IjpyZXR1cm4gcj4+PjE7Y2FzZSJiYXNlNjQiOnJldHVybiBzdCh0KS5sZW5ndGg7ZGVmYXVsdDppZihuKXJldHVybiBvdCh0KS5sZW5ndGg7ZT0oIiIrZSkudG9Mb3dlckNhc2UoKSxuPSEwfX1mdW5jdGlvbiBCKHQsZSxyKXt2YXIgbj0hMTtpZigodm9pZCAwPT09ZXx8ZTwwKSYmKGU9MCksZT50aGlzLmxlbmd0aClyZXR1cm4iIjtpZigodm9pZCAwPT09cnx8cj50aGlzLmxlbmd0aCkmJihyPXRoaXMubGVuZ3RoKSxyPD0wKXJldHVybiIiO2lmKChyPj4+PTApPD0oZT4+Pj0wKSlyZXR1cm4iIjtmb3IodHx8KHQ9InV0ZjgiKTs7KXN3aXRjaCh0KXtjYXNlImhleCI6cmV0dXJuIEgodGhpcyxlLHIpO2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6cmV0dXJuICQodGhpcyxlLHIpO2Nhc2UiYXNjaWkiOnJldHVybiBHKHRoaXMsZSxyKTtjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiBKKHRoaXMsZSxyKTtjYXNlImJhc2U2NCI6cmV0dXJuIFcodGhpcyxlLHIpO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gVih0aGlzLGUscik7ZGVmYXVsdDppZihuKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrdCk7dD0odCsiIikudG9Mb3dlckNhc2UoKSxuPSEwfX1mdW5jdGlvbiB4KHQsZSxyKXt2YXIgbj10W2VdO3RbZV09dFtyXSx0W3JdPW59ZnVuY3Rpb24gVSh0LGUscixuLGkpe2lmKDA9PT10Lmxlbmd0aClyZXR1cm4tMTtpZigic3RyaW5nIj09dHlwZW9mIHI/KG49cixyPTApOnI+MjE0NzQ4MzY0Nz9yPTIxNDc0ODM2NDc6cjwtMjE0NzQ4MzY0OCYmKHI9LTIxNDc0ODM2NDgpLHI9K3IsaXNOYU4ocikmJihyPWk/MDp0Lmxlbmd0aC0xKSxyPDAmJihyPXQubGVuZ3RoK3IpLHI+PXQubGVuZ3RoKXtpZihpKXJldHVybi0xO3I9dC5sZW5ndGgtMX1lbHNlIGlmKHI8MCl7aWYoIWkpcmV0dXJuLTE7cj0wfWlmKCJzdHJpbmciPT10eXBlb2YgZSYmKGU9QS5mcm9tKGUsbikpLFAoZSkpcmV0dXJuIDA9PT1lLmxlbmd0aD8tMTpJKHQsZSxyLG4saSk7aWYoIm51bWJlciI9PXR5cGVvZiBlKXJldHVybiBlJj0yNTUsQS5UWVBFRF9BUlJBWV9TVVBQT1JUJiYiZnVuY3Rpb24iPT10eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZj9pP1VpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbCh0LGUscik6VWludDhBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YuY2FsbCh0LGUscik6SSh0LFtlXSxyLG4saSk7dGhyb3cgbmV3IFR5cGVFcnJvcigidmFsIG11c3QgYmUgc3RyaW5nLCBudW1iZXIgb3IgQnVmZmVyIil9ZnVuY3Rpb24gSSh0LGUscixuLGkpe3ZhciBvLHM9MSxhPXQubGVuZ3RoLHU9ZS5sZW5ndGg7aWYodm9pZCAwIT09biYmKCJ1Y3MyIj09PShuPVN0cmluZyhuKS50b0xvd2VyQ2FzZSgpKXx8InVjcy0yIj09PW58fCJ1dGYxNmxlIj09PW58fCJ1dGYtMTZsZSI9PT1uKSl7aWYodC5sZW5ndGg8Mnx8ZS5sZW5ndGg8MilyZXR1cm4tMTtzPTIsYS89Mix1Lz0yLHIvPTJ9ZnVuY3Rpb24gaCh0LGUpe3JldHVybiAxPT09cz90W2VdOnQucmVhZFVJbnQxNkJFKGUqcyl9aWYoaSl7dmFyIGY9LTE7Zm9yKG89cjtvPGE7bysrKWlmKGgodCxvKT09PWgoZSwtMT09PWY/MDpvLWYpKXtpZigtMT09PWYmJihmPW8pLG8tZisxPT09dSlyZXR1cm4gZipzfWVsc2UtMSE9PWYmJihvLT1vLWYpLGY9LTF9ZWxzZSBmb3Iocit1PmEmJihyPWEtdSksbz1yO28+PTA7by0tKXtmb3IodmFyIGM9ITAsbD0wO2w8dTtsKyspaWYoaCh0LG8rbCkhPT1oKGUsbCkpe2M9ITE7YnJlYWt9aWYoYylyZXR1cm4gb31yZXR1cm4tMX1mdW5jdGlvbiBEKHQsZSxyLG4pe3I9TnVtYmVyKHIpfHwwO3ZhciBpPXQubGVuZ3RoLXI7bj8obj1OdW1iZXIobikpPmkmJihuPWkpOm49aTt2YXIgbz1lLmxlbmd0aDtpZihvJTIhPTApdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBoZXggc3RyaW5nIik7bj5vLzImJihuPW8vMik7Zm9yKHZhciBzPTA7czxuOysrcyl7dmFyIGE9cGFyc2VJbnQoZS5zdWJzdHIoMipzLDIpLDE2KTtpZihpc05hTihhKSlyZXR1cm4gczt0W3Irc109YX1yZXR1cm4gc31mdW5jdGlvbiBOKHQsZSxyLG4pe3JldHVybiBhdChvdChlLHQubGVuZ3RoLXIpLHQscixuKX1mdW5jdGlvbiBGKHQsZSxyLG4pe3JldHVybiBhdChmdW5jdGlvbih0KXtmb3IodmFyIGU9W10scj0wO3I8dC5sZW5ndGg7KytyKWUucHVzaCgyNTUmdC5jaGFyQ29kZUF0KHIpKTtyZXR1cm4gZX0oZSksdCxyLG4pfWZ1bmN0aW9uIHoodCxlLHIsbil7cmV0dXJuIEYodCxlLHIsbil9ZnVuY3Rpb24gcSh0LGUscixuKXtyZXR1cm4gYXQoc3QoZSksdCxyLG4pfWZ1bmN0aW9uIFkodCxlLHIsbil7cmV0dXJuIGF0KGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByLG4saSxvPVtdLHM9MDtzPHQubGVuZ3RoJiYhKChlLT0yKTwwKTsrK3Mpbj0ocj10LmNoYXJDb2RlQXQocykpPj44LGk9ciUyNTYsby5wdXNoKGkpLG8ucHVzaChuKTtyZXR1cm4gb30oZSx0Lmxlbmd0aC1yKSx0LHIsbil9ZnVuY3Rpb24gVyh0LGUscil7cmV0dXJuIDA9PT1lJiZyPT09dC5sZW5ndGg/bSh0KTptKHQuc2xpY2UoZSxyKSl9ZnVuY3Rpb24gJCh0LGUscil7cj1NYXRoLm1pbih0Lmxlbmd0aCxyKTtmb3IodmFyIG49W10saT1lO2k8cjspe3ZhciBvLHMsYSx1LGg9dFtpXSxmPW51bGwsYz1oPjIzOT80Omg+MjIzPzM6aD4xOTE/MjoxO2lmKGkrYzw9cilzd2l0Y2goYyl7Y2FzZSAxOmg8MTI4JiYoZj1oKTticmVhaztjYXNlIDI6MTI4PT0oMTkyJihvPXRbaSsxXSkpJiYodT0oMzEmaCk8PDZ8NjMmbyk+MTI3JiYoZj11KTticmVhaztjYXNlIDM6bz10W2krMV0scz10W2krMl0sMTI4PT0oMTkyJm8pJiYxMjg9PSgxOTImcykmJih1PSgxNSZoKTw8MTJ8KDYzJm8pPDw2fDYzJnMpPjIwNDcmJih1PDU1Mjk2fHx1PjU3MzQzKSYmKGY9dSk7YnJlYWs7Y2FzZSA0Om89dFtpKzFdLHM9dFtpKzJdLGE9dFtpKzNdLDEyOD09KDE5MiZvKSYmMTI4PT0oMTkyJnMpJiYxMjg9PSgxOTImYSkmJih1PSgxNSZoKTw8MTh8KDYzJm8pPDwxMnwoNjMmcyk8PDZ8NjMmYSk+NjU1MzUmJnU8MTExNDExMiYmKGY9dSl9bnVsbD09PWY/KGY9NjU1MzMsYz0xKTpmPjY1NTM1JiYoZi09NjU1MzYsbi5wdXNoKGY+Pj4xMCYxMDIzfDU1Mjk2KSxmPTU2MzIwfDEwMjMmZiksbi5wdXNoKGYpLGkrPWN9cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPXQubGVuZ3RoO2lmKGU8PTQwOTYpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLHQpO3ZhciByPSIiLG49MDtmb3IoO248ZTspcis9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsdC5zbGljZShuLG4rPTQwOTYpKTtyZXR1cm4gcn0obil9QS5UWVBFRF9BUlJBWV9TVVBQT1JUPXZvaWQgMD09PWwuVFlQRURfQVJSQVlfU1VQUE9SVHx8bC5UWVBFRF9BUlJBWV9TVVBQT1JULEEucG9vbFNpemU9ODE5MixBLl9hdWdtZW50PWZ1bmN0aW9uKHQpe3JldHVybiB0Ll9fcHJvdG9fXz1BLnByb3RvdHlwZSx0fSxBLmZyb209ZnVuY3Rpb24odCxlLHIpe3JldHVybiBUKG51bGwsdCxlLHIpfSxBLlRZUEVEX0FSUkFZX1NVUFBPUlQmJihBLnByb3RvdHlwZS5fX3Byb3RvX189VWludDhBcnJheS5wcm90b3R5cGUsQS5fX3Byb3RvX189VWludDhBcnJheSksQS5hbGxvYz1mdW5jdGlvbih0LGUscil7cmV0dXJuIGZ1bmN0aW9uKHQsZSxyLG4pe3JldHVybiBPKGUpLGU8PTA/Uih0LGUpOnZvaWQgMCE9PXI/InN0cmluZyI9PXR5cGVvZiBuP1IodCxlKS5maWxsKHIsbik6Uih0LGUpLmZpbGwocik6Uih0LGUpfShudWxsLHQsZSxyKX0sQS5hbGxvY1Vuc2FmZT1mdW5jdGlvbih0KXtyZXR1cm4gaihudWxsLHQpfSxBLmFsbG9jVW5zYWZlU2xvdz1mdW5jdGlvbih0KXtyZXR1cm4gaihudWxsLHQpfSxBLmlzQnVmZmVyPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT10JiYoISF0Ll9pc0J1ZmZlcnx8dXQodCl8fGZ1bmN0aW9uKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0LnJlYWRGbG9hdExFJiYiZnVuY3Rpb24iPT10eXBlb2YgdC5zbGljZSYmdXQodC5zbGljZSgwLDApKX0odCkpfSxBLmNvbXBhcmU9ZnVuY3Rpb24odCxlKXtpZighUCh0KXx8IVAoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnRzIG11c3QgYmUgQnVmZmVycyIpO2lmKHQ9PT1lKXJldHVybiAwO2Zvcih2YXIgcj10Lmxlbmd0aCxuPWUubGVuZ3RoLGk9MCxvPU1hdGgubWluKHIsbik7aTxvOysraSlpZih0W2ldIT09ZVtpXSl7cj10W2ldLG49ZVtpXTticmVha31yZXR1cm4gcjxuPy0xOm48cj8xOjB9LEEuaXNFbmNvZGluZz1mdW5jdGlvbih0KXtzd2l0Y2goU3RyaW5nKHQpLnRvTG93ZXJDYXNlKCkpe2Nhc2UiaGV4IjpjYXNlInV0ZjgiOmNhc2UidXRmLTgiOmNhc2UiYXNjaWkiOmNhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6Y2FzZSJiYXNlNjQiOmNhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX0sQS5jb25jYXQ9ZnVuY3Rpb24odCxlKXtpZighRSh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJyk7aWYoMD09PXQubGVuZ3RoKXJldHVybiBBLmFsbG9jKDApO3ZhciByO2lmKHZvaWQgMD09PWUpZm9yKGU9MCxyPTA7cjx0Lmxlbmd0aDsrK3IpZSs9dFtyXS5sZW5ndGg7dmFyIG49QS5hbGxvY1Vuc2FmZShlKSxpPTA7Zm9yKHI9MDtyPHQubGVuZ3RoOysrcil7dmFyIG89dFtyXTtpZighUChvKSl0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJyk7by5jb3B5KG4saSksaSs9by5sZW5ndGh9cmV0dXJuIG59LEEuYnl0ZUxlbmd0aD1NLEEucHJvdG90eXBlLl9pc0J1ZmZlcj0hMCxBLnByb3RvdHlwZS5zd2FwMTY9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmxlbmd0aDtpZih0JTIhPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi1iaXRzIik7Zm9yKHZhciBlPTA7ZTx0O2UrPTIpeCh0aGlzLGUsZSsxKTtyZXR1cm4gdGhpc30sQS5wcm90b3R5cGUuc3dhcDMyPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5sZW5ndGg7aWYodCU0IT0wKXRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMzItYml0cyIpO2Zvcih2YXIgZT0wO2U8dDtlKz00KXgodGhpcyxlLGUrMykseCh0aGlzLGUrMSxlKzIpO3JldHVybiB0aGlzfSxBLnByb3RvdHlwZS5zd2FwNjQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmxlbmd0aDtpZih0JTghPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA2NC1iaXRzIik7Zm9yKHZhciBlPTA7ZTx0O2UrPTgpeCh0aGlzLGUsZSs3KSx4KHRoaXMsZSsxLGUrNikseCh0aGlzLGUrMixlKzUpLHgodGhpcyxlKzMsZSs0KTtyZXR1cm4gdGhpc30sQS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgdD0wfHRoaXMubGVuZ3RoO3JldHVybiAwPT09dD8iIjowPT09YXJndW1lbnRzLmxlbmd0aD8kKHRoaXMsMCx0KTpCLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sQS5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe2lmKCFQKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIiKTtyZXR1cm4gdGhpcz09PXR8fDA9PT1BLmNvbXBhcmUodGhpcyx0KX0sQS5wcm90b3R5cGUuaW5zcGVjdD1mdW5jdGlvbigpe3ZhciB0PSIiO3JldHVybiB0aGlzLmxlbmd0aD4wJiYodD10aGlzLnRvU3RyaW5nKCJoZXgiLDAsNTApLm1hdGNoKC8uezJ9L2cpLmpvaW4oIiAiKSx0aGlzLmxlbmd0aD41MCYmKHQrPSIgLi4uICIpKSwiPEJ1ZmZlciAiK3QrIj4ifSxBLnByb3RvdHlwZS5jb21wYXJlPWZ1bmN0aW9uKHQsZSxyLG4saSl7aWYoIVAodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciIpO2lmKHZvaWQgMD09PWUmJihlPTApLHZvaWQgMD09PXImJihyPXQ/dC5sZW5ndGg6MCksdm9pZCAwPT09biYmKG49MCksdm9pZCAwPT09aSYmKGk9dGhpcy5sZW5ndGgpLGU8MHx8cj50Lmxlbmd0aHx8bjwwfHxpPnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJvdXQgb2YgcmFuZ2UgaW5kZXgiKTtpZihuPj1pJiZlPj1yKXJldHVybiAwO2lmKG4+PWkpcmV0dXJuLTE7aWYoZT49cilyZXR1cm4gMTtpZih0aGlzPT09dClyZXR1cm4gMDtmb3IodmFyIG89KGk+Pj49MCktKG4+Pj49MCkscz0ocj4+Pj0wKS0oZT4+Pj0wKSxhPU1hdGgubWluKG8scyksdT10aGlzLnNsaWNlKG4saSksaD10LnNsaWNlKGUsciksZj0wO2Y8YTsrK2YpaWYodVtmXSE9PWhbZl0pe289dVtmXSxzPWhbZl07YnJlYWt9cmV0dXJuIG88cz8tMTpzPG8/MTowfSxBLnByb3RvdHlwZS5pbmNsdWRlcz1mdW5jdGlvbih0LGUscil7cmV0dXJuLTEhPT10aGlzLmluZGV4T2YodCxlLHIpfSxBLnByb3RvdHlwZS5pbmRleE9mPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gVSh0aGlzLHQsZSxyLCEwKX0sQS5wcm90b3R5cGUubGFzdEluZGV4T2Y9ZnVuY3Rpb24odCxlLHIpe3JldHVybiBVKHRoaXMsdCxlLHIsITEpfSxBLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbih0LGUscixuKXtpZih2b2lkIDA9PT1lKW49InV0ZjgiLHI9dGhpcy5sZW5ndGgsZT0wO2Vsc2UgaWYodm9pZCAwPT09ciYmInN0cmluZyI9PXR5cGVvZiBlKW49ZSxyPXRoaXMubGVuZ3RoLGU9MDtlbHNle2lmKCFpc0Zpbml0ZShlKSl0aHJvdyBuZXcgRXJyb3IoIkJ1ZmZlci53cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXRbLCBsZW5ndGhdKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkIik7ZXw9MCxpc0Zpbml0ZShyKT8ocnw9MCx2b2lkIDA9PT1uJiYobj0idXRmOCIpKToobj1yLHI9dm9pZCAwKX12YXIgaT10aGlzLmxlbmd0aC1lO2lmKCh2b2lkIDA9PT1yfHxyPmkpJiYocj1pKSx0Lmxlbmd0aD4wJiYocjwwfHxlPDApfHxlPnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcyIpO258fChuPSJ1dGY4Iik7Zm9yKHZhciBvPSExOzspc3dpdGNoKG4pe2Nhc2UiaGV4IjpyZXR1cm4gRCh0aGlzLHQsZSxyKTtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOnJldHVybiBOKHRoaXMsdCxlLHIpO2Nhc2UiYXNjaWkiOnJldHVybiBGKHRoaXMsdCxlLHIpO2Nhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIHoodGhpcyx0LGUscik7Y2FzZSJiYXNlNjQiOnJldHVybiBxKHRoaXMsdCxlLHIpO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gWSh0aGlzLHQsZSxyKTtkZWZhdWx0OmlmKG8pdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIituKTtuPSgiIituKS50b0xvd2VyQ2FzZSgpLG89ITB9fSxBLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToiQnVmZmVyIixkYXRhOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2Fycnx8dGhpcywwKX19O2Z1bmN0aW9uIEcodCxlLHIpe3ZhciBuPSIiO3I9TWF0aC5taW4odC5sZW5ndGgscik7Zm9yKHZhciBpPWU7aTxyOysraSluKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDEyNyZ0W2ldKTtyZXR1cm4gbn1mdW5jdGlvbiBKKHQsZSxyKXt2YXIgbj0iIjtyPU1hdGgubWluKHQubGVuZ3RoLHIpO2Zvcih2YXIgaT1lO2k8cjsrK2kpbis9U3RyaW5nLmZyb21DaGFyQ29kZSh0W2ldKTtyZXR1cm4gbn1mdW5jdGlvbiBIKHQsZSxyKXt2YXIgbj10Lmxlbmd0aDsoIWV8fGU8MCkmJihlPTApLCghcnx8cjwwfHxyPm4pJiYocj1uKTtmb3IodmFyIGk9IiIsbz1lO288cjsrK28paSs9aXQodFtvXSk7cmV0dXJuIGl9ZnVuY3Rpb24gVih0LGUscil7Zm9yKHZhciBuPXQuc2xpY2UoZSxyKSxpPSIiLG89MDtvPG4ubGVuZ3RoO28rPTIpaSs9U3RyaW5nLmZyb21DaGFyQ29kZShuW29dKzI1NipuW28rMV0pO3JldHVybiBpfWZ1bmN0aW9uIEsodCxlLHIpe2lmKHQlMSE9MHx8dDwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJvZmZzZXQgaXMgbm90IHVpbnQiKTtpZih0K2U+cil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCIpfWZ1bmN0aW9uIFoodCxlLHIsbixpLG8pe2lmKCFQKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJidWZmZXIiIGFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIgaW5zdGFuY2UnKTtpZihlPml8fGU8byl0aHJvdyBuZXcgUmFuZ2VFcnJvcignInZhbHVlIiBhcmd1bWVudCBpcyBvdXQgb2YgYm91bmRzJyk7aWYocituPnQubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBRKHQsZSxyLG4pe2U8MCYmKGU9NjU1MzUrZSsxKTtmb3IodmFyIGk9MCxvPU1hdGgubWluKHQubGVuZ3RoLXIsMik7aTxvOysraSl0W3IraV09KGUmMjU1PDw4KihuP2k6MS1pKSk+Pj44KihuP2k6MS1pKX1mdW5jdGlvbiBYKHQsZSxyLG4pe2U8MCYmKGU9NDI5NDk2NzI5NStlKzEpO2Zvcih2YXIgaT0wLG89TWF0aC5taW4odC5sZW5ndGgtciw0KTtpPG87KytpKXRbcitpXT1lPj4+OCoobj9pOjMtaSkmMjU1fWZ1bmN0aW9uIHR0KHQsZSxyLG4saSxvKXtpZihyK24+dC5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpO2lmKHI8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gZXQodCxlLHIsbixpKXtyZXR1cm4gaXx8dHQodCwwLHIsNCksXyh0LGUscixuLDIzLDQpLHIrNH1mdW5jdGlvbiBydCh0LGUscixuLGkpe3JldHVybiBpfHx0dCh0LDAsciw4KSxfKHQsZSxyLG4sNTIsOCkscis4fUEucHJvdG90eXBlLnNsaWNlPWZ1bmN0aW9uKHQsZSl7dmFyIHIsbj10aGlzLmxlbmd0aDtpZigodD1+fnQpPDA/KHQrPW4pPDAmJih0PTApOnQ+biYmKHQ9biksKGU9dm9pZCAwPT09ZT9uOn5+ZSk8MD8oZSs9bik8MCYmKGU9MCk6ZT5uJiYoZT1uKSxlPHQmJihlPXQpLEEuVFlQRURfQVJSQVlfU1VQUE9SVCkocj10aGlzLnN1YmFycmF5KHQsZSkpLl9fcHJvdG9fXz1BLnByb3RvdHlwZTtlbHNle3ZhciBpPWUtdDtyPW5ldyBBKGksdm9pZCAwKTtmb3IodmFyIG89MDtvPGk7KytvKXJbb109dGhpc1tvK3RdfXJldHVybiByfSxBLnByb3RvdHlwZS5yZWFkVUludExFPWZ1bmN0aW9uKHQsZSxyKXt0fD0wLGV8PTAscnx8Syh0LGUsdGhpcy5sZW5ndGgpO2Zvcih2YXIgbj10aGlzW3RdLGk9MSxvPTA7KytvPGUmJihpKj0yNTYpOyluKz10aGlzW3Qrb10qaTtyZXR1cm4gbn0sQS5wcm90b3R5cGUucmVhZFVJbnRCRT1mdW5jdGlvbih0LGUscil7dHw9MCxlfD0wLHJ8fEsodCxlLHRoaXMubGVuZ3RoKTtmb3IodmFyIG49dGhpc1t0Ky0tZV0saT0xO2U+MCYmKGkqPTI1Nik7KW4rPXRoaXNbdCstLWVdKmk7cmV0dXJuIG59LEEucHJvdG90eXBlLnJlYWRVSW50OD1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxLKHQsMSx0aGlzLmxlbmd0aCksdGhpc1t0XX0sQS5wcm90b3R5cGUucmVhZFVJbnQxNkxFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEsodCwyLHRoaXMubGVuZ3RoKSx0aGlzW3RdfHRoaXNbdCsxXTw8OH0sQS5wcm90b3R5cGUucmVhZFVJbnQxNkJFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEsodCwyLHRoaXMubGVuZ3RoKSx0aGlzW3RdPDw4fHRoaXNbdCsxXX0sQS5wcm90b3R5cGUucmVhZFVJbnQzMkxFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEsodCw0LHRoaXMubGVuZ3RoKSwodGhpc1t0XXx0aGlzW3QrMV08PDh8dGhpc1t0KzJdPDwxNikrMTY3NzcyMTYqdGhpc1t0KzNdfSxBLnByb3RvdHlwZS5yZWFkVUludDMyQkU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Syh0LDQsdGhpcy5sZW5ndGgpLDE2Nzc3MjE2KnRoaXNbdF0rKHRoaXNbdCsxXTw8MTZ8dGhpc1t0KzJdPDw4fHRoaXNbdCszXSl9LEEucHJvdG90eXBlLnJlYWRJbnRMRT1mdW5jdGlvbih0LGUscil7dHw9MCxlfD0wLHJ8fEsodCxlLHRoaXMubGVuZ3RoKTtmb3IodmFyIG49dGhpc1t0XSxpPTEsbz0wOysrbzxlJiYoaSo9MjU2KTspbis9dGhpc1t0K29dKmk7cmV0dXJuIG4+PShpKj0xMjgpJiYobi09TWF0aC5wb3coMiw4KmUpKSxufSxBLnByb3RvdHlwZS5yZWFkSW50QkU9ZnVuY3Rpb24odCxlLHIpe3R8PTAsZXw9MCxyfHxLKHQsZSx0aGlzLmxlbmd0aCk7Zm9yKHZhciBuPWUsaT0xLG89dGhpc1t0Ky0tbl07bj4wJiYoaSo9MjU2KTspbys9dGhpc1t0Ky0tbl0qaTtyZXR1cm4gbz49KGkqPTEyOCkmJihvLT1NYXRoLnBvdygyLDgqZSkpLG99LEEucHJvdG90eXBlLnJlYWRJbnQ4PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEsodCwxLHRoaXMubGVuZ3RoKSwxMjgmdGhpc1t0XT8tMSooMjU1LXRoaXNbdF0rMSk6dGhpc1t0XX0sQS5wcm90b3R5cGUucmVhZEludDE2TEU9ZnVuY3Rpb24odCxlKXtlfHxLKHQsMix0aGlzLmxlbmd0aCk7dmFyIHI9dGhpc1t0XXx0aGlzW3QrMV08PDg7cmV0dXJuIDMyNzY4JnI/NDI5NDkwMTc2MHxyOnJ9LEEucHJvdG90eXBlLnJlYWRJbnQxNkJFPWZ1bmN0aW9uKHQsZSl7ZXx8Syh0LDIsdGhpcy5sZW5ndGgpO3ZhciByPXRoaXNbdCsxXXx0aGlzW3RdPDw4O3JldHVybiAzMjc2OCZyPzQyOTQ5MDE3NjB8cjpyfSxBLnByb3RvdHlwZS5yZWFkSW50MzJMRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxLKHQsNCx0aGlzLmxlbmd0aCksdGhpc1t0XXx0aGlzW3QrMV08PDh8dGhpc1t0KzJdPDwxNnx0aGlzW3QrM108PDI0fSxBLnByb3RvdHlwZS5yZWFkSW50MzJCRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxLKHQsNCx0aGlzLmxlbmd0aCksdGhpc1t0XTw8MjR8dGhpc1t0KzFdPDwxNnx0aGlzW3QrMl08PDh8dGhpc1t0KzNdfSxBLnByb3RvdHlwZS5yZWFkRmxvYXRMRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxLKHQsNCx0aGlzLmxlbmd0aCksdyh0aGlzLHQsITAsMjMsNCl9LEEucHJvdG90eXBlLnJlYWRGbG9hdEJFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEsodCw0LHRoaXMubGVuZ3RoKSx3KHRoaXMsdCwhMSwyMyw0KX0sQS5wcm90b3R5cGUucmVhZERvdWJsZUxFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEsodCw4LHRoaXMubGVuZ3RoKSx3KHRoaXMsdCwhMCw1Miw4KX0sQS5wcm90b3R5cGUucmVhZERvdWJsZUJFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEsodCw4LHRoaXMubGVuZ3RoKSx3KHRoaXMsdCwhMSw1Miw4KX0sQS5wcm90b3R5cGUud3JpdGVVSW50TEU9ZnVuY3Rpb24odCxlLHIsbil7KHQ9K3QsZXw9MCxyfD0wLG4pfHxaKHRoaXMsdCxlLHIsTWF0aC5wb3coMiw4KnIpLTEsMCk7dmFyIGk9MSxvPTA7Zm9yKHRoaXNbZV09MjU1JnQ7KytvPHImJihpKj0yNTYpOyl0aGlzW2Urb109dC9pJjI1NTtyZXR1cm4gZStyfSxBLnByb3RvdHlwZS53cml0ZVVJbnRCRT1mdW5jdGlvbih0LGUscixuKXsodD0rdCxlfD0wLHJ8PTAsbil8fFoodGhpcyx0LGUscixNYXRoLnBvdygyLDgqciktMSwwKTt2YXIgaT1yLTEsbz0xO2Zvcih0aGlzW2UraV09MjU1JnQ7LS1pPj0wJiYobyo9MjU2KTspdGhpc1tlK2ldPXQvbyYyNTU7cmV0dXJuIGUrcn0sQS5wcm90b3R5cGUud3JpdGVVSW50OD1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZXw9MCxyfHxaKHRoaXMsdCxlLDEsMjU1LDApLEEuVFlQRURfQVJSQVlfU1VQUE9SVHx8KHQ9TWF0aC5mbG9vcih0KSksdGhpc1tlXT0yNTUmdCxlKzF9LEEucHJvdG90eXBlLndyaXRlVUludDE2TEU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGV8PTAscnx8Wih0aGlzLHQsZSwyLDY1NTM1LDApLEEuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT0yNTUmdCx0aGlzW2UrMV09dD4+PjgpOlEodGhpcyx0LGUsITApLGUrMn0sQS5wcm90b3R5cGUud3JpdGVVSW50MTZCRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZXw9MCxyfHxaKHRoaXMsdCxlLDIsNjU1MzUsMCksQS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPXQ+Pj44LHRoaXNbZSsxXT0yNTUmdCk6USh0aGlzLHQsZSwhMSksZSsyfSxBLnByb3RvdHlwZS53cml0ZVVJbnQzMkxFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fFoodGhpcyx0LGUsNCw0Mjk0OTY3Mjk1LDApLEEuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlKzNdPXQ+Pj4yNCx0aGlzW2UrMl09dD4+PjE2LHRoaXNbZSsxXT10Pj4+OCx0aGlzW2VdPTI1NSZ0KTpYKHRoaXMsdCxlLCEwKSxlKzR9LEEucHJvdG90eXBlLndyaXRlVUludDMyQkU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGV8PTAscnx8Wih0aGlzLHQsZSw0LDQyOTQ5NjcyOTUsMCksQS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPXQ+Pj4yNCx0aGlzW2UrMV09dD4+PjE2LHRoaXNbZSsyXT10Pj4+OCx0aGlzW2UrM109MjU1JnQpOlgodGhpcyx0LGUsITEpLGUrNH0sQS5wcm90b3R5cGUud3JpdGVJbnRMRT1mdW5jdGlvbih0LGUscixuKXtpZih0PSt0LGV8PTAsIW4pe3ZhciBpPU1hdGgucG93KDIsOCpyLTEpO1oodGhpcyx0LGUscixpLTEsLWkpfXZhciBvPTAscz0xLGE9MDtmb3IodGhpc1tlXT0yNTUmdDsrK288ciYmKHMqPTI1Nik7KXQ8MCYmMD09PWEmJjAhPT10aGlzW2Urby0xXSYmKGE9MSksdGhpc1tlK29dPSh0L3M+PjApLWEmMjU1O3JldHVybiBlK3J9LEEucHJvdG90eXBlLndyaXRlSW50QkU9ZnVuY3Rpb24odCxlLHIsbil7aWYodD0rdCxlfD0wLCFuKXt2YXIgaT1NYXRoLnBvdygyLDgqci0xKTtaKHRoaXMsdCxlLHIsaS0xLC1pKX12YXIgbz1yLTEscz0xLGE9MDtmb3IodGhpc1tlK29dPTI1NSZ0Oy0tbz49MCYmKHMqPTI1Nik7KXQ8MCYmMD09PWEmJjAhPT10aGlzW2UrbysxXSYmKGE9MSksdGhpc1tlK29dPSh0L3M+PjApLWEmMjU1O3JldHVybiBlK3J9LEEucHJvdG90eXBlLndyaXRlSW50OD1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZXw9MCxyfHxaKHRoaXMsdCxlLDEsMTI3LC0xMjgpLEEuVFlQRURfQVJSQVlfU1VQUE9SVHx8KHQ9TWF0aC5mbG9vcih0KSksdDwwJiYodD0yNTUrdCsxKSx0aGlzW2VdPTI1NSZ0LGUrMX0sQS5wcm90b3R5cGUud3JpdGVJbnQxNkxFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fFoodGhpcyx0LGUsMiwzMjc2NywtMzI3NjgpLEEuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT0yNTUmdCx0aGlzW2UrMV09dD4+PjgpOlEodGhpcyx0LGUsITApLGUrMn0sQS5wcm90b3R5cGUud3JpdGVJbnQxNkJFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fFoodGhpcyx0LGUsMiwzMjc2NywtMzI3NjgpLEEuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT10Pj4+OCx0aGlzW2UrMV09MjU1JnQpOlEodGhpcyx0LGUsITEpLGUrMn0sQS5wcm90b3R5cGUud3JpdGVJbnQzMkxFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fFoodGhpcyx0LGUsNCwyMTQ3NDgzNjQ3LC0yMTQ3NDgzNjQ4KSxBLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09MjU1JnQsdGhpc1tlKzFdPXQ+Pj44LHRoaXNbZSsyXT10Pj4+MTYsdGhpc1tlKzNdPXQ+Pj4yNCk6WCh0aGlzLHQsZSwhMCksZSs0fSxBLnByb3RvdHlwZS53cml0ZUludDMyQkU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGV8PTAscnx8Wih0aGlzLHQsZSw0LDIxNDc0ODM2NDcsLTIxNDc0ODM2NDgpLHQ8MCYmKHQ9NDI5NDk2NzI5NSt0KzEpLEEuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT10Pj4+MjQsdGhpc1tlKzFdPXQ+Pj4xNix0aGlzW2UrMl09dD4+PjgsdGhpc1tlKzNdPTI1NSZ0KTpYKHRoaXMsdCxlLCExKSxlKzR9LEEucHJvdG90eXBlLndyaXRlRmxvYXRMRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIGV0KHRoaXMsdCxlLCEwLHIpfSxBLnByb3RvdHlwZS53cml0ZUZsb2F0QkU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiBldCh0aGlzLHQsZSwhMSxyKX0sQS5wcm90b3R5cGUud3JpdGVEb3VibGVMRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHJ0KHRoaXMsdCxlLCEwLHIpfSxBLnByb3RvdHlwZS53cml0ZURvdWJsZUJFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gcnQodGhpcyx0LGUsITEscil9LEEucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24odCxlLHIsbil7aWYocnx8KHI9MCksbnx8MD09PW58fChuPXRoaXMubGVuZ3RoKSxlPj10Lmxlbmd0aCYmKGU9dC5sZW5ndGgpLGV8fChlPTApLG4+MCYmbjxyJiYobj1yKSxuPT09cilyZXR1cm4gMDtpZigwPT09dC5sZW5ndGh8fDA9PT10aGlzLmxlbmd0aClyZXR1cm4gMDtpZihlPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoInRhcmdldFN0YXJ0IG91dCBvZiBib3VuZHMiKTtpZihyPDB8fHI+PXRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJzb3VyY2VTdGFydCBvdXQgb2YgYm91bmRzIik7aWYobjwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJzb3VyY2VFbmQgb3V0IG9mIGJvdW5kcyIpO24+dGhpcy5sZW5ndGgmJihuPXRoaXMubGVuZ3RoKSx0Lmxlbmd0aC1lPG4tciYmKG49dC5sZW5ndGgtZStyKTt2YXIgaSxvPW4tcjtpZih0aGlzPT09dCYmcjxlJiZlPG4pZm9yKGk9by0xO2k+PTA7LS1pKXRbaStlXT10aGlzW2krcl07ZWxzZSBpZihvPDFlM3x8IUEuVFlQRURfQVJSQVlfU1VQUE9SVClmb3IoaT0wO2k8bzsrK2kpdFtpK2VdPXRoaXNbaStyXTtlbHNlIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKHQsdGhpcy5zdWJhcnJheShyLHIrbyksZSk7cmV0dXJuIG99LEEucHJvdG90eXBlLmZpbGw9ZnVuY3Rpb24odCxlLHIsbil7aWYoInN0cmluZyI9PXR5cGVvZiB0KXtpZigic3RyaW5nIj09dHlwZW9mIGU/KG49ZSxlPTAscj10aGlzLmxlbmd0aCk6InN0cmluZyI9PXR5cGVvZiByJiYobj1yLHI9dGhpcy5sZW5ndGgpLDE9PT10Lmxlbmd0aCl7dmFyIGk9dC5jaGFyQ29kZUF0KDApO2k8MjU2JiYodD1pKX1pZih2b2lkIDAhPT1uJiYic3RyaW5nIiE9dHlwZW9mIG4pdGhyb3cgbmV3IFR5cGVFcnJvcigiZW5jb2RpbmcgbXVzdCBiZSBhIHN0cmluZyIpO2lmKCJzdHJpbmciPT10eXBlb2YgbiYmIUEuaXNFbmNvZGluZyhuKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK24pfWVsc2UibnVtYmVyIj09dHlwZW9mIHQmJih0Jj0yNTUpO2lmKGU8MHx8dGhpcy5sZW5ndGg8ZXx8dGhpcy5sZW5ndGg8cil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiT3V0IG9mIHJhbmdlIGluZGV4Iik7aWYocjw9ZSlyZXR1cm4gdGhpczt2YXIgbztpZihlPj4+PTAscj12b2lkIDA9PT1yP3RoaXMubGVuZ3RoOnI+Pj4wLHR8fCh0PTApLCJudW1iZXIiPT10eXBlb2YgdClmb3Iobz1lO288cjsrK28pdGhpc1tvXT10O2Vsc2V7dmFyIHM9UCh0KT90Om90KG5ldyBBKHQsbikudG9TdHJpbmcoKSksYT1zLmxlbmd0aDtmb3Iobz0wO288ci1lOysrbyl0aGlzW28rZV09c1tvJWFdfXJldHVybiB0aGlzfTt2YXIgbnQ9L1teK1wvMC05QS1aYS16LV9dL2c7ZnVuY3Rpb24gaXQodCl7cmV0dXJuIHQ8MTY/IjAiK3QudG9TdHJpbmcoMTYpOnQudG9TdHJpbmcoMTYpfWZ1bmN0aW9uIG90KHQsZSl7dmFyIHI7ZT1lfHwxLzA7Zm9yKHZhciBuPXQubGVuZ3RoLGk9bnVsbCxvPVtdLHM9MDtzPG47KytzKXtpZigocj10LmNoYXJDb2RlQXQocykpPjU1Mjk1JiZyPDU3MzQ0KXtpZighaSl7aWYocj41NjMxOSl7KGUtPTMpPi0xJiZvLnB1c2goMjM5LDE5MSwxODkpO2NvbnRpbnVlfWlmKHMrMT09PW4peyhlLT0zKT4tMSYmby5wdXNoKDIzOSwxOTEsMTg5KTtjb250aW51ZX1pPXI7Y29udGludWV9aWYocjw1NjMyMCl7KGUtPTMpPi0xJiZvLnB1c2goMjM5LDE5MSwxODkpLGk9cjtjb250aW51ZX1yPTY1NTM2KyhpLTU1Mjk2PDwxMHxyLTU2MzIwKX1lbHNlIGkmJihlLT0zKT4tMSYmby5wdXNoKDIzOSwxOTEsMTg5KTtpZihpPW51bGwscjwxMjgpe2lmKChlLT0xKTwwKWJyZWFrO28ucHVzaChyKX1lbHNlIGlmKHI8MjA0OCl7aWYoKGUtPTIpPDApYnJlYWs7by5wdXNoKHI+PjZ8MTkyLDYzJnJ8MTI4KX1lbHNlIGlmKHI8NjU1MzYpe2lmKChlLT0zKTwwKWJyZWFrO28ucHVzaChyPj4xMnwyMjQscj4+NiY2M3wxMjgsNjMmcnwxMjgpfWVsc2V7aWYoIShyPDExMTQxMTIpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBjb2RlIHBvaW50Iik7aWYoKGUtPTQpPDApYnJlYWs7by5wdXNoKHI+PjE4fDI0MCxyPj4xMiY2M3wxMjgscj4+NiY2M3wxMjgsNjMmcnwxMjgpfX1yZXR1cm4gb31mdW5jdGlvbiBzdCh0KXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIGUscixuLGksbyxzO3l8fHYoKTt2YXIgYT10Lmxlbmd0aDtpZihhJTQ+MCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgc3RyaW5nLiBMZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQiKTtvPSI9Ij09PXRbYS0yXT8yOiI9Ij09PXRbYS0xXT8xOjAscz1uZXcgZygzKmEvNC1vKSxuPW8+MD9hLTQ6YTt2YXIgdT0wO2ZvcihlPTAscj0wO2U8bjtlKz00LHIrPTMpaT1kW3QuY2hhckNvZGVBdChlKV08PDE4fGRbdC5jaGFyQ29kZUF0KGUrMSldPDwxMnxkW3QuY2hhckNvZGVBdChlKzIpXTw8NnxkW3QuY2hhckNvZGVBdChlKzMpXSxzW3UrK109aT4+MTYmMjU1LHNbdSsrXT1pPj44JjI1NSxzW3UrK109MjU1Jmk7cmV0dXJuIDI9PT1vPyhpPWRbdC5jaGFyQ29kZUF0KGUpXTw8MnxkW3QuY2hhckNvZGVBdChlKzEpXT4+NCxzW3UrK109MjU1JmkpOjE9PT1vJiYoaT1kW3QuY2hhckNvZGVBdChlKV08PDEwfGRbdC5jaGFyQ29kZUF0KGUrMSldPDw0fGRbdC5jaGFyQ29kZUF0KGUrMildPj4yLHNbdSsrXT1pPj44JjI1NSxzW3UrK109MjU1JmkpLHN9KGZ1bmN0aW9uKHQpe2lmKCh0PWZ1bmN0aW9uKHQpe3JldHVybiB0LnRyaW0/dC50cmltKCk6dC5yZXBsYWNlKC9eXHMrfFxzKyQvZywiIil9KHQpLnJlcGxhY2UobnQsIiIpKS5sZW5ndGg8MilyZXR1cm4iIjtmb3IoO3QubGVuZ3RoJTQhPTA7KXQrPSI9IjtyZXR1cm4gdH0odCkpfWZ1bmN0aW9uIGF0KHQsZSxyLG4pe2Zvcih2YXIgaT0wO2k8biYmIShpK3I+PWUubGVuZ3RofHxpPj10Lmxlbmd0aCk7KytpKWVbaStyXT10W2ldO3JldHVybiBpfWZ1bmN0aW9uIHV0KHQpe3JldHVybiEhdC5jb25zdHJ1Y3RvciYmImZ1bmN0aW9uIj09dHlwZW9mIHQuY29uc3RydWN0b3IuaXNCdWZmZXImJnQuY29uc3RydWN0b3IuaXNCdWZmZXIodCl9ZnVuY3Rpb24gaHQoKXt0aHJvdyBuZXcgRXJyb3IoInNldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQiKX1mdW5jdGlvbiBmdCgpe3Rocm93IG5ldyBFcnJvcigiY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkIil9dmFyIGN0PWh0LGx0PWZ0O2Z1bmN0aW9uIHB0KHQpe2lmKGN0PT09c2V0VGltZW91dClyZXR1cm4gc2V0VGltZW91dCh0LDApO2lmKChjdD09PWh0fHwhY3QpJiZzZXRUaW1lb3V0KXJldHVybiBjdD1zZXRUaW1lb3V0LHNldFRpbWVvdXQodCwwKTt0cnl7cmV0dXJuIGN0KHQsMCl9Y2F0Y2goZSl7dHJ5e3JldHVybiBjdC5jYWxsKG51bGwsdCwwKX1jYXRjaChlKXtyZXR1cm4gY3QuY2FsbCh0aGlzLHQsMCl9fX0iZnVuY3Rpb24iPT10eXBlb2YgbC5zZXRUaW1lb3V0JiYoY3Q9c2V0VGltZW91dCksImZ1bmN0aW9uIj09dHlwZW9mIGwuY2xlYXJUaW1lb3V0JiYobHQ9Y2xlYXJUaW1lb3V0KTt2YXIgZHQsZ3Q9W10seXQ9ITEsdnQ9LTE7ZnVuY3Rpb24gYnQoKXt5dCYmZHQmJih5dD0hMSxkdC5sZW5ndGg/Z3Q9ZHQuY29uY2F0KGd0KTp2dD0tMSxndC5sZW5ndGgmJm10KCkpfWZ1bmN0aW9uIG10KCl7aWYoIXl0KXt2YXIgdD1wdChidCk7eXQ9ITA7Zm9yKHZhciBlPWd0Lmxlbmd0aDtlOyl7Zm9yKGR0PWd0LGd0PVtdOysrdnQ8ZTspZHQmJmR0W3Z0XS5ydW4oKTt2dD0tMSxlPWd0Lmxlbmd0aH1kdD1udWxsLHl0PSExLGZ1bmN0aW9uKHQpe2lmKGx0PT09Y2xlYXJUaW1lb3V0KXJldHVybiBjbGVhclRpbWVvdXQodCk7aWYoKGx0PT09ZnR8fCFsdCkmJmNsZWFyVGltZW91dClyZXR1cm4gbHQ9Y2xlYXJUaW1lb3V0LGNsZWFyVGltZW91dCh0KTt0cnl7bHQodCl9Y2F0Y2goZSl7dHJ5e3JldHVybiBsdC5jYWxsKG51bGwsdCl9Y2F0Y2goZSl7cmV0dXJuIGx0LmNhbGwodGhpcyx0KX19fSh0KX19ZnVuY3Rpb24gd3QodCl7dmFyIGU9bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgtMSk7aWYoYXJndW1lbnRzLmxlbmd0aD4xKWZvcih2YXIgcj0xO3I8YXJndW1lbnRzLmxlbmd0aDtyKyspZVtyLTFdPWFyZ3VtZW50c1tyXTtndC5wdXNoKG5ldyBfdCh0LGUpKSwxIT09Z3QubGVuZ3RofHx5dHx8cHQobXQpfWZ1bmN0aW9uIF90KHQsZSl7dGhpcy5mdW49dCx0aGlzLmFycmF5PWV9X3QucHJvdG90eXBlLnJ1bj1mdW5jdGlvbigpe3RoaXMuZnVuLmFwcGx5KG51bGwsdGhpcy5hcnJheSl9O2Z1bmN0aW9uIFN0KCl7fXZhciBFdD1TdCxrdD1TdCxSdD1TdCxBdD1TdCxUdD1TdCxPdD1TdCxqdD1TdDt2YXIgTHQ9bC5wZXJmb3JtYW5jZXx8e30sQ3Q9THQubm93fHxMdC5tb3pOb3d8fEx0Lm1zTm93fHxMdC5vTm93fHxMdC53ZWJraXROb3d8fGZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBEYXRlKS5nZXRUaW1lKCl9O3ZhciBQdD1uZXcgRGF0ZTt2YXIgTXQsQnQ9e25leHRUaWNrOnd0LHRpdGxlOiJicm93c2VyIixicm93c2VyOiEwLGVudjp7fSxhcmd2OltdLHZlcnNpb246IiIsdmVyc2lvbnM6e30sb246RXQsYWRkTGlzdGVuZXI6a3Qsb25jZTpSdCxvZmY6QXQscmVtb3ZlTGlzdGVuZXI6VHQscmVtb3ZlQWxsTGlzdGVuZXJzOk90LGVtaXQ6anQsYmluZGluZzpmdW5jdGlvbih0KXt0aHJvdyBuZXcgRXJyb3IoInByb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkIil9LGN3ZDpmdW5jdGlvbigpe3JldHVybiIvIn0sY2hkaXI6ZnVuY3Rpb24odCl7dGhyb3cgbmV3IEVycm9yKCJwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQiKX0sdW1hc2s6ZnVuY3Rpb24oKXtyZXR1cm4gMH0saHJ0aW1lOmZ1bmN0aW9uKHQpe3ZhciBlPS4wMDEqQ3QuY2FsbChMdCkscj1NYXRoLmZsb29yKGUpLG49TWF0aC5mbG9vcihlJTEqMWU5KTtyZXR1cm4gdCYmKHItPXRbMF0sKG4tPXRbMV0pPDAmJihyLS0sbis9MWU5KSksW3Isbl19LHBsYXRmb3JtOiJicm93c2VyIixyZWxlYXNlOnt9LGNvbmZpZzp7fSx1cHRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUtUHQpLzFlM319O010PSJmdW5jdGlvbiI9PXR5cGVvZiBPYmplY3QuY3JlYXRlP2Z1bmN0aW9uKHQsZSl7dC5zdXBlcl89ZSx0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KX06ZnVuY3Rpb24odCxlKXt0LnN1cGVyXz1lO3ZhciByPWZ1bmN0aW9uKCl7fTtyLnByb3RvdHlwZT1lLnByb3RvdHlwZSx0LnByb3RvdHlwZT1uZXcgcix0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj10fTt2YXIgeHQ9TXQsVXQ9LyVbc2RqJV0vZztmdW5jdGlvbiBJdCh0KXtpZighVnQodCkpe2Zvcih2YXIgZT1bXSxyPTA7cjxhcmd1bWVudHMubGVuZ3RoO3IrKyllLnB1c2goenQoYXJndW1lbnRzW3JdKSk7cmV0dXJuIGUuam9pbigiICIpfXI9MTtmb3IodmFyIG49YXJndW1lbnRzLGk9bi5sZW5ndGgsbz1TdHJpbmcodCkucmVwbGFjZShVdCwoZnVuY3Rpb24odCl7aWYoIiUlIj09PXQpcmV0dXJuIiUiO2lmKHI+PWkpcmV0dXJuIHQ7c3dpdGNoKHQpe2Nhc2UiJXMiOnJldHVybiBTdHJpbmcobltyKytdKTtjYXNlIiVkIjpyZXR1cm4gTnVtYmVyKG5bcisrXSk7Y2FzZSIlaiI6dHJ5e3JldHVybiBKU09OLnN0cmluZ2lmeShuW3IrK10pfWNhdGNoKHQpe3JldHVybiJbQ2lyY3VsYXJdIn1kZWZhdWx0OnJldHVybiB0fX0pKSxzPW5bcl07cjxpO3M9blsrK3JdKUh0KHMpfHwhUXQocyk/bys9IiAiK3M6bys9IiAiK3p0KHMpO3JldHVybiBvfWZ1bmN0aW9uIER0KHQsZSl7aWYoS3QobC5wcm9jZXNzKSlyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gRHQodCxlKS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O2lmKCEwPT09QnQubm9EZXByZWNhdGlvbilyZXR1cm4gdDt2YXIgcj0hMTtyZXR1cm4gZnVuY3Rpb24oKXtpZighcil7aWYoQnQudGhyb3dEZXByZWNhdGlvbil0aHJvdyBuZXcgRXJyb3IoZSk7QnQudHJhY2VEZXByZWNhdGlvbj9jb25zb2xlLnRyYWNlKGUpOmNvbnNvbGUuZXJyb3IoZSkscj0hMH1yZXR1cm4gdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fXZhciBOdCxGdD17fTtmdW5jdGlvbiB6dCh0LGUpe3ZhciByPXtzZWVuOltdLHN0eWxpemU6WXR9O3JldHVybiBhcmd1bWVudHMubGVuZ3RoPj0zJiYoci5kZXB0aD1hcmd1bWVudHNbMl0pLGFyZ3VtZW50cy5sZW5ndGg+PTQmJihyLmNvbG9ycz1hcmd1bWVudHNbM10pLEp0KGUpP3Iuc2hvd0hpZGRlbj1lOmUmJm5lKHIsZSksS3Qoci5zaG93SGlkZGVuKSYmKHIuc2hvd0hpZGRlbj0hMSksS3Qoci5kZXB0aCkmJihyLmRlcHRoPTIpLEt0KHIuY29sb3JzKSYmKHIuY29sb3JzPSExKSxLdChyLmN1c3RvbUluc3BlY3QpJiYoci5jdXN0b21JbnNwZWN0PSEwKSxyLmNvbG9ycyYmKHIuc3R5bGl6ZT1xdCksV3Qocix0LHIuZGVwdGgpfWZ1bmN0aW9uIHF0KHQsZSl7dmFyIHI9enQuc3R5bGVzW2VdO3JldHVybiByPyIbWyIrenQuY29sb3JzW3JdWzBdKyJtIit0KyIbWyIrenQuY29sb3JzW3JdWzFdKyJtIjp0fWZ1bmN0aW9uIFl0KHQsZSl7cmV0dXJuIHR9ZnVuY3Rpb24gV3QodCxlLHIpe2lmKHQuY3VzdG9tSW5zcGVjdCYmZSYmZWUoZS5pbnNwZWN0KSYmZS5pbnNwZWN0IT09enQmJighZS5jb25zdHJ1Y3Rvcnx8ZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUhPT1lKSl7dmFyIG49ZS5pbnNwZWN0KHIsdCk7cmV0dXJuIFZ0KG4pfHwobj1XdCh0LG4scikpLG59dmFyIGk9ZnVuY3Rpb24odCxlKXtpZihLdChlKSlyZXR1cm4gdC5zdHlsaXplKCJ1bmRlZmluZWQiLCJ1bmRlZmluZWQiKTtpZihWdChlKSl7dmFyIHI9IiciK0pTT04uc3RyaW5naWZ5KGUpLnJlcGxhY2UoL14ifCIkL2csIiIpLnJlcGxhY2UoLycvZywiXFwnIikucmVwbGFjZSgvXFwiL2csJyInKSsiJyI7cmV0dXJuIHQuc3R5bGl6ZShyLCJzdHJpbmciKX1pZihuPWUsIm51bWJlciI9PXR5cGVvZiBuKXJldHVybiB0LnN0eWxpemUoIiIrZSwibnVtYmVyIik7dmFyIG47aWYoSnQoZSkpcmV0dXJuIHQuc3R5bGl6ZSgiIitlLCJib29sZWFuIik7aWYoSHQoZSkpcmV0dXJuIHQuc3R5bGl6ZSgibnVsbCIsIm51bGwiKX0odCxlKTtpZihpKXJldHVybiBpO3ZhciBvPU9iamVjdC5rZXlzKGUpLHM9ZnVuY3Rpb24odCl7dmFyIGU9e307cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCxyKXtlW3RdPSEwfSkpLGV9KG8pO2lmKHQuc2hvd0hpZGRlbiYmKG89T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZSkpLHRlKGUpJiYoby5pbmRleE9mKCJtZXNzYWdlIik+PTB8fG8uaW5kZXhPZigiZGVzY3JpcHRpb24iKT49MCkpcmV0dXJuICR0KGUpO2lmKDA9PT1vLmxlbmd0aCl7aWYoZWUoZSkpe3ZhciBhPWUubmFtZT8iOiAiK2UubmFtZToiIjtyZXR1cm4gdC5zdHlsaXplKCJbRnVuY3Rpb24iK2ErIl0iLCJzcGVjaWFsIil9aWYoWnQoZSkpcmV0dXJuIHQuc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSksInJlZ2V4cCIpO2lmKFh0KGUpKXJldHVybiB0LnN0eWxpemUoRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKSwiZGF0ZSIpO2lmKHRlKGUpKXJldHVybiAkdChlKX12YXIgdSxoLGY9IiIsYz0hMSxsPVsieyIsIn0iXTsodT1lLEFycmF5LmlzQXJyYXkodSkmJihjPSEwLGw9WyJbIiwiXSJdKSxlZShlKSkmJihmPSIgW0Z1bmN0aW9uIisoZS5uYW1lPyI6ICIrZS5uYW1lOiIiKSsiXSIpO3JldHVybiBadChlKSYmKGY9IiAiK1JlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKSksWHQoZSkmJihmPSIgIitEYXRlLnByb3RvdHlwZS50b1VUQ1N0cmluZy5jYWxsKGUpKSx0ZShlKSYmKGY9IiAiKyR0KGUpKSwwIT09by5sZW5ndGh8fGMmJjAhPWUubGVuZ3RoP3I8MD9adChlKT90LnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLCJyZWdleHAiKTp0LnN0eWxpemUoIltPYmplY3RdIiwic3BlY2lhbCIpOih0LnNlZW4ucHVzaChlKSxoPWM/ZnVuY3Rpb24odCxlLHIsbixpKXtmb3IodmFyIG89W10scz0wLGE9ZS5sZW5ndGg7czxhOysrcylpZShlLFN0cmluZyhzKSk/by5wdXNoKEd0KHQsZSxyLG4sU3RyaW5nKHMpLCEwKSk6by5wdXNoKCIiKTtyZXR1cm4gaS5mb3JFYWNoKChmdW5jdGlvbihpKXtpLm1hdGNoKC9eXGQrJC8pfHxvLnB1c2goR3QodCxlLHIsbixpLCEwKSl9KSksb30odCxlLHIscyxvKTpvLm1hcCgoZnVuY3Rpb24obil7cmV0dXJuIEd0KHQsZSxyLHMsbixjKX0pKSx0LnNlZW4ucG9wKCksZnVuY3Rpb24odCxlLHIpe2lmKHQucmVkdWNlKChmdW5jdGlvbih0LGUpe3JldHVybiBlLmluZGV4T2YoIlxuIiksdCtlLnJlcGxhY2UoL1x1MDAxYlxbXGRcZD9tL2csIiIpLmxlbmd0aCsxfSksMCk+NjApcmV0dXJuIHJbMF0rKCIiPT09ZT8iIjplKyJcbiAiKSsiICIrdC5qb2luKCIsXG4gICIpKyIgIityWzFdO3JldHVybiByWzBdK2UrIiAiK3Quam9pbigiLCAiKSsiICIrclsxXX0oaCxmLGwpKTpsWzBdK2YrbFsxXX1mdW5jdGlvbiAkdCh0KXtyZXR1cm4iWyIrRXJyb3IucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkrIl0ifWZ1bmN0aW9uIEd0KHQsZSxyLG4saSxvKXt2YXIgcyxhLHU7aWYoKHU9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLGkpfHx7dmFsdWU6ZVtpXX0pLmdldD9hPXUuc2V0P3Quc3R5bGl6ZSgiW0dldHRlci9TZXR0ZXJdIiwic3BlY2lhbCIpOnQuc3R5bGl6ZSgiW0dldHRlcl0iLCJzcGVjaWFsIik6dS5zZXQmJihhPXQuc3R5bGl6ZSgiW1NldHRlcl0iLCJzcGVjaWFsIikpLGllKG4saSl8fChzPSJbIitpKyJdIiksYXx8KHQuc2Vlbi5pbmRleE9mKHUudmFsdWUpPDA/KGE9SHQocik/V3QodCx1LnZhbHVlLG51bGwpOld0KHQsdS52YWx1ZSxyLTEpKS5pbmRleE9mKCJcbiIpPi0xJiYoYT1vP2Euc3BsaXQoIlxuIikubWFwKChmdW5jdGlvbih0KXtyZXR1cm4iICAiK3R9KSkuam9pbigiXG4iKS5zdWJzdHIoMik6IlxuIithLnNwbGl0KCJcbiIpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIiAgICIrdH0pKS5qb2luKCJcbiIpKTphPXQuc3R5bGl6ZSgiW0NpcmN1bGFyXSIsInNwZWNpYWwiKSksS3Qocykpe2lmKG8mJmkubWF0Y2goL15cZCskLykpcmV0dXJuIGE7KHM9SlNPTi5zdHJpbmdpZnkoIiIraSkpLm1hdGNoKC9eIihbYS16QS1aX11bYS16QS1aXzAtOV0qKSIkLyk/KHM9cy5zdWJzdHIoMSxzLmxlbmd0aC0yKSxzPXQuc3R5bGl6ZShzLCJuYW1lIikpOihzPXMucmVwbGFjZSgvJy9nLCJcXCciKS5yZXBsYWNlKC9cXCIvZywnIicpLnJlcGxhY2UoLyheInwiJCkvZywiJyIpLHM9dC5zdHlsaXplKHMsInN0cmluZyIpKX1yZXR1cm4gcysiOiAiK2F9ZnVuY3Rpb24gSnQodCl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgdH1mdW5jdGlvbiBIdCh0KXtyZXR1cm4gbnVsbD09PXR9ZnVuY3Rpb24gVnQodCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0fWZ1bmN0aW9uIEt0KHQpe3JldHVybiB2b2lkIDA9PT10fWZ1bmN0aW9uIFp0KHQpe3JldHVybiBRdCh0KSYmIltvYmplY3QgUmVnRXhwXSI9PT1yZSh0KX1mdW5jdGlvbiBRdCh0KXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQmJm51bGwhPT10fWZ1bmN0aW9uIFh0KHQpe3JldHVybiBRdCh0KSYmIltvYmplY3QgRGF0ZV0iPT09cmUodCl9ZnVuY3Rpb24gdGUodCl7cmV0dXJuIFF0KHQpJiYoIltvYmplY3QgRXJyb3JdIj09PXJlKHQpfHx0IGluc3RhbmNlb2YgRXJyb3IpfWZ1bmN0aW9uIGVlKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0fWZ1bmN0aW9uIHJlKHQpe3JldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZnVuY3Rpb24gbmUodCxlKXtpZighZXx8IVF0KGUpKXJldHVybiB0O2Zvcih2YXIgcj1PYmplY3Qua2V5cyhlKSxuPXIubGVuZ3RoO24tLTspdFtyW25dXT1lW3Jbbl1dO3JldHVybiB0fWZ1bmN0aW9uIGllKHQsZSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpfWZ1bmN0aW9uIG9lKCl7dGhpcy5oZWFkPW51bGwsdGhpcy50YWlsPW51bGwsdGhpcy5sZW5ndGg9MH16dC5jb2xvcnM9e2JvbGQ6WzEsMjJdLGl0YWxpYzpbMywyM10sdW5kZXJsaW5lOls0LDI0XSxpbnZlcnNlOls3LDI3XSx3aGl0ZTpbMzcsMzldLGdyZXk6WzkwLDM5XSxibGFjazpbMzAsMzldLGJsdWU6WzM0LDM5XSxjeWFuOlszNiwzOV0sZ3JlZW46WzMyLDM5XSxtYWdlbnRhOlszNSwzOV0scmVkOlszMSwzOV0seWVsbG93OlszMywzOV19LHp0LnN0eWxlcz17c3BlY2lhbDoiY3lhbiIsbnVtYmVyOiJ5ZWxsb3ciLGJvb2xlYW46InllbGxvdyIsdW5kZWZpbmVkOiJncmV5IixudWxsOiJib2xkIixzdHJpbmc6ImdyZWVuIixkYXRlOiJtYWdlbnRhIixyZWdleHA6InJlZCJ9LG9lLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKHQpe3ZhciBlPXtkYXRhOnQsbmV4dDpudWxsfTt0aGlzLmxlbmd0aD4wP3RoaXMudGFpbC5uZXh0PWU6dGhpcy5oZWFkPWUsdGhpcy50YWlsPWUsKyt0aGlzLmxlbmd0aH0sb2UucHJvdG90eXBlLnVuc2hpZnQ9ZnVuY3Rpb24odCl7dmFyIGU9e2RhdGE6dCxuZXh0OnRoaXMuaGVhZH07MD09PXRoaXMubGVuZ3RoJiYodGhpcy50YWlsPWUpLHRoaXMuaGVhZD1lLCsrdGhpcy5sZW5ndGh9LG9lLnByb3RvdHlwZS5zaGlmdD1mdW5jdGlvbigpe2lmKDAhPT10aGlzLmxlbmd0aCl7dmFyIHQ9dGhpcy5oZWFkLmRhdGE7cmV0dXJuIDE9PT10aGlzLmxlbmd0aD90aGlzLmhlYWQ9dGhpcy50YWlsPW51bGw6dGhpcy5oZWFkPXRoaXMuaGVhZC5uZXh0LC0tdGhpcy5sZW5ndGgsdH19LG9lLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuaGVhZD10aGlzLnRhaWw9bnVsbCx0aGlzLmxlbmd0aD0wfSxvZS5wcm90b3R5cGUuam9pbj1mdW5jdGlvbih0KXtpZigwPT09dGhpcy5sZW5ndGgpcmV0dXJuIiI7Zm9yKHZhciBlPXRoaXMuaGVhZCxyPSIiK2UuZGF0YTtlPWUubmV4dDspcis9dCtlLmRhdGE7cmV0dXJuIHJ9LG9lLnByb3RvdHlwZS5jb25jYXQ9ZnVuY3Rpb24odCl7aWYoMD09PXRoaXMubGVuZ3RoKXJldHVybiBBLmFsbG9jKDApO2lmKDE9PT10aGlzLmxlbmd0aClyZXR1cm4gdGhpcy5oZWFkLmRhdGE7Zm9yKHZhciBlPUEuYWxsb2NVbnNhZmUodD4+PjApLHI9dGhpcy5oZWFkLG49MDtyOylyLmRhdGEuY29weShlLG4pLG4rPXIuZGF0YS5sZW5ndGgscj1yLm5leHQ7cmV0dXJuIGV9O3ZhciBzZT1BLmlzRW5jb2Rpbmd8fGZ1bmN0aW9uKHQpe3N3aXRjaCh0JiZ0LnRvTG93ZXJDYXNlKCkpe2Nhc2UiaGV4IjpjYXNlInV0ZjgiOmNhc2UidXRmLTgiOmNhc2UiYXNjaWkiOmNhc2UiYmluYXJ5IjpjYXNlImJhc2U2NCI6Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOmNhc2UicmF3IjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX07ZnVuY3Rpb24gYWUodCl7c3dpdGNoKHRoaXMuZW5jb2Rpbmc9KHR8fCJ1dGY4IikudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bLV9dLywiIiksZnVuY3Rpb24odCl7aWYodCYmIXNlKHQpKXRocm93IG5ldyBFcnJvcigiVW5rbm93biBlbmNvZGluZzogIit0KX0odCksdGhpcy5lbmNvZGluZyl7Y2FzZSJ1dGY4Ijp0aGlzLnN1cnJvZ2F0ZVNpemU9MzticmVhaztjYXNlInVjczIiOmNhc2UidXRmMTZsZSI6dGhpcy5zdXJyb2dhdGVTaXplPTIsdGhpcy5kZXRlY3RJbmNvbXBsZXRlQ2hhcj1oZTticmVhaztjYXNlImJhc2U2NCI6dGhpcy5zdXJyb2dhdGVTaXplPTMsdGhpcy5kZXRlY3RJbmNvbXBsZXRlQ2hhcj1mZTticmVhaztkZWZhdWx0OnJldHVybiB2b2lkKHRoaXMud3JpdGU9dWUpfXRoaXMuY2hhckJ1ZmZlcj1uZXcgQSg2KSx0aGlzLmNoYXJSZWNlaXZlZD0wLHRoaXMuY2hhckxlbmd0aD0wfWZ1bmN0aW9uIHVlKHQpe3JldHVybiB0LnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcpfWZ1bmN0aW9uIGhlKHQpe3RoaXMuY2hhclJlY2VpdmVkPXQubGVuZ3RoJTIsdGhpcy5jaGFyTGVuZ3RoPXRoaXMuY2hhclJlY2VpdmVkPzI6MH1mdW5jdGlvbiBmZSh0KXt0aGlzLmNoYXJSZWNlaXZlZD10Lmxlbmd0aCUzLHRoaXMuY2hhckxlbmd0aD10aGlzLmNoYXJSZWNlaXZlZD8zOjB9YWUucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0iIjt0aGlzLmNoYXJMZW5ndGg7KXt2YXIgcj10Lmxlbmd0aD49dGhpcy5jaGFyTGVuZ3RoLXRoaXMuY2hhclJlY2VpdmVkP3RoaXMuY2hhckxlbmd0aC10aGlzLmNoYXJSZWNlaXZlZDp0Lmxlbmd0aDtpZih0LmNvcHkodGhpcy5jaGFyQnVmZmVyLHRoaXMuY2hhclJlY2VpdmVkLDAsciksdGhpcy5jaGFyUmVjZWl2ZWQrPXIsdGhpcy5jaGFyUmVjZWl2ZWQ8dGhpcy5jaGFyTGVuZ3RoKXJldHVybiIiO2lmKHQ9dC5zbGljZShyLHQubGVuZ3RoKSwhKChpPShlPXRoaXMuY2hhckJ1ZmZlci5zbGljZSgwLHRoaXMuY2hhckxlbmd0aCkudG9TdHJpbmcodGhpcy5lbmNvZGluZykpLmNoYXJDb2RlQXQoZS5sZW5ndGgtMSkpPj01NTI5NiYmaTw9NTYzMTkpKXtpZih0aGlzLmNoYXJSZWNlaXZlZD10aGlzLmNoYXJMZW5ndGg9MCwwPT09dC5sZW5ndGgpcmV0dXJuIGU7YnJlYWt9dGhpcy5jaGFyTGVuZ3RoKz10aGlzLnN1cnJvZ2F0ZVNpemUsZT0iIn10aGlzLmRldGVjdEluY29tcGxldGVDaGFyKHQpO3ZhciBuPXQubGVuZ3RoO3RoaXMuY2hhckxlbmd0aCYmKHQuY29weSh0aGlzLmNoYXJCdWZmZXIsMCx0Lmxlbmd0aC10aGlzLmNoYXJSZWNlaXZlZCxuKSxuLT10aGlzLmNoYXJSZWNlaXZlZCk7dmFyIGk7bj0oZSs9dC50b1N0cmluZyh0aGlzLmVuY29kaW5nLDAsbikpLmxlbmd0aC0xO2lmKChpPWUuY2hhckNvZGVBdChuKSk+PTU1Mjk2JiZpPD01NjMxOSl7dmFyIG89dGhpcy5zdXJyb2dhdGVTaXplO3JldHVybiB0aGlzLmNoYXJMZW5ndGgrPW8sdGhpcy5jaGFyUmVjZWl2ZWQrPW8sdGhpcy5jaGFyQnVmZmVyLmNvcHkodGhpcy5jaGFyQnVmZmVyLG8sMCxvKSx0LmNvcHkodGhpcy5jaGFyQnVmZmVyLDAsMCxvKSxlLnN1YnN0cmluZygwLG4pfXJldHVybiBlfSxhZS5wcm90b3R5cGUuZGV0ZWN0SW5jb21wbGV0ZUNoYXI9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQubGVuZ3RoPj0zPzM6dC5sZW5ndGg7ZT4wO2UtLSl7dmFyIHI9dFt0Lmxlbmd0aC1lXTtpZigxPT1lJiZyPj41PT02KXt0aGlzLmNoYXJMZW5ndGg9MjticmVha31pZihlPD0yJiZyPj40PT0xNCl7dGhpcy5jaGFyTGVuZ3RoPTM7YnJlYWt9aWYoZTw9MyYmcj4+Mz09MzApe3RoaXMuY2hhckxlbmd0aD00O2JyZWFrfX10aGlzLmNoYXJSZWNlaXZlZD1lfSxhZS5wcm90b3R5cGUuZW5kPWZ1bmN0aW9uKHQpe3ZhciBlPSIiO2lmKHQmJnQubGVuZ3RoJiYoZT10aGlzLndyaXRlKHQpKSx0aGlzLmNoYXJSZWNlaXZlZCl7dmFyIHI9dGhpcy5jaGFyUmVjZWl2ZWQsbj10aGlzLmNoYXJCdWZmZXIsaT10aGlzLmVuY29kaW5nO2UrPW4uc2xpY2UoMCxyKS50b1N0cmluZyhpKX1yZXR1cm4gZX0scGUuUmVhZGFibGVTdGF0ZT1sZTt2YXIgY2U9ZnVuY3Rpb24odCl7aWYoS3QoTnQpJiYoTnQ9QnQuZW52Lk5PREVfREVCVUd8fCIiKSx0PXQudG9VcHBlckNhc2UoKSwhRnRbdF0paWYobmV3IFJlZ0V4cCgiXFxiIit0KyJcXGIiLCJpIikudGVzdChOdCkpe0Z0W3RdPWZ1bmN0aW9uKCl7dmFyIGU9SXQuYXBwbHkobnVsbCxhcmd1bWVudHMpO2NvbnNvbGUuZXJyb3IoIiVzICVkOiAlcyIsdCwwLGUpfX1lbHNlIEZ0W3RdPWZ1bmN0aW9uKCl7fTtyZXR1cm4gRnRbdF19KCJzdHJlYW0iKTtmdW5jdGlvbiBsZSh0LGUpe3Q9dHx8e30sdGhpcy5vYmplY3RNb2RlPSEhdC5vYmplY3RNb2RlLGUgaW5zdGFuY2VvZiBGZSYmKHRoaXMub2JqZWN0TW9kZT10aGlzLm9iamVjdE1vZGV8fCEhdC5yZWFkYWJsZU9iamVjdE1vZGUpO3ZhciByPXQuaGlnaFdhdGVyTWFyayxuPXRoaXMub2JqZWN0TW9kZT8xNjoxNjM4NDt0aGlzLmhpZ2hXYXRlck1hcms9cnx8MD09PXI/cjpuLHRoaXMuaGlnaFdhdGVyTWFyaz1+fnRoaXMuaGlnaFdhdGVyTWFyayx0aGlzLmJ1ZmZlcj1uZXcgb2UsdGhpcy5sZW5ndGg9MCx0aGlzLnBpcGVzPW51bGwsdGhpcy5waXBlc0NvdW50PTAsdGhpcy5mbG93aW5nPW51bGwsdGhpcy5lbmRlZD0hMSx0aGlzLmVuZEVtaXR0ZWQ9ITEsdGhpcy5yZWFkaW5nPSExLHRoaXMuc3luYz0hMCx0aGlzLm5lZWRSZWFkYWJsZT0hMSx0aGlzLmVtaXR0ZWRSZWFkYWJsZT0hMSx0aGlzLnJlYWRhYmxlTGlzdGVuaW5nPSExLHRoaXMucmVzdW1lU2NoZWR1bGVkPSExLHRoaXMuZGVmYXVsdEVuY29kaW5nPXQuZGVmYXVsdEVuY29kaW5nfHwidXRmOCIsdGhpcy5yYW5PdXQ9ITEsdGhpcy5hd2FpdERyYWluPTAsdGhpcy5yZWFkaW5nTW9yZT0hMSx0aGlzLmRlY29kZXI9bnVsbCx0aGlzLmVuY29kaW5nPW51bGwsdC5lbmNvZGluZyYmKHRoaXMuZGVjb2Rlcj1uZXcgYWUodC5lbmNvZGluZyksdGhpcy5lbmNvZGluZz10LmVuY29kaW5nKX1mdW5jdGlvbiBwZSh0KXtpZighKHRoaXMgaW5zdGFuY2VvZiBwZSkpcmV0dXJuIG5ldyBwZSh0KTt0aGlzLl9yZWFkYWJsZVN0YXRlPW5ldyBsZSh0LHRoaXMpLHRoaXMucmVhZGFibGU9ITAsdCYmImZ1bmN0aW9uIj09dHlwZW9mIHQucmVhZCYmKHRoaXMuX3JlYWQ9dC5yZWFkKSxlLmNhbGwodGhpcyl9ZnVuY3Rpb24gZGUodCxlLHIsbixpKXt2YXIgbz1mdW5jdGlvbih0LGUpe3ZhciByPW51bGw7QS5pc0J1ZmZlcihlKXx8InN0cmluZyI9PXR5cGVvZiBlfHxudWxsPT1lfHx0Lm9iamVjdE1vZGV8fChyPW5ldyBUeXBlRXJyb3IoIkludmFsaWQgbm9uLXN0cmluZy9idWZmZXIgY2h1bmsiKSk7cmV0dXJuIHJ9KGUscik7aWYobyl0LmVtaXQoImVycm9yIixvKTtlbHNlIGlmKG51bGw9PT1yKWUucmVhZGluZz0hMSxmdW5jdGlvbih0LGUpe2lmKGUuZW5kZWQpcmV0dXJuO2lmKGUuZGVjb2Rlcil7dmFyIHI9ZS5kZWNvZGVyLmVuZCgpO3ImJnIubGVuZ3RoJiYoZS5idWZmZXIucHVzaChyKSxlLmxlbmd0aCs9ZS5vYmplY3RNb2RlPzE6ci5sZW5ndGgpfWUuZW5kZWQ9ITAseWUodCl9KHQsZSk7ZWxzZSBpZihlLm9iamVjdE1vZGV8fHImJnIubGVuZ3RoPjApaWYoZS5lbmRlZCYmIWkpe3ZhciBzPW5ldyBFcnJvcigic3RyZWFtLnB1c2goKSBhZnRlciBFT0YiKTt0LmVtaXQoImVycm9yIixzKX1lbHNlIGlmKGUuZW5kRW1pdHRlZCYmaSl7dmFyIGE9bmV3IEVycm9yKCJzdHJlYW0udW5zaGlmdCgpIGFmdGVyIGVuZCBldmVudCIpO3QuZW1pdCgiZXJyb3IiLGEpfWVsc2V7dmFyIHU7IWUuZGVjb2Rlcnx8aXx8bnx8KHI9ZS5kZWNvZGVyLndyaXRlKHIpLHU9IWUub2JqZWN0TW9kZSYmMD09PXIubGVuZ3RoKSxpfHwoZS5yZWFkaW5nPSExKSx1fHwoZS5mbG93aW5nJiYwPT09ZS5sZW5ndGgmJiFlLnN5bmM/KHQuZW1pdCgiZGF0YSIsciksdC5yZWFkKDApKTooZS5sZW5ndGgrPWUub2JqZWN0TW9kZT8xOnIubGVuZ3RoLGk/ZS5idWZmZXIudW5zaGlmdChyKTplLmJ1ZmZlci5wdXNoKHIpLGUubmVlZFJlYWRhYmxlJiZ5ZSh0KSkpLGZ1bmN0aW9uKHQsZSl7ZS5yZWFkaW5nTW9yZXx8KGUucmVhZGluZ01vcmU9ITAsd3QoYmUsdCxlKSl9KHQsZSl9ZWxzZSBpfHwoZS5yZWFkaW5nPSExKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIXQuZW5kZWQmJih0Lm5lZWRSZWFkYWJsZXx8dC5sZW5ndGg8dC5oaWdoV2F0ZXJNYXJrfHwwPT09dC5sZW5ndGgpfShlKX14dChwZSxlKSxwZS5wcm90b3R5cGUucHVzaD1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuX3JlYWRhYmxlU3RhdGU7cmV0dXJuIHIub2JqZWN0TW9kZXx8InN0cmluZyIhPXR5cGVvZiB0fHwoZT1lfHxyLmRlZmF1bHRFbmNvZGluZykhPT1yLmVuY29kaW5nJiYodD1BLmZyb20odCxlKSxlPSIiKSxkZSh0aGlzLHIsdCxlLCExKX0scGUucHJvdG90eXBlLnVuc2hpZnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGRlKHRoaXMsdGhpcy5fcmVhZGFibGVTdGF0ZSx0LCIiLCEwKX0scGUucHJvdG90eXBlLmlzUGF1c2VkPWZ1bmN0aW9uKCl7cmV0dXJuITE9PT10aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmd9LHBlLnByb3RvdHlwZS5zZXRFbmNvZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5kZWNvZGVyPW5ldyBhZSh0KSx0aGlzLl9yZWFkYWJsZVN0YXRlLmVuY29kaW5nPXQsdGhpc307ZnVuY3Rpb24gZ2UodCxlKXtyZXR1cm4gdDw9MHx8MD09PWUubGVuZ3RoJiZlLmVuZGVkPzA6ZS5vYmplY3RNb2RlPzE6dCE9dD9lLmZsb3dpbmcmJmUubGVuZ3RoP2UuYnVmZmVyLmhlYWQuZGF0YS5sZW5ndGg6ZS5sZW5ndGg6KHQ+ZS5oaWdoV2F0ZXJNYXJrJiYoZS5oaWdoV2F0ZXJNYXJrPWZ1bmN0aW9uKHQpe3JldHVybiB0Pj04Mzg4NjA4P3Q9ODM4ODYwODoodC0tLHR8PXQ+Pj4xLHR8PXQ+Pj4yLHR8PXQ+Pj40LHR8PXQ+Pj44LHR8PXQ+Pj4xNix0KyspLHR9KHQpKSx0PD1lLmxlbmd0aD90OmUuZW5kZWQ/ZS5sZW5ndGg6KGUubmVlZFJlYWRhYmxlPSEwLDApKX1mdW5jdGlvbiB5ZSh0KXt2YXIgZT10Ll9yZWFkYWJsZVN0YXRlO2UubmVlZFJlYWRhYmxlPSExLGUuZW1pdHRlZFJlYWRhYmxlfHwoY2UoImVtaXRSZWFkYWJsZSIsZS5mbG93aW5nKSxlLmVtaXR0ZWRSZWFkYWJsZT0hMCxlLnN5bmM/d3QodmUsdCk6dmUodCkpfWZ1bmN0aW9uIHZlKHQpe2NlKCJlbWl0IHJlYWRhYmxlIiksdC5lbWl0KCJyZWFkYWJsZSIpLF9lKHQpfWZ1bmN0aW9uIGJlKHQsZSl7Zm9yKHZhciByPWUubGVuZ3RoOyFlLnJlYWRpbmcmJiFlLmZsb3dpbmcmJiFlLmVuZGVkJiZlLmxlbmd0aDxlLmhpZ2hXYXRlck1hcmsmJihjZSgibWF5YmVSZWFkTW9yZSByZWFkIDAiKSx0LnJlYWQoMCksciE9PWUubGVuZ3RoKTspcj1lLmxlbmd0aDtlLnJlYWRpbmdNb3JlPSExfWZ1bmN0aW9uIG1lKHQpe2NlKCJyZWFkYWJsZSBuZXh0dGljayByZWFkIDAiKSx0LnJlYWQoMCl9ZnVuY3Rpb24gd2UodCxlKXtlLnJlYWRpbmd8fChjZSgicmVzdW1lIHJlYWQgMCIpLHQucmVhZCgwKSksZS5yZXN1bWVTY2hlZHVsZWQ9ITEsZS5hd2FpdERyYWluPTAsdC5lbWl0KCJyZXN1bWUiKSxfZSh0KSxlLmZsb3dpbmcmJiFlLnJlYWRpbmcmJnQucmVhZCgwKX1mdW5jdGlvbiBfZSh0KXt2YXIgZT10Ll9yZWFkYWJsZVN0YXRlO2ZvcihjZSgiZmxvdyIsZS5mbG93aW5nKTtlLmZsb3dpbmcmJm51bGwhPT10LnJlYWQoKTspO31mdW5jdGlvbiBTZSh0LGUpe3JldHVybiAwPT09ZS5sZW5ndGg/bnVsbDooZS5vYmplY3RNb2RlP3I9ZS5idWZmZXIuc2hpZnQoKTohdHx8dD49ZS5sZW5ndGg/KHI9ZS5kZWNvZGVyP2UuYnVmZmVyLmpvaW4oIiIpOjE9PT1lLmJ1ZmZlci5sZW5ndGg/ZS5idWZmZXIuaGVhZC5kYXRhOmUuYnVmZmVyLmNvbmNhdChlLmxlbmd0aCksZS5idWZmZXIuY2xlYXIoKSk6cj1mdW5jdGlvbih0LGUscil7dmFyIG47dDxlLmhlYWQuZGF0YS5sZW5ndGg/KG49ZS5oZWFkLmRhdGEuc2xpY2UoMCx0KSxlLmhlYWQuZGF0YT1lLmhlYWQuZGF0YS5zbGljZSh0KSk6bj10PT09ZS5oZWFkLmRhdGEubGVuZ3RoP2Uuc2hpZnQoKTpyP2Z1bmN0aW9uKHQsZSl7dmFyIHI9ZS5oZWFkLG49MSxpPXIuZGF0YTt0LT1pLmxlbmd0aDtmb3IoO3I9ci5uZXh0Oyl7dmFyIG89ci5kYXRhLHM9dD5vLmxlbmd0aD9vLmxlbmd0aDp0O2lmKHM9PT1vLmxlbmd0aD9pKz1vOmkrPW8uc2xpY2UoMCx0KSwwPT09KHQtPXMpKXtzPT09by5sZW5ndGg/KCsrbixyLm5leHQ/ZS5oZWFkPXIubmV4dDplLmhlYWQ9ZS50YWlsPW51bGwpOihlLmhlYWQ9cixyLmRhdGE9by5zbGljZShzKSk7YnJlYWt9KytufXJldHVybiBlLmxlbmd0aC09bixpfSh0LGUpOmZ1bmN0aW9uKHQsZSl7dmFyIHI9QS5hbGxvY1Vuc2FmZSh0KSxuPWUuaGVhZCxpPTE7bi5kYXRhLmNvcHkociksdC09bi5kYXRhLmxlbmd0aDtmb3IoO249bi5uZXh0Oyl7dmFyIG89bi5kYXRhLHM9dD5vLmxlbmd0aD9vLmxlbmd0aDp0O2lmKG8uY29weShyLHIubGVuZ3RoLXQsMCxzKSwwPT09KHQtPXMpKXtzPT09by5sZW5ndGg/KCsraSxuLm5leHQ/ZS5oZWFkPW4ubmV4dDplLmhlYWQ9ZS50YWlsPW51bGwpOihlLmhlYWQ9bixuLmRhdGE9by5zbGljZShzKSk7YnJlYWt9KytpfXJldHVybiBlLmxlbmd0aC09aSxyfSh0LGUpO3JldHVybiBufSh0LGUuYnVmZmVyLGUuZGVjb2Rlcikscik7dmFyIHJ9ZnVuY3Rpb24gRWUodCl7dmFyIGU9dC5fcmVhZGFibGVTdGF0ZTtpZihlLmxlbmd0aD4wKXRocm93IG5ldyBFcnJvcignImVuZFJlYWRhYmxlKCkiIGNhbGxlZCBvbiBub24tZW1wdHkgc3RyZWFtJyk7ZS5lbmRFbWl0dGVkfHwoZS5lbmRlZD0hMCx3dChrZSxlLHQpKX1mdW5jdGlvbiBrZSh0LGUpe3QuZW5kRW1pdHRlZHx8MCE9PXQubGVuZ3RofHwodC5lbmRFbWl0dGVkPSEwLGUucmVhZGFibGU9ITEsZS5lbWl0KCJlbmQiKSl9ZnVuY3Rpb24gUmUodCxlKXtmb3IodmFyIHI9MCxuPXQubGVuZ3RoO3I8bjtyKyspaWYodFtyXT09PWUpcmV0dXJuIHI7cmV0dXJuLTF9ZnVuY3Rpb24gQWUoKXt9ZnVuY3Rpb24gVGUodCxlLHIpe3RoaXMuY2h1bms9dCx0aGlzLmVuY29kaW5nPWUsdGhpcy5jYWxsYmFjaz1yLHRoaXMubmV4dD1udWxsfWZ1bmN0aW9uIE9lKHQsZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImJ1ZmZlciIse2dldDpEdCgoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRCdWZmZXIoKX0pLCJfd3JpdGFibGVTdGF0ZS5idWZmZXIgaXMgZGVwcmVjYXRlZC4gVXNlIF93cml0YWJsZVN0YXRlLmdldEJ1ZmZlciBpbnN0ZWFkLiIpfSksdD10fHx7fSx0aGlzLm9iamVjdE1vZGU9ISF0Lm9iamVjdE1vZGUsZSBpbnN0YW5jZW9mIEZlJiYodGhpcy5vYmplY3RNb2RlPXRoaXMub2JqZWN0TW9kZXx8ISF0LndyaXRhYmxlT2JqZWN0TW9kZSk7dmFyIHI9dC5oaWdoV2F0ZXJNYXJrLG49dGhpcy5vYmplY3RNb2RlPzE2OjE2Mzg0O3RoaXMuaGlnaFdhdGVyTWFyaz1yfHwwPT09cj9yOm4sdGhpcy5oaWdoV2F0ZXJNYXJrPX5+dGhpcy5oaWdoV2F0ZXJNYXJrLHRoaXMubmVlZERyYWluPSExLHRoaXMuZW5kaW5nPSExLHRoaXMuZW5kZWQ9ITEsdGhpcy5maW5pc2hlZD0hMTt2YXIgaT0hMT09PXQuZGVjb2RlU3RyaW5nczt0aGlzLmRlY29kZVN0cmluZ3M9IWksdGhpcy5kZWZhdWx0RW5jb2Rpbmc9dC5kZWZhdWx0RW5jb2Rpbmd8fCJ1dGY4Iix0aGlzLmxlbmd0aD0wLHRoaXMud3JpdGluZz0hMSx0aGlzLmNvcmtlZD0wLHRoaXMuc3luYz0hMCx0aGlzLmJ1ZmZlclByb2Nlc3Npbmc9ITEsdGhpcy5vbndyaXRlPWZ1bmN0aW9uKHQpeyFmdW5jdGlvbih0LGUpe3ZhciByPXQuX3dyaXRhYmxlU3RhdGUsbj1yLnN5bmMsaT1yLndyaXRlY2I7aWYoZnVuY3Rpb24odCl7dC53cml0aW5nPSExLHQud3JpdGVjYj1udWxsLHQubGVuZ3RoLT10LndyaXRlbGVuLHQud3JpdGVsZW49MH0ociksZSkhZnVuY3Rpb24odCxlLHIsbixpKXstLWUucGVuZGluZ2NiLHI/d3QoaSxuKTppKG4pO3QuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkPSEwLHQuZW1pdCgiZXJyb3IiLG4pfSh0LHIsbixlLGkpO2Vsc2V7dmFyIG89TWUocik7b3x8ci5jb3JrZWR8fHIuYnVmZmVyUHJvY2Vzc2luZ3x8IXIuYnVmZmVyZWRSZXF1ZXN0fHxQZSh0LHIpLG4/d3QoQ2UsdCxyLG8saSk6Q2UodCxyLG8saSl9fShlLHQpfSx0aGlzLndyaXRlY2I9bnVsbCx0aGlzLndyaXRlbGVuPTAsdGhpcy5idWZmZXJlZFJlcXVlc3Q9bnVsbCx0aGlzLmxhc3RCdWZmZXJlZFJlcXVlc3Q9bnVsbCx0aGlzLnBlbmRpbmdjYj0wLHRoaXMucHJlZmluaXNoZWQ9ITEsdGhpcy5lcnJvckVtaXR0ZWQ9ITEsdGhpcy5idWZmZXJlZFJlcXVlc3RDb3VudD0wLHRoaXMuY29ya2VkUmVxdWVzdHNGcmVlPW5ldyBVZSh0aGlzKX1mdW5jdGlvbiBqZSh0KXtpZighKHRoaXMgaW5zdGFuY2VvZiBqZXx8dGhpcyBpbnN0YW5jZW9mIEZlKSlyZXR1cm4gbmV3IGplKHQpO3RoaXMuX3dyaXRhYmxlU3RhdGU9bmV3IE9lKHQsdGhpcyksdGhpcy53cml0YWJsZT0hMCx0JiYoImZ1bmN0aW9uIj09dHlwZW9mIHQud3JpdGUmJih0aGlzLl93cml0ZT10LndyaXRlKSwiZnVuY3Rpb24iPT10eXBlb2YgdC53cml0ZXYmJih0aGlzLl93cml0ZXY9dC53cml0ZXYpKSxlLmNhbGwodGhpcyl9ZnVuY3Rpb24gTGUodCxlLHIsbixpLG8scyl7ZS53cml0ZWxlbj1uLGUud3JpdGVjYj1zLGUud3JpdGluZz0hMCxlLnN5bmM9ITAscj90Ll93cml0ZXYoaSxlLm9ud3JpdGUpOnQuX3dyaXRlKGksbyxlLm9ud3JpdGUpLGUuc3luYz0hMX1mdW5jdGlvbiBDZSh0LGUscixuKXtyfHxmdW5jdGlvbih0LGUpezA9PT1lLmxlbmd0aCYmZS5uZWVkRHJhaW4mJihlLm5lZWREcmFpbj0hMSx0LmVtaXQoImRyYWluIikpfSh0LGUpLGUucGVuZGluZ2NiLS0sbigpLHhlKHQsZSl9ZnVuY3Rpb24gUGUodCxlKXtlLmJ1ZmZlclByb2Nlc3Npbmc9ITA7dmFyIHI9ZS5idWZmZXJlZFJlcXVlc3Q7aWYodC5fd3JpdGV2JiZyJiZyLm5leHQpe3ZhciBuPWUuYnVmZmVyZWRSZXF1ZXN0Q291bnQsaT1uZXcgQXJyYXkobiksbz1lLmNvcmtlZFJlcXVlc3RzRnJlZTtvLmVudHJ5PXI7Zm9yKHZhciBzPTA7cjspaVtzXT1yLHI9ci5uZXh0LHMrPTE7TGUodCxlLCEwLGUubGVuZ3RoLGksIiIsby5maW5pc2gpLGUucGVuZGluZ2NiKyssZS5sYXN0QnVmZmVyZWRSZXF1ZXN0PW51bGwsby5uZXh0PyhlLmNvcmtlZFJlcXVlc3RzRnJlZT1vLm5leHQsby5uZXh0PW51bGwpOmUuY29ya2VkUmVxdWVzdHNGcmVlPW5ldyBVZShlKX1lbHNle2Zvcig7cjspe3ZhciBhPXIuY2h1bmssdT1yLmVuY29kaW5nLGg9ci5jYWxsYmFjaztpZihMZSh0LGUsITEsZS5vYmplY3RNb2RlPzE6YS5sZW5ndGgsYSx1LGgpLHI9ci5uZXh0LGUud3JpdGluZylicmVha31udWxsPT09ciYmKGUubGFzdEJ1ZmZlcmVkUmVxdWVzdD1udWxsKX1lLmJ1ZmZlcmVkUmVxdWVzdENvdW50PTAsZS5idWZmZXJlZFJlcXVlc3Q9cixlLmJ1ZmZlclByb2Nlc3Npbmc9ITF9ZnVuY3Rpb24gTWUodCl7cmV0dXJuIHQuZW5kaW5nJiYwPT09dC5sZW5ndGgmJm51bGw9PT10LmJ1ZmZlcmVkUmVxdWVzdCYmIXQuZmluaXNoZWQmJiF0LndyaXRpbmd9ZnVuY3Rpb24gQmUodCxlKXtlLnByZWZpbmlzaGVkfHwoZS5wcmVmaW5pc2hlZD0hMCx0LmVtaXQoInByZWZpbmlzaCIpKX1mdW5jdGlvbiB4ZSh0LGUpe3ZhciByPU1lKGUpO3JldHVybiByJiYoMD09PWUucGVuZGluZ2NiPyhCZSh0LGUpLGUuZmluaXNoZWQ9ITAsdC5lbWl0KCJmaW5pc2giKSk6QmUodCxlKSkscn1mdW5jdGlvbiBVZSh0KXt2YXIgZT10aGlzO3RoaXMubmV4dD1udWxsLHRoaXMuZW50cnk9bnVsbCx0aGlzLmZpbmlzaD1mdW5jdGlvbihyKXt2YXIgbj1lLmVudHJ5O2ZvcihlLmVudHJ5PW51bGw7bjspe3ZhciBpPW4uY2FsbGJhY2s7dC5wZW5kaW5nY2ItLSxpKHIpLG49bi5uZXh0fXQuY29ya2VkUmVxdWVzdHNGcmVlP3QuY29ya2VkUmVxdWVzdHNGcmVlLm5leHQ9ZTp0LmNvcmtlZFJlcXVlc3RzRnJlZT1lfX1wZS5wcm90b3R5cGUucmVhZD1mdW5jdGlvbih0KXtjZSgicmVhZCIsdCksdD1wYXJzZUludCh0LDEwKTt2YXIgZT10aGlzLl9yZWFkYWJsZVN0YXRlLHI9dDtpZigwIT09dCYmKGUuZW1pdHRlZFJlYWRhYmxlPSExKSwwPT09dCYmZS5uZWVkUmVhZGFibGUmJihlLmxlbmd0aD49ZS5oaWdoV2F0ZXJNYXJrfHxlLmVuZGVkKSlyZXR1cm4gY2UoInJlYWQ6IGVtaXRSZWFkYWJsZSIsZS5sZW5ndGgsZS5lbmRlZCksMD09PWUubGVuZ3RoJiZlLmVuZGVkP0VlKHRoaXMpOnllKHRoaXMpLG51bGw7aWYoMD09PSh0PWdlKHQsZSkpJiZlLmVuZGVkKXJldHVybiAwPT09ZS5sZW5ndGgmJkVlKHRoaXMpLG51bGw7dmFyIG4saT1lLm5lZWRSZWFkYWJsZTtyZXR1cm4gY2UoIm5lZWQgcmVhZGFibGUiLGkpLCgwPT09ZS5sZW5ndGh8fGUubGVuZ3RoLXQ8ZS5oaWdoV2F0ZXJNYXJrKSYmY2UoImxlbmd0aCBsZXNzIHRoYW4gd2F0ZXJtYXJrIixpPSEwKSxlLmVuZGVkfHxlLnJlYWRpbmc/Y2UoInJlYWRpbmcgb3IgZW5kZWQiLGk9ITEpOmkmJihjZSgiZG8gcmVhZCIpLGUucmVhZGluZz0hMCxlLnN5bmM9ITAsMD09PWUubGVuZ3RoJiYoZS5uZWVkUmVhZGFibGU9ITApLHRoaXMuX3JlYWQoZS5oaWdoV2F0ZXJNYXJrKSxlLnN5bmM9ITEsZS5yZWFkaW5nfHwodD1nZShyLGUpKSksbnVsbD09PShuPXQ+MD9TZSh0LGUpOm51bGwpPyhlLm5lZWRSZWFkYWJsZT0hMCx0PTApOmUubGVuZ3RoLT10LDA9PT1lLmxlbmd0aCYmKGUuZW5kZWR8fChlLm5lZWRSZWFkYWJsZT0hMCksciE9PXQmJmUuZW5kZWQmJkVlKHRoaXMpKSxudWxsIT09biYmdGhpcy5lbWl0KCJkYXRhIixuKSxufSxwZS5wcm90b3R5cGUuX3JlYWQ9ZnVuY3Rpb24odCl7dGhpcy5lbWl0KCJlcnJvciIsbmV3IEVycm9yKCJub3QgaW1wbGVtZW50ZWQiKSl9LHBlLnByb3RvdHlwZS5waXBlPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcyxuPXRoaXMuX3JlYWRhYmxlU3RhdGU7c3dpdGNoKG4ucGlwZXNDb3VudCl7Y2FzZSAwOm4ucGlwZXM9dDticmVhaztjYXNlIDE6bi5waXBlcz1bbi5waXBlcyx0XTticmVhaztkZWZhdWx0Om4ucGlwZXMucHVzaCh0KX1uLnBpcGVzQ291bnQrPTEsY2UoInBpcGUgY291bnQ9JWQgb3B0cz0laiIsbi5waXBlc0NvdW50LGUpO3ZhciBpPSFlfHwhMSE9PWUuZW5kP3M6aDtmdW5jdGlvbiBvKHQpe2NlKCJvbnVucGlwZSIpLHQ9PT1yJiZoKCl9ZnVuY3Rpb24gcygpe2NlKCJvbmVuZCIpLHQuZW5kKCl9bi5lbmRFbWl0dGVkP3d0KGkpOnIub25jZSgiZW5kIixpKSx0Lm9uKCJ1bnBpcGUiLG8pO3ZhciBhPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXQuX3JlYWRhYmxlU3RhdGU7Y2UoInBpcGVPbkRyYWluIixlLmF3YWl0RHJhaW4pLGUuYXdhaXREcmFpbiYmZS5hd2FpdERyYWluLS0sMD09PWUuYXdhaXREcmFpbiYmdC5saXN0ZW5lcnMoImRhdGEiKS5sZW5ndGgmJihlLmZsb3dpbmc9ITAsX2UodCkpfX0ocik7dC5vbigiZHJhaW4iLGEpO3ZhciB1PSExO2Z1bmN0aW9uIGgoKXtjZSgiY2xlYW51cCIpLHQucmVtb3ZlTGlzdGVuZXIoImNsb3NlIixwKSx0LnJlbW92ZUxpc3RlbmVyKCJmaW5pc2giLGQpLHQucmVtb3ZlTGlzdGVuZXIoImRyYWluIixhKSx0LnJlbW92ZUxpc3RlbmVyKCJlcnJvciIsbCksdC5yZW1vdmVMaXN0ZW5lcigidW5waXBlIixvKSxyLnJlbW92ZUxpc3RlbmVyKCJlbmQiLHMpLHIucmVtb3ZlTGlzdGVuZXIoImVuZCIsaCksci5yZW1vdmVMaXN0ZW5lcigiZGF0YSIsYyksdT0hMCwhbi5hd2FpdERyYWlufHx0Ll93cml0YWJsZVN0YXRlJiYhdC5fd3JpdGFibGVTdGF0ZS5uZWVkRHJhaW58fGEoKX12YXIgZj0hMTtmdW5jdGlvbiBjKGUpe2NlKCJvbmRhdGEiKSxmPSExLCExIT09dC53cml0ZShlKXx8Znx8KCgxPT09bi5waXBlc0NvdW50JiZuLnBpcGVzPT09dHx8bi5waXBlc0NvdW50PjEmJi0xIT09UmUobi5waXBlcyx0KSkmJiF1JiYoY2UoImZhbHNlIHdyaXRlIHJlc3BvbnNlLCBwYXVzZSIsci5fcmVhZGFibGVTdGF0ZS5hd2FpdERyYWluKSxyLl9yZWFkYWJsZVN0YXRlLmF3YWl0RHJhaW4rKyxmPSEwKSxyLnBhdXNlKCkpfWZ1bmN0aW9uIGwoZSl7dmFyIHI7Y2UoIm9uZXJyb3IiLGUpLGcoKSx0LnJlbW92ZUxpc3RlbmVyKCJlcnJvciIsbCksMD09PShyPSJlcnJvciIsdC5saXN0ZW5lcnMocikubGVuZ3RoKSYmdC5lbWl0KCJlcnJvciIsZSl9ZnVuY3Rpb24gcCgpe3QucmVtb3ZlTGlzdGVuZXIoImZpbmlzaCIsZCksZygpfWZ1bmN0aW9uIGQoKXtjZSgib25maW5pc2giKSx0LnJlbW92ZUxpc3RlbmVyKCJjbG9zZSIscCksZygpfWZ1bmN0aW9uIGcoKXtjZSgidW5waXBlIiksci51bnBpcGUodCl9cmV0dXJuIHIub24oImRhdGEiLGMpLGZ1bmN0aW9uKHQsZSxyKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgdC5wcmVwZW5kTGlzdGVuZXIpcmV0dXJuIHQucHJlcGVuZExpc3RlbmVyKGUscik7dC5fZXZlbnRzJiZ0Ll9ldmVudHNbZV0/QXJyYXkuaXNBcnJheSh0Ll9ldmVudHNbZV0pP3QuX2V2ZW50c1tlXS51bnNoaWZ0KHIpOnQuX2V2ZW50c1tlXT1bcix0Ll9ldmVudHNbZV1dOnQub24oZSxyKX0odCwiZXJyb3IiLGwpLHQub25jZSgiY2xvc2UiLHApLHQub25jZSgiZmluaXNoIixkKSx0LmVtaXQoInBpcGUiLHIpLG4uZmxvd2luZ3x8KGNlKCJwaXBlIHJlc3VtZSIpLHIucmVzdW1lKCkpLHR9LHBlLnByb3RvdHlwZS51bnBpcGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fcmVhZGFibGVTdGF0ZTtpZigwPT09ZS5waXBlc0NvdW50KXJldHVybiB0aGlzO2lmKDE9PT1lLnBpcGVzQ291bnQpcmV0dXJuIHQmJnQhPT1lLnBpcGVzfHwodHx8KHQ9ZS5waXBlcyksZS5waXBlcz1udWxsLGUucGlwZXNDb3VudD0wLGUuZmxvd2luZz0hMSx0JiZ0LmVtaXQoInVucGlwZSIsdGhpcykpLHRoaXM7aWYoIXQpe3ZhciByPWUucGlwZXMsbj1lLnBpcGVzQ291bnQ7ZS5waXBlcz1udWxsLGUucGlwZXNDb3VudD0wLGUuZmxvd2luZz0hMTtmb3IodmFyIGk9MDtpPG47aSsrKXJbaV0uZW1pdCgidW5waXBlIix0aGlzKTtyZXR1cm4gdGhpc312YXIgbz1SZShlLnBpcGVzLHQpO3JldHVybi0xPT09b3x8KGUucGlwZXMuc3BsaWNlKG8sMSksZS5waXBlc0NvdW50LT0xLDE9PT1lLnBpcGVzQ291bnQmJihlLnBpcGVzPWUucGlwZXNbMF0pLHQuZW1pdCgidW5waXBlIix0aGlzKSksdGhpc30scGUucHJvdG90eXBlLm9uPWZ1bmN0aW9uKHQscil7dmFyIG49ZS5wcm90b3R5cGUub24uY2FsbCh0aGlzLHQscik7aWYoImRhdGEiPT09dCkhMSE9PXRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyYmdGhpcy5yZXN1bWUoKTtlbHNlIGlmKCJyZWFkYWJsZSI9PT10KXt2YXIgaT10aGlzLl9yZWFkYWJsZVN0YXRlO2kuZW5kRW1pdHRlZHx8aS5yZWFkYWJsZUxpc3RlbmluZ3x8KGkucmVhZGFibGVMaXN0ZW5pbmc9aS5uZWVkUmVhZGFibGU9ITAsaS5lbWl0dGVkUmVhZGFibGU9ITEsaS5yZWFkaW5nP2kubGVuZ3RoJiZ5ZSh0aGlzKTp3dChtZSx0aGlzKSl9cmV0dXJuIG59LHBlLnByb3RvdHlwZS5hZGRMaXN0ZW5lcj1wZS5wcm90b3R5cGUub24scGUucHJvdG90eXBlLnJlc3VtZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX3JlYWRhYmxlU3RhdGU7cmV0dXJuIHQuZmxvd2luZ3x8KGNlKCJyZXN1bWUiKSx0LmZsb3dpbmc9ITAsZnVuY3Rpb24odCxlKXtlLnJlc3VtZVNjaGVkdWxlZHx8KGUucmVzdW1lU2NoZWR1bGVkPSEwLHd0KHdlLHQsZSkpfSh0aGlzLHQpKSx0aGlzfSxwZS5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXtyZXR1cm4gY2UoImNhbGwgcGF1c2UgZmxvd2luZz0laiIsdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nKSwhMSE9PXRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyYmKGNlKCJwYXVzZSIpLHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZz0hMSx0aGlzLmVtaXQoInBhdXNlIikpLHRoaXN9LHBlLnByb3RvdHlwZS53cmFwPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3JlYWRhYmxlU3RhdGUscj0hMSxuPXRoaXM7Zm9yKHZhciBpIGluIHQub24oImVuZCIsKGZ1bmN0aW9uKCl7aWYoY2UoIndyYXBwZWQgZW5kIiksZS5kZWNvZGVyJiYhZS5lbmRlZCl7dmFyIHQ9ZS5kZWNvZGVyLmVuZCgpO3QmJnQubGVuZ3RoJiZuLnB1c2godCl9bi5wdXNoKG51bGwpfSkpLHQub24oImRhdGEiLChmdW5jdGlvbihpKXsoY2UoIndyYXBwZWQgZGF0YSIpLGUuZGVjb2RlciYmKGk9ZS5kZWNvZGVyLndyaXRlKGkpKSxlLm9iamVjdE1vZGUmJm51bGw9PWkpfHwoZS5vYmplY3RNb2RlfHxpJiZpLmxlbmd0aCkmJihuLnB1c2goaSl8fChyPSEwLHQucGF1c2UoKSkpfSkpLHQpdm9pZCAwPT09dGhpc1tpXSYmImZ1bmN0aW9uIj09dHlwZW9mIHRbaV0mJih0aGlzW2ldPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0W2VdLmFwcGx5KHQsYXJndW1lbnRzKX19KGkpKTtyZXR1cm4gZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9MCxuPXQubGVuZ3RoO3I8bjtyKyspZSh0W3JdLHIpfShbImVycm9yIiwiY2xvc2UiLCJkZXN0cm95IiwicGF1c2UiLCJyZXN1bWUiXSwoZnVuY3Rpb24oZSl7dC5vbihlLG4uZW1pdC5iaW5kKG4sZSkpfSkpLG4uX3JlYWQ9ZnVuY3Rpb24oZSl7Y2UoIndyYXBwZWQgX3JlYWQiLGUpLHImJihyPSExLHQucmVzdW1lKCkpfSxufSxwZS5fZnJvbUxpc3Q9U2UsamUuV3JpdGFibGVTdGF0ZT1PZSx4dChqZSxlKSxPZS5wcm90b3R5cGUuZ2V0QnVmZmVyPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuYnVmZmVyZWRSZXF1ZXN0LGU9W107dDspZS5wdXNoKHQpLHQ9dC5uZXh0O3JldHVybiBlfSxqZS5wcm90b3R5cGUucGlwZT1mdW5jdGlvbigpe3RoaXMuZW1pdCgiZXJyb3IiLG5ldyBFcnJvcigiQ2Fubm90IHBpcGUsIG5vdCByZWFkYWJsZSIpKX0samUucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj10aGlzLl93cml0YWJsZVN0YXRlLGk9ITE7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGUmJihyPWUsZT1udWxsKSxBLmlzQnVmZmVyKHQpP2U9ImJ1ZmZlciI6ZXx8KGU9bi5kZWZhdWx0RW5jb2RpbmcpLCJmdW5jdGlvbiIhPXR5cGVvZiByJiYocj1BZSksbi5lbmRlZD9mdW5jdGlvbih0LGUpe3ZhciByPW5ldyBFcnJvcigid3JpdGUgYWZ0ZXIgZW5kIik7dC5lbWl0KCJlcnJvciIsciksd3QoZSxyKX0odGhpcyxyKTpmdW5jdGlvbih0LGUscixuKXt2YXIgaT0hMCxvPSExO3JldHVybiBudWxsPT09cj9vPW5ldyBUeXBlRXJyb3IoIk1heSBub3Qgd3JpdGUgbnVsbCB2YWx1ZXMgdG8gc3RyZWFtIik6QS5pc0J1ZmZlcihyKXx8InN0cmluZyI9PXR5cGVvZiByfHx2b2lkIDA9PT1yfHxlLm9iamVjdE1vZGV8fChvPW5ldyBUeXBlRXJyb3IoIkludmFsaWQgbm9uLXN0cmluZy9idWZmZXIgY2h1bmsiKSksbyYmKHQuZW1pdCgiZXJyb3IiLG8pLHd0KG4sbyksaT0hMSksaX0odGhpcyxuLHQscikmJihuLnBlbmRpbmdjYisrLGk9ZnVuY3Rpb24odCxlLHIsbixpKXtyPWZ1bmN0aW9uKHQsZSxyKXt0Lm9iamVjdE1vZGV8fCExPT09dC5kZWNvZGVTdHJpbmdzfHwic3RyaW5nIiE9dHlwZW9mIGV8fChlPUEuZnJvbShlLHIpKTtyZXR1cm4gZX0oZSxyLG4pLEEuaXNCdWZmZXIocikmJihuPSJidWZmZXIiKTt2YXIgbz1lLm9iamVjdE1vZGU/MTpyLmxlbmd0aDtlLmxlbmd0aCs9bzt2YXIgcz1lLmxlbmd0aDxlLmhpZ2hXYXRlck1hcms7c3x8KGUubmVlZERyYWluPSEwKTtpZihlLndyaXRpbmd8fGUuY29ya2VkKXt2YXIgYT1lLmxhc3RCdWZmZXJlZFJlcXVlc3Q7ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0PW5ldyBUZShyLG4saSksYT9hLm5leHQ9ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0OmUuYnVmZmVyZWRSZXF1ZXN0PWUubGFzdEJ1ZmZlcmVkUmVxdWVzdCxlLmJ1ZmZlcmVkUmVxdWVzdENvdW50Kz0xfWVsc2UgTGUodCxlLCExLG8scixuLGkpO3JldHVybiBzfSh0aGlzLG4sdCxlLHIpKSxpfSxqZS5wcm90b3R5cGUuY29yaz1mdW5jdGlvbigpe3RoaXMuX3dyaXRhYmxlU3RhdGUuY29ya2VkKyt9LGplLnByb3RvdHlwZS51bmNvcms9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl93cml0YWJsZVN0YXRlO3QuY29ya2VkJiYodC5jb3JrZWQtLSx0LndyaXRpbmd8fHQuY29ya2VkfHx0LmZpbmlzaGVkfHx0LmJ1ZmZlclByb2Nlc3Npbmd8fCF0LmJ1ZmZlcmVkUmVxdWVzdHx8UGUodGhpcyx0KSl9LGplLnByb3RvdHlwZS5zZXREZWZhdWx0RW5jb2Rpbmc9ZnVuY3Rpb24odCl7aWYoInN0cmluZyI9PXR5cGVvZiB0JiYodD10LnRvTG93ZXJDYXNlKCkpLCEoWyJoZXgiLCJ1dGY4IiwidXRmLTgiLCJhc2NpaSIsImJpbmFyeSIsImJhc2U2NCIsInVjczIiLCJ1Y3MtMiIsInV0ZjE2bGUiLCJ1dGYtMTZsZSIsInJhdyJdLmluZGV4T2YoKHQrIiIpLnRvTG93ZXJDYXNlKCkpPi0xKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK3QpO3JldHVybiB0aGlzLl93cml0YWJsZVN0YXRlLmRlZmF1bHRFbmNvZGluZz10LHRoaXN9LGplLnByb3RvdHlwZS5fd3JpdGU9ZnVuY3Rpb24odCxlLHIpe3IobmV3IEVycm9yKCJub3QgaW1wbGVtZW50ZWQiKSl9LGplLnByb3RvdHlwZS5fd3JpdGV2PW51bGwsamUucHJvdG90eXBlLmVuZD1mdW5jdGlvbih0LGUscil7dmFyIG49dGhpcy5fd3JpdGFibGVTdGF0ZTsiZnVuY3Rpb24iPT10eXBlb2YgdD8ocj10LHQ9bnVsbCxlPW51bGwpOiJmdW5jdGlvbiI9PXR5cGVvZiBlJiYocj1lLGU9bnVsbCksbnVsbCE9dCYmdGhpcy53cml0ZSh0LGUpLG4uY29ya2VkJiYobi5jb3JrZWQ9MSx0aGlzLnVuY29yaygpKSxuLmVuZGluZ3x8bi5maW5pc2hlZHx8ZnVuY3Rpb24odCxlLHIpe2UuZW5kaW5nPSEwLHhlKHQsZSksciYmKGUuZmluaXNoZWQ/d3Qocik6dC5vbmNlKCJmaW5pc2giLHIpKTtlLmVuZGVkPSEwLHQud3JpdGFibGU9ITF9KHRoaXMsbixyKX0seHQoRmUscGUpO2Zvcih2YXIgSWU9T2JqZWN0LmtleXMoamUucHJvdG90eXBlKSxEZT0wO0RlPEllLmxlbmd0aDtEZSsrKXt2YXIgTmU9SWVbRGVdO0ZlLnByb3RvdHlwZVtOZV18fChGZS5wcm90b3R5cGVbTmVdPWplLnByb3RvdHlwZVtOZV0pfWZ1bmN0aW9uIEZlKHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIEZlKSlyZXR1cm4gbmV3IEZlKHQpO3BlLmNhbGwodGhpcyx0KSxqZS5jYWxsKHRoaXMsdCksdCYmITE9PT10LnJlYWRhYmxlJiYodGhpcy5yZWFkYWJsZT0hMSksdCYmITE9PT10LndyaXRhYmxlJiYodGhpcy53cml0YWJsZT0hMSksdGhpcy5hbGxvd0hhbGZPcGVuPSEwLHQmJiExPT09dC5hbGxvd0hhbGZPcGVuJiYodGhpcy5hbGxvd0hhbGZPcGVuPSExKSx0aGlzLm9uY2UoImVuZCIsemUpfWZ1bmN0aW9uIHplKCl7dGhpcy5hbGxvd0hhbGZPcGVufHx0aGlzLl93cml0YWJsZVN0YXRlLmVuZGVkfHx3dChxZSx0aGlzKX1mdW5jdGlvbiBxZSh0KXt0LmVuZCgpfWZ1bmN0aW9uIFllKHQpe3RoaXMuYWZ0ZXJUcmFuc2Zvcm09ZnVuY3Rpb24oZSxyKXtyZXR1cm4gZnVuY3Rpb24odCxlLHIpe3ZhciBuPXQuX3RyYW5zZm9ybVN0YXRlO24udHJhbnNmb3JtaW5nPSExO3ZhciBpPW4ud3JpdGVjYjtpZighaSlyZXR1cm4gdC5lbWl0KCJlcnJvciIsbmV3IEVycm9yKCJubyB3cml0ZWNiIGluIFRyYW5zZm9ybSBjbGFzcyIpKTtuLndyaXRlY2h1bms9bnVsbCxuLndyaXRlY2I9bnVsbCxudWxsIT1yJiZ0LnB1c2gocik7aShlKTt2YXIgbz10Ll9yZWFkYWJsZVN0YXRlO28ucmVhZGluZz0hMSwoby5uZWVkUmVhZGFibGV8fG8ubGVuZ3RoPG8uaGlnaFdhdGVyTWFyaykmJnQuX3JlYWQoby5oaWdoV2F0ZXJNYXJrKX0odCxlLHIpfSx0aGlzLm5lZWRUcmFuc2Zvcm09ITEsdGhpcy50cmFuc2Zvcm1pbmc9ITEsdGhpcy53cml0ZWNiPW51bGwsdGhpcy53cml0ZWNodW5rPW51bGwsdGhpcy53cml0ZWVuY29kaW5nPW51bGx9ZnVuY3Rpb24gV2UodCl7aWYoISh0aGlzIGluc3RhbmNlb2YgV2UpKXJldHVybiBuZXcgV2UodCk7RmUuY2FsbCh0aGlzLHQpLHRoaXMuX3RyYW5zZm9ybVN0YXRlPW5ldyBZZSh0aGlzKTt2YXIgZT10aGlzO3RoaXMuX3JlYWRhYmxlU3RhdGUubmVlZFJlYWRhYmxlPSEwLHRoaXMuX3JlYWRhYmxlU3RhdGUuc3luYz0hMSx0JiYoImZ1bmN0aW9uIj09dHlwZW9mIHQudHJhbnNmb3JtJiYodGhpcy5fdHJhbnNmb3JtPXQudHJhbnNmb3JtKSwiZnVuY3Rpb24iPT10eXBlb2YgdC5mbHVzaCYmKHRoaXMuX2ZsdXNoPXQuZmx1c2gpKSx0aGlzLm9uY2UoInByZWZpbmlzaCIsKGZ1bmN0aW9uKCl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuX2ZsdXNoP3RoaXMuX2ZsdXNoKChmdW5jdGlvbih0KXskZShlLHQpfSkpOiRlKGUpfSkpfWZ1bmN0aW9uICRlKHQsZSl7aWYoZSlyZXR1cm4gdC5lbWl0KCJlcnJvciIsZSk7dmFyIHI9dC5fd3JpdGFibGVTdGF0ZSxuPXQuX3RyYW5zZm9ybVN0YXRlO2lmKHIubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiQ2FsbGluZyB0cmFuc2Zvcm0gZG9uZSB3aGVuIHdzLmxlbmd0aCAhPSAwIik7aWYobi50cmFuc2Zvcm1pbmcpdGhyb3cgbmV3IEVycm9yKCJDYWxsaW5nIHRyYW5zZm9ybSBkb25lIHdoZW4gc3RpbGwgdHJhbnNmb3JtaW5nIik7cmV0dXJuIHQucHVzaChudWxsKX1mdW5jdGlvbiBHZSh0KXtpZighKHRoaXMgaW5zdGFuY2VvZiBHZSkpcmV0dXJuIG5ldyBHZSh0KTtXZS5jYWxsKHRoaXMsdCl9ZnVuY3Rpb24gSmUoKXtlLmNhbGwodGhpcyl9eHQoV2UsRmUpLFdlLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX3RyYW5zZm9ybVN0YXRlLm5lZWRUcmFuc2Zvcm09ITEsRmUucHJvdG90eXBlLnB1c2guY2FsbCh0aGlzLHQsZSl9LFdlLnByb3RvdHlwZS5fdHJhbnNmb3JtPWZ1bmN0aW9uKHQsZSxyKXt0aHJvdyBuZXcgRXJyb3IoIk5vdCBpbXBsZW1lbnRlZCIpfSxXZS5wcm90b3R5cGUuX3dyaXRlPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj10aGlzLl90cmFuc2Zvcm1TdGF0ZTtpZihuLndyaXRlY2I9cixuLndyaXRlY2h1bms9dCxuLndyaXRlZW5jb2Rpbmc9ZSwhbi50cmFuc2Zvcm1pbmcpe3ZhciBpPXRoaXMuX3JlYWRhYmxlU3RhdGU7KG4ubmVlZFRyYW5zZm9ybXx8aS5uZWVkUmVhZGFibGV8fGkubGVuZ3RoPGkuaGlnaFdhdGVyTWFyaykmJnRoaXMuX3JlYWQoaS5oaWdoV2F0ZXJNYXJrKX19LFdlLnByb3RvdHlwZS5fcmVhZD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl90cmFuc2Zvcm1TdGF0ZTtudWxsIT09ZS53cml0ZWNodW5rJiZlLndyaXRlY2ImJiFlLnRyYW5zZm9ybWluZz8oZS50cmFuc2Zvcm1pbmc9ITAsdGhpcy5fdHJhbnNmb3JtKGUud3JpdGVjaHVuayxlLndyaXRlZW5jb2RpbmcsZS5hZnRlclRyYW5zZm9ybSkpOmUubmVlZFRyYW5zZm9ybT0hMH0seHQoR2UsV2UpLEdlLnByb3RvdHlwZS5fdHJhbnNmb3JtPWZ1bmN0aW9uKHQsZSxyKXtyKG51bGwsdCl9LHh0KEplLGUpLEplLlJlYWRhYmxlPXBlLEplLldyaXRhYmxlPWplLEplLkR1cGxleD1GZSxKZS5UcmFuc2Zvcm09V2UsSmUuUGFzc1Rocm91Z2g9R2UsSmUuU3RyZWFtPUplLEplLnByb3RvdHlwZS5waXBlPWZ1bmN0aW9uKHQscil7dmFyIG49dGhpcztmdW5jdGlvbiBpKGUpe3Qud3JpdGFibGUmJiExPT09dC53cml0ZShlKSYmbi5wYXVzZSYmbi5wYXVzZSgpfWZ1bmN0aW9uIG8oKXtuLnJlYWRhYmxlJiZuLnJlc3VtZSYmbi5yZXN1bWUoKX1uLm9uKCJkYXRhIixpKSx0Lm9uKCJkcmFpbiIsbyksdC5faXNTdGRpb3x8ciYmITE9PT1yLmVuZHx8KG4ub24oImVuZCIsYSksbi5vbigiY2xvc2UiLHUpKTt2YXIgcz0hMTtmdW5jdGlvbiBhKCl7c3x8KHM9ITAsdC5lbmQoKSl9ZnVuY3Rpb24gdSgpe3N8fChzPSEwLCJmdW5jdGlvbiI9PXR5cGVvZiB0LmRlc3Ryb3kmJnQuZGVzdHJveSgpKX1mdW5jdGlvbiBoKHQpe2lmKGYoKSwwPT09ZS5saXN0ZW5lckNvdW50KHRoaXMsImVycm9yIikpdGhyb3cgdH1mdW5jdGlvbiBmKCl7bi5yZW1vdmVMaXN0ZW5lcigiZGF0YSIsaSksdC5yZW1vdmVMaXN0ZW5lcigiZHJhaW4iLG8pLG4ucmVtb3ZlTGlzdGVuZXIoImVuZCIsYSksbi5yZW1vdmVMaXN0ZW5lcigiY2xvc2UiLHUpLG4ucmVtb3ZlTGlzdGVuZXIoImVycm9yIixoKSx0LnJlbW92ZUxpc3RlbmVyKCJlcnJvciIsaCksbi5yZW1vdmVMaXN0ZW5lcigiZW5kIixmKSxuLnJlbW92ZUxpc3RlbmVyKCJjbG9zZSIsZiksdC5yZW1vdmVMaXN0ZW5lcigiY2xvc2UiLGYpfXJldHVybiBuLm9uKCJlcnJvciIsaCksdC5vbigiZXJyb3IiLGgpLG4ub24oImVuZCIsZiksbi5vbigiY2xvc2UiLGYpLHQub24oImNsb3NlIixmKSx0LmVtaXQoInBpcGUiLG4pLHR9O3ZhciBIZT0idW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbFRoaXM/Z2xvYmFsVGhpczoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWw/Z2xvYmFsOiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOnt9O3ZhciBWZSxLZSxaZT0oVmU9ZnVuY3Rpb24odCl7ImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5jcmVhdGU/dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7ZSYmKHQuc3VwZXJfPWUsdC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSkpfTp0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtpZihlKXt0LnN1cGVyXz1lO3ZhciByPWZ1bmN0aW9uKCl7fTtyLnByb3RvdHlwZT1lLnByb3RvdHlwZSx0LnByb3RvdHlwZT1uZXcgcix0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj10fX19LFZlKEtlPXtleHBvcnRzOnt9fSxLZS5leHBvcnRzKSxLZS5leHBvcnRzKTtsZXQgUWU9dHIoKTtmdW5jdGlvbiBYZSh0LGUpeygib2JqZWN0IiE9dHlwZW9mIHR8fEFycmF5LmlzQXJyYXkodCkpJiYoZT10LHQ9e30pO2xldCByPW5ldyBRZSh0KTt2YXIgbjtyZXR1cm4gci5fZnJvbT1BcnJheS5pc0FycmF5KGUpPyhuPShuPWUpLnNsaWNlKCksZnVuY3Rpb24odCxlKXtsZXQgcj1udWxsLGk9bi5sZW5ndGg/bi5zaGlmdCgpOm51bGw7aSBpbnN0YW5jZW9mIEVycm9yJiYocj1pLGk9bnVsbCksZShyLGkpfSk6ZXx8ZXIscn1mdW5jdGlvbiB0cih0LGUpe2Z1bmN0aW9uIHIoZSl7aWYoISh0aGlzIGluc3RhbmNlb2YgcikpcmV0dXJuIG5ldyByKGUpO3RoaXMuX3JlYWRpbmc9ITEsdGhpcy5fY2FsbGJhY2s9ZnVuY3Rpb24odCxlKXtpZihuLmRlc3Ryb3llZClyZXR1cm47aWYodClyZXR1cm4gbi5kZXN0cm95KHQpO2lmKG51bGw9PT1lKXJldHVybiBuLnB1c2gobnVsbCk7bi5fcmVhZGluZz0hMSxuLnB1c2goZSkmJm4uX3JlYWQoaSl9LHRoaXMuZGVzdHJveWVkPSExLHBlLmNhbGwodGhpcyxlfHx0KTtsZXQgbj10aGlzLGk9dGhpcy5fcmVhZGFibGVTdGF0ZS5oaWdoV2F0ZXJNYXJrfXJldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0JiYoZT10LHQ9e30pLHQ9cnIodCksWmUocixwZSksci5wcm90b3R5cGUuX2Zyb209ZXx8ZXIsci5wcm90b3R5cGUuX3JlYWQ9ZnVuY3Rpb24odCl7dGhpcy5fcmVhZGluZ3x8dGhpcy5kZXN0cm95ZWR8fCh0aGlzLl9yZWFkaW5nPSEwLHRoaXMuX2Zyb20odCx0aGlzLl9jYWxsYmFjaykpfSxyLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKHQpe2lmKHRoaXMuZGVzdHJveWVkKXJldHVybjt0aGlzLmRlc3Ryb3llZD0hMDtsZXQgZT10aGlzO3Byb2Nlc3MubmV4dFRpY2soKGZ1bmN0aW9uKCl7dCYmZS5lbWl0KCJlcnJvciIsdCksZS5lbWl0KCJjbG9zZSIpfSkpfSxyfWZ1bmN0aW9uIGVyKCl7fWZ1bmN0aW9uIHJyKHQpe3JldHVybiB0PXR8fHt9fVhlLmN0b3I9dHIsWGUub2JqPWZ1bmN0aW9uKHQsZSl7cmV0dXJuKCJmdW5jdGlvbiI9PXR5cGVvZiB0fHxBcnJheS5pc0FycmF5KHQpKSYmKGU9dCx0PXt9KSwodD1ycih0KSkub2JqZWN0TW9kZT0hMCx0LmhpZ2hXYXRlck1hcms9MTYsWGUodCxlKX07dmFyIG5yLGlyPTEsb3I9e30sc3I9ITEsYXI9bC5kb2N1bWVudDtmdW5jdGlvbiB1cih0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9bmV3IEZ1bmN0aW9uKCIiK3QpKTtmb3IodmFyIGU9bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgtMSkscj0wO3I8ZS5sZW5ndGg7cisrKWVbcl09YXJndW1lbnRzW3IrMV07dmFyIG49e2NhbGxiYWNrOnQsYXJnczplfTtyZXR1cm4gb3JbaXJdPW4sbnIoaXIpLGlyKyt9ZnVuY3Rpb24gaHIodCl7aWYoc3Ipc2V0VGltZW91dChociwwLHQpO2Vsc2V7dmFyIGU9b3JbdF07aWYoZSl7c3I9ITA7dHJ5eyFmdW5jdGlvbih0KXt2YXIgZT10LmNhbGxiYWNrLHI9dC5hcmdzO3N3aXRjaChyLmxlbmd0aCl7Y2FzZSAwOmUoKTticmVhaztjYXNlIDE6ZShyWzBdKTticmVhaztjYXNlIDI6ZShyWzBdLHJbMV0pO2JyZWFrO2Nhc2UgMzplKHJbMF0sclsxXSxyWzJdKTticmVhaztkZWZhdWx0OmUuYXBwbHkodm9pZCAwLHIpfX0oZSl9ZmluYWxseXshZnVuY3Rpb24odCl7ZGVsZXRlIG9yW3RdfSh0KSxzcj0hMX19fX12YXIgZnIsY3IsbHIscHIsZHI9T2JqZWN0LmdldFByb3RvdHlwZU9mJiZPYmplY3QuZ2V0UHJvdG90eXBlT2YobCk7ZnVuY3Rpb24gZ3IodCl7bGV0IGUscj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCk7aWYoZT0iW29iamVjdCBQcm9taXNlXSI9PT1yLGUpcmV0dXJuITA7aWYoIltvYmplY3QgRnVuY3Rpb25dIiE9PXIpcmV0dXJuITE7dHJ5e2U9ImZ1bmN0aW9uIiE9dHlwZW9mIHQuc3Vic2NyaWJlJiYiZnVuY3Rpb24iPT10eXBlb2YgdC50aGVufWNhdGNoKHQpe31yZXR1cm4gZX1mdW5jdGlvbiB5cih0KXtsZXQgZSxyLG47ZnVuY3Rpb24gaShpKXsoKHQ9aSlpbnN0YW5jZW9mIEFycmF5QnVmZmVyfHxBcnJheUJ1ZmZlci5pc1ZpZXcodCkmJiFBLmlzQnVmZmVyKHQpKSYmKHQ9QS5mcm9tKHQpKSxlPWdyKHQpP3Q6bnVsbDtjb25zdCBvPSFlJiZ0W1N5bWJvbC5pdGVyYXRvcl0mJiJzdHJpbmciIT10eXBlb2YgdCYmIUEuaXNCdWZmZXIodCk7cj1vP3RbU3ltYm9sLml0ZXJhdG9yXSgpOm51bGw7Y29uc3Qgcz0hZSYmdFtTeW1ib2wuYXN5bmNJdGVyYXRvcl07bj1zP3RbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk6bnVsbH1yZXR1cm4gQXJyYXkuaXNBcnJheSh0KSYmKHQ9dC5zbGljZSgpKSxpKHQpLFhlKChmdW5jdGlvbiBvKHMsYSl7aWYoZSlyZXR1cm4gdm9pZChhc3luYygpPT57dHJ5e2F3YWl0IGkoYXdhaXQgZSksby5jYWxsKHRoaXMscyxhKX1jYXRjaCh0KXthKHQpfX0pKCk7aWYocil7Y29uc3QgdD1yLm5leHQoKTtyZXR1cm4gdm9pZCB1cihhLG51bGwsdC5kb25lP251bGw6dC52YWx1ZSl9aWYobilyZXR1cm4gdm9pZChhc3luYygpPT57dHJ5e2NvbnN0IHQ9YXdhaXQgbi5uZXh0KCk7dXIoYSxudWxsLHQuZG9uZT9udWxsOnQudmFsdWUpfWNhdGNoKHQpe3VyKGEsdCl9fSkoKTtpZigwPT09dC5sZW5ndGgpcmV0dXJuIHZvaWQgdXIoYSxudWxsLG51bGwpO2NvbnN0IHU9dC5zbGljZSgwLHMpO3Q9dC5zbGljZShzKSx1cihhLG51bGwsdSl9KSl9ZHI9ZHImJmRyLnNldFRpbWVvdXQ/ZHI6bCwiW29iamVjdCBwcm9jZXNzXSI9PT17fS50b1N0cmluZy5jYWxsKGwucHJvY2Vzcyk/bnI9ZnVuY3Rpb24odCl7QnQubmV4dFRpY2soKGZ1bmN0aW9uKCl7aHIodCl9KSl9OiFmdW5jdGlvbigpe2lmKGwucG9zdE1lc3NhZ2UmJiFsLmltcG9ydFNjcmlwdHMpe3ZhciB0PSEwLGU9bC5vbm1lc3NhZ2U7cmV0dXJuIGwub25tZXNzYWdlPWZ1bmN0aW9uKCl7dD0hMX0sbC5wb3N0TWVzc2FnZSgiIiwiKiIpLGwub25tZXNzYWdlPWUsdH19KCk/bC5NZXNzYWdlQ2hhbm5lbD8oKGNyPW5ldyBNZXNzYWdlQ2hhbm5lbCkucG9ydDEub25tZXNzYWdlPWZ1bmN0aW9uKHQpe2hyKHQuZGF0YSl9LG5yPWZ1bmN0aW9uKHQpe2NyLnBvcnQyLnBvc3RNZXNzYWdlKHQpfSk6YXImJiJvbnJlYWR5c3RhdGVjaGFuZ2UiaW4gYXIuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik/KGZyPWFyLmRvY3VtZW50RWxlbWVudCxucj1mdW5jdGlvbih0KXt2YXIgZT1hci5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtlLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe2hyKHQpLGUub25yZWFkeXN0YXRlY2hhbmdlPW51bGwsZnIucmVtb3ZlQ2hpbGQoZSksZT1udWxsfSxmci5hcHBlbmRDaGlsZChlKX0pOm5yPWZ1bmN0aW9uKHQpe3NldFRpbWVvdXQoaHIsMCx0KX06KGxyPSJzZXRJbW1lZGlhdGUkIitNYXRoLnJhbmRvbSgpKyIkIixwcj1mdW5jdGlvbih0KXt0LnNvdXJjZT09PWwmJiJzdHJpbmciPT10eXBlb2YgdC5kYXRhJiYwPT09dC5kYXRhLmluZGV4T2YobHIpJiZocigrdC5kYXRhLnNsaWNlKGxyLmxlbmd0aCkpfSxsLmFkZEV2ZW50TGlzdGVuZXI/bC5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixwciwhMSk6bC5hdHRhY2hFdmVudCgib25tZXNzYWdlIixwciksbnI9ZnVuY3Rpb24odCl7bC5wb3N0TWVzc2FnZShscit0LCIqIil9KSx5ci5vYmplY3Q9dD0+e2xldCBlLHIsbjtmdW5jdGlvbiBpKGkpe2U9Z3IodD1pKT90Om51bGwscj0hZSYmdFtTeW1ib2wuaXRlcmF0b3JdP3RbU3ltYm9sLml0ZXJhdG9yXSgpOm51bGwsbj0hZSYmdFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0/dFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTpudWxsfXJldHVybiBBcnJheS5pc0FycmF5KHQpJiYodD10LnNsaWNlKCkpLGkodCksWGUub2JqKChmdW5jdGlvbiBvKHMsYSl7aWYoZSkoYXN5bmMoKT0+e3RyeXthd2FpdCBpKGF3YWl0IGUpLG8uY2FsbCh0aGlzLHMsYSl9Y2F0Y2godCl7YSh0KX19KSgpO2Vsc2UgaWYocil7Y29uc3QgdD1yLm5leHQoKTt1cihhLG51bGwsdC5kb25lP251bGw6dC52YWx1ZSl9ZWxzZSBuPyhhc3luYygpPT57dHJ5e2NvbnN0IHQ9YXdhaXQgbi5uZXh0KCk7dXIoYSxudWxsLHQuZG9uZT9udWxsOnQudmFsdWUpfWNhdGNoKHQpe3VyKGEsdCl9fSkoKToodGhpcy5wdXNoKHQpLHVyKGEsbnVsbCxudWxsKSl9KSl9O3ZhciB2cj17fSxicj12ci5MRUZUX0JSQUNFPTEsbXI9dnIuUklHSFRfQlJBQ0U9Mix3cj12ci5MRUZUX0JSQUNLRVQ9Myxfcj12ci5SSUdIVF9CUkFDS0VUPTQsU3I9dnIuQ09MT049NSxFcj12ci5DT01NQT02LGtyPXZyLlRSVUU9NyxScj12ci5GQUxTRT04LEFyPXZyLk5VTEw9OSxUcj12ci5TVFJJTkc9MTAsT3I9dnIuTlVNQkVSPTExLGpyPXZyLlNUQVJUPTE3LExyPXZyLlNUT1A9MTgsQ3I9dnIuVFJVRTE9MzMsUHI9dnIuVFJVRTI9MzQsTXI9dnIuVFJVRTM9MzUsQnI9dnIuRkFMU0UxPTQ5LHhyPXZyLkZBTFNFMj01MCxVcj12ci5GQUxTRTM9NTEsSXI9dnIuRkFMU0U0PTUyLERyPXZyLk5VTEwxPTY1LE5yPXZyLk5VTEwyPTY2LEZyPXZyLk5VTEwzPTY3LHpyPXZyLk5VTUJFUjE9ODEscXI9dnIuTlVNQkVSMz04MyxZcj12ci5TVFJJTkcxPTk3LFdyPXZyLlNUUklORzI9OTgsJHI9dnIuU1RSSU5HMz05OSxHcj12ci5TVFJJTkc0PTEwMCxKcj12ci5TVFJJTkc1PTEwMSxIcj12ci5TVFJJTkc2PTEwMixWcj12ci5WQUxVRT0xMTMsS3I9dnIuS0VZPTExNCxacj12ci5PQkpFQ1Q9MTI5LFFyPXZyLkFSUkFZPTEzMCxYcj0iXFwiLmNoYXJDb2RlQXQoMCksdG49Ii8iLmNoYXJDb2RlQXQoMCksZW49IlxiIi5jaGFyQ29kZUF0KDApLHJuPSJcZiIuY2hhckNvZGVBdCgwKSxubj0iXG4iLmNoYXJDb2RlQXQoMCksb249IlxyIi5jaGFyQ29kZUF0KDApLHNuPSJcdCIuY2hhckNvZGVBdCgwKTtmdW5jdGlvbiBhbigpe3RoaXMudFN0YXRlPWpyLHRoaXMudmFsdWU9dm9pZCAwLHRoaXMuc3RyaW5nPXZvaWQgMCx0aGlzLnN0cmluZ0J1ZmZlcj1BLmFsbG9jP0EuYWxsb2MoNjU1MzYpOm5ldyBBKDY1NTM2KSx0aGlzLnN0cmluZ0J1ZmZlck9mZnNldD0wLHRoaXMudW5pY29kZT12b2lkIDAsdGhpcy5oaWdoU3Vycm9nYXRlPXZvaWQgMCx0aGlzLmtleT12b2lkIDAsdGhpcy5tb2RlPXZvaWQgMCx0aGlzLnN0YWNrPVtdLHRoaXMuc3RhdGU9VnIsdGhpcy5ieXRlc19yZW1haW5pbmc9MCx0aGlzLmJ5dGVzX2luX3NlcXVlbmNlPTAsdGhpcy50ZW1wX2J1ZmZzPXsyOm5ldyBBKDIpLDM6bmV3IEEoMyksNDpuZXcgQSg0KX0sdGhpcy5vZmZzZXQ9LTF9YW4udG9rbmFtPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1PYmplY3Qua2V5cyh2cikscj0wLG49ZS5sZW5ndGg7cjxuO3IrKyl7dmFyIGk9ZVtyXTtpZih2cltpXT09PXQpcmV0dXJuIGl9cmV0dXJuIHQmJiIweCIrdC50b1N0cmluZygxNil9O3ZhciB1bj1hbi5wcm90b3R5cGU7dW4ub25FcnJvcj1mdW5jdGlvbih0KXt0aHJvdyB0fSx1bi5jaGFyRXJyb3I9ZnVuY3Rpb24odCxlKXt0aGlzLnRTdGF0ZT1Mcix0aGlzLm9uRXJyb3IobmV3IEVycm9yKCJVbmV4cGVjdGVkICIrSlNPTi5zdHJpbmdpZnkoU3RyaW5nLmZyb21DaGFyQ29kZSh0W2VdKSkrIiBhdCBwb3NpdGlvbiAiK2UrIiBpbiBzdGF0ZSAiK2FuLnRva25hbSh0aGlzLnRTdGF0ZSkpKX0sdW4uYXBwZW5kU3RyaW5nQ2hhcj1mdW5jdGlvbih0KXt0aGlzLnN0cmluZ0J1ZmZlck9mZnNldD49NjU1MzYmJih0aGlzLnN0cmluZys9dGhpcy5zdHJpbmdCdWZmZXIudG9TdHJpbmcoInV0ZjgiKSx0aGlzLnN0cmluZ0J1ZmZlck9mZnNldD0wKSx0aGlzLnN0cmluZ0J1ZmZlclt0aGlzLnN0cmluZ0J1ZmZlck9mZnNldCsrXT10fSx1bi5hcHBlbmRTdHJpbmdCdWY9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXQubGVuZ3RoOyJudW1iZXIiPT10eXBlb2YgZSYmKG49Im51bWJlciI9PXR5cGVvZiByP3I8MD90Lmxlbmd0aC1lK3I6ci1lOnQubGVuZ3RoLWUpLG48MCYmKG49MCksdGhpcy5zdHJpbmdCdWZmZXJPZmZzZXQrbj42NTUzNiYmKHRoaXMuc3RyaW5nKz10aGlzLnN0cmluZ0J1ZmZlci50b1N0cmluZygidXRmOCIsMCx0aGlzLnN0cmluZ0J1ZmZlck9mZnNldCksdGhpcy5zdHJpbmdCdWZmZXJPZmZzZXQ9MCksdC5jb3B5KHRoaXMuc3RyaW5nQnVmZmVyLHRoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0LGUsciksdGhpcy5zdHJpbmdCdWZmZXJPZmZzZXQrPW59LHVuLndyaXRlPWZ1bmN0aW9uKHQpe3ZhciBlOyJzdHJpbmciPT10eXBlb2YgdCYmKHQ9bmV3IEEodCkpO2Zvcih2YXIgcj0wLG49dC5sZW5ndGg7cjxuO3IrKylpZih0aGlzLnRTdGF0ZT09PWpyKXtpZihlPXRbcl0sdGhpcy5vZmZzZXQrKywxMjM9PT1lKXRoaXMub25Ub2tlbihiciwieyIpO2Vsc2UgaWYoMTI1PT09ZSl0aGlzLm9uVG9rZW4obXIsIn0iKTtlbHNlIGlmKDkxPT09ZSl0aGlzLm9uVG9rZW4od3IsIlsiKTtlbHNlIGlmKDkzPT09ZSl0aGlzLm9uVG9rZW4oX3IsIl0iKTtlbHNlIGlmKDU4PT09ZSl0aGlzLm9uVG9rZW4oU3IsIjoiKTtlbHNlIGlmKDQ0PT09ZSl0aGlzLm9uVG9rZW4oRXIsIiwiKTtlbHNlIGlmKDExNj09PWUpdGhpcy50U3RhdGU9Q3I7ZWxzZSBpZigxMDI9PT1lKXRoaXMudFN0YXRlPUJyO2Vsc2UgaWYoMTEwPT09ZSl0aGlzLnRTdGF0ZT1EcjtlbHNlIGlmKDM0PT09ZSl0aGlzLnN0cmluZz0iIix0aGlzLnN0cmluZ0J1ZmZlck9mZnNldD0wLHRoaXMudFN0YXRlPVlyO2Vsc2UgaWYoNDU9PT1lKXRoaXMuc3RyaW5nPSItIix0aGlzLnRTdGF0ZT16cjtlbHNlIGlmKGU+PTQ4JiZlPDY0KXRoaXMuc3RyaW5nPVN0cmluZy5mcm9tQ2hhckNvZGUoZSksdGhpcy50U3RhdGU9cXI7ZWxzZSBpZigzMiE9PWUmJjkhPT1lJiYxMCE9PWUmJjEzIT09ZSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKX1lbHNlIGlmKHRoaXMudFN0YXRlPT09WXIpaWYoZT10W3JdLHRoaXMuYnl0ZXNfcmVtYWluaW5nPjApe2Zvcih2YXIgaT0wO2k8dGhpcy5ieXRlc19yZW1haW5pbmc7aSsrKXRoaXMudGVtcF9idWZmc1t0aGlzLmJ5dGVzX2luX3NlcXVlbmNlXVt0aGlzLmJ5dGVzX2luX3NlcXVlbmNlLXRoaXMuYnl0ZXNfcmVtYWluaW5nK2ldPXRbaV07dGhpcy5hcHBlbmRTdHJpbmdCdWYodGhpcy50ZW1wX2J1ZmZzW3RoaXMuYnl0ZXNfaW5fc2VxdWVuY2VdKSx0aGlzLmJ5dGVzX2luX3NlcXVlbmNlPXRoaXMuYnl0ZXNfcmVtYWluaW5nPTAscj1yK2ktMX1lbHNlIGlmKDA9PT10aGlzLmJ5dGVzX3JlbWFpbmluZyYmZT49MTI4KXtpZihlPD0xOTN8fGU+MjQ0KXJldHVybiB0aGlzLm9uRXJyb3IobmV3IEVycm9yKCJJbnZhbGlkIFVURi04IGNoYXJhY3RlciBhdCBwb3NpdGlvbiAiK3IrIiBpbiBzdGF0ZSAiK2FuLnRva25hbSh0aGlzLnRTdGF0ZSkpKTtpZihlPj0xOTQmJmU8PTIyMyYmKHRoaXMuYnl0ZXNfaW5fc2VxdWVuY2U9MiksZT49MjI0JiZlPD0yMzkmJih0aGlzLmJ5dGVzX2luX3NlcXVlbmNlPTMpLGU+PTI0MCYmZTw9MjQ0JiYodGhpcy5ieXRlc19pbl9zZXF1ZW5jZT00KSx0aGlzLmJ5dGVzX2luX3NlcXVlbmNlK3I+dC5sZW5ndGgpe2Zvcih2YXIgbz0wO288PXQubGVuZ3RoLTEtcjtvKyspdGhpcy50ZW1wX2J1ZmZzW3RoaXMuYnl0ZXNfaW5fc2VxdWVuY2VdW29dPXRbcitvXTt0aGlzLmJ5dGVzX3JlbWFpbmluZz1yK3RoaXMuYnl0ZXNfaW5fc2VxdWVuY2UtdC5sZW5ndGgscj10Lmxlbmd0aC0xfWVsc2UgdGhpcy5hcHBlbmRTdHJpbmdCdWYodCxyLHIrdGhpcy5ieXRlc19pbl9zZXF1ZW5jZSkscj1yK3RoaXMuYnl0ZXNfaW5fc2VxdWVuY2UtMX1lbHNlIGlmKDM0PT09ZSl0aGlzLnRTdGF0ZT1qcix0aGlzLnN0cmluZys9dGhpcy5zdHJpbmdCdWZmZXIudG9TdHJpbmcoInV0ZjgiLDAsdGhpcy5zdHJpbmdCdWZmZXJPZmZzZXQpLHRoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0PTAsdGhpcy5vblRva2VuKFRyLHRoaXMuc3RyaW5nKSx0aGlzLm9mZnNldCs9QS5ieXRlTGVuZ3RoKHRoaXMuc3RyaW5nLCJ1dGY4IikrMSx0aGlzLnN0cmluZz12b2lkIDA7ZWxzZSBpZig5Mj09PWUpdGhpcy50U3RhdGU9V3I7ZWxzZXtpZighKGU+PTMyKSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLmFwcGVuZFN0cmluZ0NoYXIoZSl9ZWxzZSBpZih0aGlzLnRTdGF0ZT09PVdyKWlmKDM0PT09KGU9dFtyXSkpdGhpcy5hcHBlbmRTdHJpbmdDaGFyKGUpLHRoaXMudFN0YXRlPVlyO2Vsc2UgaWYoOTI9PT1lKXRoaXMuYXBwZW5kU3RyaW5nQ2hhcihYciksdGhpcy50U3RhdGU9WXI7ZWxzZSBpZig0Nz09PWUpdGhpcy5hcHBlbmRTdHJpbmdDaGFyKHRuKSx0aGlzLnRTdGF0ZT1ZcjtlbHNlIGlmKDk4PT09ZSl0aGlzLmFwcGVuZFN0cmluZ0NoYXIoZW4pLHRoaXMudFN0YXRlPVlyO2Vsc2UgaWYoMTAyPT09ZSl0aGlzLmFwcGVuZFN0cmluZ0NoYXIocm4pLHRoaXMudFN0YXRlPVlyO2Vsc2UgaWYoMTEwPT09ZSl0aGlzLmFwcGVuZFN0cmluZ0NoYXIobm4pLHRoaXMudFN0YXRlPVlyO2Vsc2UgaWYoMTE0PT09ZSl0aGlzLmFwcGVuZFN0cmluZ0NoYXIob24pLHRoaXMudFN0YXRlPVlyO2Vsc2UgaWYoMTE2PT09ZSl0aGlzLmFwcGVuZFN0cmluZ0NoYXIoc24pLHRoaXMudFN0YXRlPVlyO2Vsc2V7aWYoMTE3IT09ZSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnVuaWNvZGU9IiIsdGhpcy50U3RhdGU9JHJ9ZWxzZSBpZih0aGlzLnRTdGF0ZT09PSRyfHx0aGlzLnRTdGF0ZT09PUdyfHx0aGlzLnRTdGF0ZT09PUpyfHx0aGlzLnRTdGF0ZT09PUhyKXtpZighKChlPXRbcl0pPj00OCYmZTw2NHx8ZT42NCYmZTw9NzB8fGU+OTYmJmU8PTEwMikpcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7aWYodGhpcy51bmljb2RlKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGUpLHRoaXMudFN0YXRlKys9PT1Icil7dmFyIHM9cGFyc2VJbnQodGhpcy51bmljb2RlLDE2KTt0aGlzLnVuaWNvZGU9dm9pZCAwLHZvaWQgMCE9PXRoaXMuaGlnaFN1cnJvZ2F0ZSYmcz49NTYzMjAmJnM8NTczNDQ/KHRoaXMuYXBwZW5kU3RyaW5nQnVmKG5ldyBBKFN0cmluZy5mcm9tQ2hhckNvZGUodGhpcy5oaWdoU3Vycm9nYXRlLHMpKSksdGhpcy5oaWdoU3Vycm9nYXRlPXZvaWQgMCk6dm9pZCAwPT09dGhpcy5oaWdoU3Vycm9nYXRlJiZzPj01NTI5NiYmczw1NjMyMD90aGlzLmhpZ2hTdXJyb2dhdGU9czoodm9pZCAwIT09dGhpcy5oaWdoU3Vycm9nYXRlJiYodGhpcy5hcHBlbmRTdHJpbmdCdWYobmV3IEEoU3RyaW5nLmZyb21DaGFyQ29kZSh0aGlzLmhpZ2hTdXJyb2dhdGUpKSksdGhpcy5oaWdoU3Vycm9nYXRlPXZvaWQgMCksdGhpcy5hcHBlbmRTdHJpbmdCdWYobmV3IEEoU3RyaW5nLmZyb21DaGFyQ29kZShzKSkpKSx0aGlzLnRTdGF0ZT1Zcn19ZWxzZSBpZih0aGlzLnRTdGF0ZT09PXpyfHx0aGlzLnRTdGF0ZT09PXFyKXN3aXRjaChlPXRbcl0pe2Nhc2UgNDg6Y2FzZSA0OTpjYXNlIDUwOmNhc2UgNTE6Y2FzZSA1MjpjYXNlIDUzOmNhc2UgNTQ6Y2FzZSA1NTpjYXNlIDU2OmNhc2UgNTc6Y2FzZSA0NjpjYXNlIDEwMTpjYXNlIDY5OmNhc2UgNDM6Y2FzZSA0NTp0aGlzLnN0cmluZys9U3RyaW5nLmZyb21DaGFyQ29kZShlKSx0aGlzLnRTdGF0ZT1xcjticmVhaztkZWZhdWx0OnRoaXMudFN0YXRlPWpyO3ZhciBhPU51bWJlcih0aGlzLnN0cmluZyk7aWYoaXNOYU4oYSkpcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy5zdHJpbmcubWF0Y2goL1swLTldKy8pPT10aGlzLnN0cmluZyYmYS50b1N0cmluZygpIT10aGlzLnN0cmluZz90aGlzLm9uVG9rZW4oVHIsdGhpcy5zdHJpbmcpOnRoaXMub25Ub2tlbihPcixhKSx0aGlzLm9mZnNldCs9dGhpcy5zdHJpbmcubGVuZ3RoLTEsdGhpcy5zdHJpbmc9dm9pZCAwLHItLX1lbHNlIGlmKHRoaXMudFN0YXRlPT09Q3Ipe2lmKDExNCE9PXRbcl0pcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy50U3RhdGU9UHJ9ZWxzZSBpZih0aGlzLnRTdGF0ZT09PVByKXtpZigxMTchPT10W3JdKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudFN0YXRlPU1yfWVsc2UgaWYodGhpcy50U3RhdGU9PT1Ncil7aWYoMTAxIT09dFtyXSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnRTdGF0ZT1qcix0aGlzLm9uVG9rZW4oa3IsITApLHRoaXMub2Zmc2V0Kz0zfWVsc2UgaWYodGhpcy50U3RhdGU9PT1Ccil7aWYoOTchPT10W3JdKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudFN0YXRlPXhyfWVsc2UgaWYodGhpcy50U3RhdGU9PT14cil7aWYoMTA4IT09dFtyXSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnRTdGF0ZT1Vcn1lbHNlIGlmKHRoaXMudFN0YXRlPT09VXIpe2lmKDExNSE9PXRbcl0pcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy50U3RhdGU9SXJ9ZWxzZSBpZih0aGlzLnRTdGF0ZT09PUlyKXtpZigxMDEhPT10W3JdKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudFN0YXRlPWpyLHRoaXMub25Ub2tlbihSciwhMSksdGhpcy5vZmZzZXQrPTR9ZWxzZSBpZih0aGlzLnRTdGF0ZT09PURyKXtpZigxMTchPT10W3JdKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudFN0YXRlPU5yfWVsc2UgaWYodGhpcy50U3RhdGU9PT1Ocil7aWYoMTA4IT09dFtyXSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnRTdGF0ZT1Gcn1lbHNlIGlmKHRoaXMudFN0YXRlPT09RnIpe2lmKDEwOCE9PXRbcl0pcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy50U3RhdGU9anIsdGhpcy5vblRva2VuKEFyLG51bGwpLHRoaXMub2Zmc2V0Kz0zfX0sdW4ub25Ub2tlbj1mdW5jdGlvbih0LGUpe30sdW4ucGFyc2VFcnJvcj1mdW5jdGlvbih0LGUpe3RoaXMudFN0YXRlPUxyLHRoaXMub25FcnJvcihuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgIithbi50b2tuYW0odCkrKGU/IigiK0pTT04uc3RyaW5naWZ5KGUpKyIpIjoiIikrIiBpbiBzdGF0ZSAiK2FuLnRva25hbSh0aGlzLnN0YXRlKSkpfSx1bi5wdXNoPWZ1bmN0aW9uKCl7dGhpcy5zdGFjay5wdXNoKHt2YWx1ZTp0aGlzLnZhbHVlLGtleTp0aGlzLmtleSxtb2RlOnRoaXMubW9kZX0pfSx1bi5wb3A9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnZhbHVlLGU9dGhpcy5zdGFjay5wb3AoKTt0aGlzLnZhbHVlPWUudmFsdWUsdGhpcy5rZXk9ZS5rZXksdGhpcy5tb2RlPWUubW9kZSx0aGlzLmVtaXQodCksdGhpcy5tb2RlfHwodGhpcy5zdGF0ZT1Wcil9LHVuLmVtaXQ9ZnVuY3Rpb24odCl7dGhpcy5tb2RlJiYodGhpcy5zdGF0ZT1FciksdGhpcy5vblZhbHVlKHQpfSx1bi5vblZhbHVlPWZ1bmN0aW9uKHQpe30sdW4ub25Ub2tlbj1mdW5jdGlvbih0LGUpe2lmKHRoaXMuc3RhdGU9PT1WcilpZih0PT09VHJ8fHQ9PT1Pcnx8dD09PWtyfHx0PT09UnJ8fHQ9PT1Bcil0aGlzLnZhbHVlJiYodGhpcy52YWx1ZVt0aGlzLmtleV09ZSksdGhpcy5lbWl0KGUpO2Vsc2UgaWYodD09PWJyKXRoaXMucHVzaCgpLHRoaXMudmFsdWU/dGhpcy52YWx1ZT10aGlzLnZhbHVlW3RoaXMua2V5XT17fTp0aGlzLnZhbHVlPXt9LHRoaXMua2V5PXZvaWQgMCx0aGlzLnN0YXRlPUtyLHRoaXMubW9kZT1acjtlbHNlIGlmKHQ9PT13cil0aGlzLnB1c2goKSx0aGlzLnZhbHVlP3RoaXMudmFsdWU9dGhpcy52YWx1ZVt0aGlzLmtleV09W106dGhpcy52YWx1ZT1bXSx0aGlzLmtleT0wLHRoaXMubW9kZT1Rcix0aGlzLnN0YXRlPVZyO2Vsc2UgaWYodD09PW1yKXtpZih0aGlzLm1vZGUhPT1acilyZXR1cm4gdGhpcy5wYXJzZUVycm9yKHQsZSk7dGhpcy5wb3AoKX1lbHNle2lmKHQhPT1fcilyZXR1cm4gdGhpcy5wYXJzZUVycm9yKHQsZSk7aWYodGhpcy5tb2RlIT09UXIpcmV0dXJuIHRoaXMucGFyc2VFcnJvcih0LGUpO3RoaXMucG9wKCl9ZWxzZSBpZih0aGlzLnN0YXRlPT09S3IpaWYodD09PVRyKXRoaXMua2V5PWUsdGhpcy5zdGF0ZT1TcjtlbHNle2lmKHQhPT1tcilyZXR1cm4gdGhpcy5wYXJzZUVycm9yKHQsZSk7dGhpcy5wb3AoKX1lbHNlIGlmKHRoaXMuc3RhdGU9PT1Tcil7aWYodCE9PVNyKXJldHVybiB0aGlzLnBhcnNlRXJyb3IodCxlKTt0aGlzLnN0YXRlPVZyfWVsc2V7aWYodGhpcy5zdGF0ZSE9PUVyKXJldHVybiB0aGlzLnBhcnNlRXJyb3IodCxlKTtpZih0PT09RXIpdGhpcy5tb2RlPT09UXI/KHRoaXMua2V5KyssdGhpcy5zdGF0ZT1Wcik6dGhpcy5tb2RlPT09WnImJih0aGlzLnN0YXRlPUtyKTtlbHNle2lmKCEodD09PV9yJiZ0aGlzLm1vZGU9PT1Rcnx8dD09PW1yJiZ0aGlzLm1vZGU9PT1acikpcmV0dXJuIHRoaXMucGFyc2VFcnJvcih0LGUpO3RoaXMucG9wKCl9fX0sYW4uQz12cjt2YXIgaG49YW47ZnVuY3Rpb24gZm4odCxlLHIpe3Q9dHx8ZnVuY3Rpb24odCl7dGhpcy5xdWV1ZSh0KX0sZT1lfHxmdW5jdGlvbigpe3RoaXMucXVldWUobnVsbCl9O2xldCBuPSExLGk9ITEsbz1bXSxzPSExLGE9bmV3IEplO2Z1bmN0aW9uIHUoKXtmb3IoO28ubGVuZ3RoJiYhYS5wYXVzZWQ7KXtsZXQgdD1vLnNoaWZ0KCk7aWYobnVsbD09PXQpcmV0dXJuIGEuZW1pdCgiZW5kIik7YS5lbWl0KCJkYXRhIix0KX19ZnVuY3Rpb24gaCgpe2Eud3JpdGFibGU9ITEsZS5jYWxsKGEpLCFhLnJlYWRhYmxlJiZhLmF1dG9EZXN0cm95JiZhLmRlc3Ryb3koKX1yZXR1cm4gYS5yZWFkYWJsZT1hLndyaXRhYmxlPSEwLGEucGF1c2VkPSExLGEuYXV0b0Rlc3Ryb3k9IShyJiYhMT09PXIuYXV0b0Rlc3Ryb3kpLGEud3JpdGU9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuY2FsbCh0aGlzLGUpLCFhLnBhdXNlZH0sYS5xdWV1ZT1hLnB1c2g9ZnVuY3Rpb24odCl7cmV0dXJuIHN8fChudWxsPT09dCYmKHM9ITApLG8ucHVzaCh0KSx1KCkpLGF9LGEub24oImVuZCIsKGZ1bmN0aW9uKCl7YS5yZWFkYWJsZT0hMSwhYS53cml0YWJsZSYmYS5hdXRvRGVzdHJveSYmQnQubmV4dFRpY2soKGZ1bmN0aW9uKCl7YS5kZXN0cm95KCl9KSl9KSksYS5lbmQ9ZnVuY3Rpb24odCl7aWYoIW4pcmV0dXJuIG49ITAsYXJndW1lbnRzLmxlbmd0aCYmYS53cml0ZSh0KSxoKCksYX0sYS5kZXN0cm95PWZ1bmN0aW9uKCl7aWYoIWkpcmV0dXJuIGk9ITAsbj0hMCxvLmxlbmd0aD0wLGEud3JpdGFibGU9YS5yZWFkYWJsZT0hMSxhLmVtaXQoImNsb3NlIiksYX0sYS5wYXVzZT1mdW5jdGlvbigpe2lmKCFhLnBhdXNlZClyZXR1cm4gYS5wYXVzZWQ9ITAsYX0sYS5yZXN1bWU9ZnVuY3Rpb24oKXtyZXR1cm4gYS5wYXVzZWQmJihhLnBhdXNlZD0hMSxhLmVtaXQoInJlc3VtZSIpKSx1KCksYS5wYXVzZWR8fGEuZW1pdCgiZHJhaW4iKSxhfSxhfWZuLnRocm91Z2g9Zm47bGV0IGNuPXtwYXJzZTpmdW5jdGlvbih0LGUpe2xldCByLG47ZnVuY3Rpb24gaSh0LGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdD9lPT09dDp0JiYiZnVuY3Rpb24iPT10eXBlb2YgdC5leGVjP3QuZXhlYyhlKToiYm9vbGVhbiI9PXR5cGVvZiB0fHwib2JqZWN0Ij09dHlwZW9mIHQ/dDoiZnVuY3Rpb24iPT10eXBlb2YgdCYmdChlKX1sZXQgbz1uZXcgaG4scz1mbigoZnVuY3Rpb24odCl7InN0cmluZyI9PXR5cGVvZiB0JiYodD1BLmZyb20odCkpLG8ud3JpdGUodCl9KSwoZnVuY3Rpb24odCl7dCYmcy53cml0ZSh0KSxyJiZzLmVtaXQoImhlYWRlciIsciksbiYmcy5lbWl0KCJmb290ZXIiLG4pLHMucXVldWUobnVsbCl9KSk7ZnVuY3Rpb24gYSh0LGUpeyExIT09ciYmKHI9cnx8e30sclt0XT1lKSwhMSE9PW4mJiExPT09ciYmKG49bnx8e30sblt0XT1lKX1yZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQmJih0PXQuc3BsaXQoIi4iKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiIkKiI9PT10P3tlbWl0S2V5OiEwfToiKiI9PT10fHwoIiI9PT10P3tyZWN1cnNlOiEwfTp0KX0pKSksdCYmdC5sZW5ndGh8fCh0PW51bGwpLG8ub25WYWx1ZT1mdW5jdGlvbihuKXtpZih0aGlzLnJvb3R8fChzLnJvb3Q9biksIXQpcmV0dXJuO2xldCBvPTAsdT0wLGg9ITEsZj0hMTtmb3IoO288dC5sZW5ndGg7KXtsZXQgZSxyPXRbb107aWYodSsrLHImJiFyLnJlY3Vyc2Upe2lmKGU9dT09PXRoaXMuc3RhY2subGVuZ3RoP3RoaXM6dGhpcy5zdGFja1t1XSwhZSlyZXR1cm47aWYoIWkocixlLmtleSkpcmV0dXJuIHZvaWQgYShlLmtleSxuKTtoPSEhci5lbWl0S2V5LGY9ISFyLmVtaXRQYXRoLG8rK31lbHNle28rKztsZXQgcj10W29dO2lmKCFyKXJldHVybjtmb3IoOzspe2lmKGU9dT09PXRoaXMuc3RhY2subGVuZ3RoP3RoaXM6dGhpcy5zdGFja1t1XSwhZSlyZXR1cm47aWYoaShyLGUua2V5KSl7bysrLE9iamVjdC5pc0Zyb3plbih0aGlzLnN0YWNrW3VdKXx8KHRoaXMuc3RhY2tbdV0udmFsdWU9bnVsbCk7YnJlYWt9YShlLmtleSxuKSx1Kyt9fX1pZihyJiYocy5lbWl0KCJoZWFkZXIiLHIpLHI9ITEpLHUhPT10aGlzLnN0YWNrLmxlbmd0aClyZXR1cm47bGV0IGM9dGhpcy5zdGFjay5zbGljZSgxKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmtleX0pKS5jb25jYXQoW3RoaXMua2V5XSksbD1uO251bGwhPWwmJm51bGwhPShsPWU/ZShsLGMpOmwpJiYoKGh8fGYpJiYobD17dmFsdWU6bH0saCYmKGwua2V5PXRoaXMua2V5KSxmJiYobC5wYXRoPWMpKSxzLnF1ZXVlKGwpKSx0aGlzLnZhbHVlJiZkZWxldGUgdGhpcy52YWx1ZVt0aGlzLmtleV07Zm9yKGxldCB0IGluIHRoaXMuc3RhY2spT2JqZWN0LmlzRnJvemVuKHRoaXMuc3RhY2tbdF0pfHwodGhpcy5zdGFja1t0XS52YWx1ZT1udWxsKX0sby5fb25Ub2tlbj1vLm9uVG9rZW4sby5vblRva2VuPWZ1bmN0aW9uKGUscil7by5fb25Ub2tlbihlLHIpLDA9PT10aGlzLnN0YWNrLmxlbmd0aCYmcy5yb290JiYodHx8cy5xdWV1ZShzLnJvb3QpLHMucm9vdD1udWxsKX0sby5vbkVycm9yPWZ1bmN0aW9uKHQpe3QubWVzc2FnZS5pbmRleE9mKCJhdCBwb3NpdGlvbiIpPi0xJiYodC5tZXNzYWdlPSJJbnZhbGlkIEpTT04gKCIrdC5tZXNzYWdlKyIpIikscy5lbWl0KCJlcnJvciIsdCl9LHN9fSxsbj1mdW5jdGlvbih0LGUpe3JldHVybiBsbj1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IobGV0IHIgaW4gZSllLmhhc093blByb3BlcnR5KHIpJiYodFtyXT1lW3JdKX0sbG4odCxlKX07bGV0IHBuLGRuPS9bXFwiXHUwMDAwLVx1MDAxZlx1MDA3Zi1cdTAwOWZcdTAwYWRcdTA2MDAtXHUwNjA0XHUwNzBmXHUxN2I0XHUxN2I1XHUyMDBjLVx1MjAwZlx1MjAyOC1cdTIwMmZcdTIwNjAtXHUyMDZmXHVmZWZmXHVmZmYwLVx1ZmZmZl0vZyxnbj17IlxiIjoiXFxiIiwiXHQiOiJcXHQiLCJcbiI6IlxcbiIsIlxmIjoiXFxmIiwiXHIiOiJcXHIiLCciJzonXFwiJywiXFwiOiJcXFxcIn07ZnVuY3Rpb24geW4odCl7cmV0dXJuIHQ/ImZ1bmN0aW9uIj09dHlwZW9mIHQudGhlbj9wbi5Qcm9taXNlOmZ1bmN0aW9uKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0LnJlYWQmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdC5yZXN1bWUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LnBpcGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0Lm9uY2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LnJlbW92ZUxpc3RlbmVyfSh0KT90Ll9yZWFkYWJsZVN0YXRlLm9iamVjdE1vZGU/cG4uUmVhZGFibGVPYmplY3Q6cG4uUmVhZGFibGVTdHJpbmc6QXJyYXkuaXNBcnJheSh0KT9wbi5BcnJheToib2JqZWN0Ij09dHlwZW9mIHR8fHQgaW5zdGFuY2VvZiBPYmplY3Q/cG4uT2JqZWN0OnBuLlByaW1pdGl2ZTpwbi5QcmltaXRpdmV9IWZ1bmN0aW9uKHQpe3RbdC5BcnJheT0wXT0iQXJyYXkiLHRbdC5PYmplY3Q9MV09Ik9iamVjdCIsdFt0LlJlYWRhYmxlU3RyaW5nPTJdPSJSZWFkYWJsZVN0cmluZyIsdFt0LlJlYWRhYmxlT2JqZWN0PTNdPSJSZWFkYWJsZU9iamVjdCIsdFt0LlByaW1pdGl2ZT00XT0iUHJpbWl0aXZlIix0W3QuUHJvbWlzZT01XT0iUHJvbWlzZSJ9KHBufHwocG49e30pKTtsZXQgdm49W107dm5bcG4uQXJyYXldPSJbIix2bltwbi5PYmplY3RdPSJ7Iix2bltwbi5SZWFkYWJsZVN0cmluZ109JyInLHZuW3BuLlJlYWRhYmxlT2JqZWN0XT0iWyI7bGV0IGJuPVtdO2JuW3BuLkFycmF5XT0iXSIsYm5bcG4uT2JqZWN0XT0ifSIsYm5bcG4uUmVhZGFibGVTdHJpbmddPSciJyxibltwbi5SZWFkYWJsZU9iamVjdF09Il0iO2xldCBtbj1bXTtmb3IobGV0IHQ9MCxlPU9iamVjdC5lbnRyaWVzKHBuKTt0PGUubGVuZ3RoO3QrKyl7bGV0IHI9ZVt0XSxuPXJbMF0saT1yWzFdOyJudW1iZXIiPT10eXBlb2YgaSYmKG1uW2ldPSJwcm9jZXNzIituKX1mdW5jdGlvbiB3bih0KXtyZXR1cm4gdC5yZXBsYWNlKGRuLChmdW5jdGlvbih0KXtsZXQgZT1nblt0XTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGU/ZToiXFx1Iit0LmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDQsIjAiKX0pKX1mdW5jdGlvbiBfbih0KXtyZXR1cm4nIicrd24odCkrJyInfWZ1bmN0aW9uIFNuKHQsZSl7bGV0IHI9dC5yZWFkKGUpO3JldHVybiBudWxsPT09cj9uZXcgUHJvbWlzZSgoZnVuY3Rpb24oZSxyKXtsZXQgbj1mdW5jdGlvbigpe3JldHVybiBlKG51bGwpfTt0Lm9uY2UoImVuZCIsbiksdC5vbmNlKCJlcnJvciIsciksdC5vbmNlKCJyZWFkYWJsZSIsKGZ1bmN0aW9uKCl7dC5yZW1vdmVMaXN0ZW5lcigiZW5kIixuKSx0LnJlbW92ZUxpc3RlbmVyKCJlcnJvciIsciksZSh0LnJlYWQoKSl9KSl9KSk6UHJvbWlzZS5yZXNvbHZlKHIpfWZ1bmN0aW9uIEVuKHQpe3JldHVybiB0LnRoZW4oKGZ1bmN0aW9uKHQpe3JldHVybiB5bih0KT09PXBuLlByb21pc2U/RW4odCk6dH0pKX1sZXQga249ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLHIsbixpKXt2b2lkIDA9PT1pJiYoaT0hMSk7bGV0IG89dC5jYWxsKHRoaXMpfHx0aGlzO28uY3ljbGU9aSxvLnN0YWNrPVtdLG8uZGVwdGg9MCxvLnB1c2hDYWxsZWQ9ITEsby5lbmQ9ITEsby5pc1JlYWRpbmc9ITEsby5yZWFkTW9yZT0hMTtsZXQgcz10eXBlb2YgbjtyZXR1cm4ic3RyaW5nIiE9PXMmJiJudW1iZXIiIT09c3x8KG8uZ2FwPU51bWJlci5pc0Zpbml0ZShuKT8iICIucmVwZWF0KG4pOm4pLE9iamVjdC5hc3NpZ24obyx7dmlzaXRlZDppP25ldyBXZWFrTWFwOm5ldyBXZWFrU2V0LHJlcGxhY2VyRnVuY3Rpb246ciBpbnN0YW5jZW9mIEZ1bmN0aW9uJiZyLHJlcGxhY2VyQXJyYXk6QXJyYXkuaXNBcnJheShyKSYmcn0pLHIgaW5zdGFuY2VvZiBGdW5jdGlvbiYmKG8ucmVwbGFjZXJGdW5jdGlvbj1yKSxBcnJheS5pc0FycmF5KHIpJiYoby5yZXBsYWNlckFycmF5PXIpLG8uYWRkVG9TdGFjayhlKSxvfXJldHVybiBmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIHIoKXt0aGlzLmNvbnN0cnVjdG9yPXR9bG4odCxlKSx0LnByb3RvdHlwZT1udWxsPT09ZT9PYmplY3QuY3JlYXRlKGUpOihyLnByb3RvdHlwZT1lLnByb3RvdHlwZSxuZXcgcil9KGUsdCksZS5wcm90b3R5cGUuY3ljbGVyPWZ1bmN0aW9uKHQsZSl7bGV0IHI9dGhpcy52aXNpdGVkLmdldChlKTtpZihyKXJldHVybnskcmVmOnJ9O2xldCBuPXRoaXMucGF0aCgpO3JldHVybiB2b2lkIDAhPT10JiZuLnB1c2godCksbj1uLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIlsiKyhOdW1iZXIuaXNJbnRlZ2VyKHQpP3Q6X24odCkpKyJdIn0pKSx0aGlzLnZpc2l0ZWQuc2V0KGUsbi5sZW5ndGg/IiQiK24uam9pbigiIik6IiQiKSxlfSxlLnByb3RvdHlwZS5hZGRUb1N0YWNrPWZ1bmN0aW9uKHQsZSxyLG4pe2xldCBpLG8scz10aGlzLGE9dDt0aGlzLnJlcGxhY2VyRnVuY3Rpb24mJihhPXRoaXMucmVwbGFjZXJGdW5jdGlvbihlfHxyLGEsdGhpcykpLGEmJmEudG9KU09OIGluc3RhbmNlb2YgRnVuY3Rpb24mJihhPWEudG9KU09OKCkpLChhIGluc3RhbmNlb2YgRnVuY3Rpb258fCJzeW1ib2wiPT10eXBlb2YgdCkmJihhPXZvaWQgMCksdm9pZCAwIT09ZSYmdGhpcy5yZXBsYWNlckFycmF5JiYodGhpcy5yZXBsYWNlckFycmF5LmluY2x1ZGVzKGUpfHwoYT12b2lkIDApKTtsZXQgdT15bihhKTtpZigobiYmbi50eXBlPT09cG4uQXJyYXl8fHZvaWQgMCE9PWEpJiZ1IT09cG4uUHJvbWlzZSYmKG4mJiFuLmZpcnN0JiZ0aGlzLl9wdXNoKCIsIiksbiYmKG4uZmlyc3Q9ITEpKSx2b2lkIDAhPT1hJiZ1IT09cG4uUHJvbWlzZSYmZSYmKHRoaXMuZ2FwP3RoaXMuX3B1c2goIlxuIit0aGlzLmdhcC5yZXBlYXQodGhpcy5kZXB0aCkrJyInK3duKGUpKyciOiAnKTp0aGlzLl9wdXNoKCciJyt3bihlKSsnIjonKSksdSE9PXBuLlByaW1pdGl2ZSlpZih0aGlzLmN5Y2xlKWE9dGhpcy5jeWNsZXIoZXx8cixhKSx1PXluKGEpO2Vsc2V7aWYodGhpcy52aXNpdGVkLmhhcyhhKSl0aHJvdyBPYmplY3QuYXNzaWduKG5ldyBFcnJvcigiQ29udmVydGluZyBjaXJjdWxhciBzdHJ1Y3R1cmUgdG8gSlNPTiIpLHtyZWFsVmFsdWU6YSxrZXk6ZXx8cn0pO3RoaXMudmlzaXRlZC5hZGQoYSl9IWUmJnI+LTEmJnRoaXMuZGVwdGgmJnRoaXMuZ2FwJiZ0aGlzLl9wdXNoKCJcbiIrdGhpcy5nYXAucmVwZWF0KHRoaXMuZGVwdGgpKTtsZXQgaD12blt1XTtoJiZ0aGlzLl9wdXNoKGgpO2xldCBmPXtrZXk6ZSxpbmRleDpyLHR5cGU6dSxwYXJlbnQ6bix2YWx1ZTphLGZpcnN0OiEwfTtyZXR1cm4gdT09PXBuLk9iamVjdD8odGhpcy5kZXB0aCs9MSxmLnVucmVhZD1PYmplY3Qua2V5cyhhKSxmLmlzRW1wdHk9IWYudW5yZWFkLmxlbmd0aCk6dT09PXBuLkFycmF5Pyh0aGlzLmRlcHRoKz0xLGYudW5yZWFkPWEubGVuZ3RoLGYuYXJyYXlMZW5ndGg9Zi51bnJlYWQsZi5pc0VtcHR5PSFmLnVucmVhZCk6dSE9PXBuLlJlYWRhYmxlU3RyaW5nJiZ1IT09cG4uUmVhZGFibGVPYmplY3R8fCh0aGlzLmRlcHRoKz0xLGEucmVhZGFibGVFbmRlZHx8KG51bGw9PT0oaT1hLl9yZWFkYWJsZVN0YXRlKXx8dm9pZCAwPT09aT92b2lkIDA6aS5lbmRFbWl0dGVkKT90aGlzLmVtaXQoImVycm9yIixuZXcgRXJyb3IoIlJlYWRhYmxlIFN0cmVhbSBoYXMgZW5kZWQgYmVmb3JlIGl0IHdhcyBzZXJpYWxpemVkLiBBbGwgc3RyZWFtIGRhdGEgaGF2ZSBiZWVuIGxvc3QiKSxhLGV8fHIpOihhLnJlYWRhYmxlRmxvd2luZ3x8KG51bGw9PT0obz1hLl9yZWFkYWJsZVN0YXRlKXx8dm9pZCAwPT09bz92b2lkIDA6by5mbG93aW5nKSkmJihhLnBhdXNlKCksdGhpcy5lbWl0KCJlcnJvciIsbmV3IEVycm9yKCJSZWFkYWJsZSBTdHJlYW0gaXMgaW4gZmxvd2luZyBtb2RlLCBkYXRhIG1heSBoYXZlIGJlZW4gbG9zdC4gVHJ5aW5nIHRvIHBhdXNlIHN0cmVhbS4iKSxhLGV8fHIpKSxmLnJlYWRDb3VudD0wLGEub25jZSgiZW5kIiwoZnVuY3Rpb24oKXtmLmVuZD0hMCxzLl9fcmVhZCgpfSkpLGEub25jZSgiZXJyb3IiLChmdW5jdGlvbih0KXtzLmVycm9yPSEwLHMuZW1pdCgiZXJyb3IiLHQpfSkpKSx0aGlzLnN0YWNrLnVuc2hpZnQoZiksZn0sZS5wcm90b3R5cGUucmVtb3ZlRnJvbVN0YWNrPWZ1bmN0aW9uKHQpe2xldCBlPXQudHlwZSxyPWU9PT1wbi5PYmplY3R8fGU9PT1wbi5BcnJheXx8ZT09PXBuLlJlYWRhYmxlU3RyaW5nfHxlPT09cG4uUmVhZGFibGVPYmplY3Q7ZSE9PXBuLlByaW1pdGl2ZSYmKHRoaXMuY3ljbGV8fHRoaXMudmlzaXRlZC5kZWxldGUodC52YWx1ZSksciYmKHRoaXMuZGVwdGgtPTEpKTtsZXQgbj1ibltlXTtyJiYhdC5pc0VtcHR5JiZ0aGlzLmdhcCYmdGhpcy5fcHVzaCgiXG4iK3RoaXMuZ2FwLnJlcGVhdCh0aGlzLmRlcHRoKSksbiYmdGhpcy5fcHVzaChuKTtsZXQgaT10aGlzLnN0YWNrLmluZGV4T2YodCk7dGhpcy5zdGFjay5zcGxpY2UoaSwxKX0sZS5wcm90b3R5cGUuX3B1c2g9ZnVuY3Rpb24odCl7dGhpcy5wdXNoQ2FsbGVkPSEwLHRoaXMucHVzaCh0KX0sZS5wcm90b3R5cGUucHJvY2Vzc1JlYWRhYmxlT2JqZWN0PWZ1bmN0aW9uKHQsZSl7bGV0IHI9dGhpcztpZighdC5lbmQpcmV0dXJuIFNuKHQudmFsdWUsZSkudGhlbigoZnVuY3Rpb24oZSl7bnVsbCE9PWUmJih0LmZpcnN0fHxyLl9wdXNoKCIsIiksdC5maXJzdD0hMSxyLmFkZFRvU3RhY2soZSx2b2lkIDAsdC5yZWFkQ291bnQpLHQucmVhZENvdW50Kz0xKX0pKTt0aGlzLnJlbW92ZUZyb21TdGFjayh0KX0sZS5wcm90b3R5cGUucHJvY2Vzc09iamVjdD1mdW5jdGlvbih0KXtpZighdC51bnJlYWQubGVuZ3RoKXJldHVybiB2b2lkIHRoaXMucmVtb3ZlRnJvbVN0YWNrKHQpO2xldCBlPXQudW5yZWFkLnNoaWZ0KCkscj10LnZhbHVlW2VdO3RoaXMuYWRkVG9TdGFjayhyLGUsdm9pZCAwLHQpfSxlLnByb3RvdHlwZS5wcm9jZXNzQXJyYXk9ZnVuY3Rpb24odCl7bGV0IGU9dC51bnJlYWQ7aWYoIWUpcmV0dXJuIHZvaWQgdGhpcy5yZW1vdmVGcm9tU3RhY2sodCk7bGV0IHI9dC5hcnJheUxlbmd0aC1lLG49dC52YWx1ZVtyXTt0LnVucmVhZC09MSx0aGlzLmFkZFRvU3RhY2sobix2b2lkIDAscix0KX0sZS5wcm90b3R5cGUucHJvY2Vzc1ByaW1pdGl2ZT1mdW5jdGlvbih0KXtpZih2b2lkIDAhPT10LnZhbHVlKXtsZXQgZSxyPXR5cGVvZiB0LnZhbHVlO3N3aXRjaChyKXtjYXNlInN0cmluZyI6ZT1fbih0LnZhbHVlKTticmVhaztjYXNlIm51bWJlciI6ZT1OdW1iZXIuaXNGaW5pdGUodC52YWx1ZSk/U3RyaW5nKHQudmFsdWUpOiJudWxsIjticmVhaztjYXNlImJvb2xlYW4iOmU9U3RyaW5nKHQudmFsdWUpO2JyZWFrO2Nhc2Uib2JqZWN0Ijp0LnZhbHVlfHwoZT0ibnVsbCIpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoJ1Vua25vd24gdHlwZSAiJytyKyciLiBQbGVhc2UgZmlsZSBhbiBpc3N1ZSEnKSx7dmFsdWU6dC52YWx1ZX0pfXRoaXMuX3B1c2goZSl9ZWxzZSF0aGlzLnN0YWNrWzFdfHx0aGlzLnN0YWNrWzFdLnR5cGUhPT1wbi5BcnJheSYmdGhpcy5zdGFja1sxXS50eXBlIT09cG4uUmVhZGFibGVPYmplY3Q/dC5hZGRTZXBhcmF0b3JBZnRlckVuZD0hMTp0aGlzLl9wdXNoKCJudWxsIik7dGhpcy5yZW1vdmVGcm9tU3RhY2sodCl9LGUucHJvdG90eXBlLnByb2Nlc3NSZWFkYWJsZVN0cmluZz1mdW5jdGlvbih0LGUpe2xldCByPXRoaXM7aWYoIXQuZW5kKXJldHVybiBTbih0LnZhbHVlLGUpLnRoZW4oKGZ1bmN0aW9uKHQpe3QmJnIuX3B1c2god24odC50b1N0cmluZygpKSl9KSk7dGhpcy5yZW1vdmVGcm9tU3RhY2sodCl9LGUucHJvdG90eXBlLnByb2Nlc3NQcm9taXNlPWZ1bmN0aW9uKHQpe2xldCBlPXRoaXM7cmV0dXJuIEVuKHQudmFsdWUpLnRoZW4oKGZ1bmN0aW9uKHIpe2UucmVtb3ZlRnJvbVN0YWNrKHQpLGUuYWRkVG9TdGFjayhyLHQua2V5LHQuaW5kZXgsdC5wYXJlbnQpfSkpfSxlLnByb3RvdHlwZS5wcm9jZXNzU3RhY2tUb3BJdGVtPWZ1bmN0aW9uKHQpe2xldCBlLHI9dGhpcyxuPXRoaXMuc3RhY2tbMF07aWYoIW58fHRoaXMuZXJyb3IpcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO3RyeXtlPXRoaXNbbW5bbi50eXBlXV0obix0KX1jYXRjaCh0KXtyZXR1cm4gUHJvbWlzZS5yZWplY3QodCl9cmV0dXJuIFByb21pc2UucmVzb2x2ZShlKS50aGVuKChmdW5jdGlvbigpezA9PT1yLnN0YWNrLmxlbmd0aCYmKHIuZW5kPSEwLHIuX3B1c2gobnVsbCkpfSkpfSxlLnByb3RvdHlwZS5fX3JlYWQ9ZnVuY3Rpb24odCl7bGV0IGU9dGhpcztpZighdGhpcy5pc1JlYWRpbmcmJiF0aGlzLmVycm9yKXJldHVybiB0aGlzLmlzUmVhZGluZz0hMCx0aGlzLnJlYWRNb3JlPSExLHRoaXMucHJvY2Vzc1N0YWNrVG9wSXRlbSh0KS50aGVuKChmdW5jdGlvbigpeyFlLmVuZCYmIWUuZXJyb3ImJihlLnJlYWRNb3JlfHwhZS5wdXNoQ2FsbGVkKT91cigoZnVuY3Rpb24oKXtlLmlzUmVhZGluZz0hMSxlLl9fcmVhZCgpfSkpOmUuaXNSZWFkaW5nPSExfSkpLmNhdGNoKChmdW5jdGlvbih0KXtlLmVycm9yPSEwLGUuZW1pdCgiZXJyb3IiLHQpfSkpO3RoaXMucmVhZE1vcmU9ITB9LGUucHJvdG90eXBlLl9yZWFkPWZ1bmN0aW9uKHQpe3RoaXMucHVzaENhbGxlZD0hMSx0aGlzLl9fcmVhZCh0KX0sZS5wcm90b3R5cGUucGF0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YWNrLm1hcCgoZnVuY3Rpb24odCl7bGV0IGU9dC5rZXkscj10LmluZGV4O3JldHVybiBlfHxyfSkpLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIHR8fHQ+LTF9KSkucmV2ZXJzZSgpfSxlfShwZSk7dmFyIFJuPUFycmF5LmlzQXJyYXksQW49Im9iamVjdCI9PXR5cGVvZiBIZSYmSGUmJkhlLk9iamVjdD09PU9iamVjdCYmSGUsVG49Im9iamVjdCI9PXR5cGVvZiBzZWxmJiZzZWxmJiZzZWxmLk9iamVjdD09PU9iamVjdCYmc2VsZixPbj1Bbnx8VG58fEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCksam49T24uU3ltYm9sLExuPU9iamVjdC5wcm90b3R5cGUsQ249TG4uaGFzT3duUHJvcGVydHksUG49TG4udG9TdHJpbmcsTW49am4/am4udG9TdHJpbmdUYWc6dm9pZCAwO3ZhciBCbj1mdW5jdGlvbih0KXt2YXIgZT1Dbi5jYWxsKHQsTW4pLHI9dFtNbl07dHJ5e3RbTW5dPXZvaWQgMDt2YXIgbj0hMH1jYXRjaCh0KXt9dmFyIGk9UG4uY2FsbCh0KTtyZXR1cm4gbiYmKGU/dFtNbl09cjpkZWxldGUgdFtNbl0pLGl9LHhuPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7dmFyIFVuPWZ1bmN0aW9uKHQpe3JldHVybiB4bi5jYWxsKHQpfSxJbj1qbj9qbi50b1N0cmluZ1RhZzp2b2lkIDA7dmFyIERuPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3ZvaWQgMD09PXQ/IltvYmplY3QgVW5kZWZpbmVkXSI6IltvYmplY3QgTnVsbF0iOkluJiZJbiBpbiBPYmplY3QodCk/Qm4odCk6VW4odCl9O3ZhciBObj1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dCYmIm9iamVjdCI9PXR5cGVvZiB0fTt2YXIgRm49ZnVuY3Rpb24odCl7cmV0dXJuInN5bWJvbCI9PXR5cGVvZiB0fHxObih0KSYmIltvYmplY3QgU3ltYm9sXSI9PURuKHQpfSx6bj0vXC58XFsoPzpbXltcXV0qfChbIiddKSg/Oig/IVwxKVteXFxdfFxcLikqP1wxKVxdLyxxbj0vXlx3KiQvO3ZhciBZbj1mdW5jdGlvbih0LGUpe2lmKFJuKHQpKXJldHVybiExO3ZhciByPXR5cGVvZiB0O3JldHVybiEoIm51bWJlciIhPXImJiJzeW1ib2wiIT1yJiYiYm9vbGVhbiIhPXImJm51bGwhPXQmJiFGbih0KSl8fChxbi50ZXN0KHQpfHwhem4udGVzdCh0KXx8bnVsbCE9ZSYmdCBpbiBPYmplY3QoZSkpfTt2YXIgV249ZnVuY3Rpb24odCl7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuIG51bGwhPXQmJigib2JqZWN0Ij09ZXx8ImZ1bmN0aW9uIj09ZSl9O3ZhciAkbixHbj1mdW5jdGlvbih0KXtpZighV24odCkpcmV0dXJuITE7dmFyIGU9RG4odCk7cmV0dXJuIltvYmplY3QgRnVuY3Rpb25dIj09ZXx8IltvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dIj09ZXx8IltvYmplY3QgQXN5bmNGdW5jdGlvbl0iPT1lfHwiW29iamVjdCBQcm94eV0iPT1lfSxKbj1PblsiX19jb3JlLWpzX3NoYXJlZF9fIl0sSG49KCRuPS9bXi5dKyQvLmV4ZWMoSm4mJkpuLmtleXMmJkpuLmtleXMuSUVfUFJPVE98fCIiKSk/IlN5bWJvbChzcmMpXzEuIiskbjoiIjt2YXIgVm49ZnVuY3Rpb24odCl7cmV0dXJuISFIbiYmSG4gaW4gdH0sS249RnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nO3ZhciBabj1mdW5jdGlvbih0KXtpZihudWxsIT10KXt0cnl7cmV0dXJuIEtuLmNhbGwodCl9Y2F0Y2godCl7fXRyeXtyZXR1cm4gdCsiIn1jYXRjaCh0KXt9fXJldHVybiIifSxRbj0vXlxbb2JqZWN0IC4rP0NvbnN0cnVjdG9yXF0kLyxYbj1GdW5jdGlvbi5wcm90b3R5cGUsdGk9T2JqZWN0LnByb3RvdHlwZSxlaT1Ybi50b1N0cmluZyxyaT10aS5oYXNPd25Qcm9wZXJ0eSxuaT1SZWdFeHAoIl4iK2VpLmNhbGwocmkpLnJlcGxhY2UoL1tcXF4kLiorPygpW1xde318XS9nLCJcXCQmIikucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXCgpfCBmb3IgLis/KD89XFxcXSkvZywiJDEuKj8iKSsiJCIpO3ZhciBpaT1mdW5jdGlvbih0KXtyZXR1cm4hKCFXbih0KXx8Vm4odCkpJiYoR24odCk/bmk6UW4pLnRlc3QoWm4odCkpfTt2YXIgb2k9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09dD92b2lkIDA6dFtlXX07dmFyIHNpPWZ1bmN0aW9uKHQsZSl7dmFyIHI9b2kodCxlKTtyZXR1cm4gaWkocik/cjp2b2lkIDB9LGFpPXNpKE9iamVjdCwiY3JlYXRlIik7dmFyIHVpPWZ1bmN0aW9uKCl7dGhpcy5fX2RhdGFfXz1haT9haShudWxsKTp7fSx0aGlzLnNpemU9MH07dmFyIGhpPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuaGFzKHQpJiZkZWxldGUgdGhpcy5fX2RhdGFfX1t0XTtyZXR1cm4gdGhpcy5zaXplLT1lPzE6MCxlfSxmaT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciBjaT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fO2lmKGFpKXt2YXIgcj1lW3RdO3JldHVybiJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIj09PXI/dm9pZCAwOnJ9cmV0dXJuIGZpLmNhbGwoZSx0KT9lW3RdOnZvaWQgMH0sbGk9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgcGk9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXztyZXR1cm4gYWk/dm9pZCAwIT09ZVt0XTpsaS5jYWxsKGUsdCl9O3ZhciBkaT1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuX19kYXRhX187cmV0dXJuIHRoaXMuc2l6ZSs9dGhpcy5oYXModCk/MDoxLHJbdF09YWkmJnZvaWQgMD09PWU/Il9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iOmUsdGhpc307ZnVuY3Rpb24gZ2kodCl7dmFyIGU9LTEscj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8cjspe3ZhciBuPXRbZV07dGhpcy5zZXQoblswXSxuWzFdKX19Z2kucHJvdG90eXBlLmNsZWFyPXVpLGdpLnByb3RvdHlwZS5kZWxldGU9aGksZ2kucHJvdG90eXBlLmdldD1jaSxnaS5wcm90b3R5cGUuaGFzPXBpLGdpLnByb3RvdHlwZS5zZXQ9ZGk7dmFyIHlpPWdpO3ZhciB2aT1mdW5jdGlvbigpe3RoaXMuX19kYXRhX189W10sdGhpcy5zaXplPTB9O3ZhciBiaT1mdW5jdGlvbih0LGUpe3JldHVybiB0PT09ZXx8dCE9dCYmZSE9ZX07dmFyIG1pPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPXQubGVuZ3RoO3ItLTspaWYoYmkodFtyXVswXSxlKSlyZXR1cm4gcjtyZXR1cm4tMX0sd2k9QXJyYXkucHJvdG90eXBlLnNwbGljZTt2YXIgX2k9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxyPW1pKGUsdCk7cmV0dXJuIShyPDApJiYocj09ZS5sZW5ndGgtMT9lLnBvcCgpOndpLmNhbGwoZSxyLDEpLC0tdGhpcy5zaXplLCEwKX07dmFyIFNpPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX18scj1taShlLHQpO3JldHVybiByPDA/dm9pZCAwOmVbcl1bMV19O3ZhciBFaT1mdW5jdGlvbih0KXtyZXR1cm4gbWkodGhpcy5fX2RhdGFfXyx0KT4tMX07dmFyIGtpPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5fX2RhdGFfXyxuPW1pKHIsdCk7cmV0dXJuIG48MD8oKyt0aGlzLnNpemUsci5wdXNoKFt0LGVdKSk6cltuXVsxXT1lLHRoaXN9O2Z1bmN0aW9uIFJpKHQpe3ZhciBlPS0xLHI9bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPHI7KXt2YXIgbj10W2VdO3RoaXMuc2V0KG5bMF0sblsxXSl9fVJpLnByb3RvdHlwZS5jbGVhcj12aSxSaS5wcm90b3R5cGUuZGVsZXRlPV9pLFJpLnByb3RvdHlwZS5nZXQ9U2ksUmkucHJvdG90eXBlLmhhcz1FaSxSaS5wcm90b3R5cGUuc2V0PWtpO3ZhciBBaT1SaSxUaT1zaShPbiwiTWFwIik7dmFyIE9pPWZ1bmN0aW9uKCl7dGhpcy5zaXplPTAsdGhpcy5fX2RhdGFfXz17aGFzaDpuZXcgeWksbWFwOm5ldyhUaXx8QWkpLHN0cmluZzpuZXcgeWl9fTt2YXIgamk9ZnVuY3Rpb24odCl7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuInN0cmluZyI9PWV8fCJudW1iZXIiPT1lfHwic3ltYm9sIj09ZXx8ImJvb2xlYW4iPT1lPyJfX3Byb3RvX18iIT09dDpudWxsPT09dH07dmFyIExpPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dC5fX2RhdGFfXztyZXR1cm4gamkoZSk/clsic3RyaW5nIj09dHlwZW9mIGU/InN0cmluZyI6Imhhc2giXTpyLm1hcH07dmFyIENpPWZ1bmN0aW9uKHQpe3ZhciBlPUxpKHRoaXMsdCkuZGVsZXRlKHQpO3JldHVybiB0aGlzLnNpemUtPWU/MTowLGV9O3ZhciBQaT1mdW5jdGlvbih0KXtyZXR1cm4gTGkodGhpcyx0KS5nZXQodCl9O3ZhciBNaT1mdW5jdGlvbih0KXtyZXR1cm4gTGkodGhpcyx0KS5oYXModCl9O3ZhciBCaT1mdW5jdGlvbih0LGUpe3ZhciByPUxpKHRoaXMsdCksbj1yLnNpemU7cmV0dXJuIHIuc2V0KHQsZSksdGhpcy5zaXplKz1yLnNpemU9PW4/MDoxLHRoaXN9O2Z1bmN0aW9uIHhpKHQpe3ZhciBlPS0xLHI9bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPHI7KXt2YXIgbj10W2VdO3RoaXMuc2V0KG5bMF0sblsxXSl9fXhpLnByb3RvdHlwZS5jbGVhcj1PaSx4aS5wcm90b3R5cGUuZGVsZXRlPUNpLHhpLnByb3RvdHlwZS5nZXQ9UGkseGkucHJvdG90eXBlLmhhcz1NaSx4aS5wcm90b3R5cGUuc2V0PUJpO3ZhciBVaT14aTtmdW5jdGlvbiBJaSh0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0fHxudWxsIT1lJiYiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJFeHBlY3RlZCBhIGZ1bmN0aW9uIik7dmFyIHI9ZnVuY3Rpb24oKXt2YXIgbj1hcmd1bWVudHMsaT1lP2UuYXBwbHkodGhpcyxuKTpuWzBdLG89ci5jYWNoZTtpZihvLmhhcyhpKSlyZXR1cm4gby5nZXQoaSk7dmFyIHM9dC5hcHBseSh0aGlzLG4pO3JldHVybiByLmNhY2hlPW8uc2V0KGkscyl8fG8sc307cmV0dXJuIHIuY2FjaGU9bmV3KElpLkNhY2hlfHxVaSkscn1JaS5DYWNoZT1VaTt2YXIgRGk9SWk7dmFyIE5pPS9bXi5bXF1dK3xcWyg/OigtP1xkKyg/OlwuXGQrKT8pfChbIiddKSgoPzooPyFcMilbXlxcXXxcXC4pKj8pXDIpXF18KD89KD86XC58XFtcXSkoPzpcLnxcW1xdfCQpKS9nLEZpPS9cXChcXCk/L2csemk9ZnVuY3Rpb24odCl7dmFyIGU9RGkodCwoZnVuY3Rpb24odCl7cmV0dXJuIDUwMD09PXIuc2l6ZSYmci5jbGVhcigpLHR9KSkscj1lLmNhY2hlO3JldHVybiBlfSgoZnVuY3Rpb24odCl7dmFyIGU9W107cmV0dXJuIDQ2PT09dC5jaGFyQ29kZUF0KDApJiZlLnB1c2goIiIpLHQucmVwbGFjZShOaSwoZnVuY3Rpb24odCxyLG4saSl7ZS5wdXNoKG4/aS5yZXBsYWNlKEZpLCIkMSIpOnJ8fHQpfSkpLGV9KSk7dmFyIHFpPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPS0xLG49bnVsbD09dD8wOnQubGVuZ3RoLGk9QXJyYXkobik7KytyPG47KWlbcl09ZSh0W3JdLHIsdCk7cmV0dXJuIGl9LFlpPWpuP2puLnByb3RvdHlwZTp2b2lkIDAsV2k9WWk/WWkudG9TdHJpbmc6dm9pZCAwO3ZhciAkaT1mdW5jdGlvbiB0KGUpe2lmKCJzdHJpbmciPT10eXBlb2YgZSlyZXR1cm4gZTtpZihSbihlKSlyZXR1cm4gcWkoZSx0KSsiIjtpZihGbihlKSlyZXR1cm4gV2k/V2kuY2FsbChlKToiIjt2YXIgcj1lKyIiO3JldHVybiIwIj09ciYmMS9lPT0tSW5maW5pdHk/Ii0wIjpyfTt2YXIgR2k9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/IiI6JGkodCl9O3ZhciBKaT1mdW5jdGlvbih0LGUpe3JldHVybiBSbih0KT90OlluKHQsZSk/W3RdOnppKEdpKHQpKX07dmFyIEhpPWZ1bmN0aW9uKHQpe2lmKCJzdHJpbmciPT10eXBlb2YgdHx8Rm4odCkpcmV0dXJuIHQ7dmFyIGU9dCsiIjtyZXR1cm4iMCI9PWUmJjEvdD09LUluZmluaXR5PyItMCI6ZX07dmFyIFZpPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPTAsbj0oZT1KaShlLHQpKS5sZW5ndGg7bnVsbCE9dCYmcjxuOyl0PXRbSGkoZVtyKytdKV07cmV0dXJuIHImJnI9PW4/dDp2b2lkIDB9O3ZhciBLaT1mdW5jdGlvbih0LGUscil7dmFyIG49bnVsbD09dD92b2lkIDA6VmkodCxlKTtyZXR1cm4gdm9pZCAwPT09bj9yOm59O3ZhciBaaT1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHR8fE5uKHQpJiYiW29iamVjdCBOdW1iZXJdIj09RG4odCl9O2Z1bmN0aW9uIFFpKHQpe3JldHVybiJbb2JqZWN0IFN0cmluZ10iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIFhpKHQpe3JldHVybiEoIVFpKHQpfHwiIj09PXQpfWZ1bmN0aW9uIHRvKHQpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZnVuY3Rpb24gZW8odCl7cmV0dXJuIltvYmplY3QgVW5kZWZpbmVkXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZnVuY3Rpb24gcm8odCl7cmV0dXJuIltvYmplY3QgT2JqZWN0XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZnVuY3Rpb24gbm8odCl7cmV0dXJuISghUWkodCl8fCIiIT09dCl9ZnVuY3Rpb24gaW8odCl7cmV0dXJuISFlbyh0KXx8KCEhZnVuY3Rpb24odCl7cmV0dXJuIltvYmplY3QgTnVsbF0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfSh0KXx8KCEhZnVuY3Rpb24odCl7aWYocm8odCkpe2ZvcihsZXQgZSBpbiB0KXJldHVybiExO3JldHVybiEwfXJldHVybiExfSh0KXx8KCEhbm8odCl8fCEhZnVuY3Rpb24odCl7cmV0dXJuISF0byh0KSYmMD09PXQubGVuZ3RofSh0KSkpKX1mdW5jdGlvbiBvbygpe2xldCB0LGUscj1uZXcgUHJvbWlzZSgoZnVuY3Rpb24oKXt0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXX0pKTtyZXR1cm4gci5yZXNvbHZlPXQsci5yZWplY3Q9ZSxyfWxldCBXSnNvblN0cmVhbT17cGFyc2U6YXN5bmMgZnVuY3Rpb24odCl7aWYoIVhpKHQpKXJldHVybnt9O2xldCBlPXt9O3RyeXtlPUpTT04ucGFyc2UodCl9Y2F0Y2godCl7ZT17fX1yZXR1cm4gZX0scGFyc2VCeVN0cmVhbTpmdW5jdGlvbih0KXtsZXQgZT17fTtpZigibnVsbCI9PT10KXJldHVybiBudWxsO2lmKCIiPT09dClyZXR1cm57fTtsZXQgcj0iX19zeXN0ZW1fXyIsbj1geyJfX3N5c3RlbV9fIjoke3R9fWAsaT1vbygpLG89eXIobikscz1jbi5wYXJzZSgiJCoiKTtyZXR1cm4gcy5vbigiZGF0YSIsKGZ1bmN0aW9uKHQpe2VbdC5rZXldPXQudmFsdWV9KSkscy5vbigiZW5kIiwoZnVuY3Rpb24oKXtsZXQgdD1LaShlLHIpO2kucmVzb2x2ZSh0KX0pKSxzLm9uKCJlcnJvciIsKGZ1bmN0aW9uKHQpe2kucmVqZWN0KHQpfSkpLG8ucGlwZShzKSxpfSxjcmVhdGVQYXJzZVN0cmVhbTpmdW5jdGlvbih0KXtyZXR1cm4gWGkodCl8fGZ1bmN0aW9uKHQpe3JldHVybiEoIXRvKHQpfHwwPT09dC5sZW5ndGh8fDE9PT10Lmxlbmd0aCYmaW8odFswXSkpfSh0KXx8KHQ9IiQqIiksY24ucGFyc2UodCl9LHN0cmluZ2lmeTphc3luYyBmdW5jdGlvbih0KXtpZihlbyh0KSlyZXR1cm4iIjtsZXQgZT0iIjt0cnl7ZT1KU09OLnN0cmluZ2lmeSh0KX1jYXRjaCh0KXtlPSIifXJldHVybiBlfSxzdHJpbmdpZnlCeVN0cmVhbTpmdW5jdGlvbih0KXtsZXQgZT0iIjtpZihlbyh0KSlyZXR1cm4iIjtpZihudWxsPT09dClyZXR1cm4ibnVsbCI7aWYobm8odCkpcmV0dXJuJyIiJztpZihaaSh0KSlyZXR1cm5gJHt0fWA7aWYoUWkodCkpcmV0dXJuYCIke3R9ImA7bGV0IHI9b28oKSxuPW5ldyBrbih0LG51bGwsbnVsbCwhMSk7cmV0dXJuIG4ub24oImRhdGEiLChmdW5jdGlvbih0KXtlKz10fSkpLG4ub24oImVuZCIsKGZ1bmN0aW9uKCl7ci5yZXNvbHZlKGUpfSkpLG4ub24oImVycm9yIiwoZnVuY3Rpb24odCl7ci5yZWplY3QodCl9KSkscn0sY3JlYXRlU3RyaW5naWZ5U3RyZWFtOmZ1bmN0aW9uKHQpe2lmKCFybyh0KSYmIXRvKHQpKXRocm93IG5ldyBFcnJvcigiZGF0YSBpcyBub3Qgb2JqZWN0IG9yIGFycmF5Iik7cmV0dXJuIG5ldyBrbih0LG51bGwsbnVsbCwhMSl9fTsKCmxldCBpbnN0YW5jZSA9IG51bGwKZnVuY3Rpb24gaW5pdChpbnB1dCl7CgogICAgLy9pbml0CiAgICBsZXQgcgogICAgCiAgICAgICAgciA9IFdKc29uU3RyZWFtKC4uLmlucHV0KQogICAgICAgIAoKICAgIC8vb24KICAgIAoKICAgIC8vc2F2ZQogICAgaW5zdGFuY2UgPSByCgp9CgpmdW5jdGlvbiBzZW5kTWVzc2FnZShkYXRhKSB7CiAgICAKICAgICAgICBwYXJlbnRQb3J0LnBvc3RNZXNzYWdlKGRhdGEpCiAgICAgICAgCn0KCmFzeW5jIGZ1bmN0aW9uIHJ1bihkYXRhKSB7CiAgICAvLyBjb25zb2xlLmxvZygnaW5uZXIgd29ya2VyIHJ1bicsZGF0YSkKCiAgICAvL21vZGUKICAgIGxldCBtb2RlID0gZGF0YS5tb2RlCgogICAgLy9jaGVjawogICAgaWYobW9kZSAhPT0gJ2luaXQnICYmIG1vZGUgIT09ICdjYWxsJyl7CiAgICAgICAgcmV0dXJuCiAgICB9CgogICAgLy9pbml0CiAgICBpZihtb2RlID09PSAnaW5pdCcpewogICAgICAgIAogICAgICAgIHRyeXsKCiAgICAgICAgICAgIC8vdHlwZQogICAgICAgICAgICBsZXQgdHlwZSA9IGRhdGEudHlwZQoKICAgICAgICAgICAgLy9pbnB1dAogICAgICAgICAgICBsZXQgaW5wdXQgPSBkYXRhLmlucHV0CiAgICAKICAgICAgICAgICAgLy9pbnN0YW5jZQogICAgICAgICAgICBpZih0eXBlID09PSAnZnVuY3Rpb24nKXsKICAgICAgICAgICAgICAgIGluaXQoLi4uaW5wdXQpCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZih0eXBlID09PSAnb2JqZWN0Jyl7CiAgICAgICAgICAgICAgICBpbnN0YW5jZSA9IFdKc29uU3RyZWFtCiAgICAgICAgICAgIH0KCiAgICAgICAgfQogICAgICAgIGNhdGNoKGVycil7CiAgICAgICAgCiAgICAgICAgICAgIC8vc2VuZE1lc3NhZ2UKICAgICAgICAgICAgbGV0IHJlcyA9IHsKICAgICAgICAgICAgICAgIG1vZGU6ICdlbWl0JywKICAgICAgICAgICAgICAgIGV2TmFtZTogJ2Vycm9yJywKICAgICAgICAgICAgICAgIG1zZzogZXJyLAogICAgICAgICAgICB9CiAgICAgICAgICAgIHNlbmRNZXNzYWdlKHJlcykKCiAgICAgICAgfQogICAgICAgICAgICAKICAgIH0KCiAgICAvL2NoZWNrCiAgICBpZihtb2RlID09PSAnY2FsbCcpewogICAgICAgIGxldCBzdGF0ZSA9ICcnCiAgICAgICAgbGV0IG1zZyA9IG51bGwKCiAgICAgICAgdHJ5ewoKICAgICAgICAgICAgLy9mdW4KICAgICAgICAgICAgbGV0IGZ1biA9IGluc3RhbmNlW2RhdGEuZnVuXQoKICAgICAgICAgICAgLy9pbnB1dAogICAgICAgICAgICBsZXQgaW5wdXQgPSBkYXRhLmlucHV0CgogICAgICAgICAgICAvL2V4ZWMKICAgICAgICAgICAgYXdhaXQgZnVuKC4uLmlucHV0KQogICAgICAgICAgICAgICAgLnRoZW4oKHN1YykgPT4gewogICAgICAgICAgICAgICAgICAgIHN0YXRlPSdzdWNjZXNzJwogICAgICAgICAgICAgICAgICAgIG1zZz1zdWMKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAuY2F0Y2goKGVycikgPT4gewogICAgICAgICAgICAgICAgICAgIHN0YXRlPSdlcnJvcicKICAgICAgICAgICAgICAgICAgICBtc2c9ZXJyCiAgICAgICAgICAgICAgICB9KQoKICAgICAgICB9CiAgICAgICAgY2F0Y2goZXJyKXsKICAgICAgICAgICAgc3RhdGUgPSAnZXJyb3InCiAgICAgICAgICAgIG1zZyA9IGVycgogICAgICAgIH0KICAgICAgICAKICAgICAgICAvL3NlbmRNZXNzYWdlCiAgICAgICAgbGV0IHJlcyA9IHsKICAgICAgICAgICAgbW9kZTogJ3JldHVybicsCiAgICAgICAgICAgIGlkOiBkYXRhLmlkLAogICAgICAgICAgICBmdW46IGRhdGEuZnVuLAogICAgICAgICAgICBzdGF0ZSwKICAgICAgICAgICAgbXNnLAogICAgICAgIH0KICAgICAgICBzZW5kTWVzc2FnZShyZXMpCgogICAgfQoKfQoKZnVuY3Rpb24gcmVjdk1lc3NhZ2UoZGF0YSkgewogICAgLy8gY29uc29sZS5sb2coJ2lubmVyIHdvcmtlciByZWN2OicsIGRhdGEpCgogICAgLy9kYXRhUmVjdgogICAgbGV0IGRhdGFSZWN2ID0gZGF0YQoKICAgIC8vcnVuCiAgICBydW4oZGF0YVJlY3YpCgp9CgoKICAgICAgICBwYXJlbnRQb3J0Lm9uKCdtZXNzYWdlJywgcmVjdk1lc3NhZ2UpCiAgICAgICAgCgo=",Buffer.from(G,"base64").toString("utf8"));function y(){var d=Z();function b(Z){try{return new l.Worker(Z,{eval:!0})}catch(l){p(l)}}var G=b(X);if(!G)return p("invalid worker"),null;function i(){G?(G.terminate(),G=void 0):p("worker has been terminated")}function W(){var l={mode:"init",type:"object",input:Array.prototype.slice.call(arguments)};G.postMessage(l)}function u(){var l=m(),Z=c(),b={mode:"call",id:Z,fun:"stringify",input:Array.prototype.slice.call(arguments)};return G.postMessage(b),d.once(Z,(function(Z){"success"===Z.state?l.resolve(Z.msg):l.reject(Z.msg)})),l}function y(){var l=m(),Z=c(),b={mode:"call",id:Z,fun:"parse",input:Array.prototype.slice.call(arguments)};return G.postMessage(b),d.once(Z,(function(Z){"success"===Z.state?l.resolve(Z.msg):l.reject(Z.msg)})),l}function I(l){var Z=l,m=Z.mode;"emit"!==m&&"return"!==m||("emit"===m&&d.emit(Z.evName,Z.msg),"return"===m&&d.emit(Z.id,Z))}function p(l){d.emit("error",l)}return G.on("message",I),G.on("error",p),W(Array.prototype.slice.call(arguments)),d.stringify=u,d.parse=y,d.terminate=i,d}var I,p,V={stringify:(p=b(W.mark((function l(){var Z,m,c,b=arguments;return W.wrap((function(l){for(;;)switch(l.prev=l.next){case 0:return Z=Array.prototype.slice.call(b),m=y(),l.next=4,m.stringify.apply(m,d(Z)).finally((function(){m.terminate()}));case 4:return c=l.sent,l.abrupt("return",c);case 6:case"end":return l.stop()}}),l)}))),function(){return p.apply(this,arguments)}),parse:(I=b(W.mark((function l(){var Z,m,c,b=arguments;return W.wrap((function(l){for(;;)switch(l.prev=l.next){case 0:return Z=Array.prototype.slice.call(b),m=y(),l.next=4,m.parse.apply(m,d(Z)).finally((function(){m.terminate()}));case 4:return c=l.sent,l.abrupt("return",c);case 6:case"end":return l.stop()}}),l)}))),function(){return I.apply(this,arguments)})};for(var h in i=Z(),V){var a=V[h];i[h]=a}}(),i}(d.default)})),G=c((function(l,Z){l.exports=function(){function l(l,Z){(null==Z||Z>l.length)&&(Z=l.length);for(var d=0,m=new Array(Z);d<Z;d++)m[d]=l[d];return m}function Z(Z){return function(Z){if(Array.isArray(Z))return l(Z)}(Z)||function(l){if("undefined"!=typeof Symbol&&null!=l[Symbol.iterator]||null!=l["@@iterator"])return Array.from(l)}(Z)||function(Z,d){if(Z){if("string"==typeof Z)return l(Z,d);var m=Object.prototype.toString.call(Z).slice(8,-1);return"Object"===m&&Z.constructor&&(m=Z.constructor.name),"Map"===m||"Set"===m?Array.from(Z):"Arguments"===m||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(m)?l(Z,d):void 0}}(Z)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function d(l,Z,d,m,c,b,G){try{var X=l[b](G),i=X.value}catch(l){return void d(l)}X.done?Z(i):Promise.resolve(i).then(m,c)}function c(l){return function(){var Z=this,m=arguments;return new Promise((function(c,b){var G=l.apply(Z,m);function X(l){d(G,c,b,X,i,"next",l)}function i(l){d(G,c,b,X,i,"throw",l)}X(void 0)}))}}function b(l){return b="function"==typeof Symbol&&"symbol"==m(Symbol.iterator)?function(l){return m(l)}:function(l){return l&&"function"==typeof Symbol&&l.constructor===Symbol&&l!==Symbol.prototype?"symbol":m(l)},b(l)}function G(l){var Z={exports:{}};return l(Z,Z.exports),Z.exports}var X,i,W=G((function(l){var Z=function(l){var Z,d=Object.prototype,m=d.hasOwnProperty,c="function"==typeof Symbol?Symbol:{},G=c.iterator||"@@iterator",X=c.asyncIterator||"@@asyncIterator",i=c.toStringTag||"@@toStringTag";function W(l,Z,d){return Object.defineProperty(l,Z,{value:d,enumerable:!0,configurable:!0,writable:!0}),l[Z]}try{W({},"")}catch(l){W=function(l,Z,d){return l[Z]=d}}function u(l,Z,d,m){var c=Z&&Z.prototype instanceof n?Z:n,b=Object.create(c.prototype),G=new x(m||[]);return b._invoke=function(l,Z,d){var m=I;return function(c,b){if(m===V)throw new Error("Generator is already running");if(m===h){if("throw"===c)throw b;return g()}for(d.method=c,d.arg=b;;){var G=d.delegate;if(G){var X=H(G,d);if(X){if(X===a)continue;return X}}if("next"===d.method)d.sent=d._sent=d.arg;else if("throw"===d.method){if(m===I)throw m=h,d.arg;d.dispatchException(d.arg)}else"return"===d.method&&d.abrupt("return",d.arg);m=V;var i=y(l,Z,d);if("normal"===i.type){if(m=d.done?h:p,i.arg===a)continue;return{value:i.arg,done:d.done}}"throw"===i.type&&(m=h,d.method="throw",d.arg=i.arg)}}}(l,d,G),b}function y(l,Z,d){try{return{type:"normal",arg:l.call(Z,d)}}catch(l){return{type:"throw",arg:l}}}l.wrap=u;var I="suspendedStart",p="suspendedYield",V="executing",h="completed",a={};function n(){}function o(){}function K(){}var Y={};W(Y,G,(function(){return this}));var R=Object.getPrototypeOf,L=R&&R(R(T([])));L&&L!==d&&m.call(L,G)&&(Y=L);var s=K.prototype=n.prototype=Object.create(Y);function J(l){["next","throw","return"].forEach((function(Z){W(l,Z,(function(l){return this._invoke(Z,l)}))}))}function t(l,Z){function d(c,G,X,i){var W=y(l[c],l,G);if("throw"!==W.type){var u=W.arg,I=u.value;return I&&"object"===b(I)&&m.call(I,"__await")?Z.resolve(I.__await).then((function(l){d("next",l,X,i)}),(function(l){d("throw",l,X,i)})):Z.resolve(I).then((function(l){u.value=l,X(u)}),(function(l){return d("throw",l,X,i)}))}i(W.arg)}var c;this._invoke=function(l,m){function b(){return new Z((function(Z,c){d(l,m,Z,c)}))}return c=c?c.then(b,b):b()}}function H(l,d){var m=l.iterator[d.method];if(m===Z){if(d.delegate=null,"throw"===d.method){if(l.iterator.return&&(d.method="return",d.arg=Z,H(l,d),"throw"===d.method))return a;d.method="throw",d.arg=new TypeError("The iterator does not provide a 'throw' method")}return a}var c=y(m,l.iterator,d.arg);if("throw"===c.type)return d.method="throw",d.arg=c.arg,d.delegate=null,a;var b=c.arg;return b?b.done?(d[l.resultName]=b.value,d.next=l.nextLoc,"return"!==d.method&&(d.method="next",d.arg=Z),d.delegate=null,a):b:(d.method="throw",d.arg=new TypeError("iterator result is not an object"),d.delegate=null,a)}function S(l){var Z={tryLoc:l[0]};1 in l&&(Z.catchLoc=l[1]),2 in l&&(Z.finallyLoc=l[2],Z.afterLoc=l[3]),this.tryEntries.push(Z)}function C(l){var Z=l.completion||{};Z.type="normal",delete Z.arg,l.completion=Z}function x(l){this.tryEntries=[{tryLoc:"root"}],l.forEach(S,this),this.reset(!0)}function T(l){if(l){var d=l[G];if(d)return d.call(l);if("function"==typeof l.next)return l;if(!isNaN(l.length)){var c=-1,b=function d(){for(;++c<l.length;)if(m.call(l,c))return d.value=l[c],d.done=!1,d;return d.value=Z,d.done=!0,d};return b.next=b}}return{next:g}}function g(){return{value:Z,done:!0}}return o.prototype=K,W(s,"constructor",K),W(K,"constructor",o),o.displayName=W(K,i,"GeneratorFunction"),l.isGeneratorFunction=function(l){var Z="function"==typeof l&&l.constructor;return!!Z&&(Z===o||"GeneratorFunction"===(Z.displayName||Z.name))},l.mark=function(l){return Object.setPrototypeOf?Object.setPrototypeOf(l,K):(l.__proto__=K,W(l,i,"GeneratorFunction")),l.prototype=Object.create(s),l},l.awrap=function(l){return{__await:l}},J(t.prototype),W(t.prototype,X,(function(){return this})),l.AsyncIterator=t,l.async=function(Z,d,m,c,b){void 0===b&&(b=Promise);var G=new t(u(Z,d,m,c),b);return l.isGeneratorFunction(d)?G:G.next().then((function(l){return l.done?l.value:G.next()}))},J(s),W(s,i,"Generator"),W(s,G,(function(){return this})),W(s,"toString",(function(){return"[object Generator]"})),l.keys=function(l){var Z=[];for(var d in l)Z.push(d);return Z.reverse(),function d(){for(;Z.length;){var m=Z.pop();if(m in l)return d.value=m,d.done=!1,d}return d.done=!0,d}},l.values=T,x.prototype={constructor:x,reset:function(l){if(this.prev=0,this.next=0,this.sent=this._sent=Z,this.done=!1,this.delegate=null,this.method="next",this.arg=Z,this.tryEntries.forEach(C),!l)for(var d in this)"t"===d.charAt(0)&&m.call(this,d)&&!isNaN(+d.slice(1))&&(this[d]=Z)},stop:function(){this.done=!0;var l=this.tryEntries[0].completion;if("throw"===l.type)throw l.arg;return this.rval},dispatchException:function(l){if(this.done)throw l;var d=this;function c(m,c){return X.type="throw",X.arg=l,d.next=m,c&&(d.method="next",d.arg=Z),!!c}for(var b=this.tryEntries.length-1;b>=0;--b){var G=this.tryEntries[b],X=G.completion;if("root"===G.tryLoc)return c("end");if(G.tryLoc<=this.prev){var i=m.call(G,"catchLoc"),W=m.call(G,"finallyLoc");if(i&&W){if(this.prev<G.catchLoc)return c(G.catchLoc,!0);if(this.prev<G.finallyLoc)return c(G.finallyLoc)}else if(i){if(this.prev<G.catchLoc)return c(G.catchLoc,!0)}else{if(!W)throw new Error("try statement without catch or finally");if(this.prev<G.finallyLoc)return c(G.finallyLoc)}}}},abrupt:function(l,Z){for(var d=this.tryEntries.length-1;d>=0;--d){var c=this.tryEntries[d];if(c.tryLoc<=this.prev&&m.call(c,"finallyLoc")&&this.prev<c.finallyLoc){var b=c;break}}b&&("break"===l||"continue"===l)&&b.tryLoc<=Z&&Z<=b.finallyLoc&&(b=null);var G=b?b.completion:{};return G.type=l,G.arg=Z,b?(this.method="next",this.next=b.finallyLoc,a):this.complete(G)},complete:function(l,Z){if("throw"===l.type)throw l.arg;return"break"===l.type||"continue"===l.type?this.next=l.arg:"return"===l.type?(this.rval=this.arg=l.arg,this.method="return",this.next="end"):"normal"===l.type&&Z&&(this.next=Z),a},finish:function(l){for(var Z=this.tryEntries.length-1;Z>=0;--Z){var d=this.tryEntries[Z];if(d.finallyLoc===l)return this.complete(d.completion,d.afterLoc),C(d),a}},catch:function(l){for(var Z=this.tryEntries.length-1;Z>=0;--Z){var d=this.tryEntries[Z];if(d.tryLoc===l){var m=d.completion;if("throw"===m.type){var c=m.arg;C(d)}return c}}throw new Error("illegal catch attempt")},delegateYield:function(l,d,m){return this.delegate={iterator:T(l),resultName:d,nextLoc:m},"next"===this.method&&(this.arg=Z),a}},l}(l.exports);try{regeneratorRuntime=Z}catch(l){"object"===("undefined"==typeof globalThis?"undefined":b(globalThis))?globalThis.regeneratorRuntime=Z:Function("r","regeneratorRuntime = r")(Z)}})),u="function"==typeof atob,y="function"==typeof Buffer,I="function"==typeof TextDecoder?new TextDecoder:void 0,p=("function"==typeof TextEncoder&&new TextEncoder,Array.prototype.slice.call("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=")),V=(X={},p.forEach((function(l,Z){return X[l]=Z})),X),h=/^(?:[A-Za-z\d+\/]{4})*?(?:[A-Za-z\d+\/]{2}(?:==)?|[A-Za-z\d+\/]{3}=?)?$/,a=String.fromCharCode.bind(String),n="function"==typeof Uint8Array.from?Uint8Array.from.bind(Uint8Array):function(l){var Z=arguments.length>1&&void 0!==arguments[1]?arguments[1]:function(l){return l};return new Uint8Array(Array.prototype.slice.call(l,0).map(Z))},o=function(l){return l.replace(/[^A-Za-z0-9\+\/]/g,"")},K=/[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3}/g,Y=function(l){switch(l.length){case 4:var Z=((7&l.charCodeAt(0))<<18|(63&l.charCodeAt(1))<<12|(63&l.charCodeAt(2))<<6|63&l.charCodeAt(3))-65536;return a(55296+(Z>>>10))+a(56320+(1023&Z));case 3:return a((15&l.charCodeAt(0))<<12|(63&l.charCodeAt(1))<<6|63&l.charCodeAt(2));default:return a((31&l.charCodeAt(0))<<6|63&l.charCodeAt(1))}},R=function(l){return l.replace(K,Y)},L=function(l){if(l=l.replace(/\s+/g,""),!h.test(l))throw new TypeError("malformed base64.");l+="==".slice(2-(3&l.length));for(var Z,d,m,c="",b=0;b<l.length;)Z=V[l.charAt(b++)]<<18|V[l.charAt(b++)]<<12|(d=V[l.charAt(b++)])<<6|(m=V[l.charAt(b++)]),c+=64===d?a(Z>>16&255):64===m?a(Z>>16&255,Z>>8&255):a(Z>>16&255,Z>>8&255,255&Z);return c},s=u?function(l){return atob(o(l))}:y?function(l){return Buffer.from(l,"base64").toString("binary")}:L,J=y?function(l){return n(Buffer.from(l,"base64"))}:function(l){return n(s(l),(function(l){return l.charCodeAt(0)}))},t=y?function(l){return Buffer.from(l,"base64").toString("utf8")}:I?function(l){return I.decode(J(l))}:function(l){return R(s(l))},H=function(l){return o(l.replace(/[-_]/g,(function(l){return"-"==l?"+":"/"})))},S=function(l){return t(H(l))},C=S,x=G((function(l){var Z=Object.prototype.hasOwnProperty,d="~";function m(){}function c(l,Z,d){this.fn=l,this.context=Z,this.once=d||!1}function b(l,Z,m,b,G){if("function"!=typeof m)throw new TypeError("The listener must be a function");var X=new c(m,b||l,G),i=d?d+Z:Z;return l._events[i]?l._events[i].fn?l._events[i]=[l._events[i],X]:l._events[i].push(X):(l._events[i]=X,l._eventsCount++),l}function G(l,Z){0==--l._eventsCount?l._events=new m:delete l._events[Z]}function X(){this._events=new m,this._eventsCount=0}Object.create&&(m.prototype=Object.create(null),(new m).__proto__||(d=!1)),X.prototype.eventNames=function(){var l,m,c=[];if(0===this._eventsCount)return c;for(m in l=this._events)Z.call(l,m)&&c.push(d?m.slice(1):m);return Object.getOwnPropertySymbols?c.concat(Object.getOwnPropertySymbols(l)):c},X.prototype.listeners=function(l){var Z=d?d+l:l,m=this._events[Z];if(!m)return[];if(m.fn)return[m.fn];for(var c=0,b=m.length,G=new Array(b);c<b;c++)G[c]=m[c].fn;return G},X.prototype.listenerCount=function(l){var Z=d?d+l:l,m=this._events[Z];return m?m.fn?1:m.length:0},X.prototype.emit=function(l,Z,m,c,b,G){var X=d?d+l:l;if(!this._events[X])return!1;var i,W,u=this._events[X],y=arguments.length;if(u.fn){switch(u.once&&this.removeListener(l,u.fn,void 0,!0),y){case 1:return u.fn.call(u.context),!0;case 2:return u.fn.call(u.context,Z),!0;case 3:return u.fn.call(u.context,Z,m),!0;case 4:return u.fn.call(u.context,Z,m,c),!0;case 5:return u.fn.call(u.context,Z,m,c,b),!0;case 6:return u.fn.call(u.context,Z,m,c,b,G),!0}for(W=1,i=new Array(y-1);W<y;W++)i[W-1]=arguments[W];u.fn.apply(u.context,i)}else{var I,p=u.length;for(W=0;W<p;W++)switch(u[W].once&&this.removeListener(l,u[W].fn,void 0,!0),y){case 1:u[W].fn.call(u[W].context);break;case 2:u[W].fn.call(u[W].context,Z);break;case 3:u[W].fn.call(u[W].context,Z,m);break;case 4:u[W].fn.call(u[W].context,Z,m,c);break;default:if(!i)for(I=1,i=new Array(y-1);I<y;I++)i[I-1]=arguments[I];u[W].fn.apply(u[W].context,i)}}return!0},X.prototype.on=function(l,Z,d){return b(this,l,Z,d,!1)},X.prototype.once=function(l,Z,d){return b(this,l,Z,d,!0)},X.prototype.removeListener=function(l,Z,m,c){var b=d?d+l:l;if(!this._events[b])return this;if(!Z)return G(this,b),this;var X=this._events[b];if(X.fn)X.fn!==Z||c&&!X.once||m&&X.context!==m||G(this,b);else{for(var i=0,W=[],u=X.length;i<u;i++)(X[i].fn!==Z||c&&!X[i].once||m&&X[i].context!==m)&&W.push(X[i]);W.length?this._events[b]=1===W.length?W[0]:W:G(this,b)}return this},X.prototype.removeAllListeners=function(l){var Z;return l?(Z=d?d+l:l,this._events[Z]&&G(this,Z)):(this._events=new m,this._eventsCount=0),this},X.prototype.off=X.prototype.removeListener,X.prototype.addListener=X.prototype.on,X.prefixed=d,X.EventEmitter=X,l.exports=X}));return function(){if("browser"!=("undefined"!=typeof window&&void 0!==window.document?"browser":"nodejs"))return null;function l(){return new x}function d(){var l,Z,d=new Promise((function(){l=arguments[0],Z=arguments[1]}));return d.resolve=l,d.reject=Z,d}function m(){for(var l=arguments.length>0&&void 0!==arguments[0]?arguments[0]:10,Z=[],d="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),m=d.length,c=0;c<l;c++)Z[c]=d[0|Math.random()*m];return Z.join("")}var b=C("CgoKZnVuY3Rpb24gdCgpe31mdW5jdGlvbiBlKCl7ZS5pbml0LmNhbGwodGhpcyl9ZnVuY3Rpb24gcih0KXtyZXR1cm4gdm9pZCAwPT09dC5fbWF4TGlzdGVuZXJzP2UuZGVmYXVsdE1heExpc3RlbmVyczp0Ll9tYXhMaXN0ZW5lcnN9ZnVuY3Rpb24gbih0LGUscil7aWYoZSl0LmNhbGwocik7ZWxzZSBmb3IodmFyIG49dC5sZW5ndGgsaT1jKHQsbiksbz0wO288bjsrK28paVtvXS5jYWxsKHIpfWZ1bmN0aW9uIGkodCxlLHIsbil7aWYoZSl0LmNhbGwocixuKTtlbHNlIGZvcih2YXIgaT10Lmxlbmd0aCxvPWModCxpKSxzPTA7czxpOysrcylvW3NdLmNhbGwocixuKX1mdW5jdGlvbiBvKHQsZSxyLG4saSl7aWYoZSl0LmNhbGwocixuLGkpO2Vsc2UgZm9yKHZhciBvPXQubGVuZ3RoLHM9Yyh0LG8pLGE9MDthPG87KythKXNbYV0uY2FsbChyLG4saSl9ZnVuY3Rpb24gcyh0LGUscixuLGksbyl7aWYoZSl0LmNhbGwocixuLGksbyk7ZWxzZSBmb3IodmFyIHM9dC5sZW5ndGgsYT1jKHQscyksdT0wO3U8czsrK3UpYVt1XS5jYWxsKHIsbixpLG8pfWZ1bmN0aW9uIGEodCxlLHIsbil7aWYoZSl0LmFwcGx5KHIsbik7ZWxzZSBmb3IodmFyIGk9dC5sZW5ndGgsbz1jKHQsaSkscz0wO3M8aTsrK3Mpb1tzXS5hcHBseShyLG4pfWZ1bmN0aW9uIHUoZSxuLGksbyl7dmFyIHMsYSx1LGg7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGkpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3RlbmVyIiBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtpZigoYT1lLl9ldmVudHMpPyhhLm5ld0xpc3RlbmVyJiYoZS5lbWl0KCJuZXdMaXN0ZW5lciIsbixpLmxpc3RlbmVyP2kubGlzdGVuZXI6aSksYT1lLl9ldmVudHMpLHU9YVtuXSk6KGE9ZS5fZXZlbnRzPW5ldyB0LGUuX2V2ZW50c0NvdW50PTApLHUpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB1P3U9YVtuXT1vP1tpLHVdOlt1LGldOm8/dS51bnNoaWZ0KGkpOnUucHVzaChpKSwhdS53YXJuZWQmJihzPXIoZSkpJiZzPjAmJnUubGVuZ3RoPnMpe3Uud2FybmVkPSEwO3ZhciBmPW5ldyBFcnJvcigiUG9zc2libGUgRXZlbnRFbWl0dGVyIG1lbW9yeSBsZWFrIGRldGVjdGVkLiAiK3UubGVuZ3RoKyIgIituKyIgbGlzdGVuZXJzIGFkZGVkLiBVc2UgZW1pdHRlci5zZXRNYXhMaXN0ZW5lcnMoKSB0byBpbmNyZWFzZSBsaW1pdCIpO2YubmFtZT0iTWF4TGlzdGVuZXJzRXhjZWVkZWRXYXJuaW5nIixmLmVtaXR0ZXI9ZSxmLnR5cGU9bixmLmNvdW50PXUubGVuZ3RoLGg9ZiwiZnVuY3Rpb24iPT10eXBlb2YgY29uc29sZS53YXJuP2NvbnNvbGUud2FybihoKTpjb25zb2xlLmxvZyhoKX19ZWxzZSB1PWFbbl09aSwrK2UuX2V2ZW50c0NvdW50O3JldHVybiBlfWZ1bmN0aW9uIGgodCxlLHIpe3ZhciBuPSExO2Z1bmN0aW9uIGkoKXt0LnJlbW92ZUxpc3RlbmVyKGUsaSksbnx8KG49ITAsci5hcHBseSh0LGFyZ3VtZW50cykpfXJldHVybiBpLmxpc3RlbmVyPXIsaX1mdW5jdGlvbiBmKHQpe3ZhciBlPXRoaXMuX2V2ZW50cztpZihlKXt2YXIgcj1lW3RdO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiByKXJldHVybiAxO2lmKHIpcmV0dXJuIHIubGVuZ3RofXJldHVybiAwfWZ1bmN0aW9uIGModCxlKXtmb3IodmFyIHI9bmV3IEFycmF5KGUpO2UtLTspcltlXT10W2VdO3JldHVybiByfXQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobnVsbCksZS5FdmVudEVtaXR0ZXI9ZSxlLnVzaW5nRG9tYWlucz0hMSxlLnByb3RvdHlwZS5kb21haW49dm9pZCAwLGUucHJvdG90eXBlLl9ldmVudHM9dm9pZCAwLGUucHJvdG90eXBlLl9tYXhMaXN0ZW5lcnM9dm9pZCAwLGUuZGVmYXVsdE1heExpc3RlbmVycz0xMCxlLmluaXQ9ZnVuY3Rpb24oKXt0aGlzLmRvbWFpbj1udWxsLGUudXNpbmdEb21haW5zJiZ1bmRlZmluZWQuYWN0aXZlLHRoaXMuX2V2ZW50cyYmdGhpcy5fZXZlbnRzIT09T2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpLl9ldmVudHN8fCh0aGlzLl9ldmVudHM9bmV3IHQsdGhpcy5fZXZlbnRzQ291bnQ9MCksdGhpcy5fbWF4TGlzdGVuZXJzPXRoaXMuX21heExpc3RlbmVyc3x8dm9pZCAwfSxlLnByb3RvdHlwZS5zZXRNYXhMaXN0ZW5lcnM9ZnVuY3Rpb24odCl7aWYoIm51bWJlciIhPXR5cGVvZiB0fHx0PDB8fGlzTmFOKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJuIiBhcmd1bWVudCBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyJyk7cmV0dXJuIHRoaXMuX21heExpc3RlbmVycz10LHRoaXN9LGUucHJvdG90eXBlLmdldE1heExpc3RlbmVycz1mdW5jdGlvbigpe3JldHVybiByKHRoaXMpfSxlLnByb3RvdHlwZS5lbWl0PWZ1bmN0aW9uKHQpe3ZhciBlLHIsdSxoLGYsYyxsLHA9ImVycm9yIj09PXQ7aWYoYz10aGlzLl9ldmVudHMpcD1wJiZudWxsPT1jLmVycm9yO2Vsc2UgaWYoIXApcmV0dXJuITE7aWYobD10aGlzLmRvbWFpbixwKXtpZihlPWFyZ3VtZW50c1sxXSwhbCl7aWYoZSBpbnN0YW5jZW9mIEVycm9yKXRocm93IGU7dmFyIGQ9bmV3IEVycm9yKCdVbmNhdWdodCwgdW5zcGVjaWZpZWQgImVycm9yIiBldmVudC4gKCcrZSsiKSIpO3Rocm93IGQuY29udGV4dD1lLGR9cmV0dXJuIGV8fChlPW5ldyBFcnJvcignVW5jYXVnaHQsIHVuc3BlY2lmaWVkICJlcnJvciIgZXZlbnQnKSksZS5kb21haW5FbWl0dGVyPXRoaXMsZS5kb21haW49bCxlLmRvbWFpblRocm93bj0hMSxsLmVtaXQoImVycm9yIixlKSwhMX1pZighKHI9Y1t0XSkpcmV0dXJuITE7dmFyIGc9ImZ1bmN0aW9uIj09dHlwZW9mIHI7c3dpdGNoKHU9YXJndW1lbnRzLmxlbmd0aCl7Y2FzZSAxOm4ocixnLHRoaXMpO2JyZWFrO2Nhc2UgMjppKHIsZyx0aGlzLGFyZ3VtZW50c1sxXSk7YnJlYWs7Y2FzZSAzOm8ocixnLHRoaXMsYXJndW1lbnRzWzFdLGFyZ3VtZW50c1syXSk7YnJlYWs7Y2FzZSA0OnMocixnLHRoaXMsYXJndW1lbnRzWzFdLGFyZ3VtZW50c1syXSxhcmd1bWVudHNbM10pO2JyZWFrO2RlZmF1bHQ6Zm9yKGg9bmV3IEFycmF5KHUtMSksZj0xO2Y8dTtmKyspaFtmLTFdPWFyZ3VtZW50c1tmXTthKHIsZyx0aGlzLGgpfXJldHVybiEwfSxlLnByb3RvdHlwZS5hZGRMaXN0ZW5lcj1mdW5jdGlvbih0LGUpe3JldHVybiB1KHRoaXMsdCxlLCExKX0sZS5wcm90b3R5cGUub249ZS5wcm90b3R5cGUuYWRkTGlzdGVuZXIsZS5wcm90b3R5cGUucHJlcGVuZExpc3RlbmVyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHUodGhpcyx0LGUsITApfSxlLnByb3RvdHlwZS5vbmNlPWZ1bmN0aW9uKHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3RlbmVyIiBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtyZXR1cm4gdGhpcy5vbih0LGgodGhpcyx0LGUpKSx0aGlzfSxlLnByb3RvdHlwZS5wcmVwZW5kT25jZUxpc3RlbmVyPWZ1bmN0aW9uKHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3RlbmVyIiBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtyZXR1cm4gdGhpcy5wcmVwZW5kTGlzdGVuZXIodCxoKHRoaXMsdCxlKSksdGhpc30sZS5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI9ZnVuY3Rpb24oZSxyKXt2YXIgbixpLG8scyxhO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiByKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0ZW5lciIgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7aWYoIShpPXRoaXMuX2V2ZW50cykpcmV0dXJuIHRoaXM7aWYoIShuPWlbZV0pKXJldHVybiB0aGlzO2lmKG49PT1yfHxuLmxpc3RlbmVyJiZuLmxpc3RlbmVyPT09cikwPT0tLXRoaXMuX2V2ZW50c0NvdW50P3RoaXMuX2V2ZW50cz1uZXcgdDooZGVsZXRlIGlbZV0saS5yZW1vdmVMaXN0ZW5lciYmdGhpcy5lbWl0KCJyZW1vdmVMaXN0ZW5lciIsZSxuLmxpc3RlbmVyfHxyKSk7ZWxzZSBpZigiZnVuY3Rpb24iIT10eXBlb2Ygbil7Zm9yKG89LTEscz1uLmxlbmd0aDtzLS0gPjA7KWlmKG5bc109PT1yfHxuW3NdLmxpc3RlbmVyJiZuW3NdLmxpc3RlbmVyPT09cil7YT1uW3NdLmxpc3RlbmVyLG89czticmVha31pZihvPDApcmV0dXJuIHRoaXM7aWYoMT09PW4ubGVuZ3RoKXtpZihuWzBdPXZvaWQgMCwwPT0tLXRoaXMuX2V2ZW50c0NvdW50KXJldHVybiB0aGlzLl9ldmVudHM9bmV3IHQsdGhpcztkZWxldGUgaVtlXX1lbHNlIWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPWUsbj1yKzEsaT10Lmxlbmd0aDtuPGk7cis9MSxuKz0xKXRbcl09dFtuXTt0LnBvcCgpfShuLG8pO2kucmVtb3ZlTGlzdGVuZXImJnRoaXMuZW1pdCgicmVtb3ZlTGlzdGVuZXIiLGUsYXx8cil9cmV0dXJuIHRoaXN9LGUucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycz1mdW5jdGlvbihlKXt2YXIgcixuO2lmKCEobj10aGlzLl9ldmVudHMpKXJldHVybiB0aGlzO2lmKCFuLnJlbW92ZUxpc3RlbmVyKXJldHVybiAwPT09YXJndW1lbnRzLmxlbmd0aD8odGhpcy5fZXZlbnRzPW5ldyB0LHRoaXMuX2V2ZW50c0NvdW50PTApOm5bZV0mJigwPT0tLXRoaXMuX2V2ZW50c0NvdW50P3RoaXMuX2V2ZW50cz1uZXcgdDpkZWxldGUgbltlXSksdGhpcztpZigwPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKHZhciBpLG89T2JqZWN0LmtleXMobikscz0wO3M8by5sZW5ndGg7KytzKSJyZW1vdmVMaXN0ZW5lciIhPT0oaT1vW3NdKSYmdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoaSk7cmV0dXJuIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCJyZW1vdmVMaXN0ZW5lciIpLHRoaXMuX2V2ZW50cz1uZXcgdCx0aGlzLl9ldmVudHNDb3VudD0wLHRoaXN9aWYoImZ1bmN0aW9uIj09dHlwZW9mKHI9bltlXSkpdGhpcy5yZW1vdmVMaXN0ZW5lcihlLHIpO2Vsc2UgaWYocilkb3t0aGlzLnJlbW92ZUxpc3RlbmVyKGUscltyLmxlbmd0aC0xXSl9d2hpbGUoclswXSk7cmV0dXJuIHRoaXN9LGUucHJvdG90eXBlLmxpc3RlbmVycz1mdW5jdGlvbih0KXt2YXIgZSxyPXRoaXMuX2V2ZW50cztyZXR1cm4gciYmKGU9clt0XSk/ImZ1bmN0aW9uIj09dHlwZW9mIGU/W2UubGlzdGVuZXJ8fGVdOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgQXJyYXkodC5sZW5ndGgpLHI9MDtyPGUubGVuZ3RoOysrcillW3JdPXRbcl0ubGlzdGVuZXJ8fHRbcl07cmV0dXJuIGV9KGUpOltdfSxlLmxpc3RlbmVyQ291bnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdC5saXN0ZW5lckNvdW50P3QubGlzdGVuZXJDb3VudChlKTpmLmNhbGwodCxlKX0sZS5wcm90b3R5cGUubGlzdGVuZXJDb3VudD1mLGUucHJvdG90eXBlLmV2ZW50TmFtZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZXZlbnRzQ291bnQ+MD9SZWZsZWN0Lm93bktleXModGhpcy5fZXZlbnRzKTpbXX07dmFyIGw9InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWw/Z2xvYmFsOiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp7fSxwPVtdLGQ9W10sZz0idW5kZWZpbmVkIiE9dHlwZW9mIFVpbnQ4QXJyYXk/VWludDhBcnJheTpBcnJheSx5PSExO2Z1bmN0aW9uIHYoKXt5PSEwO2Zvcih2YXIgdD0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyIsZT0wLHI9dC5sZW5ndGg7ZTxyOysrZSlwW2VdPXRbZV0sZFt0LmNoYXJDb2RlQXQoZSldPWU7ZFsiLSIuY2hhckNvZGVBdCgwKV09NjIsZFsiXyIuY2hhckNvZGVBdCgwKV09NjN9ZnVuY3Rpb24gYih0LGUscil7Zm9yKHZhciBuLGksbz1bXSxzPWU7czxyO3MrPTMpbj0odFtzXTw8MTYpKyh0W3MrMV08PDgpK3RbcysyXSxvLnB1c2gocFsoaT1uKT4+MTgmNjNdK3BbaT4+MTImNjNdK3BbaT4+NiY2M10rcFs2MyZpXSk7cmV0dXJuIG8uam9pbigiIil9ZnVuY3Rpb24gbSh0KXt2YXIgZTt5fHx2KCk7Zm9yKHZhciByPXQubGVuZ3RoLG49ciUzLGk9IiIsbz1bXSxzPTE2MzgzLGE9MCx1PXItbjthPHU7YSs9cylvLnB1c2goYih0LGEsYStzPnU/dTphK3MpKTtyZXR1cm4gMT09PW4/KGU9dFtyLTFdLGkrPXBbZT4+Ml0saSs9cFtlPDw0JjYzXSxpKz0iPT0iKToyPT09biYmKGU9KHRbci0yXTw8OCkrdFtyLTFdLGkrPXBbZT4+MTBdLGkrPXBbZT4+NCY2M10saSs9cFtlPDwyJjYzXSxpKz0iPSIpLG8ucHVzaChpKSxvLmpvaW4oIiIpfWZ1bmN0aW9uIHcodCxlLHIsbixpKXt2YXIgbyxzLGE9OCppLW4tMSx1PSgxPDxhKS0xLGg9dT4+MSxmPS03LGM9cj9pLTE6MCxsPXI/LTE6MSxwPXRbZStjXTtmb3IoYys9bCxvPXAmKDE8PC1mKS0xLHA+Pj0tZixmKz1hO2Y+MDtvPTI1NipvK3RbZStjXSxjKz1sLGYtPTgpO2ZvcihzPW8mKDE8PC1mKS0xLG8+Pj0tZixmKz1uO2Y+MDtzPTI1NipzK3RbZStjXSxjKz1sLGYtPTgpO2lmKDA9PT1vKW89MS1oO2Vsc2V7aWYobz09PXUpcmV0dXJuIHM/TmFOOjEvMCoocD8tMToxKTtzKz1NYXRoLnBvdygyLG4pLG8tPWh9cmV0dXJuKHA/LTE6MSkqcypNYXRoLnBvdygyLG8tbil9ZnVuY3Rpb24gXyh0LGUscixuLGksbyl7dmFyIHMsYSx1LGg9OCpvLWktMSxmPSgxPDxoKS0xLGM9Zj4+MSxsPTIzPT09aT9NYXRoLnBvdygyLC0yNCktTWF0aC5wb3coMiwtNzcpOjAscD1uPzA6by0xLGQ9bj8xOi0xLGc9ZTwwfHwwPT09ZSYmMS9lPDA/MTowO2ZvcihlPU1hdGguYWJzKGUpLGlzTmFOKGUpfHxlPT09MS8wPyhhPWlzTmFOKGUpPzE6MCxzPWYpOihzPU1hdGguZmxvb3IoTWF0aC5sb2coZSkvTWF0aC5MTjIpLGUqKHU9TWF0aC5wb3coMiwtcykpPDEmJihzLS0sdSo9MiksKGUrPXMrYz49MT9sL3U6bCpNYXRoLnBvdygyLDEtYykpKnU+PTImJihzKyssdS89MikscytjPj1mPyhhPTAscz1mKTpzK2M+PTE/KGE9KGUqdS0xKSpNYXRoLnBvdygyLGkpLHMrPWMpOihhPWUqTWF0aC5wb3coMixjLTEpKk1hdGgucG93KDIsaSkscz0wKSk7aT49ODt0W3IrcF09MjU1JmEscCs9ZCxhLz0yNTYsaS09OCk7Zm9yKHM9czw8aXxhLGgrPWk7aD4wO3RbcitwXT0yNTUmcyxwKz1kLHMvPTI1NixoLT04KTt0W3IrcC1kXXw9MTI4Kmd9dmFyIFM9e30udG9TdHJpbmcsRT1BcnJheS5pc0FycmF5fHxmdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT1TLmNhbGwodCl9O2Z1bmN0aW9uIGsoKXtyZXR1cm4gQS5UWVBFRF9BUlJBWV9TVVBQT1JUPzIxNDc0ODM2NDc6MTA3Mzc0MTgyM31mdW5jdGlvbiBSKHQsZSl7aWYoaygpPGUpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkludmFsaWQgdHlwZWQgYXJyYXkgbGVuZ3RoIik7cmV0dXJuIEEuVFlQRURfQVJSQVlfU1VQUE9SVD8odD1uZXcgVWludDhBcnJheShlKSkuX19wcm90b19fPUEucHJvdG90eXBlOihudWxsPT09dCYmKHQ9bmV3IEEoZSkpLHQubGVuZ3RoPWUpLHR9ZnVuY3Rpb24gQSh0LGUscil7aWYoIShBLlRZUEVEX0FSUkFZX1NVUFBPUlR8fHRoaXMgaW5zdGFuY2VvZiBBKSlyZXR1cm4gbmV3IEEodCxlLHIpO2lmKCJudW1iZXIiPT10eXBlb2YgdCl7aWYoInN0cmluZyI9PXR5cGVvZiBlKXRocm93IG5ldyBFcnJvcigiSWYgZW5jb2RpbmcgaXMgc3BlY2lmaWVkIHRoZW4gdGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmciKTtyZXR1cm4gaih0aGlzLHQpfXJldHVybiBUKHRoaXMsdCxlLHIpfWZ1bmN0aW9uIFQodCxlLHIsbil7aWYoIm51bWJlciI9PXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoJyJ2YWx1ZSIgYXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXInKTtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiZlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXI/ZnVuY3Rpb24odCxlLHIsbil7aWYoZS5ieXRlTGVuZ3RoLHI8MHx8ZS5ieXRlTGVuZ3RoPHIpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIidvZmZzZXQnIGlzIG91dCBvZiBib3VuZHMiKTtpZihlLmJ5dGVMZW5ndGg8cisobnx8MCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIidsZW5ndGgnIGlzIG91dCBvZiBib3VuZHMiKTtlPXZvaWQgMD09PXImJnZvaWQgMD09PW4/bmV3IFVpbnQ4QXJyYXkoZSk6dm9pZCAwPT09bj9uZXcgVWludDhBcnJheShlLHIpOm5ldyBVaW50OEFycmF5KGUscixuKTtBLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHQ9ZSkuX19wcm90b19fPUEucHJvdG90eXBlOnQ9TCh0LGUpO3JldHVybiB0fSh0LGUscixuKToic3RyaW5nIj09dHlwZW9mIGU/ZnVuY3Rpb24odCxlLHIpeyJzdHJpbmciPT10eXBlb2YgciYmIiIhPT1yfHwocj0idXRmOCIpO2lmKCFBLmlzRW5jb2RpbmcocikpdGhyb3cgbmV3IFR5cGVFcnJvcignImVuY29kaW5nIiBtdXN0IGJlIGEgdmFsaWQgc3RyaW5nIGVuY29kaW5nJyk7dmFyIG49MHxNKGUsciksaT0odD1SKHQsbikpLndyaXRlKGUscik7aSE9PW4mJih0PXQuc2xpY2UoMCxpKSk7cmV0dXJuIHR9KHQsZSxyKTpmdW5jdGlvbih0LGUpe2lmKFAoZSkpe3ZhciByPTB8QyhlLmxlbmd0aCk7cmV0dXJuIDA9PT0odD1SKHQscikpLmxlbmd0aHx8ZS5jb3B5KHQsMCwwLHIpLHR9aWYoZSl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmZS5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcnx8Imxlbmd0aCJpbiBlKXJldHVybiJudW1iZXIiIT10eXBlb2YgZS5sZW5ndGh8fChuPWUubGVuZ3RoKSE9bj9SKHQsMCk6TCh0LGUpO2lmKCJCdWZmZXIiPT09ZS50eXBlJiZFKGUuZGF0YSkpcmV0dXJuIEwodCxlLmRhdGEpfXZhciBuO3Rocm93IG5ldyBUeXBlRXJyb3IoIkZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCBvciBhcnJheS1saWtlIG9iamVjdC4iKX0odCxlKX1mdW5jdGlvbiBPKHQpe2lmKCJudW1iZXIiIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCcic2l6ZSIgYXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpO2lmKHQ8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcignInNpemUiIGFyZ3VtZW50IG11c3Qgbm90IGJlIG5lZ2F0aXZlJyl9ZnVuY3Rpb24gaih0LGUpe2lmKE8oZSksdD1SKHQsZTwwPzA6MHxDKGUpKSwhQS5UWVBFRF9BUlJBWV9TVVBQT1JUKWZvcih2YXIgcj0wO3I8ZTsrK3IpdFtyXT0wO3JldHVybiB0fWZ1bmN0aW9uIEwodCxlKXt2YXIgcj1lLmxlbmd0aDwwPzA6MHxDKGUubGVuZ3RoKTt0PVIodCxyKTtmb3IodmFyIG49MDtuPHI7bis9MSl0W25dPTI1NSZlW25dO3JldHVybiB0fWZ1bmN0aW9uIEModCl7aWYodD49aygpKXRocm93IG5ldyBSYW5nZUVycm9yKCJBdHRlbXB0IHRvIGFsbG9jYXRlIEJ1ZmZlciBsYXJnZXIgdGhhbiBtYXhpbXVtIHNpemU6IDB4IitrKCkudG9TdHJpbmcoMTYpKyIgYnl0ZXMiKTtyZXR1cm4gMHx0fWZ1bmN0aW9uIFAodCl7cmV0dXJuIShudWxsPT10fHwhdC5faXNCdWZmZXIpfWZ1bmN0aW9uIE0odCxlKXtpZihQKHQpKXJldHVybiB0Lmxlbmd0aDtpZigidW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiYiZnVuY3Rpb24iPT10eXBlb2YgQXJyYXlCdWZmZXIuaXNWaWV3JiYoQXJyYXlCdWZmZXIuaXNWaWV3KHQpfHx0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpKXJldHVybiB0LmJ5dGVMZW5ndGg7InN0cmluZyIhPXR5cGVvZiB0JiYodD0iIit0KTt2YXIgcj10Lmxlbmd0aDtpZigwPT09cilyZXR1cm4gMDtmb3IodmFyIG49ITE7Oylzd2l0Y2goZSl7Y2FzZSJhc2NpaSI6Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gcjtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOmNhc2Ugdm9pZCAwOnJldHVybiBvdCh0KS5sZW5ndGg7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiAyKnI7Y2FzZSJoZXgiOnJldHVybiByPj4+MTtjYXNlImJhc2U2NCI6cmV0dXJuIHN0KHQpLmxlbmd0aDtkZWZhdWx0OmlmKG4pcmV0dXJuIG90KHQpLmxlbmd0aDtlPSgiIitlKS50b0xvd2VyQ2FzZSgpLG49ITB9fWZ1bmN0aW9uIEIodCxlLHIpe3ZhciBuPSExO2lmKCh2b2lkIDA9PT1lfHxlPDApJiYoZT0wKSxlPnRoaXMubGVuZ3RoKXJldHVybiIiO2lmKCh2b2lkIDA9PT1yfHxyPnRoaXMubGVuZ3RoKSYmKHI9dGhpcy5sZW5ndGgpLHI8PTApcmV0dXJuIiI7aWYoKHI+Pj49MCk8PShlPj4+PTApKXJldHVybiIiO2Zvcih0fHwodD0idXRmOCIpOzspc3dpdGNoKHQpe2Nhc2UiaGV4IjpyZXR1cm4gSCh0aGlzLGUscik7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpyZXR1cm4gJCh0aGlzLGUscik7Y2FzZSJhc2NpaSI6cmV0dXJuIEcodGhpcyxlLHIpO2Nhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIEoodGhpcyxlLHIpO2Nhc2UiYmFzZTY0IjpyZXR1cm4gVyh0aGlzLGUscik7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiBWKHRoaXMsZSxyKTtkZWZhdWx0OmlmKG4pdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIit0KTt0PSh0KyIiKS50b0xvd2VyQ2FzZSgpLG49ITB9fWZ1bmN0aW9uIHgodCxlLHIpe3ZhciBuPXRbZV07dFtlXT10W3JdLHRbcl09bn1mdW5jdGlvbiBVKHQsZSxyLG4saSl7aWYoMD09PXQubGVuZ3RoKXJldHVybi0xO2lmKCJzdHJpbmciPT10eXBlb2Ygcj8obj1yLHI9MCk6cj4yMTQ3NDgzNjQ3P3I9MjE0NzQ4MzY0NzpyPC0yMTQ3NDgzNjQ4JiYocj0tMjE0NzQ4MzY0OCkscj0rcixpc05hTihyKSYmKHI9aT8wOnQubGVuZ3RoLTEpLHI8MCYmKHI9dC5sZW5ndGgrcikscj49dC5sZW5ndGgpe2lmKGkpcmV0dXJuLTE7cj10Lmxlbmd0aC0xfWVsc2UgaWYocjwwKXtpZighaSlyZXR1cm4tMTtyPTB9aWYoInN0cmluZyI9PXR5cGVvZiBlJiYoZT1BLmZyb20oZSxuKSksUChlKSlyZXR1cm4gMD09PWUubGVuZ3RoPy0xOkkodCxlLHIsbixpKTtpZigibnVtYmVyIj09dHlwZW9mIGUpcmV0dXJuIGUmPTI1NSxBLlRZUEVEX0FSUkFZX1NVUFBPUlQmJiJmdW5jdGlvbiI9PXR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mP2k/VWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKHQsZSxyKTpVaW50OEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZi5jYWxsKHQsZSxyKTpJKHQsW2VdLHIsbixpKTt0aHJvdyBuZXcgVHlwZUVycm9yKCJ2YWwgbXVzdCBiZSBzdHJpbmcsIG51bWJlciBvciBCdWZmZXIiKX1mdW5jdGlvbiBJKHQsZSxyLG4saSl7dmFyIG8scz0xLGE9dC5sZW5ndGgsdT1lLmxlbmd0aDtpZih2b2lkIDAhPT1uJiYoInVjczIiPT09KG49U3RyaW5nKG4pLnRvTG93ZXJDYXNlKCkpfHwidWNzLTIiPT09bnx8InV0ZjE2bGUiPT09bnx8InV0Zi0xNmxlIj09PW4pKXtpZih0Lmxlbmd0aDwyfHxlLmxlbmd0aDwyKXJldHVybi0xO3M9MixhLz0yLHUvPTIsci89Mn1mdW5jdGlvbiBoKHQsZSl7cmV0dXJuIDE9PT1zP3RbZV06dC5yZWFkVUludDE2QkUoZSpzKX1pZihpKXt2YXIgZj0tMTtmb3Iobz1yO288YTtvKyspaWYoaCh0LG8pPT09aChlLC0xPT09Zj8wOm8tZikpe2lmKC0xPT09ZiYmKGY9byksby1mKzE9PT11KXJldHVybiBmKnN9ZWxzZS0xIT09ZiYmKG8tPW8tZiksZj0tMX1lbHNlIGZvcihyK3U+YSYmKHI9YS11KSxvPXI7bz49MDtvLS0pe2Zvcih2YXIgYz0hMCxsPTA7bDx1O2wrKylpZihoKHQsbytsKSE9PWgoZSxsKSl7Yz0hMTticmVha31pZihjKXJldHVybiBvfXJldHVybi0xfWZ1bmN0aW9uIEQodCxlLHIsbil7cj1OdW1iZXIocil8fDA7dmFyIGk9dC5sZW5ndGgtcjtuPyhuPU51bWJlcihuKSk+aSYmKG49aSk6bj1pO3ZhciBvPWUubGVuZ3RoO2lmKG8lMiE9MCl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGhleCBzdHJpbmciKTtuPm8vMiYmKG49by8yKTtmb3IodmFyIHM9MDtzPG47KytzKXt2YXIgYT1wYXJzZUludChlLnN1YnN0cigyKnMsMiksMTYpO2lmKGlzTmFOKGEpKXJldHVybiBzO3RbcitzXT1hfXJldHVybiBzfWZ1bmN0aW9uIE4odCxlLHIsbil7cmV0dXJuIGF0KG90KGUsdC5sZW5ndGgtciksdCxyLG4pfWZ1bmN0aW9uIEYodCxlLHIsbil7cmV0dXJuIGF0KGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXSxyPTA7cjx0Lmxlbmd0aDsrK3IpZS5wdXNoKDI1NSZ0LmNoYXJDb2RlQXQocikpO3JldHVybiBlfShlKSx0LHIsbil9ZnVuY3Rpb24geih0LGUscixuKXtyZXR1cm4gRih0LGUscixuKX1mdW5jdGlvbiBxKHQsZSxyLG4pe3JldHVybiBhdChzdChlKSx0LHIsbil9ZnVuY3Rpb24gWSh0LGUscixuKXtyZXR1cm4gYXQoZnVuY3Rpb24odCxlKXtmb3IodmFyIHIsbixpLG89W10scz0wO3M8dC5sZW5ndGgmJiEoKGUtPTIpPDApOysrcyluPShyPXQuY2hhckNvZGVBdChzKSk+PjgsaT1yJTI1NixvLnB1c2goaSksby5wdXNoKG4pO3JldHVybiBvfShlLHQubGVuZ3RoLXIpLHQscixuKX1mdW5jdGlvbiBXKHQsZSxyKXtyZXR1cm4gMD09PWUmJnI9PT10Lmxlbmd0aD9tKHQpOm0odC5zbGljZShlLHIpKX1mdW5jdGlvbiAkKHQsZSxyKXtyPU1hdGgubWluKHQubGVuZ3RoLHIpO2Zvcih2YXIgbj1bXSxpPWU7aTxyOyl7dmFyIG8scyxhLHUsaD10W2ldLGY9bnVsbCxjPWg+MjM5PzQ6aD4yMjM/MzpoPjE5MT8yOjE7aWYoaStjPD1yKXN3aXRjaChjKXtjYXNlIDE6aDwxMjgmJihmPWgpO2JyZWFrO2Nhc2UgMjoxMjg9PSgxOTImKG89dFtpKzFdKSkmJih1PSgzMSZoKTw8Nnw2MyZvKT4xMjcmJihmPXUpO2JyZWFrO2Nhc2UgMzpvPXRbaSsxXSxzPXRbaSsyXSwxMjg9PSgxOTImbykmJjEyOD09KDE5MiZzKSYmKHU9KDE1JmgpPDwxMnwoNjMmbyk8PDZ8NjMmcyk+MjA0NyYmKHU8NTUyOTZ8fHU+NTczNDMpJiYoZj11KTticmVhaztjYXNlIDQ6bz10W2krMV0scz10W2krMl0sYT10W2krM10sMTI4PT0oMTkyJm8pJiYxMjg9PSgxOTImcykmJjEyOD09KDE5MiZhKSYmKHU9KDE1JmgpPDwxOHwoNjMmbyk8PDEyfCg2MyZzKTw8Nnw2MyZhKT42NTUzNSYmdTwxMTE0MTEyJiYoZj11KX1udWxsPT09Zj8oZj02NTUzMyxjPTEpOmY+NjU1MzUmJihmLT02NTUzNixuLnB1c2goZj4+PjEwJjEwMjN8NTUyOTYpLGY9NTYzMjB8MTAyMyZmKSxuLnB1c2goZiksaSs9Y31yZXR1cm4gZnVuY3Rpb24odCl7dmFyIGU9dC5sZW5ndGg7aWYoZTw9NDA5NilyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsdCk7dmFyIHI9IiIsbj0wO2Zvcig7bjxlOylyKz1TdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyx0LnNsaWNlKG4sbis9NDA5NikpO3JldHVybiByfShuKX1BLlRZUEVEX0FSUkFZX1NVUFBPUlQ9dm9pZCAwPT09bC5UWVBFRF9BUlJBWV9TVVBQT1JUfHxsLlRZUEVEX0FSUkFZX1NVUFBPUlQsQS5wb29sU2l6ZT04MTkyLEEuX2F1Z21lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQuX19wcm90b19fPUEucHJvdG90eXBlLHR9LEEuZnJvbT1mdW5jdGlvbih0LGUscil7cmV0dXJuIFQobnVsbCx0LGUscil9LEEuVFlQRURfQVJSQVlfU1VQUE9SVCYmKEEucHJvdG90eXBlLl9fcHJvdG9fXz1VaW50OEFycmF5LnByb3RvdHlwZSxBLl9fcHJvdG9fXz1VaW50OEFycmF5KSxBLmFsbG9jPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gZnVuY3Rpb24odCxlLHIsbil7cmV0dXJuIE8oZSksZTw9MD9SKHQsZSk6dm9pZCAwIT09cj8ic3RyaW5nIj09dHlwZW9mIG4/Uih0LGUpLmZpbGwocixuKTpSKHQsZSkuZmlsbChyKTpSKHQsZSl9KG51bGwsdCxlLHIpfSxBLmFsbG9jVW5zYWZlPWZ1bmN0aW9uKHQpe3JldHVybiBqKG51bGwsdCl9LEEuYWxsb2NVbnNhZmVTbG93PWZ1bmN0aW9uKHQpe3JldHVybiBqKG51bGwsdCl9LEEuaXNCdWZmZXI9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPXQmJighIXQuX2lzQnVmZmVyfHx1dCh0KXx8ZnVuY3Rpb24odCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQucmVhZEZsb2F0TEUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LnNsaWNlJiZ1dCh0LnNsaWNlKDAsMCkpfSh0KSl9LEEuY29tcGFyZT1mdW5jdGlvbih0LGUpe2lmKCFQKHQpfHwhUChlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudHMgbXVzdCBiZSBCdWZmZXJzIik7aWYodD09PWUpcmV0dXJuIDA7Zm9yKHZhciByPXQubGVuZ3RoLG49ZS5sZW5ndGgsaT0wLG89TWF0aC5taW4ocixuKTtpPG87KytpKWlmKHRbaV0hPT1lW2ldKXtyPXRbaV0sbj1lW2ldO2JyZWFrfXJldHVybiByPG4/LTE6bjxyPzE6MH0sQS5pc0VuY29kaW5nPWZ1bmN0aW9uKHQpe3N3aXRjaChTdHJpbmcodCkudG9Mb3dlckNhc2UoKSl7Y2FzZSJoZXgiOmNhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6Y2FzZSJhc2NpaSI6Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpjYXNlImJhc2U2NCI6Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fSxBLmNvbmNhdD1mdW5jdGlvbih0LGUpe2lmKCFFKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0IiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTtpZigwPT09dC5sZW5ndGgpcmV0dXJuIEEuYWxsb2MoMCk7dmFyIHI7aWYodm9pZCAwPT09ZSlmb3IoZT0wLHI9MDtyPHQubGVuZ3RoOysrcillKz10W3JdLmxlbmd0aDt2YXIgbj1BLmFsbG9jVW5zYWZlKGUpLGk9MDtmb3Iocj0wO3I8dC5sZW5ndGg7KytyKXt2YXIgbz10W3JdO2lmKCFQKG8pKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0IiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTtvLmNvcHkobixpKSxpKz1vLmxlbmd0aH1yZXR1cm4gbn0sQS5ieXRlTGVuZ3RoPU0sQS5wcm90b3R5cGUuX2lzQnVmZmVyPSEwLEEucHJvdG90eXBlLnN3YXAxNj1mdW5jdGlvbigpe3ZhciB0PXRoaXMubGVuZ3RoO2lmKHQlMiE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LWJpdHMiKTtmb3IodmFyIGU9MDtlPHQ7ZSs9Mil4KHRoaXMsZSxlKzEpO3JldHVybiB0aGlzfSxBLnByb3RvdHlwZS5zd2FwMzI9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmxlbmd0aDtpZih0JTQhPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzIik7Zm9yKHZhciBlPTA7ZTx0O2UrPTQpeCh0aGlzLGUsZSszKSx4KHRoaXMsZSsxLGUrMik7cmV0dXJuIHRoaXN9LEEucHJvdG90eXBlLnN3YXA2ND1mdW5jdGlvbigpe3ZhciB0PXRoaXMubGVuZ3RoO2lmKHQlOCE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDY0LWJpdHMiKTtmb3IodmFyIGU9MDtlPHQ7ZSs9OCl4KHRoaXMsZSxlKzcpLHgodGhpcyxlKzEsZSs2KSx4KHRoaXMsZSsyLGUrNSkseCh0aGlzLGUrMyxlKzQpO3JldHVybiB0aGlzfSxBLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3ZhciB0PTB8dGhpcy5sZW5ndGg7cmV0dXJuIDA9PT10PyIiOjA9PT1hcmd1bWVudHMubGVuZ3RoPyQodGhpcywwLHQpOkIuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxBLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7aWYoIVAodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciIpO3JldHVybiB0aGlzPT09dHx8MD09PUEuY29tcGFyZSh0aGlzLHQpfSxBLnByb3RvdHlwZS5pbnNwZWN0PWZ1bmN0aW9uKCl7dmFyIHQ9IiI7cmV0dXJuIHRoaXMubGVuZ3RoPjAmJih0PXRoaXMudG9TdHJpbmcoImhleCIsMCw1MCkubWF0Y2goLy57Mn0vZykuam9pbigiICIpLHRoaXMubGVuZ3RoPjUwJiYodCs9IiAuLi4gIikpLCI8QnVmZmVyICIrdCsiPiJ9LEEucHJvdG90eXBlLmNvbXBhcmU9ZnVuY3Rpb24odCxlLHIsbixpKXtpZighUCh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIik7aWYodm9pZCAwPT09ZSYmKGU9MCksdm9pZCAwPT09ciYmKHI9dD90Lmxlbmd0aDowKSx2b2lkIDA9PT1uJiYobj0wKSx2b2lkIDA9PT1pJiYoaT10aGlzLmxlbmd0aCksZTwwfHxyPnQubGVuZ3RofHxuPDB8fGk+dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm91dCBvZiByYW5nZSBpbmRleCIpO2lmKG4+PWkmJmU+PXIpcmV0dXJuIDA7aWYobj49aSlyZXR1cm4tMTtpZihlPj1yKXJldHVybiAxO2lmKHRoaXM9PT10KXJldHVybiAwO2Zvcih2YXIgbz0oaT4+Pj0wKS0obj4+Pj0wKSxzPShyPj4+PTApLShlPj4+PTApLGE9TWF0aC5taW4obyxzKSx1PXRoaXMuc2xpY2UobixpKSxoPXQuc2xpY2UoZSxyKSxmPTA7ZjxhOysrZilpZih1W2ZdIT09aFtmXSl7bz11W2ZdLHM9aFtmXTticmVha31yZXR1cm4gbzxzPy0xOnM8bz8xOjB9LEEucHJvdG90eXBlLmluY2x1ZGVzPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4tMSE9PXRoaXMuaW5kZXhPZih0LGUscil9LEEucHJvdG90eXBlLmluZGV4T2Y9ZnVuY3Rpb24odCxlLHIpe3JldHVybiBVKHRoaXMsdCxlLHIsITApfSxBLnByb3RvdHlwZS5sYXN0SW5kZXhPZj1mdW5jdGlvbih0LGUscil7cmV0dXJuIFUodGhpcyx0LGUsciwhMSl9LEEucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKHQsZSxyLG4pe2lmKHZvaWQgMD09PWUpbj0idXRmOCIscj10aGlzLmxlbmd0aCxlPTA7ZWxzZSBpZih2b2lkIDA9PT1yJiYic3RyaW5nIj09dHlwZW9mIGUpbj1lLHI9dGhpcy5sZW5ndGgsZT0wO2Vsc2V7aWYoIWlzRmluaXRlKGUpKXRocm93IG5ldyBFcnJvcigiQnVmZmVyLndyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldFssIGxlbmd0aF0pIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQiKTtlfD0wLGlzRmluaXRlKHIpPyhyfD0wLHZvaWQgMD09PW4mJihuPSJ1dGY4IikpOihuPXIscj12b2lkIDApfXZhciBpPXRoaXMubGVuZ3RoLWU7aWYoKHZvaWQgMD09PXJ8fHI+aSkmJihyPWkpLHQubGVuZ3RoPjAmJihyPDB8fGU8MCl8fGU+dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkF0dGVtcHQgdG8gd3JpdGUgb3V0c2lkZSBidWZmZXIgYm91bmRzIik7bnx8KG49InV0ZjgiKTtmb3IodmFyIG89ITE7Oylzd2l0Y2gobil7Y2FzZSJoZXgiOnJldHVybiBEKHRoaXMsdCxlLHIpO2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6cmV0dXJuIE4odGhpcyx0LGUscik7Y2FzZSJhc2NpaSI6cmV0dXJuIEYodGhpcyx0LGUscik7Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4geih0aGlzLHQsZSxyKTtjYXNlImJhc2U2NCI6cmV0dXJuIHEodGhpcyx0LGUscik7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiBZKHRoaXMsdCxlLHIpO2RlZmF1bHQ6aWYobyl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK24pO249KCIiK24pLnRvTG93ZXJDYXNlKCksbz0hMH19LEEucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybnt0eXBlOiJCdWZmZXIiLGRhdGE6QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5fYXJyfHx0aGlzLDApfX07ZnVuY3Rpb24gRyh0LGUscil7dmFyIG49IiI7cj1NYXRoLm1pbih0Lmxlbmd0aCxyKTtmb3IodmFyIGk9ZTtpPHI7KytpKW4rPVN0cmluZy5mcm9tQ2hhckNvZGUoMTI3JnRbaV0pO3JldHVybiBufWZ1bmN0aW9uIEoodCxlLHIpe3ZhciBuPSIiO3I9TWF0aC5taW4odC5sZW5ndGgscik7Zm9yKHZhciBpPWU7aTxyOysraSluKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHRbaV0pO3JldHVybiBufWZ1bmN0aW9uIEgodCxlLHIpe3ZhciBuPXQubGVuZ3RoOyghZXx8ZTwwKSYmKGU9MCksKCFyfHxyPDB8fHI+bikmJihyPW4pO2Zvcih2YXIgaT0iIixvPWU7bzxyOysrbylpKz1pdCh0W29dKTtyZXR1cm4gaX1mdW5jdGlvbiBWKHQsZSxyKXtmb3IodmFyIG49dC5zbGljZShlLHIpLGk9IiIsbz0wO288bi5sZW5ndGg7bys9MilpKz1TdHJpbmcuZnJvbUNoYXJDb2RlKG5bb10rMjU2Km5bbysxXSk7cmV0dXJuIGl9ZnVuY3Rpb24gSyh0LGUscil7aWYodCUxIT0wfHx0PDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm9mZnNldCBpcyBub3QgdWludCIpO2lmKHQrZT5yKXRocm93IG5ldyBSYW5nZUVycm9yKCJUcnlpbmcgdG8gYWNjZXNzIGJleW9uZCBidWZmZXIgbGVuZ3RoIil9ZnVuY3Rpb24gWih0LGUscixuLGksbyl7aWYoIVAodCkpdGhyb3cgbmV3IFR5cGVFcnJvcignImJ1ZmZlciIgYXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpO2lmKGU+aXx8ZTxvKXRocm93IG5ldyBSYW5nZUVycm9yKCcidmFsdWUiIGFyZ3VtZW50IGlzIG91dCBvZiBib3VuZHMnKTtpZihyK24+dC5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpfWZ1bmN0aW9uIFEodCxlLHIsbil7ZTwwJiYoZT02NTUzNStlKzEpO2Zvcih2YXIgaT0wLG89TWF0aC5taW4odC5sZW5ndGgtciwyKTtpPG87KytpKXRbcitpXT0oZSYyNTU8PDgqKG4/aToxLWkpKT4+PjgqKG4/aToxLWkpfWZ1bmN0aW9uIFgodCxlLHIsbil7ZTwwJiYoZT00Mjk0OTY3Mjk1K2UrMSk7Zm9yKHZhciBpPTAsbz1NYXRoLm1pbih0Lmxlbmd0aC1yLDQpO2k8bzsrK2kpdFtyK2ldPWU+Pj44KihuP2k6My1pKSYyNTV9ZnVuY3Rpb24gdHQodCxlLHIsbixpLG8pe2lmKHIrbj50Lmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIik7aWYocjwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBldCh0LGUscixuLGkpe3JldHVybiBpfHx0dCh0LDAsciw0KSxfKHQsZSxyLG4sMjMsNCkscis0fWZ1bmN0aW9uIHJ0KHQsZSxyLG4saSl7cmV0dXJuIGl8fHR0KHQsMCxyLDgpLF8odCxlLHIsbiw1Miw4KSxyKzh9QS5wcm90b3R5cGUuc2xpY2U9ZnVuY3Rpb24odCxlKXt2YXIgcixuPXRoaXMubGVuZ3RoO2lmKCh0PX5+dCk8MD8odCs9bik8MCYmKHQ9MCk6dD5uJiYodD1uKSwoZT12b2lkIDA9PT1lP246fn5lKTwwPyhlKz1uKTwwJiYoZT0wKTplPm4mJihlPW4pLGU8dCYmKGU9dCksQS5UWVBFRF9BUlJBWV9TVVBQT1JUKShyPXRoaXMuc3ViYXJyYXkodCxlKSkuX19wcm90b19fPUEucHJvdG90eXBlO2Vsc2V7dmFyIGk9ZS10O3I9bmV3IEEoaSx2b2lkIDApO2Zvcih2YXIgbz0wO288aTsrK28pcltvXT10aGlzW28rdF19cmV0dXJuIHJ9LEEucHJvdG90eXBlLnJlYWRVSW50TEU9ZnVuY3Rpb24odCxlLHIpe3R8PTAsZXw9MCxyfHxLKHQsZSx0aGlzLmxlbmd0aCk7Zm9yKHZhciBuPXRoaXNbdF0saT0xLG89MDsrK288ZSYmKGkqPTI1Nik7KW4rPXRoaXNbdCtvXSppO3JldHVybiBufSxBLnByb3RvdHlwZS5yZWFkVUludEJFPWZ1bmN0aW9uKHQsZSxyKXt0fD0wLGV8PTAscnx8Syh0LGUsdGhpcy5sZW5ndGgpO2Zvcih2YXIgbj10aGlzW3QrLS1lXSxpPTE7ZT4wJiYoaSo9MjU2KTspbis9dGhpc1t0Ky0tZV0qaTtyZXR1cm4gbn0sQS5wcm90b3R5cGUucmVhZFVJbnQ4PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEsodCwxLHRoaXMubGVuZ3RoKSx0aGlzW3RdfSxBLnByb3RvdHlwZS5yZWFkVUludDE2TEU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Syh0LDIsdGhpcy5sZW5ndGgpLHRoaXNbdF18dGhpc1t0KzFdPDw4fSxBLnByb3RvdHlwZS5yZWFkVUludDE2QkU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Syh0LDIsdGhpcy5sZW5ndGgpLHRoaXNbdF08PDh8dGhpc1t0KzFdfSxBLnByb3RvdHlwZS5yZWFkVUludDMyTEU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Syh0LDQsdGhpcy5sZW5ndGgpLCh0aGlzW3RdfHRoaXNbdCsxXTw8OHx0aGlzW3QrMl08PDE2KSsxNjc3NzIxNip0aGlzW3QrM119LEEucHJvdG90eXBlLnJlYWRVSW50MzJCRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxLKHQsNCx0aGlzLmxlbmd0aCksMTY3NzcyMTYqdGhpc1t0XSsodGhpc1t0KzFdPDwxNnx0aGlzW3QrMl08PDh8dGhpc1t0KzNdKX0sQS5wcm90b3R5cGUucmVhZEludExFPWZ1bmN0aW9uKHQsZSxyKXt0fD0wLGV8PTAscnx8Syh0LGUsdGhpcy5sZW5ndGgpO2Zvcih2YXIgbj10aGlzW3RdLGk9MSxvPTA7KytvPGUmJihpKj0yNTYpOyluKz10aGlzW3Qrb10qaTtyZXR1cm4gbj49KGkqPTEyOCkmJihuLT1NYXRoLnBvdygyLDgqZSkpLG59LEEucHJvdG90eXBlLnJlYWRJbnRCRT1mdW5jdGlvbih0LGUscil7dHw9MCxlfD0wLHJ8fEsodCxlLHRoaXMubGVuZ3RoKTtmb3IodmFyIG49ZSxpPTEsbz10aGlzW3QrLS1uXTtuPjAmJihpKj0yNTYpOylvKz10aGlzW3QrLS1uXSppO3JldHVybiBvPj0oaSo9MTI4KSYmKG8tPU1hdGgucG93KDIsOCplKSksb30sQS5wcm90b3R5cGUucmVhZEludDg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Syh0LDEsdGhpcy5sZW5ndGgpLDEyOCZ0aGlzW3RdPy0xKigyNTUtdGhpc1t0XSsxKTp0aGlzW3RdfSxBLnByb3RvdHlwZS5yZWFkSW50MTZMRT1mdW5jdGlvbih0LGUpe2V8fEsodCwyLHRoaXMubGVuZ3RoKTt2YXIgcj10aGlzW3RdfHRoaXNbdCsxXTw8ODtyZXR1cm4gMzI3Njgmcj80Mjk0OTAxNzYwfHI6cn0sQS5wcm90b3R5cGUucmVhZEludDE2QkU9ZnVuY3Rpb24odCxlKXtlfHxLKHQsMix0aGlzLmxlbmd0aCk7dmFyIHI9dGhpc1t0KzFdfHRoaXNbdF08PDg7cmV0dXJuIDMyNzY4JnI/NDI5NDkwMTc2MHxyOnJ9LEEucHJvdG90eXBlLnJlYWRJbnQzMkxFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEsodCw0LHRoaXMubGVuZ3RoKSx0aGlzW3RdfHRoaXNbdCsxXTw8OHx0aGlzW3QrMl08PDE2fHRoaXNbdCszXTw8MjR9LEEucHJvdG90eXBlLnJlYWRJbnQzMkJFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEsodCw0LHRoaXMubGVuZ3RoKSx0aGlzW3RdPDwyNHx0aGlzW3QrMV08PDE2fHRoaXNbdCsyXTw8OHx0aGlzW3QrM119LEEucHJvdG90eXBlLnJlYWRGbG9hdExFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEsodCw0LHRoaXMubGVuZ3RoKSx3KHRoaXMsdCwhMCwyMyw0KX0sQS5wcm90b3R5cGUucmVhZEZsb2F0QkU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Syh0LDQsdGhpcy5sZW5ndGgpLHcodGhpcyx0LCExLDIzLDQpfSxBLnByb3RvdHlwZS5yZWFkRG91YmxlTEU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Syh0LDgsdGhpcy5sZW5ndGgpLHcodGhpcyx0LCEwLDUyLDgpfSxBLnByb3RvdHlwZS5yZWFkRG91YmxlQkU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Syh0LDgsdGhpcy5sZW5ndGgpLHcodGhpcyx0LCExLDUyLDgpfSxBLnByb3RvdHlwZS53cml0ZVVJbnRMRT1mdW5jdGlvbih0LGUscixuKXsodD0rdCxlfD0wLHJ8PTAsbil8fFoodGhpcyx0LGUscixNYXRoLnBvdygyLDgqciktMSwwKTt2YXIgaT0xLG89MDtmb3IodGhpc1tlXT0yNTUmdDsrK288ciYmKGkqPTI1Nik7KXRoaXNbZStvXT10L2kmMjU1O3JldHVybiBlK3J9LEEucHJvdG90eXBlLndyaXRlVUludEJFPWZ1bmN0aW9uKHQsZSxyLG4peyh0PSt0LGV8PTAscnw9MCxuKXx8Wih0aGlzLHQsZSxyLE1hdGgucG93KDIsOCpyKS0xLDApO3ZhciBpPXItMSxvPTE7Zm9yKHRoaXNbZStpXT0yNTUmdDstLWk+PTAmJihvKj0yNTYpOyl0aGlzW2UraV09dC9vJjI1NTtyZXR1cm4gZStyfSxBLnByb3RvdHlwZS53cml0ZVVJbnQ4PWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fFoodGhpcyx0LGUsMSwyNTUsMCksQS5UWVBFRF9BUlJBWV9TVVBQT1JUfHwodD1NYXRoLmZsb29yKHQpKSx0aGlzW2VdPTI1NSZ0LGUrMX0sQS5wcm90b3R5cGUud3JpdGVVSW50MTZMRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZXw9MCxyfHxaKHRoaXMsdCxlLDIsNjU1MzUsMCksQS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPTI1NSZ0LHRoaXNbZSsxXT10Pj4+OCk6USh0aGlzLHQsZSwhMCksZSsyfSxBLnByb3RvdHlwZS53cml0ZVVJbnQxNkJFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fFoodGhpcyx0LGUsMiw2NTUzNSwwKSxBLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09dD4+PjgsdGhpc1tlKzFdPTI1NSZ0KTpRKHRoaXMsdCxlLCExKSxlKzJ9LEEucHJvdG90eXBlLndyaXRlVUludDMyTEU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGV8PTAscnx8Wih0aGlzLHQsZSw0LDQyOTQ5NjcyOTUsMCksQS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2UrM109dD4+PjI0LHRoaXNbZSsyXT10Pj4+MTYsdGhpc1tlKzFdPXQ+Pj44LHRoaXNbZV09MjU1JnQpOlgodGhpcyx0LGUsITApLGUrNH0sQS5wcm90b3R5cGUud3JpdGVVSW50MzJCRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZXw9MCxyfHxaKHRoaXMsdCxlLDQsNDI5NDk2NzI5NSwwKSxBLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09dD4+PjI0LHRoaXNbZSsxXT10Pj4+MTYsdGhpc1tlKzJdPXQ+Pj44LHRoaXNbZSszXT0yNTUmdCk6WCh0aGlzLHQsZSwhMSksZSs0fSxBLnByb3RvdHlwZS53cml0ZUludExFPWZ1bmN0aW9uKHQsZSxyLG4pe2lmKHQ9K3QsZXw9MCwhbil7dmFyIGk9TWF0aC5wb3coMiw4KnItMSk7Wih0aGlzLHQsZSxyLGktMSwtaSl9dmFyIG89MCxzPTEsYT0wO2Zvcih0aGlzW2VdPTI1NSZ0OysrbzxyJiYocyo9MjU2KTspdDwwJiYwPT09YSYmMCE9PXRoaXNbZStvLTFdJiYoYT0xKSx0aGlzW2Urb109KHQvcz4+MCktYSYyNTU7cmV0dXJuIGUrcn0sQS5wcm90b3R5cGUud3JpdGVJbnRCRT1mdW5jdGlvbih0LGUscixuKXtpZih0PSt0LGV8PTAsIW4pe3ZhciBpPU1hdGgucG93KDIsOCpyLTEpO1oodGhpcyx0LGUscixpLTEsLWkpfXZhciBvPXItMSxzPTEsYT0wO2Zvcih0aGlzW2Urb109MjU1JnQ7LS1vPj0wJiYocyo9MjU2KTspdDwwJiYwPT09YSYmMCE9PXRoaXNbZStvKzFdJiYoYT0xKSx0aGlzW2Urb109KHQvcz4+MCktYSYyNTU7cmV0dXJuIGUrcn0sQS5wcm90b3R5cGUud3JpdGVJbnQ4PWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fFoodGhpcyx0LGUsMSwxMjcsLTEyOCksQS5UWVBFRF9BUlJBWV9TVVBQT1JUfHwodD1NYXRoLmZsb29yKHQpKSx0PDAmJih0PTI1NSt0KzEpLHRoaXNbZV09MjU1JnQsZSsxfSxBLnByb3RvdHlwZS53cml0ZUludDE2TEU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGV8PTAscnx8Wih0aGlzLHQsZSwyLDMyNzY3LC0zMjc2OCksQS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPTI1NSZ0LHRoaXNbZSsxXT10Pj4+OCk6USh0aGlzLHQsZSwhMCksZSsyfSxBLnByb3RvdHlwZS53cml0ZUludDE2QkU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGV8PTAscnx8Wih0aGlzLHQsZSwyLDMyNzY3LC0zMjc2OCksQS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPXQ+Pj44LHRoaXNbZSsxXT0yNTUmdCk6USh0aGlzLHQsZSwhMSksZSsyfSxBLnByb3RvdHlwZS53cml0ZUludDMyTEU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGV8PTAscnx8Wih0aGlzLHQsZSw0LDIxNDc0ODM2NDcsLTIxNDc0ODM2NDgpLEEuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT0yNTUmdCx0aGlzW2UrMV09dD4+PjgsdGhpc1tlKzJdPXQ+Pj4xNix0aGlzW2UrM109dD4+PjI0KTpYKHRoaXMsdCxlLCEwKSxlKzR9LEEucHJvdG90eXBlLndyaXRlSW50MzJCRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZXw9MCxyfHxaKHRoaXMsdCxlLDQsMjE0NzQ4MzY0NywtMjE0NzQ4MzY0OCksdDwwJiYodD00Mjk0OTY3Mjk1K3QrMSksQS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPXQ+Pj4yNCx0aGlzW2UrMV09dD4+PjE2LHRoaXNbZSsyXT10Pj4+OCx0aGlzW2UrM109MjU1JnQpOlgodGhpcyx0LGUsITEpLGUrNH0sQS5wcm90b3R5cGUud3JpdGVGbG9hdExFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gZXQodGhpcyx0LGUsITAscil9LEEucHJvdG90eXBlLndyaXRlRmxvYXRCRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIGV0KHRoaXMsdCxlLCExLHIpfSxBLnByb3RvdHlwZS53cml0ZURvdWJsZUxFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gcnQodGhpcyx0LGUsITAscil9LEEucHJvdG90eXBlLndyaXRlRG91YmxlQkU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiBydCh0aGlzLHQsZSwhMSxyKX0sQS5wcm90b3R5cGUuY29weT1mdW5jdGlvbih0LGUscixuKXtpZihyfHwocj0wKSxufHwwPT09bnx8KG49dGhpcy5sZW5ndGgpLGU+PXQubGVuZ3RoJiYoZT10Lmxlbmd0aCksZXx8KGU9MCksbj4wJiZuPHImJihuPXIpLG49PT1yKXJldHVybiAwO2lmKDA9PT10Lmxlbmd0aHx8MD09PXRoaXMubGVuZ3RoKXJldHVybiAwO2lmKGU8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigidGFyZ2V0U3RhcnQgb3V0IG9mIGJvdW5kcyIpO2lmKHI8MHx8cj49dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInNvdXJjZVN0YXJ0IG91dCBvZiBib3VuZHMiKTtpZihuPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoInNvdXJjZUVuZCBvdXQgb2YgYm91bmRzIik7bj50aGlzLmxlbmd0aCYmKG49dGhpcy5sZW5ndGgpLHQubGVuZ3RoLWU8bi1yJiYobj10Lmxlbmd0aC1lK3IpO3ZhciBpLG89bi1yO2lmKHRoaXM9PT10JiZyPGUmJmU8bilmb3IoaT1vLTE7aT49MDstLWkpdFtpK2VdPXRoaXNbaStyXTtlbHNlIGlmKG88MWUzfHwhQS5UWVBFRF9BUlJBWV9TVVBQT1JUKWZvcihpPTA7aTxvOysraSl0W2krZV09dGhpc1tpK3JdO2Vsc2UgVWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwodCx0aGlzLnN1YmFycmF5KHIscitvKSxlKTtyZXR1cm4gb30sQS5wcm90b3R5cGUuZmlsbD1mdW5jdGlvbih0LGUscixuKXtpZigic3RyaW5nIj09dHlwZW9mIHQpe2lmKCJzdHJpbmciPT10eXBlb2YgZT8obj1lLGU9MCxyPXRoaXMubGVuZ3RoKToic3RyaW5nIj09dHlwZW9mIHImJihuPXIscj10aGlzLmxlbmd0aCksMT09PXQubGVuZ3RoKXt2YXIgaT10LmNoYXJDb2RlQXQoMCk7aTwyNTYmJih0PWkpfWlmKHZvaWQgMCE9PW4mJiJzdHJpbmciIT10eXBlb2Ygbil0aHJvdyBuZXcgVHlwZUVycm9yKCJlbmNvZGluZyBtdXN0IGJlIGEgc3RyaW5nIik7aWYoInN0cmluZyI9PXR5cGVvZiBuJiYhQS5pc0VuY29kaW5nKG4pKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrbil9ZWxzZSJudW1iZXIiPT10eXBlb2YgdCYmKHQmPTI1NSk7aWYoZTwwfHx0aGlzLmxlbmd0aDxlfHx0aGlzLmxlbmd0aDxyKXRocm93IG5ldyBSYW5nZUVycm9yKCJPdXQgb2YgcmFuZ2UgaW5kZXgiKTtpZihyPD1lKXJldHVybiB0aGlzO3ZhciBvO2lmKGU+Pj49MCxyPXZvaWQgMD09PXI/dGhpcy5sZW5ndGg6cj4+PjAsdHx8KHQ9MCksIm51bWJlciI9PXR5cGVvZiB0KWZvcihvPWU7bzxyOysrbyl0aGlzW29dPXQ7ZWxzZXt2YXIgcz1QKHQpP3Q6b3QobmV3IEEodCxuKS50b1N0cmluZygpKSxhPXMubGVuZ3RoO2ZvcihvPTA7bzxyLWU7KytvKXRoaXNbbytlXT1zW28lYV19cmV0dXJuIHRoaXN9O3ZhciBudD0vW14rXC8wLTlBLVphLXotX10vZztmdW5jdGlvbiBpdCh0KXtyZXR1cm4gdDwxNj8iMCIrdC50b1N0cmluZygxNik6dC50b1N0cmluZygxNil9ZnVuY3Rpb24gb3QodCxlKXt2YXIgcjtlPWV8fDEvMDtmb3IodmFyIG49dC5sZW5ndGgsaT1udWxsLG89W10scz0wO3M8bjsrK3Mpe2lmKChyPXQuY2hhckNvZGVBdChzKSk+NTUyOTUmJnI8NTczNDQpe2lmKCFpKXtpZihyPjU2MzE5KXsoZS09Myk+LTEmJm8ucHVzaCgyMzksMTkxLDE4OSk7Y29udGludWV9aWYocysxPT09bil7KGUtPTMpPi0xJiZvLnB1c2goMjM5LDE5MSwxODkpO2NvbnRpbnVlfWk9cjtjb250aW51ZX1pZihyPDU2MzIwKXsoZS09Myk+LTEmJm8ucHVzaCgyMzksMTkxLDE4OSksaT1yO2NvbnRpbnVlfXI9NjU1MzYrKGktNTUyOTY8PDEwfHItNTYzMjApfWVsc2UgaSYmKGUtPTMpPi0xJiZvLnB1c2goMjM5LDE5MSwxODkpO2lmKGk9bnVsbCxyPDEyOCl7aWYoKGUtPTEpPDApYnJlYWs7by5wdXNoKHIpfWVsc2UgaWYocjwyMDQ4KXtpZigoZS09Mik8MClicmVhaztvLnB1c2gocj4+NnwxOTIsNjMmcnwxMjgpfWVsc2UgaWYocjw2NTUzNil7aWYoKGUtPTMpPDApYnJlYWs7by5wdXNoKHI+PjEyfDIyNCxyPj42JjYzfDEyOCw2MyZyfDEyOCl9ZWxzZXtpZighKHI8MTExNDExMikpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGNvZGUgcG9pbnQiKTtpZigoZS09NCk8MClicmVhaztvLnB1c2gocj4+MTh8MjQwLHI+PjEyJjYzfDEyOCxyPj42JjYzfDEyOCw2MyZyfDEyOCl9fXJldHVybiBvfWZ1bmN0aW9uIHN0KHQpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgZSxyLG4saSxvLHM7eXx8digpO3ZhciBhPXQubGVuZ3RoO2lmKGElND4wKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCIpO289Ij0iPT09dFthLTJdPzI6Ij0iPT09dFthLTFdPzE6MCxzPW5ldyBnKDMqYS80LW8pLG49bz4wP2EtNDphO3ZhciB1PTA7Zm9yKGU9MCxyPTA7ZTxuO2UrPTQscis9MylpPWRbdC5jaGFyQ29kZUF0KGUpXTw8MTh8ZFt0LmNoYXJDb2RlQXQoZSsxKV08PDEyfGRbdC5jaGFyQ29kZUF0KGUrMildPDw2fGRbdC5jaGFyQ29kZUF0KGUrMyldLHNbdSsrXT1pPj4xNiYyNTUsc1t1KytdPWk+PjgmMjU1LHNbdSsrXT0yNTUmaTtyZXR1cm4gMj09PW8/KGk9ZFt0LmNoYXJDb2RlQXQoZSldPDwyfGRbdC5jaGFyQ29kZUF0KGUrMSldPj40LHNbdSsrXT0yNTUmaSk6MT09PW8mJihpPWRbdC5jaGFyQ29kZUF0KGUpXTw8MTB8ZFt0LmNoYXJDb2RlQXQoZSsxKV08PDR8ZFt0LmNoYXJDb2RlQXQoZSsyKV0+PjIsc1t1KytdPWk+PjgmMjU1LHNbdSsrXT0yNTUmaSksc30oZnVuY3Rpb24odCl7aWYoKHQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQudHJpbT90LnRyaW0oKTp0LnJlcGxhY2UoL15ccyt8XHMrJC9nLCIiKX0odCkucmVwbGFjZShudCwiIikpLmxlbmd0aDwyKXJldHVybiIiO2Zvcig7dC5sZW5ndGglNCE9MDspdCs9Ij0iO3JldHVybiB0fSh0KSl9ZnVuY3Rpb24gYXQodCxlLHIsbil7Zm9yKHZhciBpPTA7aTxuJiYhKGkrcj49ZS5sZW5ndGh8fGk+PXQubGVuZ3RoKTsrK2kpZVtpK3JdPXRbaV07cmV0dXJuIGl9ZnVuY3Rpb24gdXQodCl7cmV0dXJuISF0LmNvbnN0cnVjdG9yJiYiZnVuY3Rpb24iPT10eXBlb2YgdC5jb25zdHJ1Y3Rvci5pc0J1ZmZlciYmdC5jb25zdHJ1Y3Rvci5pc0J1ZmZlcih0KX1mdW5jdGlvbiBodCgpe3Rocm93IG5ldyBFcnJvcigic2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCIpfWZ1bmN0aW9uIGZ0KCl7dGhyb3cgbmV3IEVycm9yKCJjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQiKX12YXIgY3Q9aHQsbHQ9ZnQ7ZnVuY3Rpb24gcHQodCl7aWYoY3Q9PT1zZXRUaW1lb3V0KXJldHVybiBzZXRUaW1lb3V0KHQsMCk7aWYoKGN0PT09aHR8fCFjdCkmJnNldFRpbWVvdXQpcmV0dXJuIGN0PXNldFRpbWVvdXQsc2V0VGltZW91dCh0LDApO3RyeXtyZXR1cm4gY3QodCwwKX1jYXRjaChlKXt0cnl7cmV0dXJuIGN0LmNhbGwobnVsbCx0LDApfWNhdGNoKGUpe3JldHVybiBjdC5jYWxsKHRoaXMsdCwwKX19fSJmdW5jdGlvbiI9PXR5cGVvZiBsLnNldFRpbWVvdXQmJihjdD1zZXRUaW1lb3V0KSwiZnVuY3Rpb24iPT10eXBlb2YgbC5jbGVhclRpbWVvdXQmJihsdD1jbGVhclRpbWVvdXQpO3ZhciBkdCxndD1bXSx5dD0hMSx2dD0tMTtmdW5jdGlvbiBidCgpe3l0JiZkdCYmKHl0PSExLGR0Lmxlbmd0aD9ndD1kdC5jb25jYXQoZ3QpOnZ0PS0xLGd0Lmxlbmd0aCYmbXQoKSl9ZnVuY3Rpb24gbXQoKXtpZigheXQpe3ZhciB0PXB0KGJ0KTt5dD0hMDtmb3IodmFyIGU9Z3QubGVuZ3RoO2U7KXtmb3IoZHQ9Z3QsZ3Q9W107Kyt2dDxlOylkdCYmZHRbdnRdLnJ1bigpO3Z0PS0xLGU9Z3QubGVuZ3RofWR0PW51bGwseXQ9ITEsZnVuY3Rpb24odCl7aWYobHQ9PT1jbGVhclRpbWVvdXQpcmV0dXJuIGNsZWFyVGltZW91dCh0KTtpZigobHQ9PT1mdHx8IWx0KSYmY2xlYXJUaW1lb3V0KXJldHVybiBsdD1jbGVhclRpbWVvdXQsY2xlYXJUaW1lb3V0KHQpO3RyeXtsdCh0KX1jYXRjaChlKXt0cnl7cmV0dXJuIGx0LmNhbGwobnVsbCx0KX1jYXRjaChlKXtyZXR1cm4gbHQuY2FsbCh0aGlzLHQpfX19KHQpfX1mdW5jdGlvbiB3dCh0KXt2YXIgZT1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aC0xKTtpZihhcmd1bWVudHMubGVuZ3RoPjEpZm9yKHZhciByPTE7cjxhcmd1bWVudHMubGVuZ3RoO3IrKyllW3ItMV09YXJndW1lbnRzW3JdO2d0LnB1c2gobmV3IF90KHQsZSkpLDEhPT1ndC5sZW5ndGh8fHl0fHxwdChtdCl9ZnVuY3Rpb24gX3QodCxlKXt0aGlzLmZ1bj10LHRoaXMuYXJyYXk9ZX1fdC5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKCl7dGhpcy5mdW4uYXBwbHkobnVsbCx0aGlzLmFycmF5KX07ZnVuY3Rpb24gU3QoKXt9dmFyIEV0PVN0LGt0PVN0LFJ0PVN0LEF0PVN0LFR0PVN0LE90PVN0LGp0PVN0O3ZhciBMdD1sLnBlcmZvcm1hbmNlfHx7fSxDdD1MdC5ub3d8fEx0Lm1vek5vd3x8THQubXNOb3d8fEx0Lm9Ob3d8fEx0LndlYmtpdE5vd3x8ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUpLmdldFRpbWUoKX07dmFyIFB0PW5ldyBEYXRlO3ZhciBNdCxCdD17bmV4dFRpY2s6d3QsdGl0bGU6ImJyb3dzZXIiLGJyb3dzZXI6ITAsZW52Ont9LGFyZ3Y6W10sdmVyc2lvbjoiIix2ZXJzaW9uczp7fSxvbjpFdCxhZGRMaXN0ZW5lcjprdCxvbmNlOlJ0LG9mZjpBdCxyZW1vdmVMaXN0ZW5lcjpUdCxyZW1vdmVBbGxMaXN0ZW5lcnM6T3QsZW1pdDpqdCxiaW5kaW5nOmZ1bmN0aW9uKHQpe3Rocm93IG5ldyBFcnJvcigicHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQiKX0sY3dkOmZ1bmN0aW9uKCl7cmV0dXJuIi8ifSxjaGRpcjpmdW5jdGlvbih0KXt0aHJvdyBuZXcgRXJyb3IoInByb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCIpfSx1bWFzazpmdW5jdGlvbigpe3JldHVybiAwfSxocnRpbWU6ZnVuY3Rpb24odCl7dmFyIGU9LjAwMSpDdC5jYWxsKEx0KSxyPU1hdGguZmxvb3IoZSksbj1NYXRoLmZsb29yKGUlMSoxZTkpO3JldHVybiB0JiYoci09dFswXSwobi09dFsxXSk8MCYmKHItLSxuKz0xZTkpKSxbcixuXX0scGxhdGZvcm06ImJyb3dzZXIiLHJlbGVhc2U6e30sY29uZmlnOnt9LHVwdGltZTpmdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZS1QdCkvMWUzfX07TXQ9ImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5jcmVhdGU/ZnVuY3Rpb24odCxlKXt0LnN1cGVyXz1lLHQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pfTpmdW5jdGlvbih0LGUpe3Quc3VwZXJfPWU7dmFyIHI9ZnVuY3Rpb24oKXt9O3IucHJvdG90eXBlPWUucHJvdG90eXBlLHQucHJvdG90eXBlPW5ldyByLHQucHJvdG90eXBlLmNvbnN0cnVjdG9yPXR9O3ZhciB4dD1NdCxVdD0vJVtzZGolXS9nO2Z1bmN0aW9uIEl0KHQpe2lmKCFWdCh0KSl7Zm9yKHZhciBlPVtdLHI9MDtyPGFyZ3VtZW50cy5sZW5ndGg7cisrKWUucHVzaCh6dChhcmd1bWVudHNbcl0pKTtyZXR1cm4gZS5qb2luKCIgIil9cj0xO2Zvcih2YXIgbj1hcmd1bWVudHMsaT1uLmxlbmd0aCxvPVN0cmluZyh0KS5yZXBsYWNlKFV0LChmdW5jdGlvbih0KXtpZigiJSUiPT09dClyZXR1cm4iJSI7aWYocj49aSlyZXR1cm4gdDtzd2l0Y2godCl7Y2FzZSIlcyI6cmV0dXJuIFN0cmluZyhuW3IrK10pO2Nhc2UiJWQiOnJldHVybiBOdW1iZXIobltyKytdKTtjYXNlIiVqIjp0cnl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KG5bcisrXSl9Y2F0Y2godCl7cmV0dXJuIltDaXJjdWxhcl0ifWRlZmF1bHQ6cmV0dXJuIHR9fSkpLHM9bltyXTtyPGk7cz1uWysrcl0pSHQocyl8fCFRdChzKT9vKz0iICIrczpvKz0iICIrenQocyk7cmV0dXJuIG99ZnVuY3Rpb24gRHQodCxlKXtpZihLdChsLnByb2Nlc3MpKXJldHVybiBmdW5jdGlvbigpe3JldHVybiBEdCh0LGUpLmFwcGx5KHRoaXMsYXJndW1lbnRzKX07aWYoITA9PT1CdC5ub0RlcHJlY2F0aW9uKXJldHVybiB0O3ZhciByPSExO3JldHVybiBmdW5jdGlvbigpe2lmKCFyKXtpZihCdC50aHJvd0RlcHJlY2F0aW9uKXRocm93IG5ldyBFcnJvcihlKTtCdC50cmFjZURlcHJlY2F0aW9uP2NvbnNvbGUudHJhY2UoZSk6Y29uc29sZS5lcnJvcihlKSxyPSEwfXJldHVybiB0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX19dmFyIE50LEZ0PXt9O2Z1bmN0aW9uIHp0KHQsZSl7dmFyIHI9e3NlZW46W10sc3R5bGl6ZTpZdH07cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+PTMmJihyLmRlcHRoPWFyZ3VtZW50c1syXSksYXJndW1lbnRzLmxlbmd0aD49NCYmKHIuY29sb3JzPWFyZ3VtZW50c1szXSksSnQoZSk/ci5zaG93SGlkZGVuPWU6ZSYmbmUocixlKSxLdChyLnNob3dIaWRkZW4pJiYoci5zaG93SGlkZGVuPSExKSxLdChyLmRlcHRoKSYmKHIuZGVwdGg9MiksS3Qoci5jb2xvcnMpJiYoci5jb2xvcnM9ITEpLEt0KHIuY3VzdG9tSW5zcGVjdCkmJihyLmN1c3RvbUluc3BlY3Q9ITApLHIuY29sb3JzJiYoci5zdHlsaXplPXF0KSxXdChyLHQsci5kZXB0aCl9ZnVuY3Rpb24gcXQodCxlKXt2YXIgcj16dC5zdHlsZXNbZV07cmV0dXJuIHI/IhtbIit6dC5jb2xvcnNbcl1bMF0rIm0iK3QrIhtbIit6dC5jb2xvcnNbcl1bMV0rIm0iOnR9ZnVuY3Rpb24gWXQodCxlKXtyZXR1cm4gdH1mdW5jdGlvbiBXdCh0LGUscil7aWYodC5jdXN0b21JbnNwZWN0JiZlJiZlZShlLmluc3BlY3QpJiZlLmluc3BlY3QhPT16dCYmKCFlLmNvbnN0cnVjdG9yfHxlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSE9PWUpKXt2YXIgbj1lLmluc3BlY3Qocix0KTtyZXR1cm4gVnQobil8fChuPVd0KHQsbixyKSksbn12YXIgaT1mdW5jdGlvbih0LGUpe2lmKEt0KGUpKXJldHVybiB0LnN0eWxpemUoInVuZGVmaW5lZCIsInVuZGVmaW5lZCIpO2lmKFZ0KGUpKXt2YXIgcj0iJyIrSlNPTi5zdHJpbmdpZnkoZSkucmVwbGFjZSgvXiJ8IiQvZywiIikucmVwbGFjZSgvJy9nLCJcXCciKS5yZXBsYWNlKC9cXCIvZywnIicpKyInIjtyZXR1cm4gdC5zdHlsaXplKHIsInN0cmluZyIpfWlmKG49ZSwibnVtYmVyIj09dHlwZW9mIG4pcmV0dXJuIHQuc3R5bGl6ZSgiIitlLCJudW1iZXIiKTt2YXIgbjtpZihKdChlKSlyZXR1cm4gdC5zdHlsaXplKCIiK2UsImJvb2xlYW4iKTtpZihIdChlKSlyZXR1cm4gdC5zdHlsaXplKCJudWxsIiwibnVsbCIpfSh0LGUpO2lmKGkpcmV0dXJuIGk7dmFyIG89T2JqZWN0LmtleXMoZSkscz1mdW5jdGlvbih0KXt2YXIgZT17fTtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0LHIpe2VbdF09ITB9KSksZX0obyk7aWYodC5zaG93SGlkZGVuJiYobz1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlKSksdGUoZSkmJihvLmluZGV4T2YoIm1lc3NhZ2UiKT49MHx8by5pbmRleE9mKCJkZXNjcmlwdGlvbiIpPj0wKSlyZXR1cm4gJHQoZSk7aWYoMD09PW8ubGVuZ3RoKXtpZihlZShlKSl7dmFyIGE9ZS5uYW1lPyI6ICIrZS5uYW1lOiIiO3JldHVybiB0LnN0eWxpemUoIltGdW5jdGlvbiIrYSsiXSIsInNwZWNpYWwiKX1pZihadChlKSlyZXR1cm4gdC5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKSwicmVnZXhwIik7aWYoWHQoZSkpcmV0dXJuIHQuc3R5bGl6ZShEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLCJkYXRlIik7aWYodGUoZSkpcmV0dXJuICR0KGUpfXZhciB1LGgsZj0iIixjPSExLGw9WyJ7IiwifSJdOyh1PWUsQXJyYXkuaXNBcnJheSh1KSYmKGM9ITAsbD1bIlsiLCJdIl0pLGVlKGUpKSYmKGY9IiBbRnVuY3Rpb24iKyhlLm5hbWU/IjogIitlLm5hbWU6IiIpKyJdIik7cmV0dXJuIFp0KGUpJiYoZj0iICIrUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpKSxYdChlKSYmKGY9IiAiK0RhdGUucHJvdG90eXBlLnRvVVRDU3RyaW5nLmNhbGwoZSkpLHRlKGUpJiYoZj0iICIrJHQoZSkpLDAhPT1vLmxlbmd0aHx8YyYmMCE9ZS5sZW5ndGg/cjwwP1p0KGUpP3Quc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSksInJlZ2V4cCIpOnQuc3R5bGl6ZSgiW09iamVjdF0iLCJzcGVjaWFsIik6KHQuc2Vlbi5wdXNoKGUpLGg9Yz9mdW5jdGlvbih0LGUscixuLGkpe2Zvcih2YXIgbz1bXSxzPTAsYT1lLmxlbmd0aDtzPGE7KytzKWllKGUsU3RyaW5nKHMpKT9vLnB1c2goR3QodCxlLHIsbixTdHJpbmcocyksITApKTpvLnB1c2goIiIpO3JldHVybiBpLmZvckVhY2goKGZ1bmN0aW9uKGkpe2kubWF0Y2goL15cZCskLyl8fG8ucHVzaChHdCh0LGUscixuLGksITApKX0pKSxvfSh0LGUscixzLG8pOm8ubWFwKChmdW5jdGlvbihuKXtyZXR1cm4gR3QodCxlLHIscyxuLGMpfSkpLHQuc2Vlbi5wb3AoKSxmdW5jdGlvbih0LGUscil7aWYodC5yZWR1Y2UoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuaW5kZXhPZigiXG4iKSx0K2UucmVwbGFjZSgvXHUwMDFiXFtcZFxkP20vZywiIikubGVuZ3RoKzF9KSwwKT42MClyZXR1cm4gclswXSsoIiI9PT1lPyIiOmUrIlxuICIpKyIgIit0LmpvaW4oIixcbiAgIikrIiAiK3JbMV07cmV0dXJuIHJbMF0rZSsiICIrdC5qb2luKCIsICIpKyIgIityWzFdfShoLGYsbCkpOmxbMF0rZitsWzFdfWZ1bmN0aW9uICR0KHQpe3JldHVybiJbIitFcnJvci5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KSsiXSJ9ZnVuY3Rpb24gR3QodCxlLHIsbixpLG8pe3ZhciBzLGEsdTtpZigodT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsaSl8fHt2YWx1ZTplW2ldfSkuZ2V0P2E9dS5zZXQ/dC5zdHlsaXplKCJbR2V0dGVyL1NldHRlcl0iLCJzcGVjaWFsIik6dC5zdHlsaXplKCJbR2V0dGVyXSIsInNwZWNpYWwiKTp1LnNldCYmKGE9dC5zdHlsaXplKCJbU2V0dGVyXSIsInNwZWNpYWwiKSksaWUobixpKXx8KHM9IlsiK2krIl0iKSxhfHwodC5zZWVuLmluZGV4T2YodS52YWx1ZSk8MD8oYT1IdChyKT9XdCh0LHUudmFsdWUsbnVsbCk6V3QodCx1LnZhbHVlLHItMSkpLmluZGV4T2YoIlxuIik+LTEmJihhPW8/YS5zcGxpdCgiXG4iKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiIgICIrdH0pKS5qb2luKCJcbiIpLnN1YnN0cigyKToiXG4iK2Euc3BsaXQoIlxuIikubWFwKChmdW5jdGlvbih0KXtyZXR1cm4iICAgIit0fSkpLmpvaW4oIlxuIikpOmE9dC5zdHlsaXplKCJbQ2lyY3VsYXJdIiwic3BlY2lhbCIpKSxLdChzKSl7aWYobyYmaS5tYXRjaCgvXlxkKyQvKSlyZXR1cm4gYTsocz1KU09OLnN0cmluZ2lmeSgiIitpKSkubWF0Y2goL14iKFthLXpBLVpfXVthLXpBLVpfMC05XSopIiQvKT8ocz1zLnN1YnN0cigxLHMubGVuZ3RoLTIpLHM9dC5zdHlsaXplKHMsIm5hbWUiKSk6KHM9cy5yZXBsYWNlKC8nL2csIlxcJyIpLnJlcGxhY2UoL1xcIi9nLCciJykucmVwbGFjZSgvKF4ifCIkKS9nLCInIikscz10LnN0eWxpemUocywic3RyaW5nIikpfXJldHVybiBzKyI6ICIrYX1mdW5jdGlvbiBKdCh0KXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiB0fWZ1bmN0aW9uIEh0KHQpe3JldHVybiBudWxsPT09dH1mdW5jdGlvbiBWdCh0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHR9ZnVuY3Rpb24gS3QodCl7cmV0dXJuIHZvaWQgMD09PXR9ZnVuY3Rpb24gWnQodCl7cmV0dXJuIFF0KHQpJiYiW29iamVjdCBSZWdFeHBdIj09PXJlKHQpfWZ1bmN0aW9uIFF0KHQpe3JldHVybiJvYmplY3QiPT10eXBlb2YgdCYmbnVsbCE9PXR9ZnVuY3Rpb24gWHQodCl7cmV0dXJuIFF0KHQpJiYiW29iamVjdCBEYXRlXSI9PT1yZSh0KX1mdW5jdGlvbiB0ZSh0KXtyZXR1cm4gUXQodCkmJigiW29iamVjdCBFcnJvcl0iPT09cmUodCl8fHQgaW5zdGFuY2VvZiBFcnJvcil9ZnVuY3Rpb24gZWUodCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHR9ZnVuY3Rpb24gcmUodCl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBuZSh0LGUpe2lmKCFlfHwhUXQoZSkpcmV0dXJuIHQ7Zm9yKHZhciByPU9iamVjdC5rZXlzKGUpLG49ci5sZW5ndGg7bi0tOyl0W3Jbbl1dPWVbcltuXV07cmV0dXJuIHR9ZnVuY3Rpb24gaWUodCxlKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsZSl9ZnVuY3Rpb24gb2UoKXt0aGlzLmhlYWQ9bnVsbCx0aGlzLnRhaWw9bnVsbCx0aGlzLmxlbmd0aD0wfXp0LmNvbG9ycz17Ym9sZDpbMSwyMl0saXRhbGljOlszLDIzXSx1bmRlcmxpbmU6WzQsMjRdLGludmVyc2U6WzcsMjddLHdoaXRlOlszNywzOV0sZ3JleTpbOTAsMzldLGJsYWNrOlszMCwzOV0sYmx1ZTpbMzQsMzldLGN5YW46WzM2LDM5XSxncmVlbjpbMzIsMzldLG1hZ2VudGE6WzM1LDM5XSxyZWQ6WzMxLDM5XSx5ZWxsb3c6WzMzLDM5XX0senQuc3R5bGVzPXtzcGVjaWFsOiJjeWFuIixudW1iZXI6InllbGxvdyIsYm9vbGVhbjoieWVsbG93Iix1bmRlZmluZWQ6ImdyZXkiLG51bGw6ImJvbGQiLHN0cmluZzoiZ3JlZW4iLGRhdGU6Im1hZ2VudGEiLHJlZ2V4cDoicmVkIn0sb2UucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24odCl7dmFyIGU9e2RhdGE6dCxuZXh0Om51bGx9O3RoaXMubGVuZ3RoPjA/dGhpcy50YWlsLm5leHQ9ZTp0aGlzLmhlYWQ9ZSx0aGlzLnRhaWw9ZSwrK3RoaXMubGVuZ3RofSxvZS5wcm90b3R5cGUudW5zaGlmdD1mdW5jdGlvbih0KXt2YXIgZT17ZGF0YTp0LG5leHQ6dGhpcy5oZWFkfTswPT09dGhpcy5sZW5ndGgmJih0aGlzLnRhaWw9ZSksdGhpcy5oZWFkPWUsKyt0aGlzLmxlbmd0aH0sb2UucHJvdG90eXBlLnNoaWZ0PWZ1bmN0aW9uKCl7aWYoMCE9PXRoaXMubGVuZ3RoKXt2YXIgdD10aGlzLmhlYWQuZGF0YTtyZXR1cm4gMT09PXRoaXMubGVuZ3RoP3RoaXMuaGVhZD10aGlzLnRhaWw9bnVsbDp0aGlzLmhlYWQ9dGhpcy5oZWFkLm5leHQsLS10aGlzLmxlbmd0aCx0fX0sb2UucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5oZWFkPXRoaXMudGFpbD1udWxsLHRoaXMubGVuZ3RoPTB9LG9lLnByb3RvdHlwZS5qb2luPWZ1bmN0aW9uKHQpe2lmKDA9PT10aGlzLmxlbmd0aClyZXR1cm4iIjtmb3IodmFyIGU9dGhpcy5oZWFkLHI9IiIrZS5kYXRhO2U9ZS5uZXh0OylyKz10K2UuZGF0YTtyZXR1cm4gcn0sb2UucHJvdG90eXBlLmNvbmNhdD1mdW5jdGlvbih0KXtpZigwPT09dGhpcy5sZW5ndGgpcmV0dXJuIEEuYWxsb2MoMCk7aWYoMT09PXRoaXMubGVuZ3RoKXJldHVybiB0aGlzLmhlYWQuZGF0YTtmb3IodmFyIGU9QS5hbGxvY1Vuc2FmZSh0Pj4+MCkscj10aGlzLmhlYWQsbj0wO3I7KXIuZGF0YS5jb3B5KGUsbiksbis9ci5kYXRhLmxlbmd0aCxyPXIubmV4dDtyZXR1cm4gZX07dmFyIHNlPUEuaXNFbmNvZGluZ3x8ZnVuY3Rpb24odCl7c3dpdGNoKHQmJnQudG9Mb3dlckNhc2UoKSl7Y2FzZSJoZXgiOmNhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6Y2FzZSJhc2NpaSI6Y2FzZSJiaW5hcnkiOmNhc2UiYmFzZTY0IjpjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6Y2FzZSJyYXciOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fTtmdW5jdGlvbiBhZSh0KXtzd2l0Y2godGhpcy5lbmNvZGluZz0odHx8InV0ZjgiKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1stX10vLCIiKSxmdW5jdGlvbih0KXtpZih0JiYhc2UodCkpdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK3QpfSh0KSx0aGlzLmVuY29kaW5nKXtjYXNlInV0ZjgiOnRoaXMuc3Vycm9nYXRlU2l6ZT0zO2JyZWFrO2Nhc2UidWNzMiI6Y2FzZSJ1dGYxNmxlIjp0aGlzLnN1cnJvZ2F0ZVNpemU9Mix0aGlzLmRldGVjdEluY29tcGxldGVDaGFyPWhlO2JyZWFrO2Nhc2UiYmFzZTY0Ijp0aGlzLnN1cnJvZ2F0ZVNpemU9Myx0aGlzLmRldGVjdEluY29tcGxldGVDaGFyPWZlO2JyZWFrO2RlZmF1bHQ6cmV0dXJuIHZvaWQodGhpcy53cml0ZT11ZSl9dGhpcy5jaGFyQnVmZmVyPW5ldyBBKDYpLHRoaXMuY2hhclJlY2VpdmVkPTAsdGhpcy5jaGFyTGVuZ3RoPTB9ZnVuY3Rpb24gdWUodCl7cmV0dXJuIHQudG9TdHJpbmcodGhpcy5lbmNvZGluZyl9ZnVuY3Rpb24gaGUodCl7dGhpcy5jaGFyUmVjZWl2ZWQ9dC5sZW5ndGglMix0aGlzLmNoYXJMZW5ndGg9dGhpcy5jaGFyUmVjZWl2ZWQ/MjowfWZ1bmN0aW9uIGZlKHQpe3RoaXMuY2hhclJlY2VpdmVkPXQubGVuZ3RoJTMsdGhpcy5jaGFyTGVuZ3RoPXRoaXMuY2hhclJlY2VpdmVkPzM6MH1hZS5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPSIiO3RoaXMuY2hhckxlbmd0aDspe3ZhciByPXQubGVuZ3RoPj10aGlzLmNoYXJMZW5ndGgtdGhpcy5jaGFyUmVjZWl2ZWQ/dGhpcy5jaGFyTGVuZ3RoLXRoaXMuY2hhclJlY2VpdmVkOnQubGVuZ3RoO2lmKHQuY29weSh0aGlzLmNoYXJCdWZmZXIsdGhpcy5jaGFyUmVjZWl2ZWQsMCxyKSx0aGlzLmNoYXJSZWNlaXZlZCs9cix0aGlzLmNoYXJSZWNlaXZlZDx0aGlzLmNoYXJMZW5ndGgpcmV0dXJuIiI7aWYodD10LnNsaWNlKHIsdC5sZW5ndGgpLCEoKGk9KGU9dGhpcy5jaGFyQnVmZmVyLnNsaWNlKDAsdGhpcy5jaGFyTGVuZ3RoKS50b1N0cmluZyh0aGlzLmVuY29kaW5nKSkuY2hhckNvZGVBdChlLmxlbmd0aC0xKSk+PTU1Mjk2JiZpPD01NjMxOSkpe2lmKHRoaXMuY2hhclJlY2VpdmVkPXRoaXMuY2hhckxlbmd0aD0wLDA9PT10Lmxlbmd0aClyZXR1cm4gZTticmVha310aGlzLmNoYXJMZW5ndGgrPXRoaXMuc3Vycm9nYXRlU2l6ZSxlPSIifXRoaXMuZGV0ZWN0SW5jb21wbGV0ZUNoYXIodCk7dmFyIG49dC5sZW5ndGg7dGhpcy5jaGFyTGVuZ3RoJiYodC5jb3B5KHRoaXMuY2hhckJ1ZmZlciwwLHQubGVuZ3RoLXRoaXMuY2hhclJlY2VpdmVkLG4pLG4tPXRoaXMuY2hhclJlY2VpdmVkKTt2YXIgaTtuPShlKz10LnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcsMCxuKSkubGVuZ3RoLTE7aWYoKGk9ZS5jaGFyQ29kZUF0KG4pKT49NTUyOTYmJmk8PTU2MzE5KXt2YXIgbz10aGlzLnN1cnJvZ2F0ZVNpemU7cmV0dXJuIHRoaXMuY2hhckxlbmd0aCs9byx0aGlzLmNoYXJSZWNlaXZlZCs9byx0aGlzLmNoYXJCdWZmZXIuY29weSh0aGlzLmNoYXJCdWZmZXIsbywwLG8pLHQuY29weSh0aGlzLmNoYXJCdWZmZXIsMCwwLG8pLGUuc3Vic3RyaW5nKDAsbil9cmV0dXJuIGV9LGFlLnByb3RvdHlwZS5kZXRlY3RJbmNvbXBsZXRlQ2hhcj1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC5sZW5ndGg+PTM/Mzp0Lmxlbmd0aDtlPjA7ZS0tKXt2YXIgcj10W3QubGVuZ3RoLWVdO2lmKDE9PWUmJnI+PjU9PTYpe3RoaXMuY2hhckxlbmd0aD0yO2JyZWFrfWlmKGU8PTImJnI+PjQ9PTE0KXt0aGlzLmNoYXJMZW5ndGg9MzticmVha31pZihlPD0zJiZyPj4zPT0zMCl7dGhpcy5jaGFyTGVuZ3RoPTQ7YnJlYWt9fXRoaXMuY2hhclJlY2VpdmVkPWV9LGFlLnByb3RvdHlwZS5lbmQ9ZnVuY3Rpb24odCl7dmFyIGU9IiI7aWYodCYmdC5sZW5ndGgmJihlPXRoaXMud3JpdGUodCkpLHRoaXMuY2hhclJlY2VpdmVkKXt2YXIgcj10aGlzLmNoYXJSZWNlaXZlZCxuPXRoaXMuY2hhckJ1ZmZlcixpPXRoaXMuZW5jb2Rpbmc7ZSs9bi5zbGljZSgwLHIpLnRvU3RyaW5nKGkpfXJldHVybiBlfSxwZS5SZWFkYWJsZVN0YXRlPWxlO3ZhciBjZT1mdW5jdGlvbih0KXtpZihLdChOdCkmJihOdD1CdC5lbnYuTk9ERV9ERUJVR3x8IiIpLHQ9dC50b1VwcGVyQ2FzZSgpLCFGdFt0XSlpZihuZXcgUmVnRXhwKCJcXGIiK3QrIlxcYiIsImkiKS50ZXN0KE50KSl7RnRbdF09ZnVuY3Rpb24oKXt2YXIgZT1JdC5hcHBseShudWxsLGFyZ3VtZW50cyk7Y29uc29sZS5lcnJvcigiJXMgJWQ6ICVzIix0LDAsZSl9fWVsc2UgRnRbdF09ZnVuY3Rpb24oKXt9O3JldHVybiBGdFt0XX0oInN0cmVhbSIpO2Z1bmN0aW9uIGxlKHQsZSl7dD10fHx7fSx0aGlzLm9iamVjdE1vZGU9ISF0Lm9iamVjdE1vZGUsZSBpbnN0YW5jZW9mIEZlJiYodGhpcy5vYmplY3RNb2RlPXRoaXMub2JqZWN0TW9kZXx8ISF0LnJlYWRhYmxlT2JqZWN0TW9kZSk7dmFyIHI9dC5oaWdoV2F0ZXJNYXJrLG49dGhpcy5vYmplY3RNb2RlPzE2OjE2Mzg0O3RoaXMuaGlnaFdhdGVyTWFyaz1yfHwwPT09cj9yOm4sdGhpcy5oaWdoV2F0ZXJNYXJrPX5+dGhpcy5oaWdoV2F0ZXJNYXJrLHRoaXMuYnVmZmVyPW5ldyBvZSx0aGlzLmxlbmd0aD0wLHRoaXMucGlwZXM9bnVsbCx0aGlzLnBpcGVzQ291bnQ9MCx0aGlzLmZsb3dpbmc9bnVsbCx0aGlzLmVuZGVkPSExLHRoaXMuZW5kRW1pdHRlZD0hMSx0aGlzLnJlYWRpbmc9ITEsdGhpcy5zeW5jPSEwLHRoaXMubmVlZFJlYWRhYmxlPSExLHRoaXMuZW1pdHRlZFJlYWRhYmxlPSExLHRoaXMucmVhZGFibGVMaXN0ZW5pbmc9ITEsdGhpcy5yZXN1bWVTY2hlZHVsZWQ9ITEsdGhpcy5kZWZhdWx0RW5jb2Rpbmc9dC5kZWZhdWx0RW5jb2Rpbmd8fCJ1dGY4Iix0aGlzLnJhbk91dD0hMSx0aGlzLmF3YWl0RHJhaW49MCx0aGlzLnJlYWRpbmdNb3JlPSExLHRoaXMuZGVjb2Rlcj1udWxsLHRoaXMuZW5jb2Rpbmc9bnVsbCx0LmVuY29kaW5nJiYodGhpcy5kZWNvZGVyPW5ldyBhZSh0LmVuY29kaW5nKSx0aGlzLmVuY29kaW5nPXQuZW5jb2RpbmcpfWZ1bmN0aW9uIHBlKHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIHBlKSlyZXR1cm4gbmV3IHBlKHQpO3RoaXMuX3JlYWRhYmxlU3RhdGU9bmV3IGxlKHQsdGhpcyksdGhpcy5yZWFkYWJsZT0hMCx0JiYiZnVuY3Rpb24iPT10eXBlb2YgdC5yZWFkJiYodGhpcy5fcmVhZD10LnJlYWQpLGUuY2FsbCh0aGlzKX1mdW5jdGlvbiBkZSh0LGUscixuLGkpe3ZhciBvPWZ1bmN0aW9uKHQsZSl7dmFyIHI9bnVsbDtBLmlzQnVmZmVyKGUpfHwic3RyaW5nIj09dHlwZW9mIGV8fG51bGw9PWV8fHQub2JqZWN0TW9kZXx8KHI9bmV3IFR5cGVFcnJvcigiSW52YWxpZCBub24tc3RyaW5nL2J1ZmZlciBjaHVuayIpKTtyZXR1cm4gcn0oZSxyKTtpZihvKXQuZW1pdCgiZXJyb3IiLG8pO2Vsc2UgaWYobnVsbD09PXIpZS5yZWFkaW5nPSExLGZ1bmN0aW9uKHQsZSl7aWYoZS5lbmRlZClyZXR1cm47aWYoZS5kZWNvZGVyKXt2YXIgcj1lLmRlY29kZXIuZW5kKCk7ciYmci5sZW5ndGgmJihlLmJ1ZmZlci5wdXNoKHIpLGUubGVuZ3RoKz1lLm9iamVjdE1vZGU/MTpyLmxlbmd0aCl9ZS5lbmRlZD0hMCx5ZSh0KX0odCxlKTtlbHNlIGlmKGUub2JqZWN0TW9kZXx8ciYmci5sZW5ndGg+MClpZihlLmVuZGVkJiYhaSl7dmFyIHM9bmV3IEVycm9yKCJzdHJlYW0ucHVzaCgpIGFmdGVyIEVPRiIpO3QuZW1pdCgiZXJyb3IiLHMpfWVsc2UgaWYoZS5lbmRFbWl0dGVkJiZpKXt2YXIgYT1uZXcgRXJyb3IoInN0cmVhbS51bnNoaWZ0KCkgYWZ0ZXIgZW5kIGV2ZW50Iik7dC5lbWl0KCJlcnJvciIsYSl9ZWxzZXt2YXIgdTshZS5kZWNvZGVyfHxpfHxufHwocj1lLmRlY29kZXIud3JpdGUociksdT0hZS5vYmplY3RNb2RlJiYwPT09ci5sZW5ndGgpLGl8fChlLnJlYWRpbmc9ITEpLHV8fChlLmZsb3dpbmcmJjA9PT1lLmxlbmd0aCYmIWUuc3luYz8odC5lbWl0KCJkYXRhIixyKSx0LnJlYWQoMCkpOihlLmxlbmd0aCs9ZS5vYmplY3RNb2RlPzE6ci5sZW5ndGgsaT9lLmJ1ZmZlci51bnNoaWZ0KHIpOmUuYnVmZmVyLnB1c2gociksZS5uZWVkUmVhZGFibGUmJnllKHQpKSksZnVuY3Rpb24odCxlKXtlLnJlYWRpbmdNb3JlfHwoZS5yZWFkaW5nTW9yZT0hMCx3dChiZSx0LGUpKX0odCxlKX1lbHNlIGl8fChlLnJlYWRpbmc9ITEpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4hdC5lbmRlZCYmKHQubmVlZFJlYWRhYmxlfHx0Lmxlbmd0aDx0LmhpZ2hXYXRlck1hcmt8fDA9PT10Lmxlbmd0aCl9KGUpfXh0KHBlLGUpLHBlLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5fcmVhZGFibGVTdGF0ZTtyZXR1cm4gci5vYmplY3RNb2RlfHwic3RyaW5nIiE9dHlwZW9mIHR8fChlPWV8fHIuZGVmYXVsdEVuY29kaW5nKSE9PXIuZW5jb2RpbmcmJih0PUEuZnJvbSh0LGUpLGU9IiIpLGRlKHRoaXMscix0LGUsITEpfSxwZS5wcm90b3R5cGUudW5zaGlmdD1mdW5jdGlvbih0KXtyZXR1cm4gZGUodGhpcyx0aGlzLl9yZWFkYWJsZVN0YXRlLHQsIiIsITApfSxwZS5wcm90b3R5cGUuaXNQYXVzZWQ9ZnVuY3Rpb24oKXtyZXR1cm4hMT09PXRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZ30scGUucHJvdG90eXBlLnNldEVuY29kaW5nPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlY29kZXI9bmV3IGFlKHQpLHRoaXMuX3JlYWRhYmxlU3RhdGUuZW5jb2Rpbmc9dCx0aGlzfTtmdW5jdGlvbiBnZSh0LGUpe3JldHVybiB0PD0wfHwwPT09ZS5sZW5ndGgmJmUuZW5kZWQ/MDplLm9iamVjdE1vZGU/MTp0IT10P2UuZmxvd2luZyYmZS5sZW5ndGg/ZS5idWZmZXIuaGVhZC5kYXRhLmxlbmd0aDplLmxlbmd0aDoodD5lLmhpZ2hXYXRlck1hcmsmJihlLmhpZ2hXYXRlck1hcms9ZnVuY3Rpb24odCl7cmV0dXJuIHQ+PTgzODg2MDg/dD04Mzg4NjA4Oih0LS0sdHw9dD4+PjEsdHw9dD4+PjIsdHw9dD4+PjQsdHw9dD4+PjgsdHw9dD4+PjE2LHQrKyksdH0odCkpLHQ8PWUubGVuZ3RoP3Q6ZS5lbmRlZD9lLmxlbmd0aDooZS5uZWVkUmVhZGFibGU9ITAsMCkpfWZ1bmN0aW9uIHllKHQpe3ZhciBlPXQuX3JlYWRhYmxlU3RhdGU7ZS5uZWVkUmVhZGFibGU9ITEsZS5lbWl0dGVkUmVhZGFibGV8fChjZSgiZW1pdFJlYWRhYmxlIixlLmZsb3dpbmcpLGUuZW1pdHRlZFJlYWRhYmxlPSEwLGUuc3luYz93dCh2ZSx0KTp2ZSh0KSl9ZnVuY3Rpb24gdmUodCl7Y2UoImVtaXQgcmVhZGFibGUiKSx0LmVtaXQoInJlYWRhYmxlIiksX2UodCl9ZnVuY3Rpb24gYmUodCxlKXtmb3IodmFyIHI9ZS5sZW5ndGg7IWUucmVhZGluZyYmIWUuZmxvd2luZyYmIWUuZW5kZWQmJmUubGVuZ3RoPGUuaGlnaFdhdGVyTWFyayYmKGNlKCJtYXliZVJlYWRNb3JlIHJlYWQgMCIpLHQucmVhZCgwKSxyIT09ZS5sZW5ndGgpOylyPWUubGVuZ3RoO2UucmVhZGluZ01vcmU9ITF9ZnVuY3Rpb24gbWUodCl7Y2UoInJlYWRhYmxlIG5leHR0aWNrIHJlYWQgMCIpLHQucmVhZCgwKX1mdW5jdGlvbiB3ZSh0LGUpe2UucmVhZGluZ3x8KGNlKCJyZXN1bWUgcmVhZCAwIiksdC5yZWFkKDApKSxlLnJlc3VtZVNjaGVkdWxlZD0hMSxlLmF3YWl0RHJhaW49MCx0LmVtaXQoInJlc3VtZSIpLF9lKHQpLGUuZmxvd2luZyYmIWUucmVhZGluZyYmdC5yZWFkKDApfWZ1bmN0aW9uIF9lKHQpe3ZhciBlPXQuX3JlYWRhYmxlU3RhdGU7Zm9yKGNlKCJmbG93IixlLmZsb3dpbmcpO2UuZmxvd2luZyYmbnVsbCE9PXQucmVhZCgpOyk7fWZ1bmN0aW9uIFNlKHQsZSl7cmV0dXJuIDA9PT1lLmxlbmd0aD9udWxsOihlLm9iamVjdE1vZGU/cj1lLmJ1ZmZlci5zaGlmdCgpOiF0fHx0Pj1lLmxlbmd0aD8ocj1lLmRlY29kZXI/ZS5idWZmZXIuam9pbigiIik6MT09PWUuYnVmZmVyLmxlbmd0aD9lLmJ1ZmZlci5oZWFkLmRhdGE6ZS5idWZmZXIuY29uY2F0KGUubGVuZ3RoKSxlLmJ1ZmZlci5jbGVhcigpKTpyPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbjt0PGUuaGVhZC5kYXRhLmxlbmd0aD8obj1lLmhlYWQuZGF0YS5zbGljZSgwLHQpLGUuaGVhZC5kYXRhPWUuaGVhZC5kYXRhLnNsaWNlKHQpKTpuPXQ9PT1lLmhlYWQuZGF0YS5sZW5ndGg/ZS5zaGlmdCgpOnI/ZnVuY3Rpb24odCxlKXt2YXIgcj1lLmhlYWQsbj0xLGk9ci5kYXRhO3QtPWkubGVuZ3RoO2Zvcig7cj1yLm5leHQ7KXt2YXIgbz1yLmRhdGEscz10Pm8ubGVuZ3RoP28ubGVuZ3RoOnQ7aWYocz09PW8ubGVuZ3RoP2krPW86aSs9by5zbGljZSgwLHQpLDA9PT0odC09cykpe3M9PT1vLmxlbmd0aD8oKytuLHIubmV4dD9lLmhlYWQ9ci5uZXh0OmUuaGVhZD1lLnRhaWw9bnVsbCk6KGUuaGVhZD1yLHIuZGF0YT1vLnNsaWNlKHMpKTticmVha30rK259cmV0dXJuIGUubGVuZ3RoLT1uLGl9KHQsZSk6ZnVuY3Rpb24odCxlKXt2YXIgcj1BLmFsbG9jVW5zYWZlKHQpLG49ZS5oZWFkLGk9MTtuLmRhdGEuY29weShyKSx0LT1uLmRhdGEubGVuZ3RoO2Zvcig7bj1uLm5leHQ7KXt2YXIgbz1uLmRhdGEscz10Pm8ubGVuZ3RoP28ubGVuZ3RoOnQ7aWYoby5jb3B5KHIsci5sZW5ndGgtdCwwLHMpLDA9PT0odC09cykpe3M9PT1vLmxlbmd0aD8oKytpLG4ubmV4dD9lLmhlYWQ9bi5uZXh0OmUuaGVhZD1lLnRhaWw9bnVsbCk6KGUuaGVhZD1uLG4uZGF0YT1vLnNsaWNlKHMpKTticmVha30rK2l9cmV0dXJuIGUubGVuZ3RoLT1pLHJ9KHQsZSk7cmV0dXJuIG59KHQsZS5idWZmZXIsZS5kZWNvZGVyKSxyKTt2YXIgcn1mdW5jdGlvbiBFZSh0KXt2YXIgZT10Ll9yZWFkYWJsZVN0YXRlO2lmKGUubGVuZ3RoPjApdGhyb3cgbmV3IEVycm9yKCciZW5kUmVhZGFibGUoKSIgY2FsbGVkIG9uIG5vbi1lbXB0eSBzdHJlYW0nKTtlLmVuZEVtaXR0ZWR8fChlLmVuZGVkPSEwLHd0KGtlLGUsdCkpfWZ1bmN0aW9uIGtlKHQsZSl7dC5lbmRFbWl0dGVkfHwwIT09dC5sZW5ndGh8fCh0LmVuZEVtaXR0ZWQ9ITAsZS5yZWFkYWJsZT0hMSxlLmVtaXQoImVuZCIpKX1mdW5jdGlvbiBSZSh0LGUpe2Zvcih2YXIgcj0wLG49dC5sZW5ndGg7cjxuO3IrKylpZih0W3JdPT09ZSlyZXR1cm4gcjtyZXR1cm4tMX1mdW5jdGlvbiBBZSgpe31mdW5jdGlvbiBUZSh0LGUscil7dGhpcy5jaHVuaz10LHRoaXMuZW5jb2Rpbmc9ZSx0aGlzLmNhbGxiYWNrPXIsdGhpcy5uZXh0PW51bGx9ZnVuY3Rpb24gT2UodCxlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiYnVmZmVyIix7Z2V0OkR0KChmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEJ1ZmZlcigpfSksIl93cml0YWJsZVN0YXRlLmJ1ZmZlciBpcyBkZXByZWNhdGVkLiBVc2UgX3dyaXRhYmxlU3RhdGUuZ2V0QnVmZmVyIGluc3RlYWQuIil9KSx0PXR8fHt9LHRoaXMub2JqZWN0TW9kZT0hIXQub2JqZWN0TW9kZSxlIGluc3RhbmNlb2YgRmUmJih0aGlzLm9iamVjdE1vZGU9dGhpcy5vYmplY3RNb2RlfHwhIXQud3JpdGFibGVPYmplY3RNb2RlKTt2YXIgcj10LmhpZ2hXYXRlck1hcmssbj10aGlzLm9iamVjdE1vZGU/MTY6MTYzODQ7dGhpcy5oaWdoV2F0ZXJNYXJrPXJ8fDA9PT1yP3I6bix0aGlzLmhpZ2hXYXRlck1hcms9fn50aGlzLmhpZ2hXYXRlck1hcmssdGhpcy5uZWVkRHJhaW49ITEsdGhpcy5lbmRpbmc9ITEsdGhpcy5lbmRlZD0hMSx0aGlzLmZpbmlzaGVkPSExO3ZhciBpPSExPT09dC5kZWNvZGVTdHJpbmdzO3RoaXMuZGVjb2RlU3RyaW5ncz0haSx0aGlzLmRlZmF1bHRFbmNvZGluZz10LmRlZmF1bHRFbmNvZGluZ3x8InV0ZjgiLHRoaXMubGVuZ3RoPTAsdGhpcy53cml0aW5nPSExLHRoaXMuY29ya2VkPTAsdGhpcy5zeW5jPSEwLHRoaXMuYnVmZmVyUHJvY2Vzc2luZz0hMSx0aGlzLm9ud3JpdGU9ZnVuY3Rpb24odCl7IWZ1bmN0aW9uKHQsZSl7dmFyIHI9dC5fd3JpdGFibGVTdGF0ZSxuPXIuc3luYyxpPXIud3JpdGVjYjtpZihmdW5jdGlvbih0KXt0LndyaXRpbmc9ITEsdC53cml0ZWNiPW51bGwsdC5sZW5ndGgtPXQud3JpdGVsZW4sdC53cml0ZWxlbj0wfShyKSxlKSFmdW5jdGlvbih0LGUscixuLGkpey0tZS5wZW5kaW5nY2Iscj93dChpLG4pOmkobik7dC5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQ9ITAsdC5lbWl0KCJlcnJvciIsbil9KHQscixuLGUsaSk7ZWxzZXt2YXIgbz1NZShyKTtvfHxyLmNvcmtlZHx8ci5idWZmZXJQcm9jZXNzaW5nfHwhci5idWZmZXJlZFJlcXVlc3R8fFBlKHQsciksbj93dChDZSx0LHIsbyxpKTpDZSh0LHIsbyxpKX19KGUsdCl9LHRoaXMud3JpdGVjYj1udWxsLHRoaXMud3JpdGVsZW49MCx0aGlzLmJ1ZmZlcmVkUmVxdWVzdD1udWxsLHRoaXMubGFzdEJ1ZmZlcmVkUmVxdWVzdD1udWxsLHRoaXMucGVuZGluZ2NiPTAsdGhpcy5wcmVmaW5pc2hlZD0hMSx0aGlzLmVycm9yRW1pdHRlZD0hMSx0aGlzLmJ1ZmZlcmVkUmVxdWVzdENvdW50PTAsdGhpcy5jb3JrZWRSZXF1ZXN0c0ZyZWU9bmV3IFVlKHRoaXMpfWZ1bmN0aW9uIGplKHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIGplfHx0aGlzIGluc3RhbmNlb2YgRmUpKXJldHVybiBuZXcgamUodCk7dGhpcy5fd3JpdGFibGVTdGF0ZT1uZXcgT2UodCx0aGlzKSx0aGlzLndyaXRhYmxlPSEwLHQmJigiZnVuY3Rpb24iPT10eXBlb2YgdC53cml0ZSYmKHRoaXMuX3dyaXRlPXQud3JpdGUpLCJmdW5jdGlvbiI9PXR5cGVvZiB0LndyaXRldiYmKHRoaXMuX3dyaXRldj10LndyaXRldikpLGUuY2FsbCh0aGlzKX1mdW5jdGlvbiBMZSh0LGUscixuLGksbyxzKXtlLndyaXRlbGVuPW4sZS53cml0ZWNiPXMsZS53cml0aW5nPSEwLGUuc3luYz0hMCxyP3QuX3dyaXRldihpLGUub253cml0ZSk6dC5fd3JpdGUoaSxvLGUub253cml0ZSksZS5zeW5jPSExfWZ1bmN0aW9uIENlKHQsZSxyLG4pe3J8fGZ1bmN0aW9uKHQsZSl7MD09PWUubGVuZ3RoJiZlLm5lZWREcmFpbiYmKGUubmVlZERyYWluPSExLHQuZW1pdCgiZHJhaW4iKSl9KHQsZSksZS5wZW5kaW5nY2ItLSxuKCkseGUodCxlKX1mdW5jdGlvbiBQZSh0LGUpe2UuYnVmZmVyUHJvY2Vzc2luZz0hMDt2YXIgcj1lLmJ1ZmZlcmVkUmVxdWVzdDtpZih0Ll93cml0ZXYmJnImJnIubmV4dCl7dmFyIG49ZS5idWZmZXJlZFJlcXVlc3RDb3VudCxpPW5ldyBBcnJheShuKSxvPWUuY29ya2VkUmVxdWVzdHNGcmVlO28uZW50cnk9cjtmb3IodmFyIHM9MDtyOylpW3NdPXIscj1yLm5leHQscys9MTtMZSh0LGUsITAsZS5sZW5ndGgsaSwiIixvLmZpbmlzaCksZS5wZW5kaW5nY2IrKyxlLmxhc3RCdWZmZXJlZFJlcXVlc3Q9bnVsbCxvLm5leHQ/KGUuY29ya2VkUmVxdWVzdHNGcmVlPW8ubmV4dCxvLm5leHQ9bnVsbCk6ZS5jb3JrZWRSZXF1ZXN0c0ZyZWU9bmV3IFVlKGUpfWVsc2V7Zm9yKDtyOyl7dmFyIGE9ci5jaHVuayx1PXIuZW5jb2RpbmcsaD1yLmNhbGxiYWNrO2lmKExlKHQsZSwhMSxlLm9iamVjdE1vZGU/MTphLmxlbmd0aCxhLHUsaCkscj1yLm5leHQsZS53cml0aW5nKWJyZWFrfW51bGw9PT1yJiYoZS5sYXN0QnVmZmVyZWRSZXF1ZXN0PW51bGwpfWUuYnVmZmVyZWRSZXF1ZXN0Q291bnQ9MCxlLmJ1ZmZlcmVkUmVxdWVzdD1yLGUuYnVmZmVyUHJvY2Vzc2luZz0hMX1mdW5jdGlvbiBNZSh0KXtyZXR1cm4gdC5lbmRpbmcmJjA9PT10Lmxlbmd0aCYmbnVsbD09PXQuYnVmZmVyZWRSZXF1ZXN0JiYhdC5maW5pc2hlZCYmIXQud3JpdGluZ31mdW5jdGlvbiBCZSh0LGUpe2UucHJlZmluaXNoZWR8fChlLnByZWZpbmlzaGVkPSEwLHQuZW1pdCgicHJlZmluaXNoIikpfWZ1bmN0aW9uIHhlKHQsZSl7dmFyIHI9TWUoZSk7cmV0dXJuIHImJigwPT09ZS5wZW5kaW5nY2I/KEJlKHQsZSksZS5maW5pc2hlZD0hMCx0LmVtaXQoImZpbmlzaCIpKTpCZSh0LGUpKSxyfWZ1bmN0aW9uIFVlKHQpe3ZhciBlPXRoaXM7dGhpcy5uZXh0PW51bGwsdGhpcy5lbnRyeT1udWxsLHRoaXMuZmluaXNoPWZ1bmN0aW9uKHIpe3ZhciBuPWUuZW50cnk7Zm9yKGUuZW50cnk9bnVsbDtuOyl7dmFyIGk9bi5jYWxsYmFjazt0LnBlbmRpbmdjYi0tLGkociksbj1uLm5leHR9dC5jb3JrZWRSZXF1ZXN0c0ZyZWU/dC5jb3JrZWRSZXF1ZXN0c0ZyZWUubmV4dD1lOnQuY29ya2VkUmVxdWVzdHNGcmVlPWV9fXBlLnByb3RvdHlwZS5yZWFkPWZ1bmN0aW9uKHQpe2NlKCJyZWFkIix0KSx0PXBhcnNlSW50KHQsMTApO3ZhciBlPXRoaXMuX3JlYWRhYmxlU3RhdGUscj10O2lmKDAhPT10JiYoZS5lbWl0dGVkUmVhZGFibGU9ITEpLDA9PT10JiZlLm5lZWRSZWFkYWJsZSYmKGUubGVuZ3RoPj1lLmhpZ2hXYXRlck1hcmt8fGUuZW5kZWQpKXJldHVybiBjZSgicmVhZDogZW1pdFJlYWRhYmxlIixlLmxlbmd0aCxlLmVuZGVkKSwwPT09ZS5sZW5ndGgmJmUuZW5kZWQ/RWUodGhpcyk6eWUodGhpcyksbnVsbDtpZigwPT09KHQ9Z2UodCxlKSkmJmUuZW5kZWQpcmV0dXJuIDA9PT1lLmxlbmd0aCYmRWUodGhpcyksbnVsbDt2YXIgbixpPWUubmVlZFJlYWRhYmxlO3JldHVybiBjZSgibmVlZCByZWFkYWJsZSIsaSksKDA9PT1lLmxlbmd0aHx8ZS5sZW5ndGgtdDxlLmhpZ2hXYXRlck1hcmspJiZjZSgibGVuZ3RoIGxlc3MgdGhhbiB3YXRlcm1hcmsiLGk9ITApLGUuZW5kZWR8fGUucmVhZGluZz9jZSgicmVhZGluZyBvciBlbmRlZCIsaT0hMSk6aSYmKGNlKCJkbyByZWFkIiksZS5yZWFkaW5nPSEwLGUuc3luYz0hMCwwPT09ZS5sZW5ndGgmJihlLm5lZWRSZWFkYWJsZT0hMCksdGhpcy5fcmVhZChlLmhpZ2hXYXRlck1hcmspLGUuc3luYz0hMSxlLnJlYWRpbmd8fCh0PWdlKHIsZSkpKSxudWxsPT09KG49dD4wP1NlKHQsZSk6bnVsbCk/KGUubmVlZFJlYWRhYmxlPSEwLHQ9MCk6ZS5sZW5ndGgtPXQsMD09PWUubGVuZ3RoJiYoZS5lbmRlZHx8KGUubmVlZFJlYWRhYmxlPSEwKSxyIT09dCYmZS5lbmRlZCYmRWUodGhpcykpLG51bGwhPT1uJiZ0aGlzLmVtaXQoImRhdGEiLG4pLG59LHBlLnByb3RvdHlwZS5fcmVhZD1mdW5jdGlvbih0KXt0aGlzLmVtaXQoImVycm9yIixuZXcgRXJyb3IoIm5vdCBpbXBsZW1lbnRlZCIpKX0scGUucHJvdG90eXBlLnBpcGU9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLG49dGhpcy5fcmVhZGFibGVTdGF0ZTtzd2l0Y2gobi5waXBlc0NvdW50KXtjYXNlIDA6bi5waXBlcz10O2JyZWFrO2Nhc2UgMTpuLnBpcGVzPVtuLnBpcGVzLHRdO2JyZWFrO2RlZmF1bHQ6bi5waXBlcy5wdXNoKHQpfW4ucGlwZXNDb3VudCs9MSxjZSgicGlwZSBjb3VudD0lZCBvcHRzPSVqIixuLnBpcGVzQ291bnQsZSk7dmFyIGk9IWV8fCExIT09ZS5lbmQ/czpoO2Z1bmN0aW9uIG8odCl7Y2UoIm9udW5waXBlIiksdD09PXImJmgoKX1mdW5jdGlvbiBzKCl7Y2UoIm9uZW5kIiksdC5lbmQoKX1uLmVuZEVtaXR0ZWQ/d3QoaSk6ci5vbmNlKCJlbmQiLGkpLHQub24oInVucGlwZSIsbyk7dmFyIGE9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9dC5fcmVhZGFibGVTdGF0ZTtjZSgicGlwZU9uRHJhaW4iLGUuYXdhaXREcmFpbiksZS5hd2FpdERyYWluJiZlLmF3YWl0RHJhaW4tLSwwPT09ZS5hd2FpdERyYWluJiZ0Lmxpc3RlbmVycygiZGF0YSIpLmxlbmd0aCYmKGUuZmxvd2luZz0hMCxfZSh0KSl9fShyKTt0Lm9uKCJkcmFpbiIsYSk7dmFyIHU9ITE7ZnVuY3Rpb24gaCgpe2NlKCJjbGVhbnVwIiksdC5yZW1vdmVMaXN0ZW5lcigiY2xvc2UiLHApLHQucmVtb3ZlTGlzdGVuZXIoImZpbmlzaCIsZCksdC5yZW1vdmVMaXN0ZW5lcigiZHJhaW4iLGEpLHQucmVtb3ZlTGlzdGVuZXIoImVycm9yIixsKSx0LnJlbW92ZUxpc3RlbmVyKCJ1bnBpcGUiLG8pLHIucmVtb3ZlTGlzdGVuZXIoImVuZCIscyksci5yZW1vdmVMaXN0ZW5lcigiZW5kIixoKSxyLnJlbW92ZUxpc3RlbmVyKCJkYXRhIixjKSx1PSEwLCFuLmF3YWl0RHJhaW58fHQuX3dyaXRhYmxlU3RhdGUmJiF0Ll93cml0YWJsZVN0YXRlLm5lZWREcmFpbnx8YSgpfXZhciBmPSExO2Z1bmN0aW9uIGMoZSl7Y2UoIm9uZGF0YSIpLGY9ITEsITEhPT10LndyaXRlKGUpfHxmfHwoKDE9PT1uLnBpcGVzQ291bnQmJm4ucGlwZXM9PT10fHxuLnBpcGVzQ291bnQ+MSYmLTEhPT1SZShuLnBpcGVzLHQpKSYmIXUmJihjZSgiZmFsc2Ugd3JpdGUgcmVzcG9uc2UsIHBhdXNlIixyLl9yZWFkYWJsZVN0YXRlLmF3YWl0RHJhaW4pLHIuX3JlYWRhYmxlU3RhdGUuYXdhaXREcmFpbisrLGY9ITApLHIucGF1c2UoKSl9ZnVuY3Rpb24gbChlKXt2YXIgcjtjZSgib25lcnJvciIsZSksZygpLHQucmVtb3ZlTGlzdGVuZXIoImVycm9yIixsKSwwPT09KHI9ImVycm9yIix0Lmxpc3RlbmVycyhyKS5sZW5ndGgpJiZ0LmVtaXQoImVycm9yIixlKX1mdW5jdGlvbiBwKCl7dC5yZW1vdmVMaXN0ZW5lcigiZmluaXNoIixkKSxnKCl9ZnVuY3Rpb24gZCgpe2NlKCJvbmZpbmlzaCIpLHQucmVtb3ZlTGlzdGVuZXIoImNsb3NlIixwKSxnKCl9ZnVuY3Rpb24gZygpe2NlKCJ1bnBpcGUiKSxyLnVucGlwZSh0KX1yZXR1cm4gci5vbigiZGF0YSIsYyksZnVuY3Rpb24odCxlLHIpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0LnByZXBlbmRMaXN0ZW5lcilyZXR1cm4gdC5wcmVwZW5kTGlzdGVuZXIoZSxyKTt0Ll9ldmVudHMmJnQuX2V2ZW50c1tlXT9BcnJheS5pc0FycmF5KHQuX2V2ZW50c1tlXSk/dC5fZXZlbnRzW2VdLnVuc2hpZnQocik6dC5fZXZlbnRzW2VdPVtyLHQuX2V2ZW50c1tlXV06dC5vbihlLHIpfSh0LCJlcnJvciIsbCksdC5vbmNlKCJjbG9zZSIscCksdC5vbmNlKCJmaW5pc2giLGQpLHQuZW1pdCgicGlwZSIsciksbi5mbG93aW5nfHwoY2UoInBpcGUgcmVzdW1lIiksci5yZXN1bWUoKSksdH0scGUucHJvdG90eXBlLnVucGlwZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9yZWFkYWJsZVN0YXRlO2lmKDA9PT1lLnBpcGVzQ291bnQpcmV0dXJuIHRoaXM7aWYoMT09PWUucGlwZXNDb3VudClyZXR1cm4gdCYmdCE9PWUucGlwZXN8fCh0fHwodD1lLnBpcGVzKSxlLnBpcGVzPW51bGwsZS5waXBlc0NvdW50PTAsZS5mbG93aW5nPSExLHQmJnQuZW1pdCgidW5waXBlIix0aGlzKSksdGhpcztpZighdCl7dmFyIHI9ZS5waXBlcyxuPWUucGlwZXNDb3VudDtlLnBpcGVzPW51bGwsZS5waXBlc0NvdW50PTAsZS5mbG93aW5nPSExO2Zvcih2YXIgaT0wO2k8bjtpKyspcltpXS5lbWl0KCJ1bnBpcGUiLHRoaXMpO3JldHVybiB0aGlzfXZhciBvPVJlKGUucGlwZXMsdCk7cmV0dXJuLTE9PT1vfHwoZS5waXBlcy5zcGxpY2UobywxKSxlLnBpcGVzQ291bnQtPTEsMT09PWUucGlwZXNDb3VudCYmKGUucGlwZXM9ZS5waXBlc1swXSksdC5lbWl0KCJ1bnBpcGUiLHRoaXMpKSx0aGlzfSxwZS5wcm90b3R5cGUub249ZnVuY3Rpb24odCxyKXt2YXIgbj1lLnByb3RvdHlwZS5vbi5jYWxsKHRoaXMsdCxyKTtpZigiZGF0YSI9PT10KSExIT09dGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nJiZ0aGlzLnJlc3VtZSgpO2Vsc2UgaWYoInJlYWRhYmxlIj09PXQpe3ZhciBpPXRoaXMuX3JlYWRhYmxlU3RhdGU7aS5lbmRFbWl0dGVkfHxpLnJlYWRhYmxlTGlzdGVuaW5nfHwoaS5yZWFkYWJsZUxpc3RlbmluZz1pLm5lZWRSZWFkYWJsZT0hMCxpLmVtaXR0ZWRSZWFkYWJsZT0hMSxpLnJlYWRpbmc/aS5sZW5ndGgmJnllKHRoaXMpOnd0KG1lLHRoaXMpKX1yZXR1cm4gbn0scGUucHJvdG90eXBlLmFkZExpc3RlbmVyPXBlLnByb3RvdHlwZS5vbixwZS5wcm90b3R5cGUucmVzdW1lPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fcmVhZGFibGVTdGF0ZTtyZXR1cm4gdC5mbG93aW5nfHwoY2UoInJlc3VtZSIpLHQuZmxvd2luZz0hMCxmdW5jdGlvbih0LGUpe2UucmVzdW1lU2NoZWR1bGVkfHwoZS5yZXN1bWVTY2hlZHVsZWQ9ITAsd3Qod2UsdCxlKSl9KHRoaXMsdCkpLHRoaXN9LHBlLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe3JldHVybiBjZSgiY2FsbCBwYXVzZSBmbG93aW5nPSVqIix0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcpLCExIT09dGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nJiYoY2UoInBhdXNlIiksdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nPSExLHRoaXMuZW1pdCgicGF1c2UiKSksdGhpc30scGUucHJvdG90eXBlLndyYXA9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fcmVhZGFibGVTdGF0ZSxyPSExLG49dGhpcztmb3IodmFyIGkgaW4gdC5vbigiZW5kIiwoZnVuY3Rpb24oKXtpZihjZSgid3JhcHBlZCBlbmQiKSxlLmRlY29kZXImJiFlLmVuZGVkKXt2YXIgdD1lLmRlY29kZXIuZW5kKCk7dCYmdC5sZW5ndGgmJm4ucHVzaCh0KX1uLnB1c2gobnVsbCl9KSksdC5vbigiZGF0YSIsKGZ1bmN0aW9uKGkpeyhjZSgid3JhcHBlZCBkYXRhIiksZS5kZWNvZGVyJiYoaT1lLmRlY29kZXIud3JpdGUoaSkpLGUub2JqZWN0TW9kZSYmbnVsbD09aSl8fChlLm9iamVjdE1vZGV8fGkmJmkubGVuZ3RoKSYmKG4ucHVzaChpKXx8KHI9ITAsdC5wYXVzZSgpKSl9KSksdCl2b2lkIDA9PT10aGlzW2ldJiYiZnVuY3Rpb24iPT10eXBlb2YgdFtpXSYmKHRoaXNbaV09ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRbZV0uYXBwbHkodCxhcmd1bWVudHMpfX0oaSkpO3JldHVybiBmdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0wLG49dC5sZW5ndGg7cjxuO3IrKyllKHRbcl0scil9KFsiZXJyb3IiLCJjbG9zZSIsImRlc3Ryb3kiLCJwYXVzZSIsInJlc3VtZSJdLChmdW5jdGlvbihlKXt0Lm9uKGUsbi5lbWl0LmJpbmQobixlKSl9KSksbi5fcmVhZD1mdW5jdGlvbihlKXtjZSgid3JhcHBlZCBfcmVhZCIsZSksciYmKHI9ITEsdC5yZXN1bWUoKSl9LG59LHBlLl9mcm9tTGlzdD1TZSxqZS5Xcml0YWJsZVN0YXRlPU9lLHh0KGplLGUpLE9lLnByb3RvdHlwZS5nZXRCdWZmZXI9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5idWZmZXJlZFJlcXVlc3QsZT1bXTt0OyllLnB1c2godCksdD10Lm5leHQ7cmV0dXJuIGV9LGplLnByb3RvdHlwZS5waXBlPWZ1bmN0aW9uKCl7dGhpcy5lbWl0KCJlcnJvciIsbmV3IEVycm9yKCJDYW5ub3QgcGlwZSwgbm90IHJlYWRhYmxlIikpfSxqZS5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXRoaXMuX3dyaXRhYmxlU3RhdGUsaT0hMTtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZSYmKHI9ZSxlPW51bGwpLEEuaXNCdWZmZXIodCk/ZT0iYnVmZmVyIjplfHwoZT1uLmRlZmF1bHRFbmNvZGluZyksImZ1bmN0aW9uIiE9dHlwZW9mIHImJihyPUFlKSxuLmVuZGVkP2Z1bmN0aW9uKHQsZSl7dmFyIHI9bmV3IEVycm9yKCJ3cml0ZSBhZnRlciBlbmQiKTt0LmVtaXQoImVycm9yIixyKSx3dChlLHIpfSh0aGlzLHIpOmZ1bmN0aW9uKHQsZSxyLG4pe3ZhciBpPSEwLG89ITE7cmV0dXJuIG51bGw9PT1yP289bmV3IFR5cGVFcnJvcigiTWF5IG5vdCB3cml0ZSBudWxsIHZhbHVlcyB0byBzdHJlYW0iKTpBLmlzQnVmZmVyKHIpfHwic3RyaW5nIj09dHlwZW9mIHJ8fHZvaWQgMD09PXJ8fGUub2JqZWN0TW9kZXx8KG89bmV3IFR5cGVFcnJvcigiSW52YWxpZCBub24tc3RyaW5nL2J1ZmZlciBjaHVuayIpKSxvJiYodC5lbWl0KCJlcnJvciIsbyksd3QobixvKSxpPSExKSxpfSh0aGlzLG4sdCxyKSYmKG4ucGVuZGluZ2NiKyssaT1mdW5jdGlvbih0LGUscixuLGkpe3I9ZnVuY3Rpb24odCxlLHIpe3Qub2JqZWN0TW9kZXx8ITE9PT10LmRlY29kZVN0cmluZ3N8fCJzdHJpbmciIT10eXBlb2YgZXx8KGU9QS5mcm9tKGUscikpO3JldHVybiBlfShlLHIsbiksQS5pc0J1ZmZlcihyKSYmKG49ImJ1ZmZlciIpO3ZhciBvPWUub2JqZWN0TW9kZT8xOnIubGVuZ3RoO2UubGVuZ3RoKz1vO3ZhciBzPWUubGVuZ3RoPGUuaGlnaFdhdGVyTWFyaztzfHwoZS5uZWVkRHJhaW49ITApO2lmKGUud3JpdGluZ3x8ZS5jb3JrZWQpe3ZhciBhPWUubGFzdEJ1ZmZlcmVkUmVxdWVzdDtlLmxhc3RCdWZmZXJlZFJlcXVlc3Q9bmV3IFRlKHIsbixpKSxhP2EubmV4dD1lLmxhc3RCdWZmZXJlZFJlcXVlc3Q6ZS5idWZmZXJlZFJlcXVlc3Q9ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0LGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQrPTF9ZWxzZSBMZSh0LGUsITEsbyxyLG4saSk7cmV0dXJuIHN9KHRoaXMsbix0LGUscikpLGl9LGplLnByb3RvdHlwZS5jb3JrPWZ1bmN0aW9uKCl7dGhpcy5fd3JpdGFibGVTdGF0ZS5jb3JrZWQrK30samUucHJvdG90eXBlLnVuY29yaz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX3dyaXRhYmxlU3RhdGU7dC5jb3JrZWQmJih0LmNvcmtlZC0tLHQud3JpdGluZ3x8dC5jb3JrZWR8fHQuZmluaXNoZWR8fHQuYnVmZmVyUHJvY2Vzc2luZ3x8IXQuYnVmZmVyZWRSZXF1ZXN0fHxQZSh0aGlzLHQpKX0samUucHJvdG90eXBlLnNldERlZmF1bHRFbmNvZGluZz1mdW5jdGlvbih0KXtpZigic3RyaW5nIj09dHlwZW9mIHQmJih0PXQudG9Mb3dlckNhc2UoKSksIShbImhleCIsInV0ZjgiLCJ1dGYtOCIsImFzY2lpIiwiYmluYXJ5IiwiYmFzZTY0IiwidWNzMiIsInVjcy0yIiwidXRmMTZsZSIsInV0Zi0xNmxlIiwicmF3Il0uaW5kZXhPZigodCsiIikudG9Mb3dlckNhc2UoKSk+LTEpKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrdCk7cmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVmYXVsdEVuY29kaW5nPXQsdGhpc30samUucHJvdG90eXBlLl93cml0ZT1mdW5jdGlvbih0LGUscil7cihuZXcgRXJyb3IoIm5vdCBpbXBsZW1lbnRlZCIpKX0samUucHJvdG90eXBlLl93cml0ZXY9bnVsbCxqZS5wcm90b3R5cGUuZW5kPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj10aGlzLl93cml0YWJsZVN0YXRlOyJmdW5jdGlvbiI9PXR5cGVvZiB0PyhyPXQsdD1udWxsLGU9bnVsbCk6ImZ1bmN0aW9uIj09dHlwZW9mIGUmJihyPWUsZT1udWxsKSxudWxsIT10JiZ0aGlzLndyaXRlKHQsZSksbi5jb3JrZWQmJihuLmNvcmtlZD0xLHRoaXMudW5jb3JrKCkpLG4uZW5kaW5nfHxuLmZpbmlzaGVkfHxmdW5jdGlvbih0LGUscil7ZS5lbmRpbmc9ITAseGUodCxlKSxyJiYoZS5maW5pc2hlZD93dChyKTp0Lm9uY2UoImZpbmlzaCIscikpO2UuZW5kZWQ9ITAsdC53cml0YWJsZT0hMX0odGhpcyxuLHIpfSx4dChGZSxwZSk7Zm9yKHZhciBJZT1PYmplY3Qua2V5cyhqZS5wcm90b3R5cGUpLERlPTA7RGU8SWUubGVuZ3RoO0RlKyspe3ZhciBOZT1JZVtEZV07RmUucHJvdG90eXBlW05lXXx8KEZlLnByb3RvdHlwZVtOZV09amUucHJvdG90eXBlW05lXSl9ZnVuY3Rpb24gRmUodCl7aWYoISh0aGlzIGluc3RhbmNlb2YgRmUpKXJldHVybiBuZXcgRmUodCk7cGUuY2FsbCh0aGlzLHQpLGplLmNhbGwodGhpcyx0KSx0JiYhMT09PXQucmVhZGFibGUmJih0aGlzLnJlYWRhYmxlPSExKSx0JiYhMT09PXQud3JpdGFibGUmJih0aGlzLndyaXRhYmxlPSExKSx0aGlzLmFsbG93SGFsZk9wZW49ITAsdCYmITE9PT10LmFsbG93SGFsZk9wZW4mJih0aGlzLmFsbG93SGFsZk9wZW49ITEpLHRoaXMub25jZSgiZW5kIix6ZSl9ZnVuY3Rpb24gemUoKXt0aGlzLmFsbG93SGFsZk9wZW58fHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kZWR8fHd0KHFlLHRoaXMpfWZ1bmN0aW9uIHFlKHQpe3QuZW5kKCl9ZnVuY3Rpb24gWWUodCl7dGhpcy5hZnRlclRyYW5zZm9ybT1mdW5jdGlvbihlLHIpe3JldHVybiBmdW5jdGlvbih0LGUscil7dmFyIG49dC5fdHJhbnNmb3JtU3RhdGU7bi50cmFuc2Zvcm1pbmc9ITE7dmFyIGk9bi53cml0ZWNiO2lmKCFpKXJldHVybiB0LmVtaXQoImVycm9yIixuZXcgRXJyb3IoIm5vIHdyaXRlY2IgaW4gVHJhbnNmb3JtIGNsYXNzIikpO24ud3JpdGVjaHVuaz1udWxsLG4ud3JpdGVjYj1udWxsLG51bGwhPXImJnQucHVzaChyKTtpKGUpO3ZhciBvPXQuX3JlYWRhYmxlU3RhdGU7by5yZWFkaW5nPSExLChvLm5lZWRSZWFkYWJsZXx8by5sZW5ndGg8by5oaWdoV2F0ZXJNYXJrKSYmdC5fcmVhZChvLmhpZ2hXYXRlck1hcmspfSh0LGUscil9LHRoaXMubmVlZFRyYW5zZm9ybT0hMSx0aGlzLnRyYW5zZm9ybWluZz0hMSx0aGlzLndyaXRlY2I9bnVsbCx0aGlzLndyaXRlY2h1bms9bnVsbCx0aGlzLndyaXRlZW5jb2Rpbmc9bnVsbH1mdW5jdGlvbiBXZSh0KXtpZighKHRoaXMgaW5zdGFuY2VvZiBXZSkpcmV0dXJuIG5ldyBXZSh0KTtGZS5jYWxsKHRoaXMsdCksdGhpcy5fdHJhbnNmb3JtU3RhdGU9bmV3IFllKHRoaXMpO3ZhciBlPXRoaXM7dGhpcy5fcmVhZGFibGVTdGF0ZS5uZWVkUmVhZGFibGU9ITAsdGhpcy5fcmVhZGFibGVTdGF0ZS5zeW5jPSExLHQmJigiZnVuY3Rpb24iPT10eXBlb2YgdC50cmFuc2Zvcm0mJih0aGlzLl90cmFuc2Zvcm09dC50cmFuc2Zvcm0pLCJmdW5jdGlvbiI9PXR5cGVvZiB0LmZsdXNoJiYodGhpcy5fZmx1c2g9dC5mbHVzaCkpLHRoaXMub25jZSgicHJlZmluaXNoIiwoZnVuY3Rpb24oKXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5fZmx1c2g/dGhpcy5fZmx1c2goKGZ1bmN0aW9uKHQpeyRlKGUsdCl9KSk6JGUoZSl9KSl9ZnVuY3Rpb24gJGUodCxlKXtpZihlKXJldHVybiB0LmVtaXQoImVycm9yIixlKTt2YXIgcj10Ll93cml0YWJsZVN0YXRlLG49dC5fdHJhbnNmb3JtU3RhdGU7aWYoci5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJDYWxsaW5nIHRyYW5zZm9ybSBkb25lIHdoZW4gd3MubGVuZ3RoICE9IDAiKTtpZihuLnRyYW5zZm9ybWluZyl0aHJvdyBuZXcgRXJyb3IoIkNhbGxpbmcgdHJhbnNmb3JtIGRvbmUgd2hlbiBzdGlsbCB0cmFuc2Zvcm1pbmciKTtyZXR1cm4gdC5wdXNoKG51bGwpfWZ1bmN0aW9uIEdlKHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIEdlKSlyZXR1cm4gbmV3IEdlKHQpO1dlLmNhbGwodGhpcyx0KX1mdW5jdGlvbiBKZSgpe2UuY2FsbCh0aGlzKX14dChXZSxGZSksV2UucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fdHJhbnNmb3JtU3RhdGUubmVlZFRyYW5zZm9ybT0hMSxGZS5wcm90b3R5cGUucHVzaC5jYWxsKHRoaXMsdCxlKX0sV2UucHJvdG90eXBlLl90cmFuc2Zvcm09ZnVuY3Rpb24odCxlLHIpe3Rocm93IG5ldyBFcnJvcigiTm90IGltcGxlbWVudGVkIil9LFdlLnByb3RvdHlwZS5fd3JpdGU9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXRoaXMuX3RyYW5zZm9ybVN0YXRlO2lmKG4ud3JpdGVjYj1yLG4ud3JpdGVjaHVuaz10LG4ud3JpdGVlbmNvZGluZz1lLCFuLnRyYW5zZm9ybWluZyl7dmFyIGk9dGhpcy5fcmVhZGFibGVTdGF0ZTsobi5uZWVkVHJhbnNmb3JtfHxpLm5lZWRSZWFkYWJsZXx8aS5sZW5ndGg8aS5oaWdoV2F0ZXJNYXJrKSYmdGhpcy5fcmVhZChpLmhpZ2hXYXRlck1hcmspfX0sV2UucHJvdG90eXBlLl9yZWFkPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3RyYW5zZm9ybVN0YXRlO251bGwhPT1lLndyaXRlY2h1bmsmJmUud3JpdGVjYiYmIWUudHJhbnNmb3JtaW5nPyhlLnRyYW5zZm9ybWluZz0hMCx0aGlzLl90cmFuc2Zvcm0oZS53cml0ZWNodW5rLGUud3JpdGVlbmNvZGluZyxlLmFmdGVyVHJhbnNmb3JtKSk6ZS5uZWVkVHJhbnNmb3JtPSEwfSx4dChHZSxXZSksR2UucHJvdG90eXBlLl90cmFuc2Zvcm09ZnVuY3Rpb24odCxlLHIpe3IobnVsbCx0KX0seHQoSmUsZSksSmUuUmVhZGFibGU9cGUsSmUuV3JpdGFibGU9amUsSmUuRHVwbGV4PUZlLEplLlRyYW5zZm9ybT1XZSxKZS5QYXNzVGhyb3VnaD1HZSxKZS5TdHJlYW09SmUsSmUucHJvdG90eXBlLnBpcGU9ZnVuY3Rpb24odCxyKXt2YXIgbj10aGlzO2Z1bmN0aW9uIGkoZSl7dC53cml0YWJsZSYmITE9PT10LndyaXRlKGUpJiZuLnBhdXNlJiZuLnBhdXNlKCl9ZnVuY3Rpb24gbygpe24ucmVhZGFibGUmJm4ucmVzdW1lJiZuLnJlc3VtZSgpfW4ub24oImRhdGEiLGkpLHQub24oImRyYWluIixvKSx0Ll9pc1N0ZGlvfHxyJiYhMT09PXIuZW5kfHwobi5vbigiZW5kIixhKSxuLm9uKCJjbG9zZSIsdSkpO3ZhciBzPSExO2Z1bmN0aW9uIGEoKXtzfHwocz0hMCx0LmVuZCgpKX1mdW5jdGlvbiB1KCl7c3x8KHM9ITAsImZ1bmN0aW9uIj09dHlwZW9mIHQuZGVzdHJveSYmdC5kZXN0cm95KCkpfWZ1bmN0aW9uIGgodCl7aWYoZigpLDA9PT1lLmxpc3RlbmVyQ291bnQodGhpcywiZXJyb3IiKSl0aHJvdyB0fWZ1bmN0aW9uIGYoKXtuLnJlbW92ZUxpc3RlbmVyKCJkYXRhIixpKSx0LnJlbW92ZUxpc3RlbmVyKCJkcmFpbiIsbyksbi5yZW1vdmVMaXN0ZW5lcigiZW5kIixhKSxuLnJlbW92ZUxpc3RlbmVyKCJjbG9zZSIsdSksbi5yZW1vdmVMaXN0ZW5lcigiZXJyb3IiLGgpLHQucmVtb3ZlTGlzdGVuZXIoImVycm9yIixoKSxuLnJlbW92ZUxpc3RlbmVyKCJlbmQiLGYpLG4ucmVtb3ZlTGlzdGVuZXIoImNsb3NlIixmKSx0LnJlbW92ZUxpc3RlbmVyKCJjbG9zZSIsZil9cmV0dXJuIG4ub24oImVycm9yIixoKSx0Lm9uKCJlcnJvciIsaCksbi5vbigiZW5kIixmKSxuLm9uKCJjbG9zZSIsZiksdC5vbigiY2xvc2UiLGYpLHQuZW1pdCgicGlwZSIsbiksdH07dmFyIEhlPSJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsVGhpcz9nbG9iYWxUaGlzOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzoidW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbD9nbG9iYWw6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6e307dmFyIFZlLEtlLFplPShWZT1mdW5jdGlvbih0KXsiZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmNyZWF0ZT90LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtlJiYodC5zdXBlcl89ZSx0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSl9OnQuZXhwb3J0cz1mdW5jdGlvbih0LGUpe2lmKGUpe3Quc3VwZXJfPWU7dmFyIHI9ZnVuY3Rpb24oKXt9O3IucHJvdG90eXBlPWUucHJvdG90eXBlLHQucHJvdG90eXBlPW5ldyByLHQucHJvdG90eXBlLmNvbnN0cnVjdG9yPXR9fX0sVmUoS2U9e2V4cG9ydHM6e319LEtlLmV4cG9ydHMpLEtlLmV4cG9ydHMpO2xldCBRZT10cigpO2Z1bmN0aW9uIFhlKHQsZSl7KCJvYmplY3QiIT10eXBlb2YgdHx8QXJyYXkuaXNBcnJheSh0KSkmJihlPXQsdD17fSk7bGV0IHI9bmV3IFFlKHQpO3ZhciBuO3JldHVybiByLl9mcm9tPUFycmF5LmlzQXJyYXkoZSk/KG49KG49ZSkuc2xpY2UoKSxmdW5jdGlvbih0LGUpe2xldCByPW51bGwsaT1uLmxlbmd0aD9uLnNoaWZ0KCk6bnVsbDtpIGluc3RhbmNlb2YgRXJyb3ImJihyPWksaT1udWxsKSxlKHIsaSl9KTplfHxlcixyfWZ1bmN0aW9uIHRyKHQsZSl7ZnVuY3Rpb24gcihlKXtpZighKHRoaXMgaW5zdGFuY2VvZiByKSlyZXR1cm4gbmV3IHIoZSk7dGhpcy5fcmVhZGluZz0hMSx0aGlzLl9jYWxsYmFjaz1mdW5jdGlvbih0LGUpe2lmKG4uZGVzdHJveWVkKXJldHVybjtpZih0KXJldHVybiBuLmRlc3Ryb3kodCk7aWYobnVsbD09PWUpcmV0dXJuIG4ucHVzaChudWxsKTtuLl9yZWFkaW5nPSExLG4ucHVzaChlKSYmbi5fcmVhZChpKX0sdGhpcy5kZXN0cm95ZWQ9ITEscGUuY2FsbCh0aGlzLGV8fHQpO2xldCBuPXRoaXMsaT10aGlzLl9yZWFkYWJsZVN0YXRlLmhpZ2hXYXRlck1hcmt9cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQmJihlPXQsdD17fSksdD1ycih0KSxaZShyLHBlKSxyLnByb3RvdHlwZS5fZnJvbT1lfHxlcixyLnByb3RvdHlwZS5fcmVhZD1mdW5jdGlvbih0KXt0aGlzLl9yZWFkaW5nfHx0aGlzLmRlc3Ryb3llZHx8KHRoaXMuX3JlYWRpbmc9ITAsdGhpcy5fZnJvbSh0LHRoaXMuX2NhbGxiYWNrKSl9LHIucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24odCl7aWYodGhpcy5kZXN0cm95ZWQpcmV0dXJuO3RoaXMuZGVzdHJveWVkPSEwO2xldCBlPXRoaXM7cHJvY2Vzcy5uZXh0VGljaygoZnVuY3Rpb24oKXt0JiZlLmVtaXQoImVycm9yIix0KSxlLmVtaXQoImNsb3NlIil9KSl9LHJ9ZnVuY3Rpb24gZXIoKXt9ZnVuY3Rpb24gcnIodCl7cmV0dXJuIHQ9dHx8e319WGUuY3Rvcj10cixYZS5vYmo9ZnVuY3Rpb24odCxlKXtyZXR1cm4oImZ1bmN0aW9uIj09dHlwZW9mIHR8fEFycmF5LmlzQXJyYXkodCkpJiYoZT10LHQ9e30pLCh0PXJyKHQpKS5vYmplY3RNb2RlPSEwLHQuaGlnaFdhdGVyTWFyaz0xNixYZSh0LGUpfTt2YXIgbnIsaXI9MSxvcj17fSxzcj0hMSxhcj1sLmRvY3VtZW50O2Z1bmN0aW9uIHVyKHQpeyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1uZXcgRnVuY3Rpb24oIiIrdCkpO2Zvcih2YXIgZT1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aC0xKSxyPTA7cjxlLmxlbmd0aDtyKyspZVtyXT1hcmd1bWVudHNbcisxXTt2YXIgbj17Y2FsbGJhY2s6dCxhcmdzOmV9O3JldHVybiBvcltpcl09bixucihpciksaXIrK31mdW5jdGlvbiBocih0KXtpZihzcilzZXRUaW1lb3V0KGhyLDAsdCk7ZWxzZXt2YXIgZT1vclt0XTtpZihlKXtzcj0hMDt0cnl7IWZ1bmN0aW9uKHQpe3ZhciBlPXQuY2FsbGJhY2sscj10LmFyZ3M7c3dpdGNoKHIubGVuZ3RoKXtjYXNlIDA6ZSgpO2JyZWFrO2Nhc2UgMTplKHJbMF0pO2JyZWFrO2Nhc2UgMjplKHJbMF0sclsxXSk7YnJlYWs7Y2FzZSAzOmUoclswXSxyWzFdLHJbMl0pO2JyZWFrO2RlZmF1bHQ6ZS5hcHBseSh2b2lkIDAscil9fShlKX1maW5hbGx5eyFmdW5jdGlvbih0KXtkZWxldGUgb3JbdF19KHQpLHNyPSExfX19fXZhciBmcixjcixscixwcixkcj1PYmplY3QuZ2V0UHJvdG90eXBlT2YmJk9iamVjdC5nZXRQcm90b3R5cGVPZihsKTtmdW5jdGlvbiBncih0KXtsZXQgZSxyPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KTtpZihlPSJbb2JqZWN0IFByb21pc2VdIj09PXIsZSlyZXR1cm4hMDtpZigiW29iamVjdCBGdW5jdGlvbl0iIT09cilyZXR1cm4hMTt0cnl7ZT0iZnVuY3Rpb24iIT10eXBlb2YgdC5zdWJzY3JpYmUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LnRoZW59Y2F0Y2godCl7fXJldHVybiBlfWZ1bmN0aW9uIHlyKHQpe2xldCBlLHIsbjtmdW5jdGlvbiBpKGkpeygodD1pKWluc3RhbmNlb2YgQXJyYXlCdWZmZXJ8fEFycmF5QnVmZmVyLmlzVmlldyh0KSYmIUEuaXNCdWZmZXIodCkpJiYodD1BLmZyb20odCkpLGU9Z3IodCk/dDpudWxsO2NvbnN0IG89IWUmJnRbU3ltYm9sLml0ZXJhdG9yXSYmInN0cmluZyIhPXR5cGVvZiB0JiYhQS5pc0J1ZmZlcih0KTtyPW8/dFtTeW1ib2wuaXRlcmF0b3JdKCk6bnVsbDtjb25zdCBzPSFlJiZ0W1N5bWJvbC5hc3luY0l0ZXJhdG9yXTtuPXM/dFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTpudWxsfXJldHVybiBBcnJheS5pc0FycmF5KHQpJiYodD10LnNsaWNlKCkpLGkodCksWGUoKGZ1bmN0aW9uIG8ocyxhKXtpZihlKXJldHVybiB2b2lkKGFzeW5jKCk9Pnt0cnl7YXdhaXQgaShhd2FpdCBlKSxvLmNhbGwodGhpcyxzLGEpfWNhdGNoKHQpe2EodCl9fSkoKTtpZihyKXtjb25zdCB0PXIubmV4dCgpO3JldHVybiB2b2lkIHVyKGEsbnVsbCx0LmRvbmU/bnVsbDp0LnZhbHVlKX1pZihuKXJldHVybiB2b2lkKGFzeW5jKCk9Pnt0cnl7Y29uc3QgdD1hd2FpdCBuLm5leHQoKTt1cihhLG51bGwsdC5kb25lP251bGw6dC52YWx1ZSl9Y2F0Y2godCl7dXIoYSx0KX19KSgpO2lmKDA9PT10Lmxlbmd0aClyZXR1cm4gdm9pZCB1cihhLG51bGwsbnVsbCk7Y29uc3QgdT10LnNsaWNlKDAscyk7dD10LnNsaWNlKHMpLHVyKGEsbnVsbCx1KX0pKX1kcj1kciYmZHIuc2V0VGltZW91dD9kcjpsLCJbb2JqZWN0IHByb2Nlc3NdIj09PXt9LnRvU3RyaW5nLmNhbGwobC5wcm9jZXNzKT9ucj1mdW5jdGlvbih0KXtCdC5uZXh0VGljaygoZnVuY3Rpb24oKXtocih0KX0pKX06IWZ1bmN0aW9uKCl7aWYobC5wb3N0TWVzc2FnZSYmIWwuaW1wb3J0U2NyaXB0cyl7dmFyIHQ9ITAsZT1sLm9ubWVzc2FnZTtyZXR1cm4gbC5vbm1lc3NhZ2U9ZnVuY3Rpb24oKXt0PSExfSxsLnBvc3RNZXNzYWdlKCIiLCIqIiksbC5vbm1lc3NhZ2U9ZSx0fX0oKT9sLk1lc3NhZ2VDaGFubmVsPygoY3I9bmV3IE1lc3NhZ2VDaGFubmVsKS5wb3J0MS5vbm1lc3NhZ2U9ZnVuY3Rpb24odCl7aHIodC5kYXRhKX0sbnI9ZnVuY3Rpb24odCl7Y3IucG9ydDIucG9zdE1lc3NhZ2UodCl9KTphciYmIm9ucmVhZHlzdGF0ZWNoYW5nZSJpbiBhci5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKT8oZnI9YXIuZG9jdW1lbnRFbGVtZW50LG5yPWZ1bmN0aW9uKHQpe3ZhciBlPWFyLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2Uub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7aHIodCksZS5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCxmci5yZW1vdmVDaGlsZChlKSxlPW51bGx9LGZyLmFwcGVuZENoaWxkKGUpfSk6bnI9ZnVuY3Rpb24odCl7c2V0VGltZW91dChociwwLHQpfToobHI9InNldEltbWVkaWF0ZSQiK01hdGgucmFuZG9tKCkrIiQiLHByPWZ1bmN0aW9uKHQpe3Quc291cmNlPT09bCYmInN0cmluZyI9PXR5cGVvZiB0LmRhdGEmJjA9PT10LmRhdGEuaW5kZXhPZihscikmJmhyKCt0LmRhdGEuc2xpY2UobHIubGVuZ3RoKSl9LGwuYWRkRXZlbnRMaXN0ZW5lcj9sLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHByLCExKTpsLmF0dGFjaEV2ZW50KCJvbm1lc3NhZ2UiLHByKSxucj1mdW5jdGlvbih0KXtsLnBvc3RNZXNzYWdlKGxyK3QsIioiKX0pLHlyLm9iamVjdD10PT57bGV0IGUscixuO2Z1bmN0aW9uIGkoaSl7ZT1ncih0PWkpP3Q6bnVsbCxyPSFlJiZ0W1N5bWJvbC5pdGVyYXRvcl0/dFtTeW1ib2wuaXRlcmF0b3JdKCk6bnVsbCxuPSFlJiZ0W1N5bWJvbC5hc3luY0l0ZXJhdG9yXT90W1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpOm51bGx9cmV0dXJuIEFycmF5LmlzQXJyYXkodCkmJih0PXQuc2xpY2UoKSksaSh0KSxYZS5vYmooKGZ1bmN0aW9uIG8ocyxhKXtpZihlKShhc3luYygpPT57dHJ5e2F3YWl0IGkoYXdhaXQgZSksby5jYWxsKHRoaXMscyxhKX1jYXRjaCh0KXthKHQpfX0pKCk7ZWxzZSBpZihyKXtjb25zdCB0PXIubmV4dCgpO3VyKGEsbnVsbCx0LmRvbmU/bnVsbDp0LnZhbHVlKX1lbHNlIG4/KGFzeW5jKCk9Pnt0cnl7Y29uc3QgdD1hd2FpdCBuLm5leHQoKTt1cihhLG51bGwsdC5kb25lP251bGw6dC52YWx1ZSl9Y2F0Y2godCl7dXIoYSx0KX19KSgpOih0aGlzLnB1c2godCksdXIoYSxudWxsLG51bGwpKX0pKX07dmFyIHZyPXt9LGJyPXZyLkxFRlRfQlJBQ0U9MSxtcj12ci5SSUdIVF9CUkFDRT0yLHdyPXZyLkxFRlRfQlJBQ0tFVD0zLF9yPXZyLlJJR0hUX0JSQUNLRVQ9NCxTcj12ci5DT0xPTj01LEVyPXZyLkNPTU1BPTYsa3I9dnIuVFJVRT03LFJyPXZyLkZBTFNFPTgsQXI9dnIuTlVMTD05LFRyPXZyLlNUUklORz0xMCxPcj12ci5OVU1CRVI9MTEsanI9dnIuU1RBUlQ9MTcsTHI9dnIuU1RPUD0xOCxDcj12ci5UUlVFMT0zMyxQcj12ci5UUlVFMj0zNCxNcj12ci5UUlVFMz0zNSxCcj12ci5GQUxTRTE9NDkseHI9dnIuRkFMU0UyPTUwLFVyPXZyLkZBTFNFMz01MSxJcj12ci5GQUxTRTQ9NTIsRHI9dnIuTlVMTDE9NjUsTnI9dnIuTlVMTDI9NjYsRnI9dnIuTlVMTDM9NjcsenI9dnIuTlVNQkVSMT04MSxxcj12ci5OVU1CRVIzPTgzLFlyPXZyLlNUUklORzE9OTcsV3I9dnIuU1RSSU5HMj05OCwkcj12ci5TVFJJTkczPTk5LEdyPXZyLlNUUklORzQ9MTAwLEpyPXZyLlNUUklORzU9MTAxLEhyPXZyLlNUUklORzY9MTAyLFZyPXZyLlZBTFVFPTExMyxLcj12ci5LRVk9MTE0LFpyPXZyLk9CSkVDVD0xMjksUXI9dnIuQVJSQVk9MTMwLFhyPSJcXCIuY2hhckNvZGVBdCgwKSx0bj0iLyIuY2hhckNvZGVBdCgwKSxlbj0iXGIiLmNoYXJDb2RlQXQoMCkscm49IlxmIi5jaGFyQ29kZUF0KDApLG5uPSJcbiIuY2hhckNvZGVBdCgwKSxvbj0iXHIiLmNoYXJDb2RlQXQoMCksc249Ilx0Ii5jaGFyQ29kZUF0KDApO2Z1bmN0aW9uIGFuKCl7dGhpcy50U3RhdGU9anIsdGhpcy52YWx1ZT12b2lkIDAsdGhpcy5zdHJpbmc9dm9pZCAwLHRoaXMuc3RyaW5nQnVmZmVyPUEuYWxsb2M/QS5hbGxvYyg2NTUzNik6bmV3IEEoNjU1MzYpLHRoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0PTAsdGhpcy51bmljb2RlPXZvaWQgMCx0aGlzLmhpZ2hTdXJyb2dhdGU9dm9pZCAwLHRoaXMua2V5PXZvaWQgMCx0aGlzLm1vZGU9dm9pZCAwLHRoaXMuc3RhY2s9W10sdGhpcy5zdGF0ZT1Wcix0aGlzLmJ5dGVzX3JlbWFpbmluZz0wLHRoaXMuYnl0ZXNfaW5fc2VxdWVuY2U9MCx0aGlzLnRlbXBfYnVmZnM9ezI6bmV3IEEoMiksMzpuZXcgQSgzKSw0Om5ldyBBKDQpfSx0aGlzLm9mZnNldD0tMX1hbi50b2tuYW09ZnVuY3Rpb24odCl7Zm9yKHZhciBlPU9iamVjdC5rZXlzKHZyKSxyPTAsbj1lLmxlbmd0aDtyPG47cisrKXt2YXIgaT1lW3JdO2lmKHZyW2ldPT09dClyZXR1cm4gaX1yZXR1cm4gdCYmIjB4Iit0LnRvU3RyaW5nKDE2KX07dmFyIHVuPWFuLnByb3RvdHlwZTt1bi5vbkVycm9yPWZ1bmN0aW9uKHQpe3Rocm93IHR9LHVuLmNoYXJFcnJvcj1mdW5jdGlvbih0LGUpe3RoaXMudFN0YXRlPUxyLHRoaXMub25FcnJvcihuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgIitKU09OLnN0cmluZ2lmeShTdHJpbmcuZnJvbUNoYXJDb2RlKHRbZV0pKSsiIGF0IHBvc2l0aW9uICIrZSsiIGluIHN0YXRlICIrYW4udG9rbmFtKHRoaXMudFN0YXRlKSkpfSx1bi5hcHBlbmRTdHJpbmdDaGFyPWZ1bmN0aW9uKHQpe3RoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0Pj02NTUzNiYmKHRoaXMuc3RyaW5nKz10aGlzLnN0cmluZ0J1ZmZlci50b1N0cmluZygidXRmOCIpLHRoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0PTApLHRoaXMuc3RyaW5nQnVmZmVyW3RoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0KytdPXR9LHVuLmFwcGVuZFN0cmluZ0J1Zj1mdW5jdGlvbih0LGUscil7dmFyIG49dC5sZW5ndGg7Im51bWJlciI9PXR5cGVvZiBlJiYobj0ibnVtYmVyIj09dHlwZW9mIHI/cjwwP3QubGVuZ3RoLWUrcjpyLWU6dC5sZW5ndGgtZSksbjwwJiYobj0wKSx0aGlzLnN0cmluZ0J1ZmZlck9mZnNldCtuPjY1NTM2JiYodGhpcy5zdHJpbmcrPXRoaXMuc3RyaW5nQnVmZmVyLnRvU3RyaW5nKCJ1dGY4IiwwLHRoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0KSx0aGlzLnN0cmluZ0J1ZmZlck9mZnNldD0wKSx0LmNvcHkodGhpcy5zdHJpbmdCdWZmZXIsdGhpcy5zdHJpbmdCdWZmZXJPZmZzZXQsZSxyKSx0aGlzLnN0cmluZ0J1ZmZlck9mZnNldCs9bn0sdW4ud3JpdGU9ZnVuY3Rpb24odCl7dmFyIGU7InN0cmluZyI9PXR5cGVvZiB0JiYodD1uZXcgQSh0KSk7Zm9yKHZhciByPTAsbj10Lmxlbmd0aDtyPG47cisrKWlmKHRoaXMudFN0YXRlPT09anIpe2lmKGU9dFtyXSx0aGlzLm9mZnNldCsrLDEyMz09PWUpdGhpcy5vblRva2VuKGJyLCJ7Iik7ZWxzZSBpZigxMjU9PT1lKXRoaXMub25Ub2tlbihtciwifSIpO2Vsc2UgaWYoOTE9PT1lKXRoaXMub25Ub2tlbih3ciwiWyIpO2Vsc2UgaWYoOTM9PT1lKXRoaXMub25Ub2tlbihfciwiXSIpO2Vsc2UgaWYoNTg9PT1lKXRoaXMub25Ub2tlbihTciwiOiIpO2Vsc2UgaWYoNDQ9PT1lKXRoaXMub25Ub2tlbihFciwiLCIpO2Vsc2UgaWYoMTE2PT09ZSl0aGlzLnRTdGF0ZT1DcjtlbHNlIGlmKDEwMj09PWUpdGhpcy50U3RhdGU9QnI7ZWxzZSBpZigxMTA9PT1lKXRoaXMudFN0YXRlPURyO2Vsc2UgaWYoMzQ9PT1lKXRoaXMuc3RyaW5nPSIiLHRoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0PTAsdGhpcy50U3RhdGU9WXI7ZWxzZSBpZig0NT09PWUpdGhpcy5zdHJpbmc9Ii0iLHRoaXMudFN0YXRlPXpyO2Vsc2UgaWYoZT49NDgmJmU8NjQpdGhpcy5zdHJpbmc9U3RyaW5nLmZyb21DaGFyQ29kZShlKSx0aGlzLnRTdGF0ZT1xcjtlbHNlIGlmKDMyIT09ZSYmOSE9PWUmJjEwIT09ZSYmMTMhPT1lKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpfWVsc2UgaWYodGhpcy50U3RhdGU9PT1ZcilpZihlPXRbcl0sdGhpcy5ieXRlc19yZW1haW5pbmc+MCl7Zm9yKHZhciBpPTA7aTx0aGlzLmJ5dGVzX3JlbWFpbmluZztpKyspdGhpcy50ZW1wX2J1ZmZzW3RoaXMuYnl0ZXNfaW5fc2VxdWVuY2VdW3RoaXMuYnl0ZXNfaW5fc2VxdWVuY2UtdGhpcy5ieXRlc19yZW1haW5pbmcraV09dFtpXTt0aGlzLmFwcGVuZFN0cmluZ0J1Zih0aGlzLnRlbXBfYnVmZnNbdGhpcy5ieXRlc19pbl9zZXF1ZW5jZV0pLHRoaXMuYnl0ZXNfaW5fc2VxdWVuY2U9dGhpcy5ieXRlc19yZW1haW5pbmc9MCxyPXIraS0xfWVsc2UgaWYoMD09PXRoaXMuYnl0ZXNfcmVtYWluaW5nJiZlPj0xMjgpe2lmKGU8PTE5M3x8ZT4yNDQpcmV0dXJuIHRoaXMub25FcnJvcihuZXcgRXJyb3IoIkludmFsaWQgVVRGLTggY2hhcmFjdGVyIGF0IHBvc2l0aW9uICIrcisiIGluIHN0YXRlICIrYW4udG9rbmFtKHRoaXMudFN0YXRlKSkpO2lmKGU+PTE5NCYmZTw9MjIzJiYodGhpcy5ieXRlc19pbl9zZXF1ZW5jZT0yKSxlPj0yMjQmJmU8PTIzOSYmKHRoaXMuYnl0ZXNfaW5fc2VxdWVuY2U9MyksZT49MjQwJiZlPD0yNDQmJih0aGlzLmJ5dGVzX2luX3NlcXVlbmNlPTQpLHRoaXMuYnl0ZXNfaW5fc2VxdWVuY2Urcj50Lmxlbmd0aCl7Zm9yKHZhciBvPTA7bzw9dC5sZW5ndGgtMS1yO28rKyl0aGlzLnRlbXBfYnVmZnNbdGhpcy5ieXRlc19pbl9zZXF1ZW5jZV1bb109dFtyK29dO3RoaXMuYnl0ZXNfcmVtYWluaW5nPXIrdGhpcy5ieXRlc19pbl9zZXF1ZW5jZS10Lmxlbmd0aCxyPXQubGVuZ3RoLTF9ZWxzZSB0aGlzLmFwcGVuZFN0cmluZ0J1Zih0LHIscit0aGlzLmJ5dGVzX2luX3NlcXVlbmNlKSxyPXIrdGhpcy5ieXRlc19pbl9zZXF1ZW5jZS0xfWVsc2UgaWYoMzQ9PT1lKXRoaXMudFN0YXRlPWpyLHRoaXMuc3RyaW5nKz10aGlzLnN0cmluZ0J1ZmZlci50b1N0cmluZygidXRmOCIsMCx0aGlzLnN0cmluZ0J1ZmZlck9mZnNldCksdGhpcy5zdHJpbmdCdWZmZXJPZmZzZXQ9MCx0aGlzLm9uVG9rZW4oVHIsdGhpcy5zdHJpbmcpLHRoaXMub2Zmc2V0Kz1BLmJ5dGVMZW5ndGgodGhpcy5zdHJpbmcsInV0ZjgiKSsxLHRoaXMuc3RyaW5nPXZvaWQgMDtlbHNlIGlmKDkyPT09ZSl0aGlzLnRTdGF0ZT1XcjtlbHNle2lmKCEoZT49MzIpKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMuYXBwZW5kU3RyaW5nQ2hhcihlKX1lbHNlIGlmKHRoaXMudFN0YXRlPT09V3IpaWYoMzQ9PT0oZT10W3JdKSl0aGlzLmFwcGVuZFN0cmluZ0NoYXIoZSksdGhpcy50U3RhdGU9WXI7ZWxzZSBpZig5Mj09PWUpdGhpcy5hcHBlbmRTdHJpbmdDaGFyKFhyKSx0aGlzLnRTdGF0ZT1ZcjtlbHNlIGlmKDQ3PT09ZSl0aGlzLmFwcGVuZFN0cmluZ0NoYXIodG4pLHRoaXMudFN0YXRlPVlyO2Vsc2UgaWYoOTg9PT1lKXRoaXMuYXBwZW5kU3RyaW5nQ2hhcihlbiksdGhpcy50U3RhdGU9WXI7ZWxzZSBpZigxMDI9PT1lKXRoaXMuYXBwZW5kU3RyaW5nQ2hhcihybiksdGhpcy50U3RhdGU9WXI7ZWxzZSBpZigxMTA9PT1lKXRoaXMuYXBwZW5kU3RyaW5nQ2hhcihubiksdGhpcy50U3RhdGU9WXI7ZWxzZSBpZigxMTQ9PT1lKXRoaXMuYXBwZW5kU3RyaW5nQ2hhcihvbiksdGhpcy50U3RhdGU9WXI7ZWxzZSBpZigxMTY9PT1lKXRoaXMuYXBwZW5kU3RyaW5nQ2hhcihzbiksdGhpcy50U3RhdGU9WXI7ZWxzZXtpZigxMTchPT1lKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudW5pY29kZT0iIix0aGlzLnRTdGF0ZT0kcn1lbHNlIGlmKHRoaXMudFN0YXRlPT09JHJ8fHRoaXMudFN0YXRlPT09R3J8fHRoaXMudFN0YXRlPT09SnJ8fHRoaXMudFN0YXRlPT09SHIpe2lmKCEoKGU9dFtyXSk+PTQ4JiZlPDY0fHxlPjY0JiZlPD03MHx8ZT45NiYmZTw9MTAyKSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTtpZih0aGlzLnVuaWNvZGUrPVN0cmluZy5mcm9tQ2hhckNvZGUoZSksdGhpcy50U3RhdGUrKz09PUhyKXt2YXIgcz1wYXJzZUludCh0aGlzLnVuaWNvZGUsMTYpO3RoaXMudW5pY29kZT12b2lkIDAsdm9pZCAwIT09dGhpcy5oaWdoU3Vycm9nYXRlJiZzPj01NjMyMCYmczw1NzM0ND8odGhpcy5hcHBlbmRTdHJpbmdCdWYobmV3IEEoU3RyaW5nLmZyb21DaGFyQ29kZSh0aGlzLmhpZ2hTdXJyb2dhdGUscykpKSx0aGlzLmhpZ2hTdXJyb2dhdGU9dm9pZCAwKTp2b2lkIDA9PT10aGlzLmhpZ2hTdXJyb2dhdGUmJnM+PTU1Mjk2JiZzPDU2MzIwP3RoaXMuaGlnaFN1cnJvZ2F0ZT1zOih2b2lkIDAhPT10aGlzLmhpZ2hTdXJyb2dhdGUmJih0aGlzLmFwcGVuZFN0cmluZ0J1ZihuZXcgQShTdHJpbmcuZnJvbUNoYXJDb2RlKHRoaXMuaGlnaFN1cnJvZ2F0ZSkpKSx0aGlzLmhpZ2hTdXJyb2dhdGU9dm9pZCAwKSx0aGlzLmFwcGVuZFN0cmluZ0J1ZihuZXcgQShTdHJpbmcuZnJvbUNoYXJDb2RlKHMpKSkpLHRoaXMudFN0YXRlPVlyfX1lbHNlIGlmKHRoaXMudFN0YXRlPT09enJ8fHRoaXMudFN0YXRlPT09cXIpc3dpdGNoKGU9dFtyXSl7Y2FzZSA0ODpjYXNlIDQ5OmNhc2UgNTA6Y2FzZSA1MTpjYXNlIDUyOmNhc2UgNTM6Y2FzZSA1NDpjYXNlIDU1OmNhc2UgNTY6Y2FzZSA1NzpjYXNlIDQ2OmNhc2UgMTAxOmNhc2UgNjk6Y2FzZSA0MzpjYXNlIDQ1OnRoaXMuc3RyaW5nKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGUpLHRoaXMudFN0YXRlPXFyO2JyZWFrO2RlZmF1bHQ6dGhpcy50U3RhdGU9anI7dmFyIGE9TnVtYmVyKHRoaXMuc3RyaW5nKTtpZihpc05hTihhKSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnN0cmluZy5tYXRjaCgvWzAtOV0rLyk9PXRoaXMuc3RyaW5nJiZhLnRvU3RyaW5nKCkhPXRoaXMuc3RyaW5nP3RoaXMub25Ub2tlbihUcix0aGlzLnN0cmluZyk6dGhpcy5vblRva2VuKE9yLGEpLHRoaXMub2Zmc2V0Kz10aGlzLnN0cmluZy5sZW5ndGgtMSx0aGlzLnN0cmluZz12b2lkIDAsci0tfWVsc2UgaWYodGhpcy50U3RhdGU9PT1Dcil7aWYoMTE0IT09dFtyXSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnRTdGF0ZT1Qcn1lbHNlIGlmKHRoaXMudFN0YXRlPT09UHIpe2lmKDExNyE9PXRbcl0pcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy50U3RhdGU9TXJ9ZWxzZSBpZih0aGlzLnRTdGF0ZT09PU1yKXtpZigxMDEhPT10W3JdKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudFN0YXRlPWpyLHRoaXMub25Ub2tlbihrciwhMCksdGhpcy5vZmZzZXQrPTN9ZWxzZSBpZih0aGlzLnRTdGF0ZT09PUJyKXtpZig5NyE9PXRbcl0pcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy50U3RhdGU9eHJ9ZWxzZSBpZih0aGlzLnRTdGF0ZT09PXhyKXtpZigxMDghPT10W3JdKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudFN0YXRlPVVyfWVsc2UgaWYodGhpcy50U3RhdGU9PT1Vcil7aWYoMTE1IT09dFtyXSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnRTdGF0ZT1Jcn1lbHNlIGlmKHRoaXMudFN0YXRlPT09SXIpe2lmKDEwMSE9PXRbcl0pcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy50U3RhdGU9anIsdGhpcy5vblRva2VuKFJyLCExKSx0aGlzLm9mZnNldCs9NH1lbHNlIGlmKHRoaXMudFN0YXRlPT09RHIpe2lmKDExNyE9PXRbcl0pcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy50U3RhdGU9TnJ9ZWxzZSBpZih0aGlzLnRTdGF0ZT09PU5yKXtpZigxMDghPT10W3JdKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudFN0YXRlPUZyfWVsc2UgaWYodGhpcy50U3RhdGU9PT1Gcil7aWYoMTA4IT09dFtyXSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnRTdGF0ZT1qcix0aGlzLm9uVG9rZW4oQXIsbnVsbCksdGhpcy5vZmZzZXQrPTN9fSx1bi5vblRva2VuPWZ1bmN0aW9uKHQsZSl7fSx1bi5wYXJzZUVycm9yPWZ1bmN0aW9uKHQsZSl7dGhpcy50U3RhdGU9THIsdGhpcy5vbkVycm9yKG5ldyBFcnJvcigiVW5leHBlY3RlZCAiK2FuLnRva25hbSh0KSsoZT8iKCIrSlNPTi5zdHJpbmdpZnkoZSkrIikiOiIiKSsiIGluIHN0YXRlICIrYW4udG9rbmFtKHRoaXMuc3RhdGUpKSl9LHVuLnB1c2g9ZnVuY3Rpb24oKXt0aGlzLnN0YWNrLnB1c2goe3ZhbHVlOnRoaXMudmFsdWUsa2V5OnRoaXMua2V5LG1vZGU6dGhpcy5tb2RlfSl9LHVuLnBvcD1mdW5jdGlvbigpe3ZhciB0PXRoaXMudmFsdWUsZT10aGlzLnN0YWNrLnBvcCgpO3RoaXMudmFsdWU9ZS52YWx1ZSx0aGlzLmtleT1lLmtleSx0aGlzLm1vZGU9ZS5tb2RlLHRoaXMuZW1pdCh0KSx0aGlzLm1vZGV8fCh0aGlzLnN0YXRlPVZyKX0sdW4uZW1pdD1mdW5jdGlvbih0KXt0aGlzLm1vZGUmJih0aGlzLnN0YXRlPUVyKSx0aGlzLm9uVmFsdWUodCl9LHVuLm9uVmFsdWU9ZnVuY3Rpb24odCl7fSx1bi5vblRva2VuPWZ1bmN0aW9uKHQsZSl7aWYodGhpcy5zdGF0ZT09PVZyKWlmKHQ9PT1Ucnx8dD09PU9yfHx0PT09a3J8fHQ9PT1Scnx8dD09PUFyKXRoaXMudmFsdWUmJih0aGlzLnZhbHVlW3RoaXMua2V5XT1lKSx0aGlzLmVtaXQoZSk7ZWxzZSBpZih0PT09YnIpdGhpcy5wdXNoKCksdGhpcy52YWx1ZT90aGlzLnZhbHVlPXRoaXMudmFsdWVbdGhpcy5rZXldPXt9OnRoaXMudmFsdWU9e30sdGhpcy5rZXk9dm9pZCAwLHRoaXMuc3RhdGU9S3IsdGhpcy5tb2RlPVpyO2Vsc2UgaWYodD09PXdyKXRoaXMucHVzaCgpLHRoaXMudmFsdWU/dGhpcy52YWx1ZT10aGlzLnZhbHVlW3RoaXMua2V5XT1bXTp0aGlzLnZhbHVlPVtdLHRoaXMua2V5PTAsdGhpcy5tb2RlPVFyLHRoaXMuc3RhdGU9VnI7ZWxzZSBpZih0PT09bXIpe2lmKHRoaXMubW9kZSE9PVpyKXJldHVybiB0aGlzLnBhcnNlRXJyb3IodCxlKTt0aGlzLnBvcCgpfWVsc2V7aWYodCE9PV9yKXJldHVybiB0aGlzLnBhcnNlRXJyb3IodCxlKTtpZih0aGlzLm1vZGUhPT1RcilyZXR1cm4gdGhpcy5wYXJzZUVycm9yKHQsZSk7dGhpcy5wb3AoKX1lbHNlIGlmKHRoaXMuc3RhdGU9PT1LcilpZih0PT09VHIpdGhpcy5rZXk9ZSx0aGlzLnN0YXRlPVNyO2Vsc2V7aWYodCE9PW1yKXJldHVybiB0aGlzLnBhcnNlRXJyb3IodCxlKTt0aGlzLnBvcCgpfWVsc2UgaWYodGhpcy5zdGF0ZT09PVNyKXtpZih0IT09U3IpcmV0dXJuIHRoaXMucGFyc2VFcnJvcih0LGUpO3RoaXMuc3RhdGU9VnJ9ZWxzZXtpZih0aGlzLnN0YXRlIT09RXIpcmV0dXJuIHRoaXMucGFyc2VFcnJvcih0LGUpO2lmKHQ9PT1Fcil0aGlzLm1vZGU9PT1Rcj8odGhpcy5rZXkrKyx0aGlzLnN0YXRlPVZyKTp0aGlzLm1vZGU9PT1aciYmKHRoaXMuc3RhdGU9S3IpO2Vsc2V7aWYoISh0PT09X3ImJnRoaXMubW9kZT09PVFyfHx0PT09bXImJnRoaXMubW9kZT09PVpyKSlyZXR1cm4gdGhpcy5wYXJzZUVycm9yKHQsZSk7dGhpcy5wb3AoKX19fSxhbi5DPXZyO3ZhciBobj1hbjtmdW5jdGlvbiBmbih0LGUscil7dD10fHxmdW5jdGlvbih0KXt0aGlzLnF1ZXVlKHQpfSxlPWV8fGZ1bmN0aW9uKCl7dGhpcy5xdWV1ZShudWxsKX07bGV0IG49ITEsaT0hMSxvPVtdLHM9ITEsYT1uZXcgSmU7ZnVuY3Rpb24gdSgpe2Zvcig7by5sZW5ndGgmJiFhLnBhdXNlZDspe2xldCB0PW8uc2hpZnQoKTtpZihudWxsPT09dClyZXR1cm4gYS5lbWl0KCJlbmQiKTthLmVtaXQoImRhdGEiLHQpfX1mdW5jdGlvbiBoKCl7YS53cml0YWJsZT0hMSxlLmNhbGwoYSksIWEucmVhZGFibGUmJmEuYXV0b0Rlc3Ryb3kmJmEuZGVzdHJveSgpfXJldHVybiBhLnJlYWRhYmxlPWEud3JpdGFibGU9ITAsYS5wYXVzZWQ9ITEsYS5hdXRvRGVzdHJveT0hKHImJiExPT09ci5hdXRvRGVzdHJveSksYS53cml0ZT1mdW5jdGlvbihlKXtyZXR1cm4gdC5jYWxsKHRoaXMsZSksIWEucGF1c2VkfSxhLnF1ZXVlPWEucHVzaD1mdW5jdGlvbih0KXtyZXR1cm4gc3x8KG51bGw9PT10JiYocz0hMCksby5wdXNoKHQpLHUoKSksYX0sYS5vbigiZW5kIiwoZnVuY3Rpb24oKXthLnJlYWRhYmxlPSExLCFhLndyaXRhYmxlJiZhLmF1dG9EZXN0cm95JiZCdC5uZXh0VGljaygoZnVuY3Rpb24oKXthLmRlc3Ryb3koKX0pKX0pKSxhLmVuZD1mdW5jdGlvbih0KXtpZighbilyZXR1cm4gbj0hMCxhcmd1bWVudHMubGVuZ3RoJiZhLndyaXRlKHQpLGgoKSxhfSxhLmRlc3Ryb3k9ZnVuY3Rpb24oKXtpZighaSlyZXR1cm4gaT0hMCxuPSEwLG8ubGVuZ3RoPTAsYS53cml0YWJsZT1hLnJlYWRhYmxlPSExLGEuZW1pdCgiY2xvc2UiKSxhfSxhLnBhdXNlPWZ1bmN0aW9uKCl7aWYoIWEucGF1c2VkKXJldHVybiBhLnBhdXNlZD0hMCxhfSxhLnJlc3VtZT1mdW5jdGlvbigpe3JldHVybiBhLnBhdXNlZCYmKGEucGF1c2VkPSExLGEuZW1pdCgicmVzdW1lIikpLHUoKSxhLnBhdXNlZHx8YS5lbWl0KCJkcmFpbiIpLGF9LGF9Zm4udGhyb3VnaD1mbjtsZXQgY249e3BhcnNlOmZ1bmN0aW9uKHQsZSl7bGV0IHIsbjtmdW5jdGlvbiBpKHQsZSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P2U9PT10OnQmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LmV4ZWM/dC5leGVjKGUpOiJib29sZWFuIj09dHlwZW9mIHR8fCJvYmplY3QiPT10eXBlb2YgdD90OiJmdW5jdGlvbiI9PXR5cGVvZiB0JiZ0KGUpfWxldCBvPW5ldyBobixzPWZuKChmdW5jdGlvbih0KXsic3RyaW5nIj09dHlwZW9mIHQmJih0PUEuZnJvbSh0KSksby53cml0ZSh0KX0pLChmdW5jdGlvbih0KXt0JiZzLndyaXRlKHQpLHImJnMuZW1pdCgiaGVhZGVyIixyKSxuJiZzLmVtaXQoImZvb3RlciIsbikscy5xdWV1ZShudWxsKX0pKTtmdW5jdGlvbiBhKHQsZSl7ITEhPT1yJiYocj1yfHx7fSxyW3RdPWUpLCExIT09biYmITE9PT1yJiYobj1ufHx7fSxuW3RdPWUpfXJldHVybiJzdHJpbmciPT10eXBlb2YgdCYmKHQ9dC5zcGxpdCgiLiIpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIiQqIj09PXQ/e2VtaXRLZXk6ITB9OiIqIj09PXR8fCgiIj09PXQ/e3JlY3Vyc2U6ITB9OnQpfSkpKSx0JiZ0Lmxlbmd0aHx8KHQ9bnVsbCksby5vblZhbHVlPWZ1bmN0aW9uKG4pe2lmKHRoaXMucm9vdHx8KHMucm9vdD1uKSwhdClyZXR1cm47bGV0IG89MCx1PTAsaD0hMSxmPSExO2Zvcig7bzx0Lmxlbmd0aDspe2xldCBlLHI9dFtvXTtpZih1KyssciYmIXIucmVjdXJzZSl7aWYoZT11PT09dGhpcy5zdGFjay5sZW5ndGg/dGhpczp0aGlzLnN0YWNrW3VdLCFlKXJldHVybjtpZighaShyLGUua2V5KSlyZXR1cm4gdm9pZCBhKGUua2V5LG4pO2g9ISFyLmVtaXRLZXksZj0hIXIuZW1pdFBhdGgsbysrfWVsc2V7bysrO2xldCByPXRbb107aWYoIXIpcmV0dXJuO2Zvcig7Oyl7aWYoZT11PT09dGhpcy5zdGFjay5sZW5ndGg/dGhpczp0aGlzLnN0YWNrW3VdLCFlKXJldHVybjtpZihpKHIsZS5rZXkpKXtvKyssT2JqZWN0LmlzRnJvemVuKHRoaXMuc3RhY2tbdV0pfHwodGhpcy5zdGFja1t1XS52YWx1ZT1udWxsKTticmVha31hKGUua2V5LG4pLHUrK319fWlmKHImJihzLmVtaXQoImhlYWRlciIscikscj0hMSksdSE9PXRoaXMuc3RhY2subGVuZ3RoKXJldHVybjtsZXQgYz10aGlzLnN0YWNrLnNsaWNlKDEpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQua2V5fSkpLmNvbmNhdChbdGhpcy5rZXldKSxsPW47bnVsbCE9bCYmbnVsbCE9KGw9ZT9lKGwsYyk6bCkmJigoaHx8ZikmJihsPXt2YWx1ZTpsfSxoJiYobC5rZXk9dGhpcy5rZXkpLGYmJihsLnBhdGg9YykpLHMucXVldWUobCkpLHRoaXMudmFsdWUmJmRlbGV0ZSB0aGlzLnZhbHVlW3RoaXMua2V5XTtmb3IobGV0IHQgaW4gdGhpcy5zdGFjaylPYmplY3QuaXNGcm96ZW4odGhpcy5zdGFja1t0XSl8fCh0aGlzLnN0YWNrW3RdLnZhbHVlPW51bGwpfSxvLl9vblRva2VuPW8ub25Ub2tlbixvLm9uVG9rZW49ZnVuY3Rpb24oZSxyKXtvLl9vblRva2VuKGUsciksMD09PXRoaXMuc3RhY2subGVuZ3RoJiZzLnJvb3QmJih0fHxzLnF1ZXVlKHMucm9vdCkscy5yb290PW51bGwpfSxvLm9uRXJyb3I9ZnVuY3Rpb24odCl7dC5tZXNzYWdlLmluZGV4T2YoImF0IHBvc2l0aW9uIik+LTEmJih0Lm1lc3NhZ2U9IkludmFsaWQgSlNPTiAoIit0Lm1lc3NhZ2UrIikiKSxzLmVtaXQoImVycm9yIix0KX0sc319LGxuPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGxuPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2ZvcihsZXQgciBpbiBlKWUuaGFzT3duUHJvcGVydHkocikmJih0W3JdPWVbcl0pfSxsbih0LGUpfTtsZXQgcG4sZG49L1tcXCJcdTAwMDAtXHUwMDFmXHUwMDdmLVx1MDA5Zlx1MDBhZFx1MDYwMC1cdTA2MDRcdTA3MGZcdTE3YjRcdTE3YjVcdTIwMGMtXHUyMDBmXHUyMDI4LVx1MjAyZlx1MjA2MC1cdTIwNmZcdWZlZmZcdWZmZjAtXHVmZmZmXS9nLGduPXsiXGIiOiJcXGIiLCJcdCI6IlxcdCIsIlxuIjoiXFxuIiwiXGYiOiJcXGYiLCJcciI6IlxcciIsJyInOidcXCInLCJcXCI6IlxcXFwifTtmdW5jdGlvbiB5bih0KXtyZXR1cm4gdD8iZnVuY3Rpb24iPT10eXBlb2YgdC50aGVuP3BuLlByb21pc2U6ZnVuY3Rpb24odCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQucmVhZCYmImZ1bmN0aW9uIj09dHlwZW9mIHQucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHQucGlwZSYmImZ1bmN0aW9uIj09dHlwZW9mIHQub25jZSYmImZ1bmN0aW9uIj09dHlwZW9mIHQucmVtb3ZlTGlzdGVuZXJ9KHQpP3QuX3JlYWRhYmxlU3RhdGUub2JqZWN0TW9kZT9wbi5SZWFkYWJsZU9iamVjdDpwbi5SZWFkYWJsZVN0cmluZzpBcnJheS5pc0FycmF5KHQpP3BuLkFycmF5OiJvYmplY3QiPT10eXBlb2YgdHx8dCBpbnN0YW5jZW9mIE9iamVjdD9wbi5PYmplY3Q6cG4uUHJpbWl0aXZlOnBuLlByaW1pdGl2ZX0hZnVuY3Rpb24odCl7dFt0LkFycmF5PTBdPSJBcnJheSIsdFt0Lk9iamVjdD0xXT0iT2JqZWN0Iix0W3QuUmVhZGFibGVTdHJpbmc9Ml09IlJlYWRhYmxlU3RyaW5nIix0W3QuUmVhZGFibGVPYmplY3Q9M109IlJlYWRhYmxlT2JqZWN0Iix0W3QuUHJpbWl0aXZlPTRdPSJQcmltaXRpdmUiLHRbdC5Qcm9taXNlPTVdPSJQcm9taXNlIn0ocG58fChwbj17fSkpO2xldCB2bj1bXTt2bltwbi5BcnJheV09IlsiLHZuW3BuLk9iamVjdF09InsiLHZuW3BuLlJlYWRhYmxlU3RyaW5nXT0nIicsdm5bcG4uUmVhZGFibGVPYmplY3RdPSJbIjtsZXQgYm49W107Ym5bcG4uQXJyYXldPSJdIixibltwbi5PYmplY3RdPSJ9Iixibltwbi5SZWFkYWJsZVN0cmluZ109JyInLGJuW3BuLlJlYWRhYmxlT2JqZWN0XT0iXSI7bGV0IG1uPVtdO2ZvcihsZXQgdD0wLGU9T2JqZWN0LmVudHJpZXMocG4pO3Q8ZS5sZW5ndGg7dCsrKXtsZXQgcj1lW3RdLG49clswXSxpPXJbMV07Im51bWJlciI9PXR5cGVvZiBpJiYobW5baV09InByb2Nlc3MiK24pfWZ1bmN0aW9uIHduKHQpe3JldHVybiB0LnJlcGxhY2UoZG4sKGZ1bmN0aW9uKHQpe2xldCBlPWduW3RdO3JldHVybiJzdHJpbmciPT10eXBlb2YgZT9lOiJcXHUiK3QuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikucGFkU3RhcnQoNCwiMCIpfSkpfWZ1bmN0aW9uIF9uKHQpe3JldHVybiciJyt3bih0KSsnIid9ZnVuY3Rpb24gU24odCxlKXtsZXQgcj10LnJlYWQoZSk7cmV0dXJuIG51bGw9PT1yP25ldyBQcm9taXNlKChmdW5jdGlvbihlLHIpe2xldCBuPWZ1bmN0aW9uKCl7cmV0dXJuIGUobnVsbCl9O3Qub25jZSgiZW5kIixuKSx0Lm9uY2UoImVycm9yIixyKSx0Lm9uY2UoInJlYWRhYmxlIiwoZnVuY3Rpb24oKXt0LnJlbW92ZUxpc3RlbmVyKCJlbmQiLG4pLHQucmVtb3ZlTGlzdGVuZXIoImVycm9yIixyKSxlKHQucmVhZCgpKX0pKX0pKTpQcm9taXNlLnJlc29sdmUocil9ZnVuY3Rpb24gRW4odCl7cmV0dXJuIHQudGhlbigoZnVuY3Rpb24odCl7cmV0dXJuIHluKHQpPT09cG4uUHJvbWlzZT9Fbih0KTp0fSkpfWxldCBrbj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUscixuLGkpe3ZvaWQgMD09PWkmJihpPSExKTtsZXQgbz10LmNhbGwodGhpcyl8fHRoaXM7by5jeWNsZT1pLG8uc3RhY2s9W10sby5kZXB0aD0wLG8ucHVzaENhbGxlZD0hMSxvLmVuZD0hMSxvLmlzUmVhZGluZz0hMSxvLnJlYWRNb3JlPSExO2xldCBzPXR5cGVvZiBuO3JldHVybiJzdHJpbmciIT09cyYmIm51bWJlciIhPT1zfHwoby5nYXA9TnVtYmVyLmlzRmluaXRlKG4pPyIgIi5yZXBlYXQobik6biksT2JqZWN0LmFzc2lnbihvLHt2aXNpdGVkOmk/bmV3IFdlYWtNYXA6bmV3IFdlYWtTZXQscmVwbGFjZXJGdW5jdGlvbjpyIGluc3RhbmNlb2YgRnVuY3Rpb24mJnIscmVwbGFjZXJBcnJheTpBcnJheS5pc0FycmF5KHIpJiZyfSksciBpbnN0YW5jZW9mIEZ1bmN0aW9uJiYoby5yZXBsYWNlckZ1bmN0aW9uPXIpLEFycmF5LmlzQXJyYXkocikmJihvLnJlcGxhY2VyQXJyYXk9ciksby5hZGRUb1N0YWNrKGUpLG99cmV0dXJuIGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gcigpe3RoaXMuY29uc3RydWN0b3I9dH1sbih0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KHIucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyByKX0oZSx0KSxlLnByb3RvdHlwZS5jeWNsZXI9ZnVuY3Rpb24odCxlKXtsZXQgcj10aGlzLnZpc2l0ZWQuZ2V0KGUpO2lmKHIpcmV0dXJueyRyZWY6cn07bGV0IG49dGhpcy5wYXRoKCk7cmV0dXJuIHZvaWQgMCE9PXQmJm4ucHVzaCh0KSxuPW4ubWFwKChmdW5jdGlvbih0KXtyZXR1cm4iWyIrKE51bWJlci5pc0ludGVnZXIodCk/dDpfbih0KSkrIl0ifSkpLHRoaXMudmlzaXRlZC5zZXQoZSxuLmxlbmd0aD8iJCIrbi5qb2luKCIiKToiJCIpLGV9LGUucHJvdG90eXBlLmFkZFRvU3RhY2s9ZnVuY3Rpb24odCxlLHIsbil7bGV0IGksbyxzPXRoaXMsYT10O3RoaXMucmVwbGFjZXJGdW5jdGlvbiYmKGE9dGhpcy5yZXBsYWNlckZ1bmN0aW9uKGV8fHIsYSx0aGlzKSksYSYmYS50b0pTT04gaW5zdGFuY2VvZiBGdW5jdGlvbiYmKGE9YS50b0pTT04oKSksKGEgaW5zdGFuY2VvZiBGdW5jdGlvbnx8InN5bWJvbCI9PXR5cGVvZiB0KSYmKGE9dm9pZCAwKSx2b2lkIDAhPT1lJiZ0aGlzLnJlcGxhY2VyQXJyYXkmJih0aGlzLnJlcGxhY2VyQXJyYXkuaW5jbHVkZXMoZSl8fChhPXZvaWQgMCkpO2xldCB1PXluKGEpO2lmKChuJiZuLnR5cGU9PT1wbi5BcnJheXx8dm9pZCAwIT09YSkmJnUhPT1wbi5Qcm9taXNlJiYobiYmIW4uZmlyc3QmJnRoaXMuX3B1c2goIiwiKSxuJiYobi5maXJzdD0hMSkpLHZvaWQgMCE9PWEmJnUhPT1wbi5Qcm9taXNlJiZlJiYodGhpcy5nYXA/dGhpcy5fcHVzaCgiXG4iK3RoaXMuZ2FwLnJlcGVhdCh0aGlzLmRlcHRoKSsnIicrd24oZSkrJyI6ICcpOnRoaXMuX3B1c2goJyInK3duKGUpKyciOicpKSx1IT09cG4uUHJpbWl0aXZlKWlmKHRoaXMuY3ljbGUpYT10aGlzLmN5Y2xlcihlfHxyLGEpLHU9eW4oYSk7ZWxzZXtpZih0aGlzLnZpc2l0ZWQuaGFzKGEpKXRocm93IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKCJDb252ZXJ0aW5nIGNpcmN1bGFyIHN0cnVjdHVyZSB0byBKU09OIikse3JlYWxWYWx1ZTphLGtleTplfHxyfSk7dGhpcy52aXNpdGVkLmFkZChhKX0hZSYmcj4tMSYmdGhpcy5kZXB0aCYmdGhpcy5nYXAmJnRoaXMuX3B1c2goIlxuIit0aGlzLmdhcC5yZXBlYXQodGhpcy5kZXB0aCkpO2xldCBoPXZuW3VdO2gmJnRoaXMuX3B1c2goaCk7bGV0IGY9e2tleTplLGluZGV4OnIsdHlwZTp1LHBhcmVudDpuLHZhbHVlOmEsZmlyc3Q6ITB9O3JldHVybiB1PT09cG4uT2JqZWN0Pyh0aGlzLmRlcHRoKz0xLGYudW5yZWFkPU9iamVjdC5rZXlzKGEpLGYuaXNFbXB0eT0hZi51bnJlYWQubGVuZ3RoKTp1PT09cG4uQXJyYXk/KHRoaXMuZGVwdGgrPTEsZi51bnJlYWQ9YS5sZW5ndGgsZi5hcnJheUxlbmd0aD1mLnVucmVhZCxmLmlzRW1wdHk9IWYudW5yZWFkKTp1IT09cG4uUmVhZGFibGVTdHJpbmcmJnUhPT1wbi5SZWFkYWJsZU9iamVjdHx8KHRoaXMuZGVwdGgrPTEsYS5yZWFkYWJsZUVuZGVkfHwobnVsbD09PShpPWEuX3JlYWRhYmxlU3RhdGUpfHx2b2lkIDA9PT1pP3ZvaWQgMDppLmVuZEVtaXR0ZWQpP3RoaXMuZW1pdCgiZXJyb3IiLG5ldyBFcnJvcigiUmVhZGFibGUgU3RyZWFtIGhhcyBlbmRlZCBiZWZvcmUgaXQgd2FzIHNlcmlhbGl6ZWQuIEFsbCBzdHJlYW0gZGF0YSBoYXZlIGJlZW4gbG9zdCIpLGEsZXx8cik6KGEucmVhZGFibGVGbG93aW5nfHwobnVsbD09PShvPWEuX3JlYWRhYmxlU3RhdGUpfHx2b2lkIDA9PT1vP3ZvaWQgMDpvLmZsb3dpbmcpKSYmKGEucGF1c2UoKSx0aGlzLmVtaXQoImVycm9yIixuZXcgRXJyb3IoIlJlYWRhYmxlIFN0cmVhbSBpcyBpbiBmbG93aW5nIG1vZGUsIGRhdGEgbWF5IGhhdmUgYmVlbiBsb3N0LiBUcnlpbmcgdG8gcGF1c2Ugc3RyZWFtLiIpLGEsZXx8cikpLGYucmVhZENvdW50PTAsYS5vbmNlKCJlbmQiLChmdW5jdGlvbigpe2YuZW5kPSEwLHMuX19yZWFkKCl9KSksYS5vbmNlKCJlcnJvciIsKGZ1bmN0aW9uKHQpe3MuZXJyb3I9ITAscy5lbWl0KCJlcnJvciIsdCl9KSkpLHRoaXMuc3RhY2sudW5zaGlmdChmKSxmfSxlLnByb3RvdHlwZS5yZW1vdmVGcm9tU3RhY2s9ZnVuY3Rpb24odCl7bGV0IGU9dC50eXBlLHI9ZT09PXBuLk9iamVjdHx8ZT09PXBuLkFycmF5fHxlPT09cG4uUmVhZGFibGVTdHJpbmd8fGU9PT1wbi5SZWFkYWJsZU9iamVjdDtlIT09cG4uUHJpbWl0aXZlJiYodGhpcy5jeWNsZXx8dGhpcy52aXNpdGVkLmRlbGV0ZSh0LnZhbHVlKSxyJiYodGhpcy5kZXB0aC09MSkpO2xldCBuPWJuW2VdO3ImJiF0LmlzRW1wdHkmJnRoaXMuZ2FwJiZ0aGlzLl9wdXNoKCJcbiIrdGhpcy5nYXAucmVwZWF0KHRoaXMuZGVwdGgpKSxuJiZ0aGlzLl9wdXNoKG4pO2xldCBpPXRoaXMuc3RhY2suaW5kZXhPZih0KTt0aGlzLnN0YWNrLnNwbGljZShpLDEpfSxlLnByb3RvdHlwZS5fcHVzaD1mdW5jdGlvbih0KXt0aGlzLnB1c2hDYWxsZWQ9ITAsdGhpcy5wdXNoKHQpfSxlLnByb3RvdHlwZS5wcm9jZXNzUmVhZGFibGVPYmplY3Q9ZnVuY3Rpb24odCxlKXtsZXQgcj10aGlzO2lmKCF0LmVuZClyZXR1cm4gU24odC52YWx1ZSxlKS50aGVuKChmdW5jdGlvbihlKXtudWxsIT09ZSYmKHQuZmlyc3R8fHIuX3B1c2goIiwiKSx0LmZpcnN0PSExLHIuYWRkVG9TdGFjayhlLHZvaWQgMCx0LnJlYWRDb3VudCksdC5yZWFkQ291bnQrPTEpfSkpO3RoaXMucmVtb3ZlRnJvbVN0YWNrKHQpfSxlLnByb3RvdHlwZS5wcm9jZXNzT2JqZWN0PWZ1bmN0aW9uKHQpe2lmKCF0LnVucmVhZC5sZW5ndGgpcmV0dXJuIHZvaWQgdGhpcy5yZW1vdmVGcm9tU3RhY2sodCk7bGV0IGU9dC51bnJlYWQuc2hpZnQoKSxyPXQudmFsdWVbZV07dGhpcy5hZGRUb1N0YWNrKHIsZSx2b2lkIDAsdCl9LGUucHJvdG90eXBlLnByb2Nlc3NBcnJheT1mdW5jdGlvbih0KXtsZXQgZT10LnVucmVhZDtpZighZSlyZXR1cm4gdm9pZCB0aGlzLnJlbW92ZUZyb21TdGFjayh0KTtsZXQgcj10LmFycmF5TGVuZ3RoLWUsbj10LnZhbHVlW3JdO3QudW5yZWFkLT0xLHRoaXMuYWRkVG9TdGFjayhuLHZvaWQgMCxyLHQpfSxlLnByb3RvdHlwZS5wcm9jZXNzUHJpbWl0aXZlPWZ1bmN0aW9uKHQpe2lmKHZvaWQgMCE9PXQudmFsdWUpe2xldCBlLHI9dHlwZW9mIHQudmFsdWU7c3dpdGNoKHIpe2Nhc2Uic3RyaW5nIjplPV9uKHQudmFsdWUpO2JyZWFrO2Nhc2UibnVtYmVyIjplPU51bWJlci5pc0Zpbml0ZSh0LnZhbHVlKT9TdHJpbmcodC52YWx1ZSk6Im51bGwiO2JyZWFrO2Nhc2UiYm9vbGVhbiI6ZT1TdHJpbmcodC52YWx1ZSk7YnJlYWs7Y2FzZSJvYmplY3QiOnQudmFsdWV8fChlPSJudWxsIik7YnJlYWs7ZGVmYXVsdDp0aHJvdyBPYmplY3QuYXNzaWduKG5ldyBFcnJvcignVW5rbm93biB0eXBlICInK3IrJyIuIFBsZWFzZSBmaWxlIGFuIGlzc3VlIScpLHt2YWx1ZTp0LnZhbHVlfSl9dGhpcy5fcHVzaChlKX1lbHNlIXRoaXMuc3RhY2tbMV18fHRoaXMuc3RhY2tbMV0udHlwZSE9PXBuLkFycmF5JiZ0aGlzLnN0YWNrWzFdLnR5cGUhPT1wbi5SZWFkYWJsZU9iamVjdD90LmFkZFNlcGFyYXRvckFmdGVyRW5kPSExOnRoaXMuX3B1c2goIm51bGwiKTt0aGlzLnJlbW92ZUZyb21TdGFjayh0KX0sZS5wcm90b3R5cGUucHJvY2Vzc1JlYWRhYmxlU3RyaW5nPWZ1bmN0aW9uKHQsZSl7bGV0IHI9dGhpcztpZighdC5lbmQpcmV0dXJuIFNuKHQudmFsdWUsZSkudGhlbigoZnVuY3Rpb24odCl7dCYmci5fcHVzaCh3bih0LnRvU3RyaW5nKCkpKX0pKTt0aGlzLnJlbW92ZUZyb21TdGFjayh0KX0sZS5wcm90b3R5cGUucHJvY2Vzc1Byb21pc2U9ZnVuY3Rpb24odCl7bGV0IGU9dGhpcztyZXR1cm4gRW4odC52YWx1ZSkudGhlbigoZnVuY3Rpb24ocil7ZS5yZW1vdmVGcm9tU3RhY2sodCksZS5hZGRUb1N0YWNrKHIsdC5rZXksdC5pbmRleCx0LnBhcmVudCl9KSl9LGUucHJvdG90eXBlLnByb2Nlc3NTdGFja1RvcEl0ZW09ZnVuY3Rpb24odCl7bGV0IGUscj10aGlzLG49dGhpcy5zdGFja1swXTtpZighbnx8dGhpcy5lcnJvcilyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7dHJ5e2U9dGhpc1ttbltuLnR5cGVdXShuLHQpfWNhdGNoKHQpe3JldHVybiBQcm9taXNlLnJlamVjdCh0KX1yZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGUpLnRoZW4oKGZ1bmN0aW9uKCl7MD09PXIuc3RhY2subGVuZ3RoJiYoci5lbmQ9ITAsci5fcHVzaChudWxsKSl9KSl9LGUucHJvdG90eXBlLl9fcmVhZD1mdW5jdGlvbih0KXtsZXQgZT10aGlzO2lmKCF0aGlzLmlzUmVhZGluZyYmIXRoaXMuZXJyb3IpcmV0dXJuIHRoaXMuaXNSZWFkaW5nPSEwLHRoaXMucmVhZE1vcmU9ITEsdGhpcy5wcm9jZXNzU3RhY2tUb3BJdGVtKHQpLnRoZW4oKGZ1bmN0aW9uKCl7IWUuZW5kJiYhZS5lcnJvciYmKGUucmVhZE1vcmV8fCFlLnB1c2hDYWxsZWQpP3VyKChmdW5jdGlvbigpe2UuaXNSZWFkaW5nPSExLGUuX19yZWFkKCl9KSk6ZS5pc1JlYWRpbmc9ITF9KSkuY2F0Y2goKGZ1bmN0aW9uKHQpe2UuZXJyb3I9ITAsZS5lbWl0KCJlcnJvciIsdCl9KSk7dGhpcy5yZWFkTW9yZT0hMH0sZS5wcm90b3R5cGUuX3JlYWQ9ZnVuY3Rpb24odCl7dGhpcy5wdXNoQ2FsbGVkPSExLHRoaXMuX19yZWFkKHQpfSxlLnByb3RvdHlwZS5wYXRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhY2subWFwKChmdW5jdGlvbih0KXtsZXQgZT10LmtleSxyPXQuaW5kZXg7cmV0dXJuIGV8fHJ9KSkuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gdHx8dD4tMX0pKS5yZXZlcnNlKCl9LGV9KHBlKTt2YXIgUm49QXJyYXkuaXNBcnJheSxBbj0ib2JqZWN0Ij09dHlwZW9mIEhlJiZIZSYmSGUuT2JqZWN0PT09T2JqZWN0JiZIZSxUbj0ib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYmJnNlbGYuT2JqZWN0PT09T2JqZWN0JiZzZWxmLE9uPUFufHxUbnx8RnVuY3Rpb24oInJldHVybiB0aGlzIikoKSxqbj1Pbi5TeW1ib2wsTG49T2JqZWN0LnByb3RvdHlwZSxDbj1Mbi5oYXNPd25Qcm9wZXJ0eSxQbj1Mbi50b1N0cmluZyxNbj1qbj9qbi50b1N0cmluZ1RhZzp2b2lkIDA7dmFyIEJuPWZ1bmN0aW9uKHQpe3ZhciBlPUNuLmNhbGwodCxNbikscj10W01uXTt0cnl7dFtNbl09dm9pZCAwO3ZhciBuPSEwfWNhdGNoKHQpe312YXIgaT1Qbi5jYWxsKHQpO3JldHVybiBuJiYoZT90W01uXT1yOmRlbGV0ZSB0W01uXSksaX0seG49T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZzt2YXIgVW49ZnVuY3Rpb24odCl7cmV0dXJuIHhuLmNhbGwodCl9LEluPWpuP2puLnRvU3RyaW5nVGFnOnZvaWQgMDt2YXIgRG49ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dm9pZCAwPT09dD8iW29iamVjdCBVbmRlZmluZWRdIjoiW29iamVjdCBOdWxsXSI6SW4mJkluIGluIE9iamVjdCh0KT9Cbih0KTpVbih0KX07dmFyIE5uPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT10JiYib2JqZWN0Ij09dHlwZW9mIHR9O3ZhciBGbj1mdW5jdGlvbih0KXtyZXR1cm4ic3ltYm9sIj09dHlwZW9mIHR8fE5uKHQpJiYiW29iamVjdCBTeW1ib2xdIj09RG4odCl9LHpuPS9cLnxcWyg/OlteW1xdXSp8KFsiJ10pKD86KD8hXDEpW15cXF18XFwuKSo/XDEpXF0vLHFuPS9eXHcqJC87dmFyIFluPWZ1bmN0aW9uKHQsZSl7aWYoUm4odCkpcmV0dXJuITE7dmFyIHI9dHlwZW9mIHQ7cmV0dXJuISgibnVtYmVyIiE9ciYmInN5bWJvbCIhPXImJiJib29sZWFuIiE9ciYmbnVsbCE9dCYmIUZuKHQpKXx8KHFuLnRlc3QodCl8fCF6bi50ZXN0KHQpfHxudWxsIT1lJiZ0IGluIE9iamVjdChlKSl9O3ZhciBXbj1mdW5jdGlvbih0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4gbnVsbCE9dCYmKCJvYmplY3QiPT1lfHwiZnVuY3Rpb24iPT1lKX07dmFyICRuLEduPWZ1bmN0aW9uKHQpe2lmKCFXbih0KSlyZXR1cm4hMTt2YXIgZT1Ebih0KTtyZXR1cm4iW29iamVjdCBGdW5jdGlvbl0iPT1lfHwiW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0iPT1lfHwiW29iamVjdCBBc3luY0Z1bmN0aW9uXSI9PWV8fCJbb2JqZWN0IFByb3h5XSI9PWV9LEpuPU9uWyJfX2NvcmUtanNfc2hhcmVkX18iXSxIbj0oJG49L1teLl0rJC8uZXhlYyhKbiYmSm4ua2V5cyYmSm4ua2V5cy5JRV9QUk9UT3x8IiIpKT8iU3ltYm9sKHNyYylfMS4iKyRuOiIiO3ZhciBWbj1mdW5jdGlvbih0KXtyZXR1cm4hIUhuJiZIbiBpbiB0fSxLbj1GdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmc7dmFyIFpuPWZ1bmN0aW9uKHQpe2lmKG51bGwhPXQpe3RyeXtyZXR1cm4gS24uY2FsbCh0KX1jYXRjaCh0KXt9dHJ5e3JldHVybiB0KyIifWNhdGNoKHQpe319cmV0dXJuIiJ9LFFuPS9eXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXSQvLFhuPUZ1bmN0aW9uLnByb3RvdHlwZSx0aT1PYmplY3QucHJvdG90eXBlLGVpPVhuLnRvU3RyaW5nLHJpPXRpLmhhc093blByb3BlcnR5LG5pPVJlZ0V4cCgiXiIrZWkuY2FsbChyaSkucmVwbGFjZSgvW1xcXiQuKis/KClbXF17fXxdL2csIlxcJCYiKS5yZXBsYWNlKC9oYXNPd25Qcm9wZXJ0eXwoZnVuY3Rpb24pLio/KD89XFxcKCl8IGZvciAuKz8oPz1cXFxdKS9nLCIkMS4qPyIpKyIkIik7dmFyIGlpPWZ1bmN0aW9uKHQpe3JldHVybiEoIVduKHQpfHxWbih0KSkmJihHbih0KT9uaTpRbikudGVzdChabih0KSl9O3ZhciBvaT1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT10P3ZvaWQgMDp0W2VdfTt2YXIgc2k9ZnVuY3Rpb24odCxlKXt2YXIgcj1vaSh0LGUpO3JldHVybiBpaShyKT9yOnZvaWQgMH0sYWk9c2koT2JqZWN0LCJjcmVhdGUiKTt2YXIgdWk9ZnVuY3Rpb24oKXt0aGlzLl9fZGF0YV9fPWFpP2FpKG51bGwpOnt9LHRoaXMuc2l6ZT0wfTt2YXIgaGk9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5oYXModCkmJmRlbGV0ZSB0aGlzLl9fZGF0YV9fW3RdO3JldHVybiB0aGlzLnNpemUtPWU/MTowLGV9LGZpPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIGNpPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX187aWYoYWkpe3ZhciByPWVbdF07cmV0dXJuIl9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iPT09cj92b2lkIDA6cn1yZXR1cm4gZmkuY2FsbChlLHQpP2VbdF06dm9pZCAwfSxsaT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciBwaT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fO3JldHVybiBhaT92b2lkIDAhPT1lW3RdOmxpLmNhbGwoZSx0KX07dmFyIGRpPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5fX2RhdGFfXztyZXR1cm4gdGhpcy5zaXplKz10aGlzLmhhcyh0KT8wOjEsclt0XT1haSYmdm9pZCAwPT09ZT8iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyI6ZSx0aGlzfTtmdW5jdGlvbiBnaSh0KXt2YXIgZT0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxyOyl7dmFyIG49dFtlXTt0aGlzLnNldChuWzBdLG5bMV0pfX1naS5wcm90b3R5cGUuY2xlYXI9dWksZ2kucHJvdG90eXBlLmRlbGV0ZT1oaSxnaS5wcm90b3R5cGUuZ2V0PWNpLGdpLnByb3RvdHlwZS5oYXM9cGksZ2kucHJvdG90eXBlLnNldD1kaTt2YXIgeWk9Z2k7dmFyIHZpPWZ1bmN0aW9uKCl7dGhpcy5fX2RhdGFfXz1bXSx0aGlzLnNpemU9MH07dmFyIGJpPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PT1lfHx0IT10JiZlIT1lfTt2YXIgbWk9ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9dC5sZW5ndGg7ci0tOylpZihiaSh0W3JdWzBdLGUpKXJldHVybiByO3JldHVybi0xfSx3aT1BcnJheS5wcm90b3R5cGUuc3BsaWNlO3ZhciBfaT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fLHI9bWkoZSx0KTtyZXR1cm4hKHI8MCkmJihyPT1lLmxlbmd0aC0xP2UucG9wKCk6d2kuY2FsbChlLHIsMSksLS10aGlzLnNpemUsITApfTt2YXIgU2k9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxyPW1pKGUsdCk7cmV0dXJuIHI8MD92b2lkIDA6ZVtyXVsxXX07dmFyIEVpPWZ1bmN0aW9uKHQpe3JldHVybiBtaSh0aGlzLl9fZGF0YV9fLHQpPi0xfTt2YXIga2k9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLl9fZGF0YV9fLG49bWkocix0KTtyZXR1cm4gbjwwPygrK3RoaXMuc2l6ZSxyLnB1c2goW3QsZV0pKTpyW25dWzFdPWUsdGhpc307ZnVuY3Rpb24gUmkodCl7dmFyIGU9LTEscj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8cjspe3ZhciBuPXRbZV07dGhpcy5zZXQoblswXSxuWzFdKX19UmkucHJvdG90eXBlLmNsZWFyPXZpLFJpLnByb3RvdHlwZS5kZWxldGU9X2ksUmkucHJvdG90eXBlLmdldD1TaSxSaS5wcm90b3R5cGUuaGFzPUVpLFJpLnByb3RvdHlwZS5zZXQ9a2k7dmFyIEFpPVJpLFRpPXNpKE9uLCJNYXAiKTt2YXIgT2k9ZnVuY3Rpb24oKXt0aGlzLnNpemU9MCx0aGlzLl9fZGF0YV9fPXtoYXNoOm5ldyB5aSxtYXA6bmV3KFRpfHxBaSksc3RyaW5nOm5ldyB5aX19O3ZhciBqaT1mdW5jdGlvbih0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4ic3RyaW5nIj09ZXx8Im51bWJlciI9PWV8fCJzeW1ib2wiPT1lfHwiYm9vbGVhbiI9PWU/Il9fcHJvdG9fXyIhPT10Om51bGw9PT10fTt2YXIgTGk9ZnVuY3Rpb24odCxlKXt2YXIgcj10Ll9fZGF0YV9fO3JldHVybiBqaShlKT9yWyJzdHJpbmciPT10eXBlb2YgZT8ic3RyaW5nIjoiaGFzaCJdOnIubWFwfTt2YXIgQ2k9ZnVuY3Rpb24odCl7dmFyIGU9TGkodGhpcyx0KS5kZWxldGUodCk7cmV0dXJuIHRoaXMuc2l6ZS09ZT8xOjAsZX07dmFyIFBpPWZ1bmN0aW9uKHQpe3JldHVybiBMaSh0aGlzLHQpLmdldCh0KX07dmFyIE1pPWZ1bmN0aW9uKHQpe3JldHVybiBMaSh0aGlzLHQpLmhhcyh0KX07dmFyIEJpPWZ1bmN0aW9uKHQsZSl7dmFyIHI9TGkodGhpcyx0KSxuPXIuc2l6ZTtyZXR1cm4gci5zZXQodCxlKSx0aGlzLnNpemUrPXIuc2l6ZT09bj8wOjEsdGhpc307ZnVuY3Rpb24geGkodCl7dmFyIGU9LTEscj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8cjspe3ZhciBuPXRbZV07dGhpcy5zZXQoblswXSxuWzFdKX19eGkucHJvdG90eXBlLmNsZWFyPU9pLHhpLnByb3RvdHlwZS5kZWxldGU9Q2kseGkucHJvdG90eXBlLmdldD1QaSx4aS5wcm90b3R5cGUuaGFzPU1pLHhpLnByb3RvdHlwZS5zZXQ9Qmk7dmFyIFVpPXhpO2Z1bmN0aW9uIElpKHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHR8fG51bGwhPWUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIkV4cGVjdGVkIGEgZnVuY3Rpb24iKTt2YXIgcj1mdW5jdGlvbigpe3ZhciBuPWFyZ3VtZW50cyxpPWU/ZS5hcHBseSh0aGlzLG4pOm5bMF0sbz1yLmNhY2hlO2lmKG8uaGFzKGkpKXJldHVybiBvLmdldChpKTt2YXIgcz10LmFwcGx5KHRoaXMsbik7cmV0dXJuIHIuY2FjaGU9by5zZXQoaSxzKXx8byxzfTtyZXR1cm4gci5jYWNoZT1uZXcoSWkuQ2FjaGV8fFVpKSxyfUlpLkNhY2hlPVVpO3ZhciBEaT1JaTt2YXIgTmk9L1teLltcXV0rfFxbKD86KC0/XGQrKD86XC5cZCspPyl8KFsiJ10pKCg/Oig/IVwyKVteXFxdfFxcLikqPylcMilcXXwoPz0oPzpcLnxcW1xdKSg/OlwufFxbXF18JCkpL2csRmk9L1xcKFxcKT8vZyx6aT1mdW5jdGlvbih0KXt2YXIgZT1EaSh0LChmdW5jdGlvbih0KXtyZXR1cm4gNTAwPT09ci5zaXplJiZyLmNsZWFyKCksdH0pKSxyPWUuY2FjaGU7cmV0dXJuIGV9KChmdW5jdGlvbih0KXt2YXIgZT1bXTtyZXR1cm4gNDY9PT10LmNoYXJDb2RlQXQoMCkmJmUucHVzaCgiIiksdC5yZXBsYWNlKE5pLChmdW5jdGlvbih0LHIsbixpKXtlLnB1c2gobj9pLnJlcGxhY2UoRmksIiQxIik6cnx8dCl9KSksZX0pKTt2YXIgcWk9ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9LTEsbj1udWxsPT10PzA6dC5sZW5ndGgsaT1BcnJheShuKTsrK3I8bjspaVtyXT1lKHRbcl0scix0KTtyZXR1cm4gaX0sWWk9am4/am4ucHJvdG90eXBlOnZvaWQgMCxXaT1ZaT9ZaS50b1N0cmluZzp2b2lkIDA7dmFyICRpPWZ1bmN0aW9uIHQoZSl7aWYoInN0cmluZyI9PXR5cGVvZiBlKXJldHVybiBlO2lmKFJuKGUpKXJldHVybiBxaShlLHQpKyIiO2lmKEZuKGUpKXJldHVybiBXaT9XaS5jYWxsKGUpOiIiO3ZhciByPWUrIiI7cmV0dXJuIjAiPT1yJiYxL2U9PS1JbmZpbml0eT8iLTAiOnJ9O3ZhciBHaT1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD8iIjokaSh0KX07dmFyIEppPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFJuKHQpP3Q6WW4odCxlKT9bdF06emkoR2kodCkpfTt2YXIgSGk9ZnVuY3Rpb24odCl7aWYoInN0cmluZyI9PXR5cGVvZiB0fHxGbih0KSlyZXR1cm4gdDt2YXIgZT10KyIiO3JldHVybiIwIj09ZSYmMS90PT0tSW5maW5pdHk/Ii0wIjplfTt2YXIgVmk9ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9MCxuPShlPUppKGUsdCkpLmxlbmd0aDtudWxsIT10JiZyPG47KXQ9dFtIaShlW3IrK10pXTtyZXR1cm4gciYmcj09bj90OnZvaWQgMH07dmFyIEtpPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1udWxsPT10P3ZvaWQgMDpWaSh0LGUpO3JldHVybiB2b2lkIDA9PT1uP3I6bn07dmFyIFppPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdHx8Tm4odCkmJiJbb2JqZWN0IE51bWJlcl0iPT1Ebih0KX07ZnVuY3Rpb24gUWkodCl7cmV0dXJuIltvYmplY3QgU3RyaW5nXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZnVuY3Rpb24gWGkodCl7cmV0dXJuISghUWkodCl8fCIiPT09dCl9ZnVuY3Rpb24gdG8odCl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBlbyh0KXtyZXR1cm4iW29iamVjdCBVbmRlZmluZWRdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBybyh0KXtyZXR1cm4iW29iamVjdCBPYmplY3RdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBubyh0KXtyZXR1cm4hKCFRaSh0KXx8IiIhPT10KX1mdW5jdGlvbiBpbyh0KXtyZXR1cm4hIWVvKHQpfHwoISFmdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBOdWxsXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9KHQpfHwoISFmdW5jdGlvbih0KXtpZihybyh0KSl7Zm9yKGxldCBlIGluIHQpcmV0dXJuITE7cmV0dXJuITB9cmV0dXJuITF9KHQpfHwoISFubyh0KXx8ISFmdW5jdGlvbih0KXtyZXR1cm4hIXRvKHQpJiYwPT09dC5sZW5ndGh9KHQpKSkpfWZ1bmN0aW9uIG9vKCl7bGV0IHQsZSxyPW5ldyBQcm9taXNlKChmdW5jdGlvbigpe3Q9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdfSkpO3JldHVybiByLnJlc29sdmU9dCxyLnJlamVjdD1lLHJ9bGV0IFdKc29uU3RyZWFtPXtwYXJzZTphc3luYyBmdW5jdGlvbih0KXtpZighWGkodCkpcmV0dXJue307bGV0IGU9e307dHJ5e2U9SlNPTi5wYXJzZSh0KX1jYXRjaCh0KXtlPXt9fXJldHVybiBlfSxwYXJzZUJ5U3RyZWFtOmZ1bmN0aW9uKHQpe2xldCBlPXt9O2lmKCJudWxsIj09PXQpcmV0dXJuIG51bGw7aWYoIiI9PT10KXJldHVybnt9O2xldCByPSJfX3N5c3RlbV9fIixuPWB7Il9fc3lzdGVtX18iOiR7dH19YCxpPW9vKCksbz15cihuKSxzPWNuLnBhcnNlKCIkKiIpO3JldHVybiBzLm9uKCJkYXRhIiwoZnVuY3Rpb24odCl7ZVt0LmtleV09dC52YWx1ZX0pKSxzLm9uKCJlbmQiLChmdW5jdGlvbigpe2xldCB0PUtpKGUscik7aS5yZXNvbHZlKHQpfSkpLHMub24oImVycm9yIiwoZnVuY3Rpb24odCl7aS5yZWplY3QodCl9KSksby5waXBlKHMpLGl9LGNyZWF0ZVBhcnNlU3RyZWFtOmZ1bmN0aW9uKHQpe3JldHVybiBYaSh0KXx8ZnVuY3Rpb24odCl7cmV0dXJuISghdG8odCl8fDA9PT10Lmxlbmd0aHx8MT09PXQubGVuZ3RoJiZpbyh0WzBdKSl9KHQpfHwodD0iJCoiKSxjbi5wYXJzZSh0KX0sc3RyaW5naWZ5OmFzeW5jIGZ1bmN0aW9uKHQpe2lmKGVvKHQpKXJldHVybiIiO2xldCBlPSIiO3RyeXtlPUpTT04uc3RyaW5naWZ5KHQpfWNhdGNoKHQpe2U9IiJ9cmV0dXJuIGV9LHN0cmluZ2lmeUJ5U3RyZWFtOmZ1bmN0aW9uKHQpe2xldCBlPSIiO2lmKGVvKHQpKXJldHVybiIiO2lmKG51bGw9PT10KXJldHVybiJudWxsIjtpZihubyh0KSlyZXR1cm4nIiInO2lmKFppKHQpKXJldHVybmAke3R9YDtpZihRaSh0KSlyZXR1cm5gIiR7dH0iYDtsZXQgcj1vbygpLG49bmV3IGtuKHQsbnVsbCxudWxsLCExKTtyZXR1cm4gbi5vbigiZGF0YSIsKGZ1bmN0aW9uKHQpe2UrPXR9KSksbi5vbigiZW5kIiwoZnVuY3Rpb24oKXtyLnJlc29sdmUoZSl9KSksbi5vbigiZXJyb3IiLChmdW5jdGlvbih0KXtyLnJlamVjdCh0KX0pKSxyfSxjcmVhdGVTdHJpbmdpZnlTdHJlYW06ZnVuY3Rpb24odCl7aWYoIXJvKHQpJiYhdG8odCkpdGhyb3cgbmV3IEVycm9yKCJkYXRhIGlzIG5vdCBvYmplY3Qgb3IgYXJyYXkiKTtyZXR1cm4gbmV3IGtuKHQsbnVsbCxudWxsLCExKX19OwoKbGV0IGluc3RhbmNlID0gbnVsbApmdW5jdGlvbiBpbml0KGlucHV0KXsKCiAgICAvL2luaXQKICAgIGxldCByCiAgICAKICAgICAgICByID0gV0pzb25TdHJlYW0oLi4uaW5wdXQpCiAgICAgICAgCgogICAgLy9vbgogICAgCgogICAgLy9zYXZlCiAgICBpbnN0YW5jZSA9IHIKCn0KCmZ1bmN0aW9uIHNlbmRNZXNzYWdlKGRhdGEpIHsKICAgIAogICAgICAgIHNlbGYucG9zdE1lc3NhZ2UoZGF0YSkKICAgICAgICAKfQoKYXN5bmMgZnVuY3Rpb24gcnVuKGRhdGEpIHsKICAgIC8vIGNvbnNvbGUubG9nKCdpbm5lciB3b3JrZXIgcnVuJyxkYXRhKQoKICAgIC8vbW9kZQogICAgbGV0IG1vZGUgPSBkYXRhLm1vZGUKCiAgICAvL2NoZWNrCiAgICBpZihtb2RlICE9PSAnaW5pdCcgJiYgbW9kZSAhPT0gJ2NhbGwnKXsKICAgICAgICByZXR1cm4KICAgIH0KCiAgICAvL2luaXQKICAgIGlmKG1vZGUgPT09ICdpbml0Jyl7CiAgICAgICAgCiAgICAgICAgdHJ5ewoKICAgICAgICAgICAgLy90eXBlCiAgICAgICAgICAgIGxldCB0eXBlID0gZGF0YS50eXBlCgogICAgICAgICAgICAvL2lucHV0CiAgICAgICAgICAgIGxldCBpbnB1dCA9IGRhdGEuaW5wdXQKICAgIAogICAgICAgICAgICAvL2luc3RhbmNlCiAgICAgICAgICAgIGlmKHR5cGUgPT09ICdmdW5jdGlvbicpewogICAgICAgICAgICAgICAgaW5pdCguLi5pbnB1dCkKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmKHR5cGUgPT09ICdvYmplY3QnKXsKICAgICAgICAgICAgICAgIGluc3RhbmNlID0gV0pzb25TdHJlYW0KICAgICAgICAgICAgfQoKICAgICAgICB9CiAgICAgICAgY2F0Y2goZXJyKXsKICAgICAgICAKICAgICAgICAgICAgLy9zZW5kTWVzc2FnZQogICAgICAgICAgICBsZXQgcmVzID0gewogICAgICAgICAgICAgICAgbW9kZTogJ2VtaXQnLAogICAgICAgICAgICAgICAgZXZOYW1lOiAnZXJyb3InLAogICAgICAgICAgICAgICAgbXNnOiBlcnIsCiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2VuZE1lc3NhZ2UocmVzKQoKICAgICAgICB9CiAgICAgICAgICAgIAogICAgfQoKICAgIC8vY2hlY2sKICAgIGlmKG1vZGUgPT09ICdjYWxsJyl7CiAgICAgICAgbGV0IHN0YXRlID0gJycKICAgICAgICBsZXQgbXNnID0gbnVsbAoKICAgICAgICB0cnl7CgogICAgICAgICAgICAvL2Z1bgogICAgICAgICAgICBsZXQgZnVuID0gaW5zdGFuY2VbZGF0YS5mdW5dCgogICAgICAgICAgICAvL2lucHV0CiAgICAgICAgICAgIGxldCBpbnB1dCA9IGRhdGEuaW5wdXQKCiAgICAgICAgICAgIC8vZXhlYwogICAgICAgICAgICBhd2FpdCBmdW4oLi4uaW5wdXQpCiAgICAgICAgICAgICAgICAudGhlbigoc3VjKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGU9J3N1Y2Nlc3MnCiAgICAgICAgICAgICAgICAgICAgbXNnPXN1YwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGU9J2Vycm9yJwogICAgICAgICAgICAgICAgICAgIG1zZz1lcnIKICAgICAgICAgICAgICAgIH0pCgogICAgICAgIH0KICAgICAgICBjYXRjaChlcnIpewogICAgICAgICAgICBzdGF0ZSA9ICdlcnJvcicKICAgICAgICAgICAgbXNnID0gZXJyCiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vc2VuZE1lc3NhZ2UKICAgICAgICBsZXQgcmVzID0gewogICAgICAgICAgICBtb2RlOiAncmV0dXJuJywKICAgICAgICAgICAgaWQ6IGRhdGEuaWQsCiAgICAgICAgICAgIGZ1bjogZGF0YS5mdW4sCiAgICAgICAgICAgIHN0YXRlLAogICAgICAgICAgICBtc2csCiAgICAgICAgfQogICAgICAgIHNlbmRNZXNzYWdlKHJlcykKCiAgICB9Cgp9CgpmdW5jdGlvbiByZWN2TWVzc2FnZShkYXRhKSB7CiAgICAvLyBjb25zb2xlLmxvZygnaW5uZXIgd29ya2VyIHJlY3Y6JywgZGF0YSkKCiAgICAvL2RhdGFSZWN2CiAgICBsZXQgZGF0YVJlY3YgPSBkYXRhCgogICAgLy9ydW4KICAgIHJ1bihkYXRhUmVjdikKCn0KCgogICAgICAgIHNlbGYub25tZXNzYWdlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgcmVjdk1lc3NhZ2UoZS5kYXRhKQogICAgICAgIH0KICAgICAgICAKCg==");function G(){var Z=l();function c(l){try{var Z=new Blob([l]),d=window.URL||window.webkitURL;return new Worker(d.createObjectURL(Z))}catch(l){I(l)}}var G=c(b);if(!G)return I("invalid worker"),null;function X(){G?(G.terminate(),G=void 0):I("worker has been terminated")}function i(){var l={mode:"init",type:"object",input:Array.prototype.slice.call(arguments)};G.postMessage(l)}function W(){var l=d(),c=m(),b={mode:"call",id:c,fun:"stringify",input:Array.prototype.slice.call(arguments)};return G.postMessage(b),Z.once(c,(function(Z){"success"===Z.state?l.resolve(Z.msg):l.reject(Z.msg)})),l}function u(){var l=d(),c=m(),b={mode:"call",id:c,fun:"parse",input:Array.prototype.slice.call(arguments)};return G.postMessage(b),Z.once(c,(function(Z){"success"===Z.state?l.resolve(Z.msg):l.reject(Z.msg)})),l}function y(l){var d=l,m=d.mode;"emit"!==m&&"return"!==m||("emit"===m&&Z.emit(d.evName,d.msg),"return"===m&&Z.emit(d.id,d))}function I(l){Z.emit("error",l)}return G.onmessage=function(l){y(l.data)},G.onerror=I,i(Array.prototype.slice.call(arguments)),Z.stringify=W,Z.parse=u,Z.terminate=X,Z}var X,u,y={stringify:(u=c(W.mark((function l(){var d,m,c,b=arguments;return W.wrap((function(l){for(;;)switch(l.prev=l.next){case 0:return d=Array.prototype.slice.call(b),m=G(),l.next=4,m.stringify.apply(m,Z(d)).finally((function(){m.terminate()}));case 4:return c=l.sent,l.abrupt("return",c);case 6:case"end":return l.stop()}}),l)}))),function(){return u.apply(this,arguments)}),parse:(X=c(W.mark((function l(){var d,m,c,b=arguments;return W.wrap((function(l){for(;;)switch(l.prev=l.next){case 0:return d=Array.prototype.slice.call(b),m=G(),l.next=4,m.parse.apply(m,Z(d)).finally((function(){m.terminate()}));case 4:return c=l.sent,l.abrupt("return",c);case 6:case"end":return l.stop()}}),l)}))),function(){return X.apply(this,arguments)})};for(var I in i=l(),y){var p=y[I];i[I]=p}}(),i}()}));return"undefined"!=typeof window&&void 0!==window.document?G:b}));