@reearth/core 0.0.1 → 0.0.3
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.
package/dist/core.umd.cjs
CHANGED
|
@@ -6050,7 +6050,7 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho
|
|
|
6050
6050
|
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var d=!0,h=!1,p;return{s:function(){o=o.call(t)},n:function(){var y=o.next();return d=y.done,y},e:function(y){h=!0,p=y},f:function(){try{!d&&o.return!=null&&o.return()}finally{if(h)throw p}}}}var Xt=Object.prototype.hasOwnProperty;function qt(t,n){return t=t.slice(),t.push(n),t}function Xl(t,n){return n=n.slice(),n.unshift(t),n}var Xh=function(t){sh(n,t);function n(o){var s;return Hc(this,n),s=ch(this,n,['JSONPath should not be called with "new" (it prevents return of (unwrapped) scalar values)']),s.avoidNew=!0,s.value=o,s.name="NewError",s}return kc(n)}(Zl(Error));function D(t,n,o,s,c){if(!(this instanceof D))try{return new D(t,n,o,s,c)}catch(y){if(!y.avoidNew)throw y;return y.value}typeof t=="string"&&(c=s,s=o,o=n,n=t,t=null);var d=t&&Qt(t)==="object";if(t=t||{},this.json=t.json||o,this.path=t.path||n,this.resultType=t.resultType||"value",this.flatten=t.flatten||!1,this.wrap=Xt.call(t,"wrap")?t.wrap:!0,this.sandbox=t.sandbox||{},this.preventEval=t.preventEval||!1,this.parent=t.parent||null,this.parentProperty=t.parentProperty||null,this.callback=t.callback||s||null,this.otherTypeCallback=t.otherTypeCallback||c||function(){throw new TypeError("You must supply an otherTypeCallback callback option with the @other() operator.")},t.autostart!==!1){var h={path:d?t.path:n};d?"json"in t&&(h.json=t.json):h.json=o;var p=this.evaluate(h);if(!p||Qt(p)!=="object")throw new Xh(p);return p}}D.prototype.evaluate=function(t,n,o,s){var c=this,d=this.parent,h=this.parentProperty,p=this.flatten,y=this.wrap;if(this.currResultType=this.resultType,this.currPreventEval=this.preventEval,this.currSandbox=this.sandbox,o=o||this.callback,this.currOtherTypeCallback=s||this.otherTypeCallback,n=n||this.json,t=t||this.path,t&&Qt(t)==="object"&&!Array.isArray(t)){if(!t.path&&t.path!=="")throw new TypeError('You must supply a "path" property when providing an object argument to JSONPath.evaluate().');if(!Xt.call(t,"json"))throw new TypeError('You must supply a "json" property when providing an object argument to JSONPath.evaluate().');var E=t;n=E.json,p=Xt.call(t,"flatten")?t.flatten:p,this.currResultType=Xt.call(t,"resultType")?t.resultType:this.currResultType,this.currSandbox=Xt.call(t,"sandbox")?t.sandbox:this.currSandbox,y=Xt.call(t,"wrap")?t.wrap:y,this.currPreventEval=Xt.call(t,"preventEval")?t.preventEval:this.currPreventEval,o=Xt.call(t,"callback")?t.callback:o,this.currOtherTypeCallback=Xt.call(t,"otherTypeCallback")?t.otherTypeCallback:this.currOtherTypeCallback,d=Xt.call(t,"parent")?t.parent:d,h=Xt.call(t,"parentProperty")?t.parentProperty:h,t=t.path}if(d=d||null,h=h||null,Array.isArray(t)&&(t=D.toPathString(t)),!(!t&&t!==""||!n)){var L=D.toPathArray(t);L[0]==="$"&&L.length>1&&L.shift(),this._hasParentSelector=null;var F=this._trace(L,n,["$"],d,h,o).filter(function(N){return N&&!N.isParentSelector});return F.length?!y&&F.length===1&&!F[0].hasArrExpr?this._getPreferredOutput(F[0]):F.reduce(function(N,z){var Z=c._getPreferredOutput(z);return p&&Array.isArray(Z)?N=N.concat(Z):N.push(Z),N},[]):y?[]:void 0}},D.prototype._getPreferredOutput=function(t){var n=this.currResultType;switch(n){case"all":{var o=Array.isArray(t.path)?t.path:D.toPathArray(t.path);return t.pointer=D.toPointer(o),t.path=typeof t.path=="string"?t.path:D.toPathString(t.path),t}case"value":case"parent":case"parentProperty":return t[n];case"path":return D.toPathString(t[n]);case"pointer":return D.toPointer(t.path);default:throw new TypeError("Unknown result type")}},D.prototype._handleCallback=function(t,n,o){if(n){var s=this._getPreferredOutput(t);t.path=typeof t.path=="string"?t.path:D.toPathString(t.path),n(s,o,t)}},D.prototype._trace=function(t,n,o,s,c,d,h,p){var y=this,E;if(!t.length)return E={path:o,value:n,parent:s,parentProperty:c,hasArrExpr:h},this._handleCallback(E,d,"value"),E;var L=t[0],F=t.slice(1),N=[];function z(ef){Array.isArray(ef)?ef.forEach(function(yt){N.push(yt)}):N.push(ef)}if((typeof L!="string"||p)&&n&&Xt.call(n,L))z(this._trace(F,n[L],qt(o,L),n,L,d,h));else if(L==="*")this._walk(n,function(ef){z(y._trace(F,n[ef],qt(o,ef),n,ef,d,!0,!0))});else if(L==="..")z(this._trace(F,n,o,s,c,d,h)),this._walk(n,function(ef){Qt(n[ef])==="object"&&z(y._trace(t.slice(),n[ef],qt(o,ef),n,ef,d,!0))});else{if(L==="^")return this._hasParentSelector=!0,{path:o.slice(0,-1),expr:F,isParentSelector:!0};if(L==="~")return E={path:qt(o,L),value:c,parent:s,parentProperty:null},this._handleCallback(E,d,"property"),E;if(L==="$")z(this._trace(F,n,o,null,null,d,h));else if(/^(\x2D?[0-9]*):(\x2D?[0-9]*):?([0-9]*)$/.test(L))z(this._slice(L,F,n,o,s,c,d));else if(L.indexOf("?(")===0){if(this.currPreventEval)throw new Error("Eval [?(expr)] prevented in JSONPath expression.");var Z=L.replace(/^\?\(((?:[\0-\t\x0B\f\x0E-\u2027\u202A-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*?)\)$/,"$1"),H=/@(?:[\0-\t\x0B\f\x0E-\u2027\u202A-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])?((?:[\0->@-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)['\[](\??\((?:[\0-\t\x0B\f\x0E-\u2027\u202A-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*?\))(?!(?:[\0-\t\x0B\f\x0E-\u2027\u202A-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])\)\])['\]]/g.exec(Z);H?this._walk(n,function(ef){var yt=[H[2]],oe=H[1]?n[ef][H[1]]:n[ef],sl=y._trace(yt,oe,o,s,c,d,!0);sl.length>0&&z(y._trace(F,n[ef],qt(o,ef),n,ef,d,!0))}):this._walk(n,function(ef){y._eval(Z,n[ef],ef,o,s,c)&&z(y._trace(F,n[ef],qt(o,ef),n,ef,d,!0))})}else if(L[0]==="("){if(this.currPreventEval)throw new Error("Eval [(expr)] prevented in JSONPath expression.");z(this._trace(Xl(this._eval(L,n,o[o.length-1],o.slice(0,-1),s,c),F),n,o,s,c,d,h))}else if(L[0]==="@"){var nt=!1,lt=L.slice(1,-2);switch(lt){case"scalar":(!n||!["object","function"].includes(Qt(n)))&&(nt=!0);break;case"boolean":case"string":case"undefined":case"function":Qt(n)===lt&&(nt=!0);break;case"integer":Number.isFinite(n)&&!(n%1)&&(nt=!0);break;case"number":Number.isFinite(n)&&(nt=!0);break;case"nonFinite":typeof n=="number"&&!Number.isFinite(n)&&(nt=!0);break;case"object":n&&Qt(n)===lt&&(nt=!0);break;case"array":Array.isArray(n)&&(nt=!0);break;case"other":nt=this.currOtherTypeCallback(n,o,s,c);break;case"null":n===null&&(nt=!0);break;default:throw new TypeError("Unknown value type "+lt)}if(nt)return E={path:o,value:n,parent:s,parentProperty:c},this._handleCallback(E,d,"value"),E}else if(L[0]==="`"&&n&&Xt.call(n,L.slice(1))){var J=L.slice(1);z(this._trace(F,n[J],qt(o,J),n,J,d,h,!0))}else if(L.includes(",")){var mt=L.split(","),pi=Vh(mt),Ai;try{for(pi.s();!(Ai=pi.n()).done;){var md=Ai.value;z(this._trace(Xl(md,F),n,o,s,c,d,!0))}}catch(ef){pi.e(ef)}finally{pi.f()}}else!p&&n&&Xt.call(n,L)&&z(this._trace(F,n[L],qt(o,L),n,L,d,h,!0))}if(this._hasParentSelector)for(var Gd=0;Gd<N.length;Gd++){var Xd=N[Gd];if(Xd&&Xd.isParentSelector){var Vd=this._trace(Xd.expr,n,Xd.path,s,c,d,h);if(Array.isArray(Vd)){N[Gd]=Vd[0];for(var nf=Vd.length,rf=1;rf<nf;rf++)Gd++,N.splice(Gd,0,Vd[rf])}else N[Gd]=Vd}}return N},D.prototype._walk=function(t,n){if(Array.isArray(t))for(var o=t.length,s=0;s<o;s++)n(s);else t&&Qt(t)==="object"&&Object.keys(t).forEach(function(c){n(c)})},D.prototype._slice=function(t,n,o,s,c,d,h){if(Array.isArray(o)){var p=o.length,y=t.split(":"),E=y[2]&&Number.parseInt(y[2])||1,L=y[0]&&Number.parseInt(y[0])||0,F=y[1]&&Number.parseInt(y[1])||p;L=L<0?Math.max(0,L+p):Math.min(p,L),F=F<0?Math.max(0,F+p):Math.min(p,F);for(var N=[],z=L;z<F;z+=E){var Z=this._trace(Xl(z,n),o,s,c,d,h,!0);Z.forEach(function(H){N.push(H)})}return N}},D.prototype._eval=function(t,n,o,s,c,d){this.currSandbox._$_parentProperty=d,this.currSandbox._$_parent=c,this.currSandbox._$_property=o,this.currSandbox._$_root=this.json,this.currSandbox._$_v=n;var h=t.includes("@path");h&&(this.currSandbox._$_path=D.toPathString(s.concat([o])));var p="script:"+t;if(!D.cache[p]){var y=t.replace(/@parentProperty/g,"_$_parentProperty").replace(/@parent/g,"_$_parent").replace(/@property/g,"_$_property").replace(/@root/g,"_$_root").replace(/@([\t-\r \)\.\[\xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF])/g,"_$_v$1");h&&(y=y.replace(/@path/g,"_$_path")),D.cache[p]=new this.vm.Script(y)}try{return D.cache[p].runInNewContext(this.currSandbox)}catch(E){throw new Error("jsonPath: "+E.message+": "+t)}},D.cache={},D.toPathString=function(t){for(var n=t,o=n.length,s="$",c=1;c<o;c++)/^(~|\^|@(?:[\0-\t\x0B\f\x0E-\u2027\u202A-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*?\(\))$/.test(n[c])||(s+=/^[\*0-9]+$/.test(n[c])?"["+n[c]+"]":"['"+n[c]+"']");return s},D.toPointer=function(t){for(var n=t,o=n.length,s="",c=1;c<o;c++)/^(~|\^|@(?:[\0-\t\x0B\f\x0E-\u2027\u202A-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*?\(\))$/.test(n[c])||(s+="/"+n[c].toString().replace(/~/g,"~0").replace(/\//g,"~1"));return s},D.toPathArray=function(t){var n=D.cache;if(n[t])return n[t].concat();var o=[],s=t.replace(/@(?:null|boolean|number|string|integer|undefined|nonFinite|scalar|array|object|function|other)\(\)/g,";$&;").replace(/['\[](\??\((?:[\0-\t\x0B\f\x0E-\u2027\u202A-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*?\))['\]](?!(?:[\0-\t\x0B\f\x0E-\u2027\u202A-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])\])/g,function(d,h){return"[#"+(o.push(h)-1)+"]"}).replace(/\[["']((?:[\0-&\(-\\\^-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)["']\]/g,function(d,h){return"['"+h.replace(/\./g,"%@%").replace(/~/g,"%%@@%%")+"']"}).replace(/~/g,";~;").replace(/["']?\.["']?(?!(?:[\0-Z\\-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*\])|\[["']?/g,";").replace(/%@%/g,".").replace(/%%@@%%/g,"~").replace(/(?:;)?(\^+)(?:;)?/g,function(d,h){return";"+h.split("").join(";")+";"}).replace(/;;;|;;/g,";..;").replace(/;$|'?\]|'$/g,""),c=s.split(";").map(function(d){var h=d.match(/#([0-9]+)/);return!h||!h[1]?d:o[h[1]]});return n[t]=c,n[t].concat()};var Gh=function(t,n,o){for(var s=t.length,c=0;c<s;c++){var d=t[c];o(d)&&n.push(t.splice(c--,1)[0])}},ph=function(){function t(n){Hc(this,t),this.code=n}return kc(t,[{key:"runInNewContext",value:function(n){var o=this.code,s=Object.keys(n),c=[];Gh(s,c,function(E){return typeof n[E]=="function"});var d=s.map(function(E){return n[E]}),h=c.reduce(function(E,L){var F=n[L].toString();return/function/.test(F)||(F="function "+F),"var "+L+"="+F+";"+E},"");o=h+o,!/(["'])use strict\1/.test(o)&&!s.includes("arguments")&&(o="var arguments = undefined;"+o),o=o.replace(/;[\t-\r \xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF]*$/,"");var p=o.lastIndexOf(";"),y=p>-1?o.slice(0,p+1)+" return "+o.slice(p+1):" return "+o;return Mc(Function,s.concat([y])).apply(void 0,hh(d))}}]),t}();D.prototype.vm={Script:ph};const yh="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",Rh=t=>Array.from(window.crypto.getRandomValues(new Uint8Array(t))).map(n=>yh[n%t]).join("").toLowerCase(),Qc=t=>{if(typeof t!="object"||t===null)return t;for(const n in t)if(typeof t[n]=="string")try{t[n].startsWith("{")&&t[n].endsWith("}")&&(t[n]=JSON.parse(t[n]))}catch{console.error("Invalid JSON:",t[n])}else typeof t[n]=="object"&&(t[n]=Qc(t[n]));return t},vl="czm_";function Wh(t,n){let o=t,s="";const c=[];let d=o.indexOf("${");const h=typeof n<"u",p={},y=/^\$./;for(;d>=0;)if(fh(o,d)){const E=Sh(o,d);s+=o.slice(0,E+1),o=o.slice(E+1),d=o.indexOf("${")}else{s+=o.slice(0,d);const E=Lh(o,d),L=o.slice(d+2,E);if(y.test(L)){if(!h)return[s,[]];let F=p[L];if(!F)try{F=D({json:n,path:L}),p[L]=F}catch{return[s,[]]}if(F.length!==0){const N=Rh(10);c.push({literalName:N,literalValue:F[0]}),s+=N}else return["false",[]]}else{const F=Fh(L);s+=`${vl}${F}`}o=o.slice(E+1),d=o.indexOf("${")}return s+=o,[s,c]}function fh(t,n){const o=t.indexOf("'"),s=t.indexOf('"');return o>=0&&o<n?t.indexOf("'",o+1)>=n:s>=0&&s<n?t.indexOf('"',s+1)>=n:!1}function Sh(t,n){const o=t.indexOf("'"),s=t.indexOf('"');return o>=0&&o<n?t.indexOf("'",o+1):s>=0&&s<n?t.indexOf('"',s+1):-1}function Lh(t,n){const o=t.indexOf("}",n);if(o<0)throw new Error("replaceVariable: Unmatched {.");return o}const se=t=>`$reearth_${t}_$`,Gl={"[":se("opened_square_bracket"),"]":se("closed_square_bracket"),"{":se("opened_curly_bracket"),"}":se("closed_curly_bracket"),"(":se("opened_parentheses"),")":se("closed_parentheses"),"-":se("hyphen")},Fh=t=>{const n=t.replace(/-/g,Gl["-"]);return/(\]|\)|\})[^[.]+$/.test(n)?Object.entries(Gl).reduce((o,[s,c])=>o.replaceAll(s,c),n):n},Ih=t=>Object.entries(Gl).reduce((n,[o,s])=>n.replaceAll(s,o),t),xh=new Set(E0),kn=new Set(P0);function O(t,n){let o=new Error("failed to parse");const s=n.type;if(s==="Literal")o=Th(n);else if(s==="CallExpression")o=Yh(t,n);else if(s==="Identifier")o=Jh(n);else if(s==="UnaryExpression"){const c=n.operator,d=O(t,n.argument);if(xh.has(c))o=new w(M.UNARY,c,d);else throw new Error(`Unexpected operator "${c}".`)}else if(s==="BinaryExpression"){const c=n.operator,d=O(t,n.left),h=O(t,n.right);if(kn.has(c))o=new w(M.BINARY,c,d,h);else throw new Error(`Unexpected operator "${c}".`)}else if(s==="LogicalExpression"){const c=n.operator,d=O(t,n.left),h=O(t,n.right);kn.has(c)&&(o=new w(M.BINARY,c,d,h))}else if(s==="ConditionalExpression"){const c=O(t,n.test),d=O(t,n.consequent),h=O(t,n.alternate);o=new w(M.CONDITIONAL,"?",d,h,c)}else if(s==="MemberExpression")o=gh(t,n);else if(s==="ArrayExpression"){const c=[];for(let d=0;d<n.elements.length;d++)c[d]=O(t,n.elements[d]);o=new w(M.ARRAY,c)}else throw s==="Compound"?new Error("Provide exactly one expression."):new Error("Cannot parse expression.");return o}function Th(t){const n=typeof t.value;if(t.value===null)return new w(M.LITERAL_NULL,null);if(n==="boolean")return new w(M.LITERAL_BOOLEAN,t.value);if(n==="number")return new w(M.LITERAL_NUMBER,t.value);if(n==="string")return t.value.indexOf("${")>=0?new w(M.VARIABLE_IN_STRING,t.value):new w(M.LITERAL_STRING,Uh(t.value));throw new Error(`${t} is not a function.`)}function Uh(t){return t.replace(B0,"\\")}function Yh(t,n){const o=n.arguments,s=o.length;if(n.callee.type==="MemberExpression"){const d=n.callee.property.name,h=n.callee.object;if(d==="test"||d==="exec"){if(h.callee.name!=="regExp")throw new Error(`${d} is not a function.`);if(s===0)return d==="test"?new w(M.LITERAL_BOOLEAN,!1):new w(M.LITERAL_NULL,null);const p=O(t,h),y=O(t,o[0]);return new w(M.FUNCTION_CALL,d,p,y)}else if(d==="toString"){const p=O(t,h);return new w(M.FUNCTION_CALL,d,p)}throw new Error(`Unexpected function call "${d}".`)}const c=n.callee.name;if(c==="color"){if(s===0)return new w(M.LITERAL_COLOR,c);const d=O(t,o[0]);if(typeof o[1]<"u"){const h=O(t,o[1]);return new w(M.LITERAL_COLOR,c,[d,h])}return new w(M.LITERAL_COLOR,c,[d])}else if(c==="rgb"||c==="hsl"){if(s<3)throw new Error(`${c} requires three arguments.`);const d=[O(t,o[0]),O(t,o[1]),O(t,o[2])];return new w(M.LITERAL_COLOR,c,d)}else if(c==="rgba"||c==="hsla"){if(s<4)throw new Error(`${c} requires four arguments.`);const d=[O(t,o[0]),O(t,o[1]),O(t,o[2]),O(t,o[3])];return new w(M.LITERAL_COLOR,c,d)}else if(c==="isNaN"||c==="isFinite"){if(s===0)return c==="isNaN"?new w(M.LITERAL_BOOLEAN,!0):new w(M.LITERAL_BOOLEAN,!1);const d=O(t,o[0]);return new w(M.UNARY,c,d)}else if(typeof Pl[c]<"u"){if(s!==1)throw new Error(`${c} requires exactly one argument.`);const d=O(t,o[0]);return new w(M.UNARY,c,d)}else if(typeof El[c]<"u"){if(s!==2)throw new Error(`${c} requires exactly two arguments.`);const d=O(t,o[0]),h=O(t,o[1]);return new w(M.BINARY,c,d,h)}else if(c==="Boolean"){if(s===0)return new w(M.LITERAL_BOOLEAN,!1);const d=O(t,o[0]);return new w(M.UNARY,c,d)}else if(c==="Number"){if(s===0)return new w(M.LITERAL_NUMBER,0);const d=O(t,o[0]);return new w(M.UNARY,c,d)}else if(c==="String"){if(s===0)return new w(M.LITERAL_STRING,"");const d=O(t,o[0]);return new w(M.UNARY,c,d)}throw new Error(`Unexpected function call "${c}".`)}function Jh(t){const n=t.name;if(Nh(n)){const o=Mh(n);return o.substring(0,8)==="tiles3d_"?new w(M.BUILTIN_VARIABLE,o):new w(M.VARIABLE,o)}else{if(n==="NaN")return new w(M.LITERAL_NUMBER,NaN);if(n==="Infinity")return new w(M.LITERAL_NUMBER,1/0);if(n==="undefined")return new w(M.LITERAL_UNDEFINED,void 0)}throw new Error(`${n} is not defined.`)}function Ch(t){const n=t.property.name;if(n==="PI")return new w(M.LITERAL_NUMBER,Math.PI);if(n==="E")return new w(M.LITERAL_NUMBER,Math.E);throw new Error(`${n} Math Constant is not supported at the moment`)}function Kh(t){const n=t.property.name;if(n==="POSITIVE_INFINITY")return new w(M.LITERAL_NUMBER,Number.POSITIVE_INFINITY);throw new Error(`${n} Number Constant is not supported at the moment`)}function gh(t,n){if(n.object.name==="Math")return Ch(n);if(n.object.name==="Number")return Kh(n);let o;const s=O(t,n.object);return n.computed?(o=O(t,n.property),new w(M.MEMBER,"brackets",s,o)):(o=new w(M.LITERAL_STRING,n.property.name),new w(M.MEMBER,"dot",s,o))}function Nh(t){return t.substring(0,4)===vl}function Mh(t){return Ih(t).substring(4)}const zn=new Map,Qn=new Map,En=new Map,Pn=new Map;class Ki{constructor(n,o,s){Y(this,"_runtimeAst"),Y(this,"_feature");var c;this._feature=o;let d=[];n=Hh(n,s);const h=Qn.get(n);if(h)[n,d]=h;else{const y=n;[n,d]=Wh(kh(n),(c=this._feature)==null?void 0:c.properties),n.includes(vl)&&Qn.set(y,[n,d])}const p=zn.get(n);if(p)this._runtimeAst=p;else{if(d.length!==0)for(const E of d)le.addLiteral(E.literalName,E.literalValue);le.addBinaryOp("=~",0),le.addBinaryOp("!~",0);let y;try{y=le(n)}catch(E){throw new Error(`failed to generate ast: ${E}`)}this._runtimeAst=O(this,y),zn.set(n,this._runtimeAst)}}evaluate(){return this._runtimeAst.evaluate(this._feature)}}function Hh(t,n){if(typeof n>"u")return t;const o=JSON.stringify(Object.entries(n).sort()),s=t+o,c=Pn.get(s);if(c)return c;let d=En.get(t);d||(d=new RegExp(`\\$\\{(${Object.keys(n).join("|")})\\}`,"g"),En.set(t,d));const h=t.replace(d,(p,y)=>typeof n[y]<"u"?`(${n[y]})`:"");return Pn.set(s,h),h}function kh(t){return t.replace(w0,v0)}class zh{constructor(n,o,s){Y(this,"_conditions"),Y(this,"_runtimeConditions"),Y(this,"_feature"),Y(this,"_memoizedResult"),this._conditions=n.conditions,this._runtimeConditions=[],this._feature=o,this._memoizedResult=void 0,this.setRuntime(s)}setRuntime(n){var o;const s=(o=this._conditions)==null?void 0:o.map(c=>{const d=String(c[0]),h=String(c[1]);return new Qh(new Ki(d,this._feature,n),new Ki(h,this._feature,n))});this._runtimeConditions=s??[],this._memoizedResult=void 0}evaluate(){if(typeof this._memoizedResult<"u")return this._memoizedResult;const n=this._runtimeConditions,o=n.length;for(let c=0;c<o;c++){const d=n[c];if(d.condition.evaluate()){const h=d.expression.evaluate();return this._memoizedResult=h,h}}const s=void 0;return this._memoizedResult=s,s}}class Qh{constructor(n,o){Y(this,"condition"),Y(this,"expression"),this.condition=n,this.expression=o}}const Eh=(t,n,o)=>{const s=Yr(t,Q0),c=jh(t,n);return{...c,...Ph(s,t,c),type:"computedFeature",interval:o}};function Ph(t,n,o){if(!o){if(!n.id)throw new Error("layer id is required");o={type:"feature",id:n.id,properties:n.properties||{}}}return Object.fromEntries(Object.entries(t).map(([s,c])=>c?[s,Ec(c,n,o)]:void 0).filter(s=>!!s))}function Ec(t,n,o){return Object.fromEntries(Object.entries(t).map(([s,c])=>vh$1(c)?[s,Ec(c,n,o)]:[s,Bh(c,n,o)]))}function wh(t){return typeof t=="object"&&t&&"expression"in t}function vh$1(t){return typeof t=="object"&&t&&!("expression"in t)&&!Array.isArray(t)}function Bh(t,n,o){try{if(wh(t)){const s=t.expression,c=Qc(Bu(o));return typeof s>"u"?void 0:typeof s=="object"&&s.conditions?new zh(s,c,n.defines).evaluate():typeof s=="boolean"||typeof s=="number"?new Ki(String(s),c,n.defines).evaluate():typeof s=="string"?new Ki(s,c,n.defines).evaluate():s}return t}catch(s){console.error(s);return}}function jh(t,n){var o;const s=(o=t.data)==null?void 0:o.jsonProperties;if(!n.properties||!s||!s.length)return n;const c={...n,...n!=null&&n.properties?{properties:{...n.properties}}:{}};return s.forEach(d=>{c.properties[d]=(()=>{const h=c.properties[d];try{return JSON.parse(h)}catch{return h}})()}),c}function Ri(t,n){if(t.type==="simple")return Eh(t,n)}const Oh=(t,n,o)=>{if(!o)return;const s=(()=>{switch(re.types[t.type]){case"Polygon":return"polygon";case"LineString":return"polyline";case"Point":return"marker";default:return}})();if(!s)return;const c=t.id?String(t.id):Dh(t.loadGeometry(),n),d=Ri(o,Ah(c,t,n,s)),h=new Cesium$1.ImageryLayerFeatureInfo;return h.data={layerId:o==null?void 0:o.id,featureId:c,feature:d,appearanceType:re.types[t.type].toLowerCase()},h},Dh=(t,n)=>{const o=[n.x,n.y,n.level,...t.flatMap(s=>s.map(c=>[c.x,c.y]))].join(":");return k0(o)},Ah=(t,n,o,s)=>{const c=n.loadGeometry(),[d,h]=(()=>{if(s==="polygon")return["Polygon",c.map(p=>p.map(y=>[y.x,y.y]))];if(s==="polyline")return["LineString",c[0].map(p=>[p.x,p.y])];if(s==="marker")return["Point",[c[0][0].x,c[0][0].y]];throw new Error(`Unexpected appearance ${s}`)})();return{type:"feature",id:t,geometry:{type:d,coordinates:h},properties:n.properties,range:{x:o.x,y:o.y,z:o.level}}},Le=typeof performance=="object"&&performance&&typeof performance.now=="function"?performance:Date,Pc=new Set,pl=typeof process=="object"&&process?process:{},wc=(t,n,o,s)=>{typeof pl.emitWarning=="function"?pl.emitWarning(t,n,o,s):console.error(`[${o}] ${n}: ${t}`)};let gi=globalThis.AbortController,wn=globalThis.AbortSignal;var cc;if(typeof gi>"u"){wn=class{constructor(){Y(this,"onabort"),Y(this,"_onabort",[]),Y(this,"reason"),Y(this,"aborted",!1)}addEventListener(o,s){this._onabort.push(s)}},gi=class{constructor(){Y(this,"signal",new wn),n()}abort(o){var s,c;if(!this.signal.aborted){this.signal.reason=o,this.signal.aborted=!0;for(const d of this.signal._onabort)d(o);(c=(s=this.signal).onabort)==null||c.call(s,o)}}};let t=((cc=pl.env)==null?void 0:cc.LRU_CACHE_IGNORE_AC_WARNING)!=="1";const n=()=>{t&&(t=!1,wc("AbortController is not defined. If using lru-cache in node 14, load an AbortController polyfill from the `node-abort-controller` package. A minimal polyfill is provided for use by LRUCache.fetch(), but it should not be relied upon in other contexts (eg, passing it to other APIs that use AbortController/AbortSignal might have undesirable effects). You may disable this with LRU_CACHE_IGNORE_AC_WARNING=1 in the env.","NO_ABORT_CONTROLLER","ENOTSUP",n))}}const _h=t=>!Pc.has(t),$t=t=>t&&t===Math.floor(t)&&t>0&&isFinite(t),vc=t=>$t(t)?t<=Math.pow(2,8)?Uint8Array:t<=Math.pow(2,16)?Uint16Array:t<=Math.pow(2,32)?Uint32Array:t<=Number.MAX_SAFE_INTEGER?Wi:null:null;class Wi extends Array{constructor(n){super(n),this.fill(0)}}var Te;const Fe=class{constructor(t,n){if(Y(this,"heap"),Y(this,"length"),!r(Fe,Te))throw new TypeError("instantiate Stack using Stack.create(n)");this.heap=new n(t),this.length=0}static create(t){const n=vc(t);if(!n)return[];k(Fe,Te,!0);const o=new Fe(t,n);return k(Fe,Te,!1),o}push(t){this.heap[this.length++]=t}pop(){return this.heap[--this.length]}};let fi=Fe;Te=new WeakMap,P(fi,Te,!1);var Ut,Rt,Yt,Jt,Ue,ot,Ct,ct,tt,Q,Zt,Wt,bt,at,Kt,ut,gt,Nt,ft,Mt,ie,Vt,ei,Rl,he,vt,ii,St,Hi,Bc,be,Ye,li,kt,te,zt,ee,ni,Wl,km,Je,Si,Ce,Li,_,$,ci,fl,me,je;const ql=class{constructor(t){P(this,ei),P(this,Hi),P(this,kt),P(this,zt),P(this,ni),P(this,Je),P(this,Ce),P(this,_),P(this,ci),P(this,me),P(this,Ut,void 0),P(this,Rt,void 0),P(this,Yt,void 0),P(this,Jt,void 0),P(this,Ue,void 0),Y(this,"ttl"),Y(this,"ttlResolution"),Y(this,"ttlAutopurge"),Y(this,"updateAgeOnGet"),Y(this,"updateAgeOnHas"),Y(this,"allowStale"),Y(this,"noDisposeOnSet"),Y(this,"noUpdateTTL"),Y(this,"maxEntrySize"),Y(this,"sizeCalculation"),Y(this,"noDeleteOnFetchRejection"),Y(this,"noDeleteOnStaleGet"),Y(this,"allowStaleOnFetchAbort"),Y(this,"allowStaleOnFetchRejection"),Y(this,"ignoreFetchAbort"),P(this,ot,void 0),P(this,Ct,void 0),P(this,ct,void 0),P(this,tt,void 0),P(this,Q,void 0),P(this,Zt,void 0),P(this,Wt,void 0),P(this,bt,void 0),P(this,at,void 0),P(this,Kt,void 0),P(this,ut,void 0),P(this,gt,void 0),P(this,Nt,void 0),P(this,ft,void 0),P(this,Mt,void 0),P(this,ie,void 0),P(this,Vt,void 0),P(this,he,()=>{}),P(this,vt,()=>{}),P(this,ii,()=>{}),P(this,St,()=>!1),P(this,be,md=>{}),P(this,Ye,(md,Gd,Xd)=>{}),P(this,li,(md,Gd,Xd,Vd)=>{if(Xd||Vd)throw new TypeError("cannot set size without setting maxSize or maxEntrySize on cache");return 0}),Y(this,km,"LRUCache");const{max:n=0,ttl:o,ttlResolution:s=1,ttlAutopurge:c,updateAgeOnGet:d,updateAgeOnHas:h,allowStale:p,dispose:y,disposeAfter:E,noDisposeOnSet:L,noUpdateTTL:F,maxSize:N=0,maxEntrySize:z=0,sizeCalculation:Z,fetchMethod:H,noDeleteOnFetchRejection:nt,noDeleteOnStaleGet:lt,allowStaleOnFetchRejection:J,allowStaleOnFetchAbort:mt,ignoreFetchAbort:pi}=t;if(n!==0&&!$t(n))throw new TypeError("max option must be a nonnegative integer");const Ai=n?vc(n):Array;if(!Ai)throw new Error("invalid max value: "+n);if(k(this,Ut,n),k(this,Rt,N),this.maxEntrySize=z||r(this,Rt),this.sizeCalculation=Z,this.sizeCalculation){if(!r(this,Rt)&&!this.maxEntrySize)throw new TypeError("cannot set sizeCalculation without setting maxSize or maxEntrySize");if(typeof this.sizeCalculation!="function")throw new TypeError("sizeCalculation set to non-function")}if(H!==void 0&&typeof H!="function")throw new TypeError("fetchMethod must be a function if specified");if(k(this,Ue,H),k(this,ie,!!H),k(this,ct,new Map),k(this,tt,new Array(n).fill(void 0)),k(this,Q,new Array(n).fill(void 0)),k(this,Zt,new Ai(n)),k(this,Wt,new Ai(n)),k(this,bt,0),k(this,at,0),k(this,Kt,fi.create(n)),k(this,ot,0),k(this,Ct,0),typeof y=="function"&&k(this,Yt,y),typeof E=="function"?(k(this,Jt,E),k(this,ut,[])):(k(this,Jt,void 0),k(this,ut,void 0)),k(this,Mt,!!r(this,Yt)),k(this,Vt,!!r(this,Jt)),this.noDisposeOnSet=!!L,this.noUpdateTTL=!!F,this.noDeleteOnFetchRejection=!!nt,this.allowStaleOnFetchRejection=!!J,this.allowStaleOnFetchAbort=!!mt,this.ignoreFetchAbort=!!pi,this.maxEntrySize!==0){if(r(this,Rt)!==0&&!$t(r(this,Rt)))throw new TypeError("maxSize must be a positive integer if specified");if(!$t(this.maxEntrySize))throw new TypeError("maxEntrySize must be a positive integer if specified");K(this,Hi,Bc).call(this)}if(this.allowStale=!!p,this.noDeleteOnStaleGet=!!lt,this.updateAgeOnGet=!!d,this.updateAgeOnHas=!!h,this.ttlResolution=$t(s)||s===0?s:1,this.ttlAutopurge=!!c,this.ttl=o||0,this.ttl){if(!$t(this.ttl))throw new TypeError("ttl must be a positive integer if specified");K(this,ei,Rl).call(this)}if(r(this,Ut)===0&&this.ttl===0&&r(this,Rt)===0)throw new TypeError("At least one of max, maxSize, or ttl is required");if(!this.ttlAutopurge&&!r(this,Ut)&&!r(this,Rt)){const md="LRU_CACHE_UNBOUNDED";_h(md)&&(Pc.add(md),wc("TTL caching without ttlAutopurge, max, or maxSize can result in unbounded memory consumption.","UnboundedCacheWarning",md,ql))}}static unsafeExposeInternals(t){return{starts:r(t,Nt),ttls:r(t,ft),sizes:r(t,gt),keyMap:r(t,ct),keyList:r(t,tt),valList:r(t,Q),next:r(t,Zt),prev:r(t,Wt),get head(){return r(t,bt)},get tail(){return r(t,at)},free:r(t,Kt),isBackgroundFetch:n=>{var o;return K(o=t,_,$).call(o,n)},backgroundFetch:(n,o,s,c)=>{var d;return K(d=t,Ce,Li).call(d,n,o,s,c)},moveToTail:n=>{var o;return K(o=t,me,je).call(o,n)},indexes:n=>{var o;return K(o=t,kt,te).call(o,n)},rindexes:n=>{var o;return K(o=t,zt,ee).call(o,n)},isStale:n=>{var o;return r(o=t,St).call(o,n)}}}get max(){return r(this,Ut)}get maxSize(){return r(this,Rt)}get calculatedSize(){return r(this,Ct)}get size(){return r(this,ot)}get fetchMethod(){return r(this,Ue)}get dispose(){return r(this,Yt)}get disposeAfter(){return r(this,Jt)}getRemainingTTL(t){return r(this,ct).has(t)?1/0:0}*entries(){for(const t of K(this,kt,te).call(this))r(this,Q)[t]!==void 0&&r(this,tt)[t]!==void 0&&!K(this,_,$).call(this,r(this,Q)[t])&&(yield[r(this,tt)[t],r(this,Q)[t]])}*rentries(){for(const t of K(this,zt,ee).call(this))r(this,Q)[t]!==void 0&&r(this,tt)[t]!==void 0&&!K(this,_,$).call(this,r(this,Q)[t])&&(yield[r(this,tt)[t],r(this,Q)[t]])}*keys(){for(const t of K(this,kt,te).call(this)){const n=r(this,tt)[t];n!==void 0&&!K(this,_,$).call(this,r(this,Q)[t])&&(yield n)}}*rkeys(){for(const t of K(this,zt,ee).call(this)){const n=r(this,tt)[t];n!==void 0&&!K(this,_,$).call(this,r(this,Q)[t])&&(yield n)}}*values(){for(const t of K(this,kt,te).call(this))r(this,Q)[t]!==void 0&&!K(this,_,$).call(this,r(this,Q)[t])&&(yield r(this,Q)[t])}*rvalues(){for(const t of K(this,zt,ee).call(this))r(this,Q)[t]!==void 0&&!K(this,_,$).call(this,r(this,Q)[t])&&(yield r(this,Q)[t])}[Symbol.iterator](){return this.entries()}find(t,n={}){for(const o of K(this,kt,te).call(this)){const s=r(this,Q)[o],c=K(this,_,$).call(this,s)?s.__staleWhileFetching:s;if(c!==void 0&&t(c,r(this,tt)[o],this))return this.get(r(this,tt)[o],n)}}forEach(t,n=this){for(const o of K(this,kt,te).call(this)){const s=r(this,Q)[o],c=K(this,_,$).call(this,s)?s.__staleWhileFetching:s;c!==void 0&&t.call(n,c,r(this,tt)[o],this)}}rforEach(t,n=this){for(const o of K(this,zt,ee).call(this)){const s=r(this,Q)[o],c=K(this,_,$).call(this,s)?s.__staleWhileFetching:s;c!==void 0&&t.call(n,c,r(this,tt)[o],this)}}purgeStale(){let t=!1;for(const n of K(this,zt,ee).call(this,{allowStale:!0}))r(this,St).call(this,n)&&(this.delete(r(this,tt)[n]),t=!0);return t}info(t){const n=r(this,ct).get(t);if(n===void 0)return;const o=r(this,Q)[n],s=K(this,_,$).call(this,o)?o.__staleWhileFetching:o;if(s===void 0)return;const c={value:s};if(r(this,ft)&&r(this,Nt)){const d=r(this,ft)[n],h=r(this,Nt)[n];if(d&&h){const p=d-(Le.now()-h);c.ttl=p,c.start=Date.now()}}return r(this,gt)&&(c.size=r(this,gt)[n]),c}dump(){const t=[];for(const n of K(this,kt,te).call(this,{allowStale:!0})){const o=r(this,tt)[n],s=r(this,Q)[n],c=K(this,_,$).call(this,s)?s.__staleWhileFetching:s;if(c===void 0||o===void 0)continue;const d={value:c};if(r(this,ft)&&r(this,Nt)){d.ttl=r(this,ft)[n];const h=Le.now()-r(this,Nt)[n];d.start=Math.floor(Date.now()-h)}r(this,gt)&&(d.size=r(this,gt)[n]),t.unshift([o,d])}return t}load(t){this.clear();for(const[n,o]of t){if(o.start){const s=Date.now()-o.start;o.start=Le.now()-s}this.set(n,o.value,o)}}set(t,n,o={}){var s,c,d,h,p;if(n===void 0)return this.delete(t),this;const{ttl:y=this.ttl,start:E,noDisposeOnSet:L=this.noDisposeOnSet,sizeCalculation:F=this.sizeCalculation,status:N}=o;let{noUpdateTTL:z=this.noUpdateTTL}=o;const Z=r(this,li).call(this,t,n,o.size||0,F);if(this.maxEntrySize&&Z>this.maxEntrySize)return N&&(N.set="miss",N.maxEntrySizeExceeded=!0),this.delete(t),this;let H=r(this,ot)===0?void 0:r(this,ct).get(t);if(H===void 0)H=r(this,ot)===0?r(this,at):r(this,Kt).length!==0?r(this,Kt).pop():r(this,ot)===r(this,Ut)?K(this,Je,Si).call(this,!1):r(this,ot),r(this,tt)[H]=t,r(this,Q)[H]=n,r(this,ct).set(t,H),r(this,Zt)[r(this,at)]=H,r(this,Wt)[H]=r(this,at),k(this,at,H),ri(this,ot)._++,r(this,Ye).call(this,H,Z,N),N&&(N.set="add"),z=!1;else{K(this,me,je).call(this,H);const nt=r(this,Q)[H];if(n!==nt){if(r(this,ie)&&K(this,_,$).call(this,nt)){nt.__abortController.abort(new Error("replaced"));const{__staleWhileFetching:lt}=nt;lt!==void 0&&!L&&(r(this,Mt)&&((s=r(this,Yt))==null||s.call(this,lt,t,"set")),r(this,Vt)&&((c=r(this,ut))==null||c.push([lt,t,"set"])))}else L||(r(this,Mt)&&((d=r(this,Yt))==null||d.call(this,nt,t,"set")),r(this,Vt)&&((h=r(this,ut))==null||h.push([nt,t,"set"])));if(r(this,be).call(this,H),r(this,Ye).call(this,H,Z,N),r(this,Q)[H]=n,N){N.set="replace";const lt=nt&&K(this,_,$).call(this,nt)?nt.__staleWhileFetching:nt;lt!==void 0&&(N.oldValue=lt)}}else N&&(N.set="update")}if(y!==0&&!r(this,ft)&&K(this,ei,Rl).call(this),r(this,ft)&&(z||r(this,ii).call(this,H,y,E),N&&r(this,vt).call(this,N,H)),!L&&r(this,Vt)&&r(this,ut)){const nt=r(this,ut);let lt;for(;lt=nt==null?void 0:nt.shift();)(p=r(this,Jt))==null||p.call(this,...lt)}return this}pop(){var t;try{for(;r(this,ot);){const n=r(this,Q)[r(this,bt)];if(K(this,Je,Si).call(this,!0),K(this,_,$).call(this,n)){if(n.__staleWhileFetching)return n.__staleWhileFetching}else if(n!==void 0)return n}}finally{if(r(this,Vt)&&r(this,ut)){const n=r(this,ut);let o;for(;o=n==null?void 0:n.shift();)(t=r(this,Jt))==null||t.call(this,...o)}}}has(t,n={}){const{updateAgeOnHas:o=this.updateAgeOnHas,status:s}=n,c=r(this,ct).get(t);if(c!==void 0){const d=r(this,Q)[c];if(K(this,_,$).call(this,d)&&d.__staleWhileFetching===void 0)return!1;if(r(this,St).call(this,c))s&&(s.has="stale",r(this,vt).call(this,s,c));else return o&&r(this,he).call(this,c),s&&(s.has="hit",r(this,vt).call(this,s,c)),!0}else s&&(s.has="miss");return!1}peek(t,n={}){const{allowStale:o=this.allowStale}=n,s=r(this,ct).get(t);if(s===void 0||!o&&r(this,St).call(this,s))return;const c=r(this,Q)[s];return K(this,_,$).call(this,c)?c.__staleWhileFetching:c}async fetch(t,n={}){const{allowStale:o=this.allowStale,updateAgeOnGet:s=this.updateAgeOnGet,noDeleteOnStaleGet:c=this.noDeleteOnStaleGet,ttl:d=this.ttl,noDisposeOnSet:h=this.noDisposeOnSet,size:p=0,sizeCalculation:y=this.sizeCalculation,noUpdateTTL:E=this.noUpdateTTL,noDeleteOnFetchRejection:L=this.noDeleteOnFetchRejection,allowStaleOnFetchRejection:F=this.allowStaleOnFetchRejection,ignoreFetchAbort:N=this.ignoreFetchAbort,allowStaleOnFetchAbort:z=this.allowStaleOnFetchAbort,context:Z,forceRefresh:H=!1,status:nt,signal:lt}=n;if(!r(this,ie))return nt&&(nt.fetch="get"),this.get(t,{allowStale:o,updateAgeOnGet:s,noDeleteOnStaleGet:c,status:nt});const J={allowStale:o,updateAgeOnGet:s,noDeleteOnStaleGet:c,ttl:d,noDisposeOnSet:h,size:p,sizeCalculation:y,noUpdateTTL:E,noDeleteOnFetchRejection:L,allowStaleOnFetchRejection:F,allowStaleOnFetchAbort:z,ignoreFetchAbort:N,status:nt,signal:lt};let mt=r(this,ct).get(t);if(mt===void 0){nt&&(nt.fetch="miss");const pi=K(this,Ce,Li).call(this,t,mt,J,Z);return pi.__returned=pi}else{const pi=r(this,Q)[mt];if(K(this,_,$).call(this,pi)){const Xd=o&&pi.__staleWhileFetching!==void 0;return nt&&(nt.fetch="inflight",Xd&&(nt.returnedStale=!0)),Xd?pi.__staleWhileFetching:pi.__returned=pi}const Ai=r(this,St).call(this,mt);if(!H&&!Ai)return nt&&(nt.fetch="hit"),K(this,me,je).call(this,mt),s&&r(this,he).call(this,mt),nt&&r(this,vt).call(this,nt,mt),pi;const md=K(this,Ce,Li).call(this,t,mt,J,Z),Gd=md.__staleWhileFetching!==void 0&&o;return nt&&(nt.fetch=Ai?"stale":"refresh",Gd&&Ai&&(nt.returnedStale=!0)),Gd?md.__staleWhileFetching:md.__returned=md}}get(t,n={}){const{allowStale:o=this.allowStale,updateAgeOnGet:s=this.updateAgeOnGet,noDeleteOnStaleGet:c=this.noDeleteOnStaleGet,status:d}=n,h=r(this,ct).get(t);if(h!==void 0){const p=r(this,Q)[h],y=K(this,_,$).call(this,p);return d&&r(this,vt).call(this,d,h),r(this,St).call(this,h)?(d&&(d.get="stale"),y?(d&&o&&p.__staleWhileFetching!==void 0&&(d.returnedStale=!0),o?p.__staleWhileFetching:void 0):(c||this.delete(t),d&&o&&(d.returnedStale=!0),o?p:void 0)):(d&&(d.get="hit"),y?p.__staleWhileFetching:(K(this,me,je).call(this,h),s&&r(this,he).call(this,h),p))}else d&&(d.get="miss")}delete(t){var n,o,s,c;let d=!1;if(r(this,ot)!==0){const h=r(this,ct).get(t);if(h!==void 0)if(d=!0,r(this,ot)===1)this.clear();else{r(this,be).call(this,h);const p=r(this,Q)[h];if(K(this,_,$).call(this,p)?p.__abortController.abort(new Error("deleted")):(r(this,Mt)||r(this,Vt))&&(r(this,Mt)&&((n=r(this,Yt))==null||n.call(this,p,t,"delete")),r(this,Vt)&&((o=r(this,ut))==null||o.push([p,t,"delete"]))),r(this,ct).delete(t),r(this,tt)[h]=void 0,r(this,Q)[h]=void 0,h===r(this,at))k(this,at,r(this,Wt)[h]);else if(h===r(this,bt))k(this,bt,r(this,Zt)[h]);else{const y=r(this,Wt)[h];r(this,Zt)[y]=r(this,Zt)[h];const E=r(this,Zt)[h];r(this,Wt)[E]=r(this,Wt)[h]}ri(this,ot)._--,r(this,Kt).push(h)}}if(r(this,Vt)&&(s=r(this,ut))!=null&&s.length){const h=r(this,ut);let p;for(;p=h==null?void 0:h.shift();)(c=r(this,Jt))==null||c.call(this,...p)}return d}clear(){var t,n,o;for(const s of K(this,zt,ee).call(this,{allowStale:!0})){const c=r(this,Q)[s];if(K(this,_,$).call(this,c))c.__abortController.abort(new Error("deleted"));else{const d=r(this,tt)[s];r(this,Mt)&&((t=r(this,Yt))==null||t.call(this,c,d,"delete")),r(this,Vt)&&((n=r(this,ut))==null||n.push([c,d,"delete"]))}}if(r(this,ct).clear(),r(this,Q).fill(void 0),r(this,tt).fill(void 0),r(this,ft)&&r(this,Nt)&&(r(this,ft).fill(0),r(this,Nt).fill(0)),r(this,gt)&&r(this,gt).fill(0),k(this,bt,0),k(this,at,0),r(this,Kt).length=0,k(this,Ct,0),k(this,ot,0),r(this,Vt)&&r(this,ut)){const s=r(this,ut);let c;for(;c=s==null?void 0:s.shift();)(o=r(this,Jt))==null||o.call(this,...c)}}};let yl=ql;km=Symbol.toStringTag,Ut=new WeakMap,Rt=new WeakMap,Yt=new WeakMap,Jt=new WeakMap,Ue=new WeakMap,ot=new WeakMap,Ct=new WeakMap,ct=new WeakMap,tt=new WeakMap,Q=new WeakMap,Zt=new WeakMap,Wt=new WeakMap,bt=new WeakMap,at=new WeakMap,Kt=new WeakMap,ut=new WeakMap,gt=new WeakMap,Nt=new WeakMap,ft=new WeakMap,Mt=new WeakMap,ie=new WeakMap,Vt=new WeakMap,ei=new WeakSet,Rl=function(){const t=new Wi(r(this,Ut)),n=new Wi(r(this,Ut));k(this,ft,t),k(this,Nt,n),k(this,ii,(c,d,h=Le.now())=>{if(n[c]=d!==0?h:0,t[c]=d,d!==0&&this.ttlAutopurge){const p=setTimeout(()=>{r(this,St).call(this,c)&&this.delete(r(this,tt)[c])},d+1);p.unref&&p.unref()}}),k(this,he,c=>{n[c]=t[c]!==0?Le.now():0}),k(this,vt,(c,d)=>{if(t[d]){const h=t[d],p=n[d];if(!h||!p)return;c.ttl=h,c.start=p,c.now=o||s();const y=c.now-p;c.remainingTTL=h-y}});let o=0;const s=()=>{const c=Le.now();if(this.ttlResolution>0){o=c;const d=setTimeout(()=>o=0,this.ttlResolution);d.unref&&d.unref()}return c};this.getRemainingTTL=c=>{const d=r(this,ct).get(c);if(d===void 0)return 0;const h=t[d],p=n[d];if(!h||!p)return 1/0;const y=(o||s())-p;return h-y},k(this,St,c=>{const d=n[c],h=t[c];return!!h&&!!d&&(o||s())-d>h})},he=new WeakMap,vt=new WeakMap,ii=new WeakMap,St=new WeakMap,Hi=new WeakSet,Bc=function(){const t=new Wi(r(this,Ut));k(this,Ct,0),k(this,gt,t),k(this,be,n=>{k(this,Ct,r(this,Ct)-t[n]),t[n]=0}),k(this,li,(n,o,s,c)=>{if(K(this,_,$).call(this,o))return 0;if(!$t(s))if(c){if(typeof c!="function")throw new TypeError("sizeCalculation must be a function");if(s=c(o,n),!$t(s))throw new TypeError("sizeCalculation return invalid (expect positive integer)")}else throw new TypeError("invalid size value (must be positive integer). When maxSize or maxEntrySize is used, sizeCalculation or size must be set.");return s}),k(this,Ye,(n,o,s)=>{if(t[n]=o,r(this,Rt)){const c=r(this,Rt)-t[n];for(;r(this,Ct)>c;)K(this,Je,Si).call(this,!0)}k(this,Ct,r(this,Ct)+t[n]),s&&(s.entrySize=o,s.totalCalculatedSize=r(this,Ct))})},be=new WeakMap,Ye=new WeakMap,li=new WeakMap,kt=new WeakSet,te=function*({allowStale:t=this.allowStale}={}){if(r(this,ot))for(let n=r(this,at);!(!K(this,ni,Wl).call(this,n)||((t||!r(this,St).call(this,n))&&(yield n),n===r(this,bt)));)n=r(this,Wt)[n]},zt=new WeakSet,ee=function*({allowStale:t=this.allowStale}={}){if(r(this,ot))for(let n=r(this,bt);!(!K(this,ni,Wl).call(this,n)||((t||!r(this,St).call(this,n))&&(yield n),n===r(this,at)));)n=r(this,Zt)[n]},ni=new WeakSet,Wl=function(t){return t!==void 0&&r(this,ct).get(r(this,tt)[t])===t},Je=new WeakSet,Si=function(t){var n,o;const s=r(this,bt),c=r(this,tt)[s],d=r(this,Q)[s];return r(this,ie)&&K(this,_,$).call(this,d)?d.__abortController.abort(new Error("evicted")):(r(this,Mt)||r(this,Vt))&&(r(this,Mt)&&((n=r(this,Yt))==null||n.call(this,d,c,"evict")),r(this,Vt)&&((o=r(this,ut))==null||o.push([d,c,"evict"]))),r(this,be).call(this,s),t&&(r(this,tt)[s]=void 0,r(this,Q)[s]=void 0,r(this,Kt).push(s)),r(this,ot)===1?(k(this,bt,k(this,at,0)),r(this,Kt).length=0):k(this,bt,r(this,Zt)[s]),r(this,ct).delete(c),ri(this,ot)._--,s},Ce=new WeakSet,Li=function(t,n,o,s){const c=n===void 0?void 0:r(this,Q)[n];if(K(this,_,$).call(this,c))return c;const d=new gi,{signal:h}=o;h==null||h.addEventListener("abort",()=>d.abort(h.reason),{signal:d.signal});const p={signal:d.signal,options:o,context:s},y=(Z,H=!1)=>{const{aborted:nt}=d.signal,lt=o.ignoreFetchAbort&&Z!==void 0;if(o.status&&(nt&&!H?(o.status.fetchAborted=!0,o.status.fetchError=d.signal.reason,lt&&(o.status.fetchAbortIgnored=!0)):o.status.fetchResolved=!0),nt&&!lt&&!H)return L(d.signal.reason);const J=N;return r(this,Q)[n]===N&&(Z===void 0?J.__staleWhileFetching?r(this,Q)[n]=J.__staleWhileFetching:this.delete(t):(o.status&&(o.status.fetchUpdated=!0),this.set(t,Z,p.options))),Z},E=Z=>(o.status&&(o.status.fetchRejected=!0,o.status.fetchError=Z),L(Z)),L=Z=>{const{aborted:H}=d.signal,nt=H&&o.allowStaleOnFetchAbort,lt=nt||o.allowStaleOnFetchRejection,J=lt||o.noDeleteOnFetchRejection,mt=N;if(r(this,Q)[n]===N&&(!J||mt.__staleWhileFetching===void 0?this.delete(t):nt||(r(this,Q)[n]=mt.__staleWhileFetching)),lt)return o.status&&mt.__staleWhileFetching!==void 0&&(o.status.returnedStale=!0),mt.__staleWhileFetching;if(mt.__returned===mt)throw Z},F=(Z,H)=>{var nt;const lt=(nt=r(this,Ue))==null?void 0:nt.call(this,t,c,p);lt&< instanceof Promise&<.then(J=>Z(J===void 0?void 0:J),H),d.signal.addEventListener("abort",()=>{(!o.ignoreFetchAbort||o.allowStaleOnFetchAbort)&&(Z(void 0),o.allowStaleOnFetchAbort&&(Z=J=>y(J,!0)))})};o.status&&(o.status.fetchDispatched=!0);const N=new Promise(F).then(y,E),z=Object.assign(N,{__abortController:d,__staleWhileFetching:c,__returned:void 0});return n===void 0?(this.set(t,z,{...p.options,status:void 0}),n=r(this,ct).get(t)):r(this,Q)[n]=z,z},_=new WeakSet,$=function(t){if(!r(this,ie))return!1;const n=t;return!!n&&n instanceof Promise&&n.hasOwnProperty("__staleWhileFetching")&&n.__abortController instanceof gi},ci=new WeakSet,fl=function(t,n){r(this,Wt)[n]=t,r(this,Zt)[t]=n},me=new WeakSet,je=function(t){t!==r(this,at)&&(t===r(this,bt)?k(this,bt,r(this,Zt)[t]):K(this,ci,fl).call(this,r(this,Wt)[t],r(this,Zt)[t]),K(this,ci,fl).call(this,r(this,at),t),k(this,at,t))};const vn=new yl({max:1e3}),qh=(t,n,o)=>{const s=JSON.stringify(t.properties),c=vn.get(s);if(c)return c;const d=(()=>{switch(re.types[t.type]){case"Polygon":return"polygon";case"LineString":return"polyline";case"Point":return"marker";default:return}})(),h=(()=>{if((o==null?void 0:o.type)!=="simple"||!d)return;const y=$h("",t,n,d);if(y)return Ri==null?void 0:Ri(o,y)})(),p=(()=>{if(d==="polygon"){const y=h==null?void 0:h.polygon;return{fillStyle:((y==null?void 0:y.fill)??!0)&&((y==null?void 0:y.show)??!0)?y==null?void 0:y.fillColor:"rgba(0,0,0,0)",strokeStyle:y!=null&&y.stroke&&((y==null?void 0:y.show)??!0)?y==null?void 0:y.strokeColor:"rgba(0,0,0,0)",lineWidth:y==null?void 0:y.strokeWidth,lineJoin:y==null?void 0:y.lineJoin}}if(d==="polyline"){const y=h==null?void 0:h.polyline;return{fillStyle:((y==null?void 0:y.strokeColor)??!0)&&((y==null?void 0:y.show)??!0)?y==null?void 0:y.strokeColor:"rgba(0,0,0,0)",strokeStyle:y!=null&&y.strokeColor&&((y==null?void 0:y.show)??!0)?y==null?void 0:y.strokeColor:"rgba(0,0,0,0)",lineWidth:y==null?void 0:y.strokeWidth}}if(d==="marker"){const y=h==null?void 0:h.marker;return{fillStyle:((y==null?void 0:y.pointColor)??!0)&&((y==null?void 0:y.show)??!0)?y==null?void 0:y.pointColor:"rgba(0,0,0,0)",strokeStyle:y!=null&&y.pointColor&&((y==null?void 0:y.show)??!0)?y==null?void 0:y.pointColor:"rgba(0,0,0,0)",lineWidth:y==null?void 0:y.pointSize}}})();return vn.set(s,p),p},$h=(t,n,o,s)=>{const c=n.loadGeometry(),[d,h]=(()=>{if(s==="polygon")return["Polygon",c.map(p=>p.map(y=>[y.x,y.y]))];if(s==="polyline")return["LineString",c[0].map(p=>[p.x,p.y])];if(s==="marker")return["Point",[c[0][0].x,c[0][0].y]];throw new Error(`Unexpected appearance ${s}`)})();return{type:"feature",id:t,geometry:{type:d,coordinates:h},properties:n.properties,range:{x:o.x,y:o.y,z:o.level}}};function tb(t){return ib(t)===Cesium$1.WindingOrder.COUNTER_CLOCKWISE}function Bn(t,n){const o=t.x,s=t.y;let c=!1;for(let d=0,h=n.length-1;d<n.length;h=d++){const p=n[d].x,y=n[d].y,E=n[h].x,L=n[h].y;y>s!=L>s&&o<(E-p)*(s-y)/(L-y)+p&&(c=!c)}return c}function eb(t,n){for(let o=0;o<t.length;o++)if(Bn(n,t[o])){let s=!1;for(;o+1<t.length&&!tb(t[o+1]);)o++,!s&&Bn(n,t[o])&&(s=!0);if(!s)return!0}return!1}function ib(t){const n=t.length;let o=t[n-1].x*(t[0].y-t[n-2].y)+t[0].x*(t[1].y-t[n-1].y);for(let s=1;s<=n-2;s++)o+=t[s].x*(t[s+1].y-t[s-1].y);if(isNaN(o))throw new Error;return o>0?Cesium$1.WindingOrder.COUNTER_CLOCKWISE:Cesium$1.WindingOrder.CLOCKWISE}const ue=256;class lb{constructor(n){Y(this,"_urlTemplate"),Y(this,"_parseTile"),Y(this,"_tilingScheme"),Y(this,"_layerNames"),Y(this,"_tileWidth"),Y(this,"_tileHeight"),Y(this,"_tileCaches"),this._parseTile=nb,this._urlTemplate=n.urlTemplate,this._tileWidth=ue,this._tileHeight=ue,this._layerNames=n.layerNames,this._tilingScheme=new ce}async render(n,o,s,c){const d=jn(this._urlTemplate,o);await Promise.all(this._layerNames.map(h=>this._renderCanvas(d,n,o,h,s,c)))}async _renderCanvas(n,o,s,c,d,h){if(!n)return;const p=await this._cachedTile(n),y=c.split(/, */).filter(Boolean).map(E=>p==null?void 0:p.layers[E]);y&&(o.strokeStyle="black",o.fillStyle="black",o.lineWidth=1,o.miterLimit=2,o.setTransform(this._tileWidth*d/ue,0,0,this._tileHeight*d/ue,0,0),y.forEach(E=>{if(!E)return;const L=ue/E.extent;for(let F=0;F<E.length;F++){const N=E.feature(F),z=qh(N,s,h);if(!z)continue;o.fillStyle=z.fillStyle??o.fillStyle,o.strokeStyle=z.strokeStyle??o.strokeStyle,o.lineWidth=z.lineWidth??o.lineWidth,o.lineJoin=z.lineJoin??o.lineJoin;const Z=N.loadGeometry();re.types[N.type]==="Polygon"?this._renderPolygon(o,Z,L,(z.lineWidth??1)>0):re.types[N.type]==="Point"?this._renderPoint(o,Z,L):re.types[N.type]==="LineString"?this._renderLineString(o,Z,L):console.error(`Unexpected geometry type: ${N.type} in region map on tile ${[s.level,s.x,s.y].join("/")}`)}}))}_renderPolygon(n,o,s,c){n.beginPath();const d=()=>{c&&n.stroke(),n.fill()};let h=0;for(let p=0;p<o.length;p++){const y=o[p];h+y.length>5400&&(d(),h=0,n.beginPath());let E=y[0];n.moveTo(E.x*s,E.y*s);for(let L=1;L<y.length;L++)E=y[L],n.lineTo(E.x*s,E.y*s);h+=y.length}h>0&&d()}_renderPoint(n,o,s){n.beginPath();for(let c=0;c<o.length;c++){const d=o[c][0],[h,p]=[d.x*s,d.y*s],y=n.lineWidth;n.beginPath(),n.arc(h,p,y,0,2*Math.PI),n.fill()}}_renderLineString(n,o,s){n.beginPath();for(let c=0;c<o.length;c++){let d=o[c][0];n.moveTo(d.x*s,d.y*s);for(let h=1;h<o[c].length;h++)d=o[c][h],n.lineTo(d.x*s,d.y*s)}n.stroke()}pickFeatures(n,o,s,c){const d=jn(this._urlTemplate,n);return this._pickFeaturesFromLayer(d,n,o,s,c)}async _pickFeaturesFromLayer(n,o,s,c,d){try{const h=await this._cachedTile(n);return h?(await Promise.all(this._layerNames.map(async p=>{const y=h.layers[p];return y?await this._pickFeatures(o,s,c,y,d)||[]:[]}))).flat():[]}catch{return[]}}async _pickFeatures(n,o,s,c,d){const h=this._tilingScheme.tileXYToNativeRectangle(n.x,n.y,n.level),p=[h.west,h.east],y=[h.north,h.south],E=function(Z,H,nt,lt,J){const mt=new Cesium$1.Cartesian2;Cesium$1.Cartesian2.subtract(Z,new Cesium$1.Cartesian2(H[0],nt[0]),mt);const pi=new Cesium$1.Cartesian2((lt[1]-lt[0])/(H[1]-H[0]),(J[1]-J[0])/(nt[1]-nt[0]));return Cesium$1.Cartesian2.add(Cesium$1.Cartesian2.multiplyComponents(mt,pi,new Cesium$1.Cartesian2),new Cesium$1.Cartesian2(lt[0],J[0]),new Cesium$1.Cartesian2)},L=[],F=[0,c.extent-1],N=E(Cesium$1.Cartesian2.fromCartesian3(this._tilingScheme.projection.project(new Cesium$1.Cartographic(o,s))),p,y,F,F),z=new Cc(N.x,N.y);for(let Z=0;Z<c.length;Z++){const H=c.feature(Z);if(re.types[H.type]==="Polygon"&&eb(H.loadGeometry(),z)){const nt=Oh(H,n,d);nt&&L.push(nt)}}return L}async _cachedTile(n){var o,s;if(n){if((o=this._tileCaches)!=null&&o.has(n))return this._tileCaches.get(n);try{const c=ob(await this._parseTile(n));return c&&((s=this._tileCaches)==null||s.set(n,c)),c}catch{return}}}clearCache(){var n;(n=this._tileCaches)==null||n.clear()}}const nb=async t=>{try{const n=await db(t);return n?cb(n):void 0}catch{return}},cb=t=>new p0(new y0(t)),db=async t=>{if(!t){console.error("fetch request failed because request url is undefined");return}try{const n=await fetch(t);return n.ok?await n.arrayBuffer():void 0}catch{return}},ob=t=>{var n;if(!t)return;const o={};for(const[s,c]of Object.entries(t.layers)){const d=[],h=c;for(let p=0;p<h.length;p++){const y=h.feature(p);let E;const L=(n=y.bbox)==null?void 0:n.call(y),F={...y,id:y.id,loadGeometry:()=>(E||(E=y.loadGeometry()),E),bbox:L?()=>L:void 0,toGeoJSON:y.toGeoJSON};d.push(F)}o[s]={...h,feature:p=>d[p]}}return{layers:o}},jn=(t,n)=>decodeURIComponent(t).replace("{z}",String(n.level)).replace("{x}",String(n.x)).replace("{y}",String(n.y));var jc={},xt={},Xe={};Object.defineProperty(Xe,"__esModule",{value:!0}),Xe.DefaultSerializer=Xe.extendSerializer=void 0;function sb(t,n){const o=t.deserialize.bind(t),s=t.serialize.bind(t);return{deserialize(c){return n.deserialize(c,o)},serialize(c){return n.serialize(c,s)}}}Xe.extendSerializer=sb;const On={deserialize(t){return Object.assign(Error(t.message),{name:t.name,stack:t.stack})},serialize(t){return{__error_marker:"$$error",message:t.message,name:t.name,stack:t.stack}}},ab=t=>t&&typeof t=="object"&&"__error_marker"in t&&t.__error_marker==="$$error";Xe.DefaultSerializer={deserialize(t){return ab(t)?On.deserialize(t):t},serialize(t){return t instanceof Error?On.serialize(t):t}},Object.defineProperty(xt,"__esModule",{value:!0}),xt.serialize=xt.deserialize=xt.registerSerializer=void 0;const Oc=Xe;let Ni=Oc.DefaultSerializer;function ub(t){Ni=Oc.extendSerializer(Ni,t)}xt.registerSerializer=ub;function rb(t){return Ni.deserialize(t)}xt.deserialize=rb;function hb(t){return Ni.serialize(t)}xt.serialize=hb;var Dc={},jt={},Ne={};Object.defineProperty(Ne,"__esModule",{value:!0}),Ne.getBundleURL=Ne.getBaseURL=void 0;let ll;function bb(){return ll||(ll=mb()),ll}Ne.getBundleURL=bb;function mb(){try{throw new Error}catch(t){const n=(""+t.stack).match(/(https?|file|ftp|chrome-extension|moz-extension):\/\/[^)\n]+/g);if(n)return Ac(n[0])}return"/"}function Ac(t){return(""+t).replace(/^((?:https?|file|ftp|chrome-extension|moz-extension):\/\/.+)?\/[^/]+(?:\?.*)?$/,"$1")+"/"}Ne.getBaseURL=Ac,Object.defineProperty(jt,"__esModule",{value:!0}),jt.isWorkerRuntime=jt.getWorkerImplementation=jt.defaultPoolSize=void 0;const Dn=Ne;jt.defaultPoolSize=typeof navigator<"u"&&navigator.hardwareConcurrency?navigator.hardwareConcurrency:4;const An=t=>/^[a-zA-Z][a-zA-Z\d+\-.]*:/.test(t);function _n(t){const n=new Blob([t],{type:"application/javascript"});return URL.createObjectURL(n)}function Zb(){if(typeof Worker>"u")return class{constructor(){throw Error("No web worker implementation available. You might have tried to spawn a worker within a worker in a browser that doesn't support workers in workers.")}};class t extends Worker{constructor(s,c){var d,h;typeof s=="string"&&c&&c._baseURL?s=new URL(s,c._baseURL):typeof s=="string"&&!An(s)&&Dn.getBundleURL().match(/^file:\/\//i)&&(s=new URL(s,Dn.getBundleURL().replace(/\/[^\/]+$/,"/")),(!((d=c==null?void 0:c.CORSWorkaround)!==null&&d!==void 0)||d)&&(s=_n(`importScripts(${JSON.stringify(s)});`))),typeof s=="string"&&An(s)&&(!((h=c==null?void 0:c.CORSWorkaround)!==null&&h!==void 0)||h)&&(s=_n(`importScripts(${JSON.stringify(s)});`)),super(s,c)}}class n extends t{constructor(s,c){const d=window.URL.createObjectURL(s);super(d,c)}static fromText(s,c){const d=new window.Blob([s],{type:"text/javascript"});return new n(d,c)}}return{blob:n,default:t}}let nl$2;function Vb(){return nl$2||(nl$2=Zb()),nl$2}jt.getWorkerImplementation=Vb;function Xb(){const t=typeof self<"u"&&typeof Window<"u"&&self instanceof Window;return!!(typeof self<"u"&&self.postMessage&&!t)}jt.isWorkerRuntime=Xb;var _c={},Me={},Gb={get exports(){return Me},set exports(t){Me=t}},cl,qn;function pb(){if(qn)return cl;qn=1;var t=1e3,n=t*60,o=n*60,s=o*24,c=s*7,d=s*365.25;cl=function(L,F){F=F||{};var N=typeof L;if(N==="string"&&L.length>0)return h(L);if(N==="number"&&isFinite(L))return F.long?y(L):p(L);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(L))};function h(L){if(L=String(L),!(L.length>100)){var F=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(L);if(F){var N=parseFloat(F[1]),z=(F[2]||"ms").toLowerCase();switch(z){case"years":case"year":case"yrs":case"yr":case"y":return N*d;case"weeks":case"week":case"w":return N*c;case"days":case"day":case"d":return N*s;case"hours":case"hour":case"hrs":case"hr":case"h":return N*o;case"minutes":case"minute":case"mins":case"min":case"m":return N*n;case"seconds":case"second":case"secs":case"sec":case"s":return N*t;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return N;default:return}}}}function p(L){var F=Math.abs(L);return F>=s?Math.round(L/s)+"d":F>=o?Math.round(L/o)+"h":F>=n?Math.round(L/n)+"m":F>=t?Math.round(L/t)+"s":L+"ms"}function y(L){var F=Math.abs(L);return F>=s?E(L,F,s,"day"):F>=o?E(L,F,o,"hour"):F>=n?E(L,F,n,"minute"):F>=t?E(L,F,t,"second"):L+" ms"}function E(L,F,N,z){var Z=F>=N*1.5;return Math.round(L/N)+" "+z+(Z?"s":"")}return cl}function yb(t){o.debug=o,o.default=o,o.coerce=y,o.disable=d,o.enable=c,o.enabled=h,o.humanize=pb(),o.destroy=E,Object.keys(t).forEach(L=>{o[L]=t[L]}),o.names=[],o.skips=[],o.formatters={};function n(L){let F=0;for(let N=0;N<L.length;N++)F=(F<<5)-F+L.charCodeAt(N),F|=0;return o.colors[Math.abs(F)%o.colors.length]}o.selectColor=n;function o(L){let F,N=null,z,Z;function H(...nt){if(!H.enabled)return;const lt=H,J=Number(new Date),mt=J-(F||J);lt.diff=mt,lt.prev=F,lt.curr=J,F=J,nt[0]=o.coerce(nt[0]),typeof nt[0]!="string"&&nt.unshift("%O");let pi=0;nt[0]=nt[0].replace(/%([a-zA-Z%])/g,(Ai,md)=>{if(Ai==="%%")return"%";pi++;const Gd=o.formatters[md];if(typeof Gd=="function"){const Xd=nt[pi];Ai=Gd.call(lt,Xd),nt.splice(pi,1),pi--}return Ai}),o.formatArgs.call(lt,nt),(lt.log||o.log).apply(lt,nt)}return H.namespace=L,H.useColors=o.useColors(),H.color=o.selectColor(L),H.extend=s,H.destroy=o.destroy,Object.defineProperty(H,"enabled",{enumerable:!0,configurable:!1,get:()=>N!==null?N:(z!==o.namespaces&&(z=o.namespaces,Z=o.enabled(L)),Z),set:nt=>{N=nt}}),typeof o.init=="function"&&o.init(H),H}function s(L,F){const N=o(this.namespace+(typeof F>"u"?":":F)+L);return N.log=this.log,N}function c(L){o.save(L),o.namespaces=L,o.names=[],o.skips=[];let F;const N=(typeof L=="string"?L:"").split(/[\s,]+/),z=N.length;for(F=0;F<z;F++)N[F]&&(L=N[F].replace(/\*/g,".*?"),L[0]==="-"?o.skips.push(new RegExp("^"+L.slice(1)+"$")):o.names.push(new RegExp("^"+L+"$")))}function d(){const L=[...o.names.map(p),...o.skips.map(p).map(F=>"-"+F)].join(",");return o.enable(""),L}function h(L){if(L[L.length-1]==="*")return!0;let F,N;for(F=0,N=o.skips.length;F<N;F++)if(o.skips[F].test(L))return!1;for(F=0,N=o.names.length;F<N;F++)if(o.names[F].test(L))return!0;return!1}function p(L){return L.toString().substring(2,L.toString().length-2).replace(/\.\*\?$/,"*")}function y(L){return L instanceof Error?L.stack||L.message:L}function E(){console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.")}return o.enable(o.load()),o}var Rb=yb;(function(t,n){n.formatArgs=s,n.save=c,n.load=d,n.useColors=o,n.storage=h(),n.destroy=(()=>{let y=!1;return()=>{y||(y=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}})(),n.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"];function o(){return typeof window<"u"&&window.process&&(window.process.type==="renderer"||window.process.__nwjs)?!0:typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)?!1:typeof document<"u"&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||typeof window<"u"&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)&&parseInt(RegExp.$1,10)>=31||typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)}function s(y){if(y[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+y[0]+(this.useColors?"%c ":" ")+"+"+t.exports.humanize(this.diff),!this.useColors)return;const E="color: "+this.color;y.splice(1,0,E,"color: inherit");let L=0,F=0;y[0].replace(/%[a-zA-Z%]/g,N=>{N!=="%%"&&(L++,N==="%c"&&(F=L))}),y.splice(F,0,E)}n.log=console.debug||console.log||(()=>{});function c(y){try{y?n.storage.setItem("debug",y):n.storage.removeItem("debug")}catch{}}function d(){let y;try{y=n.storage.getItem("debug")}catch{}return!y&&typeof process<"u"&&"env"in process&&(y=process.env.DEBUG),y}function h(){try{return localStorage}catch{}}t.exports=Rb(n);const{formatters:p}=t.exports;p.j=function(y){try{return JSON.stringify(y)}catch(E){return"[UnexpectedJSONParseError]: "+E.message}}})(Gb,Me);var Wb=globalThis&&globalThis.__awaiter||function(t,n,o,s){function c(d){return d instanceof o?d:new o(function(h){h(d)})}return new(o||(o=Promise))(function(d,h){function p(L){try{E(s.next(L))}catch(F){h(F)}}function y(L){try{E(s.throw(L))}catch(F){h(F)}}function E(L){L.done?d(L.value):c(L.value).then(p,y)}E((s=s.apply(t,n||[])).next())})};class wi{constructor(n){this._baseObserver=n,this._pendingPromises=new Set}complete(){Promise.all(this._pendingPromises).then(()=>this._baseObserver.complete()).catch(n=>this._baseObserver.error(n))}error(n){this._baseObserver.error(n)}schedule(n){const o=Promise.all(this._pendingPromises),s=[],c=h=>s.push(h),d=Promise.resolve().then(()=>Wb(this,void 0,void 0,function*(){yield o,yield n(c),this._pendingPromises.delete(d);for(const h of s)this._baseObserver.next(h)})).catch(h=>{this._pendingPromises.delete(d),this._baseObserver.error(h)});this._pendingPromises.add(d)}}const qc=()=>typeof Symbol=="function",di=t=>qc()&&!!Symbol[t],Bl=t=>di(t)?Symbol[t]:"@@"+t;di("asyncIterator")||(Symbol.asyncIterator=Symbol.asyncIterator||Symbol.for("Symbol.asyncIterator"));const fb=Bl("iterator"),Sl=Bl("observable"),$c=Bl("species");function Mi(t,n){const o=t[n];if(o!=null){if(typeof o!="function")throw new TypeError(o+" is not a function");return o}}function ve(t){let n=t.constructor;return n!==void 0&&(n=n[$c],n===null&&(n=void 0)),n!==void 0?n:It}function Sb(t){return t instanceof It}function He(t){He.log?He.log(t):setTimeout(()=>{throw t},0)}function Fi(t){Promise.resolve().then(()=>{try{t()}catch(n){He(n)}})}function td(t){const n=t._cleanup;if(n!==void 0&&(t._cleanup=void 0,!!n))try{if(typeof n=="function")n();else{const o=Mi(n,"unsubscribe");o&&o.call(n)}}catch(o){He(o)}}function Ll(t){t._observer=void 0,t._queue=void 0,t._state="closed"}function Lb(t){const n=t._queue;if(n){t._queue=void 0,t._state="ready";for(const o of n)if(ed(t,o.type,o.value),t._state==="closed")break}}function ed(t,n,o){t._state="running";const s=t._observer;try{const c=s?Mi(s,n):void 0;switch(n){case"next":c&&c.call(s,o);break;case"error":if(Ll(t),c)c.call(s,o);else throw o;break;case"complete":Ll(t),c&&c.call(s);break}}catch(c){He(c)}t._state==="closed"?td(t):t._state==="running"&&(t._state="ready")}function dl(t,n,o){if(t._state!=="closed"){if(t._state==="buffering"){t._queue=t._queue||[],t._queue.push({type:n,value:o});return}if(t._state!=="ready"){t._state="buffering",t._queue=[{type:n,value:o}],Fi(()=>Lb(t));return}ed(t,n,o)}}class Fb{constructor(n,o){this._cleanup=void 0,this._observer=n,this._queue=void 0,this._state="initializing";const s=new Ib(this);try{this._cleanup=o.call(void 0,s)}catch(c){s.error(c)}this._state==="initializing"&&(this._state="ready")}get closed(){return this._state==="closed"}unsubscribe(){this._state!=="closed"&&(Ll(this),td(this))}}class Ib{constructor(n){this._subscription=n}get closed(){return this._subscription._state==="closed"}next(n){dl(this._subscription,"next",n)}error(n){dl(this._subscription,"error",n)}complete(){dl(this._subscription,"complete")}}class It{constructor(n){if(!(this instanceof It))throw new TypeError("Observable cannot be called as a function");if(typeof n!="function")throw new TypeError("Observable initializer must be a function");this._subscriber=n}subscribe(n,o,s){return(typeof n!="object"||n===null)&&(n={next:n,error:o,complete:s}),new Fb(n,this._subscriber)}pipe(n,...o){let s=this;for(const c of[n,...o])s=c(s);return s}tap(n,o,s){const c=typeof n!="object"||n===null?{next:n,error:o,complete:s}:n;return new It(d=>this.subscribe({next(h){c.next&&c.next(h),d.next(h)},error(h){c.error&&c.error(h),d.error(h)},complete(){c.complete&&c.complete(),d.complete()},start(h){c.start&&c.start(h)}}))}forEach(n){return new Promise((o,s)=>{if(typeof n!="function"){s(new TypeError(n+" is not a function"));return}function c(){d.unsubscribe(),o(void 0)}const d=this.subscribe({next(h){try{n(h,c)}catch(p){s(p),d.unsubscribe()}},error(h){s(h)},complete(){o(void 0)}})})}map(n){if(typeof n!="function")throw new TypeError(n+" is not a function");const o=ve(this);return new o(s=>this.subscribe({next(c){let d=c;try{d=n(c)}catch(h){return s.error(h)}s.next(d)},error(c){s.error(c)},complete(){s.complete()}}))}filter(n){if(typeof n!="function")throw new TypeError(n+" is not a function");const o=ve(this);return new o(s=>this.subscribe({next(c){try{if(!n(c))return}catch(d){return s.error(d)}s.next(c)},error(c){s.error(c)},complete(){s.complete()}}))}reduce(n,o){if(typeof n!="function")throw new TypeError(n+" is not a function");const s=ve(this),c=arguments.length>1;let d=!1,h=o;return new s(p=>this.subscribe({next(y){const E=!d;if(d=!0,!E||c)try{h=n(h,y)}catch(L){return p.error(L)}else h=y},error(y){p.error(y)},complete(){if(!d&&!c)return p.error(new TypeError("Cannot reduce an empty sequence"));p.next(h),p.complete()}}))}concat(...n){const o=ve(this);return new o(s=>{let c,d=0;function h(p){c=p.subscribe({next(y){s.next(y)},error(y){s.error(y)},complete(){d===n.length?(c=void 0,s.complete()):h(o.from(n[d++]))}})}return h(this),()=>{c&&(c.unsubscribe(),c=void 0)}})}flatMap(n){if(typeof n!="function")throw new TypeError(n+" is not a function");const o=ve(this);return new o(s=>{const c=[],d=this.subscribe({next(p){let y;if(n)try{y=n(p)}catch(L){return s.error(L)}else y=p;const E=o.from(y).subscribe({next(L){s.next(L)},error(L){s.error(L)},complete(){const L=c.indexOf(E);L>=0&&c.splice(L,1),h()}});c.push(E)},error(p){s.error(p)},complete(){h()}});function h(){d.closed&&c.length===0&&s.complete()}return()=>{c.forEach(p=>p.unsubscribe()),d.unsubscribe()}})}[Sl](){return this}static from(n){const o=typeof this=="function"?this:It;if(n==null)throw new TypeError(n+" is not an object");const s=Mi(n,Sl);if(s){const c=s.call(n);if(Object(c)!==c)throw new TypeError(c+" is not an object");return Sb(c)&&c.constructor===o?c:new o(d=>c.subscribe(d))}if(di("iterator")){const c=Mi(n,fb);if(c)return new o(d=>{Fi(()=>{if(!d.closed){for(const h of c.call(n))if(d.next(h),d.closed)return;d.complete()}})})}if(Array.isArray(n))return new o(c=>{Fi(()=>{if(!c.closed){for(const d of n)if(c.next(d),c.closed)return;c.complete()}})});throw new TypeError(n+" is not observable")}static of(...n){const o=typeof this=="function"?this:It;return new o(s=>{Fi(()=>{if(!s.closed){for(const c of n)if(s.next(c),s.closed)return;s.complete()}})})}static get[$c](){return this}}qc()&&Object.defineProperty(It,Symbol("extensions"),{value:{symbol:Sl,hostReportError:He},configurable:!0});const ye=It;function Re(t){typeof t=="function"?t():t&&typeof t.unsubscribe=="function"&&t.unsubscribe()}var xb=globalThis&&globalThis.__awaiter||function(t,n,o,s){function c(d){return d instanceof o?d:new o(function(h){h(d)})}return new(o||(o=Promise))(function(d,h){function p(L){try{E(s.next(L))}catch(F){h(F)}}function y(L){try{E(s.throw(L))}catch(F){h(F)}}function E(L){L.done?d(L.value):c(L.value).then(p,y)}E((s=s.apply(t,n||[])).next())})};function Tb(t){return n=>new ye(o=>{const s=new wi(o),c=n.subscribe({complete(){s.complete()},error(d){s.error(d)},next(d){s.schedule(h=>xb(this,void 0,void 0,function*(){(yield t(d))&&h(d)}))}});return()=>Re(c)})}function Ub(t){return t&&di("asyncIterator")&&t[Symbol.asyncIterator]}function Yb(t){return t&&di("iterator")&&t[Symbol.iterator]}var Jb=globalThis&&globalThis.__awaiter||function(t,n,o,s){function c(d){return d instanceof o?d:new o(function(h){h(d)})}return new(o||(o=Promise))(function(d,h){function p(L){try{E(s.next(L))}catch(F){h(F)}}function y(L){try{E(s.throw(L))}catch(F){h(F)}}function E(L){L.done?d(L.value):c(L.value).then(p,y)}E((s=s.apply(t,n||[])).next())})},Cb=globalThis&&globalThis.__asyncValues||function(t){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var n=t[Symbol.asyncIterator],o;return n?n.call(t):(t=typeof __values=="function"?__values(t):t[Symbol.iterator](),o={},s("next"),s("throw"),s("return"),o[Symbol.asyncIterator]=function(){return this},o);function s(d){o[d]=t[d]&&function(h){return new Promise(function(p,y){h=t[d](h),c(p,y,h.done,h.value)})}}function c(d,h,p,y){Promise.resolve(y).then(function(E){d({value:E,done:p})},h)}};function Kb(t){return n=>new ye(o=>{const s=new wi(o),c=n.subscribe({complete(){s.complete()},error(d){s.error(d)},next(d){s.schedule(h=>Jb(this,void 0,void 0,function*(){var p,y;const E=yield t(d);if(Yb(E)||Ub(E))try{for(var L=Cb(E),F;F=yield L.next(),!F.done;){const N=F.value;h(N)}}catch(N){p={error:N}}finally{try{F&&!F.done&&(y=L.return)&&(yield y.call(L))}finally{if(p)throw p.error}}else E.map(N=>h(N))}))}});return()=>Re(c)})}function gb(t){return new It(n=>{let o=0;const s=setInterval(()=>{n.next(o++)},t);return()=>clearInterval(s)})}var Nb=globalThis&&globalThis.__awaiter||function(t,n,o,s){function c(d){return d instanceof o?d:new o(function(h){h(d)})}return new(o||(o=Promise))(function(d,h){function p(L){try{E(s.next(L))}catch(F){h(F)}}function y(L){try{E(s.throw(L))}catch(F){h(F)}}function E(L){L.done?d(L.value):c(L.value).then(p,y)}E((s=s.apply(t,n||[])).next())})};function Mb(t){return n=>new ye(o=>{const s=new wi(o),c=n.subscribe({complete(){s.complete()},error(d){s.error(d)},next(d){s.schedule(h=>Nb(this,void 0,void 0,function*(){const p=yield t(d);h(p)}))}});return()=>Re(c)})}function Hb(...t){return t.length===0?It.from([]):new It(n=>{let o=0;const s=t.map(d=>d.subscribe({error(h){n.error(h),c()},next(h){n.next(h)},complete(){++o===t.length&&(n.complete(),c())}})),c=()=>{s.forEach(d=>Re(d))};return c})}class kb extends ye{constructor(){super(n=>(this._observers.add(n),()=>this._observers.delete(n))),this._observers=new Set}next(n){for(const o of this._observers)o.next(n)}error(n){for(const o of this._observers)o.error(n)}complete(){for(const n of this._observers)n.complete()}}const id$2=kb;function zb(t){const n=new id$2;let o,s=0;return new ye(c=>{o||(o=t.subscribe(n));const d=n.subscribe(c);return s++,()=>{s--,d.unsubscribe(),s===0&&(Re(o),o=void 0)}})}var Qb=globalThis&&globalThis.__awaiter||function(t,n,o,s){function c(d){return d instanceof o?d:new o(function(h){h(d)})}return new(o||(o=Promise))(function(d,h){function p(L){try{E(s.next(L))}catch(F){h(F)}}function y(L){try{E(s.throw(L))}catch(F){h(F)}}function E(L){L.done?d(L.value):c(L.value).then(p,y)}E((s=s.apply(t,n||[])).next())})};function Eb(t,n){return o=>new ye(s=>{let c,d=0;const h=new wi(s),p=o.subscribe({complete(){h.complete()},error(y){h.error(y)},next(y){h.schedule(E=>Qb(this,void 0,void 0,function*(){c=yield t(d===0?typeof n>"u"?y:n:c,y,d++),E(c)}))}});return()=>Re(p)})}const Pb=Object.freeze(Object.defineProperty({__proto__:null,Observable:ye,Subject:id$2,filter:Tb,flatMap:Kb,interval:gb,map:Mb,merge:Hb,multicast:zb,scan:Eb,unsubscribe:Re},Symbol.toStringTag,{value:"Module"})),vi=Kr(Pb);var Bi={};Object.defineProperty(Bi,"__esModule",{value:!0}),Bi.allSettled=void 0;function wb(t){return Promise.all(t.map(n=>{const o=d=>({status:"fulfilled",value:d}),s=d=>({status:"rejected",reason:d}),c=Promise.resolve(n);try{return c.then(o,s)}catch(d){return Promise.reject(d)}}))}Bi.allSettled=wb;var ld={};(function(t){Object.defineProperty(t,"__esModule",{value:!0}),t.PoolEventType=void 0,function(n){n.initialized="initialized",n.taskCanceled="taskCanceled",n.taskCompleted="taskCompleted",n.taskFailed="taskFailed",n.taskQueued="taskQueued",n.taskQueueDrained="taskQueueDrained",n.taskStart="taskStart",n.terminated="terminated"}(t.PoolEventType||(t.PoolEventType={}))})(ld);var oi={},pt={};Object.defineProperty(pt,"__esModule",{value:!0}),pt.$worker=pt.$transferable=pt.$terminate=pt.$events=pt.$errors=void 0,pt.$errors=Symbol("thread.errors"),pt.$events=Symbol("thread.events"),pt.$terminate=Symbol("thread.terminate"),pt.$transferable=Symbol("thread.transferable"),pt.$worker=Symbol("thread.worker"),Object.defineProperty(oi,"__esModule",{value:!0}),oi.Thread=void 0;const ol=pt;function $n(t){throw Error(t)}oi.Thread={errors(t){return t[ol.$errors]||$n("Error observable not found. Make sure to pass a thread instance as returned by the spawn() promise.")},events(t){return t[ol.$events]||$n("Events observable not found. Make sure to pass a thread instance as returned by the spawn() promise.")},terminate(t){return t[ol.$terminate]()}},function(t){var n=rt&&rt.__awaiter||function(lt,J,mt,pi){function Ai(md){return md instanceof mt?md:new mt(function(Gd){Gd(md)})}return new(mt||(mt=Promise))(function(md,Gd){function Xd(rf){try{nf(pi.next(rf))}catch(ef){Gd(ef)}}function Vd(rf){try{nf(pi.throw(rf))}catch(ef){Gd(ef)}}function nf(rf){rf.done?md(rf.value):Ai(rf.value).then(Xd,Vd)}nf((pi=pi.apply(lt,J||[])).next())})},o=rt&&rt.__importDefault||function(lt){return lt&<.__esModule?lt:{default:lt}};Object.defineProperty(t,"__esModule",{value:!0}),t.Pool=t.Thread=t.PoolEventType=void 0;const s=o(Me),c=vi,d=Bi,h=jt,p=ld;Object.defineProperty(t,"PoolEventType",{enumerable:!0,get:function(){return p.PoolEventType}});const y=oi;Object.defineProperty(t,"Thread",{enumerable:!0,get:function(){return y.Thread}});let E=1;function L(lt){const J=[];for(let mt=0;mt<lt;mt++)J.push(mt);return J}function F(lt){return new Promise(J=>setTimeout(J,lt))}function N(lt,J){return lt.reduce((mt,pi)=>[...mt,...J(pi)],[])}function z(lt){return lt.replace(/\W/g," ").trim().replace(/\s+/g,"-")}function Z(lt,J){return L(J).map(()=>({init:lt(),runningTasks:[]}))}class H{constructor(J,mt){this.eventSubject=new c.Subject,this.initErrors=[],this.isClosing=!1,this.nextTaskID=1,this.taskQueue=[];const pi=typeof mt=="number"?{size:mt}:mt||{},{size:Ai=h.defaultPoolSize}=pi;this.debug=s.default(`threads:pool:${z(pi.name||String(E++))}`),this.options=pi,this.workers=Z(J,Ai),this.eventObservable=c.multicast(c.Observable.from(this.eventSubject)),Promise.all(this.workers.map(md=>md.init)).then(()=>this.eventSubject.next({type:p.PoolEventType.initialized,size:this.workers.length}),md=>{this.debug("Error while initializing pool worker:",md),this.eventSubject.error(md),this.initErrors.push(md)})}findIdlingWorker(){const{concurrency:J=1}=this.options;return this.workers.find(mt=>mt.runningTasks.length<J)}runPoolTask(J,mt){return n(this,void 0,void 0,function*(){const pi=this.workers.indexOf(J)+1;this.debug(`Running task #${mt.id} on worker #${pi}...`),this.eventSubject.next({type:p.PoolEventType.taskStart,taskID:mt.id,workerID:pi});try{const Ai=yield mt.run(yield J.init);this.debug(`Task #${mt.id} completed successfully`),this.eventSubject.next({type:p.PoolEventType.taskCompleted,returnValue:Ai,taskID:mt.id,workerID:pi})}catch(Ai){this.debug(`Task #${mt.id} failed`),this.eventSubject.next({type:p.PoolEventType.taskFailed,taskID:mt.id,error:Ai,workerID:pi})}})}run(J,mt){return n(this,void 0,void 0,function*(){const pi=n(this,void 0,void 0,function*(){const Ai=()=>{J.runningTasks=J.runningTasks.filter(md=>md!==pi)};yield F(0);try{yield this.runPoolTask(J,mt)}finally{Ai(),this.isClosing||this.scheduleWork()}});J.runningTasks.push(pi)})}scheduleWork(){this.debug("Attempt de-queueing a task in order to run it...");const J=this.findIdlingWorker();if(!J)return;const mt=this.taskQueue.shift();if(!mt){this.debug("Task queue is empty"),this.eventSubject.next({type:p.PoolEventType.taskQueueDrained});return}this.run(J,mt)}taskCompletion(J){return new Promise((mt,pi)=>{const Ai=this.events().subscribe(md=>{md.type===p.PoolEventType.taskCompleted&&md.taskID===J?(Ai.unsubscribe(),mt(md.returnValue)):md.type===p.PoolEventType.taskFailed&&md.taskID===J?(Ai.unsubscribe(),pi(md.error)):md.type===p.PoolEventType.terminated&&(Ai.unsubscribe(),pi(Error("Pool has been terminated before task was run.")))})})}settled(J=!1){return n(this,void 0,void 0,function*(){const mt=()=>N(this.workers,md=>md.runningTasks),pi=[],Ai=this.eventObservable.subscribe(md=>{md.type===p.PoolEventType.taskFailed&&pi.push(md.error)});return this.initErrors.length>0?Promise.reject(this.initErrors[0]):J&&this.taskQueue.length===0?(yield d.allSettled(mt()),pi):(yield new Promise((md,Gd)=>{const Xd=this.eventObservable.subscribe({next(Vd){Vd.type===p.PoolEventType.taskQueueDrained&&(Xd.unsubscribe(),md(void 0))},error:Gd})}),yield d.allSettled(mt()),Ai.unsubscribe(),pi)})}completed(J=!1){return n(this,void 0,void 0,function*(){const mt=this.settled(J),pi=new Promise((md,Gd)=>{const Xd=this.eventObservable.subscribe({next(Vd){Vd.type===p.PoolEventType.taskQueueDrained?(Xd.unsubscribe(),md(mt)):Vd.type===p.PoolEventType.taskFailed&&(Xd.unsubscribe(),Gd(Vd.error))},error:Gd})}),Ai=yield Promise.race([mt,pi]);if(Ai.length>0)throw Ai[0]})}events(){return this.eventObservable}queue(J){const{maxQueuedJobs:mt=1/0}=this.options;if(this.isClosing)throw Error("Cannot schedule pool tasks after terminate() has been called.");if(this.initErrors.length>0)throw this.initErrors[0];const pi=this.nextTaskID++,Ai=this.taskCompletion(pi);Ai.catch(Gd=>{this.debug(`Task #${pi} errored:`,Gd)});const md={id:pi,run:J,cancel:()=>{this.taskQueue.indexOf(md)!==-1&&(this.taskQueue=this.taskQueue.filter(Gd=>Gd!==md),this.eventSubject.next({type:p.PoolEventType.taskCanceled,taskID:md.id}))},then:Ai.then.bind(Ai)};if(this.taskQueue.length>=mt)throw Error(`Maximum number of pool tasks queued. Refusing to queue another one.
|
|
6051
6051
|
This usually happens for one of two reasons: We are either at peak workload right now or some tasks just won't finish, thus blocking the pool.`);return this.debug(`Queueing task #${md.id}...`),this.taskQueue.push(md),this.eventSubject.next({type:p.PoolEventType.taskQueued,taskID:md.id}),this.scheduleWork(),md}terminate(J){return n(this,void 0,void 0,function*(){this.isClosing=!0,J||(yield this.completed(!0)),this.eventSubject.next({type:p.PoolEventType.terminated,remainingQueue:[...this.taskQueue]}),this.eventSubject.complete(),yield Promise.all(this.workers.map(mt=>n(this,void 0,void 0,function*(){return y.Thread.terminate(yield mt.init)})))})}}H.EventType=p.PoolEventType;function nt(lt,J){return new H(lt,J)}nt.EventType=p.PoolEventType,t.Pool=nt}(_c);var ji={},Oi={};Object.defineProperty(Oi,"__esModule",{value:!0}),Oi.createPromiseWithResolver=void 0;const vb=()=>{};function Bb(){let t=!1,n,o=vb;return[new Promise(s=>{t?s(n):o=s}),s=>{t=!0,n=s,o(n)}]}Oi.createPromiseWithResolver=Bb;var nd={};(function(t){Object.defineProperty(t,"__esModule",{value:!0}),t.WorkerEventType=void 0,function(n){n.internalError="internalError",n.message="message",n.termination="termination"}(t.WorkerEventType||(t.WorkerEventType={}))})(nd);var ke={},Di={};Object.defineProperty(Di,"__esModule",{value:!0}),Di.ObservablePromise=void 0;const jb=vi,Ob=()=>{},Db=t=>t,tc=t=>Promise.resolve().then(t);function Ab(t){throw t}function _b(t){return t&&typeof t.then=="function"}class jl extends jb.Observable{constructor(n){super(o=>{const s=this,c=Object.assign(Object.assign({},o),{complete(){o.complete(),s.onCompletion()},error(d){o.error(d),s.onError(d)},next(d){o.next(d),s.onNext(d)}});try{return this.initHasRun=!0,n(c)}catch(d){c.error(d)}}),this.initHasRun=!1,this.fulfillmentCallbacks=[],this.rejectionCallbacks=[],this.firstValueSet=!1,this.state="pending"}onNext(n){this.firstValueSet||(this.firstValue=n,this.firstValueSet=!0)}onError(n){this.state="rejected",this.rejection=n;for(const o of this.rejectionCallbacks)tc(()=>o(n))}onCompletion(){this.state="fulfilled";for(const n of this.fulfillmentCallbacks)tc(()=>n(this.firstValue))}then(n,o){const s=n||Db,c=o||Ab;let d=!1;return new Promise((h,p)=>{const y=L=>{if(!d){d=!0;try{h(c(L))}catch(F){p(F)}}},E=L=>{try{h(s(L))}catch(F){y(F)}};if(this.initHasRun||this.subscribe({error:y}),this.state==="fulfilled")return h(s(this.firstValue));if(this.state==="rejected")return d=!0,h(c(this.rejection));this.fulfillmentCallbacks.push(E),this.rejectionCallbacks.push(y)})}catch(n){return this.then(void 0,n)}finally(n){const o=n||Ob;return this.then(s=>(o(),s),()=>o())}static from(n){return _b(n)?new jl(o=>{const s=d=>{o.next(d),o.complete()},c=d=>{o.error(d)};n.then(s,c)}):super.from(n)}}Di.ObservablePromise=jl;var Ot={};Object.defineProperty(Ot,"__esModule",{value:!0}),Ot.Transfer=Ot.isTransferDescriptor=void 0;const cd=pt;function qb(t){return!(!t||typeof t!="object")}function $b(t){return t&&typeof t=="object"&&t[cd.$transferable]}Ot.isTransferDescriptor=$b;function tm(t,n){if(!n){if(!qb(t))throw Error();n=[t]}return{[cd.$transferable]:!0,send:t,transferables:n}}Ot.Transfer=tm;var Ol={};(function(t){Object.defineProperty(t,"__esModule",{value:!0}),t.WorkerMessageType=t.MasterMessageType=void 0,function(n){n.cancel="cancel",n.run="run"}(t.MasterMessageType||(t.MasterMessageType={})),function(n){n.error="error",n.init="init",n.result="result",n.running="running",n.uncaughtError="uncaughtError"}(t.WorkerMessageType||(t.WorkerMessageType={}))})(Ol);var em=rt&&rt.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(ke,"__esModule",{value:!0}),ke.createProxyModule=ke.createProxyFunction=void 0;const im=em(Me),dd=vi,De=xt,ec=Di,lm=Ot,si=Ol,od=im.default("threads:master:messages");let nm=1;const cm=t=>Array.from(new Set(t)),dm=t=>t&&t.type===si.WorkerMessageType.error,om=t=>t&&t.type===si.WorkerMessageType.result,sm=t=>t&&t.type===si.WorkerMessageType.running;function am(t,n){return new dd.Observable(o=>{let s;const c=d=>{if(od("Message from worker:",d.data),!(!d.data||d.data.uid!==n)){if(sm(d.data))s=d.data.resultType;else if(om(d.data))s==="promise"?(typeof d.data.payload<"u"&&o.next(De.deserialize(d.data.payload)),o.complete(),t.removeEventListener("message",c)):(d.data.payload&&o.next(De.deserialize(d.data.payload)),d.data.complete&&(o.complete(),t.removeEventListener("message",c)));else if(dm(d.data)){const h=De.deserialize(d.data.error);o.error(h),t.removeEventListener("message",c)}}};return t.addEventListener("message",c),()=>{if(s==="observable"||!s){const d={type:si.MasterMessageType.cancel,uid:n};t.postMessage(d)}t.removeEventListener("message",c)}})}function um(t){if(t.length===0)return{args:[],transferables:[]};const n=[],o=[];for(const s of t)lm.isTransferDescriptor(s)?(n.push(De.serialize(s.send)),o.push(...s.transferables)):n.push(De.serialize(s));return{args:n,transferables:o.length===0?o:cm(o)}}function sd(t,n){return(...o)=>{const s=nm++,{args:c,transferables:d}=um(o),h={type:si.MasterMessageType.run,uid:s,method:n,args:c};od("Sending command to run function to worker:",h);try{t.postMessage(h,d)}catch(p){return ec.ObservablePromise.from(Promise.reject(p))}return ec.ObservablePromise.from(dd.multicast(am(t,s)))}}ke.createProxyFunction=sd;function rm(t,n){const o={};for(const s of n)o[s]=sd(t,s);return o}ke.createProxyModule=rm;var Dl=rt&&rt.__awaiter||function(t,n,o,s){function c(d){return d instanceof o?d:new o(function(h){h(d)})}return new(o||(o=Promise))(function(d,h){function p(L){try{E(s.next(L))}catch(F){h(F)}}function y(L){try{E(s.throw(L))}catch(F){h(F)}}function E(L){L.done?d(L.value):c(L.value).then(p,y)}E((s=s.apply(t,n||[])).next())})},hm=rt&&rt.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(ji,"__esModule",{value:!0}),ji.spawn=void 0;const Al=hm(Me),bm=vi,mm=xt,Zm=Oi,Xi=pt,Ii=nd,ic=ke,Vm=Al.default("threads:master:messages"),Xm=Al.default("threads:master:spawn"),ad=Al.default("threads:master:thread-utils"),Gm=t=>t&&t.type==="init",pm=t=>t&&t.type==="uncaughtError",ym=typeof process<"u"&&process.env.THREADS_WORKER_INIT_TIMEOUT?Number.parseInt(process.env.THREADS_WORKER_INIT_TIMEOUT,10):1e4;function Rm(t,n,o){return Dl(this,void 0,void 0,function*(){let s;const c=new Promise((h,p)=>{s=setTimeout(()=>p(Error(o)),n)}),d=yield Promise.race([t,c]);return clearTimeout(s),d})}function Wm(t){return new Promise((n,o)=>{const s=c=>{Vm("Message from worker before finishing initialization:",c.data),Gm(c.data)?(t.removeEventListener("message",s),n(c.data)):pm(c.data)&&(t.removeEventListener("message",s),o(mm.deserialize(c.data.error)))};t.addEventListener("message",s)})}function fm(t,n){return new bm.Observable(o=>{const s=d=>{const h={type:Ii.WorkerEventType.message,data:d.data};o.next(h)},c=d=>{ad("Unhandled promise rejection event in thread:",d);const h={type:Ii.WorkerEventType.internalError,error:Error(d.reason)};o.next(h)};t.addEventListener("message",s),t.addEventListener("unhandledrejection",c),n.then(()=>{const d={type:Ii.WorkerEventType.termination};t.removeEventListener("message",s),t.removeEventListener("unhandledrejection",c),o.next(d),o.complete()})})}function Sm(t){const[n,o]=Zm.createPromiseWithResolver();return{terminate:()=>Dl(this,void 0,void 0,function*(){ad("Terminating worker"),yield t.terminate(),o()}),termination:n}}function lc(t,n,o,s){const c=o.filter(d=>d.type===Ii.WorkerEventType.internalError).map(d=>d.error);return Object.assign(t,{[Xi.$errors]:c,[Xi.$events]:o,[Xi.$terminate]:s,[Xi.$worker]:n})}function Lm(t,n){return Dl(this,void 0,void 0,function*(){Xm("Initializing new thread");const o=n&&n.timeout?n.timeout:ym,s=(yield Rm(Wm(t),o,`Timeout: Did not receive an init message from worker after ${o}ms. Make sure the worker calls expose().`)).exposed,{termination:c,terminate:d}=Sm(t),h=fm(t,c);if(s.type==="function"){const p=ic.createProxyFunction(t);return lc(p,t,h,d)}else if(s.type==="module"){const p=ic.createProxyModule(t,s.methods);return lc(p,t,h,d)}else{const p=s.type;throw Error(`Worker init message states unexpected type of expose(): ${p}`)}})}ji.spawn=Lm,function(t){Object.defineProperty(t,"__esModule",{value:!0}),t.Worker=t.BlobWorker=t.isWorkerRuntime=t.Thread=t.spawn=t.Pool=void 0;const n=jt;Object.defineProperty(t,"isWorkerRuntime",{enumerable:!0,get:function(){return n.isWorkerRuntime}});var o=_c;Object.defineProperty(t,"Pool",{enumerable:!0,get:function(){return o.Pool}});var s=ji;Object.defineProperty(t,"spawn",{enumerable:!0,get:function(){return s.spawn}});var c=oi;Object.defineProperty(t,"Thread",{enumerable:!0,get:function(){return c.Thread}}),t.BlobWorker=n.getWorkerImplementation().blob,t.Worker=n.getWorkerImplementation().default}(Dc);var ud={},Fm=t=>t?typeof Symbol.observable=="symbol"&&typeof t[Symbol.observable]=="function"?t===t[Symbol.observable]():typeof t["@@observable"]=="function"?t===t["@@observable"]():!1:!1,_l={};Object.defineProperty(_l,"__esModule",{value:!0});const Im=function(){const t=typeof self<"u"&&typeof Window<"u"&&self instanceof Window;return!!(typeof self<"u"&&self.postMessage&&!t)},xm=function(t,n){self.postMessage(t,n)},Tm=function(t){const n=s=>{t(s.data)},o=()=>{self.removeEventListener("message",n)};return self.addEventListener("message",n),o};_l.default={isWorkerRuntime:Im,postMessageToMaster:xm,subscribeToMasterMessages:Tm},function(t){var n=rt&&rt.__awaiter||function(Vd,nf,rf,ef){function yt(oe){return oe instanceof rf?oe:new rf(function(sl){sl(oe)})}return new(rf||(rf=Promise))(function(oe,sl){function Zd(uf){try{df(ef.next(uf))}catch(cf){sl(cf)}}function af(uf){try{df(ef.throw(uf))}catch(cf){sl(cf)}}function df(uf){uf.done?oe(uf.value):yt(uf.value).then(Zd,af)}df((ef=ef.apply(Vd,nf||[])).next())})},o=rt&&rt.__importDefault||function(Vd){return Vd&&Vd.__esModule?Vd:{default:Vd}};Object.defineProperty(t,"__esModule",{value:!0}),t.expose=t.isWorkerRuntime=t.Transfer=t.registerSerializer=void 0;const s=o(Fm),c=xt,d=Ot,h=Ol,p=o(_l);var y=xt;Object.defineProperty(t,"registerSerializer",{enumerable:!0,get:function(){return y.registerSerializer}});var E=Ot;Object.defineProperty(t,"Transfer",{enumerable:!0,get:function(){return E.Transfer}}),t.isWorkerRuntime=p.default.isWorkerRuntime;let L=!1;const F=new Map,N=Vd=>Vd&&Vd.type===h.MasterMessageType.cancel,z=Vd=>Vd&&Vd.type===h.MasterMessageType.run,Z=Vd=>s.default(Vd)||H(Vd);function H(Vd){return Vd&&typeof Vd=="object"&&typeof Vd.subscribe=="function"}function nt(Vd){return d.isTransferDescriptor(Vd)?{payload:Vd.send,transferables:Vd.transferables}:{payload:Vd,transferables:void 0}}function lt(){const Vd={type:h.WorkerMessageType.init,exposed:{type:"function"}};p.default.postMessageToMaster(Vd)}function J(Vd){const nf={type:h.WorkerMessageType.init,exposed:{type:"module",methods:Vd}};p.default.postMessageToMaster(nf)}function mt(Vd,nf){const{payload:rf,transferables:ef}=nt(nf),yt={type:h.WorkerMessageType.error,uid:Vd,error:c.serialize(rf)};p.default.postMessageToMaster(yt,ef)}function pi(Vd,nf,rf){const{payload:ef,transferables:yt}=nt(rf),oe={type:h.WorkerMessageType.result,uid:Vd,complete:nf?!0:void 0,payload:ef};p.default.postMessageToMaster(oe,yt)}function Ai(Vd,nf){const rf={type:h.WorkerMessageType.running,uid:Vd,resultType:nf};p.default.postMessageToMaster(rf)}function md(Vd){try{const nf={type:h.WorkerMessageType.uncaughtError,error:c.serialize(Vd)};p.default.postMessageToMaster(nf)}catch(nf){console.error(`Not reporting uncaught error back to master thread as it occured while reporting an uncaught error already.
|
|
6052
6052
|
Latest error:`,nf,`
|
|
6053
|
-
Original error:`,Vd)}}function Gd(Vd,nf,rf){return n(this,void 0,void 0,function*(){let ef;try{ef=nf(...rf)}catch(oe){return mt(Vd,oe)}const yt=Z(ef)?"observable":"promise";if(Ai(Vd,yt),Z(ef)){const oe=ef.subscribe(sl=>pi(Vd,!1,c.serialize(sl)),sl=>{mt(Vd,c.serialize(sl)),F.delete(Vd)},()=>{pi(Vd,!0),F.delete(Vd)});F.set(Vd,oe)}else try{const oe=yield ef;pi(Vd,!0,c.serialize(oe))}catch(oe){mt(Vd,c.serialize(oe))}})}function Xd(Vd){if(!p.default.isWorkerRuntime())throw Error("expose() called in the master thread.");if(L)throw Error("expose() called more than once. This is not possible. Pass an object to expose() if you want to expose multiple functions.");if(L=!0,typeof Vd=="function")p.default.subscribeToMasterMessages(nf=>{z(nf)&&!nf.method&&Gd(nf.uid,Vd,nf.args.map(c.deserialize))}),lt();else if(typeof Vd=="object"&&Vd){p.default.subscribeToMasterMessages(rf=>{z(rf)&&rf.method&&Gd(rf.uid,Vd[rf.method],rf.args.map(c.deserialize))});const nf=Object.keys(Vd).filter(rf=>typeof Vd[rf]=="function");J(nf)}else throw Error(`Invalid argument passed to expose(). Expected a function or an object, got: ${Vd}`);p.default.subscribeToMasterMessages(nf=>{if(N(nf)){const rf=nf.uid,ef=F.get(rf);ef&&(ef.unsubscribe(),F.delete(rf))}})}t.expose=Xd,typeof self<"u"&&typeof self.addEventListener=="function"&&p.default.isWorkerRuntime()&&(self.addEventListener("error",Vd=>{setTimeout(()=>md(Vd.error||Vd),250)}),self.addEventListener("unhandledrejection",Vd=>{const nf=Vd.reason;nf&&typeof nf.message=="string"&&setTimeout(()=>md(nf),250)})),typeof process<"u"&&typeof process.on=="function"&&p.default.isWorkerRuntime()&&(process.on("uncaughtException",Vd=>{setTimeout(()=>md(Vd),250)}),process.on("unhandledRejection",Vd=>{Vd&&typeof Vd.message=="string"&&setTimeout(()=>md(Vd),250)}))}(ud),function(t){var n=rt&&rt.__createBinding||(Object.create?function(p,y,E,L){L===void 0&&(L=E),Object.defineProperty(p,L,{enumerable:!0,get:function(){return y[E]}})}:function(p,y,E,L){L===void 0&&(L=E),p[L]=y[E]}),o=rt&&rt.__exportStar||function(p,y){for(var E in p)E!=="default"&&!Object.prototype.hasOwnProperty.call(y,E)&&n(y,p,E)};Object.defineProperty(t,"__esModule",{value:!0}),t.Transfer=t.DefaultSerializer=t.expose=t.registerSerializer=void 0;var s=xt;Object.defineProperty(t,"registerSerializer",{enumerable:!0,get:function(){return s.registerSerializer}}),o(Dc,t);var c=ud;Object.defineProperty(t,"expose",{enumerable:!0,get:function(){return c.expose}});var d=Xe;Object.defineProperty(t,"DefaultSerializer",{enumerable:!0,get:function(){return d.DefaultSerializer}});var h=Ot;Object.defineProperty(t,"Transfer",{enumerable:!0,get:function(){return h.Transfer}})}(jc);const de=Cr(jc);de.registerSerializer;const Um=de.spawn;de.BlobWorker,de.DefaultSerializer;const Ym=de.Pool;de.Thread;const Jm=de.Transfer;de.Worker;const rd="dmFyIHgwPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgTzA9KFgsayxudCk9PmsgaW4gWD94MChYLGsse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOm50fSk6WFtrXT1udDt2YXIgdj0oWCxrLG50KT0+KE8wKFgsdHlwZW9mIGshPSJzeW1ib2wiP2srIiI6ayxudCksbnQpLGFyPShYLGssbnQpPT57aWYoIWsuaGFzKFgpKXRocm93IFR5cGVFcnJvcigiQ2Fubm90ICIrbnQpfTt2YXIgYz0oWCxrLG50KT0+KGFyKFgsaywicmVhZCBmcm9tIHByaXZhdGUgZmllbGQiKSxudD9udC5jYWxsKFgpOmsuZ2V0KFgpKSxVPShYLGssbnQpPT57aWYoay5oYXMoWCkpdGhyb3cgVHlwZUVycm9yKCJDYW5ub3QgYWRkIHRoZSBzYW1lIHByaXZhdGUgbWVtYmVyIG1vcmUgdGhhbiBvbmNlIik7ayBpbnN0YW5jZW9mIFdlYWtTZXQ/ay5hZGQoWCk6ay5zZXQoWCxudCl9LEM9KFgsayxudCxFZSk9PihhcihYLGssIndyaXRlIHRvIHByaXZhdGUgZmllbGQiKSxFZT9FZS5jYWxsKFgsbnQpOmsuc2V0KFgsbnQpLG50KSx5bj0oWCxrLG50LEVlKT0+KHtzZXQgXyh3dCl7QyhYLGssd3QsbnQpfSxnZXQgXygpe3JldHVybiBjKFgsayxFZSl9fSksdz0oWCxrLG50KT0+KGFyKFgsaywiYWNjZXNzIHByaXZhdGUgbWV0aG9kIiksbnQpOyhmdW5jdGlvbigpe3ZhciBIaSxGZSxJdCxSdCxOdCxNdCxJZSx1dCxDdCxhdCx0dCxMLF90LHh0LEV0LGh0LHZ0LGZ0LER0LEx0LE90LFB0LEp0LHB0LCRlLHVyLGhlLEh0LFZlLGJ0LEVuLHFpLGZlLE5lLHplLCR0LHRlLFZ0LGVlLFdlLGNyLFIwLE1lLEFuLENlLFRuLFksZXQsWGUsaHIsbGUscWU7InVzZSBzdHJpY3QiO3ZhciBYPXR5cGVvZiBnbG9iYWxUaGlzPCJ1Ij9nbG9iYWxUaGlzOnR5cGVvZiB3aW5kb3c8InUiP3dpbmRvdzp0eXBlb2YgZ2xvYmFsPCJ1Ij9nbG9iYWw6dHlwZW9mIHNlbGY8InUiP3NlbGY6e307ZnVuY3Rpb24gayh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwiZGVmYXVsdCIpP3QuZGVmYXVsdDp0fXZhciBudD17fSxFZT10PT50P3R5cGVvZiBTeW1ib2wub2JzZXJ2YWJsZT09InN5bWJvbCImJnR5cGVvZiB0W1N5bWJvbC5vYnNlcnZhYmxlXT09ImZ1bmN0aW9uIj90PT09dFtTeW1ib2wub2JzZXJ2YWJsZV0oKTp0eXBlb2YgdFsiQEBvYnNlcnZhYmxlIl09PSJmdW5jdGlvbiI/dD09PXRbIkBAb2JzZXJ2YWJsZSJdKCk6ITE6ITEsd3Q9e30sX2U9e307T2JqZWN0LmRlZmluZVByb3BlcnR5KF9lLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxfZS5EZWZhdWx0U2VyaWFsaXplcj1fZS5leHRlbmRTZXJpYWxpemVyPXZvaWQgMDtmdW5jdGlvbiBraSh0LGUpe2NvbnN0IG49dC5kZXNlcmlhbGl6ZS5iaW5kKHQpLHI9dC5zZXJpYWxpemUuYmluZCh0KTtyZXR1cm57ZGVzZXJpYWxpemUoaSl7cmV0dXJuIGUuZGVzZXJpYWxpemUoaSxuKX0sc2VyaWFsaXplKGkpe3JldHVybiBlLnNlcmlhbGl6ZShpLHIpfX19X2UuZXh0ZW5kU2VyaWFsaXplcj1raTtjb25zdCBmcj17ZGVzZXJpYWxpemUodCl7cmV0dXJuIE9iamVjdC5hc3NpZ24oRXJyb3IodC5tZXNzYWdlKSx7bmFtZTp0Lm5hbWUsc3RhY2s6dC5zdGFja30pfSxzZXJpYWxpemUodCl7cmV0dXJue19fZXJyb3JfbWFya2VyOiIkJGVycm9yIixtZXNzYWdlOnQubWVzc2FnZSxuYW1lOnQubmFtZSxzdGFjazp0LnN0YWNrfX19LFlpPXQ9PnQmJnR5cGVvZiB0PT0ib2JqZWN0IiYmIl9fZXJyb3JfbWFya2VyImluIHQmJnQuX19lcnJvcl9tYXJrZXI9PT0iJCRlcnJvciI7X2UuRGVmYXVsdFNlcmlhbGl6ZXI9e2Rlc2VyaWFsaXplKHQpe3JldHVybiBZaSh0KT9mci5kZXNlcmlhbGl6ZSh0KTp0fSxzZXJpYWxpemUodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBFcnJvcj9mci5zZXJpYWxpemUodCk6dH19LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3dCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksd3Quc2VyaWFsaXplPXd0LmRlc2VyaWFsaXplPXd0LnJlZ2lzdGVyU2VyaWFsaXplcj12b2lkIDA7Y29uc3QgbHI9X2U7bGV0IGtlPWxyLkRlZmF1bHRTZXJpYWxpemVyO2Z1bmN0aW9uIEtpKHQpe2tlPWxyLmV4dGVuZFNlcmlhbGl6ZXIoa2UsdCl9d3QucmVnaXN0ZXJTZXJpYWxpemVyPUtpO2Z1bmN0aW9uIFppKHQpe3JldHVybiBrZS5kZXNlcmlhbGl6ZSh0KX13dC5kZXNlcmlhbGl6ZT1aaTtmdW5jdGlvbiBRaSh0KXtyZXR1cm4ga2Uuc2VyaWFsaXplKHQpfXd0LnNlcmlhbGl6ZT1RaTt2YXIgbmU9e30sU3Q9e307T2JqZWN0LmRlZmluZVByb3BlcnR5KFN0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxTdC4kd29ya2VyPVN0LiR0cmFuc2ZlcmFibGU9U3QuJHRlcm1pbmF0ZT1TdC4kZXZlbnRzPVN0LiRlcnJvcnM9dm9pZCAwLFN0LiRlcnJvcnM9U3ltYm9sKCJ0aHJlYWQuZXJyb3JzIiksU3QuJGV2ZW50cz1TeW1ib2woInRocmVhZC5ldmVudHMiKSxTdC4kdGVybWluYXRlPVN5bWJvbCgidGhyZWFkLnRlcm1pbmF0ZSIpLFN0LiR0cmFuc2ZlcmFibGU9U3ltYm9sKCJ0aHJlYWQudHJhbnNmZXJhYmxlIiksU3QuJHdvcmtlcj1TeW1ib2woInRocmVhZC53b3JrZXIiKSxPYmplY3QuZGVmaW5lUHJvcGVydHkobmUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLG5lLlRyYW5zZmVyPW5lLmlzVHJhbnNmZXJEZXNjcmlwdG9yPXZvaWQgMDtjb25zdCBkcj1TdDtmdW5jdGlvbiBKaSh0KXtyZXR1cm4hKCF0fHx0eXBlb2YgdCE9Im9iamVjdCIpfWZ1bmN0aW9uIHRvKHQpe3JldHVybiB0JiZ0eXBlb2YgdD09Im9iamVjdCImJnRbZHIuJHRyYW5zZmVyYWJsZV19bmUuaXNUcmFuc2ZlckRlc2NyaXB0b3I9dG87ZnVuY3Rpb24gZW8odCxlKXtpZighZSl7aWYoIUppKHQpKXRocm93IEVycm9yKCk7ZT1bdF19cmV0dXJue1tkci4kdHJhbnNmZXJhYmxlXTohMCxzZW5kOnQsdHJhbnNmZXJhYmxlczplfX1uZS5UcmFuc2Zlcj1lbzt2YXIgRXI9e307KGZ1bmN0aW9uKHQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0Lldvcmtlck1lc3NhZ2VUeXBlPXQuTWFzdGVyTWVzc2FnZVR5cGU9dm9pZCAwLGZ1bmN0aW9uKGUpe2UuY2FuY2VsPSJjYW5jZWwiLGUucnVuPSJydW4ifSh0Lk1hc3Rlck1lc3NhZ2VUeXBlfHwodC5NYXN0ZXJNZXNzYWdlVHlwZT17fSkpLGZ1bmN0aW9uKGUpe2UuZXJyb3I9ImVycm9yIixlLmluaXQ9ImluaXQiLGUucmVzdWx0PSJyZXN1bHQiLGUucnVubmluZz0icnVubmluZyIsZS51bmNhdWdodEVycm9yPSJ1bmNhdWdodEVycm9yIn0odC5Xb3JrZXJNZXNzYWdlVHlwZXx8KHQuV29ya2VyTWVzc2FnZVR5cGU9e30pKX0pKEVyKTt2YXIgUm49e307T2JqZWN0LmRlZmluZVByb3BlcnR5KFJuLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtjb25zdCBubz1mdW5jdGlvbigpe2NvbnN0IGU9dHlwZW9mIHNlbGY8InUiJiZ0eXBlb2YgV2luZG93PCJ1IiYmc2VsZiBpbnN0YW5jZW9mIFdpbmRvdztyZXR1cm4hISh0eXBlb2Ygc2VsZjwidSImJnNlbGYucG9zdE1lc3NhZ2UmJiFlKX0scm89ZnVuY3Rpb24oZSxuKXtzZWxmLnBvc3RNZXNzYWdlKGUsbil9LGlvPWZ1bmN0aW9uKGUpe2NvbnN0IG49aT0+e2UoaS5kYXRhKX0scj0oKT0+e3NlbGYucmVtb3ZlRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsbil9O3JldHVybiBzZWxmLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLG4pLHJ9O1JuLmRlZmF1bHQ9e2lzV29ya2VyUnVudGltZTpubyxwb3N0TWVzc2FnZVRvTWFzdGVyOnJvLHN1YnNjcmliZVRvTWFzdGVyTWVzc2FnZXM6aW99LGZ1bmN0aW9uKHQpe3ZhciBlPVgmJlguX19hd2FpdGVyfHxmdW5jdGlvbihULEIsJCxEKXtmdW5jdGlvbiB5dChvdCl7cmV0dXJuIG90IGluc3RhbmNlb2YgJD9vdDpuZXcgJChmdW5jdGlvbihndCl7Z3Qob3QpfSl9cmV0dXJuIG5ldygkfHwoJD1Qcm9taXNlKSkoZnVuY3Rpb24ob3QsZ3Qpe2Z1bmN0aW9uIF9uKGRlKXt0cnl7SGUoRC5uZXh0KGRlKSl9Y2F0Y2goc3Ipe2d0KHNyKX19ZnVuY3Rpb24gcG4oZGUpe3RyeXtIZShELnRocm93KGRlKSl9Y2F0Y2goc3Ipe2d0KHNyKX19ZnVuY3Rpb24gSGUoZGUpe2RlLmRvbmU/b3QoZGUudmFsdWUpOnl0KGRlLnZhbHVlKS50aGVuKF9uLHBuKX1IZSgoRD1ELmFwcGx5KFQsQnx8W10pKS5uZXh0KCkpfSl9LG49WCYmWC5fX2ltcG9ydERlZmF1bHR8fGZ1bmN0aW9uKFQpe3JldHVybiBUJiZULl9fZXNNb2R1bGU/VDp7ZGVmYXVsdDpUfX07T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuZXhwb3NlPXQuaXNXb3JrZXJSdW50aW1lPXQuVHJhbnNmZXI9dC5yZWdpc3RlclNlcmlhbGl6ZXI9dm9pZCAwO2NvbnN0IHI9bihFZSksaT13dCxvPW5lLHM9RXIsdT1uKFJuKTt2YXIgYT13dDtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwicmVnaXN0ZXJTZXJpYWxpemVyIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYS5yZWdpc3RlclNlcmlhbGl6ZXJ9fSk7dmFyIGw9bmU7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIlRyYW5zZmVyIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbC5UcmFuc2Zlcn19KSx0LmlzV29ya2VyUnVudGltZT11LmRlZmF1bHQuaXNXb3JrZXJSdW50aW1lO2xldCBkPSExO2NvbnN0IF89bmV3IE1hcCxPPVQ9PlQmJlQudHlwZT09PXMuTWFzdGVyTWVzc2FnZVR5cGUuY2FuY2VsLGI9VD0+VCYmVC50eXBlPT09cy5NYXN0ZXJNZXNzYWdlVHlwZS5ydW4sRj1UPT5yLmRlZmF1bHQoVCl8fFMoVCk7ZnVuY3Rpb24gUyhUKXtyZXR1cm4gVCYmdHlwZW9mIFQ9PSJvYmplY3QiJiZ0eXBlb2YgVC5zdWJzY3JpYmU9PSJmdW5jdGlvbiJ9ZnVuY3Rpb24gTihUKXtyZXR1cm4gby5pc1RyYW5zZmVyRGVzY3JpcHRvcihUKT97cGF5bG9hZDpULnNlbmQsdHJhbnNmZXJhYmxlczpULnRyYW5zZmVyYWJsZXN9OntwYXlsb2FkOlQsdHJhbnNmZXJhYmxlczp2b2lkIDB9fWZ1bmN0aW9uIGcoKXtjb25zdCBUPXt0eXBlOnMuV29ya2VyTWVzc2FnZVR5cGUuaW5pdCxleHBvc2VkOnt0eXBlOiJmdW5jdGlvbiJ9fTt1LmRlZmF1bHQucG9zdE1lc3NhZ2VUb01hc3RlcihUKX1mdW5jdGlvbiBHKFQpe2NvbnN0IEI9e3R5cGU6cy5Xb3JrZXJNZXNzYWdlVHlwZS5pbml0LGV4cG9zZWQ6e3R5cGU6Im1vZHVsZSIsbWV0aG9kczpUfX07dS5kZWZhdWx0LnBvc3RNZXNzYWdlVG9NYXN0ZXIoQil9ZnVuY3Rpb24gSyhULEIpe2NvbnN0e3BheWxvYWQ6JCx0cmFuc2ZlcmFibGVzOkR9PU4oQikseXQ9e3R5cGU6cy5Xb3JrZXJNZXNzYWdlVHlwZS5lcnJvcix1aWQ6VCxlcnJvcjppLnNlcmlhbGl6ZSgkKX07dS5kZWZhdWx0LnBvc3RNZXNzYWdlVG9NYXN0ZXIoeXQsRCl9ZnVuY3Rpb24gVihULEIsJCl7Y29uc3R7cGF5bG9hZDpELHRyYW5zZmVyYWJsZXM6eXR9PU4oJCksb3Q9e3R5cGU6cy5Xb3JrZXJNZXNzYWdlVHlwZS5yZXN1bHQsdWlkOlQsY29tcGxldGU6Qj8hMDp2b2lkIDAscGF5bG9hZDpEfTt1LmRlZmF1bHQucG9zdE1lc3NhZ2VUb01hc3RlcihvdCx5dCl9ZnVuY3Rpb24gaXQoVCxCKXtjb25zdCAkPXt0eXBlOnMuV29ya2VyTWVzc2FnZVR5cGUucnVubmluZyx1aWQ6VCxyZXN1bHRUeXBlOkJ9O3UuZGVmYXVsdC5wb3N0TWVzc2FnZVRvTWFzdGVyKCQpfWZ1bmN0aW9uIGx0KFQpe3RyeXtjb25zdCBCPXt0eXBlOnMuV29ya2VyTWVzc2FnZVR5cGUudW5jYXVnaHRFcnJvcixlcnJvcjppLnNlcmlhbGl6ZShUKX07dS5kZWZhdWx0LnBvc3RNZXNzYWdlVG9NYXN0ZXIoQil9Y2F0Y2goQil7Y29uc29sZS5lcnJvcihgTm90IHJlcG9ydGluZyB1bmNhdWdodCBlcnJvciBiYWNrIHRvIG1hc3RlciB0aHJlYWQgYXMgaXQgb2NjdXJlZCB3aGlsZSByZXBvcnRpbmcgYW4gdW5jYXVnaHQgZXJyb3IgYWxyZWFkeS4KTGF0ZXN0IGVycm9yOmAsQixgCk9yaWdpbmFsIGVycm9yOmAsVCl9fWZ1bmN0aW9uIHJ0KFQsQiwkKXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24qKCl7bGV0IEQ7dHJ5e0Q9QiguLi4kKX1jYXRjaChvdCl7cmV0dXJuIEsoVCxvdCl9Y29uc3QgeXQ9RihEKT8ib2JzZXJ2YWJsZSI6InByb21pc2UiO2lmKGl0KFQseXQpLEYoRCkpe2NvbnN0IG90PUQuc3Vic2NyaWJlKGd0PT5WKFQsITEsaS5zZXJpYWxpemUoZ3QpKSxndD0+e0soVCxpLnNlcmlhbGl6ZShndCkpLF8uZGVsZXRlKFQpfSwoKT0+e1YoVCwhMCksXy5kZWxldGUoVCl9KTtfLnNldChULG90KX1lbHNlIHRyeXtjb25zdCBvdD15aWVsZCBEO1YoVCwhMCxpLnNlcmlhbGl6ZShvdCkpfWNhdGNoKG90KXtLKFQsaS5zZXJpYWxpemUob3QpKX19KX1mdW5jdGlvbiBCdChUKXtpZighdS5kZWZhdWx0LmlzV29ya2VyUnVudGltZSgpKXRocm93IEVycm9yKCJleHBvc2UoKSBjYWxsZWQgaW4gdGhlIG1hc3RlciB0aHJlYWQuIik7aWYoZCl0aHJvdyBFcnJvcigiZXhwb3NlKCkgY2FsbGVkIG1vcmUgdGhhbiBvbmNlLiBUaGlzIGlzIG5vdCBwb3NzaWJsZS4gUGFzcyBhbiBvYmplY3QgdG8gZXhwb3NlKCkgaWYgeW91IHdhbnQgdG8gZXhwb3NlIG11bHRpcGxlIGZ1bmN0aW9ucy4iKTtpZihkPSEwLHR5cGVvZiBUPT0iZnVuY3Rpb24iKXUuZGVmYXVsdC5zdWJzY3JpYmVUb01hc3Rlck1lc3NhZ2VzKEI9PntiKEIpJiYhQi5tZXRob2QmJnJ0KEIudWlkLFQsQi5hcmdzLm1hcChpLmRlc2VyaWFsaXplKSl9KSxnKCk7ZWxzZSBpZih0eXBlb2YgVD09Im9iamVjdCImJlQpe3UuZGVmYXVsdC5zdWJzY3JpYmVUb01hc3Rlck1lc3NhZ2VzKCQ9PntiKCQpJiYkLm1ldGhvZCYmcnQoJC51aWQsVFskLm1ldGhvZF0sJC5hcmdzLm1hcChpLmRlc2VyaWFsaXplKSl9KTtjb25zdCBCPU9iamVjdC5rZXlzKFQpLmZpbHRlcigkPT50eXBlb2YgVFskXT09ImZ1bmN0aW9uIik7RyhCKX1lbHNlIHRocm93IEVycm9yKGBJbnZhbGlkIGFyZ3VtZW50IHBhc3NlZCB0byBleHBvc2UoKS4gRXhwZWN0ZWQgYSBmdW5jdGlvbiBvciBhbiBvYmplY3QsIGdvdDogJHtUfWApO3UuZGVmYXVsdC5zdWJzY3JpYmVUb01hc3Rlck1lc3NhZ2VzKEI9PntpZihPKEIpKXtjb25zdCAkPUIudWlkLEQ9Xy5nZXQoJCk7RCYmKEQudW5zdWJzY3JpYmUoKSxfLmRlbGV0ZSgkKSl9fSl9dC5leHBvc2U9QnQsdHlwZW9mIHNlbGY8InUiJiZ0eXBlb2Ygc2VsZi5hZGRFdmVudExpc3RlbmVyPT0iZnVuY3Rpb24iJiZ1LmRlZmF1bHQuaXNXb3JrZXJSdW50aW1lKCkmJihzZWxmLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixUPT57c2V0VGltZW91dCgoKT0+bHQoVC5lcnJvcnx8VCksMjUwKX0pLHNlbGYuYWRkRXZlbnRMaXN0ZW5lcigidW5oYW5kbGVkcmVqZWN0aW9uIixUPT57Y29uc3QgQj1ULnJlYXNvbjtCJiZ0eXBlb2YgQi5tZXNzYWdlPT0ic3RyaW5nIiYmc2V0VGltZW91dCgoKT0+bHQoQiksMjUwKX0pKSx0eXBlb2YgcHJvY2VzczwidSImJnR5cGVvZiBwcm9jZXNzLm9uPT0iZnVuY3Rpb24iJiZ1LmRlZmF1bHQuaXNXb3JrZXJSdW50aW1lKCkmJihwcm9jZXNzLm9uKCJ1bmNhdWdodEV4Y2VwdGlvbiIsVD0+e3NldFRpbWVvdXQoKCk9Pmx0KFQpLDI1MCl9KSxwcm9jZXNzLm9uKCJ1bmhhbmRsZWRSZWplY3Rpb24iLFQ9PntUJiZ0eXBlb2YgVC5tZXNzYWdlPT0ic3RyaW5nIiYmc2V0VGltZW91dCgoKT0+bHQoVCksMjUwKX0pKX0obnQpO3ZhciB4bj1rKG50KTtjb25zdCBvbz14bi5leHBvc2U7eG4ucmVnaXN0ZXJTZXJpYWxpemVyLHhuLlRyYW5zZmVyO2Z1bmN0aW9uIG0odCxlKXtyZXR1cm4gdD8/ZX1tLkVNUFRZX09CSkVDVD1PYmplY3QuZnJlZXplKHt9KTtmdW5jdGlvbiBwKHQpe3JldHVybiB0IT1udWxsfWZ1bmN0aW9uIHgodCl7dGhpcy5uYW1lPSJEZXZlbG9wZXJFcnJvciIsdGhpcy5tZXNzYWdlPXQ7bGV0IGU7dHJ5e3Rocm93IG5ldyBFcnJvcn1jYXRjaChuKXtlPW4uc3RhY2t9dGhpcy5zdGFjaz1lfXAoT2JqZWN0LmNyZWF0ZSkmJih4LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSkseC5wcm90b3R5cGUuY29uc3RydWN0b3I9eCkseC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtsZXQgdD1gJHt0aGlzLm5hbWV9OiAke3RoaXMubWVzc2FnZX1gO3JldHVybiBwKHRoaXMuc3RhY2spJiYodCs9YAoke3RoaXMuc3RhY2sudG9TdHJpbmcoKX1gKSx0fSx4LnRocm93SW5zdGFudGlhdGlvbkVycm9yPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IHgoIlRoaXMgZnVuY3Rpb24gZGVmaW5lcyBhbiBpbnRlcmZhY2UgYW5kIHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5LiIpfTtjb25zdCBzdD17fTtzdC50eXBlT2Y9e307ZnVuY3Rpb24gc28odCl7cmV0dXJuYCR7dH0gaXMgcmVxdWlyZWQsIGFjdHVhbCB2YWx1ZSB3YXMgdW5kZWZpbmVkYH1mdW5jdGlvbiBwZSh0LGUsbil7cmV0dXJuYEV4cGVjdGVkICR7bn0gdG8gYmUgdHlwZW9mICR7ZX0sIGFjdHVhbCB0eXBlb2Ygd2FzICR7dH1gfXN0LmRlZmluZWQ9ZnVuY3Rpb24odCxlKXtpZighcChlKSl0aHJvdyBuZXcgeChzbyh0KSl9LHN0LnR5cGVPZi5mdW5jPWZ1bmN0aW9uKHQsZSl7aWYodHlwZW9mIGUhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IHgocGUodHlwZW9mIGUsImZ1bmN0aW9uIix0KSl9LHN0LnR5cGVPZi5zdHJpbmc9ZnVuY3Rpb24odCxlKXtpZih0eXBlb2YgZSE9InN0cmluZyIpdGhyb3cgbmV3IHgocGUodHlwZW9mIGUsInN0cmluZyIsdCkpfSxzdC50eXBlT2YubnVtYmVyPWZ1bmN0aW9uKHQsZSl7aWYodHlwZW9mIGUhPSJudW1iZXIiKXRocm93IG5ldyB4KHBlKHR5cGVvZiBlLCJudW1iZXIiLHQpKX0sc3QudHlwZU9mLm51bWJlci5sZXNzVGhhbj1mdW5jdGlvbih0LGUsbil7aWYoc3QudHlwZU9mLm51bWJlcih0LGUpLGU+PW4pdGhyb3cgbmV3IHgoYEV4cGVjdGVkICR7dH0gdG8gYmUgbGVzcyB0aGFuICR7bn0sIGFjdHVhbCB2YWx1ZSB3YXMgJHtlfWApfSxzdC50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHM9ZnVuY3Rpb24odCxlLG4pe2lmKHN0LnR5cGVPZi5udW1iZXIodCxlKSxlPm4pdGhyb3cgbmV3IHgoYEV4cGVjdGVkICR7dH0gdG8gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICR7bn0sIGFjdHVhbCB2YWx1ZSB3YXMgJHtlfWApfSxzdC50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuPWZ1bmN0aW9uKHQsZSxuKXtpZihzdC50eXBlT2YubnVtYmVyKHQsZSksZTw9bil0aHJvdyBuZXcgeChgRXhwZWN0ZWQgJHt0fSB0byBiZSBncmVhdGVyIHRoYW4gJHtufSwgYWN0dWFsIHZhbHVlIHdhcyAke2V9YCl9LHN0LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscz1mdW5jdGlvbih0LGUsbil7aWYoc3QudHlwZU9mLm51bWJlcih0LGUpLGU8bil0aHJvdyBuZXcgeChgRXhwZWN0ZWQgJHt0fSB0byBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJHtufSwgYWN0dWFsIHZhbHVlIHdhcyAke2V9YCl9LHN0LnR5cGVPZi5vYmplY3Q9ZnVuY3Rpb24odCxlKXtpZih0eXBlb2YgZSE9Im9iamVjdCIpdGhyb3cgbmV3IHgocGUodHlwZW9mIGUsIm9iamVjdCIsdCkpfSxzdC50eXBlT2YuYm9vbD1mdW5jdGlvbih0LGUpe2lmKHR5cGVvZiBlIT0iYm9vbGVhbiIpdGhyb3cgbmV3IHgocGUodHlwZW9mIGUsImJvb2xlYW4iLHQpKX0sc3QudHlwZU9mLmJpZ2ludD1mdW5jdGlvbih0LGUpe2lmKHR5cGVvZiBlIT0iYmlnaW50Iil0aHJvdyBuZXcgeChwZSh0eXBlb2YgZSwiYmlnaW50Iix0KSl9LHN0LnR5cGVPZi5udW1iZXIuZXF1YWxzPWZ1bmN0aW9uKHQsZSxuLHIpe2lmKHN0LnR5cGVPZi5udW1iZXIodCxuKSxzdC50eXBlT2YubnVtYmVyKGUsciksbiE9PXIpdGhyb3cgbmV3IHgoYCR7dH0gbXVzdCBiZSBlcXVhbCB0byAke2V9LCB0aGUgYWN0dWFsIHZhbHVlcyBhcmUgJHtufSBhbmQgJHtyfWApfTt2YXIgaD1zdCx6dD1mdW5jdGlvbih0KXt0PT1udWxsJiYodD1uZXcgRGF0ZSgpLmdldFRpbWUoKSksdGhpcy5OPTYyNCx0aGlzLk09Mzk3LHRoaXMuTUFUUklYX0E9MjU2NzQ4MzYxNSx0aGlzLlVQUEVSX01BU0s9MjE0NzQ4MzY0OCx0aGlzLkxPV0VSX01BU0s9MjE0NzQ4MzY0Nyx0aGlzLm10PW5ldyBBcnJheSh0aGlzLk4pLHRoaXMubXRpPXRoaXMuTisxLHQuY29uc3RydWN0b3I9PUFycmF5P3RoaXMuaW5pdF9ieV9hcnJheSh0LHQubGVuZ3RoKTp0aGlzLmluaXRfc2VlZCh0KX07enQucHJvdG90eXBlLmluaXRfc2VlZD1mdW5jdGlvbih0KXtmb3IodGhpcy5tdFswXT10Pj4+MCx0aGlzLm10aT0xO3RoaXMubXRpPHRoaXMuTjt0aGlzLm10aSsrKXt2YXIgdD10aGlzLm10W3RoaXMubXRpLTFdXnRoaXMubXRbdGhpcy5tdGktMV0+Pj4zMDt0aGlzLm10W3RoaXMubXRpXT0oKCh0JjQyOTQ5MDE3NjApPj4+MTYpKjE4MTI0MzMyNTM8PDE2KSsodCY2NTUzNSkqMTgxMjQzMzI1Myt0aGlzLm10aSx0aGlzLm10W3RoaXMubXRpXT4+Pj0wfX0senQucHJvdG90eXBlLmluaXRfYnlfYXJyYXk9ZnVuY3Rpb24odCxlKXt2YXIgbixyLGk7Zm9yKHRoaXMuaW5pdF9zZWVkKDE5NjUwMjE4KSxuPTEscj0wLGk9dGhpcy5OPmU/dGhpcy5OOmU7aTtpLS0pe3ZhciBvPXRoaXMubXRbbi0xXV50aGlzLm10W24tMV0+Pj4zMDt0aGlzLm10W25dPSh0aGlzLm10W25dXigoKG8mNDI5NDkwMTc2MCk+Pj4xNikqMTY2NDUyNTw8MTYpKyhvJjY1NTM1KSoxNjY0NTI1KSt0W3JdK3IsdGhpcy5tdFtuXT4+Pj0wLG4rKyxyKyssbj49dGhpcy5OJiYodGhpcy5tdFswXT10aGlzLm10W3RoaXMuTi0xXSxuPTEpLHI+PWUmJihyPTApfWZvcihpPXRoaXMuTi0xO2k7aS0tKXt2YXIgbz10aGlzLm10W24tMV1edGhpcy5tdFtuLTFdPj4+MzA7dGhpcy5tdFtuXT0odGhpcy5tdFtuXV4oKChvJjQyOTQ5MDE3NjApPj4+MTYpKjE1NjYwODM5NDE8PDE2KSsobyY2NTUzNSkqMTU2NjA4Mzk0MSktbix0aGlzLm10W25dPj4+PTAsbisrLG4+PXRoaXMuTiYmKHRoaXMubXRbMF09dGhpcy5tdFt0aGlzLk4tMV0sbj0xKX10aGlzLm10WzBdPTIxNDc0ODM2NDh9LHp0LnByb3RvdHlwZS5yYW5kb21faW50PWZ1bmN0aW9uKCl7dmFyIHQsZT1uZXcgQXJyYXkoMCx0aGlzLk1BVFJJWF9BKTtpZih0aGlzLm10aT49dGhpcy5OKXt2YXIgbjtmb3IodGhpcy5tdGk9PXRoaXMuTisxJiZ0aGlzLmluaXRfc2VlZCg1NDg5KSxuPTA7bjx0aGlzLk4tdGhpcy5NO24rKyl0PXRoaXMubXRbbl0mdGhpcy5VUFBFUl9NQVNLfHRoaXMubXRbbisxXSZ0aGlzLkxPV0VSX01BU0ssdGhpcy5tdFtuXT10aGlzLm10W24rdGhpcy5NXV50Pj4+MV5lW3QmMV07Zm9yKDtuPHRoaXMuTi0xO24rKyl0PXRoaXMubXRbbl0mdGhpcy5VUFBFUl9NQVNLfHRoaXMubXRbbisxXSZ0aGlzLkxPV0VSX01BU0ssdGhpcy5tdFtuXT10aGlzLm10W24rKHRoaXMuTS10aGlzLk4pXV50Pj4+MV5lW3QmMV07dD10aGlzLm10W3RoaXMuTi0xXSZ0aGlzLlVQUEVSX01BU0t8dGhpcy5tdFswXSZ0aGlzLkxPV0VSX01BU0ssdGhpcy5tdFt0aGlzLk4tMV09dGhpcy5tdFt0aGlzLk0tMV1edD4+PjFeZVt0JjFdLHRoaXMubXRpPTB9cmV0dXJuIHQ9dGhpcy5tdFt0aGlzLm10aSsrXSx0Xj10Pj4+MTEsdF49dDw8NyYyNjM2OTI4NjQwLHRePXQ8PDE1JjQwMjI3MzA3NTIsdF49dD4+PjE4LHQ+Pj4wfSx6dC5wcm90b3R5cGUucmFuZG9tX2ludDMxPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmFuZG9tX2ludCgpPj4+MX0senQucHJvdG90eXBlLnJhbmRvbV9pbmNsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmFuZG9tX2ludCgpKigxLzQyOTQ5NjcyOTUpfSx6dC5wcm90b3R5cGUucmFuZG9tPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmFuZG9tX2ludCgpKigxLzQyOTQ5NjcyOTYpfSx6dC5wcm90b3R5cGUucmFuZG9tX2V4Y2w9ZnVuY3Rpb24oKXtyZXR1cm4odGhpcy5yYW5kb21faW50KCkrLjUpKigxLzQyOTQ5NjcyOTYpfSx6dC5wcm90b3R5cGUucmFuZG9tX2xvbmc9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnJhbmRvbV9pbnQoKT4+PjUsZT10aGlzLnJhbmRvbV9pbnQoKT4+PjY7cmV0dXJuKHQqNjcxMDg4NjQrZSkqKDEvOTAwNzE5OTI1NDc0MDk5Mil9O3ZhciBfcj16dDtjb25zdCB5PXt9O3kuRVBTSUxPTjE9LjEseS5FUFNJTE9OMj0uMDEseS5FUFNJTE9OMz0uMDAxLHkuRVBTSUxPTjQ9MWUtNCx5LkVQU0lMT041PTFlLTUseS5FUFNJTE9ONj0xZS02LHkuRVBTSUxPTjc9MWUtNyx5LkVQU0lMT044PTFlLTgseS5FUFNJTE9OOT0xZS05LHkuRVBTSUxPTjEwPTFlLTEwLHkuRVBTSUxPTjExPTFlLTExLHkuRVBTSUxPTjEyPTFlLTEyLHkuRVBTSUxPTjEzPTFlLTEzLHkuRVBTSUxPTjE0PTFlLTE0LHkuRVBTSUxPTjE1PTFlLTE1LHkuRVBTSUxPTjE2PTFlLTE2LHkuRVBTSUxPTjE3PTFlLTE3LHkuRVBTSUxPTjE4PTFlLTE4LHkuRVBTSUxPTjE5PTFlLTE5LHkuRVBTSUxPTjIwPTFlLTIwLHkuRVBTSUxPTjIxPTFlLTIxLHkuR1JBVklUQVRJT05BTFBBUkFNRVRFUj0zOTg2MDA0NDE4ZTUseS5TT0xBUl9SQURJVVM9Njk1NWU1LHkuTFVOQVJfUkFESVVTPTE3Mzc0MDAseS5TSVhUWV9GT1VSX0tJTE9CWVRFUz02NCoxMDI0LHkuRk9VUl9HSUdBQllURVM9NCoxMDI0KjEwMjQqMTAyNCx5LnNpZ249bShNYXRoLnNpZ24sZnVuY3Rpb24oZSl7cmV0dXJuIGU9K2UsZT09PTB8fGUhPT1lP2U6ZT4wPzE6LTF9KSx5LnNpZ25Ob3RaZXJvPWZ1bmN0aW9uKHQpe3JldHVybiB0PDA/LTE6MX0seS50b1NOb3JtPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGU9bShlLDI1NSksTWF0aC5yb3VuZCgoeS5jbGFtcCh0LC0xLDEpKi41Ky41KSplKX0seS5mcm9tU05vcm09ZnVuY3Rpb24odCxlKXtyZXR1cm4gZT1tKGUsMjU1KSx5LmNsYW1wKHQsMCxlKS9lKjItMX0seS5ub3JtYWxpemU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBuPU1hdGgubWF4KG4tZSwwKSxuPT09MD8wOnkuY2xhbXAoKHQtZSkvbiwwLDEpfSx5LnNpbmg9bShNYXRoLnNpbmgsZnVuY3Rpb24oZSl7cmV0dXJuKE1hdGguZXhwKGUpLU1hdGguZXhwKC1lKSkvMn0pLHkuY29zaD1tKE1hdGguY29zaCxmdW5jdGlvbihlKXtyZXR1cm4oTWF0aC5leHAoZSkrTWF0aC5leHAoLWUpKS8yfSkseS5sZXJwPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4oMS1uKSp0K24qZX0seS5QST1NYXRoLlBJLHkuT05FX09WRVJfUEk9MS9NYXRoLlBJLHkuUElfT1ZFUl9UV089TWF0aC5QSS8yLHkuUElfT1ZFUl9USFJFRT1NYXRoLlBJLzMseS5QSV9PVkVSX0ZPVVI9TWF0aC5QSS80LHkuUElfT1ZFUl9TSVg9TWF0aC5QSS82LHkuVEhSRUVfUElfT1ZFUl9UV089MypNYXRoLlBJLzIseS5UV09fUEk9MipNYXRoLlBJLHkuT05FX09WRVJfVFdPX1BJPTEvKDIqTWF0aC5QSSkseS5SQURJQU5TX1BFUl9ERUdSRUU9TWF0aC5QSS8xODAseS5ERUdSRUVTX1BFUl9SQURJQU49MTgwL01hdGguUEkseS5SQURJQU5TX1BFUl9BUkNTRUNPTkQ9eS5SQURJQU5TX1BFUl9ERUdSRUUvMzYwMCx5LnRvUmFkaWFucz1mdW5jdGlvbih0KXtpZighcCh0KSl0aHJvdyBuZXcgeCgiZGVncmVlcyBpcyByZXF1aXJlZC4iKTtyZXR1cm4gdCp5LlJBRElBTlNfUEVSX0RFR1JFRX0seS50b0RlZ3JlZXM9ZnVuY3Rpb24odCl7aWYoIXAodCkpdGhyb3cgbmV3IHgoInJhZGlhbnMgaXMgcmVxdWlyZWQuIik7cmV0dXJuIHQqeS5ERUdSRUVTX1BFUl9SQURJQU59LHkuY29udmVydExvbmdpdHVkZVJhbmdlPWZ1bmN0aW9uKHQpe2lmKCFwKHQpKXRocm93IG5ldyB4KCJhbmdsZSBpcyByZXF1aXJlZC4iKTtjb25zdCBlPXkuVFdPX1BJLG49dC1NYXRoLmZsb29yKHQvZSkqZTtyZXR1cm4gbjwtTWF0aC5QST9uK2U6bj49TWF0aC5QST9uLWU6bn0seS5jbGFtcFRvTGF0aXR1ZGVSYW5nZT1mdW5jdGlvbih0KXtpZighcCh0KSl0aHJvdyBuZXcgeCgiYW5nbGUgaXMgcmVxdWlyZWQuIik7cmV0dXJuIHkuY2xhbXAodCwtMSp5LlBJX09WRVJfVFdPLHkuUElfT1ZFUl9UV08pfSx5Lm5lZ2F0aXZlUGlUb1BpPWZ1bmN0aW9uKHQpe2lmKCFwKHQpKXRocm93IG5ldyB4KCJhbmdsZSBpcyByZXF1aXJlZC4iKTtyZXR1cm4gdD49LXkuUEkmJnQ8PXkuUEk/dDp5Lnplcm9Ub1R3b1BpKHQreS5QSSkteS5QSX0seS56ZXJvVG9Ud29QaT1mdW5jdGlvbih0KXtpZighcCh0KSl0aHJvdyBuZXcgeCgiYW5nbGUgaXMgcmVxdWlyZWQuIik7aWYodD49MCYmdDw9eS5UV09fUEkpcmV0dXJuIHQ7Y29uc3QgZT15Lm1vZCh0LHkuVFdPX1BJKTtyZXR1cm4gTWF0aC5hYnMoZSk8eS5FUFNJTE9OMTQmJk1hdGguYWJzKHQpPnkuRVBTSUxPTjE0P3kuVFdPX1BJOmV9LHkubW9kPWZ1bmN0aW9uKHQsZSl7aWYoIXAodCkpdGhyb3cgbmV3IHgoIm0gaXMgcmVxdWlyZWQuIik7aWYoIXAoZSkpdGhyb3cgbmV3IHgoIm4gaXMgcmVxdWlyZWQuIik7aWYoZT09PTApdGhyb3cgbmV3IHgoImRpdmlzb3IgY2Fubm90IGJlIDAuIik7cmV0dXJuIHkuc2lnbih0KT09PXkuc2lnbihlKSYmTWF0aC5hYnModCk8TWF0aC5hYnMoZSk/dDoodCVlK2UpJWV9LHkuZXF1YWxzRXBzaWxvbj1mdW5jdGlvbih0LGUsbixyKXtpZighcCh0KSl0aHJvdyBuZXcgeCgibGVmdCBpcyByZXF1aXJlZC4iKTtpZighcChlKSl0aHJvdyBuZXcgeCgicmlnaHQgaXMgcmVxdWlyZWQuIik7bj1tKG4sMCkscj1tKHIsbik7Y29uc3QgaT1NYXRoLmFicyh0LWUpO3JldHVybiBpPD1yfHxpPD1uKk1hdGgubWF4KE1hdGguYWJzKHQpLE1hdGguYWJzKGUpKX0seS5sZXNzVGhhbj1mdW5jdGlvbih0LGUsbil7aWYoIXAodCkpdGhyb3cgbmV3IHgoImZpcnN0IGlzIHJlcXVpcmVkLiIpO2lmKCFwKGUpKXRocm93IG5ldyB4KCJzZWNvbmQgaXMgcmVxdWlyZWQuIik7aWYoIXAobikpdGhyb3cgbmV3IHgoImFic29sdXRlRXBzaWxvbiBpcyByZXF1aXJlZC4iKTtyZXR1cm4gdC1lPC1ufSx5Lmxlc3NUaGFuT3JFcXVhbHM9ZnVuY3Rpb24odCxlLG4pe2lmKCFwKHQpKXRocm93IG5ldyB4KCJmaXJzdCBpcyByZXF1aXJlZC4iKTtpZighcChlKSl0aHJvdyBuZXcgeCgic2Vjb25kIGlzIHJlcXVpcmVkLiIpO2lmKCFwKG4pKXRocm93IG5ldyB4KCJhYnNvbHV0ZUVwc2lsb24gaXMgcmVxdWlyZWQuIik7cmV0dXJuIHQtZTxufSx5LmdyZWF0ZXJUaGFuPWZ1bmN0aW9uKHQsZSxuKXtpZighcCh0KSl0aHJvdyBuZXcgeCgiZmlyc3QgaXMgcmVxdWlyZWQuIik7aWYoIXAoZSkpdGhyb3cgbmV3IHgoInNlY29uZCBpcyByZXF1aXJlZC4iKTtpZighcChuKSl0aHJvdyBuZXcgeCgiYWJzb2x1dGVFcHNpbG9uIGlzIHJlcXVpcmVkLiIpO3JldHVybiB0LWU+bn0seS5ncmVhdGVyVGhhbk9yRXF1YWxzPWZ1bmN0aW9uKHQsZSxuKXtpZighcCh0KSl0aHJvdyBuZXcgeCgiZmlyc3QgaXMgcmVxdWlyZWQuIik7aWYoIXAoZSkpdGhyb3cgbmV3IHgoInNlY29uZCBpcyByZXF1aXJlZC4iKTtpZighcChuKSl0aHJvdyBuZXcgeCgiYWJzb2x1dGVFcHNpbG9uIGlzIHJlcXVpcmVkLiIpO3JldHVybiB0LWU+LW59O2NvbnN0IFllPVsxXTt5LmZhY3RvcmlhbD1mdW5jdGlvbih0KXtpZih0eXBlb2YgdCE9Im51bWJlciJ8fHQ8MCl0aHJvdyBuZXcgeCgiQSBudW1iZXIgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAgaXMgcmVxdWlyZWQuIik7Y29uc3QgZT1ZZS5sZW5ndGg7aWYodD49ZSl7bGV0IG49WWVbZS0xXTtmb3IobGV0IHI9ZTtyPD10O3IrKyl7Y29uc3QgaT1uKnI7WWUucHVzaChpKSxuPWl9fXJldHVybiBZZVt0XX0seS5pbmNyZW1lbnRXcmFwPWZ1bmN0aW9uKHQsZSxuKXtpZihuPW0obiwwKSwhcCh0KSl0aHJvdyBuZXcgeCgibiBpcyByZXF1aXJlZC4iKTtpZihlPD1uKXRocm93IG5ldyB4KCJtYXhpbXVtVmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gbWluaW11bVZhbHVlLiIpO3JldHVybisrdCx0PmUmJih0PW4pLHR9LHkuaXNQb3dlck9mVHdvPWZ1bmN0aW9uKHQpe2lmKHR5cGVvZiB0IT0ibnVtYmVyInx8dDwwfHx0PjQyOTQ5NjcyOTUpdGhyb3cgbmV3IHgoIkEgbnVtYmVyIGJldHdlZW4gMCBhbmQgKDJeMzIpLTEgaXMgcmVxdWlyZWQuIik7cmV0dXJuIHQhPT0wJiYodCZ0LTEpPT09MH0seS5uZXh0UG93ZXJPZlR3bz1mdW5jdGlvbih0KXtpZih0eXBlb2YgdCE9Im51bWJlciJ8fHQ8MHx8dD4yMTQ3NDgzNjQ4KXRocm93IG5ldyB4KCJBIG51bWJlciBiZXR3ZWVuIDAgYW5kIDJeMzEgaXMgcmVxdWlyZWQuIik7cmV0dXJuLS10LHR8PXQ+PjEsdHw9dD4+Mix0fD10Pj40LHR8PXQ+PjgsdHw9dD4+MTYsKyt0LHR9LHkucHJldmlvdXNQb3dlck9mVHdvPWZ1bmN0aW9uKHQpe2lmKHR5cGVvZiB0IT0ibnVtYmVyInx8dDwwfHx0PjQyOTQ5NjcyOTUpdGhyb3cgbmV3IHgoIkEgbnVtYmVyIGJldHdlZW4gMCBhbmQgKDJeMzIpLTEgaXMgcmVxdWlyZWQuIik7cmV0dXJuIHR8PXQ+PjEsdHw9dD4+Mix0fD10Pj40LHR8PXQ+PjgsdHw9dD4+MTYsdHw9dD4+MzIsdD0odD4+PjApLSh0Pj4+MSksdH0seS5jbGFtcD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGgudHlwZU9mLm51bWJlcigidmFsdWUiLHQpLGgudHlwZU9mLm51bWJlcigibWluIixlKSxoLnR5cGVPZi5udW1iZXIoIm1heCIsbiksdDxlP2U6dD5uP246dH07bGV0IHByPW5ldyBfcjt5LnNldFJhbmRvbU51bWJlclNlZWQ9ZnVuY3Rpb24odCl7aWYoIXAodCkpdGhyb3cgbmV3IHgoInNlZWQgaXMgcmVxdWlyZWQuIik7cHI9bmV3IF9yKHQpfSx5Lm5leHRSYW5kb21OdW1iZXI9ZnVuY3Rpb24oKXtyZXR1cm4gcHIucmFuZG9tKCl9LHkucmFuZG9tQmV0d2Vlbj1mdW5jdGlvbih0LGUpe3JldHVybiB5Lm5leHRSYW5kb21OdW1iZXIoKSooZS10KSt0fSx5LmFjb3NDbGFtcGVkPWZ1bmN0aW9uKHQpe2lmKCFwKHQpKXRocm93IG5ldyB4KCJ2YWx1ZSBpcyByZXF1aXJlZC4iKTtyZXR1cm4gTWF0aC5hY29zKHkuY2xhbXAodCwtMSwxKSl9LHkuYXNpbkNsYW1wZWQ9ZnVuY3Rpb24odCl7aWYoIXAodCkpdGhyb3cgbmV3IHgoInZhbHVlIGlzIHJlcXVpcmVkLiIpO3JldHVybiBNYXRoLmFzaW4oeS5jbGFtcCh0LC0xLDEpKX0seS5jaG9yZExlbmd0aD1mdW5jdGlvbih0LGUpe2lmKCFwKHQpKXRocm93IG5ldyB4KCJhbmdsZSBpcyByZXF1aXJlZC4iKTtpZighcChlKSl0aHJvdyBuZXcgeCgicmFkaXVzIGlzIHJlcXVpcmVkLiIpO3JldHVybiAyKmUqTWF0aC5zaW4odCouNSl9LHkubG9nQmFzZT1mdW5jdGlvbih0LGUpe2lmKCFwKHQpKXRocm93IG5ldyB4KCJudW1iZXIgaXMgcmVxdWlyZWQuIik7aWYoIXAoZSkpdGhyb3cgbmV3IHgoImJhc2UgaXMgcmVxdWlyZWQuIik7cmV0dXJuIE1hdGgubG9nKHQpL01hdGgubG9nKGUpfSx5LmNicnQ9bShNYXRoLmNicnQsZnVuY3Rpb24oZSl7Y29uc3Qgbj1NYXRoLnBvdyhNYXRoLmFicyhlKSwuMzMzMzMzMzMzMzMzMzMzMyk7cmV0dXJuIGU8MD8tbjpufSkseS5sb2cyPW0oTWF0aC5sb2cyLGZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLmxvZyhlKSpNYXRoLkxPRzJFfSkseS5mb2c9ZnVuY3Rpb24odCxlKXtjb25zdCBuPXQqZTtyZXR1cm4gMS1NYXRoLmV4cCgtKG4qbikpfSx5LmZhc3RBcHByb3hpbWF0ZUF0YW49ZnVuY3Rpb24odCl7cmV0dXJuIGgudHlwZU9mLm51bWJlcigieCIsdCksdCooLS4xNzg0Kk1hdGguYWJzKHQpLS4wNjYzKnQqdCsxLjAzMDEpfSx5LmZhc3RBcHByb3hpbWF0ZUF0YW4yPWZ1bmN0aW9uKHQsZSl7aC50eXBlT2YubnVtYmVyKCJ4Iix0KSxoLnR5cGVPZi5udW1iZXIoInkiLGUpO2xldCBuLHI9TWF0aC5hYnModCk7bj1NYXRoLmFicyhlKTtjb25zdCBpPU1hdGgubWF4KHIsbik7bj1NYXRoLm1pbihyLG4pO2NvbnN0IG89bi9pO2lmKGlzTmFOKG8pKXRocm93IG5ldyB4KCJlaXRoZXIgeCBvciB5IG11c3QgYmUgbm9uemVybyIpO3JldHVybiByPXkuZmFzdEFwcHJveGltYXRlQXRhbihvKSxyPU1hdGguYWJzKGUpPk1hdGguYWJzKHQpP3kuUElfT1ZFUl9UV08tcjpyLHI9dDwwP3kuUEktcjpyLHI9ZTwwPy1yOnIscn07dmFyIFI9eTtmdW5jdGlvbiBBKHQsZSl7dGhpcy54PW0odCwwKSx0aGlzLnk9bShlLDApfUEuZnJvbUVsZW1lbnRzPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gcChuKT8obi54PXQsbi55PWUsbik6bmV3IEEodCxlKX0sQS5jbG9uZT1mdW5jdGlvbih0LGUpe2lmKHAodCkpcmV0dXJuIHAoZSk/KGUueD10LngsZS55PXQueSxlKTpuZXcgQSh0LngsdC55KX0sQS5mcm9tQ2FydGVzaWFuMz1BLmNsb25lLEEuZnJvbUNhcnRlc2lhbjQ9QS5jbG9uZSxBLnBhY2tlZExlbmd0aD0yLEEucGFjaz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgidmFsdWUiLHQpLGguZGVmaW5lZCgiYXJyYXkiLGUpLG49bShuLDApLGVbbisrXT10LngsZVtuXT10LnksZX0sQS51bnBhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBoLmRlZmluZWQoImFycmF5Iix0KSxlPW0oZSwwKSxwKG4pfHwobj1uZXcgQSksbi54PXRbZSsrXSxuLnk9dFtlXSxufSxBLnBhY2tBcnJheT1mdW5jdGlvbih0LGUpe2guZGVmaW5lZCgiYXJyYXkiLHQpO2NvbnN0IG49dC5sZW5ndGgscj1uKjI7aWYoIXAoZSkpZT1uZXcgQXJyYXkocik7ZWxzZXtpZighQXJyYXkuaXNBcnJheShlKSYmZS5sZW5ndGghPT1yKXRocm93IG5ldyB4KCJJZiByZXN1bHQgaXMgYSB0eXBlZCBhcnJheSwgaXQgbXVzdCBoYXZlIGV4YWN0bHkgYXJyYXkubGVuZ3RoICogMiBlbGVtZW50cyIpO2UubGVuZ3RoIT09ciYmKGUubGVuZ3RoPXIpfWZvcihsZXQgaT0wO2k8bjsrK2kpQS5wYWNrKHRbaV0sZSxpKjIpO3JldHVybiBlfSxBLnVucGFja0FycmF5PWZ1bmN0aW9uKHQsZSl7aWYoaC5kZWZpbmVkKCJhcnJheSIsdCksaC50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoImFycmF5Lmxlbmd0aCIsdC5sZW5ndGgsMiksdC5sZW5ndGglMiE9PTApdGhyb3cgbmV3IHgoImFycmF5IGxlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMi4iKTtjb25zdCBuPXQubGVuZ3RoO3AoZSk/ZS5sZW5ndGg9bi8yOmU9bmV3IEFycmF5KG4vMik7Zm9yKGxldCByPTA7cjxuO3IrPTIpe2NvbnN0IGk9ci8yO2VbaV09QS51bnBhY2sodCxyLGVbaV0pfXJldHVybiBlfSxBLmZyb21BcnJheT1BLnVucGFjayxBLm1heGltdW1Db21wb25lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSxNYXRoLm1heCh0LngsdC55KX0sQS5taW5pbXVtQ29tcG9uZW50PWZ1bmN0aW9uKHQpe3JldHVybiBoLnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCksTWF0aC5taW4odC54LHQueSl9LEEubWluaW11bUJ5Q29tcG9uZW50PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJmaXJzdCIsdCksaC50eXBlT2Yub2JqZWN0KCJzZWNvbmQiLGUpLGgudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9TWF0aC5taW4odC54LGUueCksbi55PU1hdGgubWluKHQueSxlLnkpLG59LEEubWF4aW11bUJ5Q29tcG9uZW50PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJmaXJzdCIsdCksaC50eXBlT2Yub2JqZWN0KCJzZWNvbmQiLGUpLGgudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9TWF0aC5tYXgodC54LGUueCksbi55PU1hdGgubWF4KHQueSxlLnkpLG59LEEuY2xhbXA9ZnVuY3Rpb24odCxlLG4scil7aC50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsdCksaC50eXBlT2Yub2JqZWN0KCJtaW4iLGUpLGgudHlwZU9mLm9iamVjdCgibWF4IixuKSxoLnR5cGVPZi5vYmplY3QoInJlc3VsdCIscik7Y29uc3QgaT1SLmNsYW1wKHQueCxlLngsbi54KSxvPVIuY2xhbXAodC55LGUueSxuLnkpO3JldHVybiByLng9aSxyLnk9byxyfSxBLm1hZ25pdHVkZVNxdWFyZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSx0LngqdC54K3QueSp0Lnl9LEEubWFnbml0dWRlPWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnNxcnQoQS5tYWduaXR1ZGVTcXVhcmVkKHQpKX07Y29uc3QgS2U9bmV3IEE7QS5kaXN0YW5jZT1mdW5jdGlvbih0LGUpe3JldHVybiBoLnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLGgudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLEEuc3VidHJhY3QodCxlLEtlKSxBLm1hZ25pdHVkZShLZSl9LEEuZGlzdGFuY2VTcXVhcmVkPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgibGVmdCIsdCksaC50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksQS5zdWJ0cmFjdCh0LGUsS2UpLEEubWFnbml0dWRlU3F1YXJlZChLZSl9LEEubm9ybWFsaXplPWZ1bmN0aW9uKHQsZSl7aC50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLGgudHlwZU9mLm9iamVjdCgicmVzdWx0IixlKTtjb25zdCBuPUEubWFnbml0dWRlKHQpO2lmKGUueD10LngvbixlLnk9dC55L24saXNOYU4oZS54KXx8aXNOYU4oZS55KSl0aHJvdyBuZXcgeCgibm9ybWFsaXplZCByZXN1bHQgaXMgbm90IGEgbnVtYmVyIik7cmV0dXJuIGV9LEEuZG90PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgibGVmdCIsdCksaC50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksdC54KmUueCt0LnkqZS55fSxBLmNyb3NzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgibGVmdCIsdCksaC50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksdC54KmUueS10LnkqZS54fSxBLm11bHRpcGx5Q29tcG9uZW50cz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgibGVmdCIsdCksaC50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngqZS54LG4ueT10LnkqZS55LG59LEEuZGl2aWRlQ29tcG9uZW50cz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgibGVmdCIsdCksaC50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngvZS54LG4ueT10LnkvZS55LG59LEEuYWRkPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSxoLnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSxoLnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PXQueCtlLngsbi55PXQueStlLnksbn0sQS5zdWJ0cmFjdD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgibGVmdCIsdCksaC50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngtZS54LG4ueT10LnktZS55LG59LEEubXVsdGlwbHlCeVNjYWxhcj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSxoLnR5cGVPZi5udW1iZXIoInNjYWxhciIsZSksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngqZSxuLnk9dC55KmUsbn0sQS5kaXZpZGVCeVNjYWxhcj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSxoLnR5cGVPZi5udW1iZXIoInNjYWxhciIsZSksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngvZSxuLnk9dC55L2Usbn0sQS5uZWdhdGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLGgudHlwZU9mLm9iamVjdCgicmVzdWx0IixlKSxlLng9LXQueCxlLnk9LXQueSxlfSxBLmFicz1mdW5jdGlvbih0LGUpe3JldHVybiBoLnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpLGUueD1NYXRoLmFicyh0LngpLGUueT1NYXRoLmFicyh0LnkpLGV9O2NvbnN0IHlyPW5ldyBBO0EubGVycD1mdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJzdGFydCIsdCksaC50eXBlT2Yub2JqZWN0KCJlbmQiLGUpLGgudHlwZU9mLm51bWJlcigidCIsbiksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLHIpLEEubXVsdGlwbHlCeVNjYWxhcihlLG4seXIpLHI9QS5tdWx0aXBseUJ5U2NhbGFyKHQsMS1uLHIpLEEuYWRkKHlyLHIscil9O2NvbnN0IEFyPW5ldyBBLFRyPW5ldyBBO0EuYW5nbGVCZXR3ZWVuPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgibGVmdCIsdCksaC50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksQS5ub3JtYWxpemUodCxBciksQS5ub3JtYWxpemUoZSxUciksUi5hY29zQ2xhbXBlZChBLmRvdChBcixUcikpfTtjb25zdCBhbz1uZXcgQTtBLm1vc3RPcnRob2dvbmFsQXhpcz1mdW5jdGlvbih0LGUpe2gudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSxoLnR5cGVPZi5vYmplY3QoInJlc3VsdCIsZSk7Y29uc3Qgbj1BLm5vcm1hbGl6ZSh0LGFvKTtyZXR1cm4gQS5hYnMobixuKSxuLng8PW4ueT9lPUEuY2xvbmUoQS5VTklUX1gsZSk6ZT1BLmNsb25lKEEuVU5JVF9ZLGUpLGV9LEEuZXF1YWxzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PT1lfHxwKHQpJiZwKGUpJiZ0Lng9PT1lLngmJnQueT09PWUueX0sQS5lcXVhbHNBcnJheT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQueD09PWVbbl0mJnQueT09PWVbbisxXX0sQS5lcXVhbHNFcHNpbG9uPWZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiB0PT09ZXx8cCh0KSYmcChlKSYmUi5lcXVhbHNFcHNpbG9uKHQueCxlLngsbixyKSYmUi5lcXVhbHNFcHNpbG9uKHQueSxlLnksbixyKX0sQS5aRVJPPU9iamVjdC5mcmVlemUobmV3IEEoMCwwKSksQS5PTkU9T2JqZWN0LmZyZWV6ZShuZXcgQSgxLDEpKSxBLlVOSVRfWD1PYmplY3QuZnJlZXplKG5ldyBBKDEsMCkpLEEuVU5JVF9ZPU9iamVjdC5mcmVlemUobmV3IEEoMCwxKSksQS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24odCl7cmV0dXJuIEEuY2xvbmUodGhpcyx0KX0sQS5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe3JldHVybiBBLmVxdWFscyh0aGlzLHQpfSxBLnByb3RvdHlwZS5lcXVhbHNFcHNpbG9uPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gQS5lcXVhbHNFcHNpbG9uKHRoaXMsdCxlLG4pfSxBLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybmAoJHt0aGlzLnh9LCAke3RoaXMueX0pYH07ZnVuY3Rpb24gZih0LGUsbil7dGhpcy54PW0odCwwKSx0aGlzLnk9bShlLDApLHRoaXMuej1tKG4sMCl9Zi5mcm9tU3BoZXJpY2FsPWZ1bmN0aW9uKHQsZSl7aC50eXBlT2Yub2JqZWN0KCJzcGhlcmljYWwiLHQpLHAoZSl8fChlPW5ldyBmKTtjb25zdCBuPXQuY2xvY2sscj10LmNvbmUsaT1tKHQubWFnbml0dWRlLDEpLG89aSpNYXRoLnNpbihyKTtyZXR1cm4gZS54PW8qTWF0aC5jb3MobiksZS55PW8qTWF0aC5zaW4obiksZS56PWkqTWF0aC5jb3MociksZX0sZi5mcm9tRWxlbWVudHM9ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIHAocik/KHIueD10LHIueT1lLHIuej1uLHIpOm5ldyBmKHQsZSxuKX0sZi5jbG9uZT1mdW5jdGlvbih0LGUpe2lmKHAodCkpcmV0dXJuIHAoZSk/KGUueD10LngsZS55PXQueSxlLno9dC56LGUpOm5ldyBmKHQueCx0LnksdC56KX0sZi5mcm9tQ2FydGVzaWFuND1mLmNsb25lLGYucGFja2VkTGVuZ3RoPTMsZi5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsdCksaC5kZWZpbmVkKCJhcnJheSIsZSksbj1tKG4sMCksZVtuKytdPXQueCxlW24rK109dC55LGVbbl09dC56LGV9LGYudW5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC5kZWZpbmVkKCJhcnJheSIsdCksZT1tKGUsMCkscChuKXx8KG49bmV3IGYpLG4ueD10W2UrK10sbi55PXRbZSsrXSxuLno9dFtlXSxufSxmLnBhY2tBcnJheT1mdW5jdGlvbih0LGUpe2guZGVmaW5lZCgiYXJyYXkiLHQpO2NvbnN0IG49dC5sZW5ndGgscj1uKjM7aWYoIXAoZSkpZT1uZXcgQXJyYXkocik7ZWxzZXtpZighQXJyYXkuaXNBcnJheShlKSYmZS5sZW5ndGghPT1yKXRocm93IG5ldyB4KCJJZiByZXN1bHQgaXMgYSB0eXBlZCBhcnJheSwgaXQgbXVzdCBoYXZlIGV4YWN0bHkgYXJyYXkubGVuZ3RoICogMyBlbGVtZW50cyIpO2UubGVuZ3RoIT09ciYmKGUubGVuZ3RoPXIpfWZvcihsZXQgaT0wO2k8bjsrK2kpZi5wYWNrKHRbaV0sZSxpKjMpO3JldHVybiBlfSxmLnVucGFja0FycmF5PWZ1bmN0aW9uKHQsZSl7aWYoaC5kZWZpbmVkKCJhcnJheSIsdCksaC50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoImFycmF5Lmxlbmd0aCIsdC5sZW5ndGgsMyksdC5sZW5ndGglMyE9PTApdGhyb3cgbmV3IHgoImFycmF5IGxlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMy4iKTtjb25zdCBuPXQubGVuZ3RoO3AoZSk/ZS5sZW5ndGg9bi8zOmU9bmV3IEFycmF5KG4vMyk7Zm9yKGxldCByPTA7cjxuO3IrPTMpe2NvbnN0IGk9ci8zO2VbaV09Zi51bnBhY2sodCxyLGVbaV0pfXJldHVybiBlfSxmLmZyb21BcnJheT1mLnVucGFjayxmLm1heGltdW1Db21wb25lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSxNYXRoLm1heCh0LngsdC55LHQueil9LGYubWluaW11bUNvbXBvbmVudD1mdW5jdGlvbih0KXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLE1hdGgubWluKHQueCx0LnksdC56KX0sZi5taW5pbXVtQnlDb21wb25lbnQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBoLnR5cGVPZi5vYmplY3QoImZpcnN0Iix0KSxoLnR5cGVPZi5vYmplY3QoInNlY29uZCIsZSksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD1NYXRoLm1pbih0LngsZS54KSxuLnk9TWF0aC5taW4odC55LGUueSksbi56PU1hdGgubWluKHQueixlLnopLG59LGYubWF4aW11bUJ5Q29tcG9uZW50PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJmaXJzdCIsdCksaC50eXBlT2Yub2JqZWN0KCJzZWNvbmQiLGUpLGgudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9TWF0aC5tYXgodC54LGUueCksbi55PU1hdGgubWF4KHQueSxlLnkpLG4uej1NYXRoLm1heCh0LnosZS56KSxufSxmLmNsYW1wPWZ1bmN0aW9uKHQsZSxuLHIpe2gudHlwZU9mLm9iamVjdCgidmFsdWUiLHQpLGgudHlwZU9mLm9iamVjdCgibWluIixlKSxoLnR5cGVPZi5vYmplY3QoIm1heCIsbiksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLHIpO2NvbnN0IGk9Ui5jbGFtcCh0LngsZS54LG4ueCksbz1SLmNsYW1wKHQueSxlLnksbi55KSxzPVIuY2xhbXAodC56LGUueixuLnopO3JldHVybiByLng9aSxyLnk9byxyLno9cyxyfSxmLm1hZ25pdHVkZVNxdWFyZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSx0LngqdC54K3QueSp0LnkrdC56KnQuen0sZi5tYWduaXR1ZGU9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguc3FydChmLm1hZ25pdHVkZVNxdWFyZWQodCkpfTtjb25zdCBaZT1uZXcgZjtmLmRpc3RhbmNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgibGVmdCIsdCksaC50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksZi5zdWJ0cmFjdCh0LGUsWmUpLGYubWFnbml0dWRlKFplKX0sZi5kaXN0YW5jZVNxdWFyZWQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSxoLnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSxmLnN1YnRyYWN0KHQsZSxaZSksZi5tYWduaXR1ZGVTcXVhcmVkKFplKX0sZi5ub3JtYWxpemU9ZnVuY3Rpb24odCxlKXtoLnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpO2NvbnN0IG49Zi5tYWduaXR1ZGUodCk7aWYoZS54PXQueC9uLGUueT10LnkvbixlLno9dC56L24saXNOYU4oZS54KXx8aXNOYU4oZS55KXx8aXNOYU4oZS56KSl0aHJvdyBuZXcgeCgibm9ybWFsaXplZCByZXN1bHQgaXMgbm90IGEgbnVtYmVyIik7cmV0dXJuIGV9LGYuZG90PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgibGVmdCIsdCksaC50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksdC54KmUueCt0LnkqZS55K3QueiplLnp9LGYubXVsdGlwbHlDb21wb25lbnRzPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSxoLnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSxoLnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PXQueCplLngsbi55PXQueSplLnksbi56PXQueiplLnosbn0sZi5kaXZpZGVDb21wb25lbnRzPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSxoLnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSxoLnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PXQueC9lLngsbi55PXQueS9lLnksbi56PXQuei9lLnosbn0sZi5hZGQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBoLnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLGgudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLGgudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9dC54K2UueCxuLnk9dC55K2UueSxuLno9dC56K2UueixufSxmLnN1YnRyYWN0PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSxoLnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSxoLnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PXQueC1lLngsbi55PXQueS1lLnksbi56PXQuei1lLnosbn0sZi5tdWx0aXBseUJ5U2NhbGFyPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLGgudHlwZU9mLm51bWJlcigic2NhbGFyIixlKSxoLnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PXQueCplLG4ueT10LnkqZSxuLno9dC56KmUsbn0sZi5kaXZpZGVCeVNjYWxhcj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSxoLnR5cGVPZi5udW1iZXIoInNjYWxhciIsZSksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngvZSxuLnk9dC55L2Usbi56PXQuei9lLG59LGYubmVnYXRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSxoLnR5cGVPZi5vYmplY3QoInJlc3VsdCIsZSksZS54PS10LngsZS55PS10LnksZS56PS10LnosZX0sZi5hYnM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLGgudHlwZU9mLm9iamVjdCgicmVzdWx0IixlKSxlLng9TWF0aC5hYnModC54KSxlLnk9TWF0aC5hYnModC55KSxlLno9TWF0aC5hYnModC56KSxlfTtjb25zdCBScj1uZXcgZjtmLmxlcnA9ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgic3RhcnQiLHQpLGgudHlwZU9mLm9iamVjdCgiZW5kIixlKSxoLnR5cGVPZi5udW1iZXIoInQiLG4pLGgudHlwZU9mLm9iamVjdCgicmVzdWx0IixyKSxmLm11bHRpcGx5QnlTY2FsYXIoZSxuLFJyKSxyPWYubXVsdGlwbHlCeVNjYWxhcih0LDEtbixyKSxmLmFkZChScixyLHIpfTtjb25zdCBRZT1uZXcgZixPbj1uZXcgZjtmLmFuZ2xlQmV0d2Vlbj1mdW5jdGlvbih0LGUpe2gudHlwZU9mLm9iamVjdCgibGVmdCIsdCksaC50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksZi5ub3JtYWxpemUodCxRZSksZi5ub3JtYWxpemUoZSxPbik7Y29uc3Qgbj1mLmRvdChRZSxPbikscj1mLm1hZ25pdHVkZShmLmNyb3NzKFFlLE9uLFFlKSk7cmV0dXJuIE1hdGguYXRhbjIocixuKX07Y29uc3QgdW89bmV3IGY7Zi5tb3N0T3J0aG9nb25hbEF4aXM9ZnVuY3Rpb24odCxlKXtoLnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpO2NvbnN0IG49Zi5ub3JtYWxpemUodCx1byk7cmV0dXJuIGYuYWJzKG4sbiksbi54PD1uLnk/bi54PD1uLno/ZT1mLmNsb25lKGYuVU5JVF9YLGUpOmU9Zi5jbG9uZShmLlVOSVRfWixlKTpuLnk8PW4uej9lPWYuY2xvbmUoZi5VTklUX1ksZSk6ZT1mLmNsb25lKGYuVU5JVF9aLGUpLGV9LGYucHJvamVjdFZlY3Rvcj1mdW5jdGlvbih0LGUsbil7aC5kZWZpbmVkKCJhIix0KSxoLmRlZmluZWQoImIiLGUpLGguZGVmaW5lZCgicmVzdWx0IixuKTtjb25zdCByPWYuZG90KHQsZSkvZi5kb3QoZSxlKTtyZXR1cm4gZi5tdWx0aXBseUJ5U2NhbGFyKGUscixuKX0sZi5lcXVhbHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD09PWV8fHAodCkmJnAoZSkmJnQueD09PWUueCYmdC55PT09ZS55JiZ0Lno9PT1lLnp9LGYuZXF1YWxzQXJyYXk9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0Lng9PT1lW25dJiZ0Lnk9PT1lW24rMV0mJnQuej09PWVbbisyXX0sZi5lcXVhbHNFcHNpbG9uPWZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiB0PT09ZXx8cCh0KSYmcChlKSYmUi5lcXVhbHNFcHNpbG9uKHQueCxlLngsbixyKSYmUi5lcXVhbHNFcHNpbG9uKHQueSxlLnksbixyKSYmUi5lcXVhbHNFcHNpbG9uKHQueixlLnosbixyKX0sZi5jcm9zcz1mdW5jdGlvbih0LGUsbil7aC50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSxoLnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSxoLnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbik7Y29uc3Qgcj10LngsaT10Lnksbz10Lnoscz1lLngsdT1lLnksYT1lLnosbD1pKmEtbyp1LGQ9bypzLXIqYSxfPXIqdS1pKnM7cmV0dXJuIG4ueD1sLG4ueT1kLG4uej1fLG59LGYubWlkcG9pbnQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBoLnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLGgudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLGgudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9KHQueCtlLngpKi41LG4ueT0odC55K2UueSkqLjUsbi56PSh0LnorZS56KSouNSxufSxmLmZyb21EZWdyZWVzPWZ1bmN0aW9uKHQsZSxuLHIsaSl7cmV0dXJuIGgudHlwZU9mLm51bWJlcigibG9uZ2l0dWRlIix0KSxoLnR5cGVPZi5udW1iZXIoImxhdGl0dWRlIixlKSx0PVIudG9SYWRpYW5zKHQpLGU9Ui50b1JhZGlhbnMoZSksZi5mcm9tUmFkaWFucyh0LGUsbixyLGkpfTtsZXQgbXQ9bmV3IGYseWU9bmV3IGY7Y29uc3QgY289bmV3IGYoNjM3ODEzNyo2Mzc4MTM3LDYzNzgxMzcqNjM3ODEzNyw2MzU2NzUyMzE0MjQ1MTc5ZS05KjYzNTY3NTIzMTQyNDUxNzllLTkpO2YuZnJvbVJhZGlhbnM9ZnVuY3Rpb24odCxlLG4scixpKXtoLnR5cGVPZi5udW1iZXIoImxvbmdpdHVkZSIsdCksaC50eXBlT2YubnVtYmVyKCJsYXRpdHVkZSIsZSksbj1tKG4sMCk7Y29uc3Qgbz1wKHIpP3IucmFkaWlTcXVhcmVkOmNvLHM9TWF0aC5jb3MoZSk7bXQueD1zKk1hdGguY29zKHQpLG10Lnk9cypNYXRoLnNpbih0KSxtdC56PU1hdGguc2luKGUpLG10PWYubm9ybWFsaXplKG10LG10KSxmLm11bHRpcGx5Q29tcG9uZW50cyhvLG10LHllKTtjb25zdCB1PU1hdGguc3FydChmLmRvdChtdCx5ZSkpO3JldHVybiB5ZT1mLmRpdmlkZUJ5U2NhbGFyKHllLHUseWUpLG10PWYubXVsdGlwbHlCeVNjYWxhcihtdCxuLG10KSxwKGkpfHwoaT1uZXcgZiksZi5hZGQoeWUsbXQsaSl9LGYuZnJvbURlZ3JlZXNBcnJheT1mdW5jdGlvbih0LGUsbil7aWYoaC5kZWZpbmVkKCJjb29yZGluYXRlcyIsdCksdC5sZW5ndGg8Mnx8dC5sZW5ndGglMiE9PTApdGhyb3cgbmV3IHgoInRoZSBudW1iZXIgb2YgY29vcmRpbmF0ZXMgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDIgYW5kIGF0IGxlYXN0IDIiKTtjb25zdCByPXQubGVuZ3RoO3Aobik/bi5sZW5ndGg9ci8yOm49bmV3IEFycmF5KHIvMik7Zm9yKGxldCBpPTA7aTxyO2krPTIpe2NvbnN0IG89dFtpXSxzPXRbaSsxXSx1PWkvMjtuW3VdPWYuZnJvbURlZ3JlZXMobyxzLDAsZSxuW3VdKX1yZXR1cm4gbn0sZi5mcm9tUmFkaWFuc0FycmF5PWZ1bmN0aW9uKHQsZSxuKXtpZihoLmRlZmluZWQoImNvb3JkaW5hdGVzIix0KSx0Lmxlbmd0aDwyfHx0Lmxlbmd0aCUyIT09MCl0aHJvdyBuZXcgeCgidGhlIG51bWJlciBvZiBjb29yZGluYXRlcyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMiBhbmQgYXQgbGVhc3QgMiIpO2NvbnN0IHI9dC5sZW5ndGg7cChuKT9uLmxlbmd0aD1yLzI6bj1uZXcgQXJyYXkoci8yKTtmb3IobGV0IGk9MDtpPHI7aSs9Mil7Y29uc3Qgbz10W2ldLHM9dFtpKzFdLHU9aS8yO25bdV09Zi5mcm9tUmFkaWFucyhvLHMsMCxlLG5bdV0pfXJldHVybiBufSxmLmZyb21EZWdyZWVzQXJyYXlIZWlnaHRzPWZ1bmN0aW9uKHQsZSxuKXtpZihoLmRlZmluZWQoImNvb3JkaW5hdGVzIix0KSx0Lmxlbmd0aDwzfHx0Lmxlbmd0aCUzIT09MCl0aHJvdyBuZXcgeCgidGhlIG51bWJlciBvZiBjb29yZGluYXRlcyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMyBhbmQgYXQgbGVhc3QgMyIpO2NvbnN0IHI9dC5sZW5ndGg7cChuKT9uLmxlbmd0aD1yLzM6bj1uZXcgQXJyYXkoci8zKTtmb3IobGV0IGk9MDtpPHI7aSs9Myl7Y29uc3Qgbz10W2ldLHM9dFtpKzFdLHU9dFtpKzJdLGE9aS8zO25bYV09Zi5mcm9tRGVncmVlcyhvLHMsdSxlLG5bYV0pfXJldHVybiBufSxmLmZyb21SYWRpYW5zQXJyYXlIZWlnaHRzPWZ1bmN0aW9uKHQsZSxuKXtpZihoLmRlZmluZWQoImNvb3JkaW5hdGVzIix0KSx0Lmxlbmd0aDwzfHx0Lmxlbmd0aCUzIT09MCl0aHJvdyBuZXcgeCgidGhlIG51bWJlciBvZiBjb29yZGluYXRlcyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMyBhbmQgYXQgbGVhc3QgMyIpO2NvbnN0IHI9dC5sZW5ndGg7cChuKT9uLmxlbmd0aD1yLzM6bj1uZXcgQXJyYXkoci8zKTtmb3IobGV0IGk9MDtpPHI7aSs9Myl7Y29uc3Qgbz10W2ldLHM9dFtpKzFdLHU9dFtpKzJdLGE9aS8zO25bYV09Zi5mcm9tUmFkaWFucyhvLHMsdSxlLG5bYV0pfXJldHVybiBufSxmLlpFUk89T2JqZWN0LmZyZWV6ZShuZXcgZigwLDAsMCkpLGYuT05FPU9iamVjdC5mcmVlemUobmV3IGYoMSwxLDEpKSxmLlVOSVRfWD1PYmplY3QuZnJlZXplKG5ldyBmKDEsMCwwKSksZi5VTklUX1k9T2JqZWN0LmZyZWV6ZShuZXcgZigwLDEsMCkpLGYuVU5JVF9aPU9iamVjdC5mcmVlemUobmV3IGYoMCwwLDEpKSxmLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbih0KXtyZXR1cm4gZi5jbG9uZSh0aGlzLHQpfSxmLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7cmV0dXJuIGYuZXF1YWxzKHRoaXMsdCl9LGYucHJvdG90eXBlLmVxdWFsc0Vwc2lsb249ZnVuY3Rpb24odCxlLG4pe3JldHVybiBmLmVxdWFsc0Vwc2lsb24odGhpcyx0LGUsbil9LGYucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuYCgke3RoaXMueH0sICR7dGhpcy55fSwgJHt0aGlzLnp9KWB9O2NvbnN0IGhvPW5ldyBmLGZvPW5ldyBmO2Z1bmN0aW9uIHhyKHQsZSxuLHIsaSl7aWYoIXAodCkpdGhyb3cgbmV3IHgoImNhcnRlc2lhbiBpcyByZXF1aXJlZC4iKTtpZighcChlKSl0aHJvdyBuZXcgeCgib25lT3ZlclJhZGlpIGlzIHJlcXVpcmVkLiIpO2lmKCFwKG4pKXRocm93IG5ldyB4KCJvbmVPdmVyUmFkaWlTcXVhcmVkIGlzIHJlcXVpcmVkLiIpO2lmKCFwKHIpKXRocm93IG5ldyB4KCJjZW50ZXJUb2xlcmFuY2VTcXVhcmVkIGlzIHJlcXVpcmVkLiIpO2NvbnN0IG89dC54LHM9dC55LHU9dC56LGE9ZS54LGw9ZS55LGQ9ZS56LF89bypvKmEqYSxPPXMqcypsKmwsYj11KnUqZCpkLEY9XytPK2IsUz1NYXRoLnNxcnQoMS9GKSxOPWYubXVsdGlwbHlCeVNjYWxhcih0LFMsaG8pO2lmKEY8cilyZXR1cm4gaXNGaW5pdGUoUyk/Zi5jbG9uZShOLGkpOnZvaWQgMDtjb25zdCBnPW4ueCxHPW4ueSxLPW4ueixWPWZvO1YueD1OLngqZyoyLFYueT1OLnkqRyoyLFYuej1OLnoqSyoyO2xldCBpdD0oMS1TKSpmLm1hZ25pdHVkZSh0KS8oLjUqZi5tYWduaXR1ZGUoVikpLGx0PTAscnQsQnQsVCxCLCQsRCx5dCxvdCxndCxfbixwbjtkb3tpdC09bHQsVD0xLygxK2l0KmcpLEI9MS8oMStpdCpHKSwkPTEvKDEraXQqSyksRD1UKlQseXQ9QipCLG90PSQqJCxndD1EKlQsX249eXQqQixwbj1vdCokLHJ0PV8qRCtPKnl0K2Iqb3QtMSxCdD1fKmd0KmcrTypfbipHK2IqcG4qSztjb25zdCBIZT0tMipCdDtsdD1ydC9IZX13aGlsZShNYXRoLmFicyhydCk+Ui5FUFNJTE9OMTIpO3JldHVybiBwKGkpPyhpLng9bypULGkueT1zKkIsaS56PXUqJCxpKTpuZXcgZihvKlQscypCLHUqJCl9ZnVuY3Rpb24gSCh0LGUsbil7dGhpcy5sb25naXR1ZGU9bSh0LDApLHRoaXMubGF0aXR1ZGU9bShlLDApLHRoaXMuaGVpZ2h0PW0obiwwKX1ILmZyb21SYWRpYW5zPWZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiBoLnR5cGVPZi5udW1iZXIoImxvbmdpdHVkZSIsdCksaC50eXBlT2YubnVtYmVyKCJsYXRpdHVkZSIsZSksbj1tKG4sMCkscChyKT8oci5sb25naXR1ZGU9dCxyLmxhdGl0dWRlPWUsci5oZWlnaHQ9bixyKTpuZXcgSCh0LGUsbil9LEguZnJvbURlZ3JlZXM9ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIGgudHlwZU9mLm51bWJlcigibG9uZ2l0dWRlIix0KSxoLnR5cGVPZi5udW1iZXIoImxhdGl0dWRlIixlKSx0PVIudG9SYWRpYW5zKHQpLGU9Ui50b1JhZGlhbnMoZSksSC5mcm9tUmFkaWFucyh0LGUsbixyKX07Y29uc3QgbG89bmV3IGYsRW89bmV3IGYsX289bmV3IGYscG89bmV3IGYoMS82Mzc4MTM3LDEvNjM3ODEzNywxLzYzNTY3NTIzMTQyNDUxNzllLTkpLHlvPW5ldyBmKDEvKDYzNzgxMzcqNjM3ODEzNyksMS8oNjM3ODEzNyo2Mzc4MTM3KSwxLyg2MzU2NzUyMzE0MjQ1MTc5ZS05KjYzNTY3NTIzMTQyNDUxNzllLTkpKSxBbz1SLkVQU0lMT04xO0guZnJvbUNhcnRlc2lhbj1mdW5jdGlvbih0LGUsbil7Y29uc3Qgcj1wKGUpP2Uub25lT3ZlclJhZGlpOnBvLGk9cChlKT9lLm9uZU92ZXJSYWRpaVNxdWFyZWQ6eW8sbz1wKGUpP2UuX2NlbnRlclRvbGVyYW5jZVNxdWFyZWQ6QW8scz14cih0LHIsaSxvLEVvKTtpZighcChzKSlyZXR1cm47bGV0IHU9Zi5tdWx0aXBseUNvbXBvbmVudHMocyxpLGxvKTt1PWYubm9ybWFsaXplKHUsdSk7Y29uc3QgYT1mLnN1YnRyYWN0KHQscyxfbyksbD1NYXRoLmF0YW4yKHUueSx1LngpLGQ9TWF0aC5hc2luKHUueiksXz1SLnNpZ24oZi5kb3QoYSx0KSkqZi5tYWduaXR1ZGUoYSk7cmV0dXJuIHAobik/KG4ubG9uZ2l0dWRlPWwsbi5sYXRpdHVkZT1kLG4uaGVpZ2h0PV8sbik6bmV3IEgobCxkLF8pfSxILnRvQ2FydGVzaWFuPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC5kZWZpbmVkKCJjYXJ0b2dyYXBoaWMiLHQpLGYuZnJvbVJhZGlhbnModC5sb25naXR1ZGUsdC5sYXRpdHVkZSx0LmhlaWdodCxlLG4pfSxILmNsb25lPWZ1bmN0aW9uKHQsZSl7aWYocCh0KSlyZXR1cm4gcChlKT8oZS5sb25naXR1ZGU9dC5sb25naXR1ZGUsZS5sYXRpdHVkZT10LmxhdGl0dWRlLGUuaGVpZ2h0PXQuaGVpZ2h0LGUpOm5ldyBIKHQubG9uZ2l0dWRlLHQubGF0aXR1ZGUsdC5oZWlnaHQpfSxILmVxdWFscz1mdW5jdGlvbih0LGUpe3JldHVybiB0PT09ZXx8cCh0KSYmcChlKSYmdC5sb25naXR1ZGU9PT1lLmxvbmdpdHVkZSYmdC5sYXRpdHVkZT09PWUubGF0aXR1ZGUmJnQuaGVpZ2h0PT09ZS5oZWlnaHR9LEguZXF1YWxzRXBzaWxvbj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIG49bShuLDApLHQ9PT1lfHxwKHQpJiZwKGUpJiZNYXRoLmFicyh0LmxvbmdpdHVkZS1lLmxvbmdpdHVkZSk8PW4mJk1hdGguYWJzKHQubGF0aXR1ZGUtZS5sYXRpdHVkZSk8PW4mJk1hdGguYWJzKHQuaGVpZ2h0LWUuaGVpZ2h0KTw9bn0sSC5aRVJPPU9iamVjdC5mcmVlemUobmV3IEgoMCwwLDApKSxILnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbih0KXtyZXR1cm4gSC5jbG9uZSh0aGlzLHQpfSxILnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7cmV0dXJuIEguZXF1YWxzKHRoaXMsdCl9LEgucHJvdG90eXBlLmVxdWFsc0Vwc2lsb249ZnVuY3Rpb24odCxlKXtyZXR1cm4gSC5lcXVhbHNFcHNpbG9uKHRoaXMsdCxlKX0sSC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm5gKCR7dGhpcy5sb25naXR1ZGV9LCAke3RoaXMubGF0aXR1ZGV9LCAke3RoaXMuaGVpZ2h0fSlgfTtmdW5jdGlvbiBPcih0LGUsbixyKXtlPW0oZSwwKSxuPW0obiwwKSxyPW0ociwwKSxoLnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygieCIsZSwwKSxoLnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygieSIsbiwwKSxoLnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygieiIsciwwKSx0Ll9yYWRpaT1uZXcgZihlLG4sciksdC5fcmFkaWlTcXVhcmVkPW5ldyBmKGUqZSxuKm4scipyKSx0Ll9yYWRpaVRvVGhlRm91cnRoPW5ldyBmKGUqZSplKmUsbipuKm4qbixyKnIqcipyKSx0Ll9vbmVPdmVyUmFkaWk9bmV3IGYoZT09PTA/MDoxL2Usbj09PTA/MDoxL24scj09PTA/MDoxL3IpLHQuX29uZU92ZXJSYWRpaVNxdWFyZWQ9bmV3IGYoZT09PTA/MDoxLyhlKmUpLG49PT0wPzA6MS8obipuKSxyPT09MD8wOjEvKHIqcikpLHQuX21pbmltdW1SYWRpdXM9TWF0aC5taW4oZSxuLHIpLHQuX21heGltdW1SYWRpdXM9TWF0aC5tYXgoZSxuLHIpLHQuX2NlbnRlclRvbGVyYW5jZVNxdWFyZWQ9Ui5FUFNJTE9OMSx0Ll9yYWRpaVNxdWFyZWQueiE9PTAmJih0Ll9zcXVhcmVkWE92ZXJTcXVhcmVkWj10Ll9yYWRpaVNxdWFyZWQueC90Ll9yYWRpaVNxdWFyZWQueil9ZnVuY3Rpb24gaih0LGUsbil7dGhpcy5fcmFkaWk9dm9pZCAwLHRoaXMuX3JhZGlpU3F1YXJlZD12b2lkIDAsdGhpcy5fcmFkaWlUb1RoZUZvdXJ0aD12b2lkIDAsdGhpcy5fb25lT3ZlclJhZGlpPXZvaWQgMCx0aGlzLl9vbmVPdmVyUmFkaWlTcXVhcmVkPXZvaWQgMCx0aGlzLl9taW5pbXVtUmFkaXVzPXZvaWQgMCx0aGlzLl9tYXhpbXVtUmFkaXVzPXZvaWQgMCx0aGlzLl9jZW50ZXJUb2xlcmFuY2VTcXVhcmVkPXZvaWQgMCx0aGlzLl9zcXVhcmVkWE92ZXJTcXVhcmVkWj12b2lkIDAsT3IodGhpcyx0LGUsbil9T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoai5wcm90b3R5cGUse3JhZGlpOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmFkaWl9fSxyYWRpaVNxdWFyZWQ6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yYWRpaVNxdWFyZWR9fSxyYWRpaVRvVGhlRm91cnRoOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmFkaWlUb1RoZUZvdXJ0aH19LG9uZU92ZXJSYWRpaTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29uZU92ZXJSYWRpaX19LG9uZU92ZXJSYWRpaVNxdWFyZWQ6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9vbmVPdmVyUmFkaWlTcXVhcmVkfX0sbWluaW11bVJhZGl1czp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21pbmltdW1SYWRpdXN9fSxtYXhpbXVtUmFkaXVzOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWF4aW11bVJhZGl1c319fSksai5jbG9uZT1mdW5jdGlvbih0LGUpe2lmKCFwKHQpKXJldHVybjtjb25zdCBuPXQuX3JhZGlpO3JldHVybiBwKGUpPyhmLmNsb25lKG4sZS5fcmFkaWkpLGYuY2xvbmUodC5fcmFkaWlTcXVhcmVkLGUuX3JhZGlpU3F1YXJlZCksZi5jbG9uZSh0Ll9yYWRpaVRvVGhlRm91cnRoLGUuX3JhZGlpVG9UaGVGb3VydGgpLGYuY2xvbmUodC5fb25lT3ZlclJhZGlpLGUuX29uZU92ZXJSYWRpaSksZi5jbG9uZSh0Ll9vbmVPdmVyUmFkaWlTcXVhcmVkLGUuX29uZU92ZXJSYWRpaVNxdWFyZWQpLGUuX21pbmltdW1SYWRpdXM9dC5fbWluaW11bVJhZGl1cyxlLl9tYXhpbXVtUmFkaXVzPXQuX21heGltdW1SYWRpdXMsZS5fY2VudGVyVG9sZXJhbmNlU3F1YXJlZD10Ll9jZW50ZXJUb2xlcmFuY2VTcXVhcmVkLGUpOm5ldyBqKG4ueCxuLnksbi56KX0sai5mcm9tQ2FydGVzaWFuMz1mdW5jdGlvbih0LGUpe3JldHVybiBwKGUpfHwoZT1uZXcgaikscCh0KSYmT3IoZSx0LngsdC55LHQueiksZX0sai5XR1M4ND1PYmplY3QuZnJlZXplKG5ldyBqKDYzNzgxMzcsNjM3ODEzNyw2MzU2NzUyMzE0MjQ1MTc5ZS05KSksai5VTklUX1NQSEVSRT1PYmplY3QuZnJlZXplKG5ldyBqKDEsMSwxKSksai5NT09OPU9iamVjdC5mcmVlemUobmV3IGooUi5MVU5BUl9SQURJVVMsUi5MVU5BUl9SQURJVVMsUi5MVU5BUl9SQURJVVMpKSxqLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbih0KXtyZXR1cm4gai5jbG9uZSh0aGlzLHQpfSxqLnBhY2tlZExlbmd0aD1mLnBhY2tlZExlbmd0aCxqLnBhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBoLnR5cGVPZi5vYmplY3QoInZhbHVlIix0KSxoLmRlZmluZWQoImFycmF5IixlKSxuPW0obiwwKSxmLnBhY2sodC5fcmFkaWksZSxuKSxlfSxqLnVucGFjaz1mdW5jdGlvbih0LGUsbil7aC5kZWZpbmVkKCJhcnJheSIsdCksZT1tKGUsMCk7Y29uc3Qgcj1mLnVucGFjayh0LGUpO3JldHVybiBqLmZyb21DYXJ0ZXNpYW4zKHIsbil9LGoucHJvdG90eXBlLmdlb2NlbnRyaWNTdXJmYWNlTm9ybWFsPWYubm9ybWFsaXplLGoucHJvdG90eXBlLmdlb2RldGljU3VyZmFjZU5vcm1hbENhcnRvZ3JhcGhpYz1mdW5jdGlvbih0LGUpe2gudHlwZU9mLm9iamVjdCgiY2FydG9ncmFwaGljIix0KTtjb25zdCBuPXQubG9uZ2l0dWRlLHI9dC5sYXRpdHVkZSxpPU1hdGguY29zKHIpLG89aSpNYXRoLmNvcyhuKSxzPWkqTWF0aC5zaW4obiksdT1NYXRoLnNpbihyKTtyZXR1cm4gcChlKXx8KGU9bmV3IGYpLGUueD1vLGUueT1zLGUuej11LGYubm9ybWFsaXplKGUsZSl9LGoucHJvdG90eXBlLmdlb2RldGljU3VyZmFjZU5vcm1hbD1mdW5jdGlvbih0LGUpe2lmKCFmLmVxdWFsc0Vwc2lsb24odCxmLlpFUk8sUi5FUFNJTE9OMTQpKXJldHVybiBwKGUpfHwoZT1uZXcgZiksZT1mLm11bHRpcGx5Q29tcG9uZW50cyh0LHRoaXMuX29uZU92ZXJSYWRpaVNxdWFyZWQsZSksZi5ub3JtYWxpemUoZSxlKX07Y29uc3QgVG89bmV3IGYsUm89bmV3IGY7ai5wcm90b3R5cGUuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW49ZnVuY3Rpb24odCxlKXtjb25zdCBuPVRvLHI9Um87dGhpcy5nZW9kZXRpY1N1cmZhY2VOb3JtYWxDYXJ0b2dyYXBoaWModCxuKSxmLm11bHRpcGx5Q29tcG9uZW50cyh0aGlzLl9yYWRpaVNxdWFyZWQsbixyKTtjb25zdCBpPU1hdGguc3FydChmLmRvdChuLHIpKTtyZXR1cm4gZi5kaXZpZGVCeVNjYWxhcihyLGksciksZi5tdWx0aXBseUJ5U2NhbGFyKG4sdC5oZWlnaHQsbikscChlKXx8KGU9bmV3IGYpLGYuYWRkKHIsbixlKX0sai5wcm90b3R5cGUuY2FydG9ncmFwaGljQXJyYXlUb0NhcnRlc2lhbkFycmF5PWZ1bmN0aW9uKHQsZSl7aC5kZWZpbmVkKCJjYXJ0b2dyYXBoaWNzIix0KTtjb25zdCBuPXQubGVuZ3RoO3AoZSk/ZS5sZW5ndGg9bjplPW5ldyBBcnJheShuKTtmb3IobGV0IHI9MDtyPG47cisrKWVbcl09dGhpcy5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbih0W3JdLGVbcl0pO3JldHVybiBlfTtjb25zdCB4bz1uZXcgZixPbz1uZXcgZixibz1uZXcgZjtqLnByb3RvdHlwZS5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYz1mdW5jdGlvbih0LGUpe2NvbnN0IG49dGhpcy5zY2FsZVRvR2VvZGV0aWNTdXJmYWNlKHQsT28pO2lmKCFwKG4pKXJldHVybjtjb25zdCByPXRoaXMuZ2VvZGV0aWNTdXJmYWNlTm9ybWFsKG4seG8pLGk9Zi5zdWJ0cmFjdCh0LG4sYm8pLG89TWF0aC5hdGFuMihyLnksci54KSxzPU1hdGguYXNpbihyLnopLHU9Ui5zaWduKGYuZG90KGksdCkpKmYubWFnbml0dWRlKGkpO3JldHVybiBwKGUpPyhlLmxvbmdpdHVkZT1vLGUubGF0aXR1ZGU9cyxlLmhlaWdodD11LGUpOm5ldyBIKG8scyx1KX0sai5wcm90b3R5cGUuY2FydGVzaWFuQXJyYXlUb0NhcnRvZ3JhcGhpY0FycmF5PWZ1bmN0aW9uKHQsZSl7aC5kZWZpbmVkKCJjYXJ0ZXNpYW5zIix0KTtjb25zdCBuPXQubGVuZ3RoO3AoZSk/ZS5sZW5ndGg9bjplPW5ldyBBcnJheShuKTtmb3IobGV0IHI9MDtyPG47KytyKWVbcl09dGhpcy5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyh0W3JdLGVbcl0pO3JldHVybiBlfSxqLnByb3RvdHlwZS5zY2FsZVRvR2VvZGV0aWNTdXJmYWNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHhyKHQsdGhpcy5fb25lT3ZlclJhZGlpLHRoaXMuX29uZU92ZXJSYWRpaVNxdWFyZWQsdGhpcy5fY2VudGVyVG9sZXJhbmNlU3F1YXJlZCxlKX0sai5wcm90b3R5cGUuc2NhbGVUb0dlb2NlbnRyaWNTdXJmYWNlPWZ1bmN0aW9uKHQsZSl7aC50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLHAoZSl8fChlPW5ldyBmKTtjb25zdCBuPXQueCxyPXQueSxpPXQueixvPXRoaXMuX29uZU92ZXJSYWRpaVNxdWFyZWQscz0xL01hdGguc3FydChuKm4qby54K3IqcipvLnkraSppKm8ueik7cmV0dXJuIGYubXVsdGlwbHlCeVNjYWxhcih0LHMsZSl9LGoucHJvdG90eXBlLnRyYW5zZm9ybVBvc2l0aW9uVG9TY2FsZWRTcGFjZT1mdW5jdGlvbih0LGUpe3JldHVybiBwKGUpfHwoZT1uZXcgZiksZi5tdWx0aXBseUNvbXBvbmVudHModCx0aGlzLl9vbmVPdmVyUmFkaWksZSl9LGoucHJvdG90eXBlLnRyYW5zZm9ybVBvc2l0aW9uRnJvbVNjYWxlZFNwYWNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHAoZSl8fChlPW5ldyBmKSxmLm11bHRpcGx5Q29tcG9uZW50cyh0LHRoaXMuX3JhZGlpLGUpfSxqLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXM9PT10fHxwKHQpJiZmLmVxdWFscyh0aGlzLl9yYWRpaSx0Ll9yYWRpaSl9LGoucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JhZGlpLnRvU3RyaW5nKCl9LGoucHJvdG90eXBlLmdldFN1cmZhY2VOb3JtYWxJbnRlcnNlY3Rpb25XaXRoWkF4aXM9ZnVuY3Rpb24odCxlLG4pe2lmKGgudHlwZU9mLm9iamVjdCgicG9zaXRpb24iLHQpLCFSLmVxdWFsc0Vwc2lsb24odGhpcy5fcmFkaWkueCx0aGlzLl9yYWRpaS55LFIuRVBTSUxPTjE1KSl0aHJvdyBuZXcgeCgiRWxsaXBzb2lkIG11c3QgYmUgYW4gZWxsaXBzb2lkIG9mIHJldm9sdXRpb24gKHJhZGlpLnggPT0gcmFkaWkueSkiKTtoLnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW4oIkVsbGlwc29pZC5yYWRpaS56Iix0aGlzLl9yYWRpaS56LDApLGU9bShlLDApO2NvbnN0IHI9dGhpcy5fc3F1YXJlZFhPdmVyU3F1YXJlZFo7aWYocChuKXx8KG49bmV3IGYpLG4ueD0wLG4ueT0wLG4uej10LnoqKDEtciksIShNYXRoLmFicyhuLnopPj10aGlzLl9yYWRpaS56LWUpKXJldHVybiBufTtjb25zdCBnbz1bLjE0ODg3NDMzODk4MTYzLC40MzMzOTUzOTQxMjkyNSwuNjc5NDA5NTY4Mjk5MDIsLjg2NTA2MzM2NjY4ODk4LC45NzM5MDY1Mjg1MTcxNywwXSxTbz1bLjI5NTUyNDIyNDcxNDc1LC4yNjkyNjY3MTkzMDk5OSwuMjE5MDg2MzYyNTE1OTgsLjE0OTQ1MTM0OTE1MDU4LC4wNjY2NzEzNDQzMDg2ODQsMF07ZnVuY3Rpb24gYnIodCxlLG4pe2gudHlwZU9mLm51bWJlcigiYSIsdCksaC50eXBlT2YubnVtYmVyKCJiIixlKSxoLnR5cGVPZi5mdW5jKCJmdW5jIixuKTtjb25zdCByPS41KihlK3QpLGk9LjUqKGUtdCk7bGV0IG89MDtmb3IobGV0IHM9MDtzPDU7cysrKXtjb25zdCB1PWkqZ29bc107bys9U29bc10qKG4ocit1KStuKHItdSkpfXJldHVybiBvKj1pLG99ai5wcm90b3R5cGUuc3VyZmFjZUFyZWE9ZnVuY3Rpb24odCl7aC50eXBlT2Yub2JqZWN0KCJyZWN0YW5nbGUiLHQpO2NvbnN0IGU9dC53ZXN0O2xldCBuPXQuZWFzdDtjb25zdCByPXQuc291dGgsaT10Lm5vcnRoO2Zvcig7bjxlOyluKz1SLlRXT19QSTtjb25zdCBvPXRoaXMuX3JhZGlpU3F1YXJlZCxzPW8ueCx1PW8ueSxhPW8ueixsPXMqdTtyZXR1cm4gYnIocixpLGZ1bmN0aW9uKGQpe2NvbnN0IF89TWF0aC5jb3MoZCksTz1NYXRoLnNpbihkKTtyZXR1cm4gTWF0aC5jb3MoZCkqYnIoZSxuLGZ1bmN0aW9uKGIpe2NvbnN0IEY9TWF0aC5jb3MoYiksUz1NYXRoLnNpbihiKTtyZXR1cm4gTWF0aC5zcXJ0KGwqTypPK2EqKHUqRipGK3MqUypTKSpfKl8pfSl9KX07ZnVuY3Rpb24gSSh0LGUsbixyKXt0aGlzLndlc3Q9bSh0LDApLHRoaXMuc291dGg9bShlLDApLHRoaXMuZWFzdD1tKG4sMCksdGhpcy5ub3J0aD1tKHIsMCl9T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoSS5wcm90b3R5cGUse3dpZHRoOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gSS5jb21wdXRlV2lkdGgodGhpcyl9fSxoZWlnaHQ6e2dldDpmdW5jdGlvbigpe3JldHVybiBJLmNvbXB1dGVIZWlnaHQodGhpcyl9fX0pLEkucGFja2VkTGVuZ3RoPTQsSS5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsdCksaC5kZWZpbmVkKCJhcnJheSIsZSksbj1tKG4sMCksZVtuKytdPXQud2VzdCxlW24rK109dC5zb3V0aCxlW24rK109dC5lYXN0LGVbbl09dC5ub3J0aCxlfSxJLnVucGFjaz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGguZGVmaW5lZCgiYXJyYXkiLHQpLGU9bShlLDApLHAobil8fChuPW5ldyBJKSxuLndlc3Q9dFtlKytdLG4uc291dGg9dFtlKytdLG4uZWFzdD10W2UrK10sbi5ub3J0aD10W2VdLG59LEkuY29tcHV0ZVdpZHRoPWZ1bmN0aW9uKHQpe2gudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIix0KTtsZXQgZT10LmVhc3Q7Y29uc3Qgbj10Lndlc3Q7cmV0dXJuIGU8biYmKGUrPVIuVFdPX1BJKSxlLW59LEkuY29tcHV0ZUhlaWdodD1mdW5jdGlvbih0KXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJyZWN0YW5nbGUiLHQpLHQubm9ydGgtdC5zb3V0aH0sSS5mcm9tRGVncmVlcz1mdW5jdGlvbih0LGUsbixyLGkpe3JldHVybiB0PVIudG9SYWRpYW5zKG0odCwwKSksZT1SLnRvUmFkaWFucyhtKGUsMCkpLG49Ui50b1JhZGlhbnMobShuLDApKSxyPVIudG9SYWRpYW5zKG0ociwwKSkscChpKT8oaS53ZXN0PXQsaS5zb3V0aD1lLGkuZWFzdD1uLGkubm9ydGg9cixpKTpuZXcgSSh0LGUsbixyKX0sSS5mcm9tUmFkaWFucz1mdW5jdGlvbih0LGUsbixyLGkpe3JldHVybiBwKGkpPyhpLndlc3Q9bSh0LDApLGkuc291dGg9bShlLDApLGkuZWFzdD1tKG4sMCksaS5ub3J0aD1tKHIsMCksaSk6bmV3IEkodCxlLG4scil9LEkuZnJvbUNhcnRvZ3JhcGhpY0FycmF5PWZ1bmN0aW9uKHQsZSl7aC5kZWZpbmVkKCJjYXJ0b2dyYXBoaWNzIix0KTtsZXQgbj1OdW1iZXIuTUFYX1ZBTFVFLHI9LU51bWJlci5NQVhfVkFMVUUsaT1OdW1iZXIuTUFYX1ZBTFVFLG89LU51bWJlci5NQVhfVkFMVUUscz1OdW1iZXIuTUFYX1ZBTFVFLHU9LU51bWJlci5NQVhfVkFMVUU7Zm9yKGxldCBhPTAsbD10Lmxlbmd0aDthPGw7YSsrKXtjb25zdCBkPXRbYV07bj1NYXRoLm1pbihuLGQubG9uZ2l0dWRlKSxyPU1hdGgubWF4KHIsZC5sb25naXR1ZGUpLHM9TWF0aC5taW4ocyxkLmxhdGl0dWRlKSx1PU1hdGgubWF4KHUsZC5sYXRpdHVkZSk7Y29uc3QgXz1kLmxvbmdpdHVkZT49MD9kLmxvbmdpdHVkZTpkLmxvbmdpdHVkZStSLlRXT19QSTtpPU1hdGgubWluKGksXyksbz1NYXRoLm1heChvLF8pfXJldHVybiByLW4+by1pJiYobj1pLHI9byxyPlIuUEkmJihyPXItUi5UV09fUEkpLG4+Ui5QSSYmKG49bi1SLlRXT19QSSkpLHAoZSk/KGUud2VzdD1uLGUuc291dGg9cyxlLmVhc3Q9cixlLm5vcnRoPXUsZSk6bmV3IEkobixzLHIsdSl9LEkuZnJvbUNhcnRlc2lhbkFycmF5PWZ1bmN0aW9uKHQsZSxuKXtoLmRlZmluZWQoImNhcnRlc2lhbnMiLHQpLGU9bShlLGouV0dTODQpO2xldCByPU51bWJlci5NQVhfVkFMVUUsaT0tTnVtYmVyLk1BWF9WQUxVRSxvPU51bWJlci5NQVhfVkFMVUUscz0tTnVtYmVyLk1BWF9WQUxVRSx1PU51bWJlci5NQVhfVkFMVUUsYT0tTnVtYmVyLk1BWF9WQUxVRTtmb3IobGV0IGw9MCxkPXQubGVuZ3RoO2w8ZDtsKyspe2NvbnN0IF89ZS5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyh0W2xdKTtyPU1hdGgubWluKHIsXy5sb25naXR1ZGUpLGk9TWF0aC5tYXgoaSxfLmxvbmdpdHVkZSksdT1NYXRoLm1pbih1LF8ubGF0aXR1ZGUpLGE9TWF0aC5tYXgoYSxfLmxhdGl0dWRlKTtjb25zdCBPPV8ubG9uZ2l0dWRlPj0wP18ubG9uZ2l0dWRlOl8ubG9uZ2l0dWRlK1IuVFdPX1BJO289TWF0aC5taW4obyxPKSxzPU1hdGgubWF4KHMsTyl9cmV0dXJuIGktcj5zLW8mJihyPW8saT1zLGk+Ui5QSSYmKGk9aS1SLlRXT19QSSkscj5SLlBJJiYocj1yLVIuVFdPX1BJKSkscChuKT8obi53ZXN0PXIsbi5zb3V0aD11LG4uZWFzdD1pLG4ubm9ydGg9YSxuKTpuZXcgSShyLHUsaSxhKX0sSS5jbG9uZT1mdW5jdGlvbih0LGUpe2lmKHAodCkpcmV0dXJuIHAoZSk/KGUud2VzdD10Lndlc3QsZS5zb3V0aD10LnNvdXRoLGUuZWFzdD10LmVhc3QsZS5ub3J0aD10Lm5vcnRoLGUpOm5ldyBJKHQud2VzdCx0LnNvdXRoLHQuZWFzdCx0Lm5vcnRoKX0sSS5lcXVhbHNFcHNpbG9uPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbj1tKG4sMCksdD09PWV8fHAodCkmJnAoZSkmJk1hdGguYWJzKHQud2VzdC1lLndlc3QpPD1uJiZNYXRoLmFicyh0LnNvdXRoLWUuc291dGgpPD1uJiZNYXRoLmFicyh0LmVhc3QtZS5lYXN0KTw9biYmTWF0aC5hYnModC5ub3J0aC1lLm5vcnRoKTw9bn0sSS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24odCl7cmV0dXJuIEkuY2xvbmUodGhpcyx0KX0sSS5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe3JldHVybiBJLmVxdWFscyh0aGlzLHQpfSxJLmVxdWFscz1mdW5jdGlvbih0LGUpe3JldHVybiB0PT09ZXx8cCh0KSYmcChlKSYmdC53ZXN0PT09ZS53ZXN0JiZ0LnNvdXRoPT09ZS5zb3V0aCYmdC5lYXN0PT09ZS5lYXN0JiZ0Lm5vcnRoPT09ZS5ub3J0aH0sSS5wcm90b3R5cGUuZXF1YWxzRXBzaWxvbj1mdW5jdGlvbih0LGUpe3JldHVybiBJLmVxdWFsc0Vwc2lsb24odGhpcyx0LGUpfSxJLnZhbGlkYXRlPWZ1bmN0aW9uKHQpe2gudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIix0KTtjb25zdCBlPXQubm9ydGg7aC50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoIm5vcnRoIixlLC1SLlBJX09WRVJfVFdPKSxoLnR5cGVPZi5udW1iZXIubGVzc1RoYW5PckVxdWFscygibm9ydGgiLGUsUi5QSV9PVkVSX1RXTyk7Y29uc3Qgbj10LnNvdXRoO2gudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJzb3V0aCIsbiwtUi5QSV9PVkVSX1RXTyksaC50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoInNvdXRoIixuLFIuUElfT1ZFUl9UV08pO2NvbnN0IHI9dC53ZXN0O2gudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJ3ZXN0IixyLC1NYXRoLlBJKSxoLnR5cGVPZi5udW1iZXIubGVzc1RoYW5PckVxdWFscygid2VzdCIscixNYXRoLlBJKTtjb25zdCBpPXQuZWFzdDtoLnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygiZWFzdCIsaSwtTWF0aC5QSSksaC50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoImVhc3QiLGksTWF0aC5QSSl9LEkuc291dGh3ZXN0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIix0KSxwKGUpPyhlLmxvbmdpdHVkZT10Lndlc3QsZS5sYXRpdHVkZT10LnNvdXRoLGUuaGVpZ2h0PTAsZSk6bmV3IEgodC53ZXN0LHQuc291dGgpfSxJLm5vcnRod2VzdD1mdW5jdGlvbih0LGUpe3JldHVybiBoLnR5cGVPZi5vYmplY3QoInJlY3RhbmdsZSIsdCkscChlKT8oZS5sb25naXR1ZGU9dC53ZXN0LGUubGF0aXR1ZGU9dC5ub3J0aCxlLmhlaWdodD0wLGUpOm5ldyBIKHQud2VzdCx0Lm5vcnRoKX0sSS5ub3J0aGVhc3Q9ZnVuY3Rpb24odCxlKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJyZWN0YW5nbGUiLHQpLHAoZSk/KGUubG9uZ2l0dWRlPXQuZWFzdCxlLmxhdGl0dWRlPXQubm9ydGgsZS5oZWlnaHQ9MCxlKTpuZXcgSCh0LmVhc3QsdC5ub3J0aCl9LEkuc291dGhlYXN0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIix0KSxwKGUpPyhlLmxvbmdpdHVkZT10LmVhc3QsZS5sYXRpdHVkZT10LnNvdXRoLGUuaGVpZ2h0PTAsZSk6bmV3IEgodC5lYXN0LHQuc291dGgpfSxJLmNlbnRlcj1mdW5jdGlvbih0LGUpe2gudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIix0KTtsZXQgbj10LmVhc3Q7Y29uc3Qgcj10Lndlc3Q7bjxyJiYobis9Ui5UV09fUEkpO2NvbnN0IGk9Ui5uZWdhdGl2ZVBpVG9QaSgocituKSouNSksbz0odC5zb3V0aCt0Lm5vcnRoKSouNTtyZXR1cm4gcChlKT8oZS5sb25naXR1ZGU9aSxlLmxhdGl0dWRlPW8sZS5oZWlnaHQ9MCxlKTpuZXcgSChpLG8pfSxJLmludGVyc2VjdGlvbj1mdW5jdGlvbih0LGUsbil7aC50eXBlT2Yub2JqZWN0KCJyZWN0YW5nbGUiLHQpLGgudHlwZU9mLm9iamVjdCgib3RoZXJSZWN0YW5nbGUiLGUpO2xldCByPXQuZWFzdCxpPXQud2VzdCxvPWUuZWFzdCxzPWUud2VzdDtyPGkmJm8+MD9yKz1SLlRXT19QSTpvPHMmJnI+MCYmKG8rPVIuVFdPX1BJKSxyPGkmJnM8MD9zKz1SLlRXT19QSTpvPHMmJmk8MCYmKGkrPVIuVFdPX1BJKTtjb25zdCB1PVIubmVnYXRpdmVQaVRvUGkoTWF0aC5tYXgoaSxzKSksYT1SLm5lZ2F0aXZlUGlUb1BpKE1hdGgubWluKHIsbykpO2lmKCh0Lndlc3Q8dC5lYXN0fHxlLndlc3Q8ZS5lYXN0KSYmYTw9dSlyZXR1cm47Y29uc3QgbD1NYXRoLm1heCh0LnNvdXRoLGUuc291dGgpLGQ9TWF0aC5taW4odC5ub3J0aCxlLm5vcnRoKTtpZighKGw+PWQpKXJldHVybiBwKG4pPyhuLndlc3Q9dSxuLnNvdXRoPWwsbi5lYXN0PWEsbi5ub3J0aD1kLG4pOm5ldyBJKHUsbCxhLGQpfSxJLnNpbXBsZUludGVyc2VjdGlvbj1mdW5jdGlvbih0LGUsbil7aC50eXBlT2Yub2JqZWN0KCJyZWN0YW5nbGUiLHQpLGgudHlwZU9mLm9iamVjdCgib3RoZXJSZWN0YW5nbGUiLGUpO2NvbnN0IHI9TWF0aC5tYXgodC53ZXN0LGUud2VzdCksaT1NYXRoLm1heCh0LnNvdXRoLGUuc291dGgpLG89TWF0aC5taW4odC5lYXN0LGUuZWFzdCkscz1NYXRoLm1pbih0Lm5vcnRoLGUubm9ydGgpO2lmKCEoaT49c3x8cj49bykpcmV0dXJuIHAobik/KG4ud2VzdD1yLG4uc291dGg9aSxuLmVhc3Q9byxuLm5vcnRoPXMsbik6bmV3IEkocixpLG8scyl9LEkudW5pb249ZnVuY3Rpb24odCxlLG4pe2gudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIix0KSxoLnR5cGVPZi5vYmplY3QoIm90aGVyUmVjdGFuZ2xlIixlKSxwKG4pfHwobj1uZXcgSSk7bGV0IHI9dC5lYXN0LGk9dC53ZXN0LG89ZS5lYXN0LHM9ZS53ZXN0O3I8aSYmbz4wP3IrPVIuVFdPX1BJOm88cyYmcj4wJiYobys9Ui5UV09fUEkpLHI8aSYmczwwP3MrPVIuVFdPX1BJOm88cyYmaTwwJiYoaSs9Ui5UV09fUEkpO2NvbnN0IHU9Ui5uZWdhdGl2ZVBpVG9QaShNYXRoLm1pbihpLHMpKSxhPVIubmVnYXRpdmVQaVRvUGkoTWF0aC5tYXgocixvKSk7cmV0dXJuIG4ud2VzdD11LG4uc291dGg9TWF0aC5taW4odC5zb3V0aCxlLnNvdXRoKSxuLmVhc3Q9YSxuLm5vcnRoPU1hdGgubWF4KHQubm9ydGgsZS5ub3J0aCksbn0sSS5leHBhbmQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBoLnR5cGVPZi5vYmplY3QoInJlY3RhbmdsZSIsdCksaC50eXBlT2Yub2JqZWN0KCJjYXJ0b2dyYXBoaWMiLGUpLHAobil8fChuPW5ldyBJKSxuLndlc3Q9TWF0aC5taW4odC53ZXN0LGUubG9uZ2l0dWRlKSxuLnNvdXRoPU1hdGgubWluKHQuc291dGgsZS5sYXRpdHVkZSksbi5lYXN0PU1hdGgubWF4KHQuZWFzdCxlLmxvbmdpdHVkZSksbi5ub3J0aD1NYXRoLm1heCh0Lm5vcnRoLGUubGF0aXR1ZGUpLG59LEkuY29udGFpbnM9ZnVuY3Rpb24odCxlKXtoLnR5cGVPZi5vYmplY3QoInJlY3RhbmdsZSIsdCksaC50eXBlT2Yub2JqZWN0KCJjYXJ0b2dyYXBoaWMiLGUpO2xldCBuPWUubG9uZ2l0dWRlO2NvbnN0IHI9ZS5sYXRpdHVkZSxpPXQud2VzdDtsZXQgbz10LmVhc3Q7cmV0dXJuIG88aSYmKG8rPVIuVFdPX1BJLG48MCYmKG4rPVIuVFdPX1BJKSksKG4+aXx8Ui5lcXVhbHNFcHNpbG9uKG4saSxSLkVQU0lMT04xNCkpJiYobjxvfHxSLmVxdWFsc0Vwc2lsb24obixvLFIuRVBTSUxPTjE0KSkmJnI+PXQuc291dGgmJnI8PXQubm9ydGh9O2NvbnN0IG1vPW5ldyBIO0kuc3Vic2FtcGxlPWZ1bmN0aW9uKHQsZSxuLHIpe2gudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIix0KSxlPW0oZSxqLldHUzg0KSxuPW0obiwwKSxwKHIpfHwocj1bXSk7bGV0IGk9MDtjb25zdCBvPXQubm9ydGgscz10LnNvdXRoLHU9dC5lYXN0LGE9dC53ZXN0LGw9bW87bC5oZWlnaHQ9bixsLmxvbmdpdHVkZT1hLGwubGF0aXR1ZGU9byxyW2ldPWUuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4obCxyW2ldKSxpKyssbC5sb25naXR1ZGU9dSxyW2ldPWUuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4obCxyW2ldKSxpKyssbC5sYXRpdHVkZT1zLHJbaV09ZS5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbihsLHJbaV0pLGkrKyxsLmxvbmdpdHVkZT1hLHJbaV09ZS5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbihsLHJbaV0pLGkrKyxvPDA/bC5sYXRpdHVkZT1vOnM+MD9sLmxhdGl0dWRlPXM6bC5sYXRpdHVkZT0wO2ZvcihsZXQgZD0xO2Q8ODsrK2QpbC5sb25naXR1ZGU9LU1hdGguUEkrZCpSLlBJX09WRVJfVFdPLEkuY29udGFpbnModCxsKSYmKHJbaV09ZS5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbihsLHJbaV0pLGkrKyk7cmV0dXJuIGwubGF0aXR1ZGU9PT0wJiYobC5sb25naXR1ZGU9YSxyW2ldPWUuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4obCxyW2ldKSxpKyssbC5sb25naXR1ZGU9dSxyW2ldPWUuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4obCxyW2ldKSxpKyspLHIubGVuZ3RoPWkscn0sSS5zdWJzZWN0aW9uPWZ1bmN0aW9uKHQsZSxuLHIsaSxvKXtpZihoLnR5cGVPZi5vYmplY3QoInJlY3RhbmdsZSIsdCksaC50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoIndlc3RMZXJwIixlLDApLGgudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJ3ZXN0TGVycCIsZSwxKSxoLnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygic291dGhMZXJwIixuLDApLGgudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJzb3V0aExlcnAiLG4sMSksaC50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoImVhc3RMZXJwIixyLDApLGgudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJlYXN0TGVycCIsciwxKSxoLnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygibm9ydGhMZXJwIixpLDApLGgudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJub3J0aExlcnAiLGksMSksaC50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoIndlc3RMZXJwIixlLHIpLGgudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJzb3V0aExlcnAiLG4saSkscChvKXx8KG89bmV3IEkpLHQud2VzdDw9dC5lYXN0KXtjb25zdCB1PXQuZWFzdC10Lndlc3Q7by53ZXN0PXQud2VzdCtlKnUsby5lYXN0PXQud2VzdCtyKnV9ZWxzZXtjb25zdCB1PVIuVFdPX1BJK3QuZWFzdC10Lndlc3Q7by53ZXN0PVIubmVnYXRpdmVQaVRvUGkodC53ZXN0K2UqdSksby5lYXN0PVIubmVnYXRpdmVQaVRvUGkodC53ZXN0K3IqdSl9Y29uc3Qgcz10Lm5vcnRoLXQuc291dGg7cmV0dXJuIG8uc291dGg9dC5zb3V0aCtuKnMsby5ub3J0aD10LnNvdXRoK2kqcyxlPT09MSYmKG8ud2VzdD10LmVhc3QpLHI9PT0xJiYoby5lYXN0PXQuZWFzdCksbj09PTEmJihvLnNvdXRoPXQubm9ydGgpLGk9PT0xJiYoby5ub3J0aD10Lm5vcnRoKSxvfSxJLk1BWF9WQUxVRT1PYmplY3QuZnJlZXplKG5ldyBJKC1NYXRoLlBJLC1SLlBJX09WRVJfVFdPLE1hdGguUEksUi5QSV9PVkVSX1RXTykpO3ZhciBncj1PYmplY3QuZnJlZXplKHtERVBUSF9CVUZGRVJfQklUOjI1NixTVEVOQ0lMX0JVRkZFUl9CSVQ6MTAyNCxDT0xPUl9CVUZGRVJfQklUOjE2Mzg0LFBPSU5UUzowLExJTkVTOjEsTElORV9MT09QOjIsTElORV9TVFJJUDozLFRSSUFOR0xFUzo0LFRSSUFOR0xFX1NUUklQOjUsVFJJQU5HTEVfRkFOOjYsWkVSTzowLE9ORToxLFNSQ19DT0xPUjo3NjgsT05FX01JTlVTX1NSQ19DT0xPUjo3NjksU1JDX0FMUEhBOjc3MCxPTkVfTUlOVVNfU1JDX0FMUEhBOjc3MSxEU1RfQUxQSEE6NzcyLE9ORV9NSU5VU19EU1RfQUxQSEE6NzczLERTVF9DT0xPUjo3NzQsT05FX01JTlVTX0RTVF9DT0xPUjo3NzUsU1JDX0FMUEhBX1NBVFVSQVRFOjc3NixGVU5DX0FERDozMjc3NCxCTEVORF9FUVVBVElPTjozMjc3NyxCTEVORF9FUVVBVElPTl9SR0I6MzI3NzcsQkxFTkRfRVFVQVRJT05fQUxQSEE6MzQ4NzcsRlVOQ19TVUJUUkFDVDozMjc3OCxGVU5DX1JFVkVSU0VfU1VCVFJBQ1Q6MzI3NzksQkxFTkRfRFNUX1JHQjozMjk2OCxCTEVORF9TUkNfUkdCOjMyOTY5LEJMRU5EX0RTVF9BTFBIQTozMjk3MCxCTEVORF9TUkNfQUxQSEE6MzI5NzEsQ09OU1RBTlRfQ09MT1I6MzI3NjksT05FX01JTlVTX0NPTlNUQU5UX0NPTE9SOjMyNzcwLENPTlNUQU5UX0FMUEhBOjMyNzcxLE9ORV9NSU5VU19DT05TVEFOVF9BTFBIQTozMjc3MixCTEVORF9DT0xPUjozMjc3MyxBUlJBWV9CVUZGRVI6MzQ5NjIsRUxFTUVOVF9BUlJBWV9CVUZGRVI6MzQ5NjMsQVJSQVlfQlVGRkVSX0JJTkRJTkc6MzQ5NjQsRUxFTUVOVF9BUlJBWV9CVUZGRVJfQklORElORzozNDk2NSxTVFJFQU1fRFJBVzozNTA0MCxTVEFUSUNfRFJBVzozNTA0NCxEWU5BTUlDX0RSQVc6MzUwNDgsQlVGRkVSX1NJWkU6MzQ2NjAsQlVGRkVSX1VTQUdFOjM0NjYxLENVUlJFTlRfVkVSVEVYX0FUVFJJQjozNDM0MixGUk9OVDoxMDI4LEJBQ0s6MTAyOSxGUk9OVF9BTkRfQkFDSzoxMDMyLENVTExfRkFDRToyODg0LEJMRU5EOjMwNDIsRElUSEVSOjMwMjQsU1RFTkNJTF9URVNUOjI5NjAsREVQVEhfVEVTVDoyOTI5LFNDSVNTT1JfVEVTVDozMDg5LFBPTFlHT05fT0ZGU0VUX0ZJTEw6MzI4MjMsU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFOjMyOTI2LFNBTVBMRV9DT1ZFUkFHRTozMjkyOCxOT19FUlJPUjowLElOVkFMSURfRU5VTToxMjgwLElOVkFMSURfVkFMVUU6MTI4MSxJTlZBTElEX09QRVJBVElPTjoxMjgyLE9VVF9PRl9NRU1PUlk6MTI4NSxDVzoyMzA0LENDVzoyMzA1LExJTkVfV0lEVEg6Mjg0OSxBTElBU0VEX1BPSU5UX1NJWkVfUkFOR0U6MzM5MDEsQUxJQVNFRF9MSU5FX1dJRFRIX1JBTkdFOjMzOTAyLENVTExfRkFDRV9NT0RFOjI4ODUsRlJPTlRfRkFDRToyODg2LERFUFRIX1JBTkdFOjI5MjgsREVQVEhfV1JJVEVNQVNLOjI5MzAsREVQVEhfQ0xFQVJfVkFMVUU6MjkzMSxERVBUSF9GVU5DOjI5MzIsU1RFTkNJTF9DTEVBUl9WQUxVRToyOTYxLFNURU5DSUxfRlVOQzoyOTYyLFNURU5DSUxfRkFJTDoyOTY0LFNURU5DSUxfUEFTU19ERVBUSF9GQUlMOjI5NjUsU1RFTkNJTF9QQVNTX0RFUFRIX1BBU1M6Mjk2NixTVEVOQ0lMX1JFRjoyOTY3LFNURU5DSUxfVkFMVUVfTUFTSzoyOTYzLFNURU5DSUxfV1JJVEVNQVNLOjI5NjgsU1RFTkNJTF9CQUNLX0ZVTkM6MzQ4MTYsU1RFTkNJTF9CQUNLX0ZBSUw6MzQ4MTcsU1RFTkNJTF9CQUNLX1BBU1NfREVQVEhfRkFJTDozNDgxOCxTVEVOQ0lMX0JBQ0tfUEFTU19ERVBUSF9QQVNTOjM0ODE5LFNURU5DSUxfQkFDS19SRUY6MzYwMDMsU1RFTkNJTF9CQUNLX1ZBTFVFX01BU0s6MzYwMDQsU1RFTkNJTF9CQUNLX1dSSVRFTUFTSzozNjAwNSxWSUVXUE9SVDoyOTc4LFNDSVNTT1JfQk9YOjMwODgsQ09MT1JfQ0xFQVJfVkFMVUU6MzEwNixDT0xPUl9XUklURU1BU0s6MzEwNyxVTlBBQ0tfQUxJR05NRU5UOjMzMTcsUEFDS19BTElHTk1FTlQ6MzMzMyxNQVhfVEVYVFVSRV9TSVpFOjMzNzksTUFYX1ZJRVdQT1JUX0RJTVM6MzM4NixTVUJQSVhFTF9CSVRTOjM0MDgsUkVEX0JJVFM6MzQxMCxHUkVFTl9CSVRTOjM0MTEsQkxVRV9CSVRTOjM0MTIsQUxQSEFfQklUUzozNDEzLERFUFRIX0JJVFM6MzQxNCxTVEVOQ0lMX0JJVFM6MzQxNSxQT0xZR09OX09GRlNFVF9VTklUUzoxMDc1MixQT0xZR09OX09GRlNFVF9GQUNUT1I6MzI4MjQsVEVYVFVSRV9CSU5ESU5HXzJEOjMyODczLFNBTVBMRV9CVUZGRVJTOjMyOTM2LFNBTVBMRVM6MzI5MzcsU0FNUExFX0NPVkVSQUdFX1ZBTFVFOjMyOTM4LFNBTVBMRV9DT1ZFUkFHRV9JTlZFUlQ6MzI5MzksQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFM6MzQ0NjcsRE9OVF9DQVJFOjQzNTIsRkFTVEVTVDo0MzUzLE5JQ0VTVDo0MzU0LEdFTkVSQVRFX01JUE1BUF9ISU5UOjMzMTcwLEJZVEU6NTEyMCxVTlNJR05FRF9CWVRFOjUxMjEsU0hPUlQ6NTEyMixVTlNJR05FRF9TSE9SVDo1MTIzLElOVDo1MTI0LFVOU0lHTkVEX0lOVDo1MTI1LEZMT0FUOjUxMjYsREVQVEhfQ09NUE9ORU5UOjY0MDIsQUxQSEE6NjQwNixSR0I6NjQwNyxSR0JBOjY0MDgsTFVNSU5BTkNFOjY0MDksTFVNSU5BTkNFX0FMUEhBOjY0MTAsVU5TSUdORURfU0hPUlRfNF80XzRfNDozMjgxOSxVTlNJR05FRF9TSE9SVF81XzVfNV8xOjMyODIwLFVOU0lHTkVEX1NIT1JUXzVfNl81OjMzNjM1LEZSQUdNRU5UX1NIQURFUjozNTYzMixWRVJURVhfU0hBREVSOjM1NjMzLE1BWF9WRVJURVhfQVRUUklCUzozNDkyMSxNQVhfVkVSVEVYX1VOSUZPUk1fVkVDVE9SUzozNjM0NyxNQVhfVkFSWUlOR19WRUNUT1JTOjM2MzQ4LE1BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTOjM1NjYxLE1BWF9WRVJURVhfVEVYVFVSRV9JTUFHRV9VTklUUzozNTY2MCxNQVhfVEVYVFVSRV9JTUFHRV9VTklUUzozNDkzMCxNQVhfRlJBR01FTlRfVU5JRk9STV9WRUNUT1JTOjM2MzQ5LFNIQURFUl9UWVBFOjM1NjYzLERFTEVURV9TVEFUVVM6MzU3MTIsTElOS19TVEFUVVM6MzU3MTQsVkFMSURBVEVfU1RBVFVTOjM1NzE1LEFUVEFDSEVEX1NIQURFUlM6MzU3MTcsQUNUSVZFX1VOSUZPUk1TOjM1NzE4LEFDVElWRV9BVFRSSUJVVEVTOjM1NzIxLFNIQURJTkdfTEFOR1VBR0VfVkVSU0lPTjozNTcyNCxDVVJSRU5UX1BST0dSQU06MzU3MjUsTkVWRVI6NTEyLExFU1M6NTEzLEVRVUFMOjUxNCxMRVFVQUw6NTE1LEdSRUFURVI6NTE2LE5PVEVRVUFMOjUxNyxHRVFVQUw6NTE4LEFMV0FZUzo1MTksS0VFUDo3NjgwLFJFUExBQ0U6NzY4MSxJTkNSOjc2ODIsREVDUjo3NjgzLElOVkVSVDo1Mzg2LElOQ1JfV1JBUDozNDA1NSxERUNSX1dSQVA6MzQwNTYsVkVORE9SOjc5MzYsUkVOREVSRVI6NzkzNyxWRVJTSU9OOjc5MzgsTkVBUkVTVDo5NzI4LExJTkVBUjo5NzI5LE5FQVJFU1RfTUlQTUFQX05FQVJFU1Q6OTk4NCxMSU5FQVJfTUlQTUFQX05FQVJFU1Q6OTk4NSxORUFSRVNUX01JUE1BUF9MSU5FQVI6OTk4NixMSU5FQVJfTUlQTUFQX0xJTkVBUjo5OTg3LFRFWFRVUkVfTUFHX0ZJTFRFUjoxMDI0MCxURVhUVVJFX01JTl9GSUxURVI6MTAyNDEsVEVYVFVSRV9XUkFQX1M6MTAyNDIsVEVYVFVSRV9XUkFQX1Q6MTAyNDMsVEVYVFVSRV8yRDozNTUzLFRFWFRVUkU6NTg5MCxURVhUVVJFX0NVQkVfTUFQOjM0MDY3LFRFWFRVUkVfQklORElOR19DVUJFX01BUDozNDA2OCxURVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1g6MzQwNjksVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9YOjM0MDcwLFRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWTozNDA3MSxURVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1k6MzQwNzIsVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9aOjM0MDczLFRFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWjozNDA3NCxNQVhfQ1VCRV9NQVBfVEVYVFVSRV9TSVpFOjM0MDc2LFRFWFRVUkUwOjMzOTg0LFRFWFRVUkUxOjMzOTg1LFRFWFRVUkUyOjMzOTg2LFRFWFRVUkUzOjMzOTg3LFRFWFRVUkU0OjMzOTg4LFRFWFRVUkU1OjMzOTg5LFRFWFRVUkU2OjMzOTkwLFRFWFRVUkU3OjMzOTkxLFRFWFRVUkU4OjMzOTkyLFRFWFRVUkU5OjMzOTkzLFRFWFRVUkUxMDozMzk5NCxURVhUVVJFMTE6MzM5OTUsVEVYVFVSRTEyOjMzOTk2LFRFWFRVUkUxMzozMzk5NyxURVhUVVJFMTQ6MzM5OTgsVEVYVFVSRTE1OjMzOTk5LFRFWFRVUkUxNjozNGUzLFRFWFRVUkUxNzozNDAwMSxURVhUVVJFMTg6MzQwMDIsVEVYVFVSRTE5OjM0MDAzLFRFWFRVUkUyMDozNDAwNCxURVhUVVJFMjE6MzQwMDUsVEVYVFVSRTIyOjM0MDA2LFRFWFRVUkUyMzozNDAwNyxURVhUVVJFMjQ6MzQwMDgsVEVYVFVSRTI1OjM0MDA5LFRFWFRVUkUyNjozNDAxMCxURVhUVVJFMjc6MzQwMTEsVEVYVFVSRTI4OjM0MDEyLFRFWFRVUkUyOTozNDAxMyxURVhUVVJFMzA6MzQwMTQsVEVYVFVSRTMxOjM0MDE1LEFDVElWRV9URVhUVVJFOjM0MDE2LFJFUEVBVDoxMDQ5NyxDTEFNUF9UT19FREdFOjMzMDcxLE1JUlJPUkVEX1JFUEVBVDozMzY0OCxGTE9BVF9WRUMyOjM1NjY0LEZMT0FUX1ZFQzM6MzU2NjUsRkxPQVRfVkVDNDozNTY2NixJTlRfVkVDMjozNTY2NyxJTlRfVkVDMzozNTY2OCxJTlRfVkVDNDozNTY2OSxCT09MOjM1NjcwLEJPT0xfVkVDMjozNTY3MSxCT09MX1ZFQzM6MzU2NzIsQk9PTF9WRUM0OjM1NjczLEZMT0FUX01BVDI6MzU2NzQsRkxPQVRfTUFUMzozNTY3NSxGTE9BVF9NQVQ0OjM1Njc2LFNBTVBMRVJfMkQ6MzU2NzgsU0FNUExFUl9DVUJFOjM1NjgwLFZFUlRFWF9BVFRSSUJfQVJSQVlfRU5BQkxFRDozNDMzOCxWRVJURVhfQVRUUklCX0FSUkFZX1NJWkU6MzQzMzksVkVSVEVYX0FUVFJJQl9BUlJBWV9TVFJJREU6MzQzNDAsVkVSVEVYX0FUVFJJQl9BUlJBWV9UWVBFOjM0MzQxLFZFUlRFWF9BVFRSSUJfQVJSQVlfTk9STUFMSVpFRDozNDkyMixWRVJURVhfQVRUUklCX0FSUkFZX1BPSU5URVI6MzQzNzMsVkVSVEVYX0FUVFJJQl9BUlJBWV9CVUZGRVJfQklORElORzozNDk3NSxJTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX1RZUEU6MzU3MzgsSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9GT1JNQVQ6MzU3MzksQ09NUElMRV9TVEFUVVM6MzU3MTMsTE9XX0ZMT0FUOjM2MzM2LE1FRElVTV9GTE9BVDozNjMzNyxISUdIX0ZMT0FUOjM2MzM4LExPV19JTlQ6MzYzMzksTUVESVVNX0lOVDozNjM0MCxISUdIX0lOVDozNjM0MSxGUkFNRUJVRkZFUjozNjE2MCxSRU5ERVJCVUZGRVI6MzYxNjEsUkdCQTQ6MzI4NTQsUkdCNV9BMTozMjg1NSxSR0I1NjU6MzYxOTQsREVQVEhfQ09NUE9ORU5UMTY6MzMxODksU1RFTkNJTF9JTkRFWDo2NDAxLFNURU5DSUxfSU5ERVg4OjM2MTY4LERFUFRIX1NURU5DSUw6MzQwNDEsUkVOREVSQlVGRkVSX1dJRFRIOjM2MTYyLFJFTkRFUkJVRkZFUl9IRUlHSFQ6MzYxNjMsUkVOREVSQlVGRkVSX0lOVEVSTkFMX0ZPUk1BVDozNjE2NCxSRU5ERVJCVUZGRVJfUkVEX1NJWkU6MzYxNzYsUkVOREVSQlVGRkVSX0dSRUVOX1NJWkU6MzYxNzcsUkVOREVSQlVGRkVSX0JMVUVfU0laRTozNjE3OCxSRU5ERVJCVUZGRVJfQUxQSEFfU0laRTozNjE3OSxSRU5ERVJCVUZGRVJfREVQVEhfU0laRTozNjE4MCxSRU5ERVJCVUZGRVJfU1RFTkNJTF9TSVpFOjM2MTgxLEZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX1RZUEU6MzYwNDgsRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9PQkpFQ1RfTkFNRTozNjA0OSxGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfTEVWRUw6MzYwNTAsRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0NVQkVfTUFQX0ZBQ0U6MzYwNTEsQ09MT1JfQVRUQUNITUVOVDA6MzYwNjQsREVQVEhfQVRUQUNITUVOVDozNjA5NixTVEVOQ0lMX0FUVEFDSE1FTlQ6MzYxMjgsREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UOjMzMzA2LE5PTkU6MCxGUkFNRUJVRkZFUl9DT01QTEVURTozNjA1MyxGUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0FUVEFDSE1FTlQ6MzYwNTQsRlJBTUVCVUZGRVJfSU5DT01QTEVURV9NSVNTSU5HX0FUVEFDSE1FTlQ6MzYwNTUsRlJBTUVCVUZGRVJfSU5DT01QTEVURV9ESU1FTlNJT05TOjM2MDU3LEZSQU1FQlVGRkVSX1VOU1VQUE9SVEVEOjM2MDYxLEZSQU1FQlVGRkVSX0JJTkRJTkc6MzYwMDYsUkVOREVSQlVGRkVSX0JJTkRJTkc6MzYwMDcsTUFYX1JFTkRFUkJVRkZFUl9TSVpFOjM0MDI0LElOVkFMSURfRlJBTUVCVUZGRVJfT1BFUkFUSU9OOjEyODYsVU5QQUNLX0ZMSVBfWV9XRUJHTDozNzQ0MCxVTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0w6Mzc0NDEsQ09OVEVYVF9MT1NUX1dFQkdMOjM3NDQyLFVOUEFDS19DT0xPUlNQQUNFX0NPTlZFUlNJT05fV0VCR0w6Mzc0NDMsQlJPV1NFUl9ERUZBVUxUX1dFQkdMOjM3NDQ0LENPTVBSRVNTRURfUkdCX1MzVENfRFhUMV9FWFQ6MzM3NzYsQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUMV9FWFQ6MzM3NzcsQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUM19FWFQ6MzM3NzgsQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUNV9FWFQ6MzM3NzksQ09NUFJFU1NFRF9SR0JfUFZSVENfNEJQUFYxX0lNRzozNTg0MCxDT01QUkVTU0VEX1JHQl9QVlJUQ18yQlBQVjFfSU1HOjM1ODQxLENPTVBSRVNTRURfUkdCQV9QVlJUQ180QlBQVjFfSU1HOjM1ODQyLENPTVBSRVNTRURfUkdCQV9QVlJUQ18yQlBQVjFfSU1HOjM1ODQzLENPTVBSRVNTRURfUkdCQV9BU1RDXzR4NF9XRUJHTDozNzgwOCxDT01QUkVTU0VEX1JHQl9FVEMxX1dFQkdMOjM2MTk2LENPTVBSRVNTRURfUkdCQV9CUFRDX1VOT1JNOjM2NDkyLEhBTEZfRkxPQVRfT0VTOjM2MTkzLERPVUJMRTo1MTMwLFJFQURfQlVGRkVSOjMwNzQsVU5QQUNLX1JPV19MRU5HVEg6MzMxNCxVTlBBQ0tfU0tJUF9ST1dTOjMzMTUsVU5QQUNLX1NLSVBfUElYRUxTOjMzMTYsUEFDS19ST1dfTEVOR1RIOjMzMzAsUEFDS19TS0lQX1JPV1M6MzMzMSxQQUNLX1NLSVBfUElYRUxTOjMzMzIsQ09MT1I6NjE0NCxERVBUSDo2MTQ1LFNURU5DSUw6NjE0NixSRUQ6NjQwMyxSR0I4OjMyODQ5LFJHQkE4OjMyODU2LFJHQjEwX0EyOjMyODU3LFRFWFRVUkVfQklORElOR18zRDozMjg3NCxVTlBBQ0tfU0tJUF9JTUFHRVM6MzI4NzcsVU5QQUNLX0lNQUdFX0hFSUdIVDozMjg3OCxURVhUVVJFXzNEOjMyODc5LFRFWFRVUkVfV1JBUF9SOjMyODgyLE1BWF8zRF9URVhUVVJFX1NJWkU6MzI4ODMsVU5TSUdORURfSU5UXzJfMTBfMTBfMTBfUkVWOjMzNjQwLE1BWF9FTEVNRU5UU19WRVJUSUNFUzozM2UzLE1BWF9FTEVNRU5UU19JTkRJQ0VTOjMzMDAxLFRFWFRVUkVfTUlOX0xPRDozMzA4MixURVhUVVJFX01BWF9MT0Q6MzMwODMsVEVYVFVSRV9CQVNFX0xFVkVMOjMzMDg0LFRFWFRVUkVfTUFYX0xFVkVMOjMzMDg1LE1JTjozMjc3NSxNQVg6MzI3NzYsREVQVEhfQ09NUE9ORU5UMjQ6MzMxOTAsTUFYX1RFWFRVUkVfTE9EX0JJQVM6MzQwNDUsVEVYVFVSRV9DT01QQVJFX01PREU6MzQ4OTIsVEVYVFVSRV9DT01QQVJFX0ZVTkM6MzQ4OTMsQ1VSUkVOVF9RVUVSWTozNDkxNyxRVUVSWV9SRVNVTFQ6MzQ5MTgsUVVFUllfUkVTVUxUX0FWQUlMQUJMRTozNDkxOSxTVFJFQU1fUkVBRDozNTA0MSxTVFJFQU1fQ09QWTozNTA0MixTVEFUSUNfUkVBRDozNTA0NSxTVEFUSUNfQ09QWTozNTA0NixEWU5BTUlDX1JFQUQ6MzUwNDksRFlOQU1JQ19DT1BZOjM1MDUwLE1BWF9EUkFXX0JVRkZFUlM6MzQ4NTIsRFJBV19CVUZGRVIwOjM0ODUzLERSQVdfQlVGRkVSMTozNDg1NCxEUkFXX0JVRkZFUjI6MzQ4NTUsRFJBV19CVUZGRVIzOjM0ODU2LERSQVdfQlVGRkVSNDozNDg1NyxEUkFXX0JVRkZFUjU6MzQ4NTgsRFJBV19CVUZGRVI2OjM0ODU5LERSQVdfQlVGRkVSNzozNDg2MCxEUkFXX0JVRkZFUjg6MzQ4NjEsRFJBV19CVUZGRVI5OjM0ODYyLERSQVdfQlVGRkVSMTA6MzQ4NjMsRFJBV19CVUZGRVIxMTozNDg2NCxEUkFXX0JVRkZFUjEyOjM0ODY1LERSQVdfQlVGRkVSMTM6MzQ4NjYsRFJBV19CVUZGRVIxNDozNDg2NyxEUkFXX0JVRkZFUjE1OjM0ODY4LE1BWF9GUkFHTUVOVF9VTklGT1JNX0NPTVBPTkVOVFM6MzU2NTcsTUFYX1ZFUlRFWF9VTklGT1JNX0NPTVBPTkVOVFM6MzU2NTgsU0FNUExFUl8zRDozNTY3OSxTQU1QTEVSXzJEX1NIQURPVzozNTY4MixGUkFHTUVOVF9TSEFERVJfREVSSVZBVElWRV9ISU5UOjM1NzIzLFBJWEVMX1BBQ0tfQlVGRkVSOjM1MDUxLFBJWEVMX1VOUEFDS19CVUZGRVI6MzUwNTIsUElYRUxfUEFDS19CVUZGRVJfQklORElORzozNTA1MyxQSVhFTF9VTlBBQ0tfQlVGRkVSX0JJTkRJTkc6MzUwNTUsRkxPQVRfTUFUMngzOjM1Njg1LEZMT0FUX01BVDJ4NDozNTY4NixGTE9BVF9NQVQzeDI6MzU2ODcsRkxPQVRfTUFUM3g0OjM1Njg4LEZMT0FUX01BVDR4MjozNTY4OSxGTE9BVF9NQVQ0eDM6MzU2OTAsU1JHQjozNTkwNCxTUkdCODozNTkwNSxTUkdCOF9BTFBIQTg6MzU5MDcsQ09NUEFSRV9SRUZfVE9fVEVYVFVSRTozNDg5NCxSR0JBMzJGOjM0ODM2LFJHQjMyRjozNDgzNyxSR0JBMTZGOjM0ODQyLFJHQjE2RjozNDg0MyxWRVJURVhfQVRUUklCX0FSUkFZX0lOVEVHRVI6MzUwNjksTUFYX0FSUkFZX1RFWFRVUkVfTEFZRVJTOjM1MDcxLE1JTl9QUk9HUkFNX1RFWEVMX09GRlNFVDozNTA3NixNQVhfUFJPR1JBTV9URVhFTF9PRkZTRVQ6MzUwNzcsTUFYX1ZBUllJTkdfQ09NUE9ORU5UUzozNTY1OSxURVhUVVJFXzJEX0FSUkFZOjM1ODY2LFRFWFRVUkVfQklORElOR18yRF9BUlJBWTozNTg2OSxSMTFGX0cxMUZfQjEwRjozNTg5OCxVTlNJR05FRF9JTlRfMTBGXzExRl8xMUZfUkVWOjM1ODk5LFJHQjlfRTU6MzU5MDEsVU5TSUdORURfSU5UXzVfOV85XzlfUkVWOjM1OTAyLFRSQU5TRk9STV9GRUVEQkFDS19CVUZGRVJfTU9ERTozNTk2NyxNQVhfVFJBTlNGT1JNX0ZFRURCQUNLX1NFUEFSQVRFX0NPTVBPTkVOVFM6MzU5NjgsVFJBTlNGT1JNX0ZFRURCQUNLX1ZBUllJTkdTOjM1OTcxLFRSQU5TRk9STV9GRUVEQkFDS19CVUZGRVJfU1RBUlQ6MzU5NzIsVFJBTlNGT1JNX0ZFRURCQUNLX0JVRkZFUl9TSVpFOjM1OTczLFRSQU5TRk9STV9GRUVEQkFDS19QUklNSVRJVkVTX1dSSVRURU46MzU5NzYsUkFTVEVSSVpFUl9ESVNDQVJEOjM1OTc3LE1BWF9UUkFOU0ZPUk1fRkVFREJBQ0tfSU5URVJMRUFWRURfQ09NUE9ORU5UUzozNTk3OCxNQVhfVFJBTlNGT1JNX0ZFRURCQUNLX1NFUEFSQVRFX0FUVFJJQlM6MzU5NzksSU5URVJMRUFWRURfQVRUUklCUzozNTk4MCxTRVBBUkFURV9BVFRSSUJTOjM1OTgxLFRSQU5TRk9STV9GRUVEQkFDS19CVUZGRVI6MzU5ODIsVFJBTlNGT1JNX0ZFRURCQUNLX0JVRkZFUl9CSU5ESU5HOjM1OTgzLFJHQkEzMlVJOjM2MjA4LFJHQjMyVUk6MzYyMDksUkdCQTE2VUk6MzYyMTQsUkdCMTZVSTozNjIxNSxSR0JBOFVJOjM2MjIwLFJHQjhVSTozNjIyMSxSR0JBMzJJOjM2MjI2LFJHQjMySTozNjIyNyxSR0JBMTZJOjM2MjMyLFJHQjE2STozNjIzMyxSR0JBOEk6MzYyMzgsUkdCOEk6MzYyMzksUkVEX0lOVEVHRVI6MzYyNDQsUkdCX0lOVEVHRVI6MzYyNDgsUkdCQV9JTlRFR0VSOjM2MjQ5LFNBTVBMRVJfMkRfQVJSQVk6MzYyODksU0FNUExFUl8yRF9BUlJBWV9TSEFET1c6MzYyOTIsU0FNUExFUl9DVUJFX1NIQURPVzozNjI5MyxVTlNJR05FRF9JTlRfVkVDMjozNjI5NCxVTlNJR05FRF9JTlRfVkVDMzozNjI5NSxVTlNJR05FRF9JTlRfVkVDNDozNjI5NixJTlRfU0FNUExFUl8yRDozNjI5OCxJTlRfU0FNUExFUl8zRDozNjI5OSxJTlRfU0FNUExFUl9DVUJFOjM2MzAwLElOVF9TQU1QTEVSXzJEX0FSUkFZOjM2MzAzLFVOU0lHTkVEX0lOVF9TQU1QTEVSXzJEOjM2MzA2LFVOU0lHTkVEX0lOVF9TQU1QTEVSXzNEOjM2MzA3LFVOU0lHTkVEX0lOVF9TQU1QTEVSX0NVQkU6MzYzMDgsVU5TSUdORURfSU5UX1NBTVBMRVJfMkRfQVJSQVk6MzYzMTEsREVQVEhfQ09NUE9ORU5UMzJGOjM2MDEyLERFUFRIMzJGX1NURU5DSUw4OjM2MDEzLEZMT0FUXzMyX1VOU0lHTkVEX0lOVF8yNF84X1JFVjozNjI2OSxGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX0NPTE9SX0VOQ09ESU5HOjMzMjk2LEZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfQ09NUE9ORU5UX1RZUEU6MzMyOTcsRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9SRURfU0laRTozMzI5OCxGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX0dSRUVOX1NJWkU6MzMyOTksRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9CTFVFX1NJWkU6MzMzMDAsRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9BTFBIQV9TSVpFOjMzMzAxLEZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfREVQVEhfU0laRTozMzMwMixGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1NURU5DSUxfU0laRTozMzMwMyxGUkFNRUJVRkZFUl9ERUZBVUxUOjMzMzA0LFVOU0lHTkVEX0lOVF8yNF84OjM0MDQyLERFUFRIMjRfU1RFTkNJTDg6MzUwNTYsVU5TSUdORURfTk9STUFMSVpFRDozNTg2MyxEUkFXX0ZSQU1FQlVGRkVSX0JJTkRJTkc6MzYwMDYsUkVBRF9GUkFNRUJVRkZFUjozNjAwOCxEUkFXX0ZSQU1FQlVGRkVSOjM2MDA5LFJFQURfRlJBTUVCVUZGRVJfQklORElORzozNjAxMCxSRU5ERVJCVUZGRVJfU0FNUExFUzozNjAxMSxGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfTEFZRVI6MzYwNTIsTUFYX0NPTE9SX0FUVEFDSE1FTlRTOjM2MDYzLENPTE9SX0FUVEFDSE1FTlQxOjM2MDY1LENPTE9SX0FUVEFDSE1FTlQyOjM2MDY2LENPTE9SX0FUVEFDSE1FTlQzOjM2MDY3LENPTE9SX0FUVEFDSE1FTlQ0OjM2MDY4LENPTE9SX0FUVEFDSE1FTlQ1OjM2MDY5LENPTE9SX0FUVEFDSE1FTlQ2OjM2MDcwLENPTE9SX0FUVEFDSE1FTlQ3OjM2MDcxLENPTE9SX0FUVEFDSE1FTlQ4OjM2MDcyLENPTE9SX0FUVEFDSE1FTlQ5OjM2MDczLENPTE9SX0FUVEFDSE1FTlQxMDozNjA3NCxDT0xPUl9BVFRBQ0hNRU5UMTE6MzYwNzUsQ09MT1JfQVRUQUNITUVOVDEyOjM2MDc2LENPTE9SX0FUVEFDSE1FTlQxMzozNjA3NyxDT0xPUl9BVFRBQ0hNRU5UMTQ6MzYwNzgsQ09MT1JfQVRUQUNITUVOVDE1OjM2MDc5LEZSQU1FQlVGRkVSX0lOQ09NUExFVEVfTVVMVElTQU1QTEU6MzYxODIsTUFYX1NBTVBMRVM6MzYxODMsSEFMRl9GTE9BVDo1MTMxLFJHOjMzMzE5LFJHX0lOVEVHRVI6MzMzMjAsUjg6MzMzMjEsUkc4OjMzMzIzLFIxNkY6MzMzMjUsUjMyRjozMzMyNixSRzE2RjozMzMyNyxSRzMyRjozMzMyOCxSOEk6MzMzMjksUjhVSTozMzMzMCxSMTZJOjMzMzMxLFIxNlVJOjMzMzMyLFIzMkk6MzMzMzMsUjMyVUk6MzMzMzQsUkc4STozMzMzNSxSRzhVSTozMzMzNixSRzE2STozMzMzNyxSRzE2VUk6MzMzMzgsUkczMkk6MzMzMzksUkczMlVJOjMzMzQwLFZFUlRFWF9BUlJBWV9CSU5ESU5HOjM0MjI5LFI4X1NOT1JNOjM2NzU2LFJHOF9TTk9STTozNjc1NyxSR0I4X1NOT1JNOjM2NzU4LFJHQkE4X1NOT1JNOjM2NzU5LFNJR05FRF9OT1JNQUxJWkVEOjM2NzY0LENPUFlfUkVBRF9CVUZGRVI6MzY2NjIsQ09QWV9XUklURV9CVUZGRVI6MzY2NjMsQ09QWV9SRUFEX0JVRkZFUl9CSU5ESU5HOjM2NjYyLENPUFlfV1JJVEVfQlVGRkVSX0JJTkRJTkc6MzY2NjMsVU5JRk9STV9CVUZGRVI6MzUzNDUsVU5JRk9STV9CVUZGRVJfQklORElORzozNTM2OCxVTklGT1JNX0JVRkZFUl9TVEFSVDozNTM2OSxVTklGT1JNX0JVRkZFUl9TSVpFOjM1MzcwLE1BWF9WRVJURVhfVU5JRk9STV9CTE9DS1M6MzUzNzEsTUFYX0ZSQUdNRU5UX1VOSUZPUk1fQkxPQ0tTOjM1MzczLE1BWF9DT01CSU5FRF9VTklGT1JNX0JMT0NLUzozNTM3NCxNQVhfVU5JRk9STV9CVUZGRVJfQklORElOR1M6MzUzNzUsTUFYX1VOSUZPUk1fQkxPQ0tfU0laRTozNTM3NixNQVhfQ09NQklORURfVkVSVEVYX1VOSUZPUk1fQ09NUE9ORU5UUzozNTM3NyxNQVhfQ09NQklORURfRlJBR01FTlRfVU5JRk9STV9DT01QT05FTlRTOjM1Mzc5LFVOSUZPUk1fQlVGRkVSX09GRlNFVF9BTElHTk1FTlQ6MzUzODAsQUNUSVZFX1VOSUZPUk1fQkxPQ0tTOjM1MzgyLFVOSUZPUk1fVFlQRTozNTM4MyxVTklGT1JNX1NJWkU6MzUzODQsVU5JRk9STV9CTE9DS19JTkRFWDozNTM4NixVTklGT1JNX09GRlNFVDozNTM4NyxVTklGT1JNX0FSUkFZX1NUUklERTozNTM4OCxVTklGT1JNX01BVFJJWF9TVFJJREU6MzUzODksVU5JRk9STV9JU19ST1dfTUFKT1I6MzUzOTAsVU5JRk9STV9CTE9DS19CSU5ESU5HOjM1MzkxLFVOSUZPUk1fQkxPQ0tfREFUQV9TSVpFOjM1MzkyLFVOSUZPUk1fQkxPQ0tfQUNUSVZFX1VOSUZPUk1TOjM1Mzk0LFVOSUZPUk1fQkxPQ0tfQUNUSVZFX1VOSUZPUk1fSU5ESUNFUzozNTM5NSxVTklGT1JNX0JMT0NLX1JFRkVSRU5DRURfQllfVkVSVEVYX1NIQURFUjozNTM5NixVTklGT1JNX0JMT0NLX1JFRkVSRU5DRURfQllfRlJBR01FTlRfU0hBREVSOjM1Mzk4LElOVkFMSURfSU5ERVg6NDI5NDk2NzI5NSxNQVhfVkVSVEVYX09VVFBVVF9DT01QT05FTlRTOjM3MTU0LE1BWF9GUkFHTUVOVF9JTlBVVF9DT01QT05FTlRTOjM3MTU3LE1BWF9TRVJWRVJfV0FJVF9USU1FT1VUOjM3MTM3LE9CSkVDVF9UWVBFOjM3MTM4LFNZTkNfQ09ORElUSU9OOjM3MTM5LFNZTkNfU1RBVFVTOjM3MTQwLFNZTkNfRkxBR1M6MzcxNDEsU1lOQ19GRU5DRTozNzE0MixTWU5DX0dQVV9DT01NQU5EU19DT01QTEVURTozNzE0MyxVTlNJR05BTEVEOjM3MTQ0LFNJR05BTEVEOjM3MTQ1LEFMUkVBRFlfU0lHTkFMRUQ6MzcxNDYsVElNRU9VVF9FWFBJUkVEOjM3MTQ3LENPTkRJVElPTl9TQVRJU0ZJRUQ6MzcxNDgsV0FJVF9GQUlMRUQ6MzcxNDksU1lOQ19GTFVTSF9DT01NQU5EU19CSVQ6MSxWRVJURVhfQVRUUklCX0FSUkFZX0RJVklTT1I6MzUwNzAsQU5ZX1NBTVBMRVNfUEFTU0VEOjM1ODg3LEFOWV9TQU1QTEVTX1BBU1NFRF9DT05TRVJWQVRJVkU6MzYyMDIsU0FNUExFUl9CSU5ESU5HOjM1MDk3LFJHQjEwX0EyVUk6MzY5NzUsSU5UXzJfMTBfMTBfMTBfUkVWOjM2MjU1LFRSQU5TRk9STV9GRUVEQkFDSzozNjM4NixUUkFOU0ZPUk1fRkVFREJBQ0tfUEFVU0VEOjM2Mzg3LFRSQU5TRk9STV9GRUVEQkFDS19BQ1RJVkU6MzYzODgsVFJBTlNGT1JNX0ZFRURCQUNLX0JJTkRJTkc6MzYzODksQ09NUFJFU1NFRF9SMTFfRUFDOjM3NDg4LENPTVBSRVNTRURfU0lHTkVEX1IxMV9FQUM6Mzc0ODksQ09NUFJFU1NFRF9SRzExX0VBQzozNzQ5MCxDT01QUkVTU0VEX1NJR05FRF9SRzExX0VBQzozNzQ5MSxDT01QUkVTU0VEX1JHQjhfRVRDMjozNzQ5MixDT01QUkVTU0VEX1NSR0I4X0VUQzI6Mzc0OTMsQ09NUFJFU1NFRF9SR0I4X1BVTkNIVEhST1VHSF9BTFBIQTFfRVRDMjozNzQ5NCxDT01QUkVTU0VEX1NSR0I4X1BVTkNIVEhST1VHSF9BTFBIQTFfRVRDMjozNzQ5NSxDT01QUkVTU0VEX1JHQkE4X0VUQzJfRUFDOjM3NDk2LENPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0VUQzJfRUFDOjM3NDk3LFRFWFRVUkVfSU1NVVRBQkxFX0ZPUk1BVDozNzE2NyxNQVhfRUxFTUVOVF9JTkRFWDozNjIwMyxURVhUVVJFX0lNTVVUQUJMRV9MRVZFTFM6MzM1MDMsTUFYX1RFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhUOjM0MDQ3fSk7Y29uc3QgSmU9e0NMT0NLV0lTRTpnci5DVyxDT1VOVEVSX0NMT0NLV0lTRTpnci5DQ1d9O0plLnZhbGlkYXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0PT09SmUuQ0xPQ0tXSVNFfHx0PT09SmUuQ09VTlRFUl9DTE9DS1dJU0V9O3ZhciBibj1PYmplY3QuZnJlZXplKEplKTtmdW5jdGlvbiBBdCh0KXt0aGlzLl9lbGxpcHNvaWQ9bSh0LGouV0dTODQpLHRoaXMuX3NlbWltYWpvckF4aXM9dGhpcy5fZWxsaXBzb2lkLm1heGltdW1SYWRpdXMsdGhpcy5fb25lT3ZlclNlbWltYWpvckF4aXM9MS90aGlzLl9zZW1pbWFqb3JBeGlzfU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEF0LnByb3RvdHlwZSx7ZWxsaXBzb2lkOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWxsaXBzb2lkfX19KSxBdC5tZXJjYXRvckFuZ2xlVG9HZW9kZXRpY0xhdGl0dWRlPWZ1bmN0aW9uKHQpe3JldHVybiBSLlBJX09WRVJfVFdPLTIqTWF0aC5hdGFuKE1hdGguZXhwKC10KSl9LEF0Lmdlb2RldGljTGF0aXR1ZGVUb01lcmNhdG9yQW5nbGU9ZnVuY3Rpb24odCl7dD5BdC5NYXhpbXVtTGF0aXR1ZGU/dD1BdC5NYXhpbXVtTGF0aXR1ZGU6dDwtQXQuTWF4aW11bUxhdGl0dWRlJiYodD0tQXQuTWF4aW11bUxhdGl0dWRlKTtjb25zdCBlPU1hdGguc2luKHQpO3JldHVybiAuNSpNYXRoLmxvZygoMStlKS8oMS1lKSl9LEF0Lk1heGltdW1MYXRpdHVkZT1BdC5tZXJjYXRvckFuZ2xlVG9HZW9kZXRpY0xhdGl0dWRlKE1hdGguUEkpLEF0LnByb3RvdHlwZS5wcm9qZWN0PWZ1bmN0aW9uKHQsZSl7Y29uc3Qgbj10aGlzLl9zZW1pbWFqb3JBeGlzLHI9dC5sb25naXR1ZGUqbixpPUF0Lmdlb2RldGljTGF0aXR1ZGVUb01lcmNhdG9yQW5nbGUodC5sYXRpdHVkZSkqbixvPXQuaGVpZ2h0O3JldHVybiBwKGUpPyhlLng9cixlLnk9aSxlLno9byxlKTpuZXcgZihyLGksbyl9LEF0LnByb3RvdHlwZS51bnByb2plY3Q9ZnVuY3Rpb24odCxlKXtpZighcCh0KSl0aHJvdyBuZXcgeCgiY2FydGVzaWFuIGlzIHJlcXVpcmVkIik7Y29uc3Qgbj10aGlzLl9vbmVPdmVyU2VtaW1ham9yQXhpcyxyPXQueCpuLGk9QXQubWVyY2F0b3JBbmdsZVRvR2VvZGV0aWNMYXRpdHVkZSh0Lnkqbiksbz10Lno7cmV0dXJuIHAoZSk/KGUubG9uZ2l0dWRlPXIsZS5sYXRpdHVkZT1pLGUuaGVpZ2h0PW8sZSk6bmV3IEgocixpLG8pfTtjbGFzcyBGb3thZGQoZSxuLHIpe2lmKHR5cGVvZiBhcmd1bWVudHNbMF0hPSJzdHJpbmciKWZvcihsZXQgaSBpbiBhcmd1bWVudHNbMF0pdGhpcy5hZGQoaSxhcmd1bWVudHNbMF1baV0sYXJndW1lbnRzWzFdKTtlbHNlKEFycmF5LmlzQXJyYXkoZSk/ZTpbZV0pLmZvckVhY2goZnVuY3Rpb24oaSl7dGhpc1tpXT10aGlzW2ldfHxbXSxuJiZ0aGlzW2ldW3I/InVuc2hpZnQiOiJwdXNoIl0obil9LHRoaXMpfXJ1bihlLG4pe3RoaXNbZV09dGhpc1tlXXx8W10sdGhpc1tlXS5mb3JFYWNoKGZ1bmN0aW9uKHIpe3IuY2FsbChuJiZuLmNvbnRleHQ/bi5jb250ZXh0Om4sbil9KX19Y2xhc3Mgd297Y29uc3RydWN0b3IoZSl7dGhpcy5qc2VwPWUsdGhpcy5yZWdpc3RlcmVkPXt9fXJlZ2lzdGVyKC4uLmUpe2UuZm9yRWFjaChuPT57aWYodHlwZW9mIG4hPSJvYmplY3QifHwhbi5uYW1lfHwhbi5pbml0KXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBKU0VQIHBsdWdpbiBmb3JtYXQiKTt0aGlzLnJlZ2lzdGVyZWRbbi5uYW1lXXx8KG4uaW5pdCh0aGlzLmpzZXApLHRoaXMucmVnaXN0ZXJlZFtuLm5hbWVdPW4pfSl9fWNsYXNzIEV7c3RhdGljIGdldCB2ZXJzaW9uKCl7cmV0dXJuIjEuMy44In1zdGF0aWMgdG9TdHJpbmcoKXtyZXR1cm4iSmF2YVNjcmlwdCBFeHByZXNzaW9uIFBhcnNlciAoSlNFUCkgdiIrRS52ZXJzaW9ufXN0YXRpYyBhZGRVbmFyeU9wKGUpe3JldHVybiBFLm1heF91bm9wX2xlbj1NYXRoLm1heChlLmxlbmd0aCxFLm1heF91bm9wX2xlbiksRS51bmFyeV9vcHNbZV09MSxFfXN0YXRpYyBhZGRCaW5hcnlPcChlLG4scil7cmV0dXJuIEUubWF4X2Jpbm9wX2xlbj1NYXRoLm1heChlLmxlbmd0aCxFLm1heF9iaW5vcF9sZW4pLEUuYmluYXJ5X29wc1tlXT1uLHI/RS5yaWdodF9hc3NvY2lhdGl2ZS5hZGQoZSk6RS5yaWdodF9hc3NvY2lhdGl2ZS5kZWxldGUoZSksRX1zdGF0aWMgYWRkSWRlbnRpZmllckNoYXIoZSl7cmV0dXJuIEUuYWRkaXRpb25hbF9pZGVudGlmaWVyX2NoYXJzLmFkZChlKSxFfXN0YXRpYyBhZGRMaXRlcmFsKGUsbil7cmV0dXJuIEUubGl0ZXJhbHNbZV09bixFfXN0YXRpYyByZW1vdmVVbmFyeU9wKGUpe3JldHVybiBkZWxldGUgRS51bmFyeV9vcHNbZV0sZS5sZW5ndGg9PT1FLm1heF91bm9wX2xlbiYmKEUubWF4X3Vub3BfbGVuPUUuZ2V0TWF4S2V5TGVuKEUudW5hcnlfb3BzKSksRX1zdGF0aWMgcmVtb3ZlQWxsVW5hcnlPcHMoKXtyZXR1cm4gRS51bmFyeV9vcHM9e30sRS5tYXhfdW5vcF9sZW49MCxFfXN0YXRpYyByZW1vdmVJZGVudGlmaWVyQ2hhcihlKXtyZXR1cm4gRS5hZGRpdGlvbmFsX2lkZW50aWZpZXJfY2hhcnMuZGVsZXRlKGUpLEV9c3RhdGljIHJlbW92ZUJpbmFyeU9wKGUpe3JldHVybiBkZWxldGUgRS5iaW5hcnlfb3BzW2VdLGUubGVuZ3RoPT09RS5tYXhfYmlub3BfbGVuJiYoRS5tYXhfYmlub3BfbGVuPUUuZ2V0TWF4S2V5TGVuKEUuYmluYXJ5X29wcykpLEUucmlnaHRfYXNzb2NpYXRpdmUuZGVsZXRlKGUpLEV9c3RhdGljIHJlbW92ZUFsbEJpbmFyeU9wcygpe3JldHVybiBFLmJpbmFyeV9vcHM9e30sRS5tYXhfYmlub3BfbGVuPTAsRX1zdGF0aWMgcmVtb3ZlTGl0ZXJhbChlKXtyZXR1cm4gZGVsZXRlIEUubGl0ZXJhbHNbZV0sRX1zdGF0aWMgcmVtb3ZlQWxsTGl0ZXJhbHMoKXtyZXR1cm4gRS5saXRlcmFscz17fSxFfWdldCBjaGFyKCl7cmV0dXJuIHRoaXMuZXhwci5jaGFyQXQodGhpcy5pbmRleCl9Z2V0IGNvZGUoKXtyZXR1cm4gdGhpcy5leHByLmNoYXJDb2RlQXQodGhpcy5pbmRleCl9Y29uc3RydWN0b3IoZSl7dGhpcy5leHByPWUsdGhpcy5pbmRleD0wfXN0YXRpYyBwYXJzZShlKXtyZXR1cm4gbmV3IEUoZSkucGFyc2UoKX1zdGF0aWMgZ2V0TWF4S2V5TGVuKGUpe3JldHVybiBNYXRoLm1heCgwLC4uLk9iamVjdC5rZXlzKGUpLm1hcChuPT5uLmxlbmd0aCkpfXN0YXRpYyBpc0RlY2ltYWxEaWdpdChlKXtyZXR1cm4gZT49NDgmJmU8PTU3fXN0YXRpYyBiaW5hcnlQcmVjZWRlbmNlKGUpe3JldHVybiBFLmJpbmFyeV9vcHNbZV18fDB9c3RhdGljIGlzSWRlbnRpZmllclN0YXJ0KGUpe3JldHVybiBlPj02NSYmZTw9OTB8fGU+PTk3JiZlPD0xMjJ8fGU+PTEyOCYmIUUuYmluYXJ5X29wc1tTdHJpbmcuZnJvbUNoYXJDb2RlKGUpXXx8RS5hZGRpdGlvbmFsX2lkZW50aWZpZXJfY2hhcnMuaGFzKFN0cmluZy5mcm9tQ2hhckNvZGUoZSkpfXN0YXRpYyBpc0lkZW50aWZpZXJQYXJ0KGUpe3JldHVybiBFLmlzSWRlbnRpZmllclN0YXJ0KGUpfHxFLmlzRGVjaW1hbERpZ2l0KGUpfXRocm93RXJyb3IoZSl7Y29uc3Qgbj1uZXcgRXJyb3IoZSsiIGF0IGNoYXJhY3RlciAiK3RoaXMuaW5kZXgpO3Rocm93IG4uaW5kZXg9dGhpcy5pbmRleCxuLmRlc2NyaXB0aW9uPWUsbn1ydW5Ib29rKGUsbil7aWYoRS5ob29rc1tlXSl7Y29uc3Qgcj17Y29udGV4dDp0aGlzLG5vZGU6bn07cmV0dXJuIEUuaG9va3MucnVuKGUsciksci5ub2RlfXJldHVybiBufXNlYXJjaEhvb2soZSl7aWYoRS5ob29rc1tlXSl7Y29uc3Qgbj17Y29udGV4dDp0aGlzfTtyZXR1cm4gRS5ob29rc1tlXS5maW5kKGZ1bmN0aW9uKHIpe3JldHVybiByLmNhbGwobi5jb250ZXh0LG4pLG4ubm9kZX0pLG4ubm9kZX19Z29iYmxlU3BhY2VzKCl7bGV0IGU9dGhpcy5jb2RlO2Zvcig7ZT09PUUuU1BBQ0VfQ09ERXx8ZT09PUUuVEFCX0NPREV8fGU9PT1FLkxGX0NPREV8fGU9PT1FLkNSX0NPREU7KWU9dGhpcy5leHByLmNoYXJDb2RlQXQoKyt0aGlzLmluZGV4KTt0aGlzLnJ1bkhvb2soImdvYmJsZS1zcGFjZXMiKX1wYXJzZSgpe3RoaXMucnVuSG9vaygiYmVmb3JlLWFsbCIpO2NvbnN0IGU9dGhpcy5nb2JibGVFeHByZXNzaW9ucygpLG49ZS5sZW5ndGg9PT0xP2VbMF06e3R5cGU6RS5DT01QT1VORCxib2R5OmV9O3JldHVybiB0aGlzLnJ1bkhvb2soImFmdGVyLWFsbCIsbil9Z29iYmxlRXhwcmVzc2lvbnMoZSl7bGV0IG49W10scixpO2Zvcig7dGhpcy5pbmRleDx0aGlzLmV4cHIubGVuZ3RoOylpZihyPXRoaXMuY29kZSxyPT09RS5TRU1DT0xfQ09ERXx8cj09PUUuQ09NTUFfQ09ERSl0aGlzLmluZGV4Kys7ZWxzZSBpZihpPXRoaXMuZ29iYmxlRXhwcmVzc2lvbigpKW4ucHVzaChpKTtlbHNlIGlmKHRoaXMuaW5kZXg8dGhpcy5leHByLmxlbmd0aCl7aWYocj09PWUpYnJlYWs7dGhpcy50aHJvd0Vycm9yKCdVbmV4cGVjdGVkICInK3RoaXMuY2hhcisnIicpfXJldHVybiBufWdvYmJsZUV4cHJlc3Npb24oKXtjb25zdCBlPXRoaXMuc2VhcmNoSG9vaygiZ29iYmxlLWV4cHJlc3Npb24iKXx8dGhpcy5nb2JibGVCaW5hcnlFeHByZXNzaW9uKCk7cmV0dXJuIHRoaXMuZ29iYmxlU3BhY2VzKCksdGhpcy5ydW5Ib29rKCJhZnRlci1leHByZXNzaW9uIixlKX1nb2JibGVCaW5hcnlPcCgpe3RoaXMuZ29iYmxlU3BhY2VzKCk7bGV0IGU9dGhpcy5leHByLnN1YnN0cih0aGlzLmluZGV4LEUubWF4X2Jpbm9wX2xlbiksbj1lLmxlbmd0aDtmb3IoO24+MDspe2lmKEUuYmluYXJ5X29wcy5oYXNPd25Qcm9wZXJ0eShlKSYmKCFFLmlzSWRlbnRpZmllclN0YXJ0KHRoaXMuY29kZSl8fHRoaXMuaW5kZXgrZS5sZW5ndGg8dGhpcy5leHByLmxlbmd0aCYmIUUuaXNJZGVudGlmaWVyUGFydCh0aGlzLmV4cHIuY2hhckNvZGVBdCh0aGlzLmluZGV4K2UubGVuZ3RoKSkpKXJldHVybiB0aGlzLmluZGV4Kz1uLGU7ZT1lLnN1YnN0cigwLC0tbil9cmV0dXJuITF9Z29iYmxlQmluYXJ5RXhwcmVzc2lvbigpe2xldCBlLG4scixpLG8scyx1LGEsbDtpZihzPXRoaXMuZ29iYmxlVG9rZW4oKSwhc3x8KG49dGhpcy5nb2JibGVCaW5hcnlPcCgpLCFuKSlyZXR1cm4gcztmb3Iobz17dmFsdWU6bixwcmVjOkUuYmluYXJ5UHJlY2VkZW5jZShuKSxyaWdodF9hOkUucmlnaHRfYXNzb2NpYXRpdmUuaGFzKG4pfSx1PXRoaXMuZ29iYmxlVG9rZW4oKSx1fHx0aGlzLnRocm93RXJyb3IoIkV4cGVjdGVkIGV4cHJlc3Npb24gYWZ0ZXIgIituKSxpPVtzLG8sdV07bj10aGlzLmdvYmJsZUJpbmFyeU9wKCk7KXtpZihyPUUuYmluYXJ5UHJlY2VkZW5jZShuKSxyPT09MCl7dGhpcy5pbmRleC09bi5sZW5ndGg7YnJlYWt9bz17dmFsdWU6bixwcmVjOnIscmlnaHRfYTpFLnJpZ2h0X2Fzc29jaWF0aXZlLmhhcyhuKX0sbD1uO2NvbnN0IGQ9Xz0+by5yaWdodF9hJiZfLnJpZ2h0X2E/cj5fLnByZWM6cjw9Xy5wcmVjO2Zvcig7aS5sZW5ndGg+MiYmZChpW2kubGVuZ3RoLTJdKTspdT1pLnBvcCgpLG49aS5wb3AoKS52YWx1ZSxzPWkucG9wKCksZT17dHlwZTpFLkJJTkFSWV9FWFAsb3BlcmF0b3I6bixsZWZ0OnMscmlnaHQ6dX0saS5wdXNoKGUpO2U9dGhpcy5nb2JibGVUb2tlbigpLGV8fHRoaXMudGhyb3dFcnJvcigiRXhwZWN0ZWQgZXhwcmVzc2lvbiBhZnRlciAiK2wpLGkucHVzaChvLGUpfWZvcihhPWkubGVuZ3RoLTEsZT1pW2FdO2E+MTspZT17dHlwZTpFLkJJTkFSWV9FWFAsb3BlcmF0b3I6aVthLTFdLnZhbHVlLGxlZnQ6aVthLTJdLHJpZ2h0OmV9LGEtPTI7cmV0dXJuIGV9Z29iYmxlVG9rZW4oKXtsZXQgZSxuLHIsaTtpZih0aGlzLmdvYmJsZVNwYWNlcygpLGk9dGhpcy5zZWFyY2hIb29rKCJnb2JibGUtdG9rZW4iKSxpKXJldHVybiB0aGlzLnJ1bkhvb2soImFmdGVyLXRva2VuIixpKTtpZihlPXRoaXMuY29kZSxFLmlzRGVjaW1hbERpZ2l0KGUpfHxlPT09RS5QRVJJT0RfQ09ERSlyZXR1cm4gdGhpcy5nb2JibGVOdW1lcmljTGl0ZXJhbCgpO2lmKGU9PT1FLlNRVU9URV9DT0RFfHxlPT09RS5EUVVPVEVfQ09ERSlpPXRoaXMuZ29iYmxlU3RyaW5nTGl0ZXJhbCgpO2Vsc2UgaWYoZT09PUUuT0JSQUNLX0NPREUpaT10aGlzLmdvYmJsZUFycmF5KCk7ZWxzZXtmb3Iobj10aGlzLmV4cHIuc3Vic3RyKHRoaXMuaW5kZXgsRS5tYXhfdW5vcF9sZW4pLHI9bi5sZW5ndGg7cj4wOyl7aWYoRS51bmFyeV9vcHMuaGFzT3duUHJvcGVydHkobikmJighRS5pc0lkZW50aWZpZXJTdGFydCh0aGlzLmNvZGUpfHx0aGlzLmluZGV4K24ubGVuZ3RoPHRoaXMuZXhwci5sZW5ndGgmJiFFLmlzSWRlbnRpZmllclBhcnQodGhpcy5leHByLmNoYXJDb2RlQXQodGhpcy5pbmRleCtuLmxlbmd0aCkpKSl7dGhpcy5pbmRleCs9cjtjb25zdCBvPXRoaXMuZ29iYmxlVG9rZW4oKTtyZXR1cm4gb3x8dGhpcy50aHJvd0Vycm9yKCJtaXNzaW5nIHVuYXJ5T3AgYXJndW1lbnQiKSx0aGlzLnJ1bkhvb2soImFmdGVyLXRva2VuIix7dHlwZTpFLlVOQVJZX0VYUCxvcGVyYXRvcjpuLGFyZ3VtZW50Om8scHJlZml4OiEwfSl9bj1uLnN1YnN0cigwLC0tcil9RS5pc0lkZW50aWZpZXJTdGFydChlKT8oaT10aGlzLmdvYmJsZUlkZW50aWZpZXIoKSxFLmxpdGVyYWxzLmhhc093blByb3BlcnR5KGkubmFtZSk/aT17dHlwZTpFLkxJVEVSQUwsdmFsdWU6RS5saXRlcmFsc1tpLm5hbWVdLHJhdzppLm5hbWV9OmkubmFtZT09PUUudGhpc19zdHImJihpPXt0eXBlOkUuVEhJU19FWFB9KSk6ZT09PUUuT1BBUkVOX0NPREUmJihpPXRoaXMuZ29iYmxlR3JvdXAoKSl9cmV0dXJuIGk/KGk9dGhpcy5nb2JibGVUb2tlblByb3BlcnR5KGkpLHRoaXMucnVuSG9vaygiYWZ0ZXItdG9rZW4iLGkpKTp0aGlzLnJ1bkhvb2soImFmdGVyLXRva2VuIiwhMSl9Z29iYmxlVG9rZW5Qcm9wZXJ0eShlKXt0aGlzLmdvYmJsZVNwYWNlcygpO2xldCBuPXRoaXMuY29kZTtmb3IoO249PT1FLlBFUklPRF9DT0RFfHxuPT09RS5PQlJBQ0tfQ09ERXx8bj09PUUuT1BBUkVOX0NPREV8fG49PT1FLlFVTUFSS19DT0RFOyl7bGV0IHI7aWYobj09PUUuUVVNQVJLX0NPREUpe2lmKHRoaXMuZXhwci5jaGFyQ29kZUF0KHRoaXMuaW5kZXgrMSkhPT1FLlBFUklPRF9DT0RFKWJyZWFrO3I9ITAsdGhpcy5pbmRleCs9Mix0aGlzLmdvYmJsZVNwYWNlcygpLG49dGhpcy5jb2RlfXRoaXMuaW5kZXgrKyxuPT09RS5PQlJBQ0tfQ09ERT8oZT17dHlwZTpFLk1FTUJFUl9FWFAsY29tcHV0ZWQ6ITAsb2JqZWN0OmUscHJvcGVydHk6dGhpcy5nb2JibGVFeHByZXNzaW9uKCl9LHRoaXMuZ29iYmxlU3BhY2VzKCksbj10aGlzLmNvZGUsbiE9PUUuQ0JSQUNLX0NPREUmJnRoaXMudGhyb3dFcnJvcigiVW5jbG9zZWQgWyIpLHRoaXMuaW5kZXgrKyk6bj09PUUuT1BBUkVOX0NPREU/ZT17dHlwZTpFLkNBTExfRVhQLGFyZ3VtZW50czp0aGlzLmdvYmJsZUFyZ3VtZW50cyhFLkNQQVJFTl9DT0RFKSxjYWxsZWU6ZX06KG49PT1FLlBFUklPRF9DT0RFfHxyKSYmKHImJnRoaXMuaW5kZXgtLSx0aGlzLmdvYmJsZVNwYWNlcygpLGU9e3R5cGU6RS5NRU1CRVJfRVhQLGNvbXB1dGVkOiExLG9iamVjdDplLHByb3BlcnR5OnRoaXMuZ29iYmxlSWRlbnRpZmllcigpfSksciYmKGUub3B0aW9uYWw9ITApLHRoaXMuZ29iYmxlU3BhY2VzKCksbj10aGlzLmNvZGV9cmV0dXJuIGV9Z29iYmxlTnVtZXJpY0xpdGVyYWwoKXtsZXQgZT0iIixuLHI7Zm9yKDtFLmlzRGVjaW1hbERpZ2l0KHRoaXMuY29kZSk7KWUrPXRoaXMuZXhwci5jaGFyQXQodGhpcy5pbmRleCsrKTtpZih0aGlzLmNvZGU9PT1FLlBFUklPRF9DT0RFKWZvcihlKz10aGlzLmV4cHIuY2hhckF0KHRoaXMuaW5kZXgrKyk7RS5pc0RlY2ltYWxEaWdpdCh0aGlzLmNvZGUpOyllKz10aGlzLmV4cHIuY2hhckF0KHRoaXMuaW5kZXgrKyk7aWYobj10aGlzLmNoYXIsbj09PSJlInx8bj09PSJFIil7Zm9yKGUrPXRoaXMuZXhwci5jaGFyQXQodGhpcy5pbmRleCsrKSxuPXRoaXMuY2hhciwobj09PSIrInx8bj09PSItIikmJihlKz10aGlzLmV4cHIuY2hhckF0KHRoaXMuaW5kZXgrKykpO0UuaXNEZWNpbWFsRGlnaXQodGhpcy5jb2RlKTspZSs9dGhpcy5leHByLmNoYXJBdCh0aGlzLmluZGV4KyspO0UuaXNEZWNpbWFsRGlnaXQodGhpcy5leHByLmNoYXJDb2RlQXQodGhpcy5pbmRleC0xKSl8fHRoaXMudGhyb3dFcnJvcigiRXhwZWN0ZWQgZXhwb25lbnQgKCIrZSt0aGlzLmNoYXIrIikiKX1yZXR1cm4gcj10aGlzLmNvZGUsRS5pc0lkZW50aWZpZXJTdGFydChyKT90aGlzLnRocm93RXJyb3IoIlZhcmlhYmxlIG5hbWVzIGNhbm5vdCBzdGFydCB3aXRoIGEgbnVtYmVyICgiK2UrdGhpcy5jaGFyKyIpIik6KHI9PT1FLlBFUklPRF9DT0RFfHxlLmxlbmd0aD09PTEmJmUuY2hhckNvZGVBdCgwKT09PUUuUEVSSU9EX0NPREUpJiZ0aGlzLnRocm93RXJyb3IoIlVuZXhwZWN0ZWQgcGVyaW9kIikse3R5cGU6RS5MSVRFUkFMLHZhbHVlOnBhcnNlRmxvYXQoZSkscmF3OmV9fWdvYmJsZVN0cmluZ0xpdGVyYWwoKXtsZXQgZT0iIjtjb25zdCBuPXRoaXMuaW5kZXgscj10aGlzLmV4cHIuY2hhckF0KHRoaXMuaW5kZXgrKyk7bGV0IGk9ITE7Zm9yKDt0aGlzLmluZGV4PHRoaXMuZXhwci5sZW5ndGg7KXtsZXQgbz10aGlzLmV4cHIuY2hhckF0KHRoaXMuaW5kZXgrKyk7aWYobz09PXIpe2k9ITA7YnJlYWt9ZWxzZSBpZihvPT09IlxcIilzd2l0Y2gobz10aGlzLmV4cHIuY2hhckF0KHRoaXMuaW5kZXgrKyksbyl7Y2FzZSJuIjplKz1gCmA7YnJlYWs7Y2FzZSJyIjplKz0iXHIiO2JyZWFrO2Nhc2UidCI6ZSs9IgkiO2JyZWFrO2Nhc2UiYiI6ZSs9IlxiIjticmVhaztjYXNlImYiOmUrPSJcZiI7YnJlYWs7Y2FzZSJ2IjplKz0iXHYiO2JyZWFrO2RlZmF1bHQ6ZSs9b31lbHNlIGUrPW99cmV0dXJuIGl8fHRoaXMudGhyb3dFcnJvcignVW5jbG9zZWQgcXVvdGUgYWZ0ZXIgIicrZSsnIicpLHt0eXBlOkUuTElURVJBTCx2YWx1ZTplLHJhdzp0aGlzLmV4cHIuc3Vic3RyaW5nKG4sdGhpcy5pbmRleCl9fWdvYmJsZUlkZW50aWZpZXIoKXtsZXQgZT10aGlzLmNvZGUsbj10aGlzLmluZGV4O2ZvcihFLmlzSWRlbnRpZmllclN0YXJ0KGUpP3RoaXMuaW5kZXgrKzp0aGlzLnRocm93RXJyb3IoIlVuZXhwZWN0ZWQgIit0aGlzLmNoYXIpO3RoaXMuaW5kZXg8dGhpcy5leHByLmxlbmd0aCYmKGU9dGhpcy5jb2RlLEUuaXNJZGVudGlmaWVyUGFydChlKSk7KXRoaXMuaW5kZXgrKztyZXR1cm57dHlwZTpFLklERU5USUZJRVIsbmFtZTp0aGlzLmV4cHIuc2xpY2Uobix0aGlzLmluZGV4KX19Z29iYmxlQXJndW1lbnRzKGUpe2NvbnN0IG49W107bGV0IHI9ITEsaT0wO2Zvcig7dGhpcy5pbmRleDx0aGlzLmV4cHIubGVuZ3RoOyl7dGhpcy5nb2JibGVTcGFjZXMoKTtsZXQgbz10aGlzLmNvZGU7aWYobz09PWUpe3I9ITAsdGhpcy5pbmRleCsrLGU9PT1FLkNQQVJFTl9DT0RFJiZpJiZpPj1uLmxlbmd0aCYmdGhpcy50aHJvd0Vycm9yKCJVbmV4cGVjdGVkIHRva2VuICIrU3RyaW5nLmZyb21DaGFyQ29kZShlKSk7YnJlYWt9ZWxzZSBpZihvPT09RS5DT01NQV9DT0RFKXtpZih0aGlzLmluZGV4KyssaSsrLGkhPT1uLmxlbmd0aCl7aWYoZT09PUUuQ1BBUkVOX0NPREUpdGhpcy50aHJvd0Vycm9yKCJVbmV4cGVjdGVkIHRva2VuICwiKTtlbHNlIGlmKGU9PT1FLkNCUkFDS19DT0RFKWZvcihsZXQgcz1uLmxlbmd0aDtzPGk7cysrKW4ucHVzaChudWxsKX19ZWxzZSBpZihuLmxlbmd0aCE9PWkmJmkhPT0wKXRoaXMudGhyb3dFcnJvcigiRXhwZWN0ZWQgY29tbWEiKTtlbHNle2NvbnN0IHM9dGhpcy5nb2JibGVFeHByZXNzaW9uKCk7KCFzfHxzLnR5cGU9PT1FLkNPTVBPVU5EKSYmdGhpcy50aHJvd0Vycm9yKCJFeHBlY3RlZCBjb21tYSIpLG4ucHVzaChzKX19cmV0dXJuIHJ8fHRoaXMudGhyb3dFcnJvcigiRXhwZWN0ZWQgIitTdHJpbmcuZnJvbUNoYXJDb2RlKGUpKSxufWdvYmJsZUdyb3VwKCl7dGhpcy5pbmRleCsrO2xldCBlPXRoaXMuZ29iYmxlRXhwcmVzc2lvbnMoRS5DUEFSRU5fQ09ERSk7aWYodGhpcy5jb2RlPT09RS5DUEFSRU5fQ09ERSlyZXR1cm4gdGhpcy5pbmRleCsrLGUubGVuZ3RoPT09MT9lWzBdOmUubGVuZ3RoP3t0eXBlOkUuU0VRVUVOQ0VfRVhQLGV4cHJlc3Npb25zOmV9OiExO3RoaXMudGhyb3dFcnJvcigiVW5jbG9zZWQgKCIpfWdvYmJsZUFycmF5KCl7cmV0dXJuIHRoaXMuaW5kZXgrKyx7dHlwZTpFLkFSUkFZX0VYUCxlbGVtZW50czp0aGlzLmdvYmJsZUFyZ3VtZW50cyhFLkNCUkFDS19DT0RFKX19fWNvbnN0IElvPW5ldyBGbztPYmplY3QuYXNzaWduKEUse2hvb2tzOklvLHBsdWdpbnM6bmV3IHdvKEUpLENPTVBPVU5EOiJDb21wb3VuZCIsU0VRVUVOQ0VfRVhQOiJTZXF1ZW5jZUV4cHJlc3Npb24iLElERU5USUZJRVI6IklkZW50aWZpZXIiLE1FTUJFUl9FWFA6Ik1lbWJlckV4cHJlc3Npb24iLExJVEVSQUw6IkxpdGVyYWwiLFRISVNfRVhQOiJUaGlzRXhwcmVzc2lvbiIsQ0FMTF9FWFA6IkNhbGxFeHByZXNzaW9uIixVTkFSWV9FWFA6IlVuYXJ5RXhwcmVzc2lvbiIsQklOQVJZX0VYUDoiQmluYXJ5RXhwcmVzc2lvbiIsQVJSQVlfRVhQOiJBcnJheUV4cHJlc3Npb24iLFRBQl9DT0RFOjksTEZfQ09ERToxMCxDUl9DT0RFOjEzLFNQQUNFX0NPREU6MzIsUEVSSU9EX0NPREU6NDYsQ09NTUFfQ09ERTo0NCxTUVVPVEVfQ09ERTozOSxEUVVPVEVfQ09ERTozNCxPUEFSRU5fQ09ERTo0MCxDUEFSRU5fQ09ERTo0MSxPQlJBQ0tfQ09ERTo5MSxDQlJBQ0tfQ09ERTo5MyxRVU1BUktfQ09ERTo2MyxTRU1DT0xfQ09ERTo1OSxDT0xPTl9DT0RFOjU4LHVuYXJ5X29wczp7Ii0iOjEsIiEiOjEsIn4iOjEsIisiOjF9LGJpbmFyeV9vcHM6eyJ8fCI6MSwiJiYiOjIsInwiOjMsIl4iOjQsIiYiOjUsIj09Ijo2LCIhPSI6NiwiPT09Ijo2LCIhPT0iOjYsIjwiOjcsIj4iOjcsIjw9Ijo3LCI+PSI6NywiPDwiOjgsIj4+Ijo4LCI+Pj4iOjgsIisiOjksIi0iOjksIioiOjEwLCIvIjoxMCwiJSI6MTB9LHJpZ2h0X2Fzc29jaWF0aXZlOm5ldyBTZXQsYWRkaXRpb25hbF9pZGVudGlmaWVyX2NoYXJzOm5ldyBTZXQoWyIkIiwiXyJdKSxsaXRlcmFsczp7dHJ1ZTohMCxmYWxzZTohMSxudWxsOm51bGx9LHRoaXNfc3RyOiJ0aGlzIn0pLEUubWF4X3Vub3BfbGVuPUUuZ2V0TWF4S2V5TGVuKEUudW5hcnlfb3BzKSxFLm1heF9iaW5vcF9sZW49RS5nZXRNYXhLZXlMZW4oRS5iaW5hcnlfb3BzKTtjb25zdCBxdD10PT5uZXcgRSh0KS5wYXJzZSgpO09iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKEUpLmZvckVhY2godD0+e3F0W3RdPT09dm9pZCAwJiZ0IT09InByb3RvdHlwZSImJihxdFt0XT1FW3RdKX0pLHF0LkpzZXA9RTtjb25zdCBObz0iQ29uZGl0aW9uYWxFeHByZXNzaW9uIjt2YXIgTW89e25hbWU6InRlcm5hcnkiLGluaXQodCl7dC5ob29rcy5hZGQoImFmdGVyLWV4cHJlc3Npb24iLGZ1bmN0aW9uKG4pe2lmKG4ubm9kZSYmdGhpcy5jb2RlPT09dC5RVU1BUktfQ09ERSl7dGhpcy5pbmRleCsrO2NvbnN0IHI9bi5ub2RlLGk9dGhpcy5nb2JibGVFeHByZXNzaW9uKCk7aWYoaXx8dGhpcy50aHJvd0Vycm9yKCJFeHBlY3RlZCBleHByZXNzaW9uIiksdGhpcy5nb2JibGVTcGFjZXMoKSx0aGlzLmNvZGU9PT10LkNPTE9OX0NPREUpe3RoaXMuaW5kZXgrKztjb25zdCBvPXRoaXMuZ29iYmxlRXhwcmVzc2lvbigpO2lmKG98fHRoaXMudGhyb3dFcnJvcigiRXhwZWN0ZWQgZXhwcmVzc2lvbiIpLG4ubm9kZT17dHlwZTpObyx0ZXN0OnIsY29uc2VxdWVudDppLGFsdGVybmF0ZTpvfSxyLm9wZXJhdG9yJiZ0LmJpbmFyeV9vcHNbci5vcGVyYXRvcl08PS45KXtsZXQgcz1yO2Zvcig7cy5yaWdodC5vcGVyYXRvciYmdC5iaW5hcnlfb3BzW3MucmlnaHQub3BlcmF0b3JdPD0uOTspcz1zLnJpZ2h0O24ubm9kZS50ZXN0PXMucmlnaHQscy5yaWdodD1uLm5vZGUsbi5ub2RlPXJ9fWVsc2UgdGhpcy50aHJvd0Vycm9yKCJFeHBlY3RlZCA6Iil9fSl9fTtxdC5wbHVnaW5zLnJlZ2lzdGVyKE1vKTtmdW5jdGlvbiBrdCh0KXtpZih0PW0odCxtLkVNUFRZX09CSkVDVCksdGhpcy5fZWxsaXBzb2lkPW0odC5lbGxpcHNvaWQsai5XR1M4NCksdGhpcy5fbnVtYmVyT2ZMZXZlbFplcm9UaWxlc1g9bSh0Lm51bWJlck9mTGV2ZWxaZXJvVGlsZXNYLDEpLHRoaXMuX251bWJlck9mTGV2ZWxaZXJvVGlsZXNZPW0odC5udW1iZXJPZkxldmVsWmVyb1RpbGVzWSwxKSx0aGlzLl9wcm9qZWN0aW9uPW5ldyBBdCh0aGlzLl9lbGxpcHNvaWQpLHAodC5yZWN0YW5nbGVTb3V0aHdlc3RJbk1ldGVycykmJnAodC5yZWN0YW5nbGVOb3J0aGVhc3RJbk1ldGVycykpdGhpcy5fcmVjdGFuZ2xlU291dGh3ZXN0SW5NZXRlcnM9dC5yZWN0YW5nbGVTb3V0aHdlc3RJbk1ldGVycyx0aGlzLl9yZWN0YW5nbGVOb3J0aGVhc3RJbk1ldGVycz10LnJlY3RhbmdsZU5vcnRoZWFzdEluTWV0ZXJzO2Vsc2V7Y29uc3Qgcj10aGlzLl9lbGxpcHNvaWQubWF4aW11bVJhZGl1cypNYXRoLlBJO3RoaXMuX3JlY3RhbmdsZVNvdXRod2VzdEluTWV0ZXJzPW5ldyBBKC1yLC1yKSx0aGlzLl9yZWN0YW5nbGVOb3J0aGVhc3RJbk1ldGVycz1uZXcgQShyLHIpfWNvbnN0IGU9dGhpcy5fcHJvamVjdGlvbi51bnByb2plY3QodGhpcy5fcmVjdGFuZ2xlU291dGh3ZXN0SW5NZXRlcnMpLG49dGhpcy5fcHJvamVjdGlvbi51bnByb2plY3QodGhpcy5fcmVjdGFuZ2xlTm9ydGhlYXN0SW5NZXRlcnMpO3RoaXMuX3JlY3RhbmdsZT1uZXcgSShlLmxvbmdpdHVkZSxlLmxhdGl0dWRlLG4ubG9uZ2l0dWRlLG4ubGF0aXR1ZGUpfU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGt0LnByb3RvdHlwZSx7ZWxsaXBzb2lkOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWxsaXBzb2lkfX0scmVjdGFuZ2xlOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmVjdGFuZ2xlfX0scHJvamVjdGlvbjp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Byb2plY3Rpb259fX0pLGt0LnByb3RvdHlwZS5nZXROdW1iZXJPZlhUaWxlc0F0TGV2ZWw9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX251bWJlck9mTGV2ZWxaZXJvVGlsZXNYPDx0fSxrdC5wcm90b3R5cGUuZ2V0TnVtYmVyT2ZZVGlsZXNBdExldmVsPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9udW1iZXJPZkxldmVsWmVyb1RpbGVzWTw8dH0sa3QucHJvdG90eXBlLnJlY3RhbmdsZVRvTmF0aXZlUmVjdGFuZ2xlPWZ1bmN0aW9uKHQsZSl7Y29uc3Qgbj10aGlzLl9wcm9qZWN0aW9uLHI9bi5wcm9qZWN0KEkuc291dGh3ZXN0KHQpKSxpPW4ucHJvamVjdChJLm5vcnRoZWFzdCh0KSk7cmV0dXJuIHAoZSk/KGUud2VzdD1yLngsZS5zb3V0aD1yLnksZS5lYXN0PWkueCxlLm5vcnRoPWkueSxlKTpuZXcgSShyLngsci55LGkueCxpLnkpfSxrdC5wcm90b3R5cGUudGlsZVhZVG9OYXRpdmVSZWN0YW5nbGU9ZnVuY3Rpb24odCxlLG4scil7Y29uc3QgaT10aGlzLmdldE51bWJlck9mWFRpbGVzQXRMZXZlbChuKSxvPXRoaXMuZ2V0TnVtYmVyT2ZZVGlsZXNBdExldmVsKG4pLHM9KHRoaXMuX3JlY3RhbmdsZU5vcnRoZWFzdEluTWV0ZXJzLngtdGhpcy5fcmVjdGFuZ2xlU291dGh3ZXN0SW5NZXRlcnMueCkvaSx1PXRoaXMuX3JlY3RhbmdsZVNvdXRod2VzdEluTWV0ZXJzLngrdCpzLGE9dGhpcy5fcmVjdGFuZ2xlU291dGh3ZXN0SW5NZXRlcnMueCsodCsxKSpzLGw9KHRoaXMuX3JlY3RhbmdsZU5vcnRoZWFzdEluTWV0ZXJzLnktdGhpcy5fcmVjdGFuZ2xlU291dGh3ZXN0SW5NZXRlcnMueSkvbyxkPXRoaXMuX3JlY3RhbmdsZU5vcnRoZWFzdEluTWV0ZXJzLnktZSpsLF89dGhpcy5fcmVjdGFuZ2xlTm9ydGhlYXN0SW5NZXRlcnMueS0oZSsxKSpsO3JldHVybiBwKHIpPyhyLndlc3Q9dSxyLnNvdXRoPV8sci5lYXN0PWEsci5ub3J0aD1kLHIpOm5ldyBJKHUsXyxhLGQpfSxrdC5wcm90b3R5cGUudGlsZVhZVG9SZWN0YW5nbGU9ZnVuY3Rpb24odCxlLG4scil7Y29uc3QgaT10aGlzLnRpbGVYWVRvTmF0aXZlUmVjdGFuZ2xlKHQsZSxuLHIpLG89dGhpcy5fcHJvamVjdGlvbixzPW8udW5wcm9qZWN0KG5ldyBBKGkud2VzdCxpLnNvdXRoKSksdT1vLnVucHJvamVjdChuZXcgQShpLmVhc3QsaS5ub3J0aCkpO3JldHVybiBpLndlc3Q9cy5sb25naXR1ZGUsaS5zb3V0aD1zLmxhdGl0dWRlLGkuZWFzdD11LmxvbmdpdHVkZSxpLm5vcnRoPXUubGF0aXR1ZGUsaX0sa3QucHJvdG90eXBlLnBvc2l0aW9uVG9UaWxlWFk9ZnVuY3Rpb24odCxlLG4pe2NvbnN0IHI9dGhpcy5fcmVjdGFuZ2xlO2lmKCFJLmNvbnRhaW5zKHIsdCkpcmV0dXJuO2NvbnN0IGk9dGhpcy5nZXROdW1iZXJPZlhUaWxlc0F0TGV2ZWwoZSksbz10aGlzLmdldE51bWJlck9mWVRpbGVzQXRMZXZlbChlKSx1PSh0aGlzLl9yZWN0YW5nbGVOb3J0aGVhc3RJbk1ldGVycy54LXRoaXMuX3JlY3RhbmdsZVNvdXRod2VzdEluTWV0ZXJzLngpL2ksbD0odGhpcy5fcmVjdGFuZ2xlTm9ydGhlYXN0SW5NZXRlcnMueS10aGlzLl9yZWN0YW5nbGVTb3V0aHdlc3RJbk1ldGVycy55KS9vLF89dGhpcy5fcHJvamVjdGlvbi5wcm9qZWN0KHQpLE89Xy54LXRoaXMuX3JlY3RhbmdsZVNvdXRod2VzdEluTWV0ZXJzLngsYj10aGlzLl9yZWN0YW5nbGVOb3J0aGVhc3RJbk1ldGVycy55LV8ueTtsZXQgRj1PL3V8MDtGPj1pJiYoRj1pLTEpO2xldCBTPWIvbHwwO3JldHVybiBTPj1vJiYoUz1vLTEpLHAobik/KG4ueD1GLG4ueT1TLG4pOm5ldyBBKEYsUyl9O2Z1bmN0aW9uIGduKCl7dGhpcy5uYW1lPXZvaWQgMCx0aGlzLmRlc2NyaXB0aW9uPXZvaWQgMCx0aGlzLnBvc2l0aW9uPXZvaWQgMCx0aGlzLmRhdGE9dm9pZCAwLHRoaXMuaW1hZ2VyeUxheWVyPXZvaWQgMH1nbi5wcm90b3R5cGUuY29uZmlndXJlTmFtZUZyb21Qcm9wZXJ0aWVzPWZ1bmN0aW9uKHQpe2xldCBlPTEwLG47Zm9yKGNvbnN0IHIgaW4gdClpZih0Lmhhc093blByb3BlcnR5KHIpJiZ0W3JdKXtjb25zdCBpPXIudG9Mb3dlckNhc2UoKTtlPjEmJmk9PT0ibmFtZSI/KGU9MSxuPXIpOmU+MiYmaT09PSJ0aXRsZSI/KGU9MixuPXIpOmU+MyYmL25hbWUvaS50ZXN0KHIpPyhlPTMsbj1yKTplPjQmJi90aXRsZS9pLnRlc3QocikmJihlPTQsbj1yKX1wKG4pJiYodGhpcy5uYW1lPXRbbl0pfSxnbi5wcm90b3R5cGUuY29uZmlndXJlRGVzY3JpcHRpb25Gcm9tUHJvcGVydGllcz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKG4pe2xldCByPSc8dGFibGUgY2xhc3M9ImNlc2l1bS1pbmZvQm94LWRlZmF1bHRUYWJsZSI+Jztmb3IoY29uc3QgaSBpbiBuKWlmKG4uaGFzT3duUHJvcGVydHkoaSkpe2NvbnN0IG89bltpXTtwKG8pJiYodHlwZW9mIG89PSJvYmplY3QiP3IrPWA8dHI+PHRkPiR7aX08L3RkPjx0ZD4ke2Uobyl9PC90ZD48L3RyPmA6cis9YDx0cj48dGQ+JHtpfTwvdGQ+PHRkPiR7b308L3RkPjwvdHI+YCl9cmV0dXJuIHIrPSI8L3RhYmxlPiIscn10aGlzLmRlc2NyaXB0aW9uPWUodCl9O3ZhciBTcj1BZTtmdW5jdGlvbiBBZSh0LGUpe3RoaXMueD10LHRoaXMueT1lfUFlLnByb3RvdHlwZT17Y2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEFlKHRoaXMueCx0aGlzLnkpfSxhZGQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fYWRkKHQpfSxzdWI6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fc3ViKHQpfSxtdWx0QnlQb2ludDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9tdWx0QnlQb2ludCh0KX0sZGl2QnlQb2ludDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9kaXZCeVBvaW50KHQpfSxtdWx0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsb25lKCkuX211bHQodCl9LGRpdjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9kaXYodCl9LHJvdGF0ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9yb3RhdGUodCl9LHJvdGF0ZUFyb3VuZDpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmNsb25lKCkuX3JvdGF0ZUFyb3VuZCh0LGUpfSxtYXRNdWx0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsb25lKCkuX21hdE11bHQodCl9LHVuaXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbG9uZSgpLl91bml0KCl9LHBlcnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9wZXJwKCl9LHJvdW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fcm91bmQoKX0sbWFnOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkpfSxlcXVhbHM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueD09PXQueCYmdGhpcy55PT09dC55fSxkaXN0OmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0U3FyKHQpKX0sZGlzdFNxcjpmdW5jdGlvbih0KXt2YXIgZT10LngtdGhpcy54LG49dC55LXRoaXMueTtyZXR1cm4gZSplK24qbn0sYW5nbGU6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5hdGFuMih0aGlzLnksdGhpcy54KX0sYW5nbGVUbzpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5hdGFuMih0aGlzLnktdC55LHRoaXMueC10LngpfSxhbmdsZVdpdGg6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuYW5nbGVXaXRoU2VwKHQueCx0LnkpfSxhbmdsZVdpdGhTZXA6ZnVuY3Rpb24odCxlKXtyZXR1cm4gTWF0aC5hdGFuMih0aGlzLngqZS10aGlzLnkqdCx0aGlzLngqdCt0aGlzLnkqZSl9LF9tYXRNdWx0OmZ1bmN0aW9uKHQpe3ZhciBlPXRbMF0qdGhpcy54K3RbMV0qdGhpcy55LG49dFsyXSp0aGlzLngrdFszXSp0aGlzLnk7cmV0dXJuIHRoaXMueD1lLHRoaXMueT1uLHRoaXN9LF9hZGQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueCs9dC54LHRoaXMueSs9dC55LHRoaXN9LF9zdWI6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueC09dC54LHRoaXMueS09dC55LHRoaXN9LF9tdWx0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLngqPXQsdGhpcy55Kj10LHRoaXN9LF9kaXY6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueC89dCx0aGlzLnkvPXQsdGhpc30sX211bHRCeVBvaW50OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLngqPXQueCx0aGlzLnkqPXQueSx0aGlzfSxfZGl2QnlQb2ludDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy54Lz10LngsdGhpcy55Lz10LnksdGhpc30sX3VuaXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGl2KHRoaXMubWFnKCkpLHRoaXN9LF9wZXJwOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy55O3JldHVybiB0aGlzLnk9dGhpcy54LHRoaXMueD0tdCx0aGlzfSxfcm90YXRlOmZ1bmN0aW9uKHQpe3ZhciBlPU1hdGguY29zKHQpLG49TWF0aC5zaW4odCkscj1lKnRoaXMueC1uKnRoaXMueSxpPW4qdGhpcy54K2UqdGhpcy55O3JldHVybiB0aGlzLng9cix0aGlzLnk9aSx0aGlzfSxfcm90YXRlQXJvdW5kOmZ1bmN0aW9uKHQsZSl7dmFyIG49TWF0aC5jb3ModCkscj1NYXRoLnNpbih0KSxpPWUueCtuKih0aGlzLngtZS54KS1yKih0aGlzLnktZS55KSxvPWUueStyKih0aGlzLngtZS54KStuKih0aGlzLnktZS55KTtyZXR1cm4gdGhpcy54PWksdGhpcy55PW8sdGhpc30sX3JvdW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJvdW5kKHRoaXMueCksdGhpcy55PU1hdGgucm91bmQodGhpcy55KSx0aGlzfX0sQWUuY29udmVydD1mdW5jdGlvbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIEFlP3Q6QXJyYXkuaXNBcnJheSh0KT9uZXcgQWUodFswXSx0WzFdKTp0fTt2YXIgQ289U3IsbXI9VGU7ZnVuY3Rpb24gVGUodCxlLG4scixpKXt0aGlzLnByb3BlcnRpZXM9e30sdGhpcy5leHRlbnQ9bix0aGlzLnR5cGU9MCx0aGlzLl9wYmY9dCx0aGlzLl9nZW9tZXRyeT0tMSx0aGlzLl9rZXlzPXIsdGhpcy5fdmFsdWVzPWksdC5yZWFkRmllbGRzKHZvLHRoaXMsZSl9ZnVuY3Rpb24gdm8odCxlLG4pe3Q9PTE/ZS5pZD1uLnJlYWRWYXJpbnQoKTp0PT0yP0RvKG4sZSk6dD09Mz9lLnR5cGU9bi5yZWFkVmFyaW50KCk6dD09NCYmKGUuX2dlb21ldHJ5PW4ucG9zKX1mdW5jdGlvbiBEbyh0LGUpe2Zvcih2YXIgbj10LnJlYWRWYXJpbnQoKSt0LnBvczt0LnBvczxuOyl7dmFyIHI9ZS5fa2V5c1t0LnJlYWRWYXJpbnQoKV0saT1lLl92YWx1ZXNbdC5yZWFkVmFyaW50KCldO2UucHJvcGVydGllc1tyXT1pfX1UZS50eXBlcz1bIlVua25vd24iLCJQb2ludCIsIkxpbmVTdHJpbmciLCJQb2x5Z29uIl0sVGUucHJvdG90eXBlLmxvYWRHZW9tZXRyeT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX3BiZjt0LnBvcz10aGlzLl9nZW9tZXRyeTtmb3IodmFyIGU9dC5yZWFkVmFyaW50KCkrdC5wb3Msbj0xLHI9MCxpPTAsbz0wLHM9W10sdTt0LnBvczxlOyl7aWYocjw9MCl7dmFyIGE9dC5yZWFkVmFyaW50KCk7bj1hJjcscj1hPj4zfWlmKHItLSxuPT09MXx8bj09PTIpaSs9dC5yZWFkU1ZhcmludCgpLG8rPXQucmVhZFNWYXJpbnQoKSxuPT09MSYmKHUmJnMucHVzaCh1KSx1PVtdKSx1LnB1c2gobmV3IENvKGksbykpO2Vsc2UgaWYobj09PTcpdSYmdS5wdXNoKHVbMF0uY2xvbmUoKSk7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoInVua25vd24gY29tbWFuZCAiK24pfXJldHVybiB1JiZzLnB1c2godSksc30sVGUucHJvdG90eXBlLmJib3g9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9wYmY7dC5wb3M9dGhpcy5fZ2VvbWV0cnk7Zm9yKHZhciBlPXQucmVhZFZhcmludCgpK3QucG9zLG49MSxyPTAsaT0wLG89MCxzPTEvMCx1PS0xLzAsYT0xLzAsbD0tMS8wO3QucG9zPGU7KXtpZihyPD0wKXt2YXIgZD10LnJlYWRWYXJpbnQoKTtuPWQmNyxyPWQ+PjN9aWYoci0tLG49PT0xfHxuPT09MilpKz10LnJlYWRTVmFyaW50KCksbys9dC5yZWFkU1ZhcmludCgpLGk8cyYmKHM9aSksaT51JiYodT1pKSxvPGEmJihhPW8pLG8+bCYmKGw9byk7ZWxzZSBpZihuIT09Nyl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gY29tbWFuZCAiK24pfXJldHVybltzLGEsdSxsXX0sVGUucHJvdG90eXBlLnRvR2VvSlNPTj1mdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpcy5leHRlbnQqTWF0aC5wb3coMixuKSxpPXRoaXMuZXh0ZW50KnQsbz10aGlzLmV4dGVudCplLHM9dGhpcy5sb2FkR2VvbWV0cnkoKSx1PVRlLnR5cGVzW3RoaXMudHlwZV0sYSxsO2Z1bmN0aW9uIGQoYil7Zm9yKHZhciBGPTA7RjxiLmxlbmd0aDtGKyspe3ZhciBTPWJbRl0sTj0xODAtKFMueStvKSozNjAvcjtiW0ZdPVsoUy54K2kpKjM2MC9yLTE4MCwzNjAvTWF0aC5QSSpNYXRoLmF0YW4oTWF0aC5leHAoTipNYXRoLlBJLzE4MCkpLTkwXX19c3dpdGNoKHRoaXMudHlwZSl7Y2FzZSAxOnZhciBfPVtdO2ZvcihhPTA7YTxzLmxlbmd0aDthKyspX1thXT1zW2FdWzBdO3M9XyxkKHMpO2JyZWFrO2Nhc2UgMjpmb3IoYT0wO2E8cy5sZW5ndGg7YSsrKWQoc1thXSk7YnJlYWs7Y2FzZSAzOmZvcihzPUxvKHMpLGE9MDthPHMubGVuZ3RoO2ErKylmb3IobD0wO2w8c1thXS5sZW5ndGg7bCsrKWQoc1thXVtsXSk7YnJlYWt9cy5sZW5ndGg9PT0xP3M9c1swXTp1PSJNdWx0aSIrdTt2YXIgTz17dHlwZToiRmVhdHVyZSIsZ2VvbWV0cnk6e3R5cGU6dSxjb29yZGluYXRlczpzfSxwcm9wZXJ0aWVzOnRoaXMucHJvcGVydGllc307cmV0dXJuImlkImluIHRoaXMmJihPLmlkPXRoaXMuaWQpLE99O2Z1bmN0aW9uIExvKHQpe3ZhciBlPXQubGVuZ3RoO2lmKGU8PTEpcmV0dXJuW3RdO2Zvcih2YXIgbj1bXSxyLGksbz0wO288ZTtvKyspe3ZhciBzPVBvKHRbb10pO3MhPT0wJiYoaT09PXZvaWQgMCYmKGk9czwwKSxpPT09czwwPyhyJiZuLnB1c2gocikscj1bdFtvXV0pOnIucHVzaCh0W29dKSl9cmV0dXJuIHImJm4ucHVzaChyKSxufWZ1bmN0aW9uIFBvKHQpe2Zvcih2YXIgZT0wLG49MCxyPXQubGVuZ3RoLGk9ci0xLG8scztuPHI7aT1uKyspbz10W25dLHM9dFtpXSxlKz0ocy54LW8ueCkqKG8ueStzLnkpO3JldHVybiBlfXZhciBCbz1tcixVbz1GcjtmdW5jdGlvbiBGcih0LGUpe3RoaXMudmVyc2lvbj0xLHRoaXMubmFtZT1udWxsLHRoaXMuZXh0ZW50PTQwOTYsdGhpcy5sZW5ndGg9MCx0aGlzLl9wYmY9dCx0aGlzLl9rZXlzPVtdLHRoaXMuX3ZhbHVlcz1bXSx0aGlzLl9mZWF0dXJlcz1bXSx0LnJlYWRGaWVsZHMoam8sdGhpcyxlKSx0aGlzLmxlbmd0aD10aGlzLl9mZWF0dXJlcy5sZW5ndGh9ZnVuY3Rpb24gam8odCxlLG4pe3Q9PT0xNT9lLnZlcnNpb249bi5yZWFkVmFyaW50KCk6dD09PTE/ZS5uYW1lPW4ucmVhZFN0cmluZygpOnQ9PT01P2UuZXh0ZW50PW4ucmVhZFZhcmludCgpOnQ9PT0yP2UuX2ZlYXR1cmVzLnB1c2gobi5wb3MpOnQ9PT0zP2UuX2tleXMucHVzaChuLnJlYWRTdHJpbmcoKSk6dD09PTQmJmUuX3ZhbHVlcy5wdXNoKEdvKG4pKX1mdW5jdGlvbiBHbyh0KXtmb3IodmFyIGU9bnVsbCxuPXQucmVhZFZhcmludCgpK3QucG9zO3QucG9zPG47KXt2YXIgcj10LnJlYWRWYXJpbnQoKT4+MztlPXI9PT0xP3QucmVhZFN0cmluZygpOnI9PT0yP3QucmVhZEZsb2F0KCk6cj09PTM/dC5yZWFkRG91YmxlKCk6cj09PTQ/dC5yZWFkVmFyaW50NjQoKTpyPT09NT90LnJlYWRWYXJpbnQoKTpyPT09Nj90LnJlYWRTVmFyaW50KCk6cj09PTc/dC5yZWFkQm9vbGVhbigpOm51bGx9cmV0dXJuIGV9RnIucHJvdG90eXBlLmZlYXR1cmU9ZnVuY3Rpb24odCl7aWYodDwwfHx0Pj10aGlzLl9mZWF0dXJlcy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJmZWF0dXJlIGluZGV4IG91dCBvZiBib3VuZHMiKTt0aGlzLl9wYmYucG9zPXRoaXMuX2ZlYXR1cmVzW3RdO3ZhciBlPXRoaXMuX3BiZi5yZWFkVmFyaW50KCkrdGhpcy5fcGJmLnBvcztyZXR1cm4gbmV3IEJvKHRoaXMuX3BiZixlLHRoaXMuZXh0ZW50LHRoaXMuX2tleXMsdGhpcy5fdmFsdWVzKX07dmFyICRvPVVvLFZvPXpvO2Z1bmN0aW9uIHpvKHQsZSl7dGhpcy5sYXllcnM9dC5yZWFkRmllbGRzKFdvLHt9LGUpfWZ1bmN0aW9uIFdvKHQsZSxuKXtpZih0PT09Myl7dmFyIHI9bmV3ICRvKG4sbi5yZWFkVmFyaW50KCkrbi5wb3MpO3IubGVuZ3RoJiYoZVtyLm5hbWVdPXIpfX12YXIgWG89Vm8scmU9bXIsU249e307LyohIGllZWU3NTQuIEJTRC0zLUNsYXVzZSBMaWNlbnNlLiBGZXJvc3MgQWJvdWtoYWRpamVoIDxodHRwczovL2Zlcm9zcy5vcmcvb3BlbnNvdXJjZT4gKi9Tbi5yZWFkPWZ1bmN0aW9uKHQsZSxuLHIsaSl7dmFyIG8scyx1PWkqOC1yLTEsYT0oMTw8dSktMSxsPWE+PjEsZD0tNyxfPW4/aS0xOjAsTz1uPy0xOjEsYj10W2UrX107Zm9yKF8rPU8sbz1iJigxPDwtZCktMSxiPj49LWQsZCs9dTtkPjA7bz1vKjI1Nit0W2UrX10sXys9TyxkLT04KTtmb3Iocz1vJigxPDwtZCktMSxvPj49LWQsZCs9cjtkPjA7cz1zKjI1Nit0W2UrX10sXys9TyxkLT04KTtpZihvPT09MClvPTEtbDtlbHNle2lmKG89PT1hKXJldHVybiBzP05hTjooYj8tMToxKSooMS8wKTtzPXMrTWF0aC5wb3coMixyKSxvPW8tbH1yZXR1cm4oYj8tMToxKSpzKk1hdGgucG93KDIsby1yKX0sU24ud3JpdGU9ZnVuY3Rpb24odCxlLG4scixpLG8pe3ZhciBzLHUsYSxsPW8qOC1pLTEsZD0oMTw8bCktMSxfPWQ+PjEsTz1pPT09MjM/TWF0aC5wb3coMiwtMjQpLU1hdGgucG93KDIsLTc3KTowLGI9cj8wOm8tMSxGPXI/MTotMSxTPWU8MHx8ZT09PTAmJjEvZTwwPzE6MDtmb3IoZT1NYXRoLmFicyhlKSxpc05hTihlKXx8ZT09PTEvMD8odT1pc05hTihlKT8xOjAscz1kKToocz1NYXRoLmZsb29yKE1hdGgubG9nKGUpL01hdGguTE4yKSxlKihhPU1hdGgucG93KDIsLXMpKTwxJiYocy0tLGEqPTIpLHMrXz49MT9lKz1PL2E6ZSs9TypNYXRoLnBvdygyLDEtXyksZSphPj0yJiYocysrLGEvPTIpLHMrXz49ZD8odT0wLHM9ZCk6cytfPj0xPyh1PShlKmEtMSkqTWF0aC5wb3coMixpKSxzPXMrXyk6KHU9ZSpNYXRoLnBvdygyLF8tMSkqTWF0aC5wb3coMixpKSxzPTApKTtpPj04O3RbbitiXT11JjI1NSxiKz1GLHUvPTI1NixpLT04KTtmb3Iocz1zPDxpfHUsbCs9aTtsPjA7dFtuK2JdPXMmMjU1LGIrPUYscy89MjU2LGwtPTgpO3RbbitiLUZdfD1TKjEyOH07dmFyIEhvPXosdG49U247ZnVuY3Rpb24geih0KXt0aGlzLmJ1Zj1BcnJheUJ1ZmZlci5pc1ZpZXcmJkFycmF5QnVmZmVyLmlzVmlldyh0KT90Om5ldyBVaW50OEFycmF5KHR8fDApLHRoaXMucG9zPTAsdGhpcy50eXBlPTAsdGhpcy5sZW5ndGg9dGhpcy5idWYubGVuZ3RofXouVmFyaW50PTAsei5GaXhlZDY0PTEsei5CeXRlcz0yLHouRml4ZWQzMj01O3ZhciBtbj0oMTw8MTYpKigxPDwxNiksd3I9MS9tbixxbz0xMixJcj10eXBlb2YgVGV4dERlY29kZXI+InUiP251bGw6bmV3IFRleHREZWNvZGVyKCJ1dGY4Iik7ei5wcm90b3R5cGU9e2Rlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmJ1Zj1udWxsfSxyZWFkRmllbGRzOmZ1bmN0aW9uKHQsZSxuKXtmb3Iobj1ufHx0aGlzLmxlbmd0aDt0aGlzLnBvczxuOyl7dmFyIHI9dGhpcy5yZWFkVmFyaW50KCksaT1yPj4zLG89dGhpcy5wb3M7dGhpcy50eXBlPXImNyx0KGksZSx0aGlzKSx0aGlzLnBvcz09PW8mJnRoaXMuc2tpcChyKX1yZXR1cm4gZX0scmVhZE1lc3NhZ2U6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5yZWFkRmllbGRzKHQsZSx0aGlzLnJlYWRWYXJpbnQoKSt0aGlzLnBvcyl9LHJlYWRGaXhlZDMyOmZ1bmN0aW9uKCl7dmFyIHQ9ZW4odGhpcy5idWYsdGhpcy5wb3MpO3JldHVybiB0aGlzLnBvcys9NCx0fSxyZWFkU0ZpeGVkMzI6ZnVuY3Rpb24oKXt2YXIgdD1Ncih0aGlzLmJ1Zix0aGlzLnBvcyk7cmV0dXJuIHRoaXMucG9zKz00LHR9LHJlYWRGaXhlZDY0OmZ1bmN0aW9uKCl7dmFyIHQ9ZW4odGhpcy5idWYsdGhpcy5wb3MpK2VuKHRoaXMuYnVmLHRoaXMucG9zKzQpKm1uO3JldHVybiB0aGlzLnBvcys9OCx0fSxyZWFkU0ZpeGVkNjQ6ZnVuY3Rpb24oKXt2YXIgdD1lbih0aGlzLmJ1Zix0aGlzLnBvcykrTXIodGhpcy5idWYsdGhpcy5wb3MrNCkqbW47cmV0dXJuIHRoaXMucG9zKz04LHR9LHJlYWRGbG9hdDpmdW5jdGlvbigpe3ZhciB0PXRuLnJlYWQodGhpcy5idWYsdGhpcy5wb3MsITAsMjMsNCk7cmV0dXJuIHRoaXMucG9zKz00LHR9LHJlYWREb3VibGU6ZnVuY3Rpb24oKXt2YXIgdD10bi5yZWFkKHRoaXMuYnVmLHRoaXMucG9zLCEwLDUyLDgpO3JldHVybiB0aGlzLnBvcys9OCx0fSxyZWFkVmFyaW50OmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuYnVmLG4scjtyZXR1cm4gcj1lW3RoaXMucG9zKytdLG49ciYxMjcscjwxMjh8fChyPWVbdGhpcy5wb3MrK10sbnw9KHImMTI3KTw8NyxyPDEyOCl8fChyPWVbdGhpcy5wb3MrK10sbnw9KHImMTI3KTw8MTQscjwxMjgpfHwocj1lW3RoaXMucG9zKytdLG58PShyJjEyNyk8PDIxLHI8MTI4KT9uOihyPWVbdGhpcy5wb3NdLG58PShyJjE1KTw8Mjgsa28obix0LHRoaXMpKX0scmVhZFZhcmludDY0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVhZFZhcmludCghMCl9LHJlYWRTVmFyaW50OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5yZWFkVmFyaW50KCk7cmV0dXJuIHQlMj09PTE/KHQrMSkvLTI6dC8yfSxyZWFkQm9vbGVhbjpmdW5jdGlvbigpe3JldHVybiBCb29sZWFuKHRoaXMucmVhZFZhcmludCgpKX0scmVhZFN0cmluZzpmdW5jdGlvbigpe3ZhciB0PXRoaXMucmVhZFZhcmludCgpK3RoaXMucG9zLGU9dGhpcy5wb3M7cmV0dXJuIHRoaXMucG9zPXQsdC1lPj1xbyYmSXI/dXModGhpcy5idWYsZSx0KTphcyh0aGlzLmJ1ZixlLHQpfSxyZWFkQnl0ZXM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnJlYWRWYXJpbnQoKSt0aGlzLnBvcyxlPXRoaXMuYnVmLnN1YmFycmF5KHRoaXMucG9zLHQpO3JldHVybiB0aGlzLnBvcz10LGV9LHJlYWRQYWNrZWRWYXJpbnQ6ZnVuY3Rpb24odCxlKXtpZih0aGlzLnR5cGUhPT16LkJ5dGVzKXJldHVybiB0LnB1c2godGhpcy5yZWFkVmFyaW50KGUpKTt2YXIgbj1XdCh0aGlzKTtmb3IodD10fHxbXTt0aGlzLnBvczxuOyl0LnB1c2godGhpcy5yZWFkVmFyaW50KGUpKTtyZXR1cm4gdH0scmVhZFBhY2tlZFNWYXJpbnQ6ZnVuY3Rpb24odCl7aWYodGhpcy50eXBlIT09ei5CeXRlcylyZXR1cm4gdC5wdXNoKHRoaXMucmVhZFNWYXJpbnQoKSk7dmFyIGU9V3QodGhpcyk7Zm9yKHQ9dHx8W107dGhpcy5wb3M8ZTspdC5wdXNoKHRoaXMucmVhZFNWYXJpbnQoKSk7cmV0dXJuIHR9LHJlYWRQYWNrZWRCb29sZWFuOmZ1bmN0aW9uKHQpe2lmKHRoaXMudHlwZSE9PXouQnl0ZXMpcmV0dXJuIHQucHVzaCh0aGlzLnJlYWRCb29sZWFuKCkpO3ZhciBlPVd0KHRoaXMpO2Zvcih0PXR8fFtdO3RoaXMucG9zPGU7KXQucHVzaCh0aGlzLnJlYWRCb29sZWFuKCkpO3JldHVybiB0fSxyZWFkUGFja2VkRmxvYXQ6ZnVuY3Rpb24odCl7aWYodGhpcy50eXBlIT09ei5CeXRlcylyZXR1cm4gdC5wdXNoKHRoaXMucmVhZEZsb2F0KCkpO3ZhciBlPVd0KHRoaXMpO2Zvcih0PXR8fFtdO3RoaXMucG9zPGU7KXQucHVzaCh0aGlzLnJlYWRGbG9hdCgpKTtyZXR1cm4gdH0scmVhZFBhY2tlZERvdWJsZTpmdW5jdGlvbih0KXtpZih0aGlzLnR5cGUhPT16LkJ5dGVzKXJldHVybiB0LnB1c2godGhpcy5yZWFkRG91YmxlKCkpO3ZhciBlPVd0KHRoaXMpO2Zvcih0PXR8fFtdO3RoaXMucG9zPGU7KXQucHVzaCh0aGlzLnJlYWREb3VibGUoKSk7cmV0dXJuIHR9LHJlYWRQYWNrZWRGaXhlZDMyOmZ1bmN0aW9uKHQpe2lmKHRoaXMudHlwZSE9PXouQnl0ZXMpcmV0dXJuIHQucHVzaCh0aGlzLnJlYWRGaXhlZDMyKCkpO3ZhciBlPVd0KHRoaXMpO2Zvcih0PXR8fFtdO3RoaXMucG9zPGU7KXQucHVzaCh0aGlzLnJlYWRGaXhlZDMyKCkpO3JldHVybiB0fSxyZWFkUGFja2VkU0ZpeGVkMzI6ZnVuY3Rpb24odCl7aWYodGhpcy50eXBlIT09ei5CeXRlcylyZXR1cm4gdC5wdXNoKHRoaXMucmVhZFNGaXhlZDMyKCkpO3ZhciBlPVd0KHRoaXMpO2Zvcih0PXR8fFtdO3RoaXMucG9zPGU7KXQucHVzaCh0aGlzLnJlYWRTRml4ZWQzMigpKTtyZXR1cm4gdH0scmVhZFBhY2tlZEZpeGVkNjQ6ZnVuY3Rpb24odCl7aWYodGhpcy50eXBlIT09ei5CeXRlcylyZXR1cm4gdC5wdXNoKHRoaXMucmVhZEZpeGVkNjQoKSk7dmFyIGU9V3QodGhpcyk7Zm9yKHQ9dHx8W107dGhpcy5wb3M8ZTspdC5wdXNoKHRoaXMucmVhZEZpeGVkNjQoKSk7cmV0dXJuIHR9LHJlYWRQYWNrZWRTRml4ZWQ2NDpmdW5jdGlvbih0KXtpZih0aGlzLnR5cGUhPT16LkJ5dGVzKXJldHVybiB0LnB1c2godGhpcy5yZWFkU0ZpeGVkNjQoKSk7dmFyIGU9V3QodGhpcyk7Zm9yKHQ9dHx8W107dGhpcy5wb3M8ZTspdC5wdXNoKHRoaXMucmVhZFNGaXhlZDY0KCkpO3JldHVybiB0fSxza2lwOmZ1bmN0aW9uKHQpe3ZhciBlPXQmNztpZihlPT09ei5WYXJpbnQpZm9yKDt0aGlzLmJ1Zlt0aGlzLnBvcysrXT4xMjc7KTtlbHNlIGlmKGU9PT16LkJ5dGVzKXRoaXMucG9zPXRoaXMucmVhZFZhcmludCgpK3RoaXMucG9zO2Vsc2UgaWYoZT09PXouRml4ZWQzMil0aGlzLnBvcys9NDtlbHNlIGlmKGU9PT16LkZpeGVkNjQpdGhpcy5wb3MrPTg7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIlVuaW1wbGVtZW50ZWQgdHlwZTogIitlKX0sd3JpdGVUYWc6ZnVuY3Rpb24odCxlKXt0aGlzLndyaXRlVmFyaW50KHQ8PDN8ZSl9LHJlYWxsb2M6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMubGVuZ3RofHwxNjtlPHRoaXMucG9zK3Q7KWUqPTI7aWYoZSE9PXRoaXMubGVuZ3RoKXt2YXIgbj1uZXcgVWludDhBcnJheShlKTtuLnNldCh0aGlzLmJ1ZiksdGhpcy5idWY9bix0aGlzLmxlbmd0aD1lfX0sZmluaXNoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGVuZ3RoPXRoaXMucG9zLHRoaXMucG9zPTAsdGhpcy5idWYuc3ViYXJyYXkoMCx0aGlzLmxlbmd0aCl9LHdyaXRlRml4ZWQzMjpmdW5jdGlvbih0KXt0aGlzLnJlYWxsb2MoNCkseGUodGhpcy5idWYsdCx0aGlzLnBvcyksdGhpcy5wb3MrPTR9LHdyaXRlU0ZpeGVkMzI6ZnVuY3Rpb24odCl7dGhpcy5yZWFsbG9jKDQpLHhlKHRoaXMuYnVmLHQsdGhpcy5wb3MpLHRoaXMucG9zKz00fSx3cml0ZUZpeGVkNjQ6ZnVuY3Rpb24odCl7dGhpcy5yZWFsbG9jKDgpLHhlKHRoaXMuYnVmLHQmLTEsdGhpcy5wb3MpLHhlKHRoaXMuYnVmLE1hdGguZmxvb3IodCp3ciksdGhpcy5wb3MrNCksdGhpcy5wb3MrPTh9LHdyaXRlU0ZpeGVkNjQ6ZnVuY3Rpb24odCl7dGhpcy5yZWFsbG9jKDgpLHhlKHRoaXMuYnVmLHQmLTEsdGhpcy5wb3MpLHhlKHRoaXMuYnVmLE1hdGguZmxvb3IodCp3ciksdGhpcy5wb3MrNCksdGhpcy5wb3MrPTh9LHdyaXRlVmFyaW50OmZ1bmN0aW9uKHQpe2lmKHQ9K3R8fDAsdD4yNjg0MzU0NTV8fHQ8MCl7WW8odCx0aGlzKTtyZXR1cm59dGhpcy5yZWFsbG9jKDQpLHRoaXMuYnVmW3RoaXMucG9zKytdPXQmMTI3fCh0PjEyNz8xMjg6MCksISh0PD0xMjcpJiYodGhpcy5idWZbdGhpcy5wb3MrK109KHQ+Pj49NykmMTI3fCh0PjEyNz8xMjg6MCksISh0PD0xMjcpJiYodGhpcy5idWZbdGhpcy5wb3MrK109KHQ+Pj49NykmMTI3fCh0PjEyNz8xMjg6MCksISh0PD0xMjcpJiYodGhpcy5idWZbdGhpcy5wb3MrK109dD4+PjcmMTI3KSkpfSx3cml0ZVNWYXJpbnQ6ZnVuY3Rpb24odCl7dGhpcy53cml0ZVZhcmludCh0PDA/LXQqMi0xOnQqMil9LHdyaXRlQm9vbGVhbjpmdW5jdGlvbih0KXt0aGlzLndyaXRlVmFyaW50KEJvb2xlYW4odCkpfSx3cml0ZVN0cmluZzpmdW5jdGlvbih0KXt0PVN0cmluZyh0KSx0aGlzLnJlYWxsb2ModC5sZW5ndGgqNCksdGhpcy5wb3MrKzt2YXIgZT10aGlzLnBvczt0aGlzLnBvcz1jcyh0aGlzLmJ1Zix0LHRoaXMucG9zKTt2YXIgbj10aGlzLnBvcy1lO24+PTEyOCYmTnIoZSxuLHRoaXMpLHRoaXMucG9zPWUtMSx0aGlzLndyaXRlVmFyaW50KG4pLHRoaXMucG9zKz1ufSx3cml0ZUZsb2F0OmZ1bmN0aW9uKHQpe3RoaXMucmVhbGxvYyg0KSx0bi53cml0ZSh0aGlzLmJ1Zix0LHRoaXMucG9zLCEwLDIzLDQpLHRoaXMucG9zKz00fSx3cml0ZURvdWJsZTpmdW5jdGlvbih0KXt0aGlzLnJlYWxsb2MoOCksdG4ud3JpdGUodGhpcy5idWYsdCx0aGlzLnBvcywhMCw1Miw4KSx0aGlzLnBvcys9OH0sd3JpdGVCeXRlczpmdW5jdGlvbih0KXt2YXIgZT10Lmxlbmd0aDt0aGlzLndyaXRlVmFyaW50KGUpLHRoaXMucmVhbGxvYyhlKTtmb3IodmFyIG49MDtuPGU7bisrKXRoaXMuYnVmW3RoaXMucG9zKytdPXRbbl19LHdyaXRlUmF3TWVzc2FnZTpmdW5jdGlvbih0LGUpe3RoaXMucG9zKys7dmFyIG49dGhpcy5wb3M7dChlLHRoaXMpO3ZhciByPXRoaXMucG9zLW47cj49MTI4JiZOcihuLHIsdGhpcyksdGhpcy5wb3M9bi0xLHRoaXMud3JpdGVWYXJpbnQociksdGhpcy5wb3MrPXJ9LHdyaXRlTWVzc2FnZTpmdW5jdGlvbih0LGUsbil7dGhpcy53cml0ZVRhZyh0LHouQnl0ZXMpLHRoaXMud3JpdGVSYXdNZXNzYWdlKGUsbil9LHdyaXRlUGFja2VkVmFyaW50OmZ1bmN0aW9uKHQsZSl7ZS5sZW5ndGgmJnRoaXMud3JpdGVNZXNzYWdlKHQsUW8sZSl9LHdyaXRlUGFja2VkU1ZhcmludDpmdW5jdGlvbih0LGUpe2UubGVuZ3RoJiZ0aGlzLndyaXRlTWVzc2FnZSh0LEpvLGUpfSx3cml0ZVBhY2tlZEJvb2xlYW46ZnVuY3Rpb24odCxlKXtlLmxlbmd0aCYmdGhpcy53cml0ZU1lc3NhZ2UodCxucyxlKX0sd3JpdGVQYWNrZWRGbG9hdDpmdW5jdGlvbih0LGUpe2UubGVuZ3RoJiZ0aGlzLndyaXRlTWVzc2FnZSh0LHRzLGUpfSx3cml0ZVBhY2tlZERvdWJsZTpmdW5jdGlvbih0LGUpe2UubGVuZ3RoJiZ0aGlzLndyaXRlTWVzc2FnZSh0LGVzLGUpfSx3cml0ZVBhY2tlZEZpeGVkMzI6ZnVuY3Rpb24odCxlKXtlLmxlbmd0aCYmdGhpcy53cml0ZU1lc3NhZ2UodCxycyxlKX0sd3JpdGVQYWNrZWRTRml4ZWQzMjpmdW5jdGlvbih0LGUpe2UubGVuZ3RoJiZ0aGlzLndyaXRlTWVzc2FnZSh0LGlzLGUpfSx3cml0ZVBhY2tlZEZpeGVkNjQ6ZnVuY3Rpb24odCxlKXtlLmxlbmd0aCYmdGhpcy53cml0ZU1lc3NhZ2UodCxvcyxlKX0sd3JpdGVQYWNrZWRTRml4ZWQ2NDpmdW5jdGlvbih0LGUpe2UubGVuZ3RoJiZ0aGlzLndyaXRlTWVzc2FnZSh0LHNzLGUpfSx3cml0ZUJ5dGVzRmllbGQ6ZnVuY3Rpb24odCxlKXt0aGlzLndyaXRlVGFnKHQsei5CeXRlcyksdGhpcy53cml0ZUJ5dGVzKGUpfSx3cml0ZUZpeGVkMzJGaWVsZDpmdW5jdGlvbih0LGUpe3RoaXMud3JpdGVUYWcodCx6LkZpeGVkMzIpLHRoaXMud3JpdGVGaXhlZDMyKGUpfSx3cml0ZVNGaXhlZDMyRmllbGQ6ZnVuY3Rpb24odCxlKXt0aGlzLndyaXRlVGFnKHQsei5GaXhlZDMyKSx0aGlzLndyaXRlU0ZpeGVkMzIoZSl9LHdyaXRlRml4ZWQ2NEZpZWxkOmZ1bmN0aW9uKHQsZSl7dGhpcy53cml0ZVRhZyh0LHouRml4ZWQ2NCksdGhpcy53cml0ZUZpeGVkNjQoZSl9LHdyaXRlU0ZpeGVkNjRGaWVsZDpmdW5jdGlvbih0LGUpe3RoaXMud3JpdGVUYWcodCx6LkZpeGVkNjQpLHRoaXMud3JpdGVTRml4ZWQ2NChlKX0sd3JpdGVWYXJpbnRGaWVsZDpmdW5jdGlvbih0LGUpe3RoaXMud3JpdGVUYWcodCx6LlZhcmludCksdGhpcy53cml0ZVZhcmludChlKX0sd3JpdGVTVmFyaW50RmllbGQ6ZnVuY3Rpb24odCxlKXt0aGlzLndyaXRlVGFnKHQsei5WYXJpbnQpLHRoaXMud3JpdGVTVmFyaW50KGUpfSx3cml0ZVN0cmluZ0ZpZWxkOmZ1bmN0aW9uKHQsZSl7dGhpcy53cml0ZVRhZyh0LHouQnl0ZXMpLHRoaXMud3JpdGVTdHJpbmcoZSl9LHdyaXRlRmxvYXRGaWVsZDpmdW5jdGlvbih0LGUpe3RoaXMud3JpdGVUYWcodCx6LkZpeGVkMzIpLHRoaXMud3JpdGVGbG9hdChlKX0sd3JpdGVEb3VibGVGaWVsZDpmdW5jdGlvbih0LGUpe3RoaXMud3JpdGVUYWcodCx6LkZpeGVkNjQpLHRoaXMud3JpdGVEb3VibGUoZSl9LHdyaXRlQm9vbGVhbkZpZWxkOmZ1bmN0aW9uKHQsZSl7dGhpcy53cml0ZVZhcmludEZpZWxkKHQsQm9vbGVhbihlKSl9fTtmdW5jdGlvbiBrbyh0LGUsbil7dmFyIHI9bi5idWYsaSxvO2lmKG89cltuLnBvcysrXSxpPShvJjExMik+PjQsbzwxMjh8fChvPXJbbi5wb3MrK10saXw9KG8mMTI3KTw8MyxvPDEyOCl8fChvPXJbbi5wb3MrK10saXw9KG8mMTI3KTw8MTAsbzwxMjgpfHwobz1yW24ucG9zKytdLGl8PShvJjEyNyk8PDE3LG88MTI4KXx8KG89cltuLnBvcysrXSxpfD0obyYxMjcpPDwyNCxvPDEyOCl8fChvPXJbbi5wb3MrK10saXw9KG8mMSk8PDMxLG88MTI4KSlyZXR1cm4gUmUodCxpLGUpO3Rocm93IG5ldyBFcnJvcigiRXhwZWN0ZWQgdmFyaW50IG5vdCBtb3JlIHRoYW4gMTAgYnl0ZXMiKX1mdW5jdGlvbiBXdCh0KXtyZXR1cm4gdC50eXBlPT09ei5CeXRlcz90LnJlYWRWYXJpbnQoKSt0LnBvczp0LnBvcysxfWZ1bmN0aW9uIFJlKHQsZSxuKXtyZXR1cm4gbj9lKjQyOTQ5NjcyOTYrKHQ+Pj4wKTooZT4+PjApKjQyOTQ5NjcyOTYrKHQ+Pj4wKX1mdW5jdGlvbiBZbyh0LGUpe3ZhciBuLHI7aWYodD49MD8obj10JTQyOTQ5NjcyOTZ8MCxyPXQvNDI5NDk2NzI5NnwwKToobj1+KC10JTQyOTQ5NjcyOTYpLHI9figtdC80Mjk0OTY3Mjk2KSxuXjQyOTQ5NjcyOTU/bj1uKzF8MDoobj0wLHI9cisxfDApKSx0Pj0xODQ0Njc0NDA3MzcwOTU1MmUzfHx0PC0xODQ0Njc0NDA3MzcwOTU1MmUzKXRocm93IG5ldyBFcnJvcigiR2l2ZW4gdmFyaW50IGRvZXNuJ3QgZml0IGludG8gMTAgYnl0ZXMiKTtlLnJlYWxsb2MoMTApLEtvKG4scixlKSxabyhyLGUpfWZ1bmN0aW9uIEtvKHQsZSxuKXtuLmJ1ZltuLnBvcysrXT10JjEyN3wxMjgsdD4+Pj03LG4uYnVmW24ucG9zKytdPXQmMTI3fDEyOCx0Pj4+PTcsbi5idWZbbi5wb3MrK109dCYxMjd8MTI4LHQ+Pj49NyxuLmJ1ZltuLnBvcysrXT10JjEyN3wxMjgsdD4+Pj03LG4uYnVmW24ucG9zXT10JjEyN31mdW5jdGlvbiBabyh0LGUpe3ZhciBuPSh0JjcpPDw0O2UuYnVmW2UucG9zKytdfD1ufCgodD4+Pj0zKT8xMjg6MCksdCYmKGUuYnVmW2UucG9zKytdPXQmMTI3fCgodD4+Pj03KT8xMjg6MCksdCYmKGUuYnVmW2UucG9zKytdPXQmMTI3fCgodD4+Pj03KT8xMjg6MCksdCYmKGUuYnVmW2UucG9zKytdPXQmMTI3fCgodD4+Pj03KT8xMjg6MCksdCYmKGUuYnVmW2UucG9zKytdPXQmMTI3fCgodD4+Pj03KT8xMjg6MCksdCYmKGUuYnVmW2UucG9zKytdPXQmMTI3KSkpKSl9ZnVuY3Rpb24gTnIodCxlLG4pe3ZhciByPWU8PTE2MzgzPzE6ZTw9MjA5NzE1MT8yOmU8PTI2ODQzNTQ1NT8zOk1hdGguZmxvb3IoTWF0aC5sb2coZSkvKE1hdGguTE4yKjcpKTtuLnJlYWxsb2Mocik7Zm9yKHZhciBpPW4ucG9zLTE7aT49dDtpLS0pbi5idWZbaStyXT1uLmJ1ZltpXX1mdW5jdGlvbiBRbyh0LGUpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKWUud3JpdGVWYXJpbnQodFtuXSl9ZnVuY3Rpb24gSm8odCxlKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyllLndyaXRlU1ZhcmludCh0W25dKX1mdW5jdGlvbiB0cyh0LGUpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKWUud3JpdGVGbG9hdCh0W25dKX1mdW5jdGlvbiBlcyh0LGUpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKWUud3JpdGVEb3VibGUodFtuXSl9ZnVuY3Rpb24gbnModCxlKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyllLndyaXRlQm9vbGVhbih0W25dKX1mdW5jdGlvbiBycyh0LGUpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKWUud3JpdGVGaXhlZDMyKHRbbl0pfWZ1bmN0aW9uIGlzKHQsZSl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspZS53cml0ZVNGaXhlZDMyKHRbbl0pfWZ1bmN0aW9uIG9zKHQsZSl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspZS53cml0ZUZpeGVkNjQodFtuXSl9ZnVuY3Rpb24gc3ModCxlKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyllLndyaXRlU0ZpeGVkNjQodFtuXSl9ZnVuY3Rpb24gZW4odCxlKXtyZXR1cm4odFtlXXx0W2UrMV08PDh8dFtlKzJdPDwxNikrdFtlKzNdKjE2Nzc3MjE2fWZ1bmN0aW9uIHhlKHQsZSxuKXt0W25dPWUsdFtuKzFdPWU+Pj44LHRbbisyXT1lPj4+MTYsdFtuKzNdPWU+Pj4yNH1mdW5jdGlvbiBNcih0LGUpe3JldHVybih0W2VdfHRbZSsxXTw8OHx0W2UrMl08PDE2KSsodFtlKzNdPDwyNCl9ZnVuY3Rpb24gYXModCxlLG4pe2Zvcih2YXIgcj0iIixpPWU7aTxuOyl7dmFyIG89dFtpXSxzPW51bGwsdT1vPjIzOT80Om8+MjIzPzM6bz4xOTE/MjoxO2lmKGkrdT5uKWJyZWFrO3ZhciBhLGwsZDt1PT09MT9vPDEyOCYmKHM9byk6dT09PTI/KGE9dFtpKzFdLChhJjE5Mik9PT0xMjgmJihzPShvJjMxKTw8NnxhJjYzLHM8PTEyNyYmKHM9bnVsbCkpKTp1PT09Mz8oYT10W2krMV0sbD10W2krMl0sKGEmMTkyKT09PTEyOCYmKGwmMTkyKT09PTEyOCYmKHM9KG8mMTUpPDwxMnwoYSY2Myk8PDZ8bCY2Mywoczw9MjA0N3x8cz49NTUyOTYmJnM8PTU3MzQzKSYmKHM9bnVsbCkpKTp1PT09NCYmKGE9dFtpKzFdLGw9dFtpKzJdLGQ9dFtpKzNdLChhJjE5Mik9PT0xMjgmJihsJjE5Mik9PT0xMjgmJihkJjE5Mik9PT0xMjgmJihzPShvJjE1KTw8MTh8KGEmNjMpPDwxMnwobCY2Myk8PDZ8ZCY2Mywoczw9NjU1MzV8fHM+PTExMTQxMTIpJiYocz1udWxsKSkpLHM9PT1udWxsPyhzPTY1NTMzLHU9MSk6cz42NTUzNSYmKHMtPTY1NTM2LHIrPVN0cmluZy5mcm9tQ2hhckNvZGUocz4+PjEwJjEwMjN8NTUyOTYpLHM9NTYzMjB8cyYxMDIzKSxyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHMpLGkrPXV9cmV0dXJuIHJ9ZnVuY3Rpb24gdXModCxlLG4pe3JldHVybiBJci5kZWNvZGUodC5zdWJhcnJheShlLG4pKX1mdW5jdGlvbiBjcyh0LGUsbil7Zm9yKHZhciByPTAsaSxvO3I8ZS5sZW5ndGg7cisrKXtpZihpPWUuY2hhckNvZGVBdChyKSxpPjU1Mjk1JiZpPDU3MzQ0KWlmKG8paWYoaTw1NjMyMCl7dFtuKytdPTIzOSx0W24rK109MTkxLHRbbisrXT0xODksbz1pO2NvbnRpbnVlfWVsc2UgaT1vLTU1Mjk2PDwxMHxpLTU2MzIwfDY1NTM2LG89bnVsbDtlbHNle2k+NTYzMTl8fHIrMT09PWUubGVuZ3RoPyh0W24rK109MjM5LHRbbisrXT0xOTEsdFtuKytdPTE4OSk6bz1pO2NvbnRpbnVlfWVsc2UgbyYmKHRbbisrXT0yMzksdFtuKytdPTE5MSx0W24rK109MTg5LG89bnVsbCk7aTwxMjg/dFtuKytdPWk6KGk8MjA0OD90W24rK109aT4+NnwxOTI6KGk8NjU1MzY/dFtuKytdPWk+PjEyfDIyNDoodFtuKytdPWk+PjE4fDI0MCx0W24rK109aT4+MTImNjN8MTI4KSx0W24rK109aT4+NiY2M3wxMjgpLHRbbisrXT1pJjYzfDEyOCl9cmV0dXJuIG59dmFyIGhzPXR5cGVvZiBnbG9iYWw9PSJvYmplY3QiJiZnbG9iYWwmJmdsb2JhbC5PYmplY3Q9PT1PYmplY3QmJmdsb2JhbCxDcj1ocyxmcz10eXBlb2Ygc2VsZj09Im9iamVjdCImJnNlbGYmJnNlbGYuT2JqZWN0PT09T2JqZWN0JiZzZWxmLGxzPUNyfHxmc3x8RnVuY3Rpb24oInJldHVybiB0aGlzIikoKSxVdD1scyxkcz1VdC5TeW1ib2wsanQ9ZHMsdnI9T2JqZWN0LnByb3RvdHlwZSxFcz12ci5oYXNPd25Qcm9wZXJ0eSxfcz12ci50b1N0cmluZyx2ZT1qdD9qdC50b1N0cmluZ1RhZzp2b2lkIDA7ZnVuY3Rpb24gcHModCl7dmFyIGU9RXMuY2FsbCh0LHZlKSxuPXRbdmVdO3RyeXt0W3ZlXT12b2lkIDA7dmFyIHI9ITB9Y2F0Y2h7fXZhciBpPV9zLmNhbGwodCk7cmV0dXJuIHImJihlP3RbdmVdPW46ZGVsZXRlIHRbdmVdKSxpfXZhciB5cz1PYmplY3QucHJvdG90eXBlLEFzPXlzLnRvU3RyaW5nO2Z1bmN0aW9uIFRzKHQpe3JldHVybiBBcy5jYWxsKHQpfXZhciBScz0iW29iamVjdCBOdWxsXSIseHM9IltvYmplY3QgVW5kZWZpbmVkXSIsRHI9anQ/anQudG9TdHJpbmdUYWc6dm9pZCAwO2Z1bmN0aW9uIE9lKHQpe3JldHVybiB0PT1udWxsP3Q9PT12b2lkIDA/eHM6UnM6RHImJkRyIGluIE9iamVjdCh0KT9wcyh0KTpUcyh0KX1mdW5jdGlvbiBiZSh0KXtyZXR1cm4gdCE9bnVsbCYmdHlwZW9mIHQ9PSJvYmplY3QifXZhciBPcz0iW29iamVjdCBTeW1ib2xdIjtmdW5jdGlvbiBGbih0KXtyZXR1cm4gdHlwZW9mIHQ9PSJzeW1ib2wifHxiZSh0KSYmT2UodCk9PU9zfWZ1bmN0aW9uIGJzKHQsZSl7Zm9yKHZhciBuPS0xLHI9dD09bnVsbD8wOnQubGVuZ3RoLGk9QXJyYXkocik7KytuPHI7KWlbbl09ZSh0W25dLG4sdCk7cmV0dXJuIGl9dmFyIGdzPUFycmF5LmlzQXJyYXksWXQ9Z3MsU3M9MS8wLExyPWp0P2p0LnByb3RvdHlwZTp2b2lkIDAsUHI9THI/THIudG9TdHJpbmc6dm9pZCAwO2Z1bmN0aW9uIEJyKHQpe2lmKHR5cGVvZiB0PT0ic3RyaW5nIilyZXR1cm4gdDtpZihZdCh0KSlyZXR1cm4gYnModCxCcikrIiI7aWYoRm4odCkpcmV0dXJuIFByP1ByLmNhbGwodCk6IiI7dmFyIGU9dCsiIjtyZXR1cm4gZT09IjAiJiYxL3Q9PS1Tcz8iLTAiOmV9ZnVuY3Rpb24gaWUodCl7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuIHQhPW51bGwmJihlPT0ib2JqZWN0Inx8ZT09ImZ1bmN0aW9uIil9ZnVuY3Rpb24gbXModCl7cmV0dXJuIHR9dmFyIEZzPSJbb2JqZWN0IEFzeW5jRnVuY3Rpb25dIix3cz0iW29iamVjdCBGdW5jdGlvbl0iLElzPSJbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSIsTnM9IltvYmplY3QgUHJveHldIjtmdW5jdGlvbiBVcih0KXtpZighaWUodCkpcmV0dXJuITE7dmFyIGU9T2UodCk7cmV0dXJuIGU9PXdzfHxlPT1Jc3x8ZT09RnN8fGU9PU5zfXZhciBNcz1VdFsiX19jb3JlLWpzX3NoYXJlZF9fIl0sd249TXMsanI9ZnVuY3Rpb24oKXt2YXIgdD0vW14uXSskLy5leGVjKHduJiZ3bi5rZXlzJiZ3bi5rZXlzLklFX1BST1RPfHwiIik7cmV0dXJuIHQ/IlN5bWJvbChzcmMpXzEuIit0OiIifSgpO2Z1bmN0aW9uIENzKHQpe3JldHVybiEhanImJmpyIGluIHR9dmFyIHZzPUZ1bmN0aW9uLnByb3RvdHlwZSxEcz12cy50b1N0cmluZztmdW5jdGlvbiBvZSh0KXtpZih0IT1udWxsKXt0cnl7cmV0dXJuIERzLmNhbGwodCl9Y2F0Y2h7fXRyeXtyZXR1cm4gdCsiIn1jYXRjaHt9fXJldHVybiIifXZhciBMcz0vW1xcXiQuKis/KClbXF17fXxdL2csUHM9L15cW29iamVjdCAuKz9Db25zdHJ1Y3RvclxdJC8sQnM9RnVuY3Rpb24ucHJvdG90eXBlLFVzPU9iamVjdC5wcm90b3R5cGUsanM9QnMudG9TdHJpbmcsR3M9VXMuaGFzT3duUHJvcGVydHksJHM9UmVnRXhwKCJeIitqcy5jYWxsKEdzKS5yZXBsYWNlKExzLCJcXCQmIikucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXCgpfCBmb3IgLis/KD89XFxcXSkvZywiJDEuKj8iKSsiJCIpO2Z1bmN0aW9uIFZzKHQpe2lmKCFpZSh0KXx8Q3ModCkpcmV0dXJuITE7dmFyIGU9VXIodCk/JHM6UHM7cmV0dXJuIGUudGVzdChvZSh0KSl9ZnVuY3Rpb24genModCxlKXtyZXR1cm4gdD09bnVsbD92b2lkIDA6dFtlXX1mdW5jdGlvbiBzZSh0LGUpe3ZhciBuPXpzKHQsZSk7cmV0dXJuIFZzKG4pP246dm9pZCAwfXZhciBXcz1zZShVdCwiV2Vha01hcCIpLEluPVdzLEdyPU9iamVjdC5jcmVhdGUsWHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiBmdW5jdGlvbihlKXtpZighaWUoZSkpcmV0dXJue307aWYoR3IpcmV0dXJuIEdyKGUpO3QucHJvdG90eXBlPWU7dmFyIG49bmV3IHQ7cmV0dXJuIHQucHJvdG90eXBlPXZvaWQgMCxufX0oKSxIcz1YcztmdW5jdGlvbiBxcyh0LGUsbil7c3dpdGNoKG4ubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIHQuY2FsbChlKTtjYXNlIDE6cmV0dXJuIHQuY2FsbChlLG5bMF0pO2Nhc2UgMjpyZXR1cm4gdC5jYWxsKGUsblswXSxuWzFdKTtjYXNlIDM6cmV0dXJuIHQuY2FsbChlLG5bMF0sblsxXSxuWzJdKX1yZXR1cm4gdC5hcHBseShlLG4pfWZ1bmN0aW9uIGtzKHQsZSl7dmFyIG49LTEscj10Lmxlbmd0aDtmb3IoZXx8KGU9QXJyYXkocikpOysrbjxyOyllW25dPXRbbl07cmV0dXJuIGV9dmFyIFlzPTgwMCxLcz0xNixacz1EYXRlLm5vdztmdW5jdGlvbiBRcyh0KXt2YXIgZT0wLG49MDtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcj1acygpLGk9S3MtKHItbik7aWYobj1yLGk+MCl7aWYoKytlPj1ZcylyZXR1cm4gYXJndW1lbnRzWzBdfWVsc2UgZT0wO3JldHVybiB0LmFwcGx5KHZvaWQgMCxhcmd1bWVudHMpfX1mdW5jdGlvbiBKcyh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19dmFyIHRhPWZ1bmN0aW9uKCl7dHJ5e3ZhciB0PXNlKE9iamVjdCwiZGVmaW5lUHJvcGVydHkiKTtyZXR1cm4gdCh7fSwiIix7fSksdH1jYXRjaHt9fSgpLG5uPXRhLGVhPW5uP2Z1bmN0aW9uKHQsZSl7cmV0dXJuIG5uKHQsInRvU3RyaW5nIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITEsdmFsdWU6SnMoZSksd3JpdGFibGU6ITB9KX06bXMsbmE9ZWEscmE9UXMobmEpLGlhPXJhO2Z1bmN0aW9uIG9hKHQsZSl7Zm9yKHZhciBuPS0xLHI9dD09bnVsbD8wOnQubGVuZ3RoOysrbjxyJiZlKHRbbl0sbix0KSE9PSExOyk7cmV0dXJuIHR9dmFyIHNhPTkwMDcxOTkyNTQ3NDA5OTEsYWE9L14oPzowfFsxLTldXGQqKSQvO2Z1bmN0aW9uIE5uKHQsZSl7dmFyIG49dHlwZW9mIHQ7cmV0dXJuIGU9ZT8/c2EsISFlJiYobj09Im51bWJlciJ8fG4hPSJzeW1ib2wiJiZhYS50ZXN0KHQpKSYmdD4tMSYmdCUxPT0wJiZ0PGV9ZnVuY3Rpb24gJHIodCxlLG4pe2U9PSJfX3Byb3RvX18iJiZubj9ubih0LGUse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOm4sd3JpdGFibGU6ITB9KTp0W2VdPW59ZnVuY3Rpb24gVnIodCxlKXtyZXR1cm4gdD09PWV8fHQhPT10JiZlIT09ZX12YXIgdWE9T2JqZWN0LnByb3RvdHlwZSxjYT11YS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBNbih0LGUsbil7dmFyIHI9dFtlXTsoIShjYS5jYWxsKHQsZSkmJlZyKHIsbikpfHxuPT09dm9pZCAwJiYhKGUgaW4gdCkpJiYkcih0LGUsbil9ZnVuY3Rpb24gcm4odCxlLG4scil7dmFyIGk9IW47bnx8KG49e30pO2Zvcih2YXIgbz0tMSxzPWUubGVuZ3RoOysrbzxzOyl7dmFyIHU9ZVtvXSxhPXI/cihuW3VdLHRbdV0sdSxuLHQpOnZvaWQgMDthPT09dm9pZCAwJiYoYT10W3VdKSxpPyRyKG4sdSxhKTpNbihuLHUsYSl9cmV0dXJuIG59dmFyIHpyPU1hdGgubWF4O2Z1bmN0aW9uIGhhKHQsZSxuKXtyZXR1cm4gZT16cihlPT09dm9pZCAwP3QubGVuZ3RoLTE6ZSwwKSxmdW5jdGlvbigpe2Zvcih2YXIgcj1hcmd1bWVudHMsaT0tMSxvPXpyKHIubGVuZ3RoLWUsMCkscz1BcnJheShvKTsrK2k8bzspc1tpXT1yW2UraV07aT0tMTtmb3IodmFyIHU9QXJyYXkoZSsxKTsrK2k8ZTspdVtpXT1yW2ldO3JldHVybiB1W2VdPW4ocykscXModCx0aGlzLHUpfX12YXIgZmE9OTAwNzE5OTI1NDc0MDk5MTtmdW5jdGlvbiBDbih0KXtyZXR1cm4gdHlwZW9mIHQ9PSJudW1iZXIiJiZ0Pi0xJiZ0JTE9PTAmJnQ8PWZhfWZ1bmN0aW9uIFdyKHQpe3JldHVybiB0IT1udWxsJiZDbih0Lmxlbmd0aCkmJiFVcih0KX12YXIgbGE9T2JqZWN0LnByb3RvdHlwZTtmdW5jdGlvbiB2bih0KXt2YXIgZT10JiZ0LmNvbnN0cnVjdG9yLG49dHlwZW9mIGU9PSJmdW5jdGlvbiImJmUucHJvdG90eXBlfHxsYTtyZXR1cm4gdD09PW59ZnVuY3Rpb24gZGEodCxlKXtmb3IodmFyIG49LTEscj1BcnJheSh0KTsrK248dDspcltuXT1lKG4pO3JldHVybiByfXZhciBFYT0iW29iamVjdCBBcmd1bWVudHNdIjtmdW5jdGlvbiBYcih0KXtyZXR1cm4gYmUodCkmJk9lKHQpPT1FYX12YXIgSHI9T2JqZWN0LnByb3RvdHlwZSxfYT1Ici5oYXNPd25Qcm9wZXJ0eSxwYT1Ici5wcm9wZXJ0eUlzRW51bWVyYWJsZSx5YT1YcihmdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHN9KCkpP1hyOmZ1bmN0aW9uKHQpe3JldHVybiBiZSh0KSYmX2EuY2FsbCh0LCJjYWxsZWUiKSYmIXBhLmNhbGwodCwiY2FsbGVlIil9LERuPXlhO2Z1bmN0aW9uIEFhKCl7cmV0dXJuITF9dmFyIHFyPXR5cGVvZiBleHBvcnRzPT0ib2JqZWN0IiYmZXhwb3J0cyYmIWV4cG9ydHMubm9kZVR5cGUmJmV4cG9ydHMsa3I9cXImJnR5cGVvZiBtb2R1bGU9PSJvYmplY3QiJiZtb2R1bGUmJiFtb2R1bGUubm9kZVR5cGUmJm1vZHVsZSxUYT1rciYma3IuZXhwb3J0cz09PXFyLFlyPVRhP1V0LkJ1ZmZlcjp2b2lkIDAsUmE9WXI/WXIuaXNCdWZmZXI6dm9pZCAwLHhhPVJhfHxBYSxLcj14YSxPYT0iW29iamVjdCBBcmd1bWVudHNdIixiYT0iW29iamVjdCBBcnJheV0iLGdhPSJbb2JqZWN0IEJvb2xlYW5dIixTYT0iW29iamVjdCBEYXRlXSIsbWE9IltvYmplY3QgRXJyb3JdIixGYT0iW29iamVjdCBGdW5jdGlvbl0iLHdhPSJbb2JqZWN0IE1hcF0iLElhPSJbb2JqZWN0IE51bWJlcl0iLE5hPSJbb2JqZWN0IE9iamVjdF0iLE1hPSJbb2JqZWN0IFJlZ0V4cF0iLENhPSJbb2JqZWN0IFNldF0iLHZhPSJbb2JqZWN0IFN0cmluZ10iLERhPSJbb2JqZWN0IFdlYWtNYXBdIixMYT0iW29iamVjdCBBcnJheUJ1ZmZlcl0iLFBhPSJbb2JqZWN0IERhdGFWaWV3XSIsQmE9IltvYmplY3QgRmxvYXQzMkFycmF5XSIsVWE9IltvYmplY3QgRmxvYXQ2NEFycmF5XSIsamE9IltvYmplY3QgSW50OEFycmF5XSIsR2E9IltvYmplY3QgSW50MTZBcnJheV0iLCRhPSJbb2JqZWN0IEludDMyQXJyYXldIixWYT0iW29iamVjdCBVaW50OEFycmF5XSIsemE9IltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIixXYT0iW29iamVjdCBVaW50MTZBcnJheV0iLFhhPSJbb2JqZWN0IFVpbnQzMkFycmF5XSIsUT17fTtRW0JhXT1RW1VhXT1RW2phXT1RW0dhXT1RWyRhXT1RW1ZhXT1RW3phXT1RW1dhXT1RW1hhXT0hMCxRW09hXT1RW2JhXT1RW0xhXT1RW2dhXT1RW1BhXT1RW1NhXT1RW21hXT1RW0ZhXT1RW3dhXT1RW0lhXT1RW05hXT1RW01hXT1RW0NhXT1RW3ZhXT1RW0RhXT0hMTtmdW5jdGlvbiBIYSh0KXtyZXR1cm4gYmUodCkmJkNuKHQubGVuZ3RoKSYmISFRW09lKHQpXX1mdW5jdGlvbiBMbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSl9fXZhciBacj10eXBlb2YgZXhwb3J0cz09Im9iamVjdCImJmV4cG9ydHMmJiFleHBvcnRzLm5vZGVUeXBlJiZleHBvcnRzLERlPVpyJiZ0eXBlb2YgbW9kdWxlPT0ib2JqZWN0IiYmbW9kdWxlJiYhbW9kdWxlLm5vZGVUeXBlJiZtb2R1bGUscWE9RGUmJkRlLmV4cG9ydHM9PT1acixQbj1xYSYmQ3IucHJvY2VzcyxrYT1mdW5jdGlvbigpe3RyeXt2YXIgdD1EZSYmRGUucmVxdWlyZSYmRGUucmVxdWlyZSgidXRpbCIpLnR5cGVzO3JldHVybiB0fHxQbiYmUG4uYmluZGluZyYmUG4uYmluZGluZygidXRpbCIpfWNhdGNoe319KCksZ2U9a2EsUXI9Z2UmJmdlLmlzVHlwZWRBcnJheSxZYT1Rcj9MbihRcik6SGEsS2E9WWEsWmE9T2JqZWN0LnByb3RvdHlwZSxRYT1aYS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBKcih0LGUpe3ZhciBuPVl0KHQpLHI9IW4mJkRuKHQpLGk9IW4mJiFyJiZLcih0KSxvPSFuJiYhciYmIWkmJkthKHQpLHM9bnx8cnx8aXx8byx1PXM/ZGEodC5sZW5ndGgsU3RyaW5nKTpbXSxhPXUubGVuZ3RoO2Zvcih2YXIgbCBpbiB0KShlfHxRYS5jYWxsKHQsbCkpJiYhKHMmJihsPT0ibGVuZ3RoInx8aSYmKGw9PSJvZmZzZXQifHxsPT0icGFyZW50Iil8fG8mJihsPT0iYnVmZmVyInx8bD09ImJ5dGVMZW5ndGgifHxsPT0iYnl0ZU9mZnNldCIpfHxObihsLGEpKSkmJnUucHVzaChsKTtyZXR1cm4gdX1mdW5jdGlvbiB0aSh0LGUpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gdChlKG4pKX19dmFyIEphPXRpKE9iamVjdC5rZXlzLE9iamVjdCksdHU9SmEsZXU9T2JqZWN0LnByb3RvdHlwZSxudT1ldS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBydSh0KXtpZighdm4odCkpcmV0dXJuIHR1KHQpO3ZhciBlPVtdO2Zvcih2YXIgbiBpbiBPYmplY3QodCkpbnUuY2FsbCh0LG4pJiZuIT0iY29uc3RydWN0b3IiJiZlLnB1c2gobik7cmV0dXJuIGV9ZnVuY3Rpb24gQm4odCl7cmV0dXJuIFdyKHQpP0pyKHQpOnJ1KHQpfWZ1bmN0aW9uIGl1KHQpe3ZhciBlPVtdO2lmKHQhPW51bGwpZm9yKHZhciBuIGluIE9iamVjdCh0KSllLnB1c2gobik7cmV0dXJuIGV9dmFyIG91PU9iamVjdC5wcm90b3R5cGUsc3U9b3UuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gYXUodCl7aWYoIWllKHQpKXJldHVybiBpdSh0KTt2YXIgZT12bih0KSxuPVtdO2Zvcih2YXIgciBpbiB0KXI9PSJjb25zdHJ1Y3RvciImJihlfHwhc3UuY2FsbCh0LHIpKXx8bi5wdXNoKHIpO3JldHVybiBufWZ1bmN0aW9uIFVuKHQpe3JldHVybiBXcih0KT9Kcih0LCEwKTphdSh0KX12YXIgdXU9L1wufFxbKD86W15bXF1dKnwoWyInXSkoPzooPyFcMSlbXlxcXXxcXC4pKj9cMSlcXS8sY3U9L15cdyokLztmdW5jdGlvbiBodSh0LGUpe2lmKFl0KHQpKXJldHVybiExO3ZhciBuPXR5cGVvZiB0O3JldHVybiBuPT0ibnVtYmVyInx8bj09InN5bWJvbCJ8fG49PSJib29sZWFuInx8dD09bnVsbHx8Rm4odCk/ITA6Y3UudGVzdCh0KXx8IXV1LnRlc3QodCl8fGUhPW51bGwmJnQgaW4gT2JqZWN0KGUpfXZhciBmdT1zZShPYmplY3QsImNyZWF0ZSIpLExlPWZ1O2Z1bmN0aW9uIGx1KCl7dGhpcy5fX2RhdGFfXz1MZT9MZShudWxsKTp7fSx0aGlzLnNpemU9MH1mdW5jdGlvbiBkdSh0KXt2YXIgZT10aGlzLmhhcyh0KSYmZGVsZXRlIHRoaXMuX19kYXRhX19bdF07cmV0dXJuIHRoaXMuc2l6ZS09ZT8xOjAsZX12YXIgRXU9Il9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iLF91PU9iamVjdC5wcm90b3R5cGUscHU9X3UuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24geXUodCl7dmFyIGU9dGhpcy5fX2RhdGFfXztpZihMZSl7dmFyIG49ZVt0XTtyZXR1cm4gbj09PUV1P3ZvaWQgMDpufXJldHVybiBwdS5jYWxsKGUsdCk/ZVt0XTp2b2lkIDB9dmFyIEF1PU9iamVjdC5wcm90b3R5cGUsVHU9QXUuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gUnUodCl7dmFyIGU9dGhpcy5fX2RhdGFfXztyZXR1cm4gTGU/ZVt0XSE9PXZvaWQgMDpUdS5jYWxsKGUsdCl9dmFyIHh1PSJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIjtmdW5jdGlvbiBPdSh0LGUpe3ZhciBuPXRoaXMuX19kYXRhX187cmV0dXJuIHRoaXMuc2l6ZSs9dGhpcy5oYXModCk/MDoxLG5bdF09TGUmJmU9PT12b2lkIDA/eHU6ZSx0aGlzfWZ1bmN0aW9uIGFlKHQpe3ZhciBlPS0xLG49dD09bnVsbD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPG47KXt2YXIgcj10W2VdO3RoaXMuc2V0KHJbMF0sclsxXSl9fWFlLnByb3RvdHlwZS5jbGVhcj1sdSxhZS5wcm90b3R5cGUuZGVsZXRlPWR1LGFlLnByb3RvdHlwZS5nZXQ9eXUsYWUucHJvdG90eXBlLmhhcz1SdSxhZS5wcm90b3R5cGUuc2V0PU91O2Z1bmN0aW9uIGJ1KCl7dGhpcy5fX2RhdGFfXz1bXSx0aGlzLnNpemU9MH1mdW5jdGlvbiBvbih0LGUpe2Zvcih2YXIgbj10Lmxlbmd0aDtuLS07KWlmKFZyKHRbbl1bMF0sZSkpcmV0dXJuIG47cmV0dXJuLTF9dmFyIGd1PUFycmF5LnByb3RvdHlwZSxTdT1ndS5zcGxpY2U7ZnVuY3Rpb24gbXUodCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxuPW9uKGUsdCk7aWYobjwwKXJldHVybiExO3ZhciByPWUubGVuZ3RoLTE7cmV0dXJuIG49PXI/ZS5wb3AoKTpTdS5jYWxsKGUsbiwxKSwtLXRoaXMuc2l6ZSwhMH1mdW5jdGlvbiBGdSh0KXt2YXIgZT10aGlzLl9fZGF0YV9fLG49b24oZSx0KTtyZXR1cm4gbjwwP3ZvaWQgMDplW25dWzFdfWZ1bmN0aW9uIHd1KHQpe3JldHVybiBvbih0aGlzLl9fZGF0YV9fLHQpPi0xfWZ1bmN0aW9uIEl1KHQsZSl7dmFyIG49dGhpcy5fX2RhdGFfXyxyPW9uKG4sdCk7cmV0dXJuIHI8MD8oKyt0aGlzLnNpemUsbi5wdXNoKFt0LGVdKSk6bltyXVsxXT1lLHRoaXN9ZnVuY3Rpb24gWHQodCl7dmFyIGU9LTEsbj10PT1udWxsPzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8bjspe3ZhciByPXRbZV07dGhpcy5zZXQoclswXSxyWzFdKX19WHQucHJvdG90eXBlLmNsZWFyPWJ1LFh0LnByb3RvdHlwZS5kZWxldGU9bXUsWHQucHJvdG90eXBlLmdldD1GdSxYdC5wcm90b3R5cGUuaGFzPXd1LFh0LnByb3RvdHlwZS5zZXQ9SXU7dmFyIE51PXNlKFV0LCJNYXAiKSxQZT1OdTtmdW5jdGlvbiBNdSgpe3RoaXMuc2l6ZT0wLHRoaXMuX19kYXRhX189e2hhc2g6bmV3IGFlLG1hcDpuZXcoUGV8fFh0KSxzdHJpbmc6bmV3IGFlfX1mdW5jdGlvbiBDdSh0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4gZT09InN0cmluZyJ8fGU9PSJudW1iZXIifHxlPT0ic3ltYm9sInx8ZT09ImJvb2xlYW4iP3QhPT0iX19wcm90b19fIjp0PT09bnVsbH1mdW5jdGlvbiBzbih0LGUpe3ZhciBuPXQuX19kYXRhX187cmV0dXJuIEN1KGUpP25bdHlwZW9mIGU9PSJzdHJpbmciPyJzdHJpbmciOiJoYXNoIl06bi5tYXB9ZnVuY3Rpb24gdnUodCl7dmFyIGU9c24odGhpcyx0KS5kZWxldGUodCk7cmV0dXJuIHRoaXMuc2l6ZS09ZT8xOjAsZX1mdW5jdGlvbiBEdSh0KXtyZXR1cm4gc24odGhpcyx0KS5nZXQodCl9ZnVuY3Rpb24gTHUodCl7cmV0dXJuIHNuKHRoaXMsdCkuaGFzKHQpfWZ1bmN0aW9uIFB1KHQsZSl7dmFyIG49c24odGhpcyx0KSxyPW4uc2l6ZTtyZXR1cm4gbi5zZXQodCxlKSx0aGlzLnNpemUrPW4uc2l6ZT09cj8wOjEsdGhpc31mdW5jdGlvbiBLdCh0KXt2YXIgZT0tMSxuPXQ9PW51bGw/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxuOyl7dmFyIHI9dFtlXTt0aGlzLnNldChyWzBdLHJbMV0pfX1LdC5wcm90b3R5cGUuY2xlYXI9TXUsS3QucHJvdG90eXBlLmRlbGV0ZT12dSxLdC5wcm90b3R5cGUuZ2V0PUR1LEt0LnByb3RvdHlwZS5oYXM9THUsS3QucHJvdG90eXBlLnNldD1QdTt2YXIgQnU9IkV4cGVjdGVkIGEgZnVuY3Rpb24iO2Z1bmN0aW9uIGpuKHQsZSl7aWYodHlwZW9mIHQhPSJmdW5jdGlvbiJ8fGUhPW51bGwmJnR5cGVvZiBlIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoQnUpO3ZhciBuPWZ1bmN0aW9uKCl7dmFyIHI9YXJndW1lbnRzLGk9ZT9lLmFwcGx5KHRoaXMscik6clswXSxvPW4uY2FjaGU7aWYoby5oYXMoaSkpcmV0dXJuIG8uZ2V0KGkpO3ZhciBzPXQuYXBwbHkodGhpcyxyKTtyZXR1cm4gbi5jYWNoZT1vLnNldChpLHMpfHxvLHN9O3JldHVybiBuLmNhY2hlPW5ldyhqbi5DYWNoZXx8S3QpLG59am4uQ2FjaGU9S3Q7dmFyIFV1PTUwMDtmdW5jdGlvbiBqdSh0KXt2YXIgZT1qbih0LGZ1bmN0aW9uKHIpe3JldHVybiBuLnNpemU9PT1VdSYmbi5jbGVhcigpLHJ9KSxuPWUuY2FjaGU7cmV0dXJuIGV9dmFyIEd1PS9bXi5bXF1dK3xcWyg/OigtP1xkKyg/OlwuXGQrKT8pfChbIiddKSgoPzooPyFcMilbXlxcXXxcXC4pKj8pXDIpXF18KD89KD86XC58XFtcXSkoPzpcLnxcW1xdfCQpKS9nLCR1PS9cXChcXCk/L2csVnU9anUoZnVuY3Rpb24odCl7dmFyIGU9W107cmV0dXJuIHQuY2hhckNvZGVBdCgwKT09PTQ2JiZlLnB1c2goIiIpLHQucmVwbGFjZShHdSxmdW5jdGlvbihuLHIsaSxvKXtlLnB1c2goaT9vLnJlcGxhY2UoJHUsIiQxIik6cnx8bil9KSxlfSksenU9VnU7ZnVuY3Rpb24gV3UodCl7cmV0dXJuIHQ9PW51bGw/IiI6QnIodCl9ZnVuY3Rpb24gYW4odCxlKXtyZXR1cm4gWXQodCk/dDpodSh0LGUpP1t0XTp6dShXdSh0KSl9dmFyIFh1PTEvMDtmdW5jdGlvbiBHbih0KXtpZih0eXBlb2YgdD09InN0cmluZyJ8fEZuKHQpKXJldHVybiB0O3ZhciBlPXQrIiI7cmV0dXJuIGU9PSIwIiYmMS90PT0tWHU/Ii0wIjplfWZ1bmN0aW9uIEh1KHQsZSl7ZT1hbihlLHQpO2Zvcih2YXIgbj0wLHI9ZS5sZW5ndGg7dCE9bnVsbCYmbjxyOyl0PXRbR24oZVtuKytdKV07cmV0dXJuIG4mJm49PXI/dDp2b2lkIDB9ZnVuY3Rpb24gJG4odCxlKXtmb3IodmFyIG49LTEscj1lLmxlbmd0aCxpPXQubGVuZ3RoOysrbjxyOyl0W2krbl09ZVtuXTtyZXR1cm4gdH12YXIgZWk9anQ/anQuaXNDb25jYXRTcHJlYWRhYmxlOnZvaWQgMDtmdW5jdGlvbiBxdSh0KXtyZXR1cm4gWXQodCl8fERuKHQpfHwhIShlaSYmdCYmdFtlaV0pfWZ1bmN0aW9uIG5pKHQsZSxuLHIsaSl7dmFyIG89LTEscz10Lmxlbmd0aDtmb3Iobnx8KG49cXUpLGl8fChpPVtdKTsrK288czspe3ZhciB1PXRbb107ZT4wJiZuKHUpP2U+MT9uaSh1LGUtMSxuLHIsaSk6JG4oaSx1KTpyfHwoaVtpLmxlbmd0aF09dSl9cmV0dXJuIGl9ZnVuY3Rpb24ga3UodCl7dmFyIGU9dD09bnVsbD8wOnQubGVuZ3RoO3JldHVybiBlP25pKHQsMSk6W119ZnVuY3Rpb24gWXUodCl7cmV0dXJuIGlhKGhhKHQsdm9pZCAwLGt1KSx0KyIiKX12YXIgS3U9dGkoT2JqZWN0LmdldFByb3RvdHlwZU9mLE9iamVjdCkscmk9S3U7ZnVuY3Rpb24gWnUoKXt0aGlzLl9fZGF0YV9fPW5ldyBYdCx0aGlzLnNpemU9MH1mdW5jdGlvbiBRdSh0KXt2YXIgZT10aGlzLl9fZGF0YV9fLG49ZS5kZWxldGUodCk7cmV0dXJuIHRoaXMuc2l6ZT1lLnNpemUsbn1mdW5jdGlvbiBKdSh0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5nZXQodCl9ZnVuY3Rpb24gdGModCl7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHQpfXZhciBlYz0yMDA7ZnVuY3Rpb24gbmModCxlKXt2YXIgbj10aGlzLl9fZGF0YV9fO2lmKG4gaW5zdGFuY2VvZiBYdCl7dmFyIHI9bi5fX2RhdGFfXztpZighUGV8fHIubGVuZ3RoPGVjLTEpcmV0dXJuIHIucHVzaChbdCxlXSksdGhpcy5zaXplPSsrbi5zaXplLHRoaXM7bj10aGlzLl9fZGF0YV9fPW5ldyBLdChyKX1yZXR1cm4gbi5zZXQodCxlKSx0aGlzLnNpemU9bi5zaXplLHRoaXN9ZnVuY3Rpb24gU2UodCl7dmFyIGU9dGhpcy5fX2RhdGFfXz1uZXcgWHQodCk7dGhpcy5zaXplPWUuc2l6ZX1TZS5wcm90b3R5cGUuY2xlYXI9WnUsU2UucHJvdG90eXBlLmRlbGV0ZT1RdSxTZS5wcm90b3R5cGUuZ2V0PUp1LFNlLnByb3RvdHlwZS5oYXM9dGMsU2UucHJvdG90eXBlLnNldD1uYztmdW5jdGlvbiByYyh0LGUpe3JldHVybiB0JiZybihlLEJuKGUpLHQpfWZ1bmN0aW9uIGljKHQsZSl7cmV0dXJuIHQmJnJuKGUsVW4oZSksdCl9dmFyIGlpPXR5cGVvZiBleHBvcnRzPT0ib2JqZWN0IiYmZXhwb3J0cyYmIWV4cG9ydHMubm9kZVR5cGUmJmV4cG9ydHMsb2k9aWkmJnR5cGVvZiBtb2R1bGU9PSJvYmplY3QiJiZtb2R1bGUmJiFtb2R1bGUubm9kZVR5cGUmJm1vZHVsZSxvYz1vaSYmb2kuZXhwb3J0cz09PWlpLHNpPW9jP1V0LkJ1ZmZlcjp2b2lkIDAsYWk9c2k/c2kuYWxsb2NVbnNhZmU6dm9pZCAwO2Z1bmN0aW9uIHNjKHQsZSl7aWYoZSlyZXR1cm4gdC5zbGljZSgpO3ZhciBuPXQubGVuZ3RoLHI9YWk/YWkobik6bmV3IHQuY29uc3RydWN0b3Iobik7cmV0dXJuIHQuY29weShyKSxyfWZ1bmN0aW9uIGFjKHQsZSl7Zm9yKHZhciBuPS0xLHI9dD09bnVsbD8wOnQubGVuZ3RoLGk9MCxvPVtdOysrbjxyOyl7dmFyIHM9dFtuXTtlKHMsbix0KSYmKG9baSsrXT1zKX1yZXR1cm4gb31mdW5jdGlvbiB1aSgpe3JldHVybltdfXZhciB1Yz1PYmplY3QucHJvdG90eXBlLGNjPXVjLnByb3BlcnR5SXNFbnVtZXJhYmxlLGNpPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsaGM9Y2k/ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PW51bGw/W106KHQ9T2JqZWN0KHQpLGFjKGNpKHQpLGZ1bmN0aW9uKGUpe3JldHVybiBjYy5jYWxsKHQsZSl9KSl9OnVpLFZuPWhjO2Z1bmN0aW9uIGZjKHQsZSl7cmV0dXJuIHJuKHQsVm4odCksZSl9dmFyIGxjPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsZGM9bGM/ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdO3Q7KSRuKGUsVm4odCkpLHQ9cmkodCk7cmV0dXJuIGV9OnVpLGhpPWRjO2Z1bmN0aW9uIEVjKHQsZSl7cmV0dXJuIHJuKHQsaGkodCksZSl9ZnVuY3Rpb24gZmkodCxlLG4pe3ZhciByPWUodCk7cmV0dXJuIFl0KHQpP3I6JG4ocixuKHQpKX1mdW5jdGlvbiBfYyh0KXtyZXR1cm4gZmkodCxCbixWbil9ZnVuY3Rpb24gcGModCl7cmV0dXJuIGZpKHQsVW4saGkpfXZhciB5Yz1zZShVdCwiRGF0YVZpZXciKSx6bj15YyxBYz1zZShVdCwiUHJvbWlzZSIpLFduPUFjLFRjPXNlKFV0LCJTZXQiKSxYbj1UYyxsaT0iW29iamVjdCBNYXBdIixSYz0iW29iamVjdCBPYmplY3RdIixkaT0iW29iamVjdCBQcm9taXNlXSIsRWk9IltvYmplY3QgU2V0XSIsX2k9IltvYmplY3QgV2Vha01hcF0iLHBpPSJbb2JqZWN0IERhdGFWaWV3XSIseGM9b2Uoem4pLE9jPW9lKFBlKSxiYz1vZShXbiksZ2M9b2UoWG4pLFNjPW9lKEluKSx1ZT1PZTsoem4mJnVlKG5ldyB6bihuZXcgQXJyYXlCdWZmZXIoMSkpKSE9cGl8fFBlJiZ1ZShuZXcgUGUpIT1saXx8V24mJnVlKFduLnJlc29sdmUoKSkhPWRpfHxYbiYmdWUobmV3IFhuKSE9RWl8fEluJiZ1ZShuZXcgSW4pIT1faSkmJih1ZT1mdW5jdGlvbih0KXt2YXIgZT1PZSh0KSxuPWU9PVJjP3QuY29uc3RydWN0b3I6dm9pZCAwLHI9bj9vZShuKToiIjtpZihyKXN3aXRjaChyKXtjYXNlIHhjOnJldHVybiBwaTtjYXNlIE9jOnJldHVybiBsaTtjYXNlIGJjOnJldHVybiBkaTtjYXNlIGdjOnJldHVybiBFaTtjYXNlIFNjOnJldHVybiBfaX1yZXR1cm4gZX0pO3ZhciBIbj11ZSxtYz1PYmplY3QucHJvdG90eXBlLEZjPW1jLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIHdjKHQpe3ZhciBlPXQubGVuZ3RoLG49bmV3IHQuY29uc3RydWN0b3IoZSk7cmV0dXJuIGUmJnR5cGVvZiB0WzBdPT0ic3RyaW5nIiYmRmMuY2FsbCh0LCJpbmRleCIpJiYobi5pbmRleD10LmluZGV4LG4uaW5wdXQ9dC5pbnB1dCksbn12YXIgSWM9VXQuVWludDhBcnJheSx5aT1JYztmdW5jdGlvbiBxbih0KXt2YXIgZT1uZXcgdC5jb25zdHJ1Y3Rvcih0LmJ5dGVMZW5ndGgpO3JldHVybiBuZXcgeWkoZSkuc2V0KG5ldyB5aSh0KSksZX1mdW5jdGlvbiBOYyh0LGUpe3ZhciBuPWU/cW4odC5idWZmZXIpOnQuYnVmZmVyO3JldHVybiBuZXcgdC5jb25zdHJ1Y3RvcihuLHQuYnl0ZU9mZnNldCx0LmJ5dGVMZW5ndGgpfXZhciBNYz0vXHcqJC87ZnVuY3Rpb24gQ2ModCl7dmFyIGU9bmV3IHQuY29uc3RydWN0b3IodC5zb3VyY2UsTWMuZXhlYyh0KSk7cmV0dXJuIGUubGFzdEluZGV4PXQubGFzdEluZGV4LGV9dmFyIEFpPWp0P2p0LnByb3RvdHlwZTp2b2lkIDAsVGk9QWk/QWkudmFsdWVPZjp2b2lkIDA7ZnVuY3Rpb24gdmModCl7cmV0dXJuIFRpP09iamVjdChUaS5jYWxsKHQpKTp7fX1mdW5jdGlvbiBEYyh0LGUpe3ZhciBuPWU/cW4odC5idWZmZXIpOnQuYnVmZmVyO3JldHVybiBuZXcgdC5jb25zdHJ1Y3RvcihuLHQuYnl0ZU9mZnNldCx0Lmxlbmd0aCl9dmFyIExjPSJbb2JqZWN0IEJvb2xlYW5dIixQYz0iW29iamVjdCBEYXRlXSIsQmM9IltvYmplY3QgTWFwXSIsVWM9IltvYmplY3QgTnVtYmVyXSIsamM9IltvYmplY3QgUmVnRXhwXSIsR2M9IltvYmplY3QgU2V0XSIsJGM9IltvYmplY3QgU3RyaW5nXSIsVmM9IltvYmplY3QgU3ltYm9sXSIsemM9IltvYmplY3QgQXJyYXlCdWZmZXJdIixXYz0iW29iamVjdCBEYXRhVmlld10iLFhjPSJbb2JqZWN0IEZsb2F0MzJBcnJheV0iLEhjPSJbb2JqZWN0IEZsb2F0NjRBcnJheV0iLHFjPSJbb2JqZWN0IEludDhBcnJheV0iLGtjPSJbb2JqZWN0IEludDE2QXJyYXldIixZYz0iW29iamVjdCBJbnQzMkFycmF5XSIsS2M9IltvYmplY3QgVWludDhBcnJheV0iLFpjPSJbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XSIsUWM9IltvYmplY3QgVWludDE2QXJyYXldIixKYz0iW29iamVjdCBVaW50MzJBcnJheV0iO2Z1bmN0aW9uIHRoKHQsZSxuKXt2YXIgcj10LmNvbnN0cnVjdG9yO3N3aXRjaChlKXtjYXNlIHpjOnJldHVybiBxbih0KTtjYXNlIExjOmNhc2UgUGM6cmV0dXJuIG5ldyByKCt0KTtjYXNlIFdjOnJldHVybiBOYyh0LG4pO2Nhc2UgWGM6Y2FzZSBIYzpjYXNlIHFjOmNhc2Uga2M6Y2FzZSBZYzpjYXNlIEtjOmNhc2UgWmM6Y2FzZSBRYzpjYXNlIEpjOnJldHVybiBEYyh0LG4pO2Nhc2UgQmM6cmV0dXJuIG5ldyByO2Nhc2UgVWM6Y2FzZSAkYzpyZXR1cm4gbmV3IHIodCk7Y2FzZSBqYzpyZXR1cm4gQ2ModCk7Y2FzZSBHYzpyZXR1cm4gbmV3IHI7Y2FzZSBWYzpyZXR1cm4gdmModCl9fWZ1bmN0aW9uIGVoKHQpe3JldHVybiB0eXBlb2YgdC5jb25zdHJ1Y3Rvcj09ImZ1bmN0aW9uIiYmIXZuKHQpP0hzKHJpKHQpKTp7fX12YXIgbmg9IltvYmplY3QgTWFwXSI7ZnVuY3Rpb24gcmgodCl7cmV0dXJuIGJlKHQpJiZIbih0KT09bmh9dmFyIFJpPWdlJiZnZS5pc01hcCxpaD1SaT9MbihSaSk6cmgsb2g9aWgsc2g9IltvYmplY3QgU2V0XSI7ZnVuY3Rpb24gYWgodCl7cmV0dXJuIGJlKHQpJiZIbih0KT09c2h9dmFyIHhpPWdlJiZnZS5pc1NldCx1aD14aT9Mbih4aSk6YWgsY2g9dWgsaGg9MSxmaD0yLGxoPTQsT2k9IltvYmplY3QgQXJndW1lbnRzXSIsZGg9IltvYmplY3QgQXJyYXldIixFaD0iW29iamVjdCBCb29sZWFuXSIsX2g9IltvYmplY3QgRGF0ZV0iLHBoPSJbb2JqZWN0IEVycm9yXSIsYmk9IltvYmplY3QgRnVuY3Rpb25dIix5aD0iW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0iLEFoPSJbb2JqZWN0IE1hcF0iLFRoPSJbb2JqZWN0IE51bWJlcl0iLGdpPSJbb2JqZWN0IE9iamVjdF0iLFJoPSJbb2JqZWN0IFJlZ0V4cF0iLHhoPSJbb2JqZWN0IFNldF0iLE9oPSJbb2JqZWN0IFN0cmluZ10iLGJoPSJbb2JqZWN0IFN5bWJvbF0iLGdoPSJbb2JqZWN0IFdlYWtNYXBdIixTaD0iW29iamVjdCBBcnJheUJ1ZmZlcl0iLG1oPSJbb2JqZWN0IERhdGFWaWV3XSIsRmg9IltvYmplY3QgRmxvYXQzMkFycmF5XSIsd2g9IltvYmplY3QgRmxvYXQ2NEFycmF5XSIsSWg9IltvYmplY3QgSW50OEFycmF5XSIsTmg9IltvYmplY3QgSW50MTZBcnJheV0iLE1oPSJbb2JqZWN0IEludDMyQXJyYXldIixDaD0iW29iamVjdCBVaW50OEFycmF5XSIsdmg9IltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIixEaD0iW29iamVjdCBVaW50MTZBcnJheV0iLExoPSJbb2JqZWN0IFVpbnQzMkFycmF5XSIsWj17fTtaW09pXT1aW2RoXT1aW1NoXT1aW21oXT1aW0VoXT1aW19oXT1aW0ZoXT1aW3doXT1aW0loXT1aW05oXT1aW01oXT1aW0FoXT1aW1RoXT1aW2dpXT1aW1JoXT1aW3hoXT1aW09oXT1aW2JoXT1aW0NoXT1aW3ZoXT1aW0RoXT1aW0xoXT0hMCxaW3BoXT1aW2JpXT1aW2doXT0hMTtmdW5jdGlvbiB1bih0LGUsbixyLGksbyl7dmFyIHMsdT1lJmhoLGE9ZSZmaCxsPWUmbGg7aWYobiYmKHM9aT9uKHQscixpLG8pOm4odCkpLHMhPT12b2lkIDApcmV0dXJuIHM7aWYoIWllKHQpKXJldHVybiB0O3ZhciBkPVl0KHQpO2lmKGQpe2lmKHM9d2ModCksIXUpcmV0dXJuIGtzKHQscyl9ZWxzZXt2YXIgXz1Ibih0KSxPPV89PWJpfHxfPT15aDtpZihLcih0KSlyZXR1cm4gc2ModCx1KTtpZihfPT1naXx8Xz09T2l8fE8mJiFpKXtpZihzPWF8fE8/e306ZWgodCksIXUpcmV0dXJuIGE/RWModCxpYyhzLHQpKTpmYyh0LHJjKHMsdCkpfWVsc2V7aWYoIVpbX10pcmV0dXJuIGk/dDp7fTtzPXRoKHQsXyx1KX19b3x8KG89bmV3IFNlKTt2YXIgYj1vLmdldCh0KTtpZihiKXJldHVybiBiO28uc2V0KHQscyksY2godCk/dC5mb3JFYWNoKGZ1bmN0aW9uKE4pe3MuYWRkKHVuKE4sZSxuLE4sdCxvKSl9KTpvaCh0KSYmdC5mb3JFYWNoKGZ1bmN0aW9uKE4sZyl7cy5zZXQoZyx1bihOLGUsbixnLHQsbykpfSk7dmFyIEY9bD9hP3BjOl9jOmE/VW46Qm4sUz1kP3ZvaWQgMDpGKHQpO3JldHVybiBvYShTfHx0LGZ1bmN0aW9uKE4sZyl7UyYmKGc9TixOPXRbZ10pLE1uKHMsZyx1bihOLGUsbixnLHQsbykpfSksc312YXIgUGg9MSxCaD00O2Z1bmN0aW9uIFVoKHQpe3JldHVybiB1bih0LFBofEJoKX1mdW5jdGlvbiBqaCh0LGUpe3JldHVybiB0IT1udWxsJiZlIGluIE9iamVjdCh0KX1mdW5jdGlvbiBHaCh0LGUsbil7ZT1hbihlLHQpO2Zvcih2YXIgcj0tMSxpPWUubGVuZ3RoLG89ITE7KytyPGk7KXt2YXIgcz1HbihlW3JdKTtpZighKG89dCE9bnVsbCYmbih0LHMpKSlicmVhazt0PXRbc119cmV0dXJuIG98fCsrciE9aT9vOihpPXQ9PW51bGw/MDp0Lmxlbmd0aCwhIWkmJkNuKGkpJiZObihzLGkpJiYoWXQodCl8fERuKHQpKSl9ZnVuY3Rpb24gJGgodCxlKXtyZXR1cm4gdCE9bnVsbCYmR2godCxlLGpoKX1mdW5jdGlvbiBWaCh0LGUsbixyKXtpZighaWUodCkpcmV0dXJuIHQ7ZT1hbihlLHQpO2Zvcih2YXIgaT0tMSxvPWUubGVuZ3RoLHM9by0xLHU9dDt1IT1udWxsJiYrK2k8bzspe3ZhciBhPUduKGVbaV0pLGw9bjtpZihhPT09Il9fcHJvdG9fXyJ8fGE9PT0iY29uc3RydWN0b3IifHxhPT09InByb3RvdHlwZSIpcmV0dXJuIHQ7aWYoaSE9cyl7dmFyIGQ9dVthXTtsPXI/cihkLGEsdSk6dm9pZCAwLGw9PT12b2lkIDAmJihsPWllKGQpP2Q6Tm4oZVtpKzFdKT9bXTp7fSl9TW4odSxhLGwpLHU9dVthXX1yZXR1cm4gdH1mdW5jdGlvbiB6aCh0LGUsbil7Zm9yKHZhciByPS0xLGk9ZS5sZW5ndGgsbz17fTsrK3I8aTspe3ZhciBzPWVbcl0sdT1IdSh0LHMpO24odSxzKSYmVmgobyxhbihzLHQpLHUpfXJldHVybiBvfWZ1bmN0aW9uIFdoKHQsZSl7cmV0dXJuIHpoKHQsZSxmdW5jdGlvbihuLHIpe3JldHVybiAkaCh0LHIpfSl9dmFyIFhoPVl1KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PW51bGw/e306V2godCxlKX0pLEhoPVhoO2Z1bmN0aW9uIHFoKHQpe3JldHVybiBPYmplY3Qua2V5cyh0KX1mdW5jdGlvbiBkdCh0LGUpe3JldHVybiB0Pz9lfWNvbnN0IGtoPXQ9PntsZXQgZT0wO2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKXtjb25zdCByPXQuY2hhckNvZGVBdChuKTtlPShlPDw1KS1lK3IsZSY9ZX1yZXR1cm4gZS50b1N0cmluZygxNil9LFloPXFoKHttYXJrZXI6MSxwb2x5bGluZToxLHBvbHlnb246MSxlbGxpcHNvaWQ6MSxlbGxpcHNlOjEsbW9kZWw6MSwiM2R0aWxlcyI6MSxib3g6MSxwaG90b292ZXJsYXk6MSxyZXNvdXJjZToxLHJhc3RlcjoxLGhlYXRNYXA6MSxmcnVzdHVtOjEsdHJhbnNpdGlvbjoxfSk7dmFyIE09KHQ9Pih0W3QuVkFSSUFCTEU9MF09IlZBUklBQkxFIix0W3QuVU5BUlk9MV09IlVOQVJZIix0W3QuQklOQVJZPTJdPSJCSU5BUlkiLHRbdC5URVJOQVJZPTNdPSJURVJOQVJZIix0W3QuQ09ORElUSU9OQUw9NF09IkNPTkRJVElPTkFMIix0W3QuTUVNQkVSPTVdPSJNRU1CRVIiLHRbdC5GVU5DVElPTl9DQUxMPTZdPSJGVU5DVElPTl9DQUxMIix0W3QuQVJSQVk9N109IkFSUkFZIix0W3QuUkVHRVg9OF09IlJFR0VYIix0W3QuVkFSSUFCTEVfSU5fU1RSSU5HPTldPSJWQVJJQUJMRV9JTl9TVFJJTkciLHRbdC5MSVRFUkFMX05VTEw9MTBdPSJMSVRFUkFMX05VTEwiLHRbdC5MSVRFUkFMX0JPT0xFQU49MTFdPSJMSVRFUkFMX0JPT0xFQU4iLHRbdC5MSVRFUkFMX05VTUJFUj0xMl09IkxJVEVSQUxfTlVNQkVSIix0W3QuTElURVJBTF9TVFJJTkc9MTNdPSJMSVRFUkFMX1NUUklORyIsdFt0LkxJVEVSQUxfQ09MT1I9MTRdPSJMSVRFUkFMX0NPTE9SIix0W3QuTElURVJBTF9WRUNUT1I9MTVdPSJMSVRFUkFMX1ZFQ1RPUiIsdFt0LkxJVEVSQUxfUkVHRVg9MTZdPSJMSVRFUkFMX1JFR0VYIix0W3QuTElURVJBTF9VTkRFRklORUQ9MTddPSJMSVRFUkFMX1VOREVGSU5FRCIsdFt0LkJVSUxUSU5fVkFSSUFCTEU9MThdPSJCVUlMVElOX1ZBUklBQkxFIix0KSkoTXx8e30pO2NvbnN0IEtoPVsiISIsIi0iLCIrIl0sWmg9WyIrIiwiLSIsIioiLCIvIiwiJSIsIj09PSIsIiE9PSIsIj4iLCI+PSIsIjwiLCI8PSIsIiYmIiwifHwiLCIhfiIsIj1+IiwiPT0iLCIhPSJdLFFoPS9cXC9nLEpoPSJAIyUiLHRmPS9AIyUvZyxlZj0vXiMoWzAtOWEtZl0pKFswLTlhLWZdKShbMC05YS1mXSkoWzAtOWEtZl0pPyQvaSxuZj0vXiMoWzAtOWEtZl17Mn0pKFswLTlhLWZdezJ9KShbMC05YS1mXXsyfSkoWzAtOWEtZl17Mn0pPyQvaSxTaT17QUxJQ0VCTFVFOiIjRjBGOEZGIixBTlRJUVVFV0hJVEU6IiNGQUVCRDciLEFRVUE6IiMwMEZGRkYiLEFRVUFNQVJJTkU6IiM3RkZGRDQiLEFaVVJFOiIjRjBGRkZGIixCRUlHRToiI0Y1RjVEQyIsQklTUVVFOiIjRkZFNEM0IixCTEFDSzoiIzAwMDAwMCIsQkxBTkNIRURBTE1PTkQ6IiNGRkVCQ0QiLEJMVUU6IiMwMDAwRkYiLEJMVUVWSU9MRVQ6IiM4QTJCRTIiLEJST1dOOiIjQTUyQTJBIixCVVJMWVdPT0Q6IiNERUI4ODciLENBREVUQkxVRToiIzVGOUVBMCIsQ0hBUlRSRVVTRToiIzdGRkYwMCIsQ0hPQ09MQVRFOiIjRDI2OTFFIixDT1JBTDoiI0ZGN0Y1MCIsQ09STkZMT1dFUkJMVUU6IiM2NDk1RUQiLENPUk5TSUxLOiIjRkZGOERDIixDUklNU09OOiIjREMxNDNDIixDWUFOOiIjMDBGRkZGIixEQVJLQkxVRToiIzAwMDA4QiIsREFSS0NZQU46IiMwMDhCOEIiLERBUktHT0xERU5ST0Q6IiNCODg2MEIiLERBUktHUkFZOiIjQTlBOUE5IixEQVJLR1JFRU46IiMwMDY0MDAiLERBUktHUkVZOiIjQTlBOUE5IixEQVJLS0hBS0k6IiNCREI3NkIiLERBUktNQUdFTlRBOiIjOEIwMDhCIixEQVJLT0xJVkVHUkVFTjoiIzU1NkIyRiIsREFSS09SQU5HRToiI0ZGOEMwMCIsREFSS09SQ0hJRDoiIzk5MzJDQyIsREFSS1JFRDoiIzhCMDAwMCIsREFSS1NBTE1PTjoiI0U5OTY3QSIsREFSS1NFQUdSRUVOOiIjOEZCQzhGIixEQVJLU0xBVEVCTFVFOiIjNDgzRDhCIixEQVJLU0xBVEVHUkFZOiIjMkY0RjRGIixEQVJLU0xBVEVHUkVZOiIjMkY0RjRGIixEQVJLVFVSUVVPSVNFOiIjMDBDRUQxIixEQVJLVklPTEVUOiIjOTQwMEQzIixERUVQUElOSzoiI0ZGMTQ5MyIsREVFUFNLWUJMVUU6IiMwMEJGRkYiLERJTUdSQVk6IiM2OTY5NjkiLERJTUdSRVk6IiM2OTY5NjkiLERPREdFUkJMVUU6IiMxRTkwRkYiLEZJUkVCUklDSzoiI0IyMjIyMiIsRkxPUkFMV0hJVEU6IiNGRkZBRjAiLEZPUkVTVEdSRUVOOiIjMjI4QjIyIixGVUNIU0lBOiIjRkYwMEZGIixHQUlOU0JPUk86IiNEQ0RDREMiLEdIT1NUV0hJVEU6IiNGOEY4RkYiLEdPTEQ6IiNGRkQ3MDAiLEdPTERFTlJPRDoiI0RBQTUyMCIsR1JBWToiIzgwODA4MCIsR1JFRU46IiMwMDgwMDAiLEdSRUVOWUVMTE9XOiIjQURGRjJGIixHUkVZOiIjODA4MDgwIixIT05FWURFVzoiI0YwRkZGMCIsSE9UUElOSzoiI0ZGNjlCNCIsSU5ESUFOUkVEOiIjQ0Q1QzVDIixJTkRJR086IiM0QjAwODIiLElWT1JZOiIjRkZGRkYwIixLSEFLSToiI0YwRTY4QyIsTEFWRU5ERVI6IiNFNkU2RkEiLExBVkVOREFSX0JMVVNIOiIjRkZGMEY1IixMQVdOR1JFRU46IiM3Q0ZDMDAiLExFTU9OQ0hJRkZPTjoiI0ZGRkFDRCIsTElHSFRCTFVFOiIjQUREOEU2IixMSUdIVENPUkFMOiIjRjA4MDgwIixMSUdIVENZQU46IiNFMEZGRkYiLExJR0hUR09MREVOUk9EWUVMTE9XOiIjRkFGQUQyIixMSUdIVEdSQVk6IiNEM0QzRDMiLExJR0hUR1JFRU46IiM5MEVFOTAiLExJR0hUR1JFWToiI0QzRDNEMyIsTElHSFRQSU5LOiIjRkZCNkMxIixMSUdIVFNFQUdSRUVOOiIjMjBCMkFBIixMSUdIVFNLWUJMVUU6IiM4N0NFRkEiLExJR0hUU0xBVEVHUkFZOiIjNzc4ODk5IixMSUdIVFNMQVRFR1JFWToiIzc3ODg5OSIsTElHSFRTVEVFTEJMVUU6IiNCMEM0REUiLExJR0hUWUVMTE9XOiIjRkZGRkUwIixMSU1FOiIjMDBGRjAwIixMSU1FR1JFRU46IiMzMkNEMzIiLExJTkVOOiIjRkFGMEU2IixNQUdFTlRBOiIjRkYwMEZGIixNQVJPT046IiM4MDAwMDAiLE1FRElVTUFRVUFNQVJJTkU6IiM2NkNEQUEiLE1FRElVTUJMVUU6IiMwMDAwQ0QiLE1FRElVTU9SQ0hJRDoiI0JBNTVEMyIsTUVESVVNUFVSUExFOiIjOTM3MERCIixNRURJVU1TRUFHUkVFTjoiIzNDQjM3MSIsTUVESVVNU0xBVEVCTFVFOiIjN0I2OEVFIixNRURJVU1TUFJJTkdHUkVFTjoiIzAwRkE5QSIsTUVESVVNVFVSUVVPSVNFOiIjNDhEMUNDIixNRURJVU1WSU9MRVRSRUQ6IiNDNzE1ODUiLE1JRE5JR0hUQkxVRToiIzE5MTk3MCIsTUlOVENSRUFNOiIjRjVGRkZBIixNSVNUWVJPU0U6IiNGRkU0RTEiLE1PQ0NBU0lOOiIjRkZFNEI1IixOQVZBSk9XSElURToiI0ZGREVBRCIsTkFWWToiIzAwMDA4MCIsT0xETEFDRToiI0ZERjVFNiIsT0xJVkU6IiM4MDgwMDAiLE9MSVZFRFJBQjoiIzZCOEUyMyIsT1JBTkdFOiIjRkZBNTAwIixPUkFOR0VSRUQ6IiNGRjQ1MDAiLE9SQ0hJRDoiI0RBNzBENiIsUEFMRUdPTERFTlJPRDoiI0VFRThBQSIsUEFMRUdSRUVOOiIjOThGQjk4IixQQUxFVFVSUVVPSVNFOiIjQUZFRUVFIixQQUxFVklPTEVUUkVEOiIjREI3MDkzIixQQVBBWUFXSElQOiIjRkZFRkQ1IixQRUFDSFBVRkY6IiNGRkRBQjkiLFBFUlU6IiNDRDg1M0YiLFBJTks6IiNGRkMwQ0IiLFBMVU06IiNEREEwREQiLFBPV0RFUkJMVUU6IiNCMEUwRTYiLFBVUlBMRToiIzgwMDA4MCIsUkVEOiIjRkYwMDAwIixST1NZQlJPV046IiNCQzhGOEYiLFJPWUFMQkxVRToiIzQxNjlFMSIsU0FERExFQlJPV046IiM4QjQ1MTMiLFNBTE1PTjoiI0ZBODA3MiIsU0FORFlCUk9XTjoiI0Y0QTQ2MCIsU0VBR1JFRU46IiMyRThCNTciLFNFQVNIRUxMOiIjRkZGNUVFIixTSUVOTkE6IiNBMDUyMkQiLFNJTFZFUjoiI0MwQzBDMCIsU0tZQkxVRToiIzg3Q0VFQiIsU0xBVEVCTFVFOiIjNkE1QUNEIixTTEFURUdSQVk6IiM3MDgwOTAiLFNMQVRFR1JFWToiIzcwODA5MCIsU05PVzoiI0ZGRkFGQSIsU1BSSU5HR1JFRU46IiMwMEZGN0YiLFNURUVMQkxVRToiIzQ2ODJCNCIsVEFOOiIjRDJCNDhDIixURUFMOiIjMDA4MDgwIixUSElTVExFOiIjRDhCRkQ4IixUT01BVE86IiNGRjYzNDciLFRVUlFVT0lTRToiIzQwRTBEMCIsVklPTEVUOiIjRUU4MkVFIixXSEVBVDoiI0Y1REVCMyIsV0hJVEU6IiNGRkZGRkYiLFdISVRFU01PS0U6IiNGNUY1RjUiLFlFTExPVzoiI0ZGRkYwMCIsWUVMTE9XR1JFRU46IiM5QUNEMzIifTtmdW5jdGlvbiByZih0KXtjb25zdCBlPWtuW3RdO3JldHVybiBmdW5jdGlvbihuKXtjb25zdCByPXRoaXMuX2xlZnQuZXZhbHVhdGUobiksaT10aGlzLl9yaWdodC5ldmFsdWF0ZShuKTtyZXR1cm4gZSh0LHIsaSl9fWNvbnN0IGtuPXthdGFuMjpCZShNYXRoLmF0YW4yLCExKSxwb3c6QmUoTWF0aC5wb3csITEpLG1pbjpCZShNYXRoLm1pbiwhMCksbWF4OkJlKE1hdGgubWF4LCEwKSxzdGFydHNXaXRoOkJlKG9mLCExKX07ZnVuY3Rpb24gQmUodCxlKXtyZXR1cm4gZnVuY3Rpb24obixyLGkpe2lmKGUmJnR5cGVvZiBpPT0ibnVtYmVyIiYmdHlwZW9mIHI9PSJudW1iZXIifHx0eXBlb2Ygcj09Im51bWJlciImJnR5cGVvZiBpPT0ibnVtYmVyInx8dHlwZW9mIHI9PSJzdHJpbmciJiZ0eXBlb2YgaT09InN0cmluZyIpcmV0dXJuIHQocixpKTt0aHJvdyBuZXcgRXJyb3IoYEZ1bmN0aW9uICIke259IiByZXF1aXJlcyB2ZWN0b3Igb3IgbnVtYmVyIGFyZ3VtZW50cyBvZiBtYXRjaGluZyB0eXBlcy4gQXJndW1lbnRzIGFyZSAke3J9IGFuZCAke2l9LmApfX1mdW5jdGlvbiBvZih0LGUpe3JldHVybiB0LnN0YXJ0c1dpdGgoZSl9ZnVuY3Rpb24gc2YodCl7Y29uc3QgZT1Zblt0XTtyZXR1cm4gZnVuY3Rpb24obil7Y29uc3Qgcj10aGlzLl9sZWZ0LmV2YWx1YXRlKG4pO3JldHVybiBlKHQscil9fWNvbnN0IFluPXthYnM6Y3QoTWF0aC5hYnMpLHNxcnQ6Y3QoTWF0aC5zcXJ0KSxjb3M6Y3QoTWF0aC5jb3MpLHNpbjpjdChNYXRoLnNpbiksdGFuOmN0KE1hdGgudGFuKSxhY29zOmN0KE1hdGguYWNvcyksYXNpbjpjdChNYXRoLmFzaW4pLGF0YW46Y3QoTWF0aC5hdGFuKSxyYWRpYW5zOmN0KFIudG9SYWRpYW5zKSxkZWdyZWVzOmN0KFIudG9EZWdyZWVzKSxzaWduOmN0KFIuc2lnbiksZmxvb3I6Y3QoTWF0aC5mbG9vciksY2VpbDpjdChNYXRoLmNlaWwpLHJvdW5kOmN0KE1hdGgucm91bmQpLGV4cDI6Y3QodWYpLGxvZzpjdChNYXRoLmxvZyksbG9nMjpjdChjZiksZnJhY3Q6Y3QoYWYpfTtmdW5jdGlvbiBjdCh0KXtyZXR1cm4gZnVuY3Rpb24oZSxuKXtpZih0eXBlb2Ygbj09Im51bWJlciIpcmV0dXJuIHQobik7dGhyb3cgbmV3IEVycm9yKGBGdW5jdGlvbiAiJHtlfSIgcmVxdWlyZXMgYSB2ZWN0b3Igb3IgbnVtYmVyIGFyZ3VtZW50LiBBcmd1bWVudCBpcyAke259LmApfX1mdW5jdGlvbiBhZih0KXtyZXR1cm4gdC1NYXRoLmZsb29yKHQpfWZ1bmN0aW9uIHVmKHQpe3JldHVybiBNYXRoLnBvdygyLHQpfWZ1bmN0aW9uIGNmKHQpe3JldHVybiBSLmxvZzIodCl9Y29uc3QgaGY9L15yZ2JhP1woXHMqKFswLTkuXSslPylccyosXHMqKFswLTkuXSslPylccyosXHMqKFswLTkuXSslPykoPzpccyosXHMqKFswLTkuXSspKT9ccypcKSQvaSxmZj0vXmhzbGE/XChccyooWzAtOS5dKylccyosXHMqKFswLTkuXSslKVxzKixccyooWzAtOS5dKyUpKD86XHMqLFxzKihbMC05Ll0rKSk/XHMqXCkkL2k7Y2xhc3MgSntjb25zdHJ1Y3RvcihlLG4scixpKXt2KHRoaXMsInJlZCIpO3YodGhpcywiZ3JlZW4iKTt2KHRoaXMsImJsdWUiKTt2KHRoaXMsImFscGhhIik7dGhpcy5yZWQ9ZHQoZSwxKSx0aGlzLmdyZWVuPWR0KG4sMSksdGhpcy5ibHVlPWR0KHIsMSksdGhpcy5hbHBoYT1kdChpLDEpfXN0YXRpYyBieXRlVG9GbG9hdChlKXtyZXR1cm4gZS8yNTV9c3RhdGljIGZsb2F0VG9CeXRlKGUpe3JldHVybiBlPT09MT8yNTU6ZSoyNTZ8MH1zdGF0aWMgZnJvbUNzc0NvbG9yU3RyaW5nKGUpe2U9ZS5yZXBsYWNlKC9ccy9nLCIiKTtjb25zdCBuPWxmKGUpO2lmKHR5cGVvZiBuPCJ1IilyZXR1cm4gbjtsZXQgcj1lZi5leGVjKGUpO2lmKHIhPT1udWxsKXtjb25zdCBpPW5ldyBKO3JldHVybiBpLnJlZD1wYXJzZUludChyWzFdLDE2KS8xNSxpLmdyZWVuPXBhcnNlSW50KHJbMl0sMTYpLzE1LGkuYmx1ZT1wYXJzZUludChyWzNdLDE2KS8xNSxpLmFscGhhPXBhcnNlSW50KGR0KHJbNF0sImYiKSwxNikvMTUsaX1pZihyPW5mLmV4ZWMoZSksciE9PW51bGwpe2NvbnN0IGk9bmV3IEo7cmV0dXJuIGkucmVkPXBhcnNlSW50KHJbMV0sMTYpLzI1NSxpLmdyZWVuPXBhcnNlSW50KHJbMl0sMTYpLzI1NSxpLmJsdWU9cGFyc2VJbnQoclszXSwxNikvMjU1LGkuYWxwaGE9cGFyc2VJbnQoZHQocls0XSwiZmYiKSwxNikvMjU1LGl9aWYocj1oZi5leGVjKGUpLHIhPT1udWxsKXtjb25zdCBpPW5ldyBKO3JldHVybiBpLnJlZD1wYXJzZUZsb2F0KHJbMV0pLyhyWzFdLnN1YnN0cigtMSk9PT0iJSI/MTAwOjI1NSksaS5ncmVlbj1wYXJzZUZsb2F0KHJbMl0pLyhyWzJdLnN1YnN0cigtMSk9PT0iJSI/MTAwOjI1NSksaS5ibHVlPXBhcnNlRmxvYXQoclszXSkvKHJbM10uc3Vic3RyKC0xKT09PSIlIj8xMDA6MjU1KSxpLmFscGhhPXBhcnNlRmxvYXQoZHQocls0XSwiMS4wIikpLGl9aWYocj1mZi5leGVjKGUpLHIhPT1udWxsKXJldHVybiBKLmZyb21Ic2wocGFyc2VGbG9hdChyWzFdKS8zNjAscGFyc2VGbG9hdChyWzJdKS8xMDAscGFyc2VGbG9hdChyWzNdKS8xMDAscGFyc2VGbG9hdChkdChyWzRdLCIxLjAiKSkpfXN0YXRpYyBmcm9tSHNsKGUsbixyLGkpe2lmKGU9ZHQoZSwwKSUxLG49ZHQobiwwKSxyPWR0KHIsMCksaT1kdChpLDEpLGUmJm4mJnImJmkpe2xldCBvPXIscz1yLHU9cjtjb25zdCBhPW5ldyBKO2lmKG4hPT0wKXtsZXQgbDtyPC41P2w9ciooMStuKTpsPXIrbi1yKm47Y29uc3QgZD0yKnItbDtvPUtuKGQsbCxlKzEvMykscz1LbihkLGwsZSksdT1LbihkLGwsZS0xLzMpfXJldHVybiB0eXBlb2YgYT4idSI/bmV3IEoobyxzLHUsaSk6KGEucmVkPW8sYS5ncmVlbj1zLGEuYmx1ZT11LGEuYWxwaGE9aSxhKX19dG9Dc3NIZXhTdHJpbmcoKXtsZXQgZT1KLmZsb2F0VG9CeXRlKHRoaXMucmVkKS50b1N0cmluZygxNik7ZS5sZW5ndGg8MiYmKGU9YDAke2V9YCk7bGV0IG49Si5mbG9hdFRvQnl0ZSh0aGlzLmdyZWVuKS50b1N0cmluZygxNik7bi5sZW5ndGg8MiYmKG49YDAke259YCk7bGV0IHI9Si5mbG9hdFRvQnl0ZSh0aGlzLmJsdWUpLnRvU3RyaW5nKDE2KTtpZihyLmxlbmd0aDwyJiYocj1gMCR7cn1gKSx0aGlzLmFscGhhPDEpe2xldCBpPUouZmxvYXRUb0J5dGUodGhpcy5hbHBoYSkudG9TdHJpbmcoMTYpO3JldHVybiBpLmxlbmd0aDwyJiYoaT1gMCR7aX1gKSxgIyR7ZX0ke259JHtyfSR7aX1gfXJldHVybmAjJHtlfSR7bn0ke3J9YC50b1VwcGVyQ2FzZSgpfXN0YXRpYyBmcm9tQnl0ZXMoZSxuLHIsaSl7cmV0dXJuIGU9dGhpcy5ieXRlVG9GbG9hdChkdChlLDI1NSkpLG49Si5ieXRlVG9GbG9hdChkdChuLDI1NSkpLHI9Si5ieXRlVG9GbG9hdChkdChyLDI1NSkpLGk9Si5ieXRlVG9GbG9hdChkdChpLDI1NSkpLG5ldyBKKGUsbixyLGkpfX1mdW5jdGlvbiBsZih0KXtpZih0PXQudG9VcHBlckNhc2UoKSxTaVt0XSlyZXR1cm4gSi5mcm9tQ3NzQ29sb3JTdHJpbmcoU2lbdF0pO3N3aXRjaCh0KXtjYXNlIlRSQU5TUEFSRU5UIjpyZXR1cm4gbmV3IEooMCwwLDAsMCk7ZGVmYXVsdDpyZXR1cm59fWZ1bmN0aW9uIEtuKHQsZSxuKXtyZXR1cm4gbjwwJiYobis9MSksbj4xJiYobi09MSksbio2PDE/dCsoZS10KSo2Km46bioyPDE/ZTpuKjM8Mj90KyhlLXQpKigyLzMtbikqNjp0fWNsYXNzIFB7Y29uc3RydWN0b3IoZSxuLHIsaSxvKXt2KHRoaXMsIl90eXBlIik7dih0aGlzLCJfdmFsdWUiKTt2KHRoaXMsIl9sZWZ0Iik7dih0aGlzLCJfcmlnaHQiKTt2KHRoaXMsIl90ZXN0Iik7dih0aGlzLCJldmFsdWF0ZSIpO3RoaXMuX3R5cGU9ZSx0aGlzLl92YWx1ZT1uLHRoaXMuX2xlZnQ9cix0aGlzLl9yaWdodD1pLHRoaXMuX3Rlc3Q9byx0aGlzLnNldEV2YWx1YXRlRnVuY3Rpb24oKX1zZXRFdmFsdWF0ZUZ1bmN0aW9uKCl7Y29uc3QgZT10aGlzLl90eXBlLG49dGhpcy5fdmFsdWU7c3dpdGNoKGUpe2Nhc2UgTS5DT05ESVRJT05BTDp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlQ29uZGl0aW9uYWw7YnJlYWs7Y2FzZSBNLkZVTkNUSU9OX0NBTEw6c3dpdGNoKG4pe2Nhc2UidG9TdHJpbmciOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVUb1N0cmluZzticmVha31icmVhaztjYXNlIE0uVU5BUlk6c3dpdGNoKG4pe2Nhc2UiISI6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZU5vdDticmVhaztjYXNlIi0iOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVOZWdhdGl2ZTticmVhaztjYXNlIisiOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVQb3NpdGl2ZTticmVhaztjYXNlImlzTmFOIjp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlTmFOO2JyZWFrO2Nhc2UiaXNGaW5pdGUiOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVJc0Zpbml0ZTticmVhaztjYXNlIkJvb2xlYW4iOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVCb29sZWFuQ29udmVyc2lvbjticmVhaztjYXNlIk51bWJlciI6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZU51bWJlckNvbnZlcnNpb247YnJlYWs7Y2FzZSJTdHJpbmciOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVTdHJpbmdDb252ZXJzaW9uO2JyZWFrO2RlZmF1bHQ6dHlwZW9mIFluW25dPCJ1IiYmKHRoaXMuZXZhbHVhdGU9c2YobikpO2JyZWFrfWJyZWFrO2Nhc2UgTS5CSU5BUlk6c3dpdGNoKG4pe2Nhc2UiKyI6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZVBsdXM7YnJlYWs7Y2FzZSItIjp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlTWludXM7YnJlYWs7Y2FzZSIqIjp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlVGltZXM7YnJlYWs7Y2FzZSIvIjp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlRGl2aWRlO2JyZWFrO2Nhc2UiJSI6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZU1vZDticmVhaztjYXNlIj09PSI6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZUVxdWFsc1N0cmljdDticmVhaztjYXNlIiE9PSI6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZU5vdEVxdWFsc1N0cmljdDticmVhaztjYXNlIjwiOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVMZXNzVGhhbjticmVhaztjYXNlIjw9Ijp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlTGVzc1RoYW5PckVxdWFsczticmVhaztjYXNlIj4iOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVHcmVhdGVyVGhhbjticmVhaztjYXNlIj49Ijp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlR3JlYXRlclRoYW5PckVxdWFsczticmVhaztjYXNlIiYmIjp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlQW5kO2JyZWFrO2Nhc2UifHwiOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVPcjticmVhaztjYXNlIj09Ijp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlRXF1YWxzO2JyZWFrO2Nhc2UiIT0iOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVOb3RFcXVhbHM7YnJlYWs7ZGVmYXVsdDp0eXBlb2Yga25bbl08InUiJiYodGhpcy5ldmFsdWF0ZT1yZihuKSk7YnJlYWt9YnJlYWs7Y2FzZSBNLk1FTUJFUjpuPT09ImJyYWNrZXRzIj90aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlTWVtYmVyQnJhY2tldHM6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZU1lbWJlckRvdDticmVhaztjYXNlIE0uQVJSQVk6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZUFycmF5O2JyZWFrO2Nhc2UgTS5WQVJJQUJMRTp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlVmFyaWFibGU7YnJlYWs7Y2FzZSBNLlZBUklBQkxFX0lOX1NUUklORzp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlVmFyaWFibGVTdHJpbmc7YnJlYWs7Y2FzZSBNLkxJVEVSQUxfQ09MT1I6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZUxpdGVyYWxDb2xvcjticmVhaztjYXNlIE0uTElURVJBTF9TVFJJTkc6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZUxpdGVyYWxTdHJpbmc7YnJlYWs7ZGVmYXVsdDp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlTGl0ZXJhbDticmVha319X2V2YWx1YXRlTGl0ZXJhbCgpe3JldHVybiB0aGlzLl92YWx1ZX1fZXZhbHVhdGVMaXRlcmFsU3RyaW5nKCl7cmV0dXJuIHRoaXMuX3ZhbHVlfV9ldmFsdWF0ZVZhcmlhYmxlU3RyaW5nKGUpe2NvbnN0IG49L1wkeyguKj8pfS9nO2xldCByPXRoaXMuX3ZhbHVlLGk9bi5leGVjKHIpO2Zvcig7aSE9PW51bGw7KXtjb25zdCBvPWlbMF0scz1pWzFdO2xldCB1PWU9PW51bGw/dm9pZCAwOmUucHJvcGVydGllc1tzXTt0eXBlb2YgdT4idSImJih1PSIiKSxyPXIucmVwbGFjZShvLHUpLGk9bi5leGVjKHIpfXJldHVybiByfV9ldmFsdWF0ZVZhcmlhYmxlKGUpe2xldCBuO3JldHVybiBlJiZTdHJpbmcodGhpcy5fdmFsdWUpaW4gZS5wcm9wZXJ0aWVzP249ZS5wcm9wZXJ0aWVzW1N0cmluZyh0aGlzLl92YWx1ZSldOlN0cmluZyh0aGlzLl92YWx1ZSk9PT0iaWQiP249ZT09bnVsbD92b2lkIDA6ZS5pZDplJiZTdHJpbmcodGhpcy5fdmFsdWUpPT09InJvb3RQcm9wZXJ0aWVzIiYmKG49ZS5wcm9wZXJ0aWVzKSx0eXBlb2Ygbj4idSImJihuPSIiKSxufV9ldmFsdWF0ZU1lbWJlckRvdChlKXtpZihtaSh0aGlzLl9sZWZ0KSlyZXR1cm4gZT09bnVsbD92b2lkIDA6ZS5wcm9wZXJ0aWVzW3RoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpXTtjb25zdCBuPXRoaXMuX2xlZnQuZXZhbHVhdGUoZSk7aWYodHlwZW9mIG4+InUiKXJldHVybjtjb25zdCByPXRoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpO3JldHVybiBuW3JdfV9ldmFsdWF0ZU1lbWJlckJyYWNrZXRzKGUpe2lmKG1pKHRoaXMuX2xlZnQpKXJldHVybiBlPT1udWxsP3ZvaWQgMDplLnByb3BlcnRpZXNbdGhpcy5fcmlnaHQuZXZhbHVhdGUoZSldO2NvbnN0IG49dGhpcy5fbGVmdC5ldmFsdWF0ZShlKTtpZih0eXBlb2Ygbj4idSIpcmV0dXJuO2NvbnN0IHI9dGhpcy5fcmlnaHQuZXZhbHVhdGUoZSk7cmV0dXJuIG5bcl19X2V2YWx1YXRlQXJyYXkoZSl7Y29uc3Qgbj1bXTtmb3IobGV0IHI9MDtyPHRoaXMuX3ZhbHVlLmxlbmd0aDtyKyspbltyXT10aGlzLl92YWx1ZVtyXS5ldmFsdWF0ZShlKTtyZXR1cm4gbn1fZXZhbHVhdGVOb3QoZSl7Y29uc3Qgbj10aGlzLl9sZWZ0LmV2YWx1YXRlKGUpO2lmKHR5cGVvZiBuIT0iYm9vbGVhbiIpdGhyb3cgbmV3IEVycm9yKGBPcGVyYXRvciAiISIgcmVxdWlyZXMgYSBib29sZWFuIGFyZ3VtZW50LiBBcmd1bWVudCBpcyAke259LmApO3JldHVybiFufV9ldmFsdWF0ZU5lZ2F0aXZlKGUpe2NvbnN0IG49dGhpcy5fbGVmdC5ldmFsdWF0ZShlKTtpZih0eXBlb2Ygbj09Im51bWJlciIpcmV0dXJuLW47dGhyb3cgbmV3IEVycm9yKGBPcGVyYXRvciAiLSIgcmVxdWlyZXMgYSB2ZWN0b3Igb3IgbnVtYmVyIGFyZ3VtZW50LiBBcmd1bWVudCBpcyAke259LmApfV9ldmFsdWF0ZVBvc2l0aXZlKGUpe2NvbnN0IG49dGhpcy5fbGVmdC5ldmFsdWF0ZShlKTtpZih0eXBlb2YgbiE9Im51bWJlciIpdGhyb3cgbmV3IEVycm9yKGBPcGVyYXRvciAiKyIgcmVxdWlyZXMgYSB2ZWN0b3Igb3IgbnVtYmVyIGFyZ3VtZW50LiBBcmd1bWVudCBpcyAke259LmApO3JldHVybiBufV9ldmFsdWF0ZUxlc3NUaGFuKGUpe2NvbnN0IG49dGhpcy5fbGVmdC5ldmFsdWF0ZShlKSxyPXRoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpO3JldHVybiB0eXBlb2YgbiE9Im51bWJlciJ8fHR5cGVvZiByIT0ibnVtYmVyIj8oY29uc29sZS53YXJuKGBPcGVyYXRvciAiPCIgcmVxdWlyZXMgbnVtYmVyIGFyZ3VtZW50cy4gQXJndW1lbnRzIGFyZSAke259IGFuZCAke3J9LmApLCExKTpuPHJ9X2V2YWx1YXRlTGVzc1RoYW5PckVxdWFscyhlKXtjb25zdCBuPXRoaXMuX2xlZnQuZXZhbHVhdGUoZSkscj10aGlzLl9yaWdodC5ldmFsdWF0ZShlKTtyZXR1cm4gdHlwZW9mIG4hPSJudW1iZXIifHx0eXBlb2YgciE9Im51bWJlciI/KGNvbnNvbGUud2FybihgT3BlcmF0b3IgIjw9IiByZXF1aXJlcyBudW1iZXIgYXJndW1lbnRzLiBBcmd1bWVudHMgYXJlICR7bn0gYW5kICR7cn0uYCksITEpOm48PXJ9X2V2YWx1YXRlR3JlYXRlclRoYW4oZSl7Y29uc3Qgbj10aGlzLl9sZWZ0LmV2YWx1YXRlKGUpLHI9dGhpcy5fcmlnaHQuZXZhbHVhdGUoZSk7cmV0dXJuIHR5cGVvZiBuIT0ibnVtYmVyInx8dHlwZW9mIHIhPSJudW1iZXIiPyhjb25zb2xlLndhcm4oYE9wZXJhdG9yICI+IiByZXF1aXJlcyBudW1iZXIgYXJndW1lbnRzLiBBcmd1bWVudHMgYXJlICR7bn0gYW5kICR7cn0uYCksITEpOm4+cn1fZXZhbHVhdGVHcmVhdGVyVGhhbk9yRXF1YWxzKGUpe2NvbnN0IG49dGhpcy5fbGVmdC5ldmFsdWF0ZShlKSxyPXRoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpO3JldHVybiB0eXBlb2YgbiE9Im51bWJlciJ8fHR5cGVvZiByIT0ibnVtYmVyIj8oY29uc29sZS53YXJuKGBPcGVyYXRvciAiPj0iIHJlcXVpcmVzIG51bWJlciBhcmd1bWVudHMuIEFyZ3VtZW50cyBhcmUgJHtufSBhbmQgJHtyfS5gKSwhMSk6bj49cn1fZXZhbHVhdGVPcihlKXtjb25zdCBuPXRoaXMuX2xlZnQuZXZhbHVhdGUoZSk7aWYodHlwZW9mIG4hPSJib29sZWFuIilyZXR1cm4gY29uc29sZS53YXJuKGBPcGVyYXRvciAifHwiIHJlcXVpcmVzIGJvb2xlYW4gYXJndW1lbnRzLiBGaXJzdCBhcmd1bWVudCBpcyAke259LmApLCExO2lmKG4pcmV0dXJuITA7Y29uc3Qgcj10aGlzLl9yaWdodC5ldmFsdWF0ZShlKTtyZXR1cm4gdHlwZW9mIHIhPSJib29sZWFuIj8oY29uc29sZS53YXJuKGBPcGVyYXRvciAifHwiIHJlcXVpcmVzIGJvb2xlYW4gYXJndW1lbnRzLiBTZWNvbmQgYXJndW1lbnQgaXMgJHtyfS5gKSwhMSk6bnx8cn1fZXZhbHVhdGVBbmQoZSl7Y29uc3Qgbj10aGlzLl9sZWZ0LmV2YWx1YXRlKGUpO2lmKHR5cGVvZiBuIT0iYm9vbGVhbiIpcmV0dXJuIGNvbnNvbGUud2FybihgT3BlcmF0b3IgIiYmIiByZXF1aXJlcyBib29sZWFuIGFyZ3VtZW50cy4gRmlyc3QgYXJndW1lbnQgaXMgJHtufS5gKSwhMTtpZighbilyZXR1cm4hMTtjb25zdCByPXRoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpO3JldHVybiB0eXBlb2YgciE9ImJvb2xlYW4iPyhjb25zb2xlLndhcm4oYE9wZXJhdG9yICImJiIgcmVxdWlyZXMgYm9vbGVhbiBhcmd1bWVudHMuIFNlY29uZCBhcmd1bWVudCBpcyAke3J9LmApLCExKTpuJiZyfV9ldmFsdWF0ZVBsdXMoZSl7Y29uc3Qgbj10aGlzLl9sZWZ0LmV2YWx1YXRlKGUpLHI9dGhpcy5fcmlnaHQuZXZhbHVhdGUoZSk7aWYodHlwZW9mIG49PSJudW1iZXIiJiZ0eXBlb2Ygcj09Im51bWJlciIpcmV0dXJuIG4rcjt0aHJvdyBuZXcgRXJyb3IoYE9wZXJhdG9yICIrIiByZXF1aXJlcyB2ZWN0b3Igb3IgbnVtYmVyIGFyZ3VtZW50cyBvZiBtYXRjaGluZyB0eXBlcywgb3IgYXQgbGVhc3Qgb25lIHN0cmluZyBhcmd1bWVudC4gQXJndW1lbnRzIGFyZSAke259IGFuZCAke3J9LmApfV9ldmFsdWF0ZU1pbnVzKGUpe2NvbnN0IG49dGhpcy5fbGVmdC5ldmFsdWF0ZShlKSxyPXRoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpO2lmKHR5cGVvZiBuPT0ibnVtYmVyIiYmdHlwZW9mIHI9PSJudW1iZXIiKXJldHVybiBuLXI7dGhyb3cgbmV3IEVycm9yKGBPcGVyYXRvciAiLSIgcmVxdWlyZXMgdmVjdG9yIG9yIG51bWJlciBhcmd1bWVudHMgb2YgbWF0Y2hpbmcgdHlwZXMuIEFyZ3VtZW50cyBhcmUgJHtufSBhbmQgJHtyfS5gKX1fZXZhbHVhdGVUaW1lcyhlKXtjb25zdCBuPXRoaXMuX2xlZnQuZXZhbHVhdGUoZSkscj10aGlzLl9yaWdodC5ldmFsdWF0ZShlKTtpZih0eXBlb2Ygbj09Im51bWJlciImJnR5cGVvZiByPT0ibnVtYmVyIilyZXR1cm4gbipyO3Rocm93IG5ldyBFcnJvcihgT3BlcmF0b3IgIioiIHJlcXVpcmVzIHZlY3RvciBvciBudW1iZXIgYXJndW1lbnRzLiBJZiBib3RoIGFyZ3VtZW50cyBhcmUgdmVjdG9ycyB0aGV5IG11c3QgYmUgbWF0Y2hpbmcgdHlwZXMuIEFyZ3VtZW50cyBhcmUgJHtufSBhbmQgJHtyfS5gKX1fZXZhbHVhdGVEaXZpZGUoZSl7Y29uc3Qgbj10aGlzLl9sZWZ0LmV2YWx1YXRlKGUpLHI9dGhpcy5fcmlnaHQuZXZhbHVhdGUoZSk7aWYodHlwZW9mIG49PSJudW1iZXIiJiZ0eXBlb2Ygcj09Im51bWJlciIpcmV0dXJuIG4vcjt0aHJvdyBuZXcgRXJyb3IoYE9wZXJhdG9yICIvIiByZXF1aXJlcyB2ZWN0b3Igb3IgbnVtYmVyIGFyZ3VtZW50cyBvZiBtYXRjaGluZyB0eXBlcywgb3IgYSBudW1iZXIgYXMgdGhlIHNlY29uZCBhcmd1bWVudC4gQXJndW1lbnRzIGFyZSAke259IGFuZCAke3J9LmApfV9ldmFsdWF0ZU1vZChlKXtjb25zdCBuPXRoaXMuX2xlZnQuZXZhbHVhdGUoZSkscj10aGlzLl9yaWdodC5ldmFsdWF0ZShlKTtpZih0eXBlb2Ygbj09Im51bWJlciImJnR5cGVvZiByPT0ibnVtYmVyIilyZXR1cm4gbiVyO3Rocm93IG5ldyBFcnJvcihgT3BlcmF0b3IgIiUiIHJlcXVpcmVzIHZlY3RvciBvciBudW1iZXIgYXJndW1lbnRzIG9mIG1hdGNoaW5nIHR5cGVzLiBBcmd1bWVudHMgYXJlICR7bn0gYW5kICR7cn0uYCl9X2V2YWx1YXRlRXF1YWxzU3RyaWN0KGUpe2NvbnN0IG49dGhpcy5fbGVmdC5ldmFsdWF0ZShlKSxyPXRoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpO3JldHVybiBuPT09cn1fZXZhbHVhdGVOb3RFcXVhbHNTdHJpY3QoZSl7Y29uc3Qgbj10aGlzLl9sZWZ0LmV2YWx1YXRlKGUpLHI9dGhpcy5fcmlnaHQuZXZhbHVhdGUoZSk7cmV0dXJuIG4hPT1yfV9ldmFsdWF0ZUNvbmRpdGlvbmFsKGUpe2NvbnN0IG49dGhpcy5fdGVzdC5ldmFsdWF0ZShlKTtpZih0eXBlb2YgbiE9ImJvb2xlYW4iKXRocm93IG5ldyBFcnJvcihgQ29uZGl0aW9uYWwgYXJndW1lbnQgb2YgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBtdXN0IGJlIGEgYm9vbGVhbi4gQXJndW1lbnQgaXMgJHtufS5gKTtyZXR1cm4gbj90aGlzLl9sZWZ0LmV2YWx1YXRlKGUpOnRoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpfV9ldmFsdWF0ZU5hTihlKXtyZXR1cm4gaXNOYU4odGhpcy5fbGVmdC5ldmFsdWF0ZShlKSl9X2V2YWx1YXRlSXNGaW5pdGUoZSl7cmV0dXJuIGlzRmluaXRlKHRoaXMuX2xlZnQuZXZhbHVhdGUoZSkpfV9ldmFsdWF0ZUJvb2xlYW5Db252ZXJzaW9uKGUpe3JldHVybiBCb29sZWFuKHRoaXMuX2xlZnQuZXZhbHVhdGUoZSkpfV9ldmFsdWF0ZU51bWJlckNvbnZlcnNpb24oZSl7Y29uc3Qgbj1kZih0aGlzLl9sZWZ0LmV2YWx1YXRlKGUpKTtyZXR1cm4gTnVtYmVyKG4pfV9ldmFsdWF0ZVN0cmluZ0NvbnZlcnNpb24oZSl7cmV0dXJuIFN0cmluZyh0aGlzLl9sZWZ0LmV2YWx1YXRlKGUpKX1fZXZhbHVhdGVUb1N0cmluZyhlKXtjb25zdCBuPXRoaXMuX2xlZnQuZXZhbHVhdGUoZSk7aWYobiBpbnN0YW5jZW9mIFJlZ0V4cClyZXR1cm4gU3RyaW5nKG4pO3Rocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBmdW5jdGlvbiBjYWxsICIke3RoaXMuX3ZhbHVlfSIuYCl9X2V2YWx1YXRlTGl0ZXJhbENvbG9yKGUpe2NvbnN0IG49dGhpcy5fbGVmdDtsZXQgcj1uZXcgSjtpZih0aGlzLl92YWx1ZT09PSJjb2xvciIpaWYodHlwZW9mIG4+InUiKXI9Si5mcm9tQnl0ZXMoMjU1LDI1NSwyNTUsMjU1KTtlbHNlIGlmKG4ubGVuZ3RoPjEpe2NvbnN0IGk9Si5mcm9tQ3NzQ29sb3JTdHJpbmcoblswXS5ldmFsdWF0ZShlKSk7aWYoaSlyPWk7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoYHdyb25nIGxpdGVyYWxDb2xvciBjYWxsICIke3RoaXMuX3ZhbHVlfSwgJHtufX0iYCk7ci5hbHBoYT1uWzFdLmV2YWx1YXRlKGUpfWVsc2V7Y29uc3QgaT1KLmZyb21Dc3NDb2xvclN0cmluZyhuWzBdLmV2YWx1YXRlKGUpKTtpZihpKXI9aTtlbHNlIHRocm93IG5ldyBFcnJvcihgd3JvbmcgbGl0ZXJhbENvbG9yIGNhbGwgIiR7dGhpcy5fdmFsdWV9LCAke259fSJgKX1lbHNlIGlmKHRoaXMuX3ZhbHVlPT09InJnYiIpcj1KLmZyb21CeXRlcyhuWzBdLmV2YWx1YXRlKGUpLG5bMV0uZXZhbHVhdGUoZSksblsyXS5ldmFsdWF0ZShlKSwyNTUpO2Vsc2UgaWYodGhpcy5fdmFsdWU9PT0icmdiYSIpe2NvbnN0IGk9blszXS5ldmFsdWF0ZShlKSoyNTU7cj1KLmZyb21CeXRlcyhuWzBdLmV2YWx1YXRlKGUpLG5bMV0uZXZhbHVhdGUoZSksblsyXS5ldmFsdWF0ZShlKSxpKX1lbHNlIGlmKHRoaXMuX3ZhbHVlPT09ImhzbCIpe2NvbnN0IGk9Si5mcm9tSHNsKG5bMF0uZXZhbHVhdGUoZSksblsxXS5ldmFsdWF0ZShlKSxuWzJdLmV2YWx1YXRlKGUpLDEpO2kmJihyPWkpfWVsc2UgaWYodGhpcy5fdmFsdWU9PT0iaHNsYSIpe2NvbnN0IGk9Si5mcm9tSHNsKG5bMF0uZXZhbHVhdGUoZSksblsxXS5ldmFsdWF0ZShlKSxuWzJdLmV2YWx1YXRlKGUpLG5bM10uZXZhbHVhdGUoZSkpO2kmJihyPWkpfXJldHVybiByLnRvQ3NzSGV4U3RyaW5nKCl9X2V2YWx1YXRlRXF1YWxzKGUpe2NvbnN0IG49dGhpcy5fbGVmdC5ldmFsdWF0ZShlKSxyPXRoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpO3JldHVybiBGdChuKSYmIUZ0KHIpP24uaW5jbHVkZXMocik6RnQocikmJiFGdChuKT9yLmluY2x1ZGVzKG4pOihGdChyKSYmRnQobikmJmNvbnNvbGUuZXJyb3IoIkVxdWFscyBsZWZ0IGFuZCByaWdodCBib3RoIGNhbid0IGJlIGFycmF5IGF0IHRoZSBzYW1lIHRpbWUiKSxuPT1yKX1fZXZhbHVhdGVOb3RFcXVhbHMoZSl7Y29uc3Qgbj10aGlzLl9sZWZ0LmV2YWx1YXRlKGUpLHI9dGhpcy5fcmlnaHQuZXZhbHVhdGUoZSk7cmV0dXJuIEZ0KG4pJiYhRnQocik/IW4uaW5jbHVkZXMocik6RnQocikmJiFGdChuKT8hci5pbmNsdWRlcyhuKTooRnQocikmJkZ0KG4pJiZjb25zb2xlLmVycm9yKCJOb3RFcXVhbHMgbGVmdCBhbmQgcmlnaHQgYm90aCBjYW4ndCBiZSBhcnJheSBhdCB0aGUgc2FtZSB0aW1lIiksbiE9cil9fWZ1bmN0aW9uIGRmKHQpe2lmKHR5cGVvZiB0IT0ic3RyaW5nIilyZXR1cm4gdDtjb25zdCBlPVsiJSJdO2Zvcihjb25zdCBuIG9mIGUpaWYodC5lbmRzV2l0aChuKSlyZXR1cm4gdC5zbGljZSgwLC1uLmxlbmd0aCkudHJpbSgpO3JldHVybiB0LnRyaW0oKX1mdW5jdGlvbiBtaSh0KXtyZXR1cm4gdC5fdmFsdWU9PT0iZmVhdHVyZSJ9ZnVuY3Rpb24gRnQodCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCl9ZnVuY3Rpb24gRWYodCxlLG4pe3JldHVybiBlPVVlKGUpLFJmKHQsWm4oKT9SZWZsZWN0LmNvbnN0cnVjdChlLG58fFtdLFVlKHQpLmNvbnN0cnVjdG9yKTplLmFwcGx5KHQsbikpfWZ1bmN0aW9uIEZpKHQsZSxuKXtpZihabigpKXJldHVybiBSZWZsZWN0LmNvbnN0cnVjdC5hcHBseShudWxsLGFyZ3VtZW50cyk7dmFyIHI9W251bGxdO3IucHVzaC5hcHBseShyLGUpO3ZhciBpPW5ldyh0LmJpbmQuYXBwbHkodCxyKSk7cmV0dXJuIG4mJmplKGksbi5wcm90b3R5cGUpLGl9ZnVuY3Rpb24gWm4oKXt0cnl7dmFyIHQ9IUJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLFtdLGZ1bmN0aW9uKCl7fSkpfWNhdGNoe31yZXR1cm4oWm49ZnVuY3Rpb24oKXtyZXR1cm4hIXR9KSgpfWZ1bmN0aW9uIF9mKHQsZSl7aWYodHlwZW9mIHQhPSJvYmplY3QifHwhdClyZXR1cm4gdDt2YXIgbj10W1N5bWJvbC50b1ByaW1pdGl2ZV07aWYobiE9PXZvaWQgMCl7dmFyIHI9bi5jYWxsKHQsZXx8ImRlZmF1bHQiKTtpZih0eXBlb2YgciE9Im9iamVjdCIpcmV0dXJuIHI7dGhyb3cgbmV3IFR5cGVFcnJvcigiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS4iKX1yZXR1cm4oZT09PSJzdHJpbmciP1N0cmluZzpOdW1iZXIpKHQpfWZ1bmN0aW9uIHBmKHQpe3ZhciBlPV9mKHQsInN0cmluZyIpO3JldHVybiB0eXBlb2YgZT09InN5bWJvbCI/ZTpTdHJpbmcoZSl9ZnVuY3Rpb24gR3QodCl7cmV0dXJuIEd0PXR5cGVvZiBTeW1ib2w9PSJmdW5jdGlvbiImJnR5cGVvZiBTeW1ib2wuaXRlcmF0b3I9PSJzeW1ib2wiP2Z1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZX06ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJnR5cGVvZiBTeW1ib2w9PSJmdW5jdGlvbiImJmUuY29uc3RydWN0b3I9PT1TeW1ib2wmJmUhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiBlfSxHdCh0KX1mdW5jdGlvbiB3aSh0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIElpKHQsZSl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciByPWVbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxwZihyLmtleSkscil9fWZ1bmN0aW9uIE5pKHQsZSxuKXtyZXR1cm4gZSYmSWkodC5wcm90b3R5cGUsZSksbiYmSWkodCxuKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCwicHJvdG90eXBlIix7d3JpdGFibGU6ITF9KSx0fWZ1bmN0aW9uIHlmKHQsZSl7aWYodHlwZW9mIGUhPSJmdW5jdGlvbiImJmUhPT1udWxsKXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uIik7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlJiZlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJwcm90b3R5cGUiLHt3cml0YWJsZTohMX0pLGUmJmplKHQsZSl9ZnVuY3Rpb24gVWUodCl7cmV0dXJuIFVlPU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3QuZ2V0UHJvdG90eXBlT2YuYmluZCgpOmZ1bmN0aW9uKG4pe3JldHVybiBuLl9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKG4pfSxVZSh0KX1mdW5jdGlvbiBqZSh0LGUpe3JldHVybiBqZT1PYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mLmJpbmQoKTpmdW5jdGlvbihyLGkpe3JldHVybiByLl9fcHJvdG9fXz1pLHJ9LGplKHQsZSl9ZnVuY3Rpb24gQWYodCl7dHJ5e3JldHVybiBGdW5jdGlvbi50b1N0cmluZy5jYWxsKHQpLmluZGV4T2YoIltuYXRpdmUgY29kZV0iKSE9PS0xfWNhdGNoe3JldHVybiB0eXBlb2YgdD09ImZ1bmN0aW9uIn19ZnVuY3Rpb24gUW4odCl7dmFyIGU9dHlwZW9mIE1hcD09ImZ1bmN0aW9uIj9uZXcgTWFwOnZvaWQgMDtyZXR1cm4gUW49ZnVuY3Rpb24ocil7aWYocj09PW51bGx8fCFBZihyKSlyZXR1cm4gcjtpZih0eXBlb2YgciE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpO2lmKHR5cGVvZiBlPCJ1Iil7aWYoZS5oYXMocikpcmV0dXJuIGUuZ2V0KHIpO2Uuc2V0KHIsaSl9ZnVuY3Rpb24gaSgpe3JldHVybiBGaShyLGFyZ3VtZW50cyxVZSh0aGlzKS5jb25zdHJ1Y3Rvcil9cmV0dXJuIGkucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoci5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTppLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLGplKGkscil9LFFuKHQpfWZ1bmN0aW9uIFRmKHQpe2lmKHQ9PT12b2lkIDApdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4gdH1mdW5jdGlvbiBSZih0LGUpe2lmKGUmJih0eXBlb2YgZT09Im9iamVjdCJ8fHR5cGVvZiBlPT0iZnVuY3Rpb24iKSlyZXR1cm4gZTtpZihlIT09dm9pZCAwKXRocm93IG5ldyBUeXBlRXJyb3IoIkRlcml2ZWQgY29uc3RydWN0b3JzIG1heSBvbmx5IHJldHVybiBvYmplY3Qgb3IgdW5kZWZpbmVkIik7cmV0dXJuIFRmKHQpfWZ1bmN0aW9uIHhmKHQpe3JldHVybiBPZih0KXx8YmYodCl8fE1pKHQpfHxnZigpfWZ1bmN0aW9uIE9mKHQpe2lmKEFycmF5LmlzQXJyYXkodCkpcmV0dXJuIEpuKHQpfWZ1bmN0aW9uIGJmKHQpe2lmKHR5cGVvZiBTeW1ib2w8InUiJiZ0W1N5bWJvbC5pdGVyYXRvcl0hPW51bGx8fHRbIkBAaXRlcmF0b3IiXSE9bnVsbClyZXR1cm4gQXJyYXkuZnJvbSh0KX1mdW5jdGlvbiBNaSh0LGUpe2lmKHQpe2lmKHR5cGVvZiB0PT0ic3RyaW5nIilyZXR1cm4gSm4odCxlKTt2YXIgbj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkuc2xpY2UoOCwtMSk7aWYobj09PSJPYmplY3QiJiZ0LmNvbnN0cnVjdG9yJiYobj10LmNvbnN0cnVjdG9yLm5hbWUpLG49PT0iTWFwInx8bj09PSJTZXQiKXJldHVybiBBcnJheS5mcm9tKHQpO2lmKG49PT0iQXJndW1lbnRzInx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpcmV0dXJuIEpuKHQsZSl9fWZ1bmN0aW9uIEpuKHQsZSl7KGU9PW51bGx8fGU+dC5sZW5ndGgpJiYoZT10Lmxlbmd0aCk7Zm9yKHZhciBuPTAscj1uZXcgQXJyYXkoZSk7bjxlO24rKylyW25dPXRbbl07cmV0dXJuIHJ9ZnVuY3Rpb24gZ2YoKXt0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS4KSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLmApfWZ1bmN0aW9uIFNmKHQsZSl7dmFyIG49dHlwZW9mIFN5bWJvbDwidSImJnRbU3ltYm9sLml0ZXJhdG9yXXx8dFsiQEBpdGVyYXRvciJdO2lmKCFuKXtpZihBcnJheS5pc0FycmF5KHQpfHwobj1NaSh0KSl8fGUmJnQmJnR5cGVvZiB0Lmxlbmd0aD09Im51bWJlciIpe24mJih0PW4pO3ZhciByPTAsaT1mdW5jdGlvbigpe307cmV0dXJue3M6aSxuOmZ1bmN0aW9uKCl7cmV0dXJuIHI+PXQubGVuZ3RoP3tkb25lOiEwfTp7ZG9uZTohMSx2YWx1ZTp0W3IrK119fSxlOmZ1bmN0aW9uKGEpe3Rocm93IGF9LGY6aX19dGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLgpJbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuYCl9dmFyIG89ITAscz0hMSx1O3JldHVybntzOmZ1bmN0aW9uKCl7bj1uLmNhbGwodCl9LG46ZnVuY3Rpb24oKXt2YXIgYT1uLm5leHQoKTtyZXR1cm4gbz1hLmRvbmUsYX0sZTpmdW5jdGlvbihhKXtzPSEwLHU9YX0sZjpmdW5jdGlvbigpe3RyeXshbyYmbi5yZXR1cm4hPW51bGwmJm4ucmV0dXJuKCl9ZmluYWxseXtpZihzKXRocm93IHV9fX19dmFyIFR0PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gWnQodCxlKXtyZXR1cm4gdD10LnNsaWNlKCksdC5wdXNoKGUpLHR9ZnVuY3Rpb24gdHIodCxlKXtyZXR1cm4gZT1lLnNsaWNlKCksZS51bnNoaWZ0KHQpLGV9dmFyIG1mPWZ1bmN0aW9uKHQpe3lmKGUsdCk7ZnVuY3Rpb24gZShuKXt2YXIgcjtyZXR1cm4gd2kodGhpcyxlKSxyPUVmKHRoaXMsZSxbJ0pTT05QYXRoIHNob3VsZCBub3QgYmUgY2FsbGVkIHdpdGggIm5ldyIgKGl0IHByZXZlbnRzIHJldHVybiBvZiAodW53cmFwcGVkKSBzY2FsYXIgdmFsdWVzKSddKSxyLmF2b2lkTmV3PSEwLHIudmFsdWU9bixyLm5hbWU9Ik5ld0Vycm9yIixyfXJldHVybiBOaShlKX0oUW4oRXJyb3IpKTtmdW5jdGlvbiBxKHQsZSxuLHIsaSl7aWYoISh0aGlzIGluc3RhbmNlb2YgcSkpdHJ5e3JldHVybiBuZXcgcSh0LGUsbixyLGkpfWNhdGNoKGEpe2lmKCFhLmF2b2lkTmV3KXRocm93IGE7cmV0dXJuIGEudmFsdWV9dHlwZW9mIHQ9PSJzdHJpbmciJiYoaT1yLHI9bixuPWUsZT10LHQ9bnVsbCk7dmFyIG89dCYmR3QodCk9PT0ib2JqZWN0IjtpZih0PXR8fHt9LHRoaXMuanNvbj10Lmpzb258fG4sdGhpcy5wYXRoPXQucGF0aHx8ZSx0aGlzLnJlc3VsdFR5cGU9dC5yZXN1bHRUeXBlfHwidmFsdWUiLHRoaXMuZmxhdHRlbj10LmZsYXR0ZW58fCExLHRoaXMud3JhcD1UdC5jYWxsKHQsIndyYXAiKT90LndyYXA6ITAsdGhpcy5zYW5kYm94PXQuc2FuZGJveHx8e30sdGhpcy5wcmV2ZW50RXZhbD10LnByZXZlbnRFdmFsfHwhMSx0aGlzLnBhcmVudD10LnBhcmVudHx8bnVsbCx0aGlzLnBhcmVudFByb3BlcnR5PXQucGFyZW50UHJvcGVydHl8fG51bGwsdGhpcy5jYWxsYmFjaz10LmNhbGxiYWNrfHxyfHxudWxsLHRoaXMub3RoZXJUeXBlQ2FsbGJhY2s9dC5vdGhlclR5cGVDYWxsYmFja3x8aXx8ZnVuY3Rpb24oKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJZb3UgbXVzdCBzdXBwbHkgYW4gb3RoZXJUeXBlQ2FsbGJhY2sgY2FsbGJhY2sgb3B0aW9uIHdpdGggdGhlIEBvdGhlcigpIG9wZXJhdG9yLiIpfSx0LmF1dG9zdGFydCE9PSExKXt2YXIgcz17cGF0aDpvP3QucGF0aDplfTtvPyJqc29uImluIHQmJihzLmpzb249dC5qc29uKTpzLmpzb249bjt2YXIgdT10aGlzLmV2YWx1YXRlKHMpO2lmKCF1fHxHdCh1KSE9PSJvYmplY3QiKXRocm93IG5ldyBtZih1KTtyZXR1cm4gdX19cS5wcm90b3R5cGUuZXZhbHVhdGU9ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9dGhpcyxvPXRoaXMucGFyZW50LHM9dGhpcy5wYXJlbnRQcm9wZXJ0eSx1PXRoaXMuZmxhdHRlbixhPXRoaXMud3JhcDtpZih0aGlzLmN1cnJSZXN1bHRUeXBlPXRoaXMucmVzdWx0VHlwZSx0aGlzLmN1cnJQcmV2ZW50RXZhbD10aGlzLnByZXZlbnRFdmFsLHRoaXMuY3VyclNhbmRib3g9dGhpcy5zYW5kYm94LG49bnx8dGhpcy5jYWxsYmFjayx0aGlzLmN1cnJPdGhlclR5cGVDYWxsYmFjaz1yfHx0aGlzLm90aGVyVHlwZUNhbGxiYWNrLGU9ZXx8dGhpcy5qc29uLHQ9dHx8dGhpcy5wYXRoLHQmJkd0KHQpPT09Im9iamVjdCImJiFBcnJheS5pc0FycmF5KHQpKXtpZighdC5wYXRoJiZ0LnBhdGghPT0iIil0aHJvdyBuZXcgVHlwZUVycm9yKCdZb3UgbXVzdCBzdXBwbHkgYSAicGF0aCIgcHJvcGVydHkgd2hlbiBwcm92aWRpbmcgYW4gb2JqZWN0IGFyZ3VtZW50IHRvIEpTT05QYXRoLmV2YWx1YXRlKCkuJyk7aWYoIVR0LmNhbGwodCwianNvbiIpKXRocm93IG5ldyBUeXBlRXJyb3IoJ1lvdSBtdXN0IHN1cHBseSBhICJqc29uIiBwcm9wZXJ0eSB3aGVuIHByb3ZpZGluZyBhbiBvYmplY3QgYXJndW1lbnQgdG8gSlNPTlBhdGguZXZhbHVhdGUoKS4nKTt2YXIgbD10O2U9bC5qc29uLHU9VHQuY2FsbCh0LCJmbGF0dGVuIik/dC5mbGF0dGVuOnUsdGhpcy5jdXJyUmVzdWx0VHlwZT1UdC5jYWxsKHQsInJlc3VsdFR5cGUiKT90LnJlc3VsdFR5cGU6dGhpcy5jdXJyUmVzdWx0VHlwZSx0aGlzLmN1cnJTYW5kYm94PVR0LmNhbGwodCwic2FuZGJveCIpP3Quc2FuZGJveDp0aGlzLmN1cnJTYW5kYm94LGE9VHQuY2FsbCh0LCJ3cmFwIik/dC53cmFwOmEsdGhpcy5jdXJyUHJldmVudEV2YWw9VHQuY2FsbCh0LCJwcmV2ZW50RXZhbCIpP3QucHJldmVudEV2YWw6dGhpcy5jdXJyUHJldmVudEV2YWwsbj1UdC5jYWxsKHQsImNhbGxiYWNrIik/dC5jYWxsYmFjazpuLHRoaXMuY3Vyck90aGVyVHlwZUNhbGxiYWNrPVR0LmNhbGwodCwib3RoZXJUeXBlQ2FsbGJhY2siKT90Lm90aGVyVHlwZUNhbGxiYWNrOnRoaXMuY3Vyck90aGVyVHlwZUNhbGxiYWNrLG89VHQuY2FsbCh0LCJwYXJlbnQiKT90LnBhcmVudDpvLHM9VHQuY2FsbCh0LCJwYXJlbnRQcm9wZXJ0eSIpP3QucGFyZW50UHJvcGVydHk6cyx0PXQucGF0aH1pZihvPW98fG51bGwscz1zfHxudWxsLEFycmF5LmlzQXJyYXkodCkmJih0PXEudG9QYXRoU3RyaW5nKHQpKSwhKCF0JiZ0IT09IiJ8fCFlKSl7dmFyIGQ9cS50b1BhdGhBcnJheSh0KTtkWzBdPT09IiQiJiZkLmxlbmd0aD4xJiZkLnNoaWZ0KCksdGhpcy5faGFzUGFyZW50U2VsZWN0b3I9bnVsbDt2YXIgXz10aGlzLl90cmFjZShkLGUsWyIkIl0sbyxzLG4pLmZpbHRlcihmdW5jdGlvbihPKXtyZXR1cm4gTyYmIU8uaXNQYXJlbnRTZWxlY3Rvcn0pO3JldHVybiBfLmxlbmd0aD8hYSYmXy5sZW5ndGg9PT0xJiYhX1swXS5oYXNBcnJFeHByP3RoaXMuX2dldFByZWZlcnJlZE91dHB1dChfWzBdKTpfLnJlZHVjZShmdW5jdGlvbihPLGIpe3ZhciBGPWkuX2dldFByZWZlcnJlZE91dHB1dChiKTtyZXR1cm4gdSYmQXJyYXkuaXNBcnJheShGKT9PPU8uY29uY2F0KEYpOk8ucHVzaChGKSxPfSxbXSk6YT9bXTp2b2lkIDB9fSxxLnByb3RvdHlwZS5fZ2V0UHJlZmVycmVkT3V0cHV0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuY3VyclJlc3VsdFR5cGU7c3dpdGNoKGUpe2Nhc2UiYWxsIjp7dmFyIG49QXJyYXkuaXNBcnJheSh0LnBhdGgpP3QucGF0aDpxLnRvUGF0aEFycmF5KHQucGF0aCk7cmV0dXJuIHQucG9pbnRlcj1xLnRvUG9pbnRlcihuKSx0LnBhdGg9dHlwZW9mIHQucGF0aD09InN0cmluZyI/dC5wYXRoOnEudG9QYXRoU3RyaW5nKHQucGF0aCksdH1jYXNlInZhbHVlIjpjYXNlInBhcmVudCI6Y2FzZSJwYXJlbnRQcm9wZXJ0eSI6cmV0dXJuIHRbZV07Y2FzZSJwYXRoIjpyZXR1cm4gcS50b1BhdGhTdHJpbmcodFtlXSk7Y2FzZSJwb2ludGVyIjpyZXR1cm4gcS50b1BvaW50ZXIodC5wYXRoKTtkZWZhdWx0OnRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gcmVzdWx0IHR5cGUiKX19LHEucHJvdG90eXBlLl9oYW5kbGVDYWxsYmFjaz1mdW5jdGlvbih0LGUsbil7aWYoZSl7dmFyIHI9dGhpcy5fZ2V0UHJlZmVycmVkT3V0cHV0KHQpO3QucGF0aD10eXBlb2YgdC5wYXRoPT0ic3RyaW5nIj90LnBhdGg6cS50b1BhdGhTdHJpbmcodC5wYXRoKSxlKHIsbix0KX19LHEucHJvdG90eXBlLl90cmFjZT1mdW5jdGlvbih0LGUsbixyLGksbyxzLHUpe3ZhciBhPXRoaXMsbDtpZighdC5sZW5ndGgpcmV0dXJuIGw9e3BhdGg6bix2YWx1ZTplLHBhcmVudDpyLHBhcmVudFByb3BlcnR5OmksaGFzQXJyRXhwcjpzfSx0aGlzLl9oYW5kbGVDYWxsYmFjayhsLG8sInZhbHVlIiksbDt2YXIgZD10WzBdLF89dC5zbGljZSgxKSxPPVtdO2Z1bmN0aW9uIGIoRCl7QXJyYXkuaXNBcnJheShEKT9ELmZvckVhY2goZnVuY3Rpb24oeXQpe08ucHVzaCh5dCl9KTpPLnB1c2goRCl9aWYoKHR5cGVvZiBkIT0ic3RyaW5nInx8dSkmJmUmJlR0LmNhbGwoZSxkKSliKHRoaXMuX3RyYWNlKF8sZVtkXSxadChuLGQpLGUsZCxvLHMpKTtlbHNlIGlmKGQ9PT0iKiIpdGhpcy5fd2FsayhlLGZ1bmN0aW9uKEQpe2IoYS5fdHJhY2UoXyxlW0RdLFp0KG4sRCksZSxELG8sITAsITApKX0pO2Vsc2UgaWYoZD09PSIuLiIpYih0aGlzLl90cmFjZShfLGUsbixyLGksbyxzKSksdGhpcy5fd2FsayhlLGZ1bmN0aW9uKEQpe0d0KGVbRF0pPT09Im9iamVjdCImJmIoYS5fdHJhY2UodC5zbGljZSgpLGVbRF0sWnQobixEKSxlLEQsbywhMCkpfSk7ZWxzZXtpZihkPT09Il4iKXJldHVybiB0aGlzLl9oYXNQYXJlbnRTZWxlY3Rvcj0hMCx7cGF0aDpuLnNsaWNlKDAsLTEpLGV4cHI6Xyxpc1BhcmVudFNlbGVjdG9yOiEwfTtpZihkPT09In4iKXJldHVybiBsPXtwYXRoOlp0KG4sZCksdmFsdWU6aSxwYXJlbnQ6cixwYXJlbnRQcm9wZXJ0eTpudWxsfSx0aGlzLl9oYW5kbGVDYWxsYmFjayhsLG8sInByb3BlcnR5IiksbDtpZihkPT09IiQiKWIodGhpcy5fdHJhY2UoXyxlLG4sbnVsbCxudWxsLG8scykpO2Vsc2UgaWYoL14oXHgyRD9bMC05XSopOihceDJEP1swLTldKik6PyhbMC05XSopJC8udGVzdChkKSliKHRoaXMuX3NsaWNlKGQsXyxlLG4scixpLG8pKTtlbHNlIGlmKGQuaW5kZXhPZigiPygiKT09PTApe2lmKHRoaXMuY3VyclByZXZlbnRFdmFsKXRocm93IG5ldyBFcnJvcigiRXZhbCBbPyhleHByKV0gcHJldmVudGVkIGluIEpTT05QYXRoIGV4cHJlc3Npb24uIik7dmFyIEY9ZC5yZXBsYWNlKC9eXD9cKCgoPzpbXDAtXHRceDBCXGZceDBFLVx1MjAyN1x1MjAyQS1cdUQ3RkZcdUUwMDAtXHVGRkZGXXxbXHVEODAwLVx1REJGRl1bXHVEQzAwLVx1REZGRl18W1x1RDgwMC1cdURCRkZdKD8hW1x1REMwMC1cdURGRkZdKXwoPzpbXlx1RDgwMC1cdURCRkZdfF4pW1x1REMwMC1cdURGRkZdKSo/KVwpJC8sIiQxIiksUz0vQCg/OltcMC1cdFx4MEJcZlx4MEUtXHUyMDI3XHUyMDJBLVx1RDdGRlx1RTAwMC1cdUZGRkZdfFtcdUQ4MDAtXHVEQkZGXVtcdURDMDAtXHVERkZGXXxbXHVEODAwLVx1REJGRl0oPyFbXHVEQzAwLVx1REZGRl0pfCg/OlteXHVEODAwLVx1REJGRl18XilbXHVEQzAwLVx1REZGRl0pPygoPzpbXDAtPkAtXHVEN0ZGXHVFMDAwLVx1RkZGRl18W1x1RDgwMC1cdURCRkZdW1x1REMwMC1cdURGRkZdfFtcdUQ4MDAtXHVEQkZGXSg/IVtcdURDMDAtXHVERkZGXSl8KD86W15cdUQ4MDAtXHVEQkZGXXxeKVtcdURDMDAtXHVERkZGXSkqKVsnXFtdKFw/P1woKD86W1wwLVx0XHgwQlxmXHgwRS1cdTIwMjdcdTIwMkEtXHVEN0ZGXHVFMDAwLVx1RkZGRl18W1x1RDgwMC1cdURCRkZdW1x1REMwMC1cdURGRkZdfFtcdUQ4MDAtXHVEQkZGXSg/IVtcdURDMDAtXHVERkZGXSl8KD86W15cdUQ4MDAtXHVEQkZGXXxeKVtcdURDMDAtXHVERkZGXSkqP1wpKSg/ISg/OltcMC1cdFx4MEJcZlx4MEUtXHUyMDI3XHUyMDJBLVx1RDdGRlx1RTAwMC1cdUZGRkZdfFtcdUQ4MDAtXHVEQkZGXVtcdURDMDAtXHVERkZGXXxbXHVEODAwLVx1REJGRl0oPyFbXHVEQzAwLVx1REZGRl0pfCg/OlteXHVEODAwLVx1REJGRl18XilbXHVEQzAwLVx1REZGRl0pXClcXSlbJ1xdXS9nLmV4ZWMoRik7Uz90aGlzLl93YWxrKGUsZnVuY3Rpb24oRCl7dmFyIHl0PVtTWzJdXSxvdD1TWzFdP2VbRF1bU1sxXV06ZVtEXSxndD1hLl90cmFjZSh5dCxvdCxuLHIsaSxvLCEwKTtndC5sZW5ndGg+MCYmYihhLl90cmFjZShfLGVbRF0sWnQobixEKSxlLEQsbywhMCkpfSk6dGhpcy5fd2FsayhlLGZ1bmN0aW9uKEQpe2EuX2V2YWwoRixlW0RdLEQsbixyLGkpJiZiKGEuX3RyYWNlKF8sZVtEXSxadChuLEQpLGUsRCxvLCEwKSl9KX1lbHNlIGlmKGRbMF09PT0iKCIpe2lmKHRoaXMuY3VyclByZXZlbnRFdmFsKXRocm93IG5ldyBFcnJvcigiRXZhbCBbKGV4cHIpXSBwcmV2ZW50ZWQgaW4gSlNPTlBhdGggZXhwcmVzc2lvbi4iKTtiKHRoaXMuX3RyYWNlKHRyKHRoaXMuX2V2YWwoZCxlLG5bbi5sZW5ndGgtMV0sbi5zbGljZSgwLC0xKSxyLGkpLF8pLGUsbixyLGksbyxzKSl9ZWxzZSBpZihkWzBdPT09IkAiKXt2YXIgTj0hMSxnPWQuc2xpY2UoMSwtMik7c3dpdGNoKGcpe2Nhc2Uic2NhbGFyIjooIWV8fCFbIm9iamVjdCIsImZ1bmN0aW9uIl0uaW5jbHVkZXMoR3QoZSkpKSYmKE49ITApO2JyZWFrO2Nhc2UiYm9vbGVhbiI6Y2FzZSJzdHJpbmciOmNhc2UidW5kZWZpbmVkIjpjYXNlImZ1bmN0aW9uIjpHdChlKT09PWcmJihOPSEwKTticmVhaztjYXNlImludGVnZXIiOk51bWJlci5pc0Zpbml0ZShlKSYmIShlJTEpJiYoTj0hMCk7YnJlYWs7Y2FzZSJudW1iZXIiOk51bWJlci5pc0Zpbml0ZShlKSYmKE49ITApO2JyZWFrO2Nhc2Uibm9uRmluaXRlIjp0eXBlb2YgZT09Im51bWJlciImJiFOdW1iZXIuaXNGaW5pdGUoZSkmJihOPSEwKTticmVhaztjYXNlIm9iamVjdCI6ZSYmR3QoZSk9PT1nJiYoTj0hMCk7YnJlYWs7Y2FzZSJhcnJheSI6QXJyYXkuaXNBcnJheShlKSYmKE49ITApO2JyZWFrO2Nhc2Uib3RoZXIiOk49dGhpcy5jdXJyT3RoZXJUeXBlQ2FsbGJhY2soZSxuLHIsaSk7YnJlYWs7Y2FzZSJudWxsIjplPT09bnVsbCYmKE49ITApO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biB2YWx1ZSB0eXBlICIrZyl9aWYoTilyZXR1cm4gbD17cGF0aDpuLHZhbHVlOmUscGFyZW50OnIscGFyZW50UHJvcGVydHk6aX0sdGhpcy5faGFuZGxlQ2FsbGJhY2sobCxvLCJ2YWx1ZSIpLGx9ZWxzZSBpZihkWzBdPT09ImAiJiZlJiZUdC5jYWxsKGUsZC5zbGljZSgxKSkpe3ZhciBHPWQuc2xpY2UoMSk7Yih0aGlzLl90cmFjZShfLGVbR10sWnQobixHKSxlLEcsbyxzLCEwKSl9ZWxzZSBpZihkLmluY2x1ZGVzKCIsIikpe3ZhciBLPWQuc3BsaXQoIiwiKSxWPVNmKEspLGl0O3RyeXtmb3IoVi5zKCk7IShpdD1WLm4oKSkuZG9uZTspe3ZhciBsdD1pdC52YWx1ZTtiKHRoaXMuX3RyYWNlKHRyKGx0LF8pLGUsbixyLGksbywhMCkpfX1jYXRjaChEKXtWLmUoRCl9ZmluYWxseXtWLmYoKX19ZWxzZSF1JiZlJiZUdC5jYWxsKGUsZCkmJmIodGhpcy5fdHJhY2UoXyxlW2RdLFp0KG4sZCksZSxkLG8scywhMCkpfWlmKHRoaXMuX2hhc1BhcmVudFNlbGVjdG9yKWZvcih2YXIgcnQ9MDtydDxPLmxlbmd0aDtydCsrKXt2YXIgQnQ9T1tydF07aWYoQnQmJkJ0LmlzUGFyZW50U2VsZWN0b3Ipe3ZhciBUPXRoaXMuX3RyYWNlKEJ0LmV4cHIsZSxCdC5wYXRoLHIsaSxvLHMpO2lmKEFycmF5LmlzQXJyYXkoVCkpe09bcnRdPVRbMF07Zm9yKHZhciBCPVQubGVuZ3RoLCQ9MTskPEI7JCsrKXJ0KyssTy5zcGxpY2UocnQsMCxUWyRdKX1lbHNlIE9bcnRdPVR9fXJldHVybiBPfSxxLnByb3RvdHlwZS5fd2Fsaz1mdW5jdGlvbih0LGUpe2lmKEFycmF5LmlzQXJyYXkodCkpZm9yKHZhciBuPXQubGVuZ3RoLHI9MDtyPG47cisrKWUocik7ZWxzZSB0JiZHdCh0KT09PSJvYmplY3QiJiZPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGZ1bmN0aW9uKGkpe2UoaSl9KX0scS5wcm90b3R5cGUuX3NsaWNlPWZ1bmN0aW9uKHQsZSxuLHIsaSxvLHMpe2lmKEFycmF5LmlzQXJyYXkobikpe3ZhciB1PW4ubGVuZ3RoLGE9dC5zcGxpdCgiOiIpLGw9YVsyXSYmTnVtYmVyLnBhcnNlSW50KGFbMl0pfHwxLGQ9YVswXSYmTnVtYmVyLnBhcnNlSW50KGFbMF0pfHwwLF89YVsxXSYmTnVtYmVyLnBhcnNlSW50KGFbMV0pfHx1O2Q9ZDwwP01hdGgubWF4KDAsZCt1KTpNYXRoLm1pbih1LGQpLF89XzwwP01hdGgubWF4KDAsXyt1KTpNYXRoLm1pbih1LF8pO2Zvcih2YXIgTz1bXSxiPWQ7YjxfO2IrPWwpe3ZhciBGPXRoaXMuX3RyYWNlKHRyKGIsZSksbixyLGksbyxzLCEwKTtGLmZvckVhY2goZnVuY3Rpb24oUyl7Ty5wdXNoKFMpfSl9cmV0dXJuIE99fSxxLnByb3RvdHlwZS5fZXZhbD1mdW5jdGlvbih0LGUsbixyLGksbyl7dGhpcy5jdXJyU2FuZGJveC5fJF9wYXJlbnRQcm9wZXJ0eT1vLHRoaXMuY3VyclNhbmRib3guXyRfcGFyZW50PWksdGhpcy5jdXJyU2FuZGJveC5fJF9wcm9wZXJ0eT1uLHRoaXMuY3VyclNhbmRib3guXyRfcm9vdD10aGlzLmpzb24sdGhpcy5jdXJyU2FuZGJveC5fJF92PWU7dmFyIHM9dC5pbmNsdWRlcygiQHBhdGgiKTtzJiYodGhpcy5jdXJyU2FuZGJveC5fJF9wYXRoPXEudG9QYXRoU3RyaW5nKHIuY29uY2F0KFtuXSkpKTt2YXIgdT0ic2NyaXB0OiIrdDtpZighcS5jYWNoZVt1XSl7dmFyIGE9dC5yZXBsYWNlKC9AcGFyZW50UHJvcGVydHkvZywiXyRfcGFyZW50UHJvcGVydHkiKS5yZXBsYWNlKC9AcGFyZW50L2csIl8kX3BhcmVudCIpLnJlcGxhY2UoL0Bwcm9wZXJ0eS9nLCJfJF9wcm9wZXJ0eSIpLnJlcGxhY2UoL0Byb290L2csIl8kX3Jvb3QiKS5yZXBsYWNlKC9AKFtcdC1cciBcKVwuXFtceEEwXHUxNjgwXHUyMDAwLVx1MjAwQVx1MjAyOFx1MjAyOVx1MjAyRlx1MjA1Rlx1MzAwMFx1RkVGRl0pL2csIl8kX3YkMSIpO3MmJihhPWEucmVwbGFjZSgvQHBhdGgvZywiXyRfcGF0aCIpKSxxLmNhY2hlW3VdPW5ldyB0aGlzLnZtLlNjcmlwdChhKX10cnl7cmV0dXJuIHEuY2FjaGVbdV0ucnVuSW5OZXdDb250ZXh0KHRoaXMuY3VyclNhbmRib3gpfWNhdGNoKGwpe3Rocm93IG5ldyBFcnJvcigianNvblBhdGg6ICIrbC5tZXNzYWdlKyI6ICIrdCl9fSxxLmNhY2hlPXt9LHEudG9QYXRoU3RyaW5nPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10LG49ZS5sZW5ndGgscj0iJCIsaT0xO2k8bjtpKyspL14ofnxcXnxAKD86W1wwLVx0XHgwQlxmXHgwRS1cdTIwMjdcdTIwMkEtXHVEN0ZGXHVFMDAwLVx1RkZGRl18W1x1RDgwMC1cdURCRkZdW1x1REMwMC1cdURGRkZdfFtcdUQ4MDAtXHVEQkZGXSg/IVtcdURDMDAtXHVERkZGXSl8KD86W15cdUQ4MDAtXHVEQkZGXXxeKVtcdURDMDAtXHVERkZGXSkqP1woXCkpJC8udGVzdChlW2ldKXx8KHIrPS9eW1wqMC05XSskLy50ZXN0KGVbaV0pPyJbIitlW2ldKyJdIjoiWyciK2VbaV0rIiddIik7cmV0dXJuIHJ9LHEudG9Qb2ludGVyPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10LG49ZS5sZW5ndGgscj0iIixpPTE7aTxuO2krKykvXih+fFxefEAoPzpbXDAtXHRceDBCXGZceDBFLVx1MjAyN1x1MjAyQS1cdUQ3RkZcdUUwMDAtXHVGRkZGXXxbXHVEODAwLVx1REJGRl1bXHVEQzAwLVx1REZGRl18W1x1RDgwMC1cdURCRkZdKD8hW1x1REMwMC1cdURGRkZdKXwoPzpbXlx1RDgwMC1cdURCRkZdfF4pW1x1REMwMC1cdURGRkZdKSo/XChcKSkkLy50ZXN0KGVbaV0pfHwocis9Ii8iK2VbaV0udG9TdHJpbmcoKS5yZXBsYWNlKC9+L2csIn4wIikucmVwbGFjZSgvXC8vZywifjEiKSk7cmV0dXJuIHJ9LHEudG9QYXRoQXJyYXk9ZnVuY3Rpb24odCl7dmFyIGU9cS5jYWNoZTtpZihlW3RdKXJldHVybiBlW3RdLmNvbmNhdCgpO3ZhciBuPVtdLHI9dC5yZXBsYWNlKC9AKD86bnVsbHxib29sZWFufG51bWJlcnxzdHJpbmd8aW50ZWdlcnx1bmRlZmluZWR8bm9uRmluaXRlfHNjYWxhcnxhcnJheXxvYmplY3R8ZnVuY3Rpb258b3RoZXIpXChcKS9nLCI7JCY7IikucmVwbGFjZSgvWydcW10oXD8/XCgoPzpbXDAtXHRceDBCXGZceDBFLVx1MjAyN1x1MjAyQS1cdUQ3RkZcdUUwMDAtXHVGRkZGXXxbXHVEODAwLVx1REJGRl1bXHVEQzAwLVx1REZGRl18W1x1RDgwMC1cdURCRkZdKD8hW1x1REMwMC1cdURGRkZdKXwoPzpbXlx1RDgwMC1cdURCRkZdfF4pW1x1REMwMC1cdURGRkZdKSo/XCkpWydcXV0oPyEoPzpbXDAtXHRceDBCXGZceDBFLVx1MjAyN1x1MjAyQS1cdUQ3RkZcdUUwMDAtXHVGRkZGXXxbXHVEODAwLVx1REJGRl1bXHVEQzAwLVx1REZGRl18W1x1RDgwMC1cdURCRkZdKD8hW1x1REMwMC1cdURGRkZdKXwoPzpbXlx1RDgwMC1cdURCRkZdfF4pW1x1REMwMC1cdURGRkZdKVxdKS9nLGZ1bmN0aW9uKG8scyl7cmV0dXJuIlsjIisobi5wdXNoKHMpLTEpKyJdIn0pLnJlcGxhY2UoL1xbWyInXSgoPzpbXDAtJlwoLVxcXF4tXHVEN0ZGXHVFMDAwLVx1RkZGRl18W1x1RDgwMC1cdURCRkZdW1x1REMwMC1cdURGRkZdfFtcdUQ4MDAtXHVEQkZGXSg/IVtcdURDMDAtXHVERkZGXSl8KD86W15cdUQ4MDAtXHVEQkZGXXxeKVtcdURDMDAtXHVERkZGXSkqKVsiJ11cXS9nLGZ1bmN0aW9uKG8scyl7cmV0dXJuIlsnIitzLnJlcGxhY2UoL1wuL2csIiVAJSIpLnJlcGxhY2UoL34vZywiJSVAQCUlIikrIiddIn0pLnJlcGxhY2UoL34vZywiO347IikucmVwbGFjZSgvWyInXT9cLlsiJ10/KD8hKD86W1wwLVpcXC1cdUQ3RkZcdUUwMDAtXHVGRkZGXXxbXHVEODAwLVx1REJGRl1bXHVEQzAwLVx1REZGRl18W1x1RDgwMC1cdURCRkZdKD8hW1x1REMwMC1cdURGRkZdKXwoPzpbXlx1RDgwMC1cdURCRkZdfF4pW1x1REMwMC1cdURGRkZdKSpcXSl8XFtbIiddPy9nLCI7IikucmVwbGFjZSgvJUAlL2csIi4iKS5yZXBsYWNlKC8lJUBAJSUvZywifiIpLnJlcGxhY2UoLyg/OjspPyhcXispKD86Oyk/L2csZnVuY3Rpb24obyxzKXtyZXR1cm4iOyIrcy5zcGxpdCgiIikuam9pbigiOyIpKyI7In0pLnJlcGxhY2UoLzs7O3w7Oy9nLCI7Li47IikucmVwbGFjZSgvOyR8Jz9cXXwnJC9nLCIiKSxpPXIuc3BsaXQoIjsiKS5tYXAoZnVuY3Rpb24obyl7dmFyIHM9by5tYXRjaCgvIyhbMC05XSspLyk7cmV0dXJuIXN8fCFzWzFdP286bltzWzFdXX0pO3JldHVybiBlW3RdPWksZVt0XS5jb25jYXQoKX07dmFyIEZmPWZ1bmN0aW9uKGUsbixyKXtmb3IodmFyIGk9ZS5sZW5ndGgsbz0wO288aTtvKyspe3ZhciBzPWVbb107cihzKSYmbi5wdXNoKGUuc3BsaWNlKG8tLSwxKVswXSl9fSx3Zj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSl7d2kodGhpcyx0KSx0aGlzLmNvZGU9ZX1yZXR1cm4gTmkodCxbe2tleToicnVuSW5OZXdDb250ZXh0Iix2YWx1ZTpmdW5jdGlvbihuKXt2YXIgcj10aGlzLmNvZGUsaT1PYmplY3Qua2V5cyhuKSxvPVtdO0ZmKGksbyxmdW5jdGlvbihkKXtyZXR1cm4gdHlwZW9mIG5bZF09PSJmdW5jdGlvbiJ9KTt2YXIgcz1pLm1hcChmdW5jdGlvbihkKXtyZXR1cm4gbltkXX0pLHU9by5yZWR1Y2UoZnVuY3Rpb24oZCxfKXt2YXIgTz1uW19dLnRvU3RyaW5nKCk7cmV0dXJuL2Z1bmN0aW9uLy50ZXN0KE8pfHwoTz0iZnVuY3Rpb24gIitPKSwidmFyICIrXysiPSIrTysiOyIrZH0sIiIpO3I9dStyLCEvKFsiJ10pdXNlIHN0cmljdFwxLy50ZXN0KHIpJiYhaS5pbmNsdWRlcygiYXJndW1lbnRzIikmJihyPSJ2YXIgYXJndW1lbnRzID0gdW5kZWZpbmVkOyIrcikscj1yLnJlcGxhY2UoLztbXHQtXHIgXHhBMFx1MTY4MFx1MjAwMC1cdTIwMEFcdTIwMjhcdTIwMjlcdTIwMkZcdTIwNUZcdTMwMDBcdUZFRkZdKiQvLCIiKTt2YXIgYT1yLmxhc3RJbmRleE9mKCI7IiksbD1hPi0xP3Iuc2xpY2UoMCxhKzEpKyIgcmV0dXJuICIrci5zbGljZShhKzEpOiIgcmV0dXJuICIrcjtyZXR1cm4gRmkoRnVuY3Rpb24saS5jb25jYXQoW2xdKSkuYXBwbHkodm9pZCAwLHhmKHMpKX19XSksdH0oKTtxLnByb3RvdHlwZS52bT17U2NyaXB0OndmfTtjb25zdCBJZj0iYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NTY3ODkiLE5mPXQ9PkFycmF5LmZyb20od2luZG93LmNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkodCkpKS5tYXAoZT0+SWZbZSV0XSkuam9pbigiIikudG9Mb3dlckNhc2UoKSxDaT10PT57aWYodHlwZW9mIHQhPSJvYmplY3QifHx0PT09bnVsbClyZXR1cm4gdDtmb3IoY29uc3QgZSBpbiB0KWlmKHR5cGVvZiB0W2VdPT0ic3RyaW5nIil0cnl7dFtlXS5zdGFydHNXaXRoKCJ7IikmJnRbZV0uZW5kc1dpdGgoIn0iKSYmKHRbZV09SlNPTi5wYXJzZSh0W2VdKSl9Y2F0Y2h7Y29uc29sZS5lcnJvcigiSW52YWxpZCBKU09OOiIsdFtlXSl9ZWxzZSB0eXBlb2YgdFtlXT09Im9iamVjdCImJih0W2VdPUNpKHRbZV0pKTtyZXR1cm4gdH0sZXI9ImN6bV8iO2Z1bmN0aW9uIE1mKHQsZSl7bGV0IG49dCxyPSIiO2NvbnN0IGk9W107bGV0IG89bi5pbmRleE9mKCIkeyIpO2NvbnN0IHM9dHlwZW9mIGU8InUiLHU9e30sYT0vXlwkLi87Zm9yKDtvPj0wOylpZihDZihuLG8pKXtjb25zdCBsPXZmKG4sbyk7cis9bi5zbGljZSgwLGwrMSksbj1uLnNsaWNlKGwrMSksbz1uLmluZGV4T2YoIiR7Iil9ZWxzZXtyKz1uLnNsaWNlKDAsbyk7Y29uc3QgbD1EZihuLG8pLGQ9bi5zbGljZShvKzIsbCk7aWYoYS50ZXN0KGQpKXtpZighcylyZXR1cm5bcixbXV07bGV0IF89dVtkXTtpZighXyl0cnl7Xz1xKHtqc29uOmUscGF0aDpkfSksdVtkXT1ffWNhdGNoe3JldHVybltyLFtdXX1pZihfLmxlbmd0aCE9PTApe2NvbnN0IE89TmYoMTApO2kucHVzaCh7bGl0ZXJhbE5hbWU6TyxsaXRlcmFsVmFsdWU6X1swXX0pLHIrPU99ZWxzZSByZXR1cm5bImZhbHNlIixbXV19ZWxzZXtjb25zdCBfPUxmKGQpO3IrPWAke2VyfSR7X31gfW49bi5zbGljZShsKzEpLG89bi5pbmRleE9mKCIkeyIpfXJldHVybiByKz1uLFtyLGldfWZ1bmN0aW9uIENmKHQsZSl7Y29uc3Qgbj10LmluZGV4T2YoIiciKSxyPXQuaW5kZXhPZignIicpO3JldHVybiBuPj0wJiZuPGU/dC5pbmRleE9mKCInIixuKzEpPj1lOnI+PTAmJnI8ZT90LmluZGV4T2YoJyInLHIrMSk+PWU6ITF9ZnVuY3Rpb24gdmYodCxlKXtjb25zdCBuPXQuaW5kZXhPZigiJyIpLHI9dC5pbmRleE9mKCciJyk7cmV0dXJuIG4+PTAmJm48ZT90LmluZGV4T2YoIiciLG4rMSk6cj49MCYmcjxlP3QuaW5kZXhPZignIicscisxKTotMX1mdW5jdGlvbiBEZih0LGUpe2NvbnN0IG49dC5pbmRleE9mKCJ9IixlKTtpZihuPDApdGhyb3cgbmV3IEVycm9yKCJyZXBsYWNlVmFyaWFibGU6IFVubWF0Y2hlZCB7LiIpO3JldHVybiBufWNvbnN0IGNlPXQ9PmAkcmVlYXJ0aF8ke3R9XyRgLG5yPXsiWyI6Y2UoIm9wZW5lZF9zcXVhcmVfYnJhY2tldCIpLCJdIjpjZSgiY2xvc2VkX3NxdWFyZV9icmFja2V0IiksInsiOmNlKCJvcGVuZWRfY3VybHlfYnJhY2tldCIpLCJ9IjpjZSgiY2xvc2VkX2N1cmx5X2JyYWNrZXQiKSwiKCI6Y2UoIm9wZW5lZF9wYXJlbnRoZXNlcyIpLCIpIjpjZSgiY2xvc2VkX3BhcmVudGhlc2VzIiksIi0iOmNlKCJoeXBoZW4iKX0sTGY9dD0+e2NvbnN0IGU9dC5yZXBsYWNlKC8tL2csbnJbIi0iXSk7cmV0dXJuLyhcXXxcKXxcfSlbXlsuXSskLy50ZXN0KGUpP09iamVjdC5lbnRyaWVzKG5yKS5yZWR1Y2UoKG4sW3IsaV0pPT5uLnJlcGxhY2VBbGwocixpKSxlKTplfSxQZj10PT5PYmplY3QuZW50cmllcyhucikucmVkdWNlKChlLFtuLHJdKT0+ZS5yZXBsYWNlQWxsKHIsbiksdCksQmY9bmV3IFNldChLaCksdmk9bmV3IFNldChaaCk7ZnVuY3Rpb24gVyh0LGUpe2xldCBuPW5ldyBFcnJvcigiZmFpbGVkIHRvIHBhcnNlIik7Y29uc3Qgcj1lLnR5cGU7aWYocj09PSJMaXRlcmFsIiluPVVmKGUpO2Vsc2UgaWYocj09PSJDYWxsRXhwcmVzc2lvbiIpbj1HZih0LGUpO2Vsc2UgaWYocj09PSJJZGVudGlmaWVyIiluPSRmKGUpO2Vsc2UgaWYocj09PSJVbmFyeUV4cHJlc3Npb24iKXtjb25zdCBpPWUub3BlcmF0b3Isbz1XKHQsZS5hcmd1bWVudCk7aWYoQmYuaGFzKGkpKW49bmV3IFAoTS5VTkFSWSxpLG8pO2Vsc2UgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIG9wZXJhdG9yICIke2l9Ii5gKX1lbHNlIGlmKHI9PT0iQmluYXJ5RXhwcmVzc2lvbiIpe2NvbnN0IGk9ZS5vcGVyYXRvcixvPVcodCxlLmxlZnQpLHM9Vyh0LGUucmlnaHQpO2lmKHZpLmhhcyhpKSluPW5ldyBQKE0uQklOQVJZLGksbyxzKTtlbHNlIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBvcGVyYXRvciAiJHtpfSIuYCl9ZWxzZSBpZihyPT09IkxvZ2ljYWxFeHByZXNzaW9uIil7Y29uc3QgaT1lLm9wZXJhdG9yLG89Vyh0LGUubGVmdCkscz1XKHQsZS5yaWdodCk7dmkuaGFzKGkpJiYobj1uZXcgUChNLkJJTkFSWSxpLG8scykpfWVsc2UgaWYocj09PSJDb25kaXRpb25hbEV4cHJlc3Npb24iKXtjb25zdCBpPVcodCxlLnRlc3QpLG89Vyh0LGUuY29uc2VxdWVudCkscz1XKHQsZS5hbHRlcm5hdGUpO249bmV3IFAoTS5DT05ESVRJT05BTCwiPyIsbyxzLGkpfWVsc2UgaWYocj09PSJNZW1iZXJFeHByZXNzaW9uIiluPVdmKHQsZSk7ZWxzZSBpZihyPT09IkFycmF5RXhwcmVzc2lvbiIpe2NvbnN0IGk9W107Zm9yKGxldCBvPTA7bzxlLmVsZW1lbnRzLmxlbmd0aDtvKyspaVtvXT1XKHQsZS5lbGVtZW50c1tvXSk7bj1uZXcgUChNLkFSUkFZLGkpfWVsc2UgdGhyb3cgcj09PSJDb21wb3VuZCI/bmV3IEVycm9yKCJQcm92aWRlIGV4YWN0bHkgb25lIGV4cHJlc3Npb24uIik6bmV3IEVycm9yKCJDYW5ub3QgcGFyc2UgZXhwcmVzc2lvbi4iKTtyZXR1cm4gbn1mdW5jdGlvbiBVZih0KXtjb25zdCBlPXR5cGVvZiB0LnZhbHVlO2lmKHQudmFsdWU9PT1udWxsKXJldHVybiBuZXcgUChNLkxJVEVSQUxfTlVMTCxudWxsKTtpZihlPT09ImJvb2xlYW4iKXJldHVybiBuZXcgUChNLkxJVEVSQUxfQk9PTEVBTix0LnZhbHVlKTtpZihlPT09Im51bWJlciIpcmV0dXJuIG5ldyBQKE0uTElURVJBTF9OVU1CRVIsdC52YWx1ZSk7aWYoZT09PSJzdHJpbmciKXJldHVybiB0LnZhbHVlLmluZGV4T2YoIiR7Iik+PTA/bmV3IFAoTS5WQVJJQUJMRV9JTl9TVFJJTkcsdC52YWx1ZSk6bmV3IFAoTS5MSVRFUkFMX1NUUklORyxqZih0LnZhbHVlKSk7dGhyb3cgbmV3IEVycm9yKGAke3R9IGlzIG5vdCBhIGZ1bmN0aW9uLmApfWZ1bmN0aW9uIGpmKHQpe3JldHVybiB0LnJlcGxhY2UodGYsIlxcIil9ZnVuY3Rpb24gR2YodCxlKXtjb25zdCBuPWUuYXJndW1lbnRzLHI9bi5sZW5ndGg7aWYoZS5jYWxsZWUudHlwZT09PSJNZW1iZXJFeHByZXNzaW9uIil7Y29uc3Qgbz1lLmNhbGxlZS5wcm9wZXJ0eS5uYW1lLHM9ZS5jYWxsZWUub2JqZWN0O2lmKG89PT0idGVzdCJ8fG89PT0iZXhlYyIpe2lmKHMuY2FsbGVlLm5hbWUhPT0icmVnRXhwIil0aHJvdyBuZXcgRXJyb3IoYCR7b30gaXMgbm90IGEgZnVuY3Rpb24uYCk7aWYocj09PTApcmV0dXJuIG89PT0idGVzdCI/bmV3IFAoTS5MSVRFUkFMX0JPT0xFQU4sITEpOm5ldyBQKE0uTElURVJBTF9OVUxMLG51bGwpO2NvbnN0IHU9Vyh0LHMpLGE9Vyh0LG5bMF0pO3JldHVybiBuZXcgUChNLkZVTkNUSU9OX0NBTEwsbyx1LGEpfWVsc2UgaWYobz09PSJ0b1N0cmluZyIpe2NvbnN0IHU9Vyh0LHMpO3JldHVybiBuZXcgUChNLkZVTkNUSU9OX0NBTEwsbyx1KX10aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgZnVuY3Rpb24gY2FsbCAiJHtvfSIuYCl9Y29uc3QgaT1lLmNhbGxlZS5uYW1lO2lmKGk9PT0iY29sb3IiKXtpZihyPT09MClyZXR1cm4gbmV3IFAoTS5MSVRFUkFMX0NPTE9SLGkpO2NvbnN0IG89Vyh0LG5bMF0pO2lmKHR5cGVvZiBuWzFdPCJ1Iil7Y29uc3Qgcz1XKHQsblsxXSk7cmV0dXJuIG5ldyBQKE0uTElURVJBTF9DT0xPUixpLFtvLHNdKX1yZXR1cm4gbmV3IFAoTS5MSVRFUkFMX0NPTE9SLGksW29dKX1lbHNlIGlmKGk9PT0icmdiInx8aT09PSJoc2wiKXtpZihyPDMpdGhyb3cgbmV3IEVycm9yKGAke2l9IHJlcXVpcmVzIHRocmVlIGFyZ3VtZW50cy5gKTtjb25zdCBvPVtXKHQsblswXSksVyh0LG5bMV0pLFcodCxuWzJdKV07cmV0dXJuIG5ldyBQKE0uTElURVJBTF9DT0xPUixpLG8pfWVsc2UgaWYoaT09PSJyZ2JhInx8aT09PSJoc2xhIil7aWYocjw0KXRocm93IG5ldyBFcnJvcihgJHtpfSByZXF1aXJlcyBmb3VyIGFyZ3VtZW50cy5gKTtjb25zdCBvPVtXKHQsblswXSksVyh0LG5bMV0pLFcodCxuWzJdKSxXKHQsblszXSldO3JldHVybiBuZXcgUChNLkxJVEVSQUxfQ09MT1IsaSxvKX1lbHNlIGlmKGk9PT0iaXNOYU4ifHxpPT09ImlzRmluaXRlIil7aWYocj09PTApcmV0dXJuIGk9PT0iaXNOYU4iP25ldyBQKE0uTElURVJBTF9CT09MRUFOLCEwKTpuZXcgUChNLkxJVEVSQUxfQk9PTEVBTiwhMSk7Y29uc3Qgbz1XKHQsblswXSk7cmV0dXJuIG5ldyBQKE0uVU5BUlksaSxvKX1lbHNlIGlmKHR5cGVvZiBZbltpXTwidSIpe2lmKHIhPT0xKXRocm93IG5ldyBFcnJvcihgJHtpfSByZXF1aXJlcyBleGFjdGx5IG9uZSBhcmd1bWVudC5gKTtjb25zdCBvPVcodCxuWzBdKTtyZXR1cm4gbmV3IFAoTS5VTkFSWSxpLG8pfWVsc2UgaWYodHlwZW9mIGtuW2ldPCJ1Iil7aWYociE9PTIpdGhyb3cgbmV3IEVycm9yKGAke2l9IHJlcXVpcmVzIGV4YWN0bHkgdHdvIGFyZ3VtZW50cy5gKTtjb25zdCBvPVcodCxuWzBdKSxzPVcodCxuWzFdKTtyZXR1cm4gbmV3IFAoTS5CSU5BUlksaSxvLHMpfWVsc2UgaWYoaT09PSJCb29sZWFuIil7aWYocj09PTApcmV0dXJuIG5ldyBQKE0uTElURVJBTF9CT09MRUFOLCExKTtjb25zdCBvPVcodCxuWzBdKTtyZXR1cm4gbmV3IFAoTS5VTkFSWSxpLG8pfWVsc2UgaWYoaT09PSJOdW1iZXIiKXtpZihyPT09MClyZXR1cm4gbmV3IFAoTS5MSVRFUkFMX05VTUJFUiwwKTtjb25zdCBvPVcodCxuWzBdKTtyZXR1cm4gbmV3IFAoTS5VTkFSWSxpLG8pfWVsc2UgaWYoaT09PSJTdHJpbmciKXtpZihyPT09MClyZXR1cm4gbmV3IFAoTS5MSVRFUkFMX1NUUklORywiIik7Y29uc3Qgbz1XKHQsblswXSk7cmV0dXJuIG5ldyBQKE0uVU5BUlksaSxvKX10aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgZnVuY3Rpb24gY2FsbCAiJHtpfSIuYCl9ZnVuY3Rpb24gJGYodCl7Y29uc3QgZT10Lm5hbWU7aWYoWGYoZSkpe2NvbnN0IG49SGYoZSk7cmV0dXJuIG4uc3Vic3RyaW5nKDAsOCk9PT0idGlsZXMzZF8iP25ldyBQKE0uQlVJTFRJTl9WQVJJQUJMRSxuKTpuZXcgUChNLlZBUklBQkxFLG4pfWVsc2V7aWYoZT09PSJOYU4iKXJldHVybiBuZXcgUChNLkxJVEVSQUxfTlVNQkVSLE5hTik7aWYoZT09PSJJbmZpbml0eSIpcmV0dXJuIG5ldyBQKE0uTElURVJBTF9OVU1CRVIsMS8wKTtpZihlPT09InVuZGVmaW5lZCIpcmV0dXJuIG5ldyBQKE0uTElURVJBTF9VTkRFRklORUQsdm9pZCAwKX10aHJvdyBuZXcgRXJyb3IoYCR7ZX0gaXMgbm90IGRlZmluZWQuYCl9ZnVuY3Rpb24gVmYodCl7Y29uc3QgZT10LnByb3BlcnR5Lm5hbWU7aWYoZT09PSJQSSIpcmV0dXJuIG5ldyBQKE0uTElURVJBTF9OVU1CRVIsTWF0aC5QSSk7aWYoZT09PSJFIilyZXR1cm4gbmV3IFAoTS5MSVRFUkFMX05VTUJFUixNYXRoLkUpO3Rocm93IG5ldyBFcnJvcihgJHtlfSBNYXRoIENvbnN0YW50IGlzIG5vdCBzdXBwb3J0ZWQgYXQgdGhlIG1vbWVudGApfWZ1bmN0aW9uIHpmKHQpe2NvbnN0IGU9dC5wcm9wZXJ0eS5uYW1lO2lmKGU9PT0iUE9TSVRJVkVfSU5GSU5JVFkiKXJldHVybiBuZXcgUChNLkxJVEVSQUxfTlVNQkVSLE51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7dGhyb3cgbmV3IEVycm9yKGAke2V9IE51bWJlciBDb25zdGFudCBpcyBub3Qgc3VwcG9ydGVkIGF0IHRoZSBtb21lbnRgKX1mdW5jdGlvbiBXZih0LGUpe2lmKGUub2JqZWN0Lm5hbWU9PT0iTWF0aCIpcmV0dXJuIFZmKGUpO2lmKGUub2JqZWN0Lm5hbWU9PT0iTnVtYmVyIilyZXR1cm4gemYoZSk7bGV0IG47Y29uc3Qgcj1XKHQsZS5vYmplY3QpO3JldHVybiBlLmNvbXB1dGVkPyhuPVcodCxlLnByb3BlcnR5KSxuZXcgUChNLk1FTUJFUiwiYnJhY2tldHMiLHIsbikpOihuPW5ldyBQKE0uTElURVJBTF9TVFJJTkcsZS5wcm9wZXJ0eS5uYW1lKSxuZXcgUChNLk1FTUJFUiwiZG90IixyLG4pKX1mdW5jdGlvbiBYZih0KXtyZXR1cm4gdC5zdWJzdHJpbmcoMCw0KT09PWVyfWZ1bmN0aW9uIEhmKHQpe3JldHVybiBQZih0KS5zdWJzdHJpbmcoNCl9Y29uc3QgRGk9bmV3IE1hcCxMaT1uZXcgTWFwLFBpPW5ldyBNYXAsQmk9bmV3IE1hcDtjbGFzcyBjbntjb25zdHJ1Y3RvcihlLG4scil7dih0aGlzLCJfcnVudGltZUFzdCIpO3YodGhpcywiX2ZlYXR1cmUiKTt2YXIgdTt0aGlzLl9mZWF0dXJlPW47bGV0IGk9W107ZT1xZihlLHIpO2NvbnN0IG89TGkuZ2V0KGUpO2lmKG8pW2UsaV09bztlbHNle2NvbnN0IGE9ZTtbZSxpXT1NZihrZihlKSwodT10aGlzLl9mZWF0dXJlKT09bnVsbD92b2lkIDA6dS5wcm9wZXJ0aWVzKSxlLmluY2x1ZGVzKGVyKSYmTGkuc2V0KGEsW2UsaV0pfWNvbnN0IHM9RGkuZ2V0KGUpO2lmKHMpdGhpcy5fcnVudGltZUFzdD1zO2Vsc2V7aWYoaS5sZW5ndGghPT0wKWZvcihjb25zdCBsIG9mIGkpcXQuYWRkTGl0ZXJhbChsLmxpdGVyYWxOYW1lLGwubGl0ZXJhbFZhbHVlKTtxdC5hZGRCaW5hcnlPcCgiPX4iLDApLHF0LmFkZEJpbmFyeU9wKCIhfiIsMCk7bGV0IGE7dHJ5e2E9cXQoZSl9Y2F0Y2gobCl7dGhyb3cgbmV3IEVycm9yKGBmYWlsZWQgdG8gZ2VuZXJhdGUgYXN0OiAke2x9YCl9dGhpcy5fcnVudGltZUFzdD1XKHRoaXMsYSksRGkuc2V0KGUsdGhpcy5fcnVudGltZUFzdCl9fWV2YWx1YXRlKCl7cmV0dXJuIHRoaXMuX3J1bnRpbWVBc3QuZXZhbHVhdGUodGhpcy5fZmVhdHVyZSl9fWZ1bmN0aW9uIHFmKHQsZSl7aWYodHlwZW9mIGU+InUiKXJldHVybiB0O2NvbnN0IG49SlNPTi5zdHJpbmdpZnkoT2JqZWN0LmVudHJpZXMoZSkuc29ydCgpKSxyPXQrbixpPUJpLmdldChyKTtpZihpKXJldHVybiBpO2xldCBvPVBpLmdldCh0KTtvfHwobz1uZXcgUmVnRXhwKGBcXCRcXHsoJHtPYmplY3Qua2V5cyhlKS5qb2luKCJ8Iil9KVxcfWAsImciKSxQaS5zZXQodCxvKSk7Y29uc3Qgcz10LnJlcGxhY2UobywodSxhKT0+dHlwZW9mIGVbYV08InUiP2AoJHtlW2FdfSlgOiIiKTtyZXR1cm4gQmkuc2V0KHIscyksc31mdW5jdGlvbiBrZih0KXtyZXR1cm4gdC5yZXBsYWNlKFFoLEpoKX1jbGFzcyBZZntjb25zdHJ1Y3RvcihlLG4scil7dih0aGlzLCJfY29uZGl0aW9ucyIpO3YodGhpcywiX3J1bnRpbWVDb25kaXRpb25zIik7dih0aGlzLCJfZmVhdHVyZSIpO3YodGhpcywiX21lbW9pemVkUmVzdWx0Iik7dGhpcy5fY29uZGl0aW9ucz1lLmNvbmRpdGlvbnMsdGhpcy5fcnVudGltZUNvbmRpdGlvbnM9W10sdGhpcy5fZmVhdHVyZT1uLHRoaXMuX21lbW9pemVkUmVzdWx0PXZvaWQgMCx0aGlzLnNldFJ1bnRpbWUocil9c2V0UnVudGltZShlKXt2YXIgcjtjb25zdCBuPShyPXRoaXMuX2NvbmRpdGlvbnMpPT1udWxsP3ZvaWQgMDpyLm1hcChpPT57Y29uc3Qgbz1TdHJpbmcoaVswXSkscz1TdHJpbmcoaVsxXSk7cmV0dXJuIG5ldyBLZihuZXcgY24obyx0aGlzLl9mZWF0dXJlLGUpLG5ldyBjbihzLHRoaXMuX2ZlYXR1cmUsZSkpfSk7dGhpcy5fcnVudGltZUNvbmRpdGlvbnM9bj8/W10sdGhpcy5fbWVtb2l6ZWRSZXN1bHQ9dm9pZCAwfWV2YWx1YXRlKCl7aWYodHlwZW9mIHRoaXMuX21lbW9pemVkUmVzdWx0PCJ1IilyZXR1cm4gdGhpcy5fbWVtb2l6ZWRSZXN1bHQ7Y29uc3QgZT10aGlzLl9ydW50aW1lQ29uZGl0aW9ucyxuPWUubGVuZ3RoO2ZvcihsZXQgaT0wO2k8bjtpKyspe2NvbnN0IG89ZVtpXTtpZihvLmNvbmRpdGlvbi5ldmFsdWF0ZSgpKXtjb25zdCBzPW8uZXhwcmVzc2lvbi5ldmFsdWF0ZSgpO3JldHVybiB0aGlzLl9tZW1vaXplZFJlc3VsdD1zLHN9fWNvbnN0IHI9dm9pZCAwO3JldHVybiB0aGlzLl9tZW1vaXplZFJlc3VsdD1yLHJ9fWNsYXNzIEtme2NvbnN0cnVjdG9yKGUsbil7dih0aGlzLCJjb25kaXRpb24iKTt2KHRoaXMsImV4cHJlc3Npb24iKTt0aGlzLmNvbmRpdGlvbj1lLHRoaXMuZXhwcmVzc2lvbj1ufX1jb25zdCBaZj0odCxlLG4pPT57Y29uc3Qgcj1IaCh0LFloKSxpPW4wKHQsZSk7cmV0dXJuey4uLmksLi4uUWYocix0LGkpLHR5cGU6ImNvbXB1dGVkRmVhdHVyZSIsaW50ZXJ2YWw6bn19O2Z1bmN0aW9uIFFmKHQsZSxuKXtpZighbil7aWYoIWUuaWQpdGhyb3cgbmV3IEVycm9yKCJsYXllciBpZCBpcyByZXF1aXJlZCIpO249e3R5cGU6ImZlYXR1cmUiLGlkOmUuaWQscHJvcGVydGllczplLnByb3BlcnRpZXN8fHt9fX1yZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHQpLm1hcCgoW3IsaV0pPT5pP1tyLFVpKGksZSxuKV06dm9pZCAwKS5maWx0ZXIocj0+ISFyKSl9ZnVuY3Rpb24gVWkodCxlLG4pe3JldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXModCkubWFwKChbcixpXSk9PnQwKGkpP1tyLFVpKGksZSxuKV06W3IsZTAoaSxlLG4pXSkpfWZ1bmN0aW9uIEpmKHQpe3JldHVybiB0eXBlb2YgdD09Im9iamVjdCImJnQmJiJleHByZXNzaW9uImluIHR9ZnVuY3Rpb24gdDAodCl7cmV0dXJuIHR5cGVvZiB0PT0ib2JqZWN0IiYmdCYmISgiZXhwcmVzc2lvbiJpbiB0KSYmIUFycmF5LmlzQXJyYXkodCl9ZnVuY3Rpb24gZTAodCxlLG4pe3RyeXtpZihKZih0KSl7Y29uc3Qgcj10LmV4cHJlc3Npb24saT1DaShVaChuKSk7cmV0dXJuIHR5cGVvZiByPiJ1Ij92b2lkIDA6dHlwZW9mIHI9PSJvYmplY3QiJiZyLmNvbmRpdGlvbnM/bmV3IFlmKHIsaSxlLmRlZmluZXMpLmV2YWx1YXRlKCk6dHlwZW9mIHI9PSJib29sZWFuInx8dHlwZW9mIHI9PSJudW1iZXIiP25ldyBjbihTdHJpbmcociksaSxlLmRlZmluZXMpLmV2YWx1YXRlKCk6dHlwZW9mIHI9PSJzdHJpbmciP25ldyBjbihyLGksZS5kZWZpbmVzKS5ldmFsdWF0ZSgpOnJ9cmV0dXJuIHR9Y2F0Y2gocil7Y29uc29sZS5lcnJvcihyKTtyZXR1cm59fWZ1bmN0aW9uIG4wKHQsZSl7dmFyIGk7Y29uc3Qgbj0oaT10LmRhdGEpPT1udWxsP3ZvaWQgMDppLmpzb25Qcm9wZXJ0aWVzO2lmKCFlLnByb3BlcnRpZXN8fCFufHwhbi5sZW5ndGgpcmV0dXJuIGU7Y29uc3Qgcj17Li4uZSwuLi5lIT1udWxsJiZlLnByb3BlcnRpZXM/e3Byb3BlcnRpZXM6ey4uLmUucHJvcGVydGllc319Ont9fTtyZXR1cm4gbi5mb3JFYWNoKG89PntyLnByb3BlcnRpZXNbb109KCgpPT57Y29uc3Qgcz1yLnByb3BlcnRpZXNbb107dHJ5e3JldHVybiBKU09OLnBhcnNlKHMpfWNhdGNoe3JldHVybiBzfX0pKCl9KSxyfWZ1bmN0aW9uIGhuKHQsZSl7aWYodC50eXBlPT09InNpbXBsZSIpcmV0dXJuIFpmKHQsZSl9Y29uc3QgcjA9KHQsZSxuKT0+e2lmKCFuKXJldHVybjtjb25zdCByPSgoKT0+e3N3aXRjaChyZS50eXBlc1t0LnR5cGVdKXtjYXNlIlBvbHlnb24iOnJldHVybiJwb2x5Z29uIjtjYXNlIkxpbmVTdHJpbmciOnJldHVybiJwb2x5bGluZSI7Y2FzZSJQb2ludCI6cmV0dXJuIm1hcmtlciI7ZGVmYXVsdDpyZXR1cm59fSkoKTtpZighcilyZXR1cm47Y29uc3QgaT10LmlkP1N0cmluZyh0LmlkKTppMCh0LmxvYWRHZW9tZXRyeSgpLGUpLG89aG4obixvMChpLHQsZSxyKSkscz1uZXcgZ247cmV0dXJuIHMuZGF0YT17bGF5ZXJJZDpuPT1udWxsP3ZvaWQgMDpuLmlkLGZlYXR1cmVJZDppLGZlYXR1cmU6byxhcHBlYXJhbmNlVHlwZTpyZS50eXBlc1t0LnR5cGVdLnRvTG93ZXJDYXNlKCl9LHN9LGkwPSh0LGUpPT57Y29uc3Qgbj1bZS54LGUueSxlLmxldmVsLC4uLnQuZmxhdE1hcChyPT5yLm1hcChpPT5baS54LGkueV0pKV0uam9pbigiOiIpO3JldHVybiBraChuKX0sbzA9KHQsZSxuLHIpPT57Y29uc3QgaT1lLmxvYWRHZW9tZXRyeSgpLFtvLHNdPSgoKT0+e2lmKHI9PT0icG9seWdvbiIpcmV0dXJuWyJQb2x5Z29uIixpLm1hcCh1PT51Lm1hcChhPT5bYS54LGEueV0pKV07aWYocj09PSJwb2x5bGluZSIpcmV0dXJuWyJMaW5lU3RyaW5nIixpWzBdLm1hcCh1PT5bdS54LHUueV0pXTtpZihyPT09Im1hcmtlciIpcmV0dXJuWyJQb2ludCIsW2lbMF1bMF0ueCxpWzBdWzBdLnldXTt0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgYXBwZWFyYW5jZSAke3J9YCl9KSgpO3JldHVybnt0eXBlOiJmZWF0dXJlIixpZDp0LGdlb21ldHJ5Ont0eXBlOm8sY29vcmRpbmF0ZXM6c30scHJvcGVydGllczplLnByb3BlcnRpZXMscmFuZ2U6e3g6bi54LHk6bi55LHo6bi5sZXZlbH19fSxtZT10eXBlb2YgcGVyZm9ybWFuY2U9PSJvYmplY3QiJiZwZXJmb3JtYW5jZSYmdHlwZW9mIHBlcmZvcm1hbmNlLm5vdz09ImZ1bmN0aW9uIj9wZXJmb3JtYW5jZTpEYXRlLGppPW5ldyBTZXQscnI9dHlwZW9mIHByb2Nlc3M9PSJvYmplY3QiJiZwcm9jZXNzP3Byb2Nlc3M6e30sR2k9KHQsZSxuLHIpPT57dHlwZW9mIHJyLmVtaXRXYXJuaW5nPT0iZnVuY3Rpb24iP3JyLmVtaXRXYXJuaW5nKHQsZSxuLHIpOmNvbnNvbGUuZXJyb3IoYFske259XSAke2V9OiAke3R9YCl9O2xldCBmbj1nbG9iYWxUaGlzLkFib3J0Q29udHJvbGxlciwkaT1nbG9iYWxUaGlzLkFib3J0U2lnbmFsO2lmKHR5cGVvZiBmbj4idSIpeyRpPWNsYXNze2NvbnN0cnVjdG9yKCl7dih0aGlzLCJvbmFib3J0Iik7dih0aGlzLCJfb25hYm9ydCIsW10pO3YodGhpcywicmVhc29uIik7dih0aGlzLCJhYm9ydGVkIiwhMSl9YWRkRXZlbnRMaXN0ZW5lcihyLGkpe3RoaXMuX29uYWJvcnQucHVzaChpKX19LGZuPWNsYXNze2NvbnN0cnVjdG9yKCl7dih0aGlzLCJzaWduYWwiLG5ldyAkaSk7ZSgpfWFib3J0KHIpe3ZhciBpLG87aWYoIXRoaXMuc2lnbmFsLmFib3J0ZWQpe3RoaXMuc2lnbmFsLnJlYXNvbj1yLHRoaXMuc2lnbmFsLmFib3J0ZWQ9ITA7Zm9yKGNvbnN0IHMgb2YgdGhpcy5zaWduYWwuX29uYWJvcnQpcyhyKTsobz0oaT10aGlzLnNpZ25hbCkub25hYm9ydCk9PW51bGx8fG8uY2FsbChpLHIpfX19O2xldCB0PSgoSGk9cnIuZW52KT09bnVsbD92b2lkIDA6SGkuTFJVX0NBQ0hFX0lHTk9SRV9BQ19XQVJOSU5HKSE9PSIxIjtjb25zdCBlPSgpPT57dCYmKHQ9ITEsR2koIkFib3J0Q29udHJvbGxlciBpcyBub3QgZGVmaW5lZC4gSWYgdXNpbmcgbHJ1LWNhY2hlIGluIG5vZGUgMTQsIGxvYWQgYW4gQWJvcnRDb250cm9sbGVyIHBvbHlmaWxsIGZyb20gdGhlIGBub2RlLWFib3J0LWNvbnRyb2xsZXJgIHBhY2thZ2UuIEEgbWluaW1hbCBwb2x5ZmlsbCBpcyBwcm92aWRlZCBmb3IgdXNlIGJ5IExSVUNhY2hlLmZldGNoKCksIGJ1dCBpdCBzaG91bGQgbm90IGJlIHJlbGllZCB1cG9uIGluIG90aGVyIGNvbnRleHRzIChlZywgcGFzc2luZyBpdCB0byBvdGhlciBBUElzIHRoYXQgdXNlIEFib3J0Q29udHJvbGxlci9BYm9ydFNpZ25hbCBtaWdodCBoYXZlIHVuZGVzaXJhYmxlIGVmZmVjdHMpLiBZb3UgbWF5IGRpc2FibGUgdGhpcyB3aXRoIExSVV9DQUNIRV9JR05PUkVfQUNfV0FSTklORz0xIGluIHRoZSBlbnYuIiwiTk9fQUJPUlRfQ09OVFJPTExFUiIsIkVOT1RTVVAiLGUpKX19Y29uc3QgczA9dD0+IWppLmhhcyh0KSxRdD10PT50JiZ0PT09TWF0aC5mbG9vcih0KSYmdD4wJiZpc0Zpbml0ZSh0KSxWaT10PT5RdCh0KT90PD1NYXRoLnBvdygyLDgpP1VpbnQ4QXJyYXk6dDw9TWF0aC5wb3coMiwxNik/VWludDE2QXJyYXk6dDw9TWF0aC5wb3coMiwzMik/VWludDMyQXJyYXk6dDw9TnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI/bG46bnVsbDpudWxsO2NsYXNzIGxuIGV4dGVuZHMgQXJyYXl7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSksdGhpcy5maWxsKDApfX1jb25zdCB3ZT1jbGFzc3tjb25zdHJ1Y3RvcihlLG4pe3YodGhpcywiaGVhcCIpO3YodGhpcywibGVuZ3RoIik7aWYoIWMod2UsRmUpKXRocm93IG5ldyBUeXBlRXJyb3IoImluc3RhbnRpYXRlIFN0YWNrIHVzaW5nIFN0YWNrLmNyZWF0ZShuKSIpO3RoaXMuaGVhcD1uZXcgbihlKSx0aGlzLmxlbmd0aD0wfXN0YXRpYyBjcmVhdGUoZSl7Y29uc3Qgbj1WaShlKTtpZighbilyZXR1cm5bXTtDKHdlLEZlLCEwKTtjb25zdCByPW5ldyB3ZShlLG4pO3JldHVybiBDKHdlLEZlLCExKSxyfXB1c2goZSl7dGhpcy5oZWFwW3RoaXMubGVuZ3RoKytdPWV9cG9wKCl7cmV0dXJuIHRoaXMuaGVhcFstLXRoaXMubGVuZ3RoXX19O2xldCBkbj13ZTtGZT1uZXcgV2Vha01hcCxVKGRuLEZlLCExKTtjb25zdCBvcj1jbGFzc3tjb25zdHJ1Y3RvcihlKXtVKHRoaXMsJGUpO1UodGhpcyxFbik7VSh0aGlzLCR0KTtVKHRoaXMsVnQpO1UodGhpcyxXZSk7VSh0aGlzLE1lKTtVKHRoaXMsQ2UpO1UodGhpcyxZKTtVKHRoaXMsWGUpO1UodGhpcyxsZSk7VSh0aGlzLEl0LHZvaWQgMCk7VSh0aGlzLFJ0LHZvaWQgMCk7VSh0aGlzLE50LHZvaWQgMCk7VSh0aGlzLE10LHZvaWQgMCk7VSh0aGlzLEllLHZvaWQgMCk7dih0aGlzLCJ0dGwiKTt2KHRoaXMsInR0bFJlc29sdXRpb24iKTt2KHRoaXMsInR0bEF1dG9wdXJnZSIpO3YodGhpcywidXBkYXRlQWdlT25HZXQiKTt2KHRoaXMsInVwZGF0ZUFnZU9uSGFzIik7dih0aGlzLCJhbGxvd1N0YWxlIik7dih0aGlzLCJub0Rpc3Bvc2VPblNldCIpO3YodGhpcywibm9VcGRhdGVUVEwiKTt2KHRoaXMsIm1heEVudHJ5U2l6ZSIpO3YodGhpcywic2l6ZUNhbGN1bGF0aW9uIik7dih0aGlzLCJub0RlbGV0ZU9uRmV0Y2hSZWplY3Rpb24iKTt2KHRoaXMsIm5vRGVsZXRlT25TdGFsZUdldCIpO3YodGhpcywiYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydCIpO3YodGhpcywiYWxsb3dTdGFsZU9uRmV0Y2hSZWplY3Rpb24iKTt2KHRoaXMsImlnbm9yZUZldGNoQWJvcnQiKTtVKHRoaXMsdXQsdm9pZCAwKTtVKHRoaXMsQ3Qsdm9pZCAwKTtVKHRoaXMsYXQsdm9pZCAwKTtVKHRoaXMsdHQsdm9pZCAwKTtVKHRoaXMsTCx2b2lkIDApO1UodGhpcyxfdCx2b2lkIDApO1UodGhpcyx4dCx2b2lkIDApO1UodGhpcyxFdCx2b2lkIDApO1UodGhpcyxodCx2b2lkIDApO1UodGhpcyx2dCx2b2lkIDApO1UodGhpcyxmdCx2b2lkIDApO1UodGhpcyxEdCx2b2lkIDApO1UodGhpcyxMdCx2b2lkIDApO1UodGhpcyxPdCx2b2lkIDApO1UodGhpcyxQdCx2b2lkIDApO1UodGhpcyxKdCx2b2lkIDApO1UodGhpcyxwdCx2b2lkIDApO1UodGhpcyxoZSwoKT0+e30pO1UodGhpcyxIdCwoKT0+e30pO1UodGhpcyxWZSwoKT0+e30pO1UodGhpcyxidCwoKT0+ITEpO1UodGhpcyxmZSxlPT57fSk7VSh0aGlzLE5lLChlLG4scik9Pnt9KTtVKHRoaXMsemUsKGUsbixyLGkpPT57aWYocnx8aSl0aHJvdyBuZXcgVHlwZUVycm9yKCJjYW5ub3Qgc2V0IHNpemUgd2l0aG91dCBzZXR0aW5nIG1heFNpemUgb3IgbWF4RW50cnlTaXplIG9uIGNhY2hlIik7cmV0dXJuIDB9KTt2KHRoaXMsUjAsIkxSVUNhY2hlIik7Y29uc3R7bWF4Om49MCx0dGw6cix0dGxSZXNvbHV0aW9uOmk9MSx0dGxBdXRvcHVyZ2U6byx1cGRhdGVBZ2VPbkdldDpzLHVwZGF0ZUFnZU9uSGFzOnUsYWxsb3dTdGFsZTphLGRpc3Bvc2U6bCxkaXNwb3NlQWZ0ZXI6ZCxub0Rpc3Bvc2VPblNldDpfLG5vVXBkYXRlVFRMOk8sbWF4U2l6ZTpiPTAsbWF4RW50cnlTaXplOkY9MCxzaXplQ2FsY3VsYXRpb246UyxmZXRjaE1ldGhvZDpOLG5vRGVsZXRlT25GZXRjaFJlamVjdGlvbjpnLG5vRGVsZXRlT25TdGFsZUdldDpHLGFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uOkssYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydDpWLGlnbm9yZUZldGNoQWJvcnQ6aXR9PWU7aWYobiE9PTAmJiFRdChuKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtYXggb3B0aW9uIG11c3QgYmUgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIik7Y29uc3QgbHQ9bj9WaShuKTpBcnJheTtpZighbHQpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIG1heCB2YWx1ZTogIituKTtpZihDKHRoaXMsSXQsbiksQyh0aGlzLFJ0LGIpLHRoaXMubWF4RW50cnlTaXplPUZ8fGModGhpcyxSdCksdGhpcy5zaXplQ2FsY3VsYXRpb249Uyx0aGlzLnNpemVDYWxjdWxhdGlvbil7aWYoIWModGhpcyxSdCkmJiF0aGlzLm1heEVudHJ5U2l6ZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJjYW5ub3Qgc2V0IHNpemVDYWxjdWxhdGlvbiB3aXRob3V0IHNldHRpbmcgbWF4U2l6ZSBvciBtYXhFbnRyeVNpemUiKTtpZih0eXBlb2YgdGhpcy5zaXplQ2FsY3VsYXRpb24hPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcigic2l6ZUNhbGN1bGF0aW9uIHNldCB0byBub24tZnVuY3Rpb24iKX1pZihOIT09dm9pZCAwJiZ0eXBlb2YgTiE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKCJmZXRjaE1ldGhvZCBtdXN0IGJlIGEgZnVuY3Rpb24gaWYgc3BlY2lmaWVkIik7aWYoQyh0aGlzLEllLE4pLEModGhpcyxKdCwhIU4pLEModGhpcyxhdCxuZXcgTWFwKSxDKHRoaXMsdHQsbmV3IEFycmF5KG4pLmZpbGwodm9pZCAwKSksQyh0aGlzLEwsbmV3IEFycmF5KG4pLmZpbGwodm9pZCAwKSksQyh0aGlzLF90LG5ldyBsdChuKSksQyh0aGlzLHh0LG5ldyBsdChuKSksQyh0aGlzLEV0LDApLEModGhpcyxodCwwKSxDKHRoaXMsdnQsZG4uY3JlYXRlKG4pKSxDKHRoaXMsdXQsMCksQyh0aGlzLEN0LDApLHR5cGVvZiBsPT0iZnVuY3Rpb24iJiZDKHRoaXMsTnQsbCksdHlwZW9mIGQ9PSJmdW5jdGlvbiI/KEModGhpcyxNdCxkKSxDKHRoaXMsZnQsW10pKTooQyh0aGlzLE10LHZvaWQgMCksQyh0aGlzLGZ0LHZvaWQgMCkpLEModGhpcyxQdCwhIWModGhpcyxOdCkpLEModGhpcyxwdCwhIWModGhpcyxNdCkpLHRoaXMubm9EaXNwb3NlT25TZXQ9ISFfLHRoaXMubm9VcGRhdGVUVEw9ISFPLHRoaXMubm9EZWxldGVPbkZldGNoUmVqZWN0aW9uPSEhZyx0aGlzLmFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uPSEhSyx0aGlzLmFsbG93U3RhbGVPbkZldGNoQWJvcnQ9ISFWLHRoaXMuaWdub3JlRmV0Y2hBYm9ydD0hIWl0LHRoaXMubWF4RW50cnlTaXplIT09MCl7aWYoYyh0aGlzLFJ0KSE9PTAmJiFRdChjKHRoaXMsUnQpKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtYXhTaXplIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIGlmIHNwZWNpZmllZCIpO2lmKCFRdCh0aGlzLm1heEVudHJ5U2l6ZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigibWF4RW50cnlTaXplIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIGlmIHNwZWNpZmllZCIpO3codGhpcyxFbixxaSkuY2FsbCh0aGlzKX1pZih0aGlzLmFsbG93U3RhbGU9ISFhLHRoaXMubm9EZWxldGVPblN0YWxlR2V0PSEhRyx0aGlzLnVwZGF0ZUFnZU9uR2V0PSEhcyx0aGlzLnVwZGF0ZUFnZU9uSGFzPSEhdSx0aGlzLnR0bFJlc29sdXRpb249UXQoaSl8fGk9PT0wP2k6MSx0aGlzLnR0bEF1dG9wdXJnZT0hIW8sdGhpcy50dGw9cnx8MCx0aGlzLnR0bCl7aWYoIVF0KHRoaXMudHRsKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJ0dGwgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgaWYgc3BlY2lmaWVkIik7dyh0aGlzLCRlLHVyKS5jYWxsKHRoaXMpfWlmKGModGhpcyxJdCk9PT0wJiZ0aGlzLnR0bD09PTAmJmModGhpcyxSdCk9PT0wKXRocm93IG5ldyBUeXBlRXJyb3IoIkF0IGxlYXN0IG9uZSBvZiBtYXgsIG1heFNpemUsIG9yIHR0bCBpcyByZXF1aXJlZCIpO2lmKCF0aGlzLnR0bEF1dG9wdXJnZSYmIWModGhpcyxJdCkmJiFjKHRoaXMsUnQpKXtjb25zdCBydD0iTFJVX0NBQ0hFX1VOQk9VTkRFRCI7czAocnQpJiYoamkuYWRkKHJ0KSxHaSgiVFRMIGNhY2hpbmcgd2l0aG91dCB0dGxBdXRvcHVyZ2UsIG1heCwgb3IgbWF4U2l6ZSBjYW4gcmVzdWx0IGluIHVuYm91bmRlZCBtZW1vcnkgY29uc3VtcHRpb24uIiwiVW5ib3VuZGVkQ2FjaGVXYXJuaW5nIixydCxvcikpfX1zdGF0aWMgdW5zYWZlRXhwb3NlSW50ZXJuYWxzKGUpe3JldHVybntzdGFydHM6YyhlLEx0KSx0dGxzOmMoZSxPdCksc2l6ZXM6YyhlLER0KSxrZXlNYXA6YyhlLGF0KSxrZXlMaXN0OmMoZSx0dCksdmFsTGlzdDpjKGUsTCksbmV4dDpjKGUsX3QpLHByZXY6YyhlLHh0KSxnZXQgaGVhZCgpe3JldHVybiBjKGUsRXQpfSxnZXQgdGFpbCgpe3JldHVybiBjKGUsaHQpfSxmcmVlOmMoZSx2dCksaXNCYWNrZ3JvdW5kRmV0Y2g6bj0+e3ZhciByO3JldHVybiB3KHI9ZSxZLGV0KS5jYWxsKHIsbil9LGJhY2tncm91bmRGZXRjaDoobixyLGksbyk9Pnt2YXIgcztyZXR1cm4gdyhzPWUsQ2UsVG4pLmNhbGwocyxuLHIsaSxvKX0sbW92ZVRvVGFpbDpuPT57dmFyIHI7cmV0dXJuIHcocj1lLGxlLHFlKS5jYWxsKHIsbil9LGluZGV4ZXM6bj0+e3ZhciByO3JldHVybiB3KHI9ZSwkdCx0ZSkuY2FsbChyLG4pfSxyaW5kZXhlczpuPT57dmFyIHI7cmV0dXJuIHcocj1lLFZ0LGVlKS5jYWxsKHIsbil9LGlzU3RhbGU6bj0+e3ZhciByO3JldHVybiBjKHI9ZSxidCkuY2FsbChyLG4pfX19Z2V0IG1heCgpe3JldHVybiBjKHRoaXMsSXQpfWdldCBtYXhTaXplKCl7cmV0dXJuIGModGhpcyxSdCl9Z2V0IGNhbGN1bGF0ZWRTaXplKCl7cmV0dXJuIGModGhpcyxDdCl9Z2V0IHNpemUoKXtyZXR1cm4gYyh0aGlzLHV0KX1nZXQgZmV0Y2hNZXRob2QoKXtyZXR1cm4gYyh0aGlzLEllKX1nZXQgZGlzcG9zZSgpe3JldHVybiBjKHRoaXMsTnQpfWdldCBkaXNwb3NlQWZ0ZXIoKXtyZXR1cm4gYyh0aGlzLE10KX1nZXRSZW1haW5pbmdUVEwoZSl7cmV0dXJuIGModGhpcyxhdCkuaGFzKGUpPzEvMDowfSplbnRyaWVzKCl7Zm9yKGNvbnN0IGUgb2Ygdyh0aGlzLCR0LHRlKS5jYWxsKHRoaXMpKWModGhpcyxMKVtlXSE9PXZvaWQgMCYmYyh0aGlzLHR0KVtlXSE9PXZvaWQgMCYmIXcodGhpcyxZLGV0KS5jYWxsKHRoaXMsYyh0aGlzLEwpW2VdKSYmKHlpZWxkW2ModGhpcyx0dClbZV0sYyh0aGlzLEwpW2VdXSl9KnJlbnRyaWVzKCl7Zm9yKGNvbnN0IGUgb2Ygdyh0aGlzLFZ0LGVlKS5jYWxsKHRoaXMpKWModGhpcyxMKVtlXSE9PXZvaWQgMCYmYyh0aGlzLHR0KVtlXSE9PXZvaWQgMCYmIXcodGhpcyxZLGV0KS5jYWxsKHRoaXMsYyh0aGlzLEwpW2VdKSYmKHlpZWxkW2ModGhpcyx0dClbZV0sYyh0aGlzLEwpW2VdXSl9KmtleXMoKXtmb3IoY29uc3QgZSBvZiB3KHRoaXMsJHQsdGUpLmNhbGwodGhpcykpe2NvbnN0IG49Yyh0aGlzLHR0KVtlXTtuIT09dm9pZCAwJiYhdyh0aGlzLFksZXQpLmNhbGwodGhpcyxjKHRoaXMsTClbZV0pJiYoeWllbGQgbil9fSpya2V5cygpe2Zvcihjb25zdCBlIG9mIHcodGhpcyxWdCxlZSkuY2FsbCh0aGlzKSl7Y29uc3Qgbj1jKHRoaXMsdHQpW2VdO24hPT12b2lkIDAmJiF3KHRoaXMsWSxldCkuY2FsbCh0aGlzLGModGhpcyxMKVtlXSkmJih5aWVsZCBuKX19KnZhbHVlcygpe2Zvcihjb25zdCBlIG9mIHcodGhpcywkdCx0ZSkuY2FsbCh0aGlzKSljKHRoaXMsTClbZV0hPT12b2lkIDAmJiF3KHRoaXMsWSxldCkuY2FsbCh0aGlzLGModGhpcyxMKVtlXSkmJih5aWVsZCBjKHRoaXMsTClbZV0pfSpydmFsdWVzKCl7Zm9yKGNvbnN0IGUgb2Ygdyh0aGlzLFZ0LGVlKS5jYWxsKHRoaXMpKWModGhpcyxMKVtlXSE9PXZvaWQgMCYmIXcodGhpcyxZLGV0KS5jYWxsKHRoaXMsYyh0aGlzLEwpW2VdKSYmKHlpZWxkIGModGhpcyxMKVtlXSl9W1N5bWJvbC5pdGVyYXRvcl0oKXtyZXR1cm4gdGhpcy5lbnRyaWVzKCl9ZmluZChlLG49e30pe2Zvcihjb25zdCByIG9mIHcodGhpcywkdCx0ZSkuY2FsbCh0aGlzKSl7Y29uc3QgaT1jKHRoaXMsTClbcl0sbz13KHRoaXMsWSxldCkuY2FsbCh0aGlzLGkpP2kuX19zdGFsZVdoaWxlRmV0Y2hpbmc6aTtpZihvIT09dm9pZCAwJiZlKG8sYyh0aGlzLHR0KVtyXSx0aGlzKSlyZXR1cm4gdGhpcy5nZXQoYyh0aGlzLHR0KVtyXSxuKX19Zm9yRWFjaChlLG49dGhpcyl7Zm9yKGNvbnN0IHIgb2Ygdyh0aGlzLCR0LHRlKS5jYWxsKHRoaXMpKXtjb25zdCBpPWModGhpcyxMKVtyXSxvPXcodGhpcyxZLGV0KS5jYWxsKHRoaXMsaSk/aS5fX3N0YWxlV2hpbGVGZXRjaGluZzppO28hPT12b2lkIDAmJmUuY2FsbChuLG8sYyh0aGlzLHR0KVtyXSx0aGlzKX19cmZvckVhY2goZSxuPXRoaXMpe2Zvcihjb25zdCByIG9mIHcodGhpcyxWdCxlZSkuY2FsbCh0aGlzKSl7Y29uc3QgaT1jKHRoaXMsTClbcl0sbz13KHRoaXMsWSxldCkuY2FsbCh0aGlzLGkpP2kuX19zdGFsZVdoaWxlRmV0Y2hpbmc6aTtvIT09dm9pZCAwJiZlLmNhbGwobixvLGModGhpcyx0dClbcl0sdGhpcyl9fXB1cmdlU3RhbGUoKXtsZXQgZT0hMTtmb3IoY29uc3QgbiBvZiB3KHRoaXMsVnQsZWUpLmNhbGwodGhpcyx7YWxsb3dTdGFsZTohMH0pKWModGhpcyxidCkuY2FsbCh0aGlzLG4pJiYodGhpcy5kZWxldGUoYyh0aGlzLHR0KVtuXSksZT0hMCk7cmV0dXJuIGV9aW5mbyhlKXtjb25zdCBuPWModGhpcyxhdCkuZ2V0KGUpO2lmKG49PT12b2lkIDApcmV0dXJuO2NvbnN0IHI9Yyh0aGlzLEwpW25dLGk9dyh0aGlzLFksZXQpLmNhbGwodGhpcyxyKT9yLl9fc3RhbGVXaGlsZUZldGNoaW5nOnI7aWYoaT09PXZvaWQgMClyZXR1cm47Y29uc3Qgbz17dmFsdWU6aX07aWYoYyh0aGlzLE90KSYmYyh0aGlzLEx0KSl7Y29uc3Qgcz1jKHRoaXMsT3QpW25dLHU9Yyh0aGlzLEx0KVtuXTtpZihzJiZ1KXtjb25zdCBhPXMtKG1lLm5vdygpLXUpO28udHRsPWEsby5zdGFydD1EYXRlLm5vdygpfX1yZXR1cm4gYyh0aGlzLER0KSYmKG8uc2l6ZT1jKHRoaXMsRHQpW25dKSxvfWR1bXAoKXtjb25zdCBlPVtdO2Zvcihjb25zdCBuIG9mIHcodGhpcywkdCx0ZSkuY2FsbCh0aGlzLHthbGxvd1N0YWxlOiEwfSkpe2NvbnN0IHI9Yyh0aGlzLHR0KVtuXSxpPWModGhpcyxMKVtuXSxvPXcodGhpcyxZLGV0KS5jYWxsKHRoaXMsaSk/aS5fX3N0YWxlV2hpbGVGZXRjaGluZzppO2lmKG89PT12b2lkIDB8fHI9PT12b2lkIDApY29udGludWU7Y29uc3Qgcz17dmFsdWU6b307aWYoYyh0aGlzLE90KSYmYyh0aGlzLEx0KSl7cy50dGw9Yyh0aGlzLE90KVtuXTtjb25zdCB1PW1lLm5vdygpLWModGhpcyxMdClbbl07cy5zdGFydD1NYXRoLmZsb29yKERhdGUubm93KCktdSl9Yyh0aGlzLER0KSYmKHMuc2l6ZT1jKHRoaXMsRHQpW25dKSxlLnVuc2hpZnQoW3Isc10pfXJldHVybiBlfWxvYWQoZSl7dGhpcy5jbGVhcigpO2Zvcihjb25zdFtuLHJdb2YgZSl7aWYoci5zdGFydCl7Y29uc3QgaT1EYXRlLm5vdygpLXIuc3RhcnQ7ci5zdGFydD1tZS5ub3coKS1pfXRoaXMuc2V0KG4sci52YWx1ZSxyKX19c2V0KGUsbixyPXt9KXt2YXIgTyxiLEYsUyxOO2lmKG49PT12b2lkIDApcmV0dXJuIHRoaXMuZGVsZXRlKGUpLHRoaXM7Y29uc3R7dHRsOmk9dGhpcy50dGwsc3RhcnQ6byxub0Rpc3Bvc2VPblNldDpzPXRoaXMubm9EaXNwb3NlT25TZXQsc2l6ZUNhbGN1bGF0aW9uOnU9dGhpcy5zaXplQ2FsY3VsYXRpb24sc3RhdHVzOmF9PXI7bGV0e25vVXBkYXRlVFRMOmw9dGhpcy5ub1VwZGF0ZVRUTH09cjtjb25zdCBkPWModGhpcyx6ZSkuY2FsbCh0aGlzLGUsbixyLnNpemV8fDAsdSk7aWYodGhpcy5tYXhFbnRyeVNpemUmJmQ+dGhpcy5tYXhFbnRyeVNpemUpcmV0dXJuIGEmJihhLnNldD0ibWlzcyIsYS5tYXhFbnRyeVNpemVFeGNlZWRlZD0hMCksdGhpcy5kZWxldGUoZSksdGhpcztsZXQgXz1jKHRoaXMsdXQpPT09MD92b2lkIDA6Yyh0aGlzLGF0KS5nZXQoZSk7aWYoXz09PXZvaWQgMClfPWModGhpcyx1dCk9PT0wP2ModGhpcyxodCk6Yyh0aGlzLHZ0KS5sZW5ndGghPT0wP2ModGhpcyx2dCkucG9wKCk6Yyh0aGlzLHV0KT09PWModGhpcyxJdCk/dyh0aGlzLE1lLEFuKS5jYWxsKHRoaXMsITEpOmModGhpcyx1dCksYyh0aGlzLHR0KVtfXT1lLGModGhpcyxMKVtfXT1uLGModGhpcyxhdCkuc2V0KGUsXyksYyh0aGlzLF90KVtjKHRoaXMsaHQpXT1fLGModGhpcyx4dClbX109Yyh0aGlzLGh0KSxDKHRoaXMsaHQsXykseW4odGhpcyx1dCkuXysrLGModGhpcyxOZSkuY2FsbCh0aGlzLF8sZCxhKSxhJiYoYS5zZXQ9ImFkZCIpLGw9ITE7ZWxzZXt3KHRoaXMsbGUscWUpLmNhbGwodGhpcyxfKTtjb25zdCBnPWModGhpcyxMKVtfXTtpZihuIT09Zyl7aWYoYyh0aGlzLEp0KSYmdyh0aGlzLFksZXQpLmNhbGwodGhpcyxnKSl7Zy5fX2Fib3J0Q29udHJvbGxlci5hYm9ydChuZXcgRXJyb3IoInJlcGxhY2VkIikpO2NvbnN0e19fc3RhbGVXaGlsZUZldGNoaW5nOkd9PWc7RyE9PXZvaWQgMCYmIXMmJihjKHRoaXMsUHQpJiYoKE89Yyh0aGlzLE50KSk9PW51bGx8fE8uY2FsbCh0aGlzLEcsZSwic2V0IikpLGModGhpcyxwdCkmJigoYj1jKHRoaXMsZnQpKT09bnVsbHx8Yi5wdXNoKFtHLGUsInNldCJdKSkpfWVsc2Ugc3x8KGModGhpcyxQdCkmJigoRj1jKHRoaXMsTnQpKT09bnVsbHx8Ri5jYWxsKHRoaXMsZyxlLCJzZXQiKSksYyh0aGlzLHB0KSYmKChTPWModGhpcyxmdCkpPT1udWxsfHxTLnB1c2goW2csZSwic2V0Il0pKSk7aWYoYyh0aGlzLGZlKS5jYWxsKHRoaXMsXyksYyh0aGlzLE5lKS5jYWxsKHRoaXMsXyxkLGEpLGModGhpcyxMKVtfXT1uLGEpe2Euc2V0PSJyZXBsYWNlIjtjb25zdCBHPWcmJncodGhpcyxZLGV0KS5jYWxsKHRoaXMsZyk/Zy5fX3N0YWxlV2hpbGVGZXRjaGluZzpnO0chPT12b2lkIDAmJihhLm9sZFZhbHVlPUcpfX1lbHNlIGEmJihhLnNldD0idXBkYXRlIil9aWYoaSE9PTAmJiFjKHRoaXMsT3QpJiZ3KHRoaXMsJGUsdXIpLmNhbGwodGhpcyksYyh0aGlzLE90KSYmKGx8fGModGhpcyxWZSkuY2FsbCh0aGlzLF8saSxvKSxhJiZjKHRoaXMsSHQpLmNhbGwodGhpcyxhLF8pKSwhcyYmYyh0aGlzLHB0KSYmYyh0aGlzLGZ0KSl7Y29uc3QgZz1jKHRoaXMsZnQpO2xldCBHO2Zvcig7Rz1nPT1udWxsP3ZvaWQgMDpnLnNoaWZ0KCk7KShOPWModGhpcyxNdCkpPT1udWxsfHxOLmNhbGwodGhpcywuLi5HKX1yZXR1cm4gdGhpc31wb3AoKXt2YXIgZTt0cnl7Zm9yKDtjKHRoaXMsdXQpOyl7Y29uc3Qgbj1jKHRoaXMsTClbYyh0aGlzLEV0KV07aWYodyh0aGlzLE1lLEFuKS5jYWxsKHRoaXMsITApLHcodGhpcyxZLGV0KS5jYWxsKHRoaXMsbikpe2lmKG4uX19zdGFsZVdoaWxlRmV0Y2hpbmcpcmV0dXJuIG4uX19zdGFsZVdoaWxlRmV0Y2hpbmd9ZWxzZSBpZihuIT09dm9pZCAwKXJldHVybiBufX1maW5hbGx5e2lmKGModGhpcyxwdCkmJmModGhpcyxmdCkpe2NvbnN0IG49Yyh0aGlzLGZ0KTtsZXQgcjtmb3IoO3I9bj09bnVsbD92b2lkIDA6bi5zaGlmdCgpOykoZT1jKHRoaXMsTXQpKT09bnVsbHx8ZS5jYWxsKHRoaXMsLi4ucil9fX1oYXMoZSxuPXt9KXtjb25zdHt1cGRhdGVBZ2VPbkhhczpyPXRoaXMudXBkYXRlQWdlT25IYXMsc3RhdHVzOml9PW4sbz1jKHRoaXMsYXQpLmdldChlKTtpZihvIT09dm9pZCAwKXtjb25zdCBzPWModGhpcyxMKVtvXTtpZih3KHRoaXMsWSxldCkuY2FsbCh0aGlzLHMpJiZzLl9fc3RhbGVXaGlsZUZldGNoaW5nPT09dm9pZCAwKXJldHVybiExO2lmKGModGhpcyxidCkuY2FsbCh0aGlzLG8pKWkmJihpLmhhcz0ic3RhbGUiLGModGhpcyxIdCkuY2FsbCh0aGlzLGksbykpO2Vsc2UgcmV0dXJuIHImJmModGhpcyxoZSkuY2FsbCh0aGlzLG8pLGkmJihpLmhhcz0iaGl0IixjKHRoaXMsSHQpLmNhbGwodGhpcyxpLG8pKSwhMH1lbHNlIGkmJihpLmhhcz0ibWlzcyIpO3JldHVybiExfXBlZWsoZSxuPXt9KXtjb25zdHthbGxvd1N0YWxlOnI9dGhpcy5hbGxvd1N0YWxlfT1uLGk9Yyh0aGlzLGF0KS5nZXQoZSk7aWYoaT09PXZvaWQgMHx8IXImJmModGhpcyxidCkuY2FsbCh0aGlzLGkpKXJldHVybjtjb25zdCBvPWModGhpcyxMKVtpXTtyZXR1cm4gdyh0aGlzLFksZXQpLmNhbGwodGhpcyxvKT9vLl9fc3RhbGVXaGlsZUZldGNoaW5nOm99YXN5bmMgZmV0Y2goZSxuPXt9KXtjb25zdHthbGxvd1N0YWxlOnI9dGhpcy5hbGxvd1N0YWxlLHVwZGF0ZUFnZU9uR2V0Omk9dGhpcy51cGRhdGVBZ2VPbkdldCxub0RlbGV0ZU9uU3RhbGVHZXQ6bz10aGlzLm5vRGVsZXRlT25TdGFsZUdldCx0dGw6cz10aGlzLnR0bCxub0Rpc3Bvc2VPblNldDp1PXRoaXMubm9EaXNwb3NlT25TZXQsc2l6ZTphPTAsc2l6ZUNhbGN1bGF0aW9uOmw9dGhpcy5zaXplQ2FsY3VsYXRpb24sbm9VcGRhdGVUVEw6ZD10aGlzLm5vVXBkYXRlVFRMLG5vRGVsZXRlT25GZXRjaFJlamVjdGlvbjpfPXRoaXMubm9EZWxldGVPbkZldGNoUmVqZWN0aW9uLGFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uOk89dGhpcy5hbGxvd1N0YWxlT25GZXRjaFJlamVjdGlvbixpZ25vcmVGZXRjaEFib3J0OmI9dGhpcy5pZ25vcmVGZXRjaEFib3J0LGFsbG93U3RhbGVPbkZldGNoQWJvcnQ6Rj10aGlzLmFsbG93U3RhbGVPbkZldGNoQWJvcnQsY29udGV4dDpTLGZvcmNlUmVmcmVzaDpOPSExLHN0YXR1czpnLHNpZ25hbDpHfT1uO2lmKCFjKHRoaXMsSnQpKXJldHVybiBnJiYoZy5mZXRjaD0iZ2V0IiksdGhpcy5nZXQoZSx7YWxsb3dTdGFsZTpyLHVwZGF0ZUFnZU9uR2V0Omksbm9EZWxldGVPblN0YWxlR2V0Om8sc3RhdHVzOmd9KTtjb25zdCBLPXthbGxvd1N0YWxlOnIsdXBkYXRlQWdlT25HZXQ6aSxub0RlbGV0ZU9uU3RhbGVHZXQ6byx0dGw6cyxub0Rpc3Bvc2VPblNldDp1LHNpemU6YSxzaXplQ2FsY3VsYXRpb246bCxub1VwZGF0ZVRUTDpkLG5vRGVsZXRlT25GZXRjaFJlamVjdGlvbjpfLGFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uOk8sYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydDpGLGlnbm9yZUZldGNoQWJvcnQ6YixzdGF0dXM6ZyxzaWduYWw6R307bGV0IFY9Yyh0aGlzLGF0KS5nZXQoZSk7aWYoVj09PXZvaWQgMCl7ZyYmKGcuZmV0Y2g9Im1pc3MiKTtjb25zdCBpdD13KHRoaXMsQ2UsVG4pLmNhbGwodGhpcyxlLFYsSyxTKTtyZXR1cm4gaXQuX19yZXR1cm5lZD1pdH1lbHNle2NvbnN0IGl0PWModGhpcyxMKVtWXTtpZih3KHRoaXMsWSxldCkuY2FsbCh0aGlzLGl0KSl7Y29uc3QgQj1yJiZpdC5fX3N0YWxlV2hpbGVGZXRjaGluZyE9PXZvaWQgMDtyZXR1cm4gZyYmKGcuZmV0Y2g9ImluZmxpZ2h0IixCJiYoZy5yZXR1cm5lZFN0YWxlPSEwKSksQj9pdC5fX3N0YWxlV2hpbGVGZXRjaGluZzppdC5fX3JldHVybmVkPWl0fWNvbnN0IGx0PWModGhpcyxidCkuY2FsbCh0aGlzLFYpO2lmKCFOJiYhbHQpcmV0dXJuIGcmJihnLmZldGNoPSJoaXQiKSx3KHRoaXMsbGUscWUpLmNhbGwodGhpcyxWKSxpJiZjKHRoaXMsaGUpLmNhbGwodGhpcyxWKSxnJiZjKHRoaXMsSHQpLmNhbGwodGhpcyxnLFYpLGl0O2NvbnN0IHJ0PXcodGhpcyxDZSxUbikuY2FsbCh0aGlzLGUsVixLLFMpLFQ9cnQuX19zdGFsZVdoaWxlRmV0Y2hpbmchPT12b2lkIDAmJnI7cmV0dXJuIGcmJihnLmZldGNoPWx0PyJzdGFsZSI6InJlZnJlc2giLFQmJmx0JiYoZy5yZXR1cm5lZFN0YWxlPSEwKSksVD9ydC5fX3N0YWxlV2hpbGVGZXRjaGluZzpydC5fX3JldHVybmVkPXJ0fX1nZXQoZSxuPXt9KXtjb25zdHthbGxvd1N0YWxlOnI9dGhpcy5hbGxvd1N0YWxlLHVwZGF0ZUFnZU9uR2V0Omk9dGhpcy51cGRhdGVBZ2VPbkdldCxub0RlbGV0ZU9uU3RhbGVHZXQ6bz10aGlzLm5vRGVsZXRlT25TdGFsZUdldCxzdGF0dXM6c309bix1PWModGhpcyxhdCkuZ2V0KGUpO2lmKHUhPT12b2lkIDApe2NvbnN0IGE9Yyh0aGlzLEwpW3VdLGw9dyh0aGlzLFksZXQpLmNhbGwodGhpcyxhKTtyZXR1cm4gcyYmYyh0aGlzLEh0KS5jYWxsKHRoaXMscyx1KSxjKHRoaXMsYnQpLmNhbGwodGhpcyx1KT8ocyYmKHMuZ2V0PSJzdGFsZSIpLGw/KHMmJnImJmEuX19zdGFsZVdoaWxlRmV0Y2hpbmchPT12b2lkIDAmJihzLnJldHVybmVkU3RhbGU9ITApLHI/YS5fX3N0YWxlV2hpbGVGZXRjaGluZzp2b2lkIDApOihvfHx0aGlzLmRlbGV0ZShlKSxzJiZyJiYocy5yZXR1cm5lZFN0YWxlPSEwKSxyP2E6dm9pZCAwKSk6KHMmJihzLmdldD0iaGl0IiksbD9hLl9fc3RhbGVXaGlsZUZldGNoaW5nOih3KHRoaXMsbGUscWUpLmNhbGwodGhpcyx1KSxpJiZjKHRoaXMsaGUpLmNhbGwodGhpcyx1KSxhKSl9ZWxzZSBzJiYocy5nZXQ9Im1pc3MiKX1kZWxldGUoZSl7dmFyIHIsaSxvLHM7bGV0IG49ITE7aWYoYyh0aGlzLHV0KSE9PTApe2NvbnN0IHU9Yyh0aGlzLGF0KS5nZXQoZSk7aWYodSE9PXZvaWQgMClpZihuPSEwLGModGhpcyx1dCk9PT0xKXRoaXMuY2xlYXIoKTtlbHNle2ModGhpcyxmZSkuY2FsbCh0aGlzLHUpO2NvbnN0IGE9Yyh0aGlzLEwpW3VdO2lmKHcodGhpcyxZLGV0KS5jYWxsKHRoaXMsYSk/YS5fX2Fib3J0Q29udHJvbGxlci5hYm9ydChuZXcgRXJyb3IoImRlbGV0ZWQiKSk6KGModGhpcyxQdCl8fGModGhpcyxwdCkpJiYoYyh0aGlzLFB0KSYmKChyPWModGhpcyxOdCkpPT1udWxsfHxyLmNhbGwodGhpcyxhLGUsImRlbGV0ZSIpKSxjKHRoaXMscHQpJiYoKGk9Yyh0aGlzLGZ0KSk9PW51bGx8fGkucHVzaChbYSxlLCJkZWxldGUiXSkpKSxjKHRoaXMsYXQpLmRlbGV0ZShlKSxjKHRoaXMsdHQpW3VdPXZvaWQgMCxjKHRoaXMsTClbdV09dm9pZCAwLHU9PT1jKHRoaXMsaHQpKUModGhpcyxodCxjKHRoaXMseHQpW3VdKTtlbHNlIGlmKHU9PT1jKHRoaXMsRXQpKUModGhpcyxFdCxjKHRoaXMsX3QpW3VdKTtlbHNle2NvbnN0IGw9Yyh0aGlzLHh0KVt1XTtjKHRoaXMsX3QpW2xdPWModGhpcyxfdClbdV07Y29uc3QgZD1jKHRoaXMsX3QpW3VdO2ModGhpcyx4dClbZF09Yyh0aGlzLHh0KVt1XX15bih0aGlzLHV0KS5fLS0sYyh0aGlzLHZ0KS5wdXNoKHUpfX1pZihjKHRoaXMscHQpJiYoKG89Yyh0aGlzLGZ0KSkhPW51bGwmJm8ubGVuZ3RoKSl7Y29uc3QgdT1jKHRoaXMsZnQpO2xldCBhO2Zvcig7YT11PT1udWxsP3ZvaWQgMDp1LnNoaWZ0KCk7KShzPWModGhpcyxNdCkpPT1udWxsfHxzLmNhbGwodGhpcywuLi5hKX1yZXR1cm4gbn1jbGVhcigpe3ZhciBlLG4scjtmb3IoY29uc3QgaSBvZiB3KHRoaXMsVnQsZWUpLmNhbGwodGhpcyx7YWxsb3dTdGFsZTohMH0pKXtjb25zdCBvPWModGhpcyxMKVtpXTtpZih3KHRoaXMsWSxldCkuY2FsbCh0aGlzLG8pKW8uX19hYm9ydENvbnRyb2xsZXIuYWJvcnQobmV3IEVycm9yKCJkZWxldGVkIikpO2Vsc2V7Y29uc3Qgcz1jKHRoaXMsdHQpW2ldO2ModGhpcyxQdCkmJigoZT1jKHRoaXMsTnQpKT09bnVsbHx8ZS5jYWxsKHRoaXMsbyxzLCJkZWxldGUiKSksYyh0aGlzLHB0KSYmKChuPWModGhpcyxmdCkpPT1udWxsfHxuLnB1c2goW28scywiZGVsZXRlIl0pKX19aWYoYyh0aGlzLGF0KS5jbGVhcigpLGModGhpcyxMKS5maWxsKHZvaWQgMCksYyh0aGlzLHR0KS5maWxsKHZvaWQgMCksYyh0aGlzLE90KSYmYyh0aGlzLEx0KSYmKGModGhpcyxPdCkuZmlsbCgwKSxjKHRoaXMsTHQpLmZpbGwoMCkpLGModGhpcyxEdCkmJmModGhpcyxEdCkuZmlsbCgwKSxDKHRoaXMsRXQsMCksQyh0aGlzLGh0LDApLGModGhpcyx2dCkubGVuZ3RoPTAsQyh0aGlzLEN0LDApLEModGhpcyx1dCwwKSxjKHRoaXMscHQpJiZjKHRoaXMsZnQpKXtjb25zdCBpPWModGhpcyxmdCk7bGV0IG87Zm9yKDtvPWk9PW51bGw/dm9pZCAwOmkuc2hpZnQoKTspKHI9Yyh0aGlzLE10KSk9PW51bGx8fHIuY2FsbCh0aGlzLC4uLm8pfX19O2xldCBpcj1vcjtSMD1TeW1ib2wudG9TdHJpbmdUYWcsSXQ9bmV3IFdlYWtNYXAsUnQ9bmV3IFdlYWtNYXAsTnQ9bmV3IFdlYWtNYXAsTXQ9bmV3IFdlYWtNYXAsSWU9bmV3IFdlYWtNYXAsdXQ9bmV3IFdlYWtNYXAsQ3Q9bmV3IFdlYWtNYXAsYXQ9bmV3IFdlYWtNYXAsdHQ9bmV3IFdlYWtNYXAsTD1uZXcgV2Vha01hcCxfdD1uZXcgV2Vha01hcCx4dD1uZXcgV2Vha01hcCxFdD1uZXcgV2Vha01hcCxodD1uZXcgV2Vha01hcCx2dD1uZXcgV2Vha01hcCxmdD1uZXcgV2Vha01hcCxEdD1uZXcgV2Vha01hcCxMdD1uZXcgV2Vha01hcCxPdD1uZXcgV2Vha01hcCxQdD1uZXcgV2Vha01hcCxKdD1uZXcgV2Vha01hcCxwdD1uZXcgV2Vha01hcCwkZT1uZXcgV2Vha1NldCx1cj1mdW5jdGlvbigpe2NvbnN0IGU9bmV3IGxuKGModGhpcyxJdCkpLG49bmV3IGxuKGModGhpcyxJdCkpO0ModGhpcyxPdCxlKSxDKHRoaXMsTHQsbiksQyh0aGlzLFZlLChvLHMsdT1tZS5ub3coKSk9PntpZihuW29dPXMhPT0wP3U6MCxlW29dPXMscyE9PTAmJnRoaXMudHRsQXV0b3B1cmdlKXtjb25zdCBhPXNldFRpbWVvdXQoKCk9PntjKHRoaXMsYnQpLmNhbGwodGhpcyxvKSYmdGhpcy5kZWxldGUoYyh0aGlzLHR0KVtvXSl9LHMrMSk7YS51bnJlZiYmYS51bnJlZigpfX0pLEModGhpcyxoZSxvPT57bltvXT1lW29dIT09MD9tZS5ub3coKTowfSksQyh0aGlzLEh0LChvLHMpPT57aWYoZVtzXSl7Y29uc3QgdT1lW3NdLGE9bltzXTtpZighdXx8IWEpcmV0dXJuO28udHRsPXUsby5zdGFydD1hLG8ubm93PXJ8fGkoKTtjb25zdCBsPW8ubm93LWE7by5yZW1haW5pbmdUVEw9dS1sfX0pO2xldCByPTA7Y29uc3QgaT0oKT0+e2NvbnN0IG89bWUubm93KCk7aWYodGhpcy50dGxSZXNvbHV0aW9uPjApe3I9bztjb25zdCBzPXNldFRpbWVvdXQoKCk9PnI9MCx0aGlzLnR0bFJlc29sdXRpb24pO3MudW5yZWYmJnMudW5yZWYoKX1yZXR1cm4gb307dGhpcy5nZXRSZW1haW5pbmdUVEw9bz0+e2NvbnN0IHM9Yyh0aGlzLGF0KS5nZXQobyk7aWYocz09PXZvaWQgMClyZXR1cm4gMDtjb25zdCB1PWVbc10sYT1uW3NdO2lmKCF1fHwhYSlyZXR1cm4gMS8wO2NvbnN0IGw9KHJ8fGkoKSktYTtyZXR1cm4gdS1sfSxDKHRoaXMsYnQsbz0+e2NvbnN0IHM9bltvXSx1PWVbb107cmV0dXJuISF1JiYhIXMmJihyfHxpKCkpLXM+dX0pfSxoZT1uZXcgV2Vha01hcCxIdD1uZXcgV2Vha01hcCxWZT1uZXcgV2Vha01hcCxidD1uZXcgV2Vha01hcCxFbj1uZXcgV2Vha1NldCxxaT1mdW5jdGlvbigpe2NvbnN0IGU9bmV3IGxuKGModGhpcyxJdCkpO0ModGhpcyxDdCwwKSxDKHRoaXMsRHQsZSksQyh0aGlzLGZlLG49PntDKHRoaXMsQ3QsYyh0aGlzLEN0KS1lW25dKSxlW25dPTB9KSxDKHRoaXMsemUsKG4scixpLG8pPT57aWYodyh0aGlzLFksZXQpLmNhbGwodGhpcyxyKSlyZXR1cm4gMDtpZighUXQoaSkpaWYobyl7aWYodHlwZW9mIG8hPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcigic2l6ZUNhbGN1bGF0aW9uIG11c3QgYmUgYSBmdW5jdGlvbiIpO2lmKGk9byhyLG4pLCFRdChpKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJzaXplQ2FsY3VsYXRpb24gcmV0dXJuIGludmFsaWQgKGV4cGVjdCBwb3NpdGl2ZSBpbnRlZ2VyKSIpfWVsc2UgdGhyb3cgbmV3IFR5cGVFcnJvcigiaW52YWxpZCBzaXplIHZhbHVlIChtdXN0IGJlIHBvc2l0aXZlIGludGVnZXIpLiBXaGVuIG1heFNpemUgb3IgbWF4RW50cnlTaXplIGlzIHVzZWQsIHNpemVDYWxjdWxhdGlvbiBvciBzaXplIG11c3QgYmUgc2V0LiIpO3JldHVybiBpfSksQyh0aGlzLE5lLChuLHIsaSk9PntpZihlW25dPXIsYyh0aGlzLFJ0KSl7Y29uc3Qgbz1jKHRoaXMsUnQpLWVbbl07Zm9yKDtjKHRoaXMsQ3QpPm87KXcodGhpcyxNZSxBbikuY2FsbCh0aGlzLCEwKX1DKHRoaXMsQ3QsYyh0aGlzLEN0KStlW25dKSxpJiYoaS5lbnRyeVNpemU9cixpLnRvdGFsQ2FsY3VsYXRlZFNpemU9Yyh0aGlzLEN0KSl9KX0sZmU9bmV3IFdlYWtNYXAsTmU9bmV3IFdlYWtNYXAsemU9bmV3IFdlYWtNYXAsJHQ9bmV3IFdlYWtTZXQsdGU9ZnVuY3Rpb24qKHthbGxvd1N0YWxlOmU9dGhpcy5hbGxvd1N0YWxlfT17fSl7aWYoYyh0aGlzLHV0KSlmb3IobGV0IG49Yyh0aGlzLGh0KTshKCF3KHRoaXMsV2UsY3IpLmNhbGwodGhpcyxuKXx8KChlfHwhYyh0aGlzLGJ0KS5jYWxsKHRoaXMsbikpJiYoeWllbGQgbiksbj09PWModGhpcyxFdCkpKTspbj1jKHRoaXMseHQpW25dfSxWdD1uZXcgV2Vha1NldCxlZT1mdW5jdGlvbiooe2FsbG93U3RhbGU6ZT10aGlzLmFsbG93U3RhbGV9PXt9KXtpZihjKHRoaXMsdXQpKWZvcihsZXQgbj1jKHRoaXMsRXQpOyEoIXcodGhpcyxXZSxjcikuY2FsbCh0aGlzLG4pfHwoKGV8fCFjKHRoaXMsYnQpLmNhbGwodGhpcyxuKSkmJih5aWVsZCBuKSxuPT09Yyh0aGlzLGh0KSkpOyluPWModGhpcyxfdClbbl19LFdlPW5ldyBXZWFrU2V0LGNyPWZ1bmN0aW9uKGUpe3JldHVybiBlIT09dm9pZCAwJiZjKHRoaXMsYXQpLmdldChjKHRoaXMsdHQpW2VdKT09PWV9LE1lPW5ldyBXZWFrU2V0LEFuPWZ1bmN0aW9uKGUpe3ZhciBvLHM7Y29uc3Qgbj1jKHRoaXMsRXQpLHI9Yyh0aGlzLHR0KVtuXSxpPWModGhpcyxMKVtuXTtyZXR1cm4gYyh0aGlzLEp0KSYmdyh0aGlzLFksZXQpLmNhbGwodGhpcyxpKT9pLl9fYWJvcnRDb250cm9sbGVyLmFib3J0KG5ldyBFcnJvcigiZXZpY3RlZCIpKTooYyh0aGlzLFB0KXx8Yyh0aGlzLHB0KSkmJihjKHRoaXMsUHQpJiYoKG89Yyh0aGlzLE50KSk9PW51bGx8fG8uY2FsbCh0aGlzLGksciwiZXZpY3QiKSksYyh0aGlzLHB0KSYmKChzPWModGhpcyxmdCkpPT1udWxsfHxzLnB1c2goW2ksciwiZXZpY3QiXSkpKSxjKHRoaXMsZmUpLmNhbGwodGhpcyxuKSxlJiYoYyh0aGlzLHR0KVtuXT12b2lkIDAsYyh0aGlzLEwpW25dPXZvaWQgMCxjKHRoaXMsdnQpLnB1c2gobikpLGModGhpcyx1dCk9PT0xPyhDKHRoaXMsRXQsQyh0aGlzLGh0LDApKSxjKHRoaXMsdnQpLmxlbmd0aD0wKTpDKHRoaXMsRXQsYyh0aGlzLF90KVtuXSksYyh0aGlzLGF0KS5kZWxldGUocikseW4odGhpcyx1dCkuXy0tLG59LENlPW5ldyBXZWFrU2V0LFRuPWZ1bmN0aW9uKGUsbixyLGkpe2NvbnN0IG89bj09PXZvaWQgMD92b2lkIDA6Yyh0aGlzLEwpW25dO2lmKHcodGhpcyxZLGV0KS5jYWxsKHRoaXMsbykpcmV0dXJuIG87Y29uc3Qgcz1uZXcgZm4se3NpZ25hbDp1fT1yO3U9PW51bGx8fHUuYWRkRXZlbnRMaXN0ZW5lcigiYWJvcnQiLCgpPT5zLmFib3J0KHUucmVhc29uKSx7c2lnbmFsOnMuc2lnbmFsfSk7Y29uc3QgYT17c2lnbmFsOnMuc2lnbmFsLG9wdGlvbnM6cixjb250ZXh0Oml9LGw9KFMsTj0hMSk9Pntjb25zdHthYm9ydGVkOmd9PXMuc2lnbmFsLEc9ci5pZ25vcmVGZXRjaEFib3J0JiZTIT09dm9pZCAwO2lmKHIuc3RhdHVzJiYoZyYmIU4/KHIuc3RhdHVzLmZldGNoQWJvcnRlZD0hMCxyLnN0YXR1cy5mZXRjaEVycm9yPXMuc2lnbmFsLnJlYXNvbixHJiYoci5zdGF0dXMuZmV0Y2hBYm9ydElnbm9yZWQ9ITApKTpyLnN0YXR1cy5mZXRjaFJlc29sdmVkPSEwKSxnJiYhRyYmIU4pcmV0dXJuIF8ocy5zaWduYWwucmVhc29uKTtjb25zdCBLPWI7cmV0dXJuIGModGhpcyxMKVtuXT09PWImJihTPT09dm9pZCAwP0suX19zdGFsZVdoaWxlRmV0Y2hpbmc/Yyh0aGlzLEwpW25dPUsuX19zdGFsZVdoaWxlRmV0Y2hpbmc6dGhpcy5kZWxldGUoZSk6KHIuc3RhdHVzJiYoci5zdGF0dXMuZmV0Y2hVcGRhdGVkPSEwKSx0aGlzLnNldChlLFMsYS5vcHRpb25zKSkpLFN9LGQ9Uz0+KHIuc3RhdHVzJiYoci5zdGF0dXMuZmV0Y2hSZWplY3RlZD0hMCxyLnN0YXR1cy5mZXRjaEVycm9yPVMpLF8oUykpLF89Uz0+e2NvbnN0e2Fib3J0ZWQ6Tn09cy5zaWduYWwsZz1OJiZyLmFsbG93U3RhbGVPbkZldGNoQWJvcnQsRz1nfHxyLmFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uLEs9R3x8ci5ub0RlbGV0ZU9uRmV0Y2hSZWplY3Rpb24sVj1iO2lmKGModGhpcyxMKVtuXT09PWImJighS3x8Vi5fX3N0YWxlV2hpbGVGZXRjaGluZz09PXZvaWQgMD90aGlzLmRlbGV0ZShlKTpnfHwoYyh0aGlzLEwpW25dPVYuX19zdGFsZVdoaWxlRmV0Y2hpbmcpKSxHKXJldHVybiByLnN0YXR1cyYmVi5fX3N0YWxlV2hpbGVGZXRjaGluZyE9PXZvaWQgMCYmKHIuc3RhdHVzLnJldHVybmVkU3RhbGU9ITApLFYuX19zdGFsZVdoaWxlRmV0Y2hpbmc7aWYoVi5fX3JldHVybmVkPT09Vil0aHJvdyBTfSxPPShTLE4pPT57dmFyIEc7Y29uc3QgZz0oRz1jKHRoaXMsSWUpKT09bnVsbD92b2lkIDA6Ry5jYWxsKHRoaXMsZSxvLGEpO2cmJmcgaW5zdGFuY2VvZiBQcm9taXNlJiZnLnRoZW4oSz0+UyhLPT09dm9pZCAwP3ZvaWQgMDpLKSxOKSxzLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsKCk9PnsoIXIuaWdub3JlRmV0Y2hBYm9ydHx8ci5hbGxvd1N0YWxlT25GZXRjaEFib3J0KSYmKFModm9pZCAwKSxyLmFsbG93U3RhbGVPbkZldGNoQWJvcnQmJihTPUs9PmwoSywhMCkpKX0pfTtyLnN0YXR1cyYmKHIuc3RhdHVzLmZldGNoRGlzcGF0Y2hlZD0hMCk7Y29uc3QgYj1uZXcgUHJvbWlzZShPKS50aGVuKGwsZCksRj1PYmplY3QuYXNzaWduKGIse19fYWJvcnRDb250cm9sbGVyOnMsX19zdGFsZVdoaWxlRmV0Y2hpbmc6byxfX3JldHVybmVkOnZvaWQgMH0pO3JldHVybiBuPT09dm9pZCAwPyh0aGlzLnNldChlLEYsey4uLmEub3B0aW9ucyxzdGF0dXM6dm9pZCAwfSksbj1jKHRoaXMsYXQpLmdldChlKSk6Yyh0aGlzLEwpW25dPUYsRn0sWT1uZXcgV2Vha1NldCxldD1mdW5jdGlvbihlKXtpZighYyh0aGlzLEp0KSlyZXR1cm4hMTtjb25zdCBuPWU7cmV0dXJuISFuJiZuIGluc3RhbmNlb2YgUHJvbWlzZSYmbi5oYXNPd25Qcm9wZXJ0eSgiX19zdGFsZVdoaWxlRmV0Y2hpbmciKSYmbi5fX2Fib3J0Q29udHJvbGxlciBpbnN0YW5jZW9mIGZufSxYZT1uZXcgV2Vha1NldCxocj1mdW5jdGlvbihlLG4pe2ModGhpcyx4dClbbl09ZSxjKHRoaXMsX3QpW2VdPW59LGxlPW5ldyBXZWFrU2V0LHFlPWZ1bmN0aW9uKGUpe2UhPT1jKHRoaXMsaHQpJiYoZT09PWModGhpcyxFdCk/Qyh0aGlzLEV0LGModGhpcyxfdClbZV0pOncodGhpcyxYZSxocikuY2FsbCh0aGlzLGModGhpcyx4dClbZV0sYyh0aGlzLF90KVtlXSksdyh0aGlzLFhlLGhyKS5jYWxsKHRoaXMsYyh0aGlzLGh0KSxlKSxDKHRoaXMsaHQsZSkpfTtjb25zdCB6aT1uZXcgaXIoe21heDoxZTN9KSxhMD0odCxlLG4pPT57Y29uc3Qgcj1KU09OLnN0cmluZ2lmeSh0LnByb3BlcnRpZXMpLGk9emkuZ2V0KHIpO2lmKGkpcmV0dXJuIGk7Y29uc3Qgbz0oKCk9Pntzd2l0Y2gocmUudHlwZXNbdC50eXBlXSl7Y2FzZSJQb2x5Z29uIjpyZXR1cm4icG9seWdvbiI7Y2FzZSJMaW5lU3RyaW5nIjpyZXR1cm4icG9seWxpbmUiO2Nhc2UiUG9pbnQiOnJldHVybiJtYXJrZXIiO2RlZmF1bHQ6cmV0dXJufX0pKCkscz0oKCk9PntpZigobj09bnVsbD92b2lkIDA6bi50eXBlKSE9PSJzaW1wbGUifHwhbylyZXR1cm47Y29uc3QgYT11MCgiIix0LGUsbyk7aWYoYSlyZXR1cm4gaG49PW51bGw/dm9pZCAwOmhuKG4sYSl9KSgpLHU9KCgpPT57aWYobz09PSJwb2x5Z29uIil7Y29uc3QgYT1zPT1udWxsP3ZvaWQgMDpzLnBvbHlnb247cmV0dXJue2ZpbGxTdHlsZTooKGE9PW51bGw/dm9pZCAwOmEuZmlsbCk/PyEwKSYmKChhPT1udWxsP3ZvaWQgMDphLnNob3cpPz8hMCk/YT09bnVsbD92b2lkIDA6YS5maWxsQ29sb3I6InJnYmEoMCwwLDAsMCkiLHN0cm9rZVN0eWxlOmEhPW51bGwmJmEuc3Ryb2tlJiYoKGE9PW51bGw/dm9pZCAwOmEuc2hvdyk/PyEwKT9hPT1udWxsP3ZvaWQgMDphLnN0cm9rZUNvbG9yOiJyZ2JhKDAsMCwwLDApIixsaW5lV2lkdGg6YT09bnVsbD92b2lkIDA6YS5zdHJva2VXaWR0aCxsaW5lSm9pbjphPT1udWxsP3ZvaWQgMDphLmxpbmVKb2lufX1pZihvPT09InBvbHlsaW5lIil7Y29uc3QgYT1zPT1udWxsP3ZvaWQgMDpzLnBvbHlsaW5lO3JldHVybntmaWxsU3R5bGU6KChhPT1udWxsP3ZvaWQgMDphLnN0cm9rZUNvbG9yKT8/ITApJiYoKGE9PW51bGw/dm9pZCAwOmEuc2hvdyk/PyEwKT9hPT1udWxsP3ZvaWQgMDphLnN0cm9rZUNvbG9yOiJyZ2JhKDAsMCwwLDApIixzdHJva2VTdHlsZTphIT1udWxsJiZhLnN0cm9rZUNvbG9yJiYoKGE9PW51bGw/dm9pZCAwOmEuc2hvdyk/PyEwKT9hPT1udWxsP3ZvaWQgMDphLnN0cm9rZUNvbG9yOiJyZ2JhKDAsMCwwLDApIixsaW5lV2lkdGg6YT09bnVsbD92b2lkIDA6YS5zdHJva2VXaWR0aH19aWYobz09PSJtYXJrZXIiKXtjb25zdCBhPXM9PW51bGw/dm9pZCAwOnMubWFya2VyO3JldHVybntmaWxsU3R5bGU6KChhPT1udWxsP3ZvaWQgMDphLnBvaW50Q29sb3IpPz8hMCkmJigoYT09bnVsbD92b2lkIDA6YS5zaG93KT8/ITApP2E9PW51bGw/dm9pZCAwOmEucG9pbnRDb2xvcjoicmdiYSgwLDAsMCwwKSIsc3Ryb2tlU3R5bGU6YSE9bnVsbCYmYS5wb2ludENvbG9yJiYoKGE9PW51bGw/dm9pZCAwOmEuc2hvdyk/PyEwKT9hPT1udWxsP3ZvaWQgMDphLnBvaW50Q29sb3I6InJnYmEoMCwwLDAsMCkiLGxpbmVXaWR0aDphPT1udWxsP3ZvaWQgMDphLnBvaW50U2l6ZX19fSkoKTtyZXR1cm4gemkuc2V0KHIsdSksdX0sdTA9KHQsZSxuLHIpPT57Y29uc3QgaT1lLmxvYWRHZW9tZXRyeSgpLFtvLHNdPSgoKT0+e2lmKHI9PT0icG9seWdvbiIpcmV0dXJuWyJQb2x5Z29uIixpLm1hcCh1PT51Lm1hcChhPT5bYS54LGEueV0pKV07aWYocj09PSJwb2x5bGluZSIpcmV0dXJuWyJMaW5lU3RyaW5nIixpWzBdLm1hcCh1PT5bdS54LHUueV0pXTtpZihyPT09Im1hcmtlciIpcmV0dXJuWyJQb2ludCIsW2lbMF1bMF0ueCxpWzBdWzBdLnldXTt0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgYXBwZWFyYW5jZSAke3J9YCl9KSgpO3JldHVybnt0eXBlOiJmZWF0dXJlIixpZDp0LGdlb21ldHJ5Ont0eXBlOm8sY29vcmRpbmF0ZXM6c30scHJvcGVydGllczplLnByb3BlcnRpZXMscmFuZ2U6e3g6bi54LHk6bi55LHo6bi5sZXZlbH19fTtmdW5jdGlvbiBjMCh0KXtyZXR1cm4gZjAodCk9PT1ibi5DT1VOVEVSX0NMT0NLV0lTRX1mdW5jdGlvbiBXaSh0LGUpe2NvbnN0IG49dC54LHI9dC55O2xldCBpPSExO2ZvcihsZXQgbz0wLHM9ZS5sZW5ndGgtMTtvPGUubGVuZ3RoO3M9bysrKXtjb25zdCB1PWVbb10ueCxhPWVbb10ueSxsPWVbc10ueCxkPWVbc10ueTthPnIhPWQ+ciYmbjwobC11KSooci1hKS8oZC1hKSt1JiYoaT0haSl9cmV0dXJuIGl9ZnVuY3Rpb24gaDAodCxlKXtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKylpZihXaShlLHRbbl0pKXtsZXQgcj0hMTtmb3IoO24rMTx0Lmxlbmd0aCYmIWMwKHRbbisxXSk7KW4rKywhciYmV2koZSx0W25dKSYmKHI9ITApO2lmKCFyKXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIGYwKHQpe2NvbnN0IGU9dC5sZW5ndGg7bGV0IG49dFtlLTFdLngqKHRbMF0ueS10W2UtMl0ueSkrdFswXS54Kih0WzFdLnktdFtlLTFdLnkpO2ZvcihsZXQgcj0xO3I8PWUtMjtyKyspbis9dFtyXS54Kih0W3IrMV0ueS10W3ItMV0ueSk7aWYoaXNOYU4obikpdGhyb3cgbmV3IEVycm9yO3JldHVybiBuPjA/Ym4uQ09VTlRFUl9DTE9DS1dJU0U6Ym4uQ0xPQ0tXSVNFfWNvbnN0IEdlPTI1NjtjbGFzcyBsMHtjb25zdHJ1Y3RvcihlKXt2KHRoaXMsIl91cmxUZW1wbGF0ZSIpO3YodGhpcywiX3BhcnNlVGlsZSIpO3YodGhpcywiX3RpbGluZ1NjaGVtZSIpO3YodGhpcywiX2xheWVyTmFtZXMiKTt2KHRoaXMsIl90aWxlV2lkdGgiKTt2KHRoaXMsIl90aWxlSGVpZ2h0Iik7dih0aGlzLCJfdGlsZUNhY2hlcyIpO3RoaXMuX3BhcnNlVGlsZT1kMCx0aGlzLl91cmxUZW1wbGF0ZT1lLnVybFRlbXBsYXRlLHRoaXMuX3RpbGVXaWR0aD1HZSx0aGlzLl90aWxlSGVpZ2h0PUdlLHRoaXMuX2xheWVyTmFtZXM9ZS5sYXllck5hbWVzLHRoaXMuX3RpbGluZ1NjaGVtZT1uZXcga3R9YXN5bmMgcmVuZGVyKGUsbixyLGkpe2NvbnN0IG89WGkodGhpcy5fdXJsVGVtcGxhdGUsbik7YXdhaXQgUHJvbWlzZS5hbGwodGhpcy5fbGF5ZXJOYW1lcy5tYXAocz0+dGhpcy5fcmVuZGVyQ2FudmFzKG8sZSxuLHMscixpKSkpfWFzeW5jIF9yZW5kZXJDYW52YXMoZSxuLHIsaSxvLHMpe2lmKCFlKXJldHVybjtjb25zdCB1PWF3YWl0IHRoaXMuX2NhY2hlZFRpbGUoZSksbD1pLnNwbGl0KC8sICovKS5maWx0ZXIoQm9vbGVhbikubWFwKGQ9PnU9PW51bGw/dm9pZCAwOnUubGF5ZXJzW2RdKTtsJiYobi5zdHJva2VTdHlsZT0iYmxhY2siLG4uZmlsbFN0eWxlPSJibGFjayIsbi5saW5lV2lkdGg9MSxuLm1pdGVyTGltaXQ9MixuLnNldFRyYW5zZm9ybSh0aGlzLl90aWxlV2lkdGgqby9HZSwwLDAsdGhpcy5fdGlsZUhlaWdodCpvL0dlLDAsMCksbC5mb3JFYWNoKGQ9PntpZighZClyZXR1cm47Y29uc3QgXz1HZS9kLmV4dGVudDtmb3IobGV0IE89MDtPPGQubGVuZ3RoO08rKyl7Y29uc3QgYj1kLmZlYXR1cmUoTyksRj1hMChiLHIscyk7aWYoIUYpY29udGludWU7bi5maWxsU3R5bGU9Ri5maWxsU3R5bGU/P24uZmlsbFN0eWxlLG4uc3Ryb2tlU3R5bGU9Ri5zdHJva2VTdHlsZT8/bi5zdHJva2VTdHlsZSxuLmxpbmVXaWR0aD1GLmxpbmVXaWR0aD8/bi5saW5lV2lkdGgsbi5saW5lSm9pbj1GLmxpbmVKb2luPz9uLmxpbmVKb2luO2NvbnN0IFM9Yi5sb2FkR2VvbWV0cnkoKTtyZS50eXBlc1tiLnR5cGVdPT09IlBvbHlnb24iP3RoaXMuX3JlbmRlclBvbHlnb24obixTLF8sKEYubGluZVdpZHRoPz8xKT4wKTpyZS50eXBlc1tiLnR5cGVdPT09IlBvaW50Ij90aGlzLl9yZW5kZXJQb2ludChuLFMsXyk6cmUudHlwZXNbYi50eXBlXT09PSJMaW5lU3RyaW5nIj90aGlzLl9yZW5kZXJMaW5lU3RyaW5nKG4sUyxfKTpjb25zb2xlLmVycm9yKGBVbmV4cGVjdGVkIGdlb21ldHJ5IHR5cGU6ICR7Yi50eXBlfSBpbiByZWdpb24gbWFwIG9uIHRpbGUgJHtbci5sZXZlbCxyLngsci55XS5qb2luKCIvIil9YCl9fSkpfV9yZW5kZXJQb2x5Z29uKGUsbixyLGkpe2UuYmVnaW5QYXRoKCk7Y29uc3Qgbz0oKT0+e2kmJmUuc3Ryb2tlKCksZS5maWxsKCl9O2xldCBzPTA7Zm9yKGxldCB1PTA7dTxuLmxlbmd0aDt1Kyspe2NvbnN0IGE9blt1XTtzK2EubGVuZ3RoPjU0MDAmJihvKCkscz0wLGUuYmVnaW5QYXRoKCkpO2xldCBsPWFbMF07ZS5tb3ZlVG8obC54KnIsbC55KnIpO2ZvcihsZXQgZD0xO2Q8YS5sZW5ndGg7ZCsrKWw9YVtkXSxlLmxpbmVUbyhsLngqcixsLnkqcik7cys9YS5sZW5ndGh9cz4wJiZvKCl9X3JlbmRlclBvaW50KGUsbixyKXtlLmJlZ2luUGF0aCgpO2ZvcihsZXQgaT0wO2k8bi5sZW5ndGg7aSsrKXtjb25zdCBvPW5baV1bMF0sW3MsdV09W28ueCpyLG8ueSpyXSxhPWUubGluZVdpZHRoO2UuYmVnaW5QYXRoKCksZS5hcmMocyx1LGEsMCwyKk1hdGguUEkpLGUuZmlsbCgpfX1fcmVuZGVyTGluZVN0cmluZyhlLG4scil7ZS5iZWdpblBhdGgoKTtmb3IobGV0IGk9MDtpPG4ubGVuZ3RoO2krKyl7bGV0IG89bltpXVswXTtlLm1vdmVUbyhvLngqcixvLnkqcik7Zm9yKGxldCBzPTE7czxuW2ldLmxlbmd0aDtzKyspbz1uW2ldW3NdLGUubGluZVRvKG8ueCpyLG8ueSpyKX1lLnN0cm9rZSgpfXBpY2tGZWF0dXJlcyhlLG4scixpKXtjb25zdCBvPVhpKHRoaXMuX3VybFRlbXBsYXRlLGUpO3JldHVybiB0aGlzLl9waWNrRmVhdHVyZXNGcm9tTGF5ZXIobyxlLG4scixpKX1hc3luYyBfcGlja0ZlYXR1cmVzRnJvbUxheWVyKGUsbixyLGksbyl7dHJ5e2NvbnN0IHM9YXdhaXQgdGhpcy5fY2FjaGVkVGlsZShlKTtyZXR1cm4gcz8oYXdhaXQgUHJvbWlzZS5hbGwodGhpcy5fbGF5ZXJOYW1lcy5tYXAoYXN5bmMgYT0+e2NvbnN0IGw9cy5sYXllcnNbYV07aWYoIWwpcmV0dXJuW107Y29uc3QgZD1hd2FpdCB0aGlzLl9waWNrRmVhdHVyZXMobixyLGksbCxvKTtyZXR1cm4gZHx8W119KSkpLmZsYXQoKTpbXX1jYXRjaHtyZXR1cm5bXX19YXN5bmMgX3BpY2tGZWF0dXJlcyhlLG4scixpLG8pe2NvbnN0IHM9dGhpcy5fdGlsaW5nU2NoZW1lLnRpbGVYWVRvTmF0aXZlUmVjdGFuZ2xlKGUueCxlLnksZS5sZXZlbCksdT1bcy53ZXN0LHMuZWFzdF0sYT1bcy5ub3J0aCxzLnNvdXRoXSxsPWZ1bmN0aW9uKEYsUyxOLGcsRyl7Y29uc3QgSz1uZXcgQTtBLnN1YnRyYWN0KEYsbmV3IEEoU1swXSxOWzBdKSxLKTtjb25zdCBWPW5ldyBBKChnWzFdLWdbMF0pLyhTWzFdLVNbMF0pLChHWzFdLUdbMF0pLyhOWzFdLU5bMF0pKTtyZXR1cm4gQS5hZGQoQS5tdWx0aXBseUNvbXBvbmVudHMoSyxWLG5ldyBBKSxuZXcgQShnWzBdLEdbMF0pLG5ldyBBKX0sZD1bXSxfPVswLGkuZXh0ZW50LTFdLE89bChBLmZyb21DYXJ0ZXNpYW4zKHRoaXMuX3RpbGluZ1NjaGVtZS5wcm9qZWN0aW9uLnByb2plY3QobmV3IEgobixyKSkpLHUsYSxfLF8pLGI9bmV3IFNyKE8ueCxPLnkpO2ZvcihsZXQgRj0wO0Y8aS5sZW5ndGg7RisrKXtjb25zdCBTPWkuZmVhdHVyZShGKTtpZihyZS50eXBlc1tTLnR5cGVdPT09IlBvbHlnb24iJiZoMChTLmxvYWRHZW9tZXRyeSgpLGIpKXtjb25zdCBOPXIwKFMsZSxvKTtOJiZkLnB1c2goTil9fXJldHVybiBkfWFzeW5jIF9jYWNoZWRUaWxlKGUpe3ZhciBuLHI7aWYoZSl7aWYoKG49dGhpcy5fdGlsZUNhY2hlcykhPW51bGwmJm4uaGFzKGUpKXJldHVybiB0aGlzLl90aWxlQ2FjaGVzLmdldChlKTt0cnl7Y29uc3QgaT1wMChhd2FpdCB0aGlzLl9wYXJzZVRpbGUoZSkpO3JldHVybiBpJiYoKHI9dGhpcy5fdGlsZUNhY2hlcyk9PW51bGx8fHIuc2V0KGUsaSkpLGl9Y2F0Y2h7cmV0dXJufX19Y2xlYXJDYWNoZSgpe3ZhciBlOyhlPXRoaXMuX3RpbGVDYWNoZXMpPT1udWxsfHxlLmNsZWFyKCl9fWNvbnN0IGQwPWFzeW5jIHQ9Pnt0cnl7Y29uc3QgZT1hd2FpdCBfMCh0KTtyZXR1cm4gZT9FMChlKTp2b2lkIDB9Y2F0Y2h7cmV0dXJufX0sRTA9dD0+bmV3IFhvKG5ldyBIbyh0KSksXzA9YXN5bmMgdD0+e2lmKCF0KXtjb25zb2xlLmVycm9yKCJmZXRjaCByZXF1ZXN0IGZhaWxlZCBiZWNhdXNlIHJlcXVlc3QgdXJsIGlzIHVuZGVmaW5lZCIpO3JldHVybn10cnl7Y29uc3QgZT1hd2FpdCBmZXRjaCh0KTtyZXR1cm4gZS5vaz9hd2FpdCBlLmFycmF5QnVmZmVyKCk6dm9pZCAwfWNhdGNoe3JldHVybn19LHAwPXQ9Pnt2YXIgbjtpZighdClyZXR1cm47Y29uc3QgZT17fTtmb3IoY29uc3RbcixpXW9mIE9iamVjdC5lbnRyaWVzKHQubGF5ZXJzKSl7Y29uc3Qgbz1bXSxzPWk7Zm9yKGxldCB1PTA7dTxzLmxlbmd0aDt1Kyspe2NvbnN0IGE9cy5mZWF0dXJlKHUpO2xldCBsO2NvbnN0IGQ9KG49YS5iYm94KT09bnVsbD92b2lkIDA6bi5jYWxsKGEpLF89ey4uLmEsaWQ6YS5pZCxsb2FkR2VvbWV0cnk6KCk9PihsfHwobD1hLmxvYWRHZW9tZXRyeSgpKSxsKSxiYm94OmQ/KCk9PmQ6dm9pZCAwLHRvR2VvSlNPTjphLnRvR2VvSlNPTn07by5wdXNoKF8pfWVbcl09ey4uLnMsZmVhdHVyZTp1PT5vW3VdfX1yZXR1cm57bGF5ZXJzOmV9fSxYaT0odCxlKT0+ZGVjb2RlVVJJQ29tcG9uZW50KHQpLnJlcGxhY2UoInt6fSIsU3RyaW5nKGUubGV2ZWwpKS5yZXBsYWNlKCJ7eH0iLFN0cmluZyhlLngpKS5yZXBsYWNlKCJ7eX0iLFN0cmluZyhlLnkpKSx5MD1uZXcgTWFwO2Z1bmN0aW9uIEEwKHt1cmxUZW1wbGF0ZTp0LG1heGltdW1MZXZlbDplfSl7cmV0dXJuYCR7dH06JHtlfWB9YXN5bmMgZnVuY3Rpb24gVDAodCl7Y29uc3QgZT1BMCh0KTtsZXQgbjtyZXR1cm4gbj09bnVsbCYmKG49bmV3IGwwKHQpLHkwLnNldChlLG4pKSxufW9vKHtyZW5kZXJUaWxlOmFzeW5jKHtyZXF1ZXN0ZWRUaWxlOnQsY2FudmFzOmUsc2NhbGVGYWN0b3I6biwuLi5yfSk9Pntjb25zdCBpPWUuZ2V0Q29udGV4dCgiMmQiKTtpZighaSlyZXR1cm47Y29uc3Qgbz1hd2FpdCBUMChyKTthd2FpdCBvLnJlbmRlcihpLHQsbixyLmN1cnJlbnRMYXllciksby5jbGVhckNhY2hlKCksYXdhaXQgbmV3IFByb21pc2Uocz0+e3JlcXVlc3RBbmltYXRpb25GcmFtZShzKX0pfX0pfSkoKTsK",nc=typeof window<"u"&&window.Blob&&new Blob([atob(rd)],{type:"text/javascript;charset=utf-8"});function Cm(){const t=nc&&(window.URL||window.webkitURL).createObjectURL(nc);try{return t?new Worker(t):new Worker("data:application/javascript;base64,"+rd)}finally{t&&(window.URL||window.webkitURL).revokeObjectURL(t)}}const xe=[];function Km(t){let n=xe.find(o=>o.layerId===t);return n==null&&(n=Ym(async()=>await Um(new Cm),{size:Math.ceil(navigator.hardwareConcurrency/4)}),n.layerId=t,xe.push(n)),n}function gm(t,n){return Km(n).queue(o=>t(o,n))}function Nm(t,n){const o=xe.find(s=>s.layerId===t);return o==null||o.taskQueue.length<n}async function Mm(t){const n=xe.findIndex(o=>o.layerId===t);n!==-1&&(await xe[n].terminate(!0),xe.splice(n,1))}async function Hm(t){var n;const{canvas:o,...s}=t,c=o.transferControlToOffscreen();await gm(async d=>{await d.renderTile(Jm({canvas:c,...s},[c]))},(n=t.currentLayer)==null?void 0:n.id)}let Be;const ki=class{constructor(t){Y(this,"taskCount",0),Y(this,"tileCache"),Y(this,"_minimumLevel"),Y(this,"_maximumLevel"),Y(this,"_credit"),Y(this,"_resolution"),Y(this,"_tilingScheme"),Y(this,"_tileWidth"),Y(this,"_tileHeight"),Y(this,"_rectangle"),Y(this,"_ready"),Y(this,"_readyPromise",Promise.resolve(!0)),Y(this,"_errorEvent",new Cesium$1.Event),Y(this,"_currentLayer"),Y(this,"_useWorker"),Y(this,"_urlTemplate"),Y(this,"_layerNames"),this._minimumLevel=t.minimumLevel??0,this._maximumLevel=t.maximumLevel??24,this._credit=t.credit,this._resolution=t.resolution??10,this._tilingScheme=new Cesium$1.WebMercatorTilingScheme,this._tileWidth=ue,this._tileHeight=ue,this._rectangle=this._tilingScheme.rectangle,this._ready=!0,this._urlTemplate=t.urlTemplate,this._layerNames=t.layerName.split(/, */).filter(Boolean),this._currentLayer=t.layer,this._useWorker=t.worker??!1}get tileWidth(){return this._tileWidth}get tileHeight(){return this._tileHeight}get maximumLevel(){return this._maximumLevel}get minimumLevel(){return this._minimumLevel}get tilingScheme(){return this._tilingScheme}get rectangle(){return this._rectangle}get errorEvent(){return this._errorEvent}get ready(){return this._ready}get hasAlphaChannel(){return!0}get credit(){return this._credit?new Cesium$1.Credit(this._credit):void 0}get defaultNightAlpha(){}get defaultDayAlpha(){}get defaultAlpha(){}get defaultBrightness(){}get defaultContrast(){}get defaultHue(){}get defaultSaturation(){}get defaultGamma(){}get defaultMinificationFilter(){}get defaultMagnificationFilter(){}get readyPromise(){return this._readyPromise}get tileDiscardPolicy(){}get proxy(){}getTileCredits(t,n,o){return[]}requestImage(t,n,o,s){var c;const d=this._currentLayer;if(!d||(Be&&d&&!Fr(Be,d)&&Be.id===d.id&&Mm(Be.id),Be=d,this._useWorker&&(this.taskCount>=ki.maximumTasksPerImagery||!Nm(d==null?void 0:d.id,ki.maximumTasks))))return;const h=`${t}/${n}/${o}`;if(((c=this.tileCache)==null?void 0:c.has(h))===!0){const z=this.tileCache.get(h);return Promise.resolve(z)}const p=document.createElement("canvas"),y={x:t,y:n,level:o},E=(o>=this.maximumLevel?this._resolution:void 0)??1;p.width=this._tileWidth*E,p.height=this._tileHeight*E;const L=this._urlTemplate,F=this._layerNames,N=this._maximumLevel;return++this.taskCount,Hm({canvas:p,requestedTile:y,scaleFactor:E,urlTemplate:L,layerNames:F,maximumLevel:N,currentLayer:d}).then(()=>{var z;return(z=this.tileCache)==null||z.set(h,p),p}).catch(z=>{if(z instanceof Error&&z.message.startsWith("Unimplemented type"))return p;throw z}).finally(()=>{--this.taskCount})}async pickFeatures(t,n,o,s,c){const d={x:t,y:n,level:o},h=this._currentLayer,p=this._urlTemplate,y=this._layerNames;return await new lb({urlTemplate:p,layerNames:y}).pickFeatures(d,s,c,h)??[]}};let Gi=ki;Y(Gi,"maximumTasks",50),Y(Gi,"maximumTasksPerImagery",6);const useImageryProvider=(t,n,o)=>{const{hideIndicator:s}=o??{},{viewer:c}=we$1(),d=o==null?void 0:o.alpha;React.useEffect(()=>{if(!t||!c)return;const h=c.imageryLayers,p=h.addImageryProvider(t);return Object.assign(p,{bringToFront:()=>{h.raiseToTop(p)},sendToBack:()=>{h.lowerToBottom(p)}}),d!==void 0&&typeof d=="number"&&(p.alpha=d),attachTag(p,{layerId:n,hideIndicator:s}),()=>{h.remove(p)}},[t,c,n,d,s])},useData$1=t=>React.useMemo(()=>{const n=extractSimpleLayerData(t);return{type:n==null?void 0:n.type,url:n==null?void 0:n.url,layers:n!=null&&n.layers?Array.isArray(n.layers)?n.layers.join(","):n==null?void 0:n.layers:void 0,parameters:n==null?void 0:n.parameters}},[t]);function normalizeUrl(t,n){if(!t)return"";let o=t.replace("/%7Bz%7D","/{z}").replace("/%7Bx%7D","/{x}").replace("/%7By%7D","/{y}");return o.includes("/{z}/{x}/{y}.")||(o[o.length-1]!=="/"&&(o+="/"),o+="{z}/{x}/{y}."+n),o}const useMVT=({isVisible:t,property:n,layer:o})=>{const{show:s=!0,minimumLevel:c,maximumLevel:d,credit:h}=n??{},{type:p,url:y,layers:E}=useData$1(o),L=extractSimpleLayer(o)||void 0,F=React.useMemo(()=>{if(!(!t||!s||!y||!E||p!=="mvt"))return new Gi({minimumLevel:c,maximumLevel:d,credit:h,urlTemplate:normalizeUrl(y,"mvt"),layerName:E,layer:L,worker:!0})},[t,s,y,E,p,c,d,h,L]);useImageryProvider(F,o==null?void 0:o.id,n)},useTiles=({isVisible:t,property:n,layer:o})=>{const{show:s=!0,minimumLevel:c,maximumLevel:d,credit:h}=n??{},{type:p,url:y}=useData$1(o),E=React.useMemo(()=>{if(!(!t||!s||!y||p!=="tiles"))return new Cesium$1.UrlTemplateImageryProvider({url:normalizeUrl(y,"png"),minimumLevel:c,maximumLevel:d,credit:h})},[t,s,y,p,c,d,h]);useImageryProvider(E,o==null?void 0:o.id,n)},useTMS=({isVisible:t,property:n,layer:o})=>{const{show:s=!0,minimumLevel:c,maximumLevel:d,credit:h}=n??{},{type:p,url:y}=useData$1(o),[E,L]=React.useState();React.useEffect(()=>{if(!t||!s||!y||p!=="tms")return;(async()=>{L(await Cesium$1.TileMapServiceImageryProvider.fromUrl(y,{minimumLevel:c,maximumLevel:d,credit:h}))})()},[t,s,y,p,c,d,h]),useImageryProvider(E,o==null?void 0:o.id,n)},useWMS=({isVisible:t,property:n,layer:o})=>{const{show:s=!0,minimumLevel:c,maximumLevel:d,credit:h}=n??{},{type:p,url:y,layers:E,parameters:L}=useData$1(o),F=React.useMemo(()=>{if(!(!t||!s||!y||!E||p!=="wms"))return new Cesium$1.WebMapServiceImageryProvider({url:y,layers:E,minimumLevel:c,maximumLevel:d,credit:h,parameters:L})},[t,s,y,E,p,c,d,h,L]);useImageryProvider(F,o==null?void 0:o.id,n)};function Raster({isVisible:t,layer:n,property:o}){return useWMS({isVisible:t,layer:n,property:o}),useTiles({isVisible:t,layer:n,property:o}),useTMS({isVisible:t,layer:n,property:o}),useMVT({isVisible:t,layer:n,property:o}),null}const Raster$1=React.memo(Raster,(t,n)=>{var o,s,c,d,h,p;return isEqual((o=extractSimpleLayer(t.layer))==null?void 0:o.polygon,(s=extractSimpleLayer(n.layer))==null?void 0:s.polygon)&&isEqual((c=extractSimpleLayer(t.layer))==null?void 0:c.polyline,(d=extractSimpleLayer(n.layer))==null?void 0:d.polyline)&&isEqual((h=extractSimpleLayer(t.layer))==null?void 0:h.marker,(p=extractSimpleLayer(n.layer))==null?void 0:p.marker)&&isEqual(extractSimpleLayerData(t.layer),extractSimpleLayerData(n.layer))&&isEqual(t.property,n.property)&&t.isVisible===n.isVisible&&t.evalFeature===n.evalFeature&&t.onComputedFeatureFetch===n.onComputedFeatureFetch}),config$3={noFeature:!0};function overrideOriginalProperties(t,n,o,s){const c=(n==null?void 0:n.originalProperties)||{};attachTag(t,{...n||{},originalProperties:{...c,[o]:{...c[o],...s}}})}function attachProperties(t,n,o,s){const[c,d]=o,h=t[d]??{};if(!t[d])return;const p=getTag(t);overrideOriginalProperties(t,p,d,Object.keys(s).reduce((y,E)=>(y[E]=h[E],y),{})),Object.entries(s).forEach(([y,E])=>{var z;const L=E.name,F=E.type;let N=E.override??((z=n==null?void 0:n[c])==null?void 0:z[L])??E.default;switch(F){case"color":N=toColor$1(N);break;case"shadows":N=shadowMode(N);break;case"heightReference":N=heightReference(N)}t[d][y]=N??h[y]})}const hasAppearance=(t,n,o)=>{var s;return!!((s=extractSimpleLayer(t))!=null&&s[o[0]]||n[o[1]])},makeFeatureId$1=t=>String(t.id),attachStyle=(t,n,o,s)=>{var p,y,E,L,F,N,z,Z,H,nt,lt,J,mt,pi;if(!n)return;const c=hasAppearance(n,t,["marker","point"]),d=hasAppearance(n,t,["marker","billboard"]),h=hasAppearance(n,t,["marker","label"]);if(c||d||h){const Ai=(p=t.position)==null?void 0:p.getValue(s),md=[(Ai==null?void 0:Ai.x)??0,(Ai==null?void 0:Ai.y)??0,(Ai==null?void 0:Ai.z)??0],Gd={type:"feature",id:makeFeatureId$1(t),geometry:{type:"Point",coordinates:md},properties:convertEntityProperties(s,t),metaData:{description:convertEntityDescription(s,t)},range:{x:md[0],y:md[1],z:md[2]}},Xd=o(n.layer,Gd);return Xd?(c&&(((y=Xd==null?void 0:Xd.marker)==null?void 0:y.style)==="point"&&!t.point&&(t.point=new Cesium$1.PointGraphics,t.billboard=void 0),attachProperties(t,Xd,["marker","point"],{show:{name:"show",...(E=Xd==null?void 0:Xd.marker)!=null&&E.style?{override:((L=Xd==null?void 0:Xd.marker)==null?void 0:L.style)==="point"&&((Xd==null?void 0:Xd.marker.show)??!0)}:{}},pixelSize:{name:"pointSize"},color:{name:"pointColor",type:"color"},outlineColor:{name:"pointOutlineColor",type:"color"},outlineWidth:{name:"pointOutlineWidth"},heightReference:{name:"heightReference",type:"heightReference"}})),d&&(((F=Xd==null?void 0:Xd.marker)==null?void 0:F.style)==="image"&&!t.billboard&&(t.billboard=new Cesium$1.BillboardGraphics,t.point=void 0),attachProperties(t,Xd,["marker","billboard"],{show:{name:"show",...(N=Xd==null?void 0:Xd.marker)!=null&&N.style?{override:((z=Xd==null?void 0:Xd.marker)==null?void 0:z.style)==="image"&&((Xd==null?void 0:Xd.marker.show)??!0)}:{}},image:{name:"image"},color:{name:"imageColor",type:"color"},scale:{name:"imageSize"},sizeInMeters:{name:"imageSizeInMeters"},heightReference:{name:"heightReference",type:"heightReference"},horizontalOrigin:{name:"imageHorizontalOrigin"},verticalOrigin:{name:"imageVerticalOrigin"}}),h&&attachProperties(t,Xd,["marker","label"],{show:{name:"show",default:!0},text:{name:"labelText"},backgroundColor:{name:"labelBackground",type:"color"},heightReference:{name:"heightReference",type:"heightReference"}})),[Gd,Xd]):void 0}if(hasAppearance(n,t,["polyline","polyline"])){const Ai=(Z=t.position)==null?void 0:Z.getValue(s),md=(nt=(H=t.polyline)==null?void 0:H.positions)==null?void 0:nt.getValue(s),Gd=md==null?void 0:md.map(nf=>[(nf==null?void 0:nf.x)??0,(nf==null?void 0:nf.y)??0,(nf==null?void 0:nf.z)??0]),Xd={type:"feature",id:makeFeatureId$1(t),geometry:{type:"LineString",coordinates:Gd},properties:convertEntityProperties(s,t),metaData:{description:convertEntityDescription(s,t)},range:{x:(Ai==null?void 0:Ai.x)??0,y:(Ai==null?void 0:Ai.y)??0,z:(Ai==null?void 0:Ai.z)??0}},Vd=o(n.layer,Xd);return Vd?(attachProperties(t,Vd,["polyline","polyline"],{show:{name:"show",default:!0},width:{name:"strokeWidth"},material:{name:"strokeColor",type:"color"},shadows:{name:"shadows",type:"shadows"},clampToGround:{name:"clampToGround"}}),[Xd,Vd]):void 0}if(hasAppearance(n,t,["polygon","polygon"])){const Ai=(lt=t.position)==null?void 0:lt.getValue(s),md=(mt=(J=t.polygon)==null?void 0:J.hierarchy)==null?void 0:mt.getValue(s),Gd=(pi=md==null?void 0:md.holes)==null?void 0:pi.map(nf=>nf.positions.map(rf=>[(rf==null?void 0:rf.x)??0,(rf==null?void 0:rf.y)??0,(rf==null?void 0:rf.z)??0])),Xd={type:"feature",id:makeFeatureId$1(t),geometry:{type:"Polygon",coordinates:Gd},properties:convertEntityProperties(s,t),metaData:{description:convertEntityDescription(s,t)},range:{x:(Ai==null?void 0:Ai.x)??0,y:(Ai==null?void 0:Ai.y)??0,z:(Ai==null?void 0:Ai.z)??0}},Vd=o(n.layer,Xd);return Vd?(attachProperties(t,Vd,["polygon","polygon"],{show:{name:"show",default:!0},fill:{name:"fill"},material:{name:"fillColor",type:"color"},outline:{name:"stroke"},outlineColor:{name:"strokeColor",type:"color"},outlineWidth:{name:"strokeWidth"},shadows:{name:"shadows",type:"shadows"},heightReference:{name:"heightReference",type:"heightReference"},extrudedHeight:{name:"extrudedHeight"}}),[Xd,Vd]):void 0}},types={kml:"kml",geojson:"geojson",czml:"czml"},comps={kml:qs$1,czml:As$1,geojson:js$1};function Resource({isVisible:t,property:n,layer:o,onComputedFeatureFetch:s,onComputedFeatureDelete:c}){var oe,sl,Zd,af,df,uf;const{show:d=!0,clampToGround:h,stroke:p,strokeWidth:y,markerColor:E,markerSize:L,fill:F,hideIndicator:N}=n??{},[z,Z,H]=React.useMemo(()=>{var mf;const cf=extractSimpleLayerData(o),of=n==null?void 0:n.type,lf=n==null?void 0:n.url;return[of??(cf==null?void 0:cf.type),lf??(cf==null?void 0:cf.url),((mf=cf==null?void 0:cf.time)==null?void 0:mf.updateClockOnLoad)??!0]},[n,o]),{viewer:nt}=we$1(),lt=React.useRef([]),J=React.useRef(new Set),mt=React.useMemo(()=>!z||z==="auto"?guessType(Z):void 0,[z,Z]),pi=mt?types[mt]:z!=="auto"?z:void 0,Ai=pi?comps[pi]:void 0,{requestRender:md,timelineManagerRef:Gd}=useContext(),Xd=React.useCallback(cf=>{if(!nt)return;const of=[],lf=[];cf.entities.values.forEach(mf=>{var Pf;const pf=attachStyle(mf,o,evalFeature,nt.clock.currentTime),[gf,Ef]=pf||[];attachTag(mf,{layerId:o==null?void 0:o.id,featureId:gf==null?void 0:gf.id,hideIndicator:(Pf=Ef==null?void 0:Ef.resource)==null?void 0:Pf.hideIndicator}),gf&&!J.current.has(gf.id)&&(of.push(gf),lt.current.push({feature:gf,raw:mf}),J.current.add(gf.id)),Ef&&lf.push(Ef)}),z!=="geojson"&&(s==null||s(of,lf)),md==null||md()},[o,nt,s,z,md]),Vd=React.useRef({start:(sl=(oe=Gd==null?void 0:Gd.current)==null?void 0:oe.timeline)==null?void 0:sl.start,stop:(af=(Zd=Gd==null?void 0:Gd.current)==null?void 0:Zd.timeline)==null?void 0:af.stop,current:(uf=(df=Gd==null?void 0:Gd.current)==null?void 0:df.timeline)==null?void 0:uf.current}),nf=React.useCallback(cf=>{var of,lf;if(cf.entities.values.forEach(mf=>requestAnimationFrame(()=>{const pf=getTag(mf);attachTag(mf,{layerId:o==null?void 0:o.id,featureId:makeFeatureId$1(mf),hideIndicator:N??(pf==null?void 0:pf.hideIndicator)})})),!H){Vd.current.current&&Vd.current.start&&Vd.current.stop&&((of=Gd==null?void 0:Gd.current)==null||of.commit({cmd:"SET_TIME",payload:{start:Vd.current.start,stop:Vd.current.stop,current:Vd.current.current},committer:{source:"featureResource",id:o==null?void 0:o.id}}));return}cf.clock&&((lf=Gd==null?void 0:Gd.current)==null||lf.commit({cmd:"SET_TIME",payload:{start:Cesium$1.JulianDate.toDate(cf.clock.startTime),stop:Cesium$1.JulianDate.toDate(cf.clock.stopTime),current:Cesium$1.JulianDate.toDate(cf.clock.currentTime)},committer:{source:"featureResource",id:o==null?void 0:o.id}})),md==null||md()},[H,Gd,o==null?void 0:o.id,md,N]),rf=React.useMemo(()=>p?Cesium$1.Color.fromCssColorString(p):void 0,[p]),ef=React.useMemo(()=>F?Cesium$1.Color.fromCssColorString(F):void 0,[F]),yt=React.useMemo(()=>E?Cesium$1.Color.fromCssColorString(E):void 0,[E]);return React.useEffect(()=>{nt&<.current.forEach(cf=>{attachStyle(cf.raw,o,evalFeature,nt.clock.currentTime)})},[o,nt]),React.useEffect(()=>()=>{requestIdleCallbackWithRequiredWork(()=>{c==null||c(Array.from(J.current.values()))})},[]),!t||!d||!Ai||!Z?null:jsxRuntimeExports.jsx(Ai,{data:Z,show:!0,clampToGround:h,onChange:Xd,onLoad:nf,stroke:rf,fill:ef,strokeWidth:y,markerSize:L,markerColor:yt})}const config$2={noFeature:!0},DEFAULT_CLIPPING_POLYGON_STYLE={fill:!0,fillColor:"#FFFFFF22",stroke:!0,strokeColor:"#FFFFFF",strokeWidth:1},DrawClippingPolygon=({coordiantes:t,top:n=0,bottom:o=0,visible:s,style:c,ready:d})=>{const h=useCustomCompareMemo(()=>t?new Cesium$1.PolygonHierarchy(t.map(y=>Cesium$1.Cartesian3.fromDegrees(y[0],y[1],y[2]??0))):void 0,[t??[]],isEqual),p=React.useMemo(()=>({...DEFAULT_CLIPPING_POLYGON_STYLE,...c,fillColor:toColor((c==null?void 0:c.fillColor)??DEFAULT_CLIPPING_POLYGON_STYLE.fillColor),strokeColor:toColor((c==null?void 0:c.strokeColor)??DEFAULT_CLIPPING_POLYGON_STYLE.strokeColor)}),[c]);return jsxRuntimeExports.jsx(EntityExt,{hideIndicator:!0,children:jsxRuntimeExports.jsx(ca$1,{hierarchy:h,fill:p.fill,material:p.fillColor,outline:p.stroke,outlineColor:p.strokeColor,outlineWidth:p.strokeWidth,height:o,extrudedHeight:n,show:s&&d})})},useRefValue=t=>{const n=React.useRef(t);return n.current=t,n},useImmutableFunction=t=>{const n=React.useRef(t),o=React.useCallback(()=>n.current,[]);return React.useEffect(()=>{n.current=t},[t]),o};class FeatureIndex{constructor(){Bf(this,"records",new Map)}has(n){return this.records.has(n)}find(n){}}class TilesetFeatureIndex extends FeatureIndex{has(n){return this.records.has(n)}find(n){const o=this.records.get(n);if(o!=null)return o.map(({content:s,batchId:c})=>s.getFeature(c))}addFeature(n,o,s){if(s==null)return;const c=this.records.get(s);c==null?this.records.set(s,[{content:n,batchId:o}]):c.push({content:n,batchId:o})}deleteFeature(n){n!=null&&this.records.has(n)&&this.records.delete(n)}}const BUILTIN_BOX_SIDE_PLANES=[{normal:{x:0,y:0,z:1},distance:.5},{normal:{x:0,y:0,z:-1},distance:.5},{normal:{x:0,y:1,z:0},distance:.5},{normal:{x:0,y:-1,z:0},distance:.5},{normal:{x:1,y:0,z:0},distance:.5},{normal:{x:-1,y:0,z:0},distance:.5}],useClippingBox=({clipping:t,boxId:n})=>{const{useBuiltinBox:o,visible:s,allowEnterGround:c,coordinates:d,width:h,height:p,length:y,heading:E,pitch:L,roll:F,disabledSelection:N}=t||{},{viewer:z}=we$1(),Z=React.useRef(!1),H=React.useRef(!1),nt=React.useRef(),[lt,J]=React.useState(d);React.useEffect(()=>{o&&!lt&&J(d)},[lt,d,o]);const[mt,pi]=React.useState({width:h,height:p,length:y,heading:E,pitch:L,roll:F});React.useEffect(()=>{o&&!mt&&pi({width:h,height:p,length:y,heading:E,pitch:L,roll:F})},[mt,h,p,y,E,L,F,o]);const[Ai,md]=React.useState({activeBox:!1,activeScalePointIndex:void 0,isScalePointClicked:!1,activeEdgeIndex:void 0,isEdgeClicked:!1,cursor:"default"}),Gd=React.useCallback(cf=>{md(of=>({...of,...cf}))},[]),Xd=React.useCallback(cf=>{if(!z||!N)return;const of=z.scene.pick(cf.position),lf=getLayerId$1(of);if(lf!=null&&lf.startsWith(`${n}-scale-point`)){const mf=Number(lf.split("-").slice(-1)[0]);Gd({cursor:"nesw-resize",activeScalePointIndex:mf,isScalePointClicked:!0})}if(lf!=null&&lf.startsWith(`${n}-edge-draggable`)){const mf=Number(lf.split("-").slice(-1)[0]);Gd({cursor:"grabbing",activeEdgeIndex:mf,isEdgeClicked:!0})}if(lf!=null&&lf.startsWith(`${n}-plane`)&&(Z.current=!0,H.current=lf.endsWith("top")||lf.endsWith("bottom")),Z.current){const mf=getCamera(z);nt.current=mf,updateMapController(z,!1),(!Ai.isScalePointClicked||!Ai.isEdgeClicked)&&Gd({cursor:"grabbing",activeBox:!0})}},[n,Ai,Gd,z,N]),Vd=React.useCallback(()=>{!z||!N||((Ai.activeScalePointIndex||Ai.activeEdgeIndex)&&Gd({cursor:"default",activeScalePointIndex:void 0,isScalePointClicked:!1,activeEdgeIndex:void 0,isEdgeClicked:!1}),Z.current&&(updateMapController(z,!0),nt.current=void 0,Z.current=!1,H.current=!1,Ai.activeBox=!1,Ai.cursor="default",Gd({activeBox:!1,cursor:"default"})))},[Ai,Gd,z,N]),nf=React.useRef(0),rf=React.useCallback(async cf=>{if(!Z.current||!z||!N)return;const of=Cesium$1.Cartesian3.fromDegrees((lt==null?void 0:lt[0])||0,(lt==null?void 0:lt[1])||0,lt==null?void 0:lt[2]);if(H.current){const lf=(lt==null?void 0:lt[2])||0,mf=(()=>{if(!c){const Vf=lf-((mt==null?void 0:mt.height)||0)/2,Uf=nf.current;if(Vf<Uf)return lf+(Uf-Vf)}})(),pf=new Cesium$1.Cartesian2(cf.startPosition.x,cf.startPosition.y),gf=new Cesium$1.Cartesian2(cf.endPosition.x,cf.endPosition.y),Ef=Cesium$1.Cartesian2.subtract(gf,pf,new Cesium$1.Cartesian2),Pf=new Cesium$1.Cartesian3(0,0,Ef.y<0?-1:1),{moveAmount:Df}=computeMoveAmount(z.scene,{startPosition:pf,endPosition:gf},of,Pf),Nf=Cesium$1.Cartesian3.multiplyByScalar(Pf,Df,new Cesium$1.Cartesian3);J(Vf=>[(Vf==null?void 0:Vf[0])||0,(Vf==null?void 0:Vf[1])||0,(mf||(Vf==null?void 0:Vf[2])||0)+Nf.z])}else{const lf=cf.endPosition?getLocationFromScreen(z.scene,cf.endPosition.x,cf.endPosition.y,!c):void 0;J(mf=>[(lf==null?void 0:lf.lng)||0,(lf==null?void 0:lf.lat)||0,(c?mf==null?void 0:mf[2]:lf==null?void 0:lf.height)||0]),sampleTerrainHeight(z.scene,(lt==null?void 0:lt[0])||0,(lt==null?void 0:lt[1])||0).then(mf=>{nf.current=mf||0})}},[c,lt,mt==null?void 0:mt.height,z,N]),ef=React.useCallback(({layerId:cf}={})=>{const of=!Ai.isScalePointClicked&&!Ai.isEdgeClicked&&!Z.current;if(cf!=null&&cf.startsWith(`${n}-scale-point`)&&of){const lf=Number(cf.split("-").slice(-1)[0]);Gd({cursor:"nesw-resize",activeScalePointIndex:lf})}if(cf!=null&&cf.startsWith(`${n}-edge-draggable`)&&of){const lf=Number(cf.split("-").slice(-1)[0]);Gd({cursor:"grab",activeEdgeIndex:lf})}cf!=null&&cf.startsWith(`${n}-plane`)&&of&&Gd({cursor:"grab",activeBox:!0})},[n,Ai.isEdgeClicked,Ai.isScalePointClicked,Gd]),yt=React.useCallback(({layerId:cf}={})=>{const of=!Ai.isScalePointClicked&&!Ai.isEdgeClicked&&!Z.current;cf!=null&&cf.startsWith(`${n}-scale-point`)&&of&&Gd({cursor:"default",activeScalePointIndex:void 0}),cf!=null&&cf.startsWith(`${n}-edge-draggable`)&&of&&Gd({cursor:"default",activeEdgeIndex:void 0}),cf!=null&&cf.startsWith(`${n}-plane`)&&of&&Gd({cursor:"default",activeBox:!1})},[n,Ai.isEdgeClicked,Ai.isScalePointClicked,Gd]),oe=React.useRef(),sl=React.useCallback(cf=>{const of=z==null?void 0:z.scene.pick(cf.endPosition);if(oe.current!==of){if(oe.current){const lf=getLayerId$1(oe.current);yt({layerId:lf}),yt()}if(of){const lf=getLayerId$1(of);ef({layerId:lf}),ef()}}rf(cf),oe.current=of},[ef,yt,rf,z==null?void 0:z.scene]),Zd=React.useCallback(cf=>{var of,lf;if((of=cf.layerId)!=null&&of.startsWith(`${n}-scale-point`)&&cf.scale){const mf=cf.scale;pi(pf=>({...pf,width:mf.width,height:mf.height,length:mf.length})),J([mf.location.lng,mf.location.lat,mf.location.height])}if((lf=cf.layerId)!=null&&lf.startsWith(`${n}-edge-draggable`)&&cf.rotate){const mf=cf.rotate;pi(pf=>({...pf,heading:mf.heading,pitch:mf.pitch,roll:mf.roll}))}},[n]),af=React.useMemo(()=>new Cesium$1.ScreenSpaceEventHandler(z==null?void 0:z.scene.canvas),[z]);React.useEffect(()=>{af.setInputAction(Xd,Cesium$1.ScreenSpaceEventType.LEFT_DOWN),af.setInputAction(sl,Cesium$1.ScreenSpaceEventType.MOUSE_MOVE),af.setInputAction(Vd,Cesium$1.ScreenSpaceEventType.LEFT_UP)},[af,Xd,sl,Vd]),React.useEffect(()=>()=>af.destroy(),[af]);const df=React.useMemo(()=>({...Ai,...mt,allowEnterGround:c}),[Ai,mt,c]),uf=React.useMemo(()=>o?{visible:s,handleLayerEdit:Zd,geometry:{type:"Point",coordinates:lt||d||[0,0,0]},property:df}:void 0,[df,d,lt,Zd,o,s]);return{...t,planes:o?BUILTIN_BOX_SIDE_PLANES:t==null?void 0:t.planes,width:o?mt==null?void 0:mt.width:t==null?void 0:t.width,height:o?mt==null?void 0:mt.height:t==null?void 0:t.height,length:o?mt==null?void 0:mt.length:t==null?void 0:t.length,heading:o?mt==null?void 0:mt.heading:t==null?void 0:t.heading,pitch:o?mt==null?void 0:mt.pitch:t==null?void 0:t.pitch,roll:o?mt==null?void 0:mt.roll:t==null?void 0:t.roll,coordinates:o?lt:t==null?void 0:t.coordinates,builtinBoxProps:uf}};function getLayerId$1(t){var n,o;if(t&&"id"in t&&t.id instanceof Cesium$1.Entity)return(n=getTag(t.id))==null?void 0:n.layerId;if(t&&t instanceof Cesium$1.Cesium3DTileFeature)return(o=getTag(t.tileset))==null?void 0:o.layerId}const useDrawClipping=({enabled:t,surfacePoints:n,direction:o="inside",top:s,bottom:c,visible:d=!0,style:h,tilesetRef:p,viewer:y,clippingPlanes:E,isTilesetReady:L})=>{const[F,N]=React.useState(0),z=React.useMemo(()=>s??100,[s]),Z=React.useMemo(()=>c??10,[c]),[H,nt]=React.useState(!1),{requestRender:lt}=useContext();React.useEffect(()=>{(async()=>{if(!(p!=null&&p.current)||!L)return;if(!t||!n||(n==null?void 0:n.length)<2){E.removeAll(),N(0),lt==null||lt();return}E.modelMatrix=Cesium$1.Matrix4.IDENTITY.clone(),nt(!1);const pi=polygon([n.map(Vd=>[Vd.lng,Vd.lat])]),Ai=centroid(pi),md=y!=null&&y.scene?await sampleTerrainHeight(y==null?void 0:y.scene,Ai.geometry.coordinates[0],Ai.geometry.coordinates[1])??0:0;N(md);const Gd=Cesium$1.Matrix4.inverse(Cesium$1.Transforms.eastNorthUpToFixedFrame(p.current.boundingSphere.center),new Cesium$1.Matrix4);let Xd=0;for(let Vd=0;Vd<n.length;Vd++){const nf=n[Vd],rf=n[(Vd+1)%n.length];Xd+=(rf.lng-nf.lng)*(rf.lat+nf.lat)}Xd>0&&n.reverse(),E.removeAll();for(let Vd=0;Vd<n.length-1;Vd++){const nf=n[Vd],rf=n[Vd+1];E.add(createSidePlane(nf,rf,Gd,o))}E.add(createHorizontalPlane(n[0],md+z,Gd,o==="inside"?1:-1)),E.add(createHorizontalPlane(n[0],md-Z,Gd,o==="inside"?-1:1)),nt(!0)})()},[n,p,E,z,Z,t,o,y,L,lt]),React.useEffect(()=>{E.unionClippingRegions=o==="outside"},[E,o,t]);const J=React.useMemo(()=>({coordiantes:(n==null?void 0:n.map(mt=>[mt.lng,mt.lat]))??[],top:F+z,bottom:F-Z,visible:d,style:h,ready:H}),[n,F,z,Z,d,h,H]);return{drawClippingEnabled:t,drawClippingEdgeProps:J}},getOriginCoordinateSystemPoint=(t,n,o)=>{const s=Cesium$1.Cartesian3.fromDegrees(t.lng,t.lat,o);return Cesium$1.Matrix4.multiplyByPoint(n,s,new Cesium$1.Cartesian3)},createSidePlane=(t,n,o,s)=>{const c=getOriginCoordinateSystemPoint(t,o),d=getOriginCoordinateSystemPoint(n,o),h=new Cesium$1.Cartesian3(0,0,1),p=new Cesium$1.Cartesian3(0,0,-1),y=Cesium$1.Cartesian3.subtract(d,c,new Cesium$1.Cartesian3),E=s==="inside"?Cesium$1.Cartesian3.normalize(Cesium$1.Cartesian3.cross(y,h,new Cesium$1.Cartesian3),new Cesium$1.Cartesian3):Cesium$1.Cartesian3.normalize(Cesium$1.Cartesian3.cross(y,p,new Cesium$1.Cartesian3),new Cesium$1.Cartesian3),L=Cesium$1.Plane.fromPointNormal(c,E);return Cesium$1.ClippingPlane.fromPlane(L)},createHorizontalPlane=(t,n,o,s)=>{const c=getOriginCoordinateSystemPoint(t,o,n),d=new Cesium$1.Cartesian3(0,0,s),h=Cesium$1.Plane.fromPointNormal(c,d);return Cesium$1.ClippingPlane.fromPlane(h)},DEFAULT_FEATURE_COLOR=Cesium$1.Color.WHITE,useData=t=>React.useMemo(()=>{const n=extractSimpleLayerData(t);return{type:n==null?void 0:n.type,url:n==null?void 0:n.url,idProperty:n==null?void 0:n.idProperty,layers:n!=null&&n.layers?Array.isArray(n.layers)?n.layers.join(","):n==null?void 0:n.layers:void 0}},[t]),makeFeatureId=(t,n,o)=>{const s=n.tile.boundingSphere.center,c=o&&!(t instanceof Cesium$1.Model)?t.getProperty(o):void 0;if(c)return c;const d=getBuiltinFeatureId(t);return generateIDWithMD5(`${s.x}-${s.y}-${s.z}-${d}-${t instanceof Cesium$1.Model?"":JSON.stringify(Object.entries(convertCesium3DTileFeatureProperties(t)).filter((h,p)=>typeof p=="string"||typeof p=="number").map(([h,p])=>`${h}${p}`))}`)},makeFeatureFrom3DTile=(t,n,o)=>{const s=n.tile.boundingSphere.center;return{type:"feature",id:makeFeatureId(t,n,o),geometry:{type:"Point",coordinates:[s.x,s.y,s.z]},range:{x:s.x,y:s.y,z:s.z}}},getBuiltinFeatureId=t=>(t instanceof Cesium$1.Model?t.id:t instanceof Cesium$1.Cesium3DTileFeature?t.featureId:"")??"",MAX_NUMBER_OF_CONCURRENT_COMPUTING_FEATURES=5e3,COMMON_STYLE_PROPERTIES=[{name:"color",convert:"color"},{name:"show"}],MODEL_STYLE_PROPERTIES=[{name:"color",convert:"colorFunctionString"},{name:"show"},{name:"pointSize"},{name:"meta"}],POINT_STYLE_PROPERTIES=[{name:"pointSize"}],TILESET_APPEARANCE_FIELDS=["show","color","pointSize","meta"],convertStyle=(t,n)=>n==="color"?toColor(t):n==="colorFunctionString"?t===void 0?t:`color("${t}")`:t,useFeature=({id:t,tileset:n,idProperty:o,layer:s,viewer:c,featureIndex:d,selectedFeatureIdsRef:h,evalFeature:p,onComputedFeatureFetch:y,shouldUseFeatureIndex:E,isTilesetReady:L})=>{const F=React.useRef([]),N=React.useRef(s),z=React.useRef(new Set),Z=(s==null?void 0:s.id)||t,H=useRefValue(Z),nt=React.useCallback(async yt=>{var sl;const oe=(sl=N==null?void 0:N.current)==null?void 0:sl.layer;if((oe==null?void 0:oe.type)==="simple"&&(yt!=null&&yt.feature)){const Zd=yt.raw,af=getTag(Zd),df=c&&!(Zd instanceof Cesium$1.Model)?convertCesium3DTileFeatureProperties(Zd):{},uf=E?h.current.includes((af==null?void 0:af.featureId)??""):af==null?void 0:af.isFeatureSelected,cf=p(oe,{...yt==null?void 0:yt.feature,properties:df}),of=cf==null?void 0:cf["3dtiles"];return COMMON_STYLE_PROPERTIES.forEach(({name:lf,convert:mf})=>{var gf,Ef;if(lf==="color"){if(uf){Zd.color=typeof((gf=oe["3dtiles"])==null?void 0:gf.selectedFeatureColor)=="string"?toColor((Ef=oe["3dtiles"])==null?void 0:Ef.selectedFeatureColor)??Zd.color:Zd.color;return}Zd.color=DEFAULT_FEATURE_COLOR}const pf=convertStyle(of==null?void 0:of[lf],mf);pf!==void 0&&(Zd[lf]=pf)}),Zd instanceof Cesium$1.Cesium3DTilePointFeature&&POINT_STYLE_PROPERTIES.forEach(({name:lf,convert:mf})=>{const pf=convertStyle(of==null?void 0:of[lf],mf);pf!==void 0&&(Zd[lf]=pf)}),"style"in Zd&&(Zd.style=new Cesium$1.Cesium3DTileStyle(MODEL_STYLE_PROPERTIES.reduce((lf,{name:mf,convert:pf})=>{const gf=convertStyle(of==null?void 0:of[mf],pf);return gf===void 0?lf:{...lf,[mf]:gf}},{}))),attachTag(yt.raw,{layerId:Z,featureId:yt.feature.id,computedFeature:cf,isFeatureSelected:af==null?void 0:af.isFeatureSelected}),cf}},[p,Z,c,E,h]),lt=React.useCallback(async yt=>{if(yt.tileset.isDestroyed())return;const oe=new Set;await lookupFeatures(yt.content,async(sl,Zd,af)=>{const df={feature:makeFeatureFrom3DTile(sl,Zd,o),raw:sl};attachTag(df.raw,{layerId:H.current,featureId:df.feature.id}),af!=null&&E&&d.addFeature(Zd,af,df.feature.id),await nt(df),F.current.push(df),z.current.add(df.feature.id),oe.add(pick(df.feature,["id","type","range"]))}),y==null||y(Array.from(oe.values()),[])},[F,nt,y,o,d,E,H]),J=React.useRef(lt);J.current=lt,React.useEffect(()=>{var yt;return(yt=n.current)==null?void 0:yt.tileLoad.addEventListener(oe=>J.current(oe))},[n,L]);const mt=React.useCallback(async yt=>{yt.tileset.isDestroyed()||!E||await lookupFeatures(yt.content,async(oe,sl)=>{d.deleteFeature(makeFeatureId(oe,sl,o))})},[o,d,E]),pi=React.useRef(mt);pi.current=mt,React.useEffect(()=>{var yt;return(yt=n.current)==null?void 0:yt.tileUnload.addEventListener(oe=>pi.current(oe))},[n,L]),React.useEffect(()=>{N.current=s},[s]);const Ai=React.useMemo(()=>{var yt;return(yt=extractSimpleLayer(s))==null?void 0:yt["3dtiles"]},[s]),md=usePick(Ai,TILESET_APPEARANCE_FIELDS),Gd=E?0:s==null?void 0:s.layer._updateStyle,Xd=React.useRef(Gd),Vd=React.useRef();React.useEffect(()=>{Vd.current=Date.now()},[md,Gd]);const nf=React.useCallback(async(yt,oe)=>new Promise(sl=>requestAnimationFrame(()=>{if(Vd.current&&Vd.current>oe){sl(void 0);return}(md||Gd)&&nt(yt),sl(void 0)})),[md,nt,Gd]),rf=React.useCallback(async yt=>{const oe=[];let sl=!1;for(const Zd of F.current){if(Vd.current&&Vd.current>yt){sl=!0;break}oe.push(nf(Zd,yt)),oe.length>MAX_NUMBER_OF_CONCURRENT_COMPUTING_FEATURES&&(await Promise.all(oe),oe.length=0)}sl||await Promise.all(oe),Xd.current=Gd,oe.length=0},[nf,Gd]),{requestRender:ef}=useContext();React.useEffect(()=>{(async()=>{const oe=Date.now();await rf(oe),ef==null||ef()})()},[rf,ef,Gd])},useHooks$2=({id:t,boxId:n,isVisible:o,property:s,sceneProperty:c,layer:d,meta:h,evalFeature:p,onComputedFeatureFetch:y,onLayerFetch:E})=>{var Zf,xf,zf;const{viewer:L}=we$1(),F=React.useRef(),{onLayerLoad:N}=useContext(),z=React.useRef(d==null?void 0:d.id);z.current=d==null?void 0:d.id;const{tileset:Z,styleUrl:H,edgeColor:nt,edgeWidth:lt,experimental_clipping:J,apiKey:mt,selectedFeatureColor:pi,disableIndexingFeature:Ai}=s??{},{width:md,height:Gd,length:Xd,location:Vd,coordinates:nf,heading:rf,roll:ef,pitch:yt,planes:oe,visible:sl=!0,direction:Zd="inside",builtinBoxProps:af,allowEnterGround:df}=useClippingBox({clipping:J,boxId:n}),[uf,cf]=React.useState(),{url:of,type:lf,idProperty:mf}=useData(d),pf=!Ai&&!!mf,[gf,Ef]=React.useState(!1),Pf=React.useRef(oe),Df=React.useMemo(()=>{var Lf,wf;return(!((Lf=Pf.current)!=null&&Lf.length)||!((wf=Pf.current)!=null&&wf.every((Af,qf)=>{var Yf,Pm,Qm,qm,$m,zm;return((Yf=Af.normal)==null?void 0:Yf.x)===((Pm=oe==null?void 0:oe[qf].normal)==null?void 0:Pm.x)&&((Qm=Af.normal)==null?void 0:Qm.y)===((qm=oe==null?void 0:oe[qf].normal)==null?void 0:qm.y)&&(($m=Af.normal)==null?void 0:$m.z)===((zm=oe==null?void 0:oe[qf].normal)==null?void 0:zm.z)&&Af.distance===(oe==null?void 0:oe[qf].distance)})))&&(Pf.current=oe),Pf.current},[oe]),Nf=Zd==="inside"?-1:1,[Vf]=React.useState(()=>new Cesium$1.ClippingPlaneCollection({planes:Df==null?void 0:Df.map(Lf=>{var wf,Af,qf;return new Cesium$1.ClippingPlane(new Cesium$1.Cartesian3((wf=Lf.normal)==null?void 0:wf.x,(Af=Lf.normal)==null?void 0:Af.y,(qf=Lf.normal)==null?void 0:qf.z),(Lf.distance||0)*Nf)}),unionClippingRegions:Zd==="outside",edgeWidth:lt,edgeColor:toColor(nt)})),{drawClippingEnabled:Uf,drawClippingEdgeProps:Jf}=useDrawClipping({...J==null?void 0:J.draw,tilesetRef:F,viewer:L,clippingPlanes:Vf,isTilesetReady:gf}),[If]=React.useState(()=>new TilesetFeatureIndex),tf=React.useCallback(Lf=>{Lf!=null&&Lf.cesiumElement&&attachTag(Lf.cesiumElement,{layerId:(d==null?void 0:d.id)||t,featureIndex:pf?If:void 0,appearanceType:"3dtiles"}),d!=null&&d.id&&(Lf!=null&&Lf.cesiumElement)&&((Lf==null?void 0:Lf.cesiumElement)[layerIdField]=d.id),F.current=Lf==null?void 0:Lf.cesiumElement},[t,d==null?void 0:d.id,If,pf]),Cf=React.useRef([]),vf=React.useRef(pi);vf.current=pi;const[ff]=React.useState(()=>new Map);React.useEffect(()=>{!F.current||!pf||!gf||Object.assign(F.current,{onSelectFeature:Lf=>{const wf=getTag(Lf);wf!=null&&wf.featureId&&(Cf.current.push(wf.featureId),ff.set(wf.featureId,Lf.color)),vf.current&&(Lf.color=toColor(vf.current)??Lf.color)},onUnselectFeature:Lf=>{const wf=getTag(Lf);wf!=null&&wf.featureId&&(Cf.current=Cf.current.filter(Af=>Af!==wf.featureId)),Lf.color=ff.get((wf==null?void 0:wf.featureId)??"")??DEFAULT_FEATURE_COLOR}})},[ff,If,pf,gf]),useFeature({id:t,tileset:F,layer:d,idProperty:mf,viewer:L,evalFeature:p,onComputedFeatureFetch:y,featureIndex:If,selectedFeatureIdsRef:Cf,shouldUseFeatureIndex:pf,isTilesetReady:gf});const[hf,bf]=React.useState(0),Tf=React.useRef(!1),Mf=React.useCallback(Lf=>{Tf.current||!L||df||(Tf.current=!0,sampleTerrainHeightFromCartesian(L.scene,Lf).then(wf=>{bf(wf??0),Tf.current=!1}))},[df,L]);React.useEffect(()=>{if(J!=null&&J.draw)return;const Lf=nf||(Vd?[Vd.lng,Vd.lat,Vd.height??0]:void 0),wf=Cesium$1.Cartesian3.fromDegrees((Lf==null?void 0:Lf[0])||0,(Lf==null?void 0:Lf[1])||0,(Lf==null?void 0:Lf[2])||0);(async()=>{if(!F.current||!gf)return;const qf=F.current.clippingPlanesOriginMatrix.clone(),Yf=new Cesium$1.Cartesian3(md||100,Xd||100,Gd||100);if(!df){const $m=new Cesium$1.TranslationRotationScale(wf,void 0,Yf);translationWithClamping($m,!!df,hf),wf.x=$m.translation.x,wf.y=$m.translation.y,wf.z=$m.translation.z}const Pm=rf&&yt&&ef?new Cesium$1.HeadingPitchRoll(rf,yt,ef):void 0,Qm=Cesium$1.Matrix4.multiply(Pm?Cesium$1.Matrix4.fromRotationTranslation(Cesium$1.Matrix3.fromHeadingPitchRoll(Pm),wf):Cesium$1.Transforms.eastNorthUpToFixedFrame(wf),Cesium$1.Matrix4.fromScale(Yf,new Cesium$1.Matrix4),new Cesium$1.Matrix4),qm=Cesium$1.Matrix4.inverse(qf,new Cesium$1.Matrix4);Cesium$1.Matrix4.multiply(qm,Qm,Vf.modelMatrix)})(),df||Mf(wf)},[md,Xd,Gd,rf,yt,ef,Vd,nf,Vf.modelMatrix,Mf,df,hf,J==null?void 0:J.draw,gf]),React.useEffect(()=>{J!=null&&J.draw||(Vf.enabled=sl)},[Vf,sl,J==null?void 0:J.draw]),React.useEffect(()=>{J!=null&&J.draw||(Vf.unionClippingRegions=Zd==="outside")},[Vf,Zd,J==null?void 0:J.draw]),React.useEffect(()=>{J!=null&&J.draw||(Vf.removeAll(),Df==null||Df.forEach(Lf=>{var wf,Af,qf;return Vf.add(new Cesium$1.ClippingPlane(new Cesium$1.Cartesian3((wf=Lf.normal)==null?void 0:wf.x,(Af=Lf.normal)==null?void 0:Af.y,(qf=Lf.normal)==null?void 0:qf.z),(Lf.distance||0)*Nf))}))},[Df,Vf,Nf,J==null?void 0:J.draw]),React.useEffect(()=>{if(!H){cf(void 0);return}(async()=>{const Lf=await fetch(H);Lf.ok&&cf(new Cesium$1.Cesium3DTileStyle(await Lf.json()))})()},[H]);const _f=React.useMemo(()=>{if(lf!=="google-photorealistic"||!o)return;const Lf=Cesium$1.GoogleMaps,wf=Cesium$1.defaultValue(mt,Lf.defaultApiKey),Af=Lf.getDefaultApiKeyCredit(wf);return new Cesium$1.Resource({url:`${Lf.mapTilesApiEndpoint}3dtiles/root.json`,queryParameters:{key:wf},credits:Af?[Af]:void 0})},[mt,lf,o]),kf=React.useMemo(()=>lf==="osm-buildings"&&o?Cesium$1.IonResource.fromAssetId(96188,{accessToken:h==null?void 0:h.cesiumIonAccessToken}):_f||(lf==="3dtiles"&&o?of??Z:null),[o,Z,of,lf,h,_f]),Xf=React.useMemo(()=>{var Yf,Pm,Qm,qm,$m;if(!(s!=null&&s.specularEnvironmentMaps)&&!(s!=null&&s.sphericalHarmonicCoefficients)&&!((Yf=c==null?void 0:c.light)!=null&&Yf.specularEnvironmentMaps)&&!((Pm=c==null?void 0:c.light)!=null&&Pm.sphericalHarmonicCoefficients))return;const Lf=new Cesium$1.ImageBasedLighting,wf=(s==null?void 0:s.specularEnvironmentMaps)??((Qm=c==null?void 0:c.light)==null?void 0:Qm.specularEnvironmentMaps),Af=(s==null?void 0:s.imageBasedLightIntensity)??((qm=c==null?void 0:c.light)==null?void 0:qm.imageBasedLightIntensity),qf=arrayToCartecian3((s==null?void 0:s.sphericalHarmonicCoefficients)??(($m=c==null?void 0:c.light)==null?void 0:$m.sphericalHarmonicCoefficients),Af);return wf&&(Lf.specularEnvironmentMaps=wf),qf&&(Lf.sphericalHarmonicCoefficients=qf),Lf},[s==null?void 0:s.specularEnvironmentMaps,s==null?void 0:s.sphericalHarmonicCoefficients,s==null?void 0:s.imageBasedLightIntensity,(Zf=c==null?void 0:c.light)==null?void 0:Zf.specularEnvironmentMaps,(xf=c==null?void 0:c.light)==null?void 0:xf.sphericalHarmonicCoefficients,(zf=c==null?void 0:c.light)==null?void 0:zf.imageBasedLightIntensity]),Gf=React.useCallback(Lf=>{Ef(!0),E==null||E({properties:Lf.properties}),N==null||N({layerId:z.current})},[E,N]);return{tilesetUrl:kf,ref:tf,style:uf,clippingPlanes:Vf,drawClippingEnabled:Uf,drawClippingEdgeProps:Jf,builtinBoxProps:af,imageBasedLighting:Xf,handleReady:Gf}};function Tileset({id:t,isVisible:n,property:o,layer:s,feature:c,sceneProperty:d,meta:h,evalFeature:p,onComputedFeatureFetch:y,onLayerFetch:E,...L}){const{shadows:F,colorBlendMode:N,pbr:z,showWireframe:Z,showBoundingVolume:H}=o??{},nt=`${s==null?void 0:s.id}_box`,{tilesetUrl:lt,ref:J,style:mt,clippingPlanes:pi,drawClippingEnabled:Ai,drawClippingEdgeProps:md,builtinBoxProps:Gd,imageBasedLighting:Xd,handleReady:Vd}=useHooks$2({id:t,boxId:nt,isVisible:n,layer:s,feature:c,property:o,sceneProperty:d,meta:h,evalFeature:p,onComputedFeatureFetch:y,onLayerFetch:E}),nf=React.useMemo(()=>{var ef,yt;return{...((ef=s==null?void 0:s.layer)==null?void 0:ef.type)==="simple"?(yt=s==null?void 0:s.layer)==null?void 0:yt.box:{},...(Gd==null?void 0:Gd.property)||{}}},[s==null?void 0:s.layer,Gd==null?void 0:Gd.property]),rf=React.useMemo(()=>({...s,id:nt}),[s,nt]);return!n||!lt?null:jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment,{children:[jsxRuntimeExports.jsx(Rs$1,{ref:J,url:lt,customShader:z===!1?NonPBRLightingShader:z==="withTexture"?NonPBRWithTextureLightingShader:void 0,style:mt,shadows:shadowMode(F),clippingPlanes:pi,colorBlendMode:colorBlendModeFor3DTile(N),imageBasedLighting:Xd,onReady:Vd,debugWireframe:Z,debugShowBoundingVolume:H}),Gd&&jsxRuntimeExports.jsx(Box,{...L,id:nt,sceneProperty:d,property:nf,geometry:Gd.geometry,feature:c,layer:rf,isVisible:Gd.visible,evalFeature:p,onLayerEdit:Gd.handleLayerEdit}),Ai&&jsxRuntimeExports.jsx(DrawClippingPolygon,{...md})]})}const Tileset$1=React.memo(Tileset,(t,n)=>{var o,s;return t.id===n.id&&t.isVisible===n.isVisible&&t.property===n.property&&((o=t.layer)==null?void 0:o.layer)===((s=n.layer)==null?void 0:s.layer)&&t.sceneProperty===n.sceneProperty&&t.meta===n.meta&&t.evalFeature===n.evalFeature&&t.onComputedFeatureFetch===n.onComputedFeatureFetch&&t.onFeatureDelete===n.onFeatureDelete}),config$1={noFeature:!0},NON_RENDERABLE_APPEARANCE=["transition"],isRenderableAppearance=t=>!NON_RENDERABLE_APPEARANCE.includes(t),components={marker:[Marker,config$8],polyline:[Polyline,config$4],polygon:[Polygon,config$5],ellipsoid:[Ellipsoid,config$b],ellipse:[Ellipse,config$c],model:[Model,config$7],"3dtiles":[Tileset$1,config$1],box:[Box,config$d],photooverlay:[PhotoOverlay,config$6],resource:[Resource,config$2],raster:[Raster$1,config$3],heatMap:[HeatMap,config$9],frustum:[Frustum,config$a]},displayConfig={geojson:"auto",csv:"auto",czml:["resource"],kml:["resource"],wms:["raster"],mvt:["raster"],tms:["raster"],"3dtiles":["3dtiles"],"osm-buildings":["3dtiles"],"google-photorealistic":["3dtiles"],gpx:"auto",shapefile:"auto",gtfs:"auto",georss:[],gml:[],gltf:["model"],tiles:["raster"],heatMap:["heatMap"]},PICKABLE_APPEARANCE=["raster","3dtiles"],pickProperty=(t,n)=>{if(PICKABLE_APPEARANCE.includes(t)&&n.layer.type==="simple")return n.layer[t]},CACHED_COMPONENTS=new LRUCache({max:1e4}),FEATURE_DELEGATE_THRESHOLD=6e3;function Feature$1({layer:t,isHidden:n,...o}){var z,Z,H;const s=extractSimpleLayerData(t),c=!(s!=null&&s.type)||s.type==="auto"?guessType(s==null?void 0:s.url):void 0;let d=(s==null?void 0:s.type)&&displayConfig[c??s.type];(((z=t.features)==null?void 0:z.length)>FEATURE_DELEGATE_THRESHOLD||(Z=s==null?void 0:s.geojson)!=null&&Z.useAsResource)&&(d=["resource"]);const h=Array.isArray(d)&&d.every(nt=>components[nt][1].noFeature&&!components[nt][1].noLayer),p=!!((H=t==null?void 0:t.transition)!=null&&H.useTransition),y=!(s!=null&&s.updateInterval)&&!p,E=React.useMemo(()=>s!=null&&s.url?generateIDWithMD5(s.url):"",[s==null?void 0:s.url]),{requestRender:L}=useContext();React.useEffect(()=>{setTimeout(()=>{L==null||L()},300)}),React.useEffect(()=>()=>L==null?void 0:L(),[L]);const F=(nt,lt)=>{var md,Gd,Xd,Vd;if(!isRenderableAppearance(nt))return null;const J=!!((Gd=(md=o.sceneProperty)==null?void 0:md.light)!=null&&Gd.sphericalHarmonicCoefficients),mt=!!((Vd=(Xd=o.sceneProperty)==null?void 0:Xd.light)!=null&&Vd.specularEnvironmentMaps),pi=t.layer.visible!==!1&&!n,Ai=E+generateIDWithMD5(`${t.id}_${(lt==null?void 0:lt.id)??""}_${nt}_${pi}_${J}_${mt}_${JSON.stringify(lt==null?void 0:lt[nt])??""}_${JSON.stringify(t.transition)??""}`);if(y){const nf=CACHED_COMPONENTS.get(Ai);if(y&&nf)return nf}try{const[nf,rf]=components[nt]??[];if(!nf||lt&&!lt[nt]||rf.noLayer&&!lt||rf.noFeature&<||Array.isArray(d)&&!d.includes(nt)||!Array.isArray(d)&&d!=="auto"||(s==null?void 0:s.type)==="geojson"&&d==="auto"&&nt==="resource")return null;const ef=React.createElement(nf,{...o,key:p?void 0:Ai,id:p?(lt==null?void 0:lt.id)??t.id:Ai,property:lt?lt[nt]:t[nt]||pickProperty(nt,t),geometry:lt==null?void 0:lt.geometry,feature:lt,layer:t,isVisible:pi});return y&&CACHED_COMPONENTS.set(Ai,ef),ef}catch(nf){return console.error(`Error rendering component ${Ai}`,nf),null}},N=React.useMemo(()=>!h||!d||!Array.isArray(d)?null:jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment,{children:d.map(nt=>{var Xd,Vd,nf,rf,ef,yt,oe,sl,Zd,af;const[lt]=components[nt]??[],J=t.layer.visible!==!1&&!n,mt=!!((Vd=(Xd=o.sceneProperty)==null?void 0:Xd.light)!=null&&Vd.sphericalHarmonicCoefficients),pi=!!((rf=(nf=o.sceneProperty)==null?void 0:nf.light)!=null&&rf.specularEnvironmentMaps),Ai=((ef=t==null?void 0:t.layer)==null?void 0:ef.type)==="simple"&&!!((oe=(yt=t==null?void 0:t.layer)==null?void 0:yt["3dtiles"])!=null&&oe.sphericalHarmonicCoefficients),md=((sl=t==null?void 0:t.layer)==null?void 0:sl.type)==="simple"&&!!((af=(Zd=t==null?void 0:t.layer)==null?void 0:Zd["3dtiles"])!=null&&af.specularEnvironmentMaps),Gd=E+generateIDWithMD5(`${(t==null?void 0:t.id)||""}_${nt}_${J}_${mt}_${pi}_${Ai}}_${md}`);return React.createElement(lt,{...o,key:Gd,id:`${t.id}_${nt}`,property:pickProperty(nt,t)||t[nt],layer:t,isVisible:J})})}),[h,d,t,n,E,o]);return jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment,{children:N||[void 0,...t.features].flatMap(nt=>Object.keys(components).map(lt=>F(lt,nt)))})}var __defProp=Object.defineProperty,__defProps=Object.defineProperties,__getOwnPropDescs=Object.getOwnPropertyDescriptors,__getOwnPropSymbols=Object.getOwnPropertySymbols,__hasOwnProp=Object.prototype.hasOwnProperty,__propIsEnum=Object.prototype.propertyIsEnumerable,__defNormalProp=(t,n,o)=>n in t?__defProp(t,n,{enumerable:!0,configurable:!0,writable:!0,value:o}):t[n]=o,__spreadValues=(t,n)=>{for(var o in n||(n={}))__hasOwnProp.call(n,o)&&__defNormalProp(t,o,n[o]);if(__getOwnPropSymbols)for(var o of __getOwnPropSymbols(n))__propIsEnum.call(n,o)&&__defNormalProp(t,o,n[o]);return t},__spreadProps=(t,n)=>__defProps(t,__getOwnPropDescs(n));class CesiumDnD{constructor(n,o){this._initialEnableRotate=!0,this._initialEnableTranslate=!0,this._callbackProperty=new Cesium$1.CallbackProperty(()=>{var s;return(s=this._position)!=null?s:this._initialPosition},!1),this.cancelDragging=()=>{clearTimeout(this._timeout),this._entity&&(this._entity.position=this._initialPosition),this._entity=void 0,this._initialPosition=void 0,this._initialScreenPosition=void 0,this._timeout=void 0,this.viewer.scene.screenSpaceCameraController.enableRotate=this._initialEnableRotate,this.viewer.scene.screenSpaceCameraController.enableTranslate=this._initialEnableTranslate,this.viewer.canvas.removeEventListener("blur",this.cancelDragging)},this._handleDrag=s=>{var c;if(this._entity||this.viewer.isDestroyed()||!(s!=null&&s.position))return;const d=this._pick(s.position);if(!d)return;const h=()=>{var p,y,E;if(this._entity||this.viewer.isDestroyed())return;this._timeout=void 0,this._initialPosition=d.position,this._initialScreenPosition=s.position.clone();const L=(p=d.position)==null?void 0:p.getValue(this.viewer.clock.currentTime);if(L){const z=this.viewer.scene.globe.ellipsoid.cartesianToCartographic(L).height;this._ellipsoid=CesiumDnD.enlargeEllipsoid(this.viewer.scene.globe.ellipsoid,z),this.viewer.scene.mode===Cesium$1.SceneMode.SCENE2D||this.viewer.scene.mode===Cesium$1.SceneMode.COLUMBUS_VIEW?this._initialHeight=z:this._initialHeight=void 0}const F=this._resetHeight(this._convertCartesian2ToPosition(s.position)),N=this._context(F,s.position);if(N&&((E=(y=this.options)==null?void 0:y.onDrag)==null?void 0:E.call(y,d,F,N))===!1){this._initialPosition=void 0,this._initialScreenPosition=void 0,this._ellipsoid=void 0;return}this._position=F,this._entity=d,this._initialEnableRotate=this.viewer.scene.screenSpaceCameraController.enableRotate,this._initialEnableTranslate=this.viewer.scene.screenSpaceCameraController.enableTranslate,this.viewer.scene.mode===Cesium$1.SceneMode.SCENE3D?this.viewer.scene.screenSpaceCameraController.enableRotate=!1:this.viewer.scene.screenSpaceCameraController.enableTranslate=!1,this.viewer.canvas.addEventListener("blur",this.cancelDragging),d.position=this._callbackProperty};if(window.clearTimeout(this._timeout),typeof((c=this.options)==null?void 0:c.dragDelay)>"u"){h();return}this._timeout=window.setTimeout(h,this.options.dragDelay)},this._handleDragging=s=>{var c,d;if(clearTimeout(this._timeout),!this._entity||this.viewer.isDestroyed()||!(s!=null&&s.endPosition))return;const h=this._resetHeight(this._convertCartesian2ToPosition(s.endPosition)),p=this._context(h,s.endPosition);if(!p)return;const y=(d=(c=this.options)==null?void 0:c.onDragging)==null?void 0:d.call(c,this._entity,h,__spreadProps(__spreadValues({},p),{previousScreenPosition:s.startPosition}));y!==!1&&(typeof y<"u"?this._position=y:h&&(this._position=h))},this._handleDrop=s=>{var c,d;if(clearTimeout(this._timeout),!this._entity||this.viewer.isDestroyed()||!(s!=null&&s.position))return;const h=this._entity;h.position=this._initialPosition,this._position=void 0,this._entity=void 0,this._timeout=void 0,this.viewer.scene.screenSpaceCameraController.enableRotate=this._initialEnableRotate,this.viewer.scene.screenSpaceCameraController.enableTranslate=this._initialEnableTranslate,this.viewer.canvas.removeEventListener("blur",this.cancelDragging);const p=this._resetHeight(this._convertCartesian2ToPosition(s.position)),y=this._context(p,s.position);this._initialPosition=void 0,this._initialScreenPosition=void 0,this._initialHeight=void 0,this._ellipsoid=void 0,y&&((d=(c=this.options)==null?void 0:c.onDrop)==null?void 0:d.call(c,h,p,y))!==!1&&p&&(h.position=p)},this.viewer=n,this.options=o,o!=null&&o.initialDisabled||this.enable()}get isDragging(){return!!this._entity}enable(){var n,o,s,c,d,h;this._handler=new Cesium$1.ScreenSpaceEventHandler(this.viewer.canvas),this._handler.setInputAction(this._handleDrag,(o=(n=this.options)==null?void 0:n.dragInputType)!=null?o:Cesium$1.ScreenSpaceEventType.LEFT_DOWN),this._handler.setInputAction(this._handleDragging,(c=(s=this.options)==null?void 0:s.draggingInputType)!=null?c:Cesium$1.ScreenSpaceEventType.MOUSE_MOVE),this._handler.setInputAction(this._handleDrop,(h=(d=this.options)==null?void 0:d.dropInputType)!=null?h:Cesium$1.ScreenSpaceEventType.LEFT_UP)}disable(){var n;this.cancelDragging(),(n=this._handler)==null||n.destroy(),this._handler=void 0}get isActive(){return!!this._handler}_pick(n){var o;return(o=this.viewer.scene.pick(n))==null?void 0:o.id}_context(n,o){if(this._initialScreenPosition)return{position:n,screenPosition:o,initialPosition:this._initialPosition,initialScreenPosition:this._initialScreenPosition}}_convertCartesian2ToPosition(n){var o;return this.viewer.scene.camera.pickEllipsoid(n,(o=this._ellipsoid)!=null?o:this.viewer.scene.globe.ellipsoid)}_resetHeight(n){if(n&&(this.viewer.scene.mode===Cesium$1.SceneMode.SCENE2D||this.viewer.scene.mode===Cesium$1.SceneMode.COLUMBUS_VIEW)&&this._initialHeight){const o=this.viewer.scene.globe.ellipsoid.cartesianToCartographic(n);return Cesium$1.Cartesian3.fromRadians(o.longitude,o.latitude,this._initialHeight)}return n}static enlargeEllipsoid(n,o){return new Cesium$1.Ellipsoid(n.radii.x+o,n.radii.y+o,n.radii.z+o)}}function e2eAccessToken(){return window.REEARTH_E2E_ACCESS_TOKEN}function setE2ECesiumViewer(t){t?window.REEARTH_E2E_CESIUM_VIEWER=t:delete window.REEARTH_E2E_CESIUM_VIEWER}const targetWidth=1e6,targetLength=1e6;function useCameraLimiter(t,n,o){var p,y;const s=React.useMemo(()=>{var L,F;const E=(L=t.current)==null?void 0:L.cesiumElement;if(!(!E||E.isDestroyed()||!(o!=null&&o.cameraLimitterEnabled)||!((F=o.cameraLimitterTargetArea)!=null&&F.lng)||!o.cameraLimitterTargetArea.lat))return getGeodesic(E,o.cameraLimitterTargetArea.lng,o.cameraLimitterTargetArea.lat)},[t,o==null?void 0:o.cameraLimitterEnabled,(p=o==null?void 0:o.cameraLimitterTargetArea)==null?void 0:p.lng,(y=o==null?void 0:o.cameraLimitterTargetArea)==null?void 0:y.lat]),c=React.useMemo(()=>{if(!s)return;const E=typeof(o==null?void 0:o.cameraLimitterTargetWidth)=="number"?o.cameraLimitterTargetWidth:targetWidth,L=typeof(o==null?void 0:o.cameraLimitterTargetLength)=="number"?o.cameraLimitterTargetLength:targetLength,{cartesianArray:F,cartographicDimensions:N}=calcBoundaryBox(s,L/2,E/2);return{cartographicDimensions:N,cartesianArray:F}},[o==null?void 0:o.cameraLimitterTargetWidth,o==null?void 0:o.cameraLimitterTargetLength,s]),[d,h]=React.useState();return React.useEffect(()=>{var lt;const E=(lt=t.current)==null?void 0:lt.cesiumElement;if(!E||E.isDestroyed()||!(o!=null&&o.cameraLimitterTargetArea)||!s)return;const L=new Cesium$1.Camera(E.scene);L.setView({destination:Cesium$1.Cartesian3.fromDegrees(o.cameraLimitterTargetArea.lng,o.cameraLimitterTargetArea.lat,o.cameraLimitterTargetArea.height),orientation:{heading:o==null?void 0:o.cameraLimitterTargetArea.heading,pitch:o==null?void 0:o.cameraLimitterTargetArea.pitch,roll:o==null?void 0:o.cameraLimitterTargetArea.roll,up:L.up}});const F=L.computeViewRectangle();if(!F)return;const N=Cesium$1.Rectangle.computeWidth(F)*Cesium$1.Math.PI*1e6,z=Cesium$1.Rectangle.computeHeight(F)*Cesium$1.Math.PI*1e6,{cameraLimitterTargetWidth:Z=targetWidth,cameraLimitterTargetLength:H=targetLength}=o??{},{cartesianArray:nt}=calcBoundaryBox(s,H/2+z,Z/2+N);h(nt)},[t,o,s]),React.useEffect(()=>{var F,N;const E=(F=t==null?void 0:t.current)==null?void 0:F.cesiumElement,L=getCamera((N=t==null?void 0:t.current)==null?void 0:N.cesiumElement);!E||E.isDestroyed()||!L||!(o!=null&&o.cameraLimitterEnabled)||!c||E.camera.setView({destination:getAllowedCameraDestination(L,c),orientation:{heading:E.camera.heading,pitch:E.camera.pitch,roll:E.camera.roll,up:E.camera.up}})},[n,t,o,c]),{cameraViewBoundaries:c==null?void 0:c.cartesianArray,cameraViewOuterBoundaries:d,cameraViewBoundariesMaterial}}const cameraViewBoundariesMaterial=new Cesium$1.PolylineDashMaterialProperty({color:Cesium$1.Color.RED}),getGeodesic=(t,n,o)=>{const s=t.scene.globe.ellipsoid,c=Cesium$1.Cartesian3.fromDegrees(n,o,0),d=Cesium$1.Cartographic.fromCartesian(c),h=s.geodeticSurfaceNormal(c),p=Cesium$1.Cartesian3.normalize(Cesium$1.Cartesian3.cross(Cesium$1.Cartesian3.UNIT_Z,h,new Cesium$1.Cartesian3),new Cesium$1.Cartesian3),y=Cesium$1.Cartesian3.normalize(Cesium$1.Cartesian3.cross(h,p,new Cesium$1.Cartesian3),new Cesium$1.Cartesian3),E=new Cesium$1.EllipsoidGeodesic(d,Cesium$1.Cartographic.fromCartesian(y),s),L=new Cesium$1.EllipsoidGeodesic(d,Cesium$1.Cartographic.fromCartesian(p),s);return{vertical:E,horizontal:L}},calcBoundaryBox=(t,n,o)=>{const s=t.vertical.interpolateUsingSurfaceDistance(n),c=t.vertical.interpolateUsingSurfaceDistance(-n),d=t.horizontal.interpolateUsingSurfaceDistance(o),h=t.horizontal.interpolateUsingSurfaceDistance(-o),p=new Cesium$1.Cartographic(d.longitude,s.latitude,0),y=new Cesium$1.Cartographic(h.longitude,s.latitude,0),E=new Cesium$1.Cartographic(d.longitude,c.latitude,0),L=new Cesium$1.Cartographic(h.longitude,c.latitude,0);return{cartographicDimensions:{rightDimension:d,leftDimension:h,topDimension:s,bottomDimension:c},cartesianArray:[Cesium$1.Cartographic.toCartesian(p),Cesium$1.Cartographic.toCartesian(y),Cesium$1.Cartographic.toCartesian(L),Cesium$1.Cartographic.toCartesian(E),Cesium$1.Cartographic.toCartesian(p)]}},getAllowedCameraDestination=(t,n)=>{const o=Cesium$1.Cartographic.fromDegrees(t==null?void 0:t.lng,t==null?void 0:t.lat,t==null?void 0:t.height),s=new Cesium$1.Cartographic(Cesium$1.Math.clamp(o.longitude,n.cartographicDimensions.leftDimension.longitude,n.cartographicDimensions.rightDimension.longitude),Cesium$1.Math.clamp(o.latitude,n.cartographicDimensions.bottomDimension.latitude,n.cartographicDimensions.topDimension.latitude),o.height);return Cesium$1.Cartographic.toCartesian(s)},makeMouseEventProps=(t,n)=>{if(!t||t.isDestroyed())return;const o=n.position||n.startPosition;return{x:o==null?void 0:o.x,y:o==null?void 0:o.y,...o?getLocationFromScreen(t.scene,o.x,o.y,!0)??{}:{}}},useLayerSelectWithRect=({cesium:t,engineAPI:n,featureFlags:o,onLayerSelectWithRectStart:s,onLayerSelectWithRectMove:c,onLayerSelectWithRectEnd:d})=>{const h=React.useRef([0,0]),p=React.useRef(!1),y=React.useRef(!1),E=React.useCallback((z,Z)=>{var nt;if(p.current||y.current||o!==INTERACTION_MODES.selection||!((nt=t.current)!=null&&nt.cesiumElement)||t.current.cesiumElement.isDestroyed())return;const H=makeMouseEventProps(t.current.cesiumElement,z)??{};h.current=[H.x??0,H.y??0],y.current=!0,p.current=!1,s==null||s({...H,pressedKey:Z})},[s,t,o]),L=React.useCallback((z,Z,H)=>{var md;if(!y.current||!((md=t.current)!=null&&md.cesiumElement)||t.current.cesiumElement.isDestroyed())return;const nt=makeMouseEventProps(t.current.cesiumElement,z)??{};let[lt,J]=h.current,[mt,pi]=[nt.x??0,nt.y??0];if(mt-lt===0&&pi-J===0)return nt;H||(p.current=!0),lt>mt&&([mt,lt]=[lt,mt]),J>pi&&([pi,J]=[J,pi]);const Ai={...nt,pressedKey:Z,x:mt,y:pi,startX:lt,startY:J,width:mt-lt,height:pi-J};return c==null||c(Ai),Ai},[c,t]),F=React.useCallback((z,Z)=>{var Vd;if(!y.current||!((Vd=t.current)!=null&&Vd.cesiumElement)||t.current.cesiumElement.isDestroyed())return;const H=L(z,Z,!0),{startX:nt=0,startY:lt=0,x:J=0,y:mt=0,width:pi=0,height:Ai=0}=H??{},[md,Gd]=[nt+pi/2,lt+Ai/2],Xd=p.current?n.pickManyFromViewport([md,Gd],pi,Ai):n.pickManyFromViewport([J,mt],1,1);d==null||d({...H,pressedKey:Z,features:Xd??[],isClick:!p.current}),p.current=!1,y.current=!1},[d,t,n,L]);return React.useMemo(()=>Object.fromEntries(Object.entries({start:{handler:E,keys:["shift"]},move:{handler:L,keys:["shift"]},end:{handler:F,keys:["shift"]}}).map(([Z,H])=>[Z,{handler:H.handler,...Object.fromEntries(H.keys.map(nt=>[nt,lt=>H.handler(lt,nt)]))}])),[F,L,E])},colorScratch=new Cesium$1.Color;function pickFramebufferEnd(t){const n=t.width??1,o=t.height??1,s=this._context,c=s.readPixels({x:t.x,y:t.y,width:n,height:o,framebuffer:this._fb.framebuffer}),d=new Set;for(let h=0;h<c.length;h+=4)try{colorScratch.red=Cesium$1.Color.byteToFloat(c[h]),colorScratch.green=Cesium$1.Color.byteToFloat(c[h+1]),colorScratch.blue=Cesium$1.Color.byteToFloat(c[h+2]),colorScratch.alpha=Cesium$1.Color.byteToFloat(c[h+3]);const p=s.getObjectByPickColor(colorScratch);p!=null&&d.add(p)}catch(p){console.error(p)}return Array.from(d.values())}const pickingFrustumScratch=new Cesium$1.PerspectiveOffCenterFrustum,pixelSizeScratch=new Cesium$1.Cartesian2;function getPickCullingVolume(t,n,o,s,c){const d=t.camera,h=d.frustum;invariant$1(h instanceof Cesium$1.PerspectiveFrustum);const p=h.near,y=Math.tan(h.fovy/2),E=h.aspectRatio*y,L=n.x,F=n.y,N=2*(L-c.x)/c.width-1,z=2*(c.height-F-c.y)/c.height-1,Z=N*p*E,H=z*p*y,nt=h.getPixelDimensions(c.width,c.height,p,getPixelRatio(t),pixelSizeScratch),lt=nt.x*o/2,J=nt.y*s/2,mt=pickingFrustumScratch;return mt.top=H+J,mt.bottom=H-J,mt.right=Z+lt,mt.left=Z-lt,mt.near=p,mt.far=h.far,mt.computeCullingVolume(d.positionWC,d.directionWC,d.upWC)}function getIntersection(t,n,o=new Cesium$1.BoundingRectangle){invariant$1(t.width>=0&&t.height>=0),invariant$1(n.width>=0&&n.height>=0);const s=Math.max(t.x,n.x),c=Math.min(t.x+t.width,n.x+n.width),d=Math.max(t.y,n.y),h=Math.min(t.y+t.height,n.y+n.height);if(!(s>=c||d>=h))return o.x=s,o.y=d,o.width=c-s,o.height=h-d,o.clone(new Cesium$1.BoundingRectangle)}const pickTilesetPassState=new Cesium3DTilePassState({pass:Cesium3DTilePass$1.PICK}),zeroColor=new Cesium$1.Color(0,0,0,0),positionScratch=new Cesium$1.Cartesian2,rectangleScratch=new Cesium$1.BoundingRectangle;function pickManyFromViewport(t,n,o,s){const c=t.groundPrimitives.show;t.groundPrimitives.show=!1,invariant$1(o>0&&s>0);const d=t.context,h=t.defaultView;t.view=h;const p=h.viewport;p.x=0,p.y=0,p.width=d.drawingBufferWidth,p.height=d.drawingBufferHeight,h.passState.viewport=Cesium$1.BoundingRectangle.clone(p,h.passState.viewport),t.jobScheduler.disableThisFrame(),t.updateFrameState();const y=SceneTransforms.transformWindowToDrawingBuffer(t,n,positionScratch),E=getPixelRatio(t),L=o*E,F=s*E,N=t.frameState;N.cullingVolume=getPickCullingVolume(t,y,L,F,p),N.invertClassification=!1,N.passes.pick=!0,N.tilesetPassState=pickTilesetPassState,d.uniformState.update(N),t.updateEnvironment(),rectangleScratch.x=y.x-L/2,rectangleScratch.y=t.drawingBufferHeight-y.y-F/2,rectangleScratch.height=F,rectangleScratch.width=L;const z=getIntersection(rectangleScratch,h.viewport,rectangleScratch);invariant$1(z!=null);const Z=h.pickFramebuffer.begin(z,h.viewport);t.updateAndExecuteCommands(Z,zeroColor),t.resolveFramebuffers(Z);const H=pickFramebufferEnd.apply(h.pickFramebuffer,[rectangleScratch]);return d.endFrame(),t.groundPrimitives.show=c,H}const pickManyFromViewportAsFeature=(t,n,o,s,c)=>{const d=pickManyFromViewport(t.scene,n,o,s),h=[];for(const p of d){const[y,E]=convertObjToComputedFeature(t.clock.currentTime,p)??[],L=E?{...E,layerId:y}:void 0;!L||c&&!c(L)||h.push(L)}return h},cartographicScratch=new Cartographic,cartesianScratch1$1=new Cartesian3,cartesianScratch2$1=new Cartesian3;function createPoint(t,n){if(t.length===1)try{const o=Cartographic.fromCartesian(t[0],n,cartographicScratch);return point([CesiumMath$1.toDegrees(o.longitude),CesiumMath$1.toDegrees(o.latitude)]).geometry}catch(o){console.error(o)}}function createCircle(t,n){if(t.length!==2)return;const o=Cartesian3.distance(t[0],t[1]);if(o!==0)try{const s=Cartographic.fromCartesian(t[0],n,cartographicScratch);return ellipse([CesiumMath$1.toDegrees(s.longitude),CesiumMath$1.toDegrees(s.latitude)],o,o,{units:"meters"}).geometry}catch(s){console.error(s)}}function createRectangle(t,n){if(!(t.length!==2&&t.length!==3))try{if(t.length===2)return lineString(t.map(F=>{const N=Cartographic.fromCartesian(F,n,cartographicScratch);return[CesiumMath$1.toDegrees(N.longitude),CesiumMath$1.toDegrees(N.latitude)]})).geometry;const[o,s,c]=t,d=Cartesian3.projectVector(Cartesian3.subtract(c,o,cartesianScratch1$1),Cartesian3.subtract(s,o,cartesianScratch2$1),cartesianScratch1$1),h=Cartesian3.subtract(c,Cartesian3.add(o,d,cartesianScratch1$1),cartesianScratch2$1),p=Cartesian3.add(o,h,cartesianScratch1$1),y=Cartesian3.add(s,h,cartesianScratch2$1);return polygon([[o,s,y,p,o].map(L=>{const F=Cartographic.fromCartesian(L,n,cartographicScratch);return[CesiumMath$1.toDegrees(F.longitude),CesiumMath$1.toDegrees(F.latitude)]})]).geometry}catch(o){console.error(o)}}function createPolyline(t,n){if(!(t.length<2))try{return lineString(t.map(s=>{const c=Cartographic.fromCartesian(s,n,cartographicScratch);return[CesiumMath$1.toDegrees(c.longitude),CesiumMath$1.toDegrees(c.latitude)]})).geometry}catch(o){console.error(o)}}function createPolygon(t,n){if(!(t.length<2))try{return t.length===2?lineString(t.map(c=>{const d=Cartographic.fromCartesian(c,n,cartographicScratch);return[CesiumMath$1.toDegrees(d.longitude),CesiumMath$1.toDegrees(d.latitude)]})).geometry:polygon([[...t,t[0]].map(s=>{const c=Cartographic.fromCartesian(s,n,cartographicScratch);return[CesiumMath$1.toDegrees(c.longitude),CesiumMath$1.toDegrees(c.latitude)]})]).geometry}catch(o){console.error(o)}}function createGeometry({type:t,controlPoints:n}){switch(t){case"marker":return createPoint(n);case"polyline":return createPolyline(n);case"circle":case"extrudedCircle":return createCircle(n);case"rectangle":case"extrudedRectangle":return createRectangle(n);case"polygon":case"extrudedPolygon":return createPolygon(n);default:return}}function useEngineRef(t,n){const o=React.useRef(),s=React.useRef({click:[],doubleclick:[],mousedown:[],mouseup:[],rightclick:[],rightdown:[],rightup:[],middleclick:[],middledown:[],middleup:[],mousemove:[],mouseenter:[],mouseleave:[],wheel:[]}),c=React.useRef([]),d=React.useMemo(()=>({name:"cesium",requestRender:()=>{var p,y;const h=(p=n.current)==null?void 0:p.cesiumElement;!h||h.isDestroyed()||(y=h.scene)==null||y.requestRender()},getCamera:()=>{var p;const h=(p=n.current)==null?void 0:p.cesiumElement;if(!(!h||h.isDestroyed()))return getCamera(h)},getLocationFromScreen:(h,p,y)=>{var L;const E=(L=n.current)==null?void 0:L.cesiumElement;if(!(!E||E.isDestroyed()))return getLocationFromScreen(E.scene,h,p,y)},getCameraFovInfo:({withTerrain:h,calcViewSize:p})=>{var E;const y=(E=n.current)==null?void 0:E.cesiumElement;if(!(!y||y.isDestroyed()))try{let L,F,N;return h&&(F=getCameraTerrainIntersection(y.scene),F&&(L=cartesianToLatLngHeight(F,y.scene))),L||(F=new Cesium__namespace.Cartesian3,getCameraEllipsoidIntersection(y.scene,F),L=cartesianToLatLngHeight(F,y.scene)),p&&F&&y.scene.camera.frustum instanceof Cesium__namespace.PerspectiveFrustum&&(N=Cesium__namespace.Cartesian3.distance(y.scene.camera.positionWC,F)*Math.tan(y.scene.camera.frustum.fov/2)),{center:L,viewSize:N}}catch{return}},sampleTerrainHeight:async(h,p)=>{var E;const y=(E=n.current)==null?void 0:E.cesiumElement;if(!(!y||y.isDestroyed()))return await sampleTerrainHeight(y.scene,h,p)},computeGlobeHeight:(h,p,y)=>{var L;const E=(L=n.current)==null?void 0:L.cesiumElement;if(!(!E||E.isDestroyed()))return E.scene.globe.getHeight(Cesium__namespace.Cartographic.fromDegrees(h,p,y))},getGlobeHeight:()=>{var E;const h=(E=n.current)==null?void 0:E.cesiumElement;if(!h||h.isDestroyed())return;const p=h.scene,{globeHeight:y}=p;if(!(!p||y==null))return y},toXYZ:(h,p,y,E)=>{var N;const L=(N=n.current)==null?void 0:N.cesiumElement;if(!L||L.isDestroyed())return;const F=Cesium__namespace.Cartesian3.fromDegrees(h,p,y,E!=null&&E.useGlobeEllipsoid?L.scene.globe.ellipsoid:void 0);return[F.x,F.y,F.z]},toLngLatHeight:(h,p,y,E)=>{var N;const L=(N=n.current)==null?void 0:N.cesiumElement;if(!L||L.isDestroyed())return;const F=Cesium__namespace.Cartographic.fromCartesian(Cesium__namespace.Cartesian3.fromElements(h,p,y),E!=null&&E.useGlobeEllipsoid?L.scene.globe.ellipsoid:void 0);return[Cesium$1.Math.toDegrees(F.longitude),Cesium$1.Math.toDegrees(F.latitude),F.height]},toWindowPosition:h=>{var E;const p=(E=n.current)==null?void 0:E.cesiumElement;if(!p||p.isDestroyed())return;const y=Cesium__namespace.SceneTransforms.wgs84ToWindowCoordinates(p.scene,Cesium__namespace.Cartesian3.fromElements(...h));return[y.x,y.y]},convertScreenToPositionOffset:(h,p)=>{var Vd;const y=(Vd=n.current)==null?void 0:Vd.cesiumElement;if(!y||y.isDestroyed())return;const E=Cesium__namespace.Cartesian3.fromElements(...h),L=new Cesium__namespace.Cartesian3,F=new Cesium__namespace.Cartographic,N=new Cesium__namespace.Cartesian3,z=new Cesium__namespace.Ellipsoid,Z=new Cesium__namespace.Ray,H=new Cesium__namespace.Cartesian3,nt=y.scene,lt=nt.globe.ellipsoid;let J;try{J=Cesium__namespace.Cartographic.fromCartesian(E,lt,F)}catch{return}N.x=lt.radii.x+J.height,N.y=lt.radii.y+J.height,N.z=lt.radii.z+J.height;const mt=Cesium__namespace.Ellipsoid.fromCartesian3(N,z),pi=new Cesium__namespace.Cartesian2;try{[pi.x,pi.y]=d.toWindowPosition(h)??[0,0]}catch{return}pi.x+=p[0],pi.y+=p[1];const Ai=nt.camera.getPickRay(pi,Z);if(Ai==null)return;const md=Cesium__namespace.IntersectionTests.rayEllipsoid(Ai,mt);if(md==null)return;const Gd=Cesium__namespace.Ray.getPoint(Ai,md.start,H),Xd=Cesium__namespace.Cartesian3.subtract(Gd,E,L);return[Xd.x,Xd.y,Xd.z]},isPositionVisible:h=>{var E;const p=(E=n.current)==null?void 0:E.cesiumElement;if(!p||p.isDestroyed())return!1;const y=new EllipsoidalOccluder(Cesium__namespace.Ellipsoid.WGS84,Cesium__namespace.Cartesian3.ZERO);return y.cameraPosition=p.scene.camera.position,y.isPointVisible(Cesium__namespace.Cartesian3.fromElements(...h))},setView:h=>{var E;const p=(E=n.current)==null?void 0:E.cesiumElement;if(!p||p.isDestroyed())return!1;const y=p.scene;if(h.lng||h.lat||h.height){const L=Cesium__namespace.Cartesian3.fromDegrees(h.lng,h.lat,h.height);y.camera.position.x=L.x,y.camera.position.y=L.y,y.camera.position.z=L.z}(h.heading||h.pitch)&&y.camera.setView({orientation:{heading:h.heading,pitch:h.pitch}}),h.fov&&y.camera.frustum instanceof Cesium__namespace.PerspectiveFrustum&&(y.camera.frustum.fov=h.fov)},getExtrudedHeight:(h,p)=>{var E;const y=(E=n.current)==null?void 0:E.cesiumElement;if(!(!y||y.isDestroyed()))return getExtrudedHeight(y.scene,new Cesium__namespace.Cartesian3(h[0],h[1],h[2]),new Cesium__namespace.Cartesian2(p[0],p[1]))},getSurfaceDistance:(h,p)=>{var F;const y=(F=n.current)==null?void 0:F.cesiumElement;if(!y||y.isDestroyed())return;const E=y.scene,L=new Cesium__namespace.EllipsoidGeodesic(void 0,void 0,E.globe.ellipsoid);return L.setEndPoints(Cesium__namespace.Cartographic.fromCartesian(h,E.globe.ellipsoid,new Cesium__namespace.Cartographic),Cesium__namespace.Cartographic.fromCartesian(p,E.globe.ellipsoid,new Cesium__namespace.Cartographic)),L.surfaceDistance},equalsEpsilon2d:(h,p,y=0,E=0)=>Cesium__namespace.Cartesian2.equalsEpsilon(new Cesium__namespace.Cartesian2(h[0],h[1]),new Cesium__namespace.Cartesian2(p[0],p[1]),y,E),equalsEpsilon3d:(h,p,y=0,E=0)=>Cesium__namespace.Cartesian3.equalsEpsilon(new Cesium__namespace.Cartesian3(h[0],h[1],h[2]),new Cesium__namespace.Cartesian3(p[0],p[1],p[2]),y,E),createGeometry:({type:h,controlPoints:p})=>createGeometry({type:h,controlPoints:p.map(y=>new Cesium__namespace.Cartesian3(...y))}),setCursor:h=>{var y;const p=(y=n.current)==null?void 0:y.cesiumElement;if(!(!p||p.isDestroyed()))return p.canvas.style.cursor=h??"auto",null},flyTo:(h,p)=>{var y,E,L,F,N;if(h&&typeof h=="object"){const z=(y=n.current)==null?void 0:y.cesiumElement;if(!z||z.isDestroyed())return;(E=o.current)==null||E.call(o),o.current=flyTo((L=z.scene)==null?void 0:L.camera,{...getCamera(z),...h},p)}if(h&&typeof h=="string"){const z=(F=n.current)==null?void 0:F.cesiumElement;if(!z||z.isDestroyed())return;const Z=h,H=findEntity(z,Z,Z,!0),nt=getTag(H);if(H instanceof Cesium__namespace.Primitive){z.scene.camera.flyToBoundingSphere(Cesium__namespace.BoundingSphere.fromTransformation(H.modelMatrix));return}if(H instanceof Cesium__namespace.GroundPrimitive){z.scene.camera.flyToBoundingSphere(nt==null?void 0:nt.originalProperties);return}if(H&&!(H instanceof Cesium__namespace.Cesium3DTileFeature||H instanceof Cesium__namespace.Cesium3DTilePointFeature||H instanceof Cesium__namespace.Model||H instanceof Cesium__namespace.Primitive||H instanceof Cesium__namespace.GroundPrimitive))z.flyTo(H,p);else{for(const mt of[z.dataSourceDisplay.dataSources,z.dataSources])for(let pi=0;pi<mt.length;pi++){const Ai=mt.get(pi);if(Ai.entities.values.find(Xd=>{var Vd;return((Vd=getTag(Xd))==null?void 0:Vd.layerId)===Z})){z.flyTo(Ai,p);return}}const lt=[];for(const mt of z.entities.values)((N=getTag(mt))==null?void 0:N.layerId)===Z&<.push(mt);if(lt.length){z.flyTo(lt,p);return}const J=findEntity(z,Z);if(J instanceof Cesium__namespace.Primitive){z.scene.camera.flyToBoundingSphere(Cesium__namespace.BoundingSphere.fromTransformation(J.modelMatrix));return}J&&!(J instanceof Cesium__namespace.Cesium3DTileFeature||J instanceof Cesium__namespace.Cesium3DTilePointFeature||J instanceof Cesium__namespace.Model||J instanceof Cesium__namespace.Primitive||J instanceof Cesium__namespace.GroundPrimitive)&&z.flyTo(J,p)}}},flyToBBox:(h,p)=>{var F,N;const y=(F=n.current)==null?void 0:F.cesiumElement;if(!y||y.isDestroyed())return;(N=o.current)==null||N.call(o);const E=Cesium__namespace.BoundingSphere.fromRectangle3D(Cesium__namespace.Rectangle.fromDegrees(...h)),L=y.scene.camera;y.camera.flyToBoundingSphere(E,{offset:{heading:p!=null&&p.heading?Cesium$1.Math.toDegrees(p.heading):y.scene.camera.heading,pitch:p!=null&&p.pitch?Cesium$1.Math.toDegrees(p.pitch):L.pitch,range:(p==null?void 0:p.range)??0},duration:p==null?void 0:p.duration}),o.current=()=>{L==null||L.cancelFlight()}},rotateOnCenter:h=>{var L;const p=(L=n.current)==null?void 0:L.cesiumElement;if(!p||p.isDestroyed())return;const y=p.scene,E=getCameraEllipsoidIntersection(y,new Cesium__namespace.Cartesian3);E&&y.camera.rotate(E,h)},overrideScreenSpaceController:h=>{var L,F;const p=(L=n.current)==null?void 0:L.cesiumElement;if(!p||p.isDestroyed())return;const y=(F=p.scene)==null?void 0:F.screenSpaceCameraController,E=getOverriddenScreenSpaceCameraOptions(h);Object.assign(y,E)},lookAt:(h,p)=>{var E,L,F;const y=(E=n.current)==null?void 0:E.cesiumElement;if(!(!y||y.isDestroyed())){if(p!=null&&p.withoutAnimation)return lookAtWithoutAnimation(y.scene,{...getCamera(y),...h});(L=o.current)==null||L.call(o),o.current=lookAt((F=y.scene)==null?void 0:F.camera,{...getCamera(y),...h},p)}},lookAtLayer:h=>{var Z,H;const p=(Z=n.current)==null?void 0:Z.cesiumElement;if(!p||p.isDestroyed())return;const y=p.entities.getById(h);if(!y)return;const E=(H=y.position)==null?void 0:H.getValue(p.clock.currentTime);if(!E)return;const L=p.camera.positionWC,F=Cesium__namespace.Cartesian3.distance(E,L);if(Math.round(F*1e3)/1e3===5e3)return;const N=getCamera(p),z=new Cesium__namespace.HeadingPitchRange((N==null?void 0:N.heading)??0,(N==null?void 0:N.pitch)??-90,5e3);p.zoomTo(y,z)},getViewport:()=>{var y;const h=(y=n.current)==null?void 0:y.cesiumElement;if(!h||h.isDestroyed())return;const p=h.camera.computeViewRectangle();return p?{north:Cesium$1.Math.toDegrees(p.north),south:Cesium$1.Math.toDegrees(p.south),west:Cesium$1.Math.toDegrees(p.west),east:Cesium$1.Math.toDegrees(p.east)}:void 0},zoomIn:(h,p)=>{var E;const y=(E=n.current)==null?void 0:E.cesiumElement;!y||y.isDestroyed()||zoom({viewer:y,relativeAmount:1/h},p)},zoomOut:(h,p)=>{var E;const y=(E=n.current)==null?void 0:E.cesiumElement;!y||y.isDestroyed()||zoom({viewer:y,relativeAmount:h},p)},orbit:h=>{var lt;const p=(lt=n.current)==null?void 0:lt.cesiumElement;if(!p||p.isDestroyed())return;const y=p.scene,E=y.camera,L=.02,F=h+Cesium$1.Math.PI_OVER_TWO,N=Math.cos(F)*L,z=Math.sin(F)*L,Z=Cesium__namespace.Matrix4.clone(E.transform),H=getCenterCamera({camera:E,scene:y}),nt=Cesium__namespace.Transforms.eastNorthUpToFixedFrame(H||E.positionWC,y.globe.ellipsoid);E.lookAtTransform(nt),p.scene.mode!==Cesium__namespace.SceneMode.SCENE3D?E.move(new Cesium__namespace.Cartesian3(N,z,0),Math.max(y.canvas.clientWidth,y.canvas.clientHeight)/100*E.positionCartographic.height*L):H?(E.rotateLeft(N),E.rotateUp(z)):(E.look(Cesium__namespace.Cartesian3.UNIT_Z,N),E.look(E.right,z)),E.lookAtTransform(Z)},rotateRight:h=>{var N;const p=(N=n.current)==null?void 0:N.cesiumElement;if(!p||p.isDestroyed())return;const y=p.scene,E=y.camera,L=Cesium__namespace.Matrix4.clone(E.transform),F=Cesium__namespace.Transforms.eastNorthUpToFixedFrame(E.positionWC,y.globe.ellipsoid);p.scene.mode!==Cesium__namespace.SceneMode.SCENE3D?(E.twistRight(h- -E.heading),E.twistLeft(h- -E.heading)):(E.lookAtTransform(F),E.rotateRight(h- -E.heading),E.lookAtTransform(L))},changeSceneMode:(h,p=2)=>{var E,L,F,N;const y=(E=n.current)==null?void 0:E.cesiumElement;if(!(!y||y.isDestroyed()||!y.scene))switch(h){case"2d":(L=y==null?void 0:y.scene)==null||L.morphTo2D(p);break;case"columbus":(F=y==null?void 0:y.scene)==null||F.morphToColumbusView(p);break;case"3d":default:(N=y==null?void 0:y.scene)==null||N.morphTo3D(p);break}},getClock:()=>{var y;const h=(y=n.current)==null?void 0:y.cesiumElement;if(!h||h.isDestroyed()||!h.clock)return;const p=h.clock;return getClock(p)},captureScreen:(h,p)=>{var E;const y=(E=n.current)==null?void 0:E.cesiumElement;if(!(!y||y.isDestroyed()))return y.scene.requestRender(),y.render(),y.canvas.toDataURL(h,p)},enableScreenSpaceCameraController:(h=!0)=>{var E;const p=(E=n.current)==null?void 0:E.cesiumElement;if(!p||p.isDestroyed()||!p.scene)return;const y=!!h;p.scene.screenSpaceCameraController.enableRotate=y,p.scene.screenSpaceCameraController.enableTranslate=y,p.scene.screenSpaceCameraController.enableZoom=y,p.scene.screenSpaceCameraController.enableTilt=y,p.scene.screenSpaceCameraController.enableLook=y},lookHorizontal:h=>{var y;const p=(y=n.current)==null?void 0:y.cesiumElement;!p||p.isDestroyed()||!p.scene||!h||lookHorizontal(p.scene,h)},lookVertical:h=>{var y;const p=(y=n.current)==null?void 0:y.cesiumElement;!p||p.isDestroyed()||!p.scene||!h||lookVertical(p.scene,h)},moveForward:h=>{var y;const p=(y=n.current)==null?void 0:y.cesiumElement;!p||p.isDestroyed()||!p.scene||!h||moveForward(p.scene,h)},moveBackward:h=>{var y;const p=(y=n.current)==null?void 0:y.cesiumElement;!p||p.isDestroyed()||!p.scene||!h||moveBackward(p.scene,h)},moveUp:h=>{var y;const p=(y=n.current)==null?void 0:y.cesiumElement;!p||p.isDestroyed()||!p.scene||!h||moveUp(p.scene,h)},moveDown:h=>{var y;const p=(y=n.current)==null?void 0:y.cesiumElement;!p||p.isDestroyed()||!p.scene||!h||moveDown(p.scene,h)},moveLeft:h=>{var y;const p=(y=n.current)==null?void 0:y.cesiumElement;!p||p.isDestroyed()||!p.scene||!h||moveLeft(p.scene,h)},moveRight:h=>{var y;const p=(y=n.current)==null?void 0:y.cesiumElement;!p||p.isDestroyed()||!p.scene||!h||moveRight(p.scene,h)},moveOverTerrain:async h=>{var y;const p=(y=n.current)==null?void 0:y.cesiumElement;!p||p.isDestroyed()||moveOverTerrain(p,h)},flyToGround:async(h,p,y)=>{var L;const E=(L=n.current)==null?void 0:L.cesiumElement;!E||E.isDestroyed()||flyToGround(E,o,h,p,y)},onClick:h=>{s.current.click.push(h)},onDoubleClick:h=>{s.current.doubleclick.push(h)},onMouseDown:h=>{s.current.mousedown.push(h)},onMouseUp:h=>{s.current.mouseup.push(h)},onRightClick:h=>{s.current.rightclick.push(h)},onRightDown:h=>{s.current.rightdown.push(h)},onRightUp:h=>{s.current.rightup.push(h)},onMiddleClick:h=>{s.current.middleclick.push(h)},onMiddleDown:h=>{s.current.middledown.push(h)},onMiddleUp:h=>{s.current.middleup.push(h)},onMouseMove:h=>{s.current.mousemove.push(h)},onMouseEnter:h=>{s.current.mouseenter.push(h)},onMouseLeave:h=>{s.current.mouseleave.push(h)},onWheel:h=>{s.current.wheel.push(h)},mouseEventCallbacks:s.current,changeSpeed:h=>{var y;const p=(y=n.current)==null?void 0:y.cesiumElement;!p||p.isDestroyed()||(p.clock.multiplier=h,p.clock.clockStep=Cesium$1.ClockStep.SYSTEM_CLOCK_MULTIPLIER)},changeTime:h=>{var y;const p=(y=n.current)==null?void 0:y.cesiumElement;!p||p.isDestroyed()||(p.clock.currentTime=Cesium$1.JulianDate.fromDate(h))},pause:()=>{var p;const h=(p=n.current)==null?void 0:p.cesiumElement;!h||h.isDestroyed()||(h.clock.shouldAnimate=!1)},play:()=>{var p;const h=(p=n.current)==null?void 0:p.cesiumElement;!h||h.isDestroyed()||(h.clock.shouldAnimate=!0)},tick:()=>{var p;const h=(p=n.current)==null?void 0:p.cesiumElement;if(!(!h||h.isDestroyed()))return Cesium$1.JulianDate.toDate(h.clock.tick())},changeStart:h=>{var y;const p=(y=n.current)==null?void 0:y.cesiumElement;!p||p.isDestroyed()||(p.clock.startTime=Cesium$1.JulianDate.fromDate(h))},changeStop:h=>{var y;const p=(y=n.current)==null?void 0:y.cesiumElement;!p||p.isDestroyed()||(p.clock.stopTime=Cesium$1.JulianDate.fromDate(h))},inViewport:h=>{const p=d.getViewport();return!!(p&&h&&typeof h.lng=="number"&&typeof h.lat=="number"&&Cesium__namespace.Rectangle.contains(new Cesium__namespace.Rectangle(Cesium$1.Math.toRadians(p.west),Cesium$1.Math.toRadians(p.south),Cesium$1.Math.toRadians(p.east),Cesium$1.Math.toRadians(p.north)),Cesium__namespace.Cartographic.fromDegrees(h.lng,h.lat)))},findFeatureById:(h,p)=>{var F;const y=(F=n.current)==null?void 0:F.cesiumElement;if(!y||y.isDestroyed())return;const E=findEntity(y,h,p),L=getTag(E);if(L!=null&&L.featureId){if(E instanceof Cesium__namespace.Entity)return{type:"feature",id:L.featureId,properties:convertEntityProperties(y.clock.currentTime,E),metaData:{description:convertEntityDescription(y.clock.currentTime,E)}};if(E instanceof Cesium__namespace.Cesium3DTileFeature||E instanceof Cesium__namespace.Cesium3DTilePointFeature)return{type:"feature",id:L.featureId,properties:convertCesium3DTileFeatureProperties(E)}}},findFeaturesByIds:(h,p)=>{var E;const y=(E=n.current)==null?void 0:E.cesiumElement;if(!(!y||y.isDestroyed()))return findFeaturesFromLayer(y,h,p,L=>{var N;const F=(N=convertObjToComputedFeature(y.clock.currentTime,L))==null?void 0:N[1];return F?{...F,type:"feature"}:void 0})},findComputedFeatureById:(h,p)=>{var F;const y=(F=n.current)==null?void 0:F.cesiumElement;if(!y||y.isDestroyed())return;const E=findEntity(y,h,p),L=getTag(E);if(L!=null&&L.featureId){if(E instanceof Cesium__namespace.Entity)return L.computedFeature??{type:"computedFeature",id:L.featureId,properties:convertEntityProperties(y.clock.currentTime,E),metaData:{description:convertEntityDescription(y.clock.currentTime,E)}};if(E instanceof Cesium__namespace.Cesium3DTileFeature||E instanceof Cesium__namespace.Cesium3DTilePointFeature)return L.computedFeature??{type:"computedFeature",id:L.featureId,properties:convertCesium3DTileFeatureProperties(E)}}},findComputedFeaturesByIds:(h,p)=>{var E;const y=(E=n.current)==null?void 0:E.cesiumElement;if(!(!y||y.isDestroyed()))return findFeaturesFromLayer(y,h,p,L=>{var F;return(F=convertObjToComputedFeature(y.clock.currentTime,L))==null?void 0:F[1]})},bringToFront:h=>{var E;const p=(E=n.current)==null?void 0:E.cesiumElement;if(!p||p.isDestroyed())return;const y=findEntity(p,h);y&&"bringToFront"in y&&typeof y.bringToFront=="function"&&y.bringToFront()},sendToBack:h=>{var E;const p=(E=n.current)==null?void 0:E.cesiumElement;if(!p||p.isDestroyed())return;const y=findEntity(p,h);y&&"sendToBack"in y&&typeof y.sendToBack=="function"&&y.sendToBack()},selectFeatures:(h,p)=>{var E;const y=(E=n.current)==null?void 0:E.cesiumElement;!y||y.isDestroyed()||findFeaturesFromLayer(y,h,p,(L,F)=>{F&&"onSelectFeature"in F&&typeof F.onSelectFeature=="function"&&F.onSelectFeature(L);const z={...getTag(L)??{},isFeatureSelected:!0};return attachTag(L,z),L})},unselectFeatures:(h,p)=>{var E;const y=(E=n.current)==null?void 0:E.cesiumElement;!y||y.isDestroyed()||findFeaturesFromLayer(y,h,p,(L,F)=>{F&&"onUnselectFeature"in F&&typeof F.onUnselectFeature=="function"&&F.onUnselectFeature(L);const N=getTag(L)??{};return N.isFeatureSelected=!1,attachTag(L,N),L})},pickManyFromViewport:(h,p,y,E)=>{var F;const L=(F=n.current)==null?void 0:F.cesiumElement;if(!(!L||L.isDestroyed()))return pickManyFromViewportAsFeature(L,new Cesium__namespace.Cartesian2(h[0],h[1]),p,y,E)},onTick:h=>{c.current.push(h)},removeTickEventListener:h=>{c.current=c.current.filter(p=>p!==h)||[]},tickEventCallback:c}),[n]);return React.useImperativeHandle(t,()=>d,[d]),d}const GlobeFSDefinitions=`uniform vec3 u_reearth_sphericalHarmonicCoefficients[9];
|
|
6053
|
+
Original error:`,Vd)}}function Gd(Vd,nf,rf){return n(this,void 0,void 0,function*(){let ef;try{ef=nf(...rf)}catch(oe){return mt(Vd,oe)}const yt=Z(ef)?"observable":"promise";if(Ai(Vd,yt),Z(ef)){const oe=ef.subscribe(sl=>pi(Vd,!1,c.serialize(sl)),sl=>{mt(Vd,c.serialize(sl)),F.delete(Vd)},()=>{pi(Vd,!0),F.delete(Vd)});F.set(Vd,oe)}else try{const oe=yield ef;pi(Vd,!0,c.serialize(oe))}catch(oe){mt(Vd,c.serialize(oe))}})}function Xd(Vd){if(!p.default.isWorkerRuntime())throw Error("expose() called in the master thread.");if(L)throw Error("expose() called more than once. This is not possible. Pass an object to expose() if you want to expose multiple functions.");if(L=!0,typeof Vd=="function")p.default.subscribeToMasterMessages(nf=>{z(nf)&&!nf.method&&Gd(nf.uid,Vd,nf.args.map(c.deserialize))}),lt();else if(typeof Vd=="object"&&Vd){p.default.subscribeToMasterMessages(rf=>{z(rf)&&rf.method&&Gd(rf.uid,Vd[rf.method],rf.args.map(c.deserialize))});const nf=Object.keys(Vd).filter(rf=>typeof Vd[rf]=="function");J(nf)}else throw Error(`Invalid argument passed to expose(). Expected a function or an object, got: ${Vd}`);p.default.subscribeToMasterMessages(nf=>{if(N(nf)){const rf=nf.uid,ef=F.get(rf);ef&&(ef.unsubscribe(),F.delete(rf))}})}t.expose=Xd,typeof self<"u"&&typeof self.addEventListener=="function"&&p.default.isWorkerRuntime()&&(self.addEventListener("error",Vd=>{setTimeout(()=>md(Vd.error||Vd),250)}),self.addEventListener("unhandledrejection",Vd=>{const nf=Vd.reason;nf&&typeof nf.message=="string"&&setTimeout(()=>md(nf),250)})),typeof process<"u"&&typeof process.on=="function"&&p.default.isWorkerRuntime()&&(process.on("uncaughtException",Vd=>{setTimeout(()=>md(Vd),250)}),process.on("unhandledRejection",Vd=>{Vd&&typeof Vd.message=="string"&&setTimeout(()=>md(Vd),250)}))}(ud),function(t){var n=rt&&rt.__createBinding||(Object.create?function(p,y,E,L){L===void 0&&(L=E),Object.defineProperty(p,L,{enumerable:!0,get:function(){return y[E]}})}:function(p,y,E,L){L===void 0&&(L=E),p[L]=y[E]}),o=rt&&rt.__exportStar||function(p,y){for(var E in p)E!=="default"&&!Object.prototype.hasOwnProperty.call(y,E)&&n(y,p,E)};Object.defineProperty(t,"__esModule",{value:!0}),t.Transfer=t.DefaultSerializer=t.expose=t.registerSerializer=void 0;var s=xt;Object.defineProperty(t,"registerSerializer",{enumerable:!0,get:function(){return s.registerSerializer}}),o(Dc,t);var c=ud;Object.defineProperty(t,"expose",{enumerable:!0,get:function(){return c.expose}});var d=Xe;Object.defineProperty(t,"DefaultSerializer",{enumerable:!0,get:function(){return d.DefaultSerializer}});var h=Ot;Object.defineProperty(t,"Transfer",{enumerable:!0,get:function(){return h.Transfer}})}(jc);const de=Cr(jc);de.registerSerializer;const Um=de.spawn;de.BlobWorker,de.DefaultSerializer;const Ym=de.Pool;de.Thread;const Jm=de.Transfer;de.Worker;const rd="dmFyIHgwPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgTzA9KFgsayxudCk9PmsgaW4gWD94MChYLGsse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOm50fSk6WFtrXT1udDt2YXIgdj0oWCxrLG50KT0+KE8wKFgsdHlwZW9mIGshPSJzeW1ib2wiP2srIiI6ayxudCksbnQpLGFyPShYLGssbnQpPT57aWYoIWsuaGFzKFgpKXRocm93IFR5cGVFcnJvcigiQ2Fubm90ICIrbnQpfTt2YXIgYz0oWCxrLG50KT0+KGFyKFgsaywicmVhZCBmcm9tIHByaXZhdGUgZmllbGQiKSxudD9udC5jYWxsKFgpOmsuZ2V0KFgpKSxVPShYLGssbnQpPT57aWYoay5oYXMoWCkpdGhyb3cgVHlwZUVycm9yKCJDYW5ub3QgYWRkIHRoZSBzYW1lIHByaXZhdGUgbWVtYmVyIG1vcmUgdGhhbiBvbmNlIik7ayBpbnN0YW5jZW9mIFdlYWtTZXQ/ay5hZGQoWCk6ay5zZXQoWCxudCl9LEM9KFgsayxudCxFZSk9PihhcihYLGssIndyaXRlIHRvIHByaXZhdGUgZmllbGQiKSxFZT9FZS5jYWxsKFgsbnQpOmsuc2V0KFgsbnQpLG50KSx5bj0oWCxrLG50LEVlKT0+KHtzZXQgXyh3dCl7QyhYLGssd3QsbnQpfSxnZXQgXygpe3JldHVybiBjKFgsayxFZSl9fSksdz0oWCxrLG50KT0+KGFyKFgsaywiYWNjZXNzIHByaXZhdGUgbWV0aG9kIiksbnQpOyhmdW5jdGlvbigpe3ZhciBIaSxGZSxJdCxSdCxOdCxNdCxJZSx1dCxDdCxhdCx0dCxMLF90LHh0LEV0LGh0LHZ0LGZ0LER0LEx0LE90LFB0LEp0LHB0LCRlLHVyLGhlLEh0LFZlLGJ0LEVuLHFpLGZlLE5lLHplLCR0LHRlLFZ0LGVlLFdlLGNyLFIwLE1lLEFuLENlLFRuLFksZXQsWGUsaHIsbGUscWU7InVzZSBzdHJpY3QiO3ZhciBYPXR5cGVvZiBnbG9iYWxUaGlzPCJ1Ij9nbG9iYWxUaGlzOnR5cGVvZiB3aW5kb3c8InUiP3dpbmRvdzp0eXBlb2YgZ2xvYmFsPCJ1Ij9nbG9iYWw6dHlwZW9mIHNlbGY8InUiP3NlbGY6e307ZnVuY3Rpb24gayh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwiZGVmYXVsdCIpP3QuZGVmYXVsdDp0fXZhciBudD17fSxFZT10PT50P3R5cGVvZiBTeW1ib2wub2JzZXJ2YWJsZT09InN5bWJvbCImJnR5cGVvZiB0W1N5bWJvbC5vYnNlcnZhYmxlXT09ImZ1bmN0aW9uIj90PT09dFtTeW1ib2wub2JzZXJ2YWJsZV0oKTp0eXBlb2YgdFsiQEBvYnNlcnZhYmxlIl09PSJmdW5jdGlvbiI/dD09PXRbIkBAb2JzZXJ2YWJsZSJdKCk6ITE6ITEsd3Q9e30sX2U9e307T2JqZWN0LmRlZmluZVByb3BlcnR5KF9lLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxfZS5EZWZhdWx0U2VyaWFsaXplcj1fZS5leHRlbmRTZXJpYWxpemVyPXZvaWQgMDtmdW5jdGlvbiBraSh0LGUpe2NvbnN0IG49dC5kZXNlcmlhbGl6ZS5iaW5kKHQpLHI9dC5zZXJpYWxpemUuYmluZCh0KTtyZXR1cm57ZGVzZXJpYWxpemUoaSl7cmV0dXJuIGUuZGVzZXJpYWxpemUoaSxuKX0sc2VyaWFsaXplKGkpe3JldHVybiBlLnNlcmlhbGl6ZShpLHIpfX19X2UuZXh0ZW5kU2VyaWFsaXplcj1raTtjb25zdCBmcj17ZGVzZXJpYWxpemUodCl7cmV0dXJuIE9iamVjdC5hc3NpZ24oRXJyb3IodC5tZXNzYWdlKSx7bmFtZTp0Lm5hbWUsc3RhY2s6dC5zdGFja30pfSxzZXJpYWxpemUodCl7cmV0dXJue19fZXJyb3JfbWFya2VyOiIkJGVycm9yIixtZXNzYWdlOnQubWVzc2FnZSxuYW1lOnQubmFtZSxzdGFjazp0LnN0YWNrfX19LFlpPXQ9PnQmJnR5cGVvZiB0PT0ib2JqZWN0IiYmIl9fZXJyb3JfbWFya2VyImluIHQmJnQuX19lcnJvcl9tYXJrZXI9PT0iJCRlcnJvciI7X2UuRGVmYXVsdFNlcmlhbGl6ZXI9e2Rlc2VyaWFsaXplKHQpe3JldHVybiBZaSh0KT9mci5kZXNlcmlhbGl6ZSh0KTp0fSxzZXJpYWxpemUodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBFcnJvcj9mci5zZXJpYWxpemUodCk6dH19LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3dCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksd3Quc2VyaWFsaXplPXd0LmRlc2VyaWFsaXplPXd0LnJlZ2lzdGVyU2VyaWFsaXplcj12b2lkIDA7Y29uc3QgbHI9X2U7bGV0IGtlPWxyLkRlZmF1bHRTZXJpYWxpemVyO2Z1bmN0aW9uIEtpKHQpe2tlPWxyLmV4dGVuZFNlcmlhbGl6ZXIoa2UsdCl9d3QucmVnaXN0ZXJTZXJpYWxpemVyPUtpO2Z1bmN0aW9uIFppKHQpe3JldHVybiBrZS5kZXNlcmlhbGl6ZSh0KX13dC5kZXNlcmlhbGl6ZT1aaTtmdW5jdGlvbiBRaSh0KXtyZXR1cm4ga2Uuc2VyaWFsaXplKHQpfXd0LnNlcmlhbGl6ZT1RaTt2YXIgbmU9e30sU3Q9e307T2JqZWN0LmRlZmluZVByb3BlcnR5KFN0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxTdC4kd29ya2VyPVN0LiR0cmFuc2ZlcmFibGU9U3QuJHRlcm1pbmF0ZT1TdC4kZXZlbnRzPVN0LiRlcnJvcnM9dm9pZCAwLFN0LiRlcnJvcnM9U3ltYm9sKCJ0aHJlYWQuZXJyb3JzIiksU3QuJGV2ZW50cz1TeW1ib2woInRocmVhZC5ldmVudHMiKSxTdC4kdGVybWluYXRlPVN5bWJvbCgidGhyZWFkLnRlcm1pbmF0ZSIpLFN0LiR0cmFuc2ZlcmFibGU9U3ltYm9sKCJ0aHJlYWQudHJhbnNmZXJhYmxlIiksU3QuJHdvcmtlcj1TeW1ib2woInRocmVhZC53b3JrZXIiKSxPYmplY3QuZGVmaW5lUHJvcGVydHkobmUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLG5lLlRyYW5zZmVyPW5lLmlzVHJhbnNmZXJEZXNjcmlwdG9yPXZvaWQgMDtjb25zdCBkcj1TdDtmdW5jdGlvbiBKaSh0KXtyZXR1cm4hKCF0fHx0eXBlb2YgdCE9Im9iamVjdCIpfWZ1bmN0aW9uIHRvKHQpe3JldHVybiB0JiZ0eXBlb2YgdD09Im9iamVjdCImJnRbZHIuJHRyYW5zZmVyYWJsZV19bmUuaXNUcmFuc2ZlckRlc2NyaXB0b3I9dG87ZnVuY3Rpb24gZW8odCxlKXtpZighZSl7aWYoIUppKHQpKXRocm93IEVycm9yKCk7ZT1bdF19cmV0dXJue1tkci4kdHJhbnNmZXJhYmxlXTohMCxzZW5kOnQsdHJhbnNmZXJhYmxlczplfX1uZS5UcmFuc2Zlcj1lbzt2YXIgRXI9e307KGZ1bmN0aW9uKHQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0Lldvcmtlck1lc3NhZ2VUeXBlPXQuTWFzdGVyTWVzc2FnZVR5cGU9dm9pZCAwLGZ1bmN0aW9uKGUpe2UuY2FuY2VsPSJjYW5jZWwiLGUucnVuPSJydW4ifSh0Lk1hc3Rlck1lc3NhZ2VUeXBlfHwodC5NYXN0ZXJNZXNzYWdlVHlwZT17fSkpLGZ1bmN0aW9uKGUpe2UuZXJyb3I9ImVycm9yIixlLmluaXQ9ImluaXQiLGUucmVzdWx0PSJyZXN1bHQiLGUucnVubmluZz0icnVubmluZyIsZS51bmNhdWdodEVycm9yPSJ1bmNhdWdodEVycm9yIn0odC5Xb3JrZXJNZXNzYWdlVHlwZXx8KHQuV29ya2VyTWVzc2FnZVR5cGU9e30pKX0pKEVyKTt2YXIgUm49e307T2JqZWN0LmRlZmluZVByb3BlcnR5KFJuLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtjb25zdCBubz1mdW5jdGlvbigpe2NvbnN0IGU9dHlwZW9mIHNlbGY8InUiJiZ0eXBlb2YgV2luZG93PCJ1IiYmc2VsZiBpbnN0YW5jZW9mIFdpbmRvdztyZXR1cm4hISh0eXBlb2Ygc2VsZjwidSImJnNlbGYucG9zdE1lc3NhZ2UmJiFlKX0scm89ZnVuY3Rpb24oZSxuKXtzZWxmLnBvc3RNZXNzYWdlKGUsbil9LGlvPWZ1bmN0aW9uKGUpe2NvbnN0IG49aT0+e2UoaS5kYXRhKX0scj0oKT0+e3NlbGYucmVtb3ZlRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsbil9O3JldHVybiBzZWxmLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLG4pLHJ9O1JuLmRlZmF1bHQ9e2lzV29ya2VyUnVudGltZTpubyxwb3N0TWVzc2FnZVRvTWFzdGVyOnJvLHN1YnNjcmliZVRvTWFzdGVyTWVzc2FnZXM6aW99LGZ1bmN0aW9uKHQpe3ZhciBlPVgmJlguX19hd2FpdGVyfHxmdW5jdGlvbihULEIsJCxEKXtmdW5jdGlvbiB5dChvdCl7cmV0dXJuIG90IGluc3RhbmNlb2YgJD9vdDpuZXcgJChmdW5jdGlvbihndCl7Z3Qob3QpfSl9cmV0dXJuIG5ldygkfHwoJD1Qcm9taXNlKSkoZnVuY3Rpb24ob3QsZ3Qpe2Z1bmN0aW9uIF9uKGRlKXt0cnl7SGUoRC5uZXh0KGRlKSl9Y2F0Y2goc3Ipe2d0KHNyKX19ZnVuY3Rpb24gcG4oZGUpe3RyeXtIZShELnRocm93KGRlKSl9Y2F0Y2goc3Ipe2d0KHNyKX19ZnVuY3Rpb24gSGUoZGUpe2RlLmRvbmU/b3QoZGUudmFsdWUpOnl0KGRlLnZhbHVlKS50aGVuKF9uLHBuKX1IZSgoRD1ELmFwcGx5KFQsQnx8W10pKS5uZXh0KCkpfSl9LG49WCYmWC5fX2ltcG9ydERlZmF1bHR8fGZ1bmN0aW9uKFQpe3JldHVybiBUJiZULl9fZXNNb2R1bGU/VDp7ZGVmYXVsdDpUfX07T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuZXhwb3NlPXQuaXNXb3JrZXJSdW50aW1lPXQuVHJhbnNmZXI9dC5yZWdpc3RlclNlcmlhbGl6ZXI9dm9pZCAwO2NvbnN0IHI9bihFZSksaT13dCxvPW5lLHM9RXIsdT1uKFJuKTt2YXIgYT13dDtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwicmVnaXN0ZXJTZXJpYWxpemVyIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYS5yZWdpc3RlclNlcmlhbGl6ZXJ9fSk7dmFyIGw9bmU7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIlRyYW5zZmVyIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbC5UcmFuc2Zlcn19KSx0LmlzV29ya2VyUnVudGltZT11LmRlZmF1bHQuaXNXb3JrZXJSdW50aW1lO2xldCBkPSExO2NvbnN0IF89bmV3IE1hcCxPPVQ9PlQmJlQudHlwZT09PXMuTWFzdGVyTWVzc2FnZVR5cGUuY2FuY2VsLGI9VD0+VCYmVC50eXBlPT09cy5NYXN0ZXJNZXNzYWdlVHlwZS5ydW4sRj1UPT5yLmRlZmF1bHQoVCl8fFMoVCk7ZnVuY3Rpb24gUyhUKXtyZXR1cm4gVCYmdHlwZW9mIFQ9PSJvYmplY3QiJiZ0eXBlb2YgVC5zdWJzY3JpYmU9PSJmdW5jdGlvbiJ9ZnVuY3Rpb24gTihUKXtyZXR1cm4gby5pc1RyYW5zZmVyRGVzY3JpcHRvcihUKT97cGF5bG9hZDpULnNlbmQsdHJhbnNmZXJhYmxlczpULnRyYW5zZmVyYWJsZXN9OntwYXlsb2FkOlQsdHJhbnNmZXJhYmxlczp2b2lkIDB9fWZ1bmN0aW9uIGcoKXtjb25zdCBUPXt0eXBlOnMuV29ya2VyTWVzc2FnZVR5cGUuaW5pdCxleHBvc2VkOnt0eXBlOiJmdW5jdGlvbiJ9fTt1LmRlZmF1bHQucG9zdE1lc3NhZ2VUb01hc3RlcihUKX1mdW5jdGlvbiBHKFQpe2NvbnN0IEI9e3R5cGU6cy5Xb3JrZXJNZXNzYWdlVHlwZS5pbml0LGV4cG9zZWQ6e3R5cGU6Im1vZHVsZSIsbWV0aG9kczpUfX07dS5kZWZhdWx0LnBvc3RNZXNzYWdlVG9NYXN0ZXIoQil9ZnVuY3Rpb24gSyhULEIpe2NvbnN0e3BheWxvYWQ6JCx0cmFuc2ZlcmFibGVzOkR9PU4oQikseXQ9e3R5cGU6cy5Xb3JrZXJNZXNzYWdlVHlwZS5lcnJvcix1aWQ6VCxlcnJvcjppLnNlcmlhbGl6ZSgkKX07dS5kZWZhdWx0LnBvc3RNZXNzYWdlVG9NYXN0ZXIoeXQsRCl9ZnVuY3Rpb24gVihULEIsJCl7Y29uc3R7cGF5bG9hZDpELHRyYW5zZmVyYWJsZXM6eXR9PU4oJCksb3Q9e3R5cGU6cy5Xb3JrZXJNZXNzYWdlVHlwZS5yZXN1bHQsdWlkOlQsY29tcGxldGU6Qj8hMDp2b2lkIDAscGF5bG9hZDpEfTt1LmRlZmF1bHQucG9zdE1lc3NhZ2VUb01hc3RlcihvdCx5dCl9ZnVuY3Rpb24gaXQoVCxCKXtjb25zdCAkPXt0eXBlOnMuV29ya2VyTWVzc2FnZVR5cGUucnVubmluZyx1aWQ6VCxyZXN1bHRUeXBlOkJ9O3UuZGVmYXVsdC5wb3N0TWVzc2FnZVRvTWFzdGVyKCQpfWZ1bmN0aW9uIGx0KFQpe3RyeXtjb25zdCBCPXt0eXBlOnMuV29ya2VyTWVzc2FnZVR5cGUudW5jYXVnaHRFcnJvcixlcnJvcjppLnNlcmlhbGl6ZShUKX07dS5kZWZhdWx0LnBvc3RNZXNzYWdlVG9NYXN0ZXIoQil9Y2F0Y2goQil7Y29uc29sZS5lcnJvcihgTm90IHJlcG9ydGluZyB1bmNhdWdodCBlcnJvciBiYWNrIHRvIG1hc3RlciB0aHJlYWQgYXMgaXQgb2NjdXJlZCB3aGlsZSByZXBvcnRpbmcgYW4gdW5jYXVnaHQgZXJyb3IgYWxyZWFkeS4KTGF0ZXN0IGVycm9yOmAsQixgCk9yaWdpbmFsIGVycm9yOmAsVCl9fWZ1bmN0aW9uIHJ0KFQsQiwkKXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24qKCl7bGV0IEQ7dHJ5e0Q9QiguLi4kKX1jYXRjaChvdCl7cmV0dXJuIEsoVCxvdCl9Y29uc3QgeXQ9RihEKT8ib2JzZXJ2YWJsZSI6InByb21pc2UiO2lmKGl0KFQseXQpLEYoRCkpe2NvbnN0IG90PUQuc3Vic2NyaWJlKGd0PT5WKFQsITEsaS5zZXJpYWxpemUoZ3QpKSxndD0+e0soVCxpLnNlcmlhbGl6ZShndCkpLF8uZGVsZXRlKFQpfSwoKT0+e1YoVCwhMCksXy5kZWxldGUoVCl9KTtfLnNldChULG90KX1lbHNlIHRyeXtjb25zdCBvdD15aWVsZCBEO1YoVCwhMCxpLnNlcmlhbGl6ZShvdCkpfWNhdGNoKG90KXtLKFQsaS5zZXJpYWxpemUob3QpKX19KX1mdW5jdGlvbiBCdChUKXtpZighdS5kZWZhdWx0LmlzV29ya2VyUnVudGltZSgpKXRocm93IEVycm9yKCJleHBvc2UoKSBjYWxsZWQgaW4gdGhlIG1hc3RlciB0aHJlYWQuIik7aWYoZCl0aHJvdyBFcnJvcigiZXhwb3NlKCkgY2FsbGVkIG1vcmUgdGhhbiBvbmNlLiBUaGlzIGlzIG5vdCBwb3NzaWJsZS4gUGFzcyBhbiBvYmplY3QgdG8gZXhwb3NlKCkgaWYgeW91IHdhbnQgdG8gZXhwb3NlIG11bHRpcGxlIGZ1bmN0aW9ucy4iKTtpZihkPSEwLHR5cGVvZiBUPT0iZnVuY3Rpb24iKXUuZGVmYXVsdC5zdWJzY3JpYmVUb01hc3Rlck1lc3NhZ2VzKEI9PntiKEIpJiYhQi5tZXRob2QmJnJ0KEIudWlkLFQsQi5hcmdzLm1hcChpLmRlc2VyaWFsaXplKSl9KSxnKCk7ZWxzZSBpZih0eXBlb2YgVD09Im9iamVjdCImJlQpe3UuZGVmYXVsdC5zdWJzY3JpYmVUb01hc3Rlck1lc3NhZ2VzKCQ9PntiKCQpJiYkLm1ldGhvZCYmcnQoJC51aWQsVFskLm1ldGhvZF0sJC5hcmdzLm1hcChpLmRlc2VyaWFsaXplKSl9KTtjb25zdCBCPU9iamVjdC5rZXlzKFQpLmZpbHRlcigkPT50eXBlb2YgVFskXT09ImZ1bmN0aW9uIik7RyhCKX1lbHNlIHRocm93IEVycm9yKGBJbnZhbGlkIGFyZ3VtZW50IHBhc3NlZCB0byBleHBvc2UoKS4gRXhwZWN0ZWQgYSBmdW5jdGlvbiBvciBhbiBvYmplY3QsIGdvdDogJHtUfWApO3UuZGVmYXVsdC5zdWJzY3JpYmVUb01hc3Rlck1lc3NhZ2VzKEI9PntpZihPKEIpKXtjb25zdCAkPUIudWlkLEQ9Xy5nZXQoJCk7RCYmKEQudW5zdWJzY3JpYmUoKSxfLmRlbGV0ZSgkKSl9fSl9dC5leHBvc2U9QnQsdHlwZW9mIHNlbGY8InUiJiZ0eXBlb2Ygc2VsZi5hZGRFdmVudExpc3RlbmVyPT0iZnVuY3Rpb24iJiZ1LmRlZmF1bHQuaXNXb3JrZXJSdW50aW1lKCkmJihzZWxmLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixUPT57c2V0VGltZW91dCgoKT0+bHQoVC5lcnJvcnx8VCksMjUwKX0pLHNlbGYuYWRkRXZlbnRMaXN0ZW5lcigidW5oYW5kbGVkcmVqZWN0aW9uIixUPT57Y29uc3QgQj1ULnJlYXNvbjtCJiZ0eXBlb2YgQi5tZXNzYWdlPT0ic3RyaW5nIiYmc2V0VGltZW91dCgoKT0+bHQoQiksMjUwKX0pKSx0eXBlb2YgcHJvY2VzczwidSImJnR5cGVvZiBwcm9jZXNzLm9uPT0iZnVuY3Rpb24iJiZ1LmRlZmF1bHQuaXNXb3JrZXJSdW50aW1lKCkmJihwcm9jZXNzLm9uKCJ1bmNhdWdodEV4Y2VwdGlvbiIsVD0+e3NldFRpbWVvdXQoKCk9Pmx0KFQpLDI1MCl9KSxwcm9jZXNzLm9uKCJ1bmhhbmRsZWRSZWplY3Rpb24iLFQ9PntUJiZ0eXBlb2YgVC5tZXNzYWdlPT0ic3RyaW5nIiYmc2V0VGltZW91dCgoKT0+bHQoVCksMjUwKX0pKX0obnQpO3ZhciB4bj1rKG50KTtjb25zdCBvbz14bi5leHBvc2U7eG4ucmVnaXN0ZXJTZXJpYWxpemVyLHhuLlRyYW5zZmVyO2Z1bmN0aW9uIG0odCxlKXtyZXR1cm4gdD8/ZX1tLkVNUFRZX09CSkVDVD1PYmplY3QuZnJlZXplKHt9KTtmdW5jdGlvbiBwKHQpe3JldHVybiB0IT1udWxsfWZ1bmN0aW9uIHgodCl7dGhpcy5uYW1lPSJEZXZlbG9wZXJFcnJvciIsdGhpcy5tZXNzYWdlPXQ7bGV0IGU7dHJ5e3Rocm93IG5ldyBFcnJvcn1jYXRjaChuKXtlPW4uc3RhY2t9dGhpcy5zdGFjaz1lfXAoT2JqZWN0LmNyZWF0ZSkmJih4LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSkseC5wcm90b3R5cGUuY29uc3RydWN0b3I9eCkseC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtsZXQgdD1gJHt0aGlzLm5hbWV9OiAke3RoaXMubWVzc2FnZX1gO3JldHVybiBwKHRoaXMuc3RhY2spJiYodCs9YAoke3RoaXMuc3RhY2sudG9TdHJpbmcoKX1gKSx0fSx4LnRocm93SW5zdGFudGlhdGlvbkVycm9yPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IHgoIlRoaXMgZnVuY3Rpb24gZGVmaW5lcyBhbiBpbnRlcmZhY2UgYW5kIHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5LiIpfTtjb25zdCBzdD17fTtzdC50eXBlT2Y9e307ZnVuY3Rpb24gc28odCl7cmV0dXJuYCR7dH0gaXMgcmVxdWlyZWQsIGFjdHVhbCB2YWx1ZSB3YXMgdW5kZWZpbmVkYH1mdW5jdGlvbiBwZSh0LGUsbil7cmV0dXJuYEV4cGVjdGVkICR7bn0gdG8gYmUgdHlwZW9mICR7ZX0sIGFjdHVhbCB0eXBlb2Ygd2FzICR7dH1gfXN0LmRlZmluZWQ9ZnVuY3Rpb24odCxlKXtpZighcChlKSl0aHJvdyBuZXcgeChzbyh0KSl9LHN0LnR5cGVPZi5mdW5jPWZ1bmN0aW9uKHQsZSl7aWYodHlwZW9mIGUhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IHgocGUodHlwZW9mIGUsImZ1bmN0aW9uIix0KSl9LHN0LnR5cGVPZi5zdHJpbmc9ZnVuY3Rpb24odCxlKXtpZih0eXBlb2YgZSE9InN0cmluZyIpdGhyb3cgbmV3IHgocGUodHlwZW9mIGUsInN0cmluZyIsdCkpfSxzdC50eXBlT2YubnVtYmVyPWZ1bmN0aW9uKHQsZSl7aWYodHlwZW9mIGUhPSJudW1iZXIiKXRocm93IG5ldyB4KHBlKHR5cGVvZiBlLCJudW1iZXIiLHQpKX0sc3QudHlwZU9mLm51bWJlci5sZXNzVGhhbj1mdW5jdGlvbih0LGUsbil7aWYoc3QudHlwZU9mLm51bWJlcih0LGUpLGU+PW4pdGhyb3cgbmV3IHgoYEV4cGVjdGVkICR7dH0gdG8gYmUgbGVzcyB0aGFuICR7bn0sIGFjdHVhbCB2YWx1ZSB3YXMgJHtlfWApfSxzdC50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHM9ZnVuY3Rpb24odCxlLG4pe2lmKHN0LnR5cGVPZi5udW1iZXIodCxlKSxlPm4pdGhyb3cgbmV3IHgoYEV4cGVjdGVkICR7dH0gdG8gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICR7bn0sIGFjdHVhbCB2YWx1ZSB3YXMgJHtlfWApfSxzdC50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuPWZ1bmN0aW9uKHQsZSxuKXtpZihzdC50eXBlT2YubnVtYmVyKHQsZSksZTw9bil0aHJvdyBuZXcgeChgRXhwZWN0ZWQgJHt0fSB0byBiZSBncmVhdGVyIHRoYW4gJHtufSwgYWN0dWFsIHZhbHVlIHdhcyAke2V9YCl9LHN0LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscz1mdW5jdGlvbih0LGUsbil7aWYoc3QudHlwZU9mLm51bWJlcih0LGUpLGU8bil0aHJvdyBuZXcgeChgRXhwZWN0ZWQgJHt0fSB0byBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJHtufSwgYWN0dWFsIHZhbHVlIHdhcyAke2V9YCl9LHN0LnR5cGVPZi5vYmplY3Q9ZnVuY3Rpb24odCxlKXtpZih0eXBlb2YgZSE9Im9iamVjdCIpdGhyb3cgbmV3IHgocGUodHlwZW9mIGUsIm9iamVjdCIsdCkpfSxzdC50eXBlT2YuYm9vbD1mdW5jdGlvbih0LGUpe2lmKHR5cGVvZiBlIT0iYm9vbGVhbiIpdGhyb3cgbmV3IHgocGUodHlwZW9mIGUsImJvb2xlYW4iLHQpKX0sc3QudHlwZU9mLmJpZ2ludD1mdW5jdGlvbih0LGUpe2lmKHR5cGVvZiBlIT0iYmlnaW50Iil0aHJvdyBuZXcgeChwZSh0eXBlb2YgZSwiYmlnaW50Iix0KSl9LHN0LnR5cGVPZi5udW1iZXIuZXF1YWxzPWZ1bmN0aW9uKHQsZSxuLHIpe2lmKHN0LnR5cGVPZi5udW1iZXIodCxuKSxzdC50eXBlT2YubnVtYmVyKGUsciksbiE9PXIpdGhyb3cgbmV3IHgoYCR7dH0gbXVzdCBiZSBlcXVhbCB0byAke2V9LCB0aGUgYWN0dWFsIHZhbHVlcyBhcmUgJHtufSBhbmQgJHtyfWApfTt2YXIgaD1zdCx6dD1mdW5jdGlvbih0KXt0PT1udWxsJiYodD1uZXcgRGF0ZSgpLmdldFRpbWUoKSksdGhpcy5OPTYyNCx0aGlzLk09Mzk3LHRoaXMuTUFUUklYX0E9MjU2NzQ4MzYxNSx0aGlzLlVQUEVSX01BU0s9MjE0NzQ4MzY0OCx0aGlzLkxPV0VSX01BU0s9MjE0NzQ4MzY0Nyx0aGlzLm10PW5ldyBBcnJheSh0aGlzLk4pLHRoaXMubXRpPXRoaXMuTisxLHQuY29uc3RydWN0b3I9PUFycmF5P3RoaXMuaW5pdF9ieV9hcnJheSh0LHQubGVuZ3RoKTp0aGlzLmluaXRfc2VlZCh0KX07enQucHJvdG90eXBlLmluaXRfc2VlZD1mdW5jdGlvbih0KXtmb3IodGhpcy5tdFswXT10Pj4+MCx0aGlzLm10aT0xO3RoaXMubXRpPHRoaXMuTjt0aGlzLm10aSsrKXt2YXIgdD10aGlzLm10W3RoaXMubXRpLTFdXnRoaXMubXRbdGhpcy5tdGktMV0+Pj4zMDt0aGlzLm10W3RoaXMubXRpXT0oKCh0JjQyOTQ5MDE3NjApPj4+MTYpKjE4MTI0MzMyNTM8PDE2KSsodCY2NTUzNSkqMTgxMjQzMzI1Myt0aGlzLm10aSx0aGlzLm10W3RoaXMubXRpXT4+Pj0wfX0senQucHJvdG90eXBlLmluaXRfYnlfYXJyYXk9ZnVuY3Rpb24odCxlKXt2YXIgbixyLGk7Zm9yKHRoaXMuaW5pdF9zZWVkKDE5NjUwMjE4KSxuPTEscj0wLGk9dGhpcy5OPmU/dGhpcy5OOmU7aTtpLS0pe3ZhciBvPXRoaXMubXRbbi0xXV50aGlzLm10W24tMV0+Pj4zMDt0aGlzLm10W25dPSh0aGlzLm10W25dXigoKG8mNDI5NDkwMTc2MCk+Pj4xNikqMTY2NDUyNTw8MTYpKyhvJjY1NTM1KSoxNjY0NTI1KSt0W3JdK3IsdGhpcy5tdFtuXT4+Pj0wLG4rKyxyKyssbj49dGhpcy5OJiYodGhpcy5tdFswXT10aGlzLm10W3RoaXMuTi0xXSxuPTEpLHI+PWUmJihyPTApfWZvcihpPXRoaXMuTi0xO2k7aS0tKXt2YXIgbz10aGlzLm10W24tMV1edGhpcy5tdFtuLTFdPj4+MzA7dGhpcy5tdFtuXT0odGhpcy5tdFtuXV4oKChvJjQyOTQ5MDE3NjApPj4+MTYpKjE1NjYwODM5NDE8PDE2KSsobyY2NTUzNSkqMTU2NjA4Mzk0MSktbix0aGlzLm10W25dPj4+PTAsbisrLG4+PXRoaXMuTiYmKHRoaXMubXRbMF09dGhpcy5tdFt0aGlzLk4tMV0sbj0xKX10aGlzLm10WzBdPTIxNDc0ODM2NDh9LHp0LnByb3RvdHlwZS5yYW5kb21faW50PWZ1bmN0aW9uKCl7dmFyIHQsZT1uZXcgQXJyYXkoMCx0aGlzLk1BVFJJWF9BKTtpZih0aGlzLm10aT49dGhpcy5OKXt2YXIgbjtmb3IodGhpcy5tdGk9PXRoaXMuTisxJiZ0aGlzLmluaXRfc2VlZCg1NDg5KSxuPTA7bjx0aGlzLk4tdGhpcy5NO24rKyl0PXRoaXMubXRbbl0mdGhpcy5VUFBFUl9NQVNLfHRoaXMubXRbbisxXSZ0aGlzLkxPV0VSX01BU0ssdGhpcy5tdFtuXT10aGlzLm10W24rdGhpcy5NXV50Pj4+MV5lW3QmMV07Zm9yKDtuPHRoaXMuTi0xO24rKyl0PXRoaXMubXRbbl0mdGhpcy5VUFBFUl9NQVNLfHRoaXMubXRbbisxXSZ0aGlzLkxPV0VSX01BU0ssdGhpcy5tdFtuXT10aGlzLm10W24rKHRoaXMuTS10aGlzLk4pXV50Pj4+MV5lW3QmMV07dD10aGlzLm10W3RoaXMuTi0xXSZ0aGlzLlVQUEVSX01BU0t8dGhpcy5tdFswXSZ0aGlzLkxPV0VSX01BU0ssdGhpcy5tdFt0aGlzLk4tMV09dGhpcy5tdFt0aGlzLk0tMV1edD4+PjFeZVt0JjFdLHRoaXMubXRpPTB9cmV0dXJuIHQ9dGhpcy5tdFt0aGlzLm10aSsrXSx0Xj10Pj4+MTEsdF49dDw8NyYyNjM2OTI4NjQwLHRePXQ8PDE1JjQwMjI3MzA3NTIsdF49dD4+PjE4LHQ+Pj4wfSx6dC5wcm90b3R5cGUucmFuZG9tX2ludDMxPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmFuZG9tX2ludCgpPj4+MX0senQucHJvdG90eXBlLnJhbmRvbV9pbmNsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmFuZG9tX2ludCgpKigxLzQyOTQ5NjcyOTUpfSx6dC5wcm90b3R5cGUucmFuZG9tPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmFuZG9tX2ludCgpKigxLzQyOTQ5NjcyOTYpfSx6dC5wcm90b3R5cGUucmFuZG9tX2V4Y2w9ZnVuY3Rpb24oKXtyZXR1cm4odGhpcy5yYW5kb21faW50KCkrLjUpKigxLzQyOTQ5NjcyOTYpfSx6dC5wcm90b3R5cGUucmFuZG9tX2xvbmc9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnJhbmRvbV9pbnQoKT4+PjUsZT10aGlzLnJhbmRvbV9pbnQoKT4+PjY7cmV0dXJuKHQqNjcxMDg4NjQrZSkqKDEvOTAwNzE5OTI1NDc0MDk5Mil9O3ZhciBfcj16dDtjb25zdCB5PXt9O3kuRVBTSUxPTjE9LjEseS5FUFNJTE9OMj0uMDEseS5FUFNJTE9OMz0uMDAxLHkuRVBTSUxPTjQ9MWUtNCx5LkVQU0lMT041PTFlLTUseS5FUFNJTE9ONj0xZS02LHkuRVBTSUxPTjc9MWUtNyx5LkVQU0lMT044PTFlLTgseS5FUFNJTE9OOT0xZS05LHkuRVBTSUxPTjEwPTFlLTEwLHkuRVBTSUxPTjExPTFlLTExLHkuRVBTSUxPTjEyPTFlLTEyLHkuRVBTSUxPTjEzPTFlLTEzLHkuRVBTSUxPTjE0PTFlLTE0LHkuRVBTSUxPTjE1PTFlLTE1LHkuRVBTSUxPTjE2PTFlLTE2LHkuRVBTSUxPTjE3PTFlLTE3LHkuRVBTSUxPTjE4PTFlLTE4LHkuRVBTSUxPTjE5PTFlLTE5LHkuRVBTSUxPTjIwPTFlLTIwLHkuRVBTSUxPTjIxPTFlLTIxLHkuR1JBVklUQVRJT05BTFBBUkFNRVRFUj0zOTg2MDA0NDE4ZTUseS5TT0xBUl9SQURJVVM9Njk1NWU1LHkuTFVOQVJfUkFESVVTPTE3Mzc0MDAseS5TSVhUWV9GT1VSX0tJTE9CWVRFUz02NCoxMDI0LHkuRk9VUl9HSUdBQllURVM9NCoxMDI0KjEwMjQqMTAyNCx5LnNpZ249bShNYXRoLnNpZ24sZnVuY3Rpb24oZSl7cmV0dXJuIGU9K2UsZT09PTB8fGUhPT1lP2U6ZT4wPzE6LTF9KSx5LnNpZ25Ob3RaZXJvPWZ1bmN0aW9uKHQpe3JldHVybiB0PDA/LTE6MX0seS50b1NOb3JtPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGU9bShlLDI1NSksTWF0aC5yb3VuZCgoeS5jbGFtcCh0LC0xLDEpKi41Ky41KSplKX0seS5mcm9tU05vcm09ZnVuY3Rpb24odCxlKXtyZXR1cm4gZT1tKGUsMjU1KSx5LmNsYW1wKHQsMCxlKS9lKjItMX0seS5ub3JtYWxpemU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBuPU1hdGgubWF4KG4tZSwwKSxuPT09MD8wOnkuY2xhbXAoKHQtZSkvbiwwLDEpfSx5LnNpbmg9bShNYXRoLnNpbmgsZnVuY3Rpb24oZSl7cmV0dXJuKE1hdGguZXhwKGUpLU1hdGguZXhwKC1lKSkvMn0pLHkuY29zaD1tKE1hdGguY29zaCxmdW5jdGlvbihlKXtyZXR1cm4oTWF0aC5leHAoZSkrTWF0aC5leHAoLWUpKS8yfSkseS5sZXJwPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4oMS1uKSp0K24qZX0seS5QST1NYXRoLlBJLHkuT05FX09WRVJfUEk9MS9NYXRoLlBJLHkuUElfT1ZFUl9UV089TWF0aC5QSS8yLHkuUElfT1ZFUl9USFJFRT1NYXRoLlBJLzMseS5QSV9PVkVSX0ZPVVI9TWF0aC5QSS80LHkuUElfT1ZFUl9TSVg9TWF0aC5QSS82LHkuVEhSRUVfUElfT1ZFUl9UV089MypNYXRoLlBJLzIseS5UV09fUEk9MipNYXRoLlBJLHkuT05FX09WRVJfVFdPX1BJPTEvKDIqTWF0aC5QSSkseS5SQURJQU5TX1BFUl9ERUdSRUU9TWF0aC5QSS8xODAseS5ERUdSRUVTX1BFUl9SQURJQU49MTgwL01hdGguUEkseS5SQURJQU5TX1BFUl9BUkNTRUNPTkQ9eS5SQURJQU5TX1BFUl9ERUdSRUUvMzYwMCx5LnRvUmFkaWFucz1mdW5jdGlvbih0KXtpZighcCh0KSl0aHJvdyBuZXcgeCgiZGVncmVlcyBpcyByZXF1aXJlZC4iKTtyZXR1cm4gdCp5LlJBRElBTlNfUEVSX0RFR1JFRX0seS50b0RlZ3JlZXM9ZnVuY3Rpb24odCl7aWYoIXAodCkpdGhyb3cgbmV3IHgoInJhZGlhbnMgaXMgcmVxdWlyZWQuIik7cmV0dXJuIHQqeS5ERUdSRUVTX1BFUl9SQURJQU59LHkuY29udmVydExvbmdpdHVkZVJhbmdlPWZ1bmN0aW9uKHQpe2lmKCFwKHQpKXRocm93IG5ldyB4KCJhbmdsZSBpcyByZXF1aXJlZC4iKTtjb25zdCBlPXkuVFdPX1BJLG49dC1NYXRoLmZsb29yKHQvZSkqZTtyZXR1cm4gbjwtTWF0aC5QST9uK2U6bj49TWF0aC5QST9uLWU6bn0seS5jbGFtcFRvTGF0aXR1ZGVSYW5nZT1mdW5jdGlvbih0KXtpZighcCh0KSl0aHJvdyBuZXcgeCgiYW5nbGUgaXMgcmVxdWlyZWQuIik7cmV0dXJuIHkuY2xhbXAodCwtMSp5LlBJX09WRVJfVFdPLHkuUElfT1ZFUl9UV08pfSx5Lm5lZ2F0aXZlUGlUb1BpPWZ1bmN0aW9uKHQpe2lmKCFwKHQpKXRocm93IG5ldyB4KCJhbmdsZSBpcyByZXF1aXJlZC4iKTtyZXR1cm4gdD49LXkuUEkmJnQ8PXkuUEk/dDp5Lnplcm9Ub1R3b1BpKHQreS5QSSkteS5QSX0seS56ZXJvVG9Ud29QaT1mdW5jdGlvbih0KXtpZighcCh0KSl0aHJvdyBuZXcgeCgiYW5nbGUgaXMgcmVxdWlyZWQuIik7aWYodD49MCYmdDw9eS5UV09fUEkpcmV0dXJuIHQ7Y29uc3QgZT15Lm1vZCh0LHkuVFdPX1BJKTtyZXR1cm4gTWF0aC5hYnMoZSk8eS5FUFNJTE9OMTQmJk1hdGguYWJzKHQpPnkuRVBTSUxPTjE0P3kuVFdPX1BJOmV9LHkubW9kPWZ1bmN0aW9uKHQsZSl7aWYoIXAodCkpdGhyb3cgbmV3IHgoIm0gaXMgcmVxdWlyZWQuIik7aWYoIXAoZSkpdGhyb3cgbmV3IHgoIm4gaXMgcmVxdWlyZWQuIik7aWYoZT09PTApdGhyb3cgbmV3IHgoImRpdmlzb3IgY2Fubm90IGJlIDAuIik7cmV0dXJuIHkuc2lnbih0KT09PXkuc2lnbihlKSYmTWF0aC5hYnModCk8TWF0aC5hYnMoZSk/dDoodCVlK2UpJWV9LHkuZXF1YWxzRXBzaWxvbj1mdW5jdGlvbih0LGUsbixyKXtpZighcCh0KSl0aHJvdyBuZXcgeCgibGVmdCBpcyByZXF1aXJlZC4iKTtpZighcChlKSl0aHJvdyBuZXcgeCgicmlnaHQgaXMgcmVxdWlyZWQuIik7bj1tKG4sMCkscj1tKHIsbik7Y29uc3QgaT1NYXRoLmFicyh0LWUpO3JldHVybiBpPD1yfHxpPD1uKk1hdGgubWF4KE1hdGguYWJzKHQpLE1hdGguYWJzKGUpKX0seS5sZXNzVGhhbj1mdW5jdGlvbih0LGUsbil7aWYoIXAodCkpdGhyb3cgbmV3IHgoImZpcnN0IGlzIHJlcXVpcmVkLiIpO2lmKCFwKGUpKXRocm93IG5ldyB4KCJzZWNvbmQgaXMgcmVxdWlyZWQuIik7aWYoIXAobikpdGhyb3cgbmV3IHgoImFic29sdXRlRXBzaWxvbiBpcyByZXF1aXJlZC4iKTtyZXR1cm4gdC1lPC1ufSx5Lmxlc3NUaGFuT3JFcXVhbHM9ZnVuY3Rpb24odCxlLG4pe2lmKCFwKHQpKXRocm93IG5ldyB4KCJmaXJzdCBpcyByZXF1aXJlZC4iKTtpZighcChlKSl0aHJvdyBuZXcgeCgic2Vjb25kIGlzIHJlcXVpcmVkLiIpO2lmKCFwKG4pKXRocm93IG5ldyB4KCJhYnNvbHV0ZUVwc2lsb24gaXMgcmVxdWlyZWQuIik7cmV0dXJuIHQtZTxufSx5LmdyZWF0ZXJUaGFuPWZ1bmN0aW9uKHQsZSxuKXtpZighcCh0KSl0aHJvdyBuZXcgeCgiZmlyc3QgaXMgcmVxdWlyZWQuIik7aWYoIXAoZSkpdGhyb3cgbmV3IHgoInNlY29uZCBpcyByZXF1aXJlZC4iKTtpZighcChuKSl0aHJvdyBuZXcgeCgiYWJzb2x1dGVFcHNpbG9uIGlzIHJlcXVpcmVkLiIpO3JldHVybiB0LWU+bn0seS5ncmVhdGVyVGhhbk9yRXF1YWxzPWZ1bmN0aW9uKHQsZSxuKXtpZighcCh0KSl0aHJvdyBuZXcgeCgiZmlyc3QgaXMgcmVxdWlyZWQuIik7aWYoIXAoZSkpdGhyb3cgbmV3IHgoInNlY29uZCBpcyByZXF1aXJlZC4iKTtpZighcChuKSl0aHJvdyBuZXcgeCgiYWJzb2x1dGVFcHNpbG9uIGlzIHJlcXVpcmVkLiIpO3JldHVybiB0LWU+LW59O2NvbnN0IFllPVsxXTt5LmZhY3RvcmlhbD1mdW5jdGlvbih0KXtpZih0eXBlb2YgdCE9Im51bWJlciJ8fHQ8MCl0aHJvdyBuZXcgeCgiQSBudW1iZXIgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAgaXMgcmVxdWlyZWQuIik7Y29uc3QgZT1ZZS5sZW5ndGg7aWYodD49ZSl7bGV0IG49WWVbZS0xXTtmb3IobGV0IHI9ZTtyPD10O3IrKyl7Y29uc3QgaT1uKnI7WWUucHVzaChpKSxuPWl9fXJldHVybiBZZVt0XX0seS5pbmNyZW1lbnRXcmFwPWZ1bmN0aW9uKHQsZSxuKXtpZihuPW0obiwwKSwhcCh0KSl0aHJvdyBuZXcgeCgibiBpcyByZXF1aXJlZC4iKTtpZihlPD1uKXRocm93IG5ldyB4KCJtYXhpbXVtVmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gbWluaW11bVZhbHVlLiIpO3JldHVybisrdCx0PmUmJih0PW4pLHR9LHkuaXNQb3dlck9mVHdvPWZ1bmN0aW9uKHQpe2lmKHR5cGVvZiB0IT0ibnVtYmVyInx8dDwwfHx0PjQyOTQ5NjcyOTUpdGhyb3cgbmV3IHgoIkEgbnVtYmVyIGJldHdlZW4gMCBhbmQgKDJeMzIpLTEgaXMgcmVxdWlyZWQuIik7cmV0dXJuIHQhPT0wJiYodCZ0LTEpPT09MH0seS5uZXh0UG93ZXJPZlR3bz1mdW5jdGlvbih0KXtpZih0eXBlb2YgdCE9Im51bWJlciJ8fHQ8MHx8dD4yMTQ3NDgzNjQ4KXRocm93IG5ldyB4KCJBIG51bWJlciBiZXR3ZWVuIDAgYW5kIDJeMzEgaXMgcmVxdWlyZWQuIik7cmV0dXJuLS10LHR8PXQ+PjEsdHw9dD4+Mix0fD10Pj40LHR8PXQ+PjgsdHw9dD4+MTYsKyt0LHR9LHkucHJldmlvdXNQb3dlck9mVHdvPWZ1bmN0aW9uKHQpe2lmKHR5cGVvZiB0IT0ibnVtYmVyInx8dDwwfHx0PjQyOTQ5NjcyOTUpdGhyb3cgbmV3IHgoIkEgbnVtYmVyIGJldHdlZW4gMCBhbmQgKDJeMzIpLTEgaXMgcmVxdWlyZWQuIik7cmV0dXJuIHR8PXQ+PjEsdHw9dD4+Mix0fD10Pj40LHR8PXQ+PjgsdHw9dD4+MTYsdHw9dD4+MzIsdD0odD4+PjApLSh0Pj4+MSksdH0seS5jbGFtcD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGgudHlwZU9mLm51bWJlcigidmFsdWUiLHQpLGgudHlwZU9mLm51bWJlcigibWluIixlKSxoLnR5cGVPZi5udW1iZXIoIm1heCIsbiksdDxlP2U6dD5uP246dH07bGV0IHByPW5ldyBfcjt5LnNldFJhbmRvbU51bWJlclNlZWQ9ZnVuY3Rpb24odCl7aWYoIXAodCkpdGhyb3cgbmV3IHgoInNlZWQgaXMgcmVxdWlyZWQuIik7cHI9bmV3IF9yKHQpfSx5Lm5leHRSYW5kb21OdW1iZXI9ZnVuY3Rpb24oKXtyZXR1cm4gcHIucmFuZG9tKCl9LHkucmFuZG9tQmV0d2Vlbj1mdW5jdGlvbih0LGUpe3JldHVybiB5Lm5leHRSYW5kb21OdW1iZXIoKSooZS10KSt0fSx5LmFjb3NDbGFtcGVkPWZ1bmN0aW9uKHQpe2lmKCFwKHQpKXRocm93IG5ldyB4KCJ2YWx1ZSBpcyByZXF1aXJlZC4iKTtyZXR1cm4gTWF0aC5hY29zKHkuY2xhbXAodCwtMSwxKSl9LHkuYXNpbkNsYW1wZWQ9ZnVuY3Rpb24odCl7aWYoIXAodCkpdGhyb3cgbmV3IHgoInZhbHVlIGlzIHJlcXVpcmVkLiIpO3JldHVybiBNYXRoLmFzaW4oeS5jbGFtcCh0LC0xLDEpKX0seS5jaG9yZExlbmd0aD1mdW5jdGlvbih0LGUpe2lmKCFwKHQpKXRocm93IG5ldyB4KCJhbmdsZSBpcyByZXF1aXJlZC4iKTtpZighcChlKSl0aHJvdyBuZXcgeCgicmFkaXVzIGlzIHJlcXVpcmVkLiIpO3JldHVybiAyKmUqTWF0aC5zaW4odCouNSl9LHkubG9nQmFzZT1mdW5jdGlvbih0LGUpe2lmKCFwKHQpKXRocm93IG5ldyB4KCJudW1iZXIgaXMgcmVxdWlyZWQuIik7aWYoIXAoZSkpdGhyb3cgbmV3IHgoImJhc2UgaXMgcmVxdWlyZWQuIik7cmV0dXJuIE1hdGgubG9nKHQpL01hdGgubG9nKGUpfSx5LmNicnQ9bShNYXRoLmNicnQsZnVuY3Rpb24oZSl7Y29uc3Qgbj1NYXRoLnBvdyhNYXRoLmFicyhlKSwuMzMzMzMzMzMzMzMzMzMzMyk7cmV0dXJuIGU8MD8tbjpufSkseS5sb2cyPW0oTWF0aC5sb2cyLGZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLmxvZyhlKSpNYXRoLkxPRzJFfSkseS5mb2c9ZnVuY3Rpb24odCxlKXtjb25zdCBuPXQqZTtyZXR1cm4gMS1NYXRoLmV4cCgtKG4qbikpfSx5LmZhc3RBcHByb3hpbWF0ZUF0YW49ZnVuY3Rpb24odCl7cmV0dXJuIGgudHlwZU9mLm51bWJlcigieCIsdCksdCooLS4xNzg0Kk1hdGguYWJzKHQpLS4wNjYzKnQqdCsxLjAzMDEpfSx5LmZhc3RBcHByb3hpbWF0ZUF0YW4yPWZ1bmN0aW9uKHQsZSl7aC50eXBlT2YubnVtYmVyKCJ4Iix0KSxoLnR5cGVPZi5udW1iZXIoInkiLGUpO2xldCBuLHI9TWF0aC5hYnModCk7bj1NYXRoLmFicyhlKTtjb25zdCBpPU1hdGgubWF4KHIsbik7bj1NYXRoLm1pbihyLG4pO2NvbnN0IG89bi9pO2lmKGlzTmFOKG8pKXRocm93IG5ldyB4KCJlaXRoZXIgeCBvciB5IG11c3QgYmUgbm9uemVybyIpO3JldHVybiByPXkuZmFzdEFwcHJveGltYXRlQXRhbihvKSxyPU1hdGguYWJzKGUpPk1hdGguYWJzKHQpP3kuUElfT1ZFUl9UV08tcjpyLHI9dDwwP3kuUEktcjpyLHI9ZTwwPy1yOnIscn07dmFyIFI9eTtmdW5jdGlvbiBBKHQsZSl7dGhpcy54PW0odCwwKSx0aGlzLnk9bShlLDApfUEuZnJvbUVsZW1lbnRzPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gcChuKT8obi54PXQsbi55PWUsbik6bmV3IEEodCxlKX0sQS5jbG9uZT1mdW5jdGlvbih0LGUpe2lmKHAodCkpcmV0dXJuIHAoZSk/KGUueD10LngsZS55PXQueSxlKTpuZXcgQSh0LngsdC55KX0sQS5mcm9tQ2FydGVzaWFuMz1BLmNsb25lLEEuZnJvbUNhcnRlc2lhbjQ9QS5jbG9uZSxBLnBhY2tlZExlbmd0aD0yLEEucGFjaz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgidmFsdWUiLHQpLGguZGVmaW5lZCgiYXJyYXkiLGUpLG49bShuLDApLGVbbisrXT10LngsZVtuXT10LnksZX0sQS51bnBhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBoLmRlZmluZWQoImFycmF5Iix0KSxlPW0oZSwwKSxwKG4pfHwobj1uZXcgQSksbi54PXRbZSsrXSxuLnk9dFtlXSxufSxBLnBhY2tBcnJheT1mdW5jdGlvbih0LGUpe2guZGVmaW5lZCgiYXJyYXkiLHQpO2NvbnN0IG49dC5sZW5ndGgscj1uKjI7aWYoIXAoZSkpZT1uZXcgQXJyYXkocik7ZWxzZXtpZighQXJyYXkuaXNBcnJheShlKSYmZS5sZW5ndGghPT1yKXRocm93IG5ldyB4KCJJZiByZXN1bHQgaXMgYSB0eXBlZCBhcnJheSwgaXQgbXVzdCBoYXZlIGV4YWN0bHkgYXJyYXkubGVuZ3RoICogMiBlbGVtZW50cyIpO2UubGVuZ3RoIT09ciYmKGUubGVuZ3RoPXIpfWZvcihsZXQgaT0wO2k8bjsrK2kpQS5wYWNrKHRbaV0sZSxpKjIpO3JldHVybiBlfSxBLnVucGFja0FycmF5PWZ1bmN0aW9uKHQsZSl7aWYoaC5kZWZpbmVkKCJhcnJheSIsdCksaC50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoImFycmF5Lmxlbmd0aCIsdC5sZW5ndGgsMiksdC5sZW5ndGglMiE9PTApdGhyb3cgbmV3IHgoImFycmF5IGxlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMi4iKTtjb25zdCBuPXQubGVuZ3RoO3AoZSk/ZS5sZW5ndGg9bi8yOmU9bmV3IEFycmF5KG4vMik7Zm9yKGxldCByPTA7cjxuO3IrPTIpe2NvbnN0IGk9ci8yO2VbaV09QS51bnBhY2sodCxyLGVbaV0pfXJldHVybiBlfSxBLmZyb21BcnJheT1BLnVucGFjayxBLm1heGltdW1Db21wb25lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSxNYXRoLm1heCh0LngsdC55KX0sQS5taW5pbXVtQ29tcG9uZW50PWZ1bmN0aW9uKHQpe3JldHVybiBoLnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCksTWF0aC5taW4odC54LHQueSl9LEEubWluaW11bUJ5Q29tcG9uZW50PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJmaXJzdCIsdCksaC50eXBlT2Yub2JqZWN0KCJzZWNvbmQiLGUpLGgudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9TWF0aC5taW4odC54LGUueCksbi55PU1hdGgubWluKHQueSxlLnkpLG59LEEubWF4aW11bUJ5Q29tcG9uZW50PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJmaXJzdCIsdCksaC50eXBlT2Yub2JqZWN0KCJzZWNvbmQiLGUpLGgudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9TWF0aC5tYXgodC54LGUueCksbi55PU1hdGgubWF4KHQueSxlLnkpLG59LEEuY2xhbXA9ZnVuY3Rpb24odCxlLG4scil7aC50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsdCksaC50eXBlT2Yub2JqZWN0KCJtaW4iLGUpLGgudHlwZU9mLm9iamVjdCgibWF4IixuKSxoLnR5cGVPZi5vYmplY3QoInJlc3VsdCIscik7Y29uc3QgaT1SLmNsYW1wKHQueCxlLngsbi54KSxvPVIuY2xhbXAodC55LGUueSxuLnkpO3JldHVybiByLng9aSxyLnk9byxyfSxBLm1hZ25pdHVkZVNxdWFyZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSx0LngqdC54K3QueSp0Lnl9LEEubWFnbml0dWRlPWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnNxcnQoQS5tYWduaXR1ZGVTcXVhcmVkKHQpKX07Y29uc3QgS2U9bmV3IEE7QS5kaXN0YW5jZT1mdW5jdGlvbih0LGUpe3JldHVybiBoLnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLGgudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLEEuc3VidHJhY3QodCxlLEtlKSxBLm1hZ25pdHVkZShLZSl9LEEuZGlzdGFuY2VTcXVhcmVkPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgibGVmdCIsdCksaC50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksQS5zdWJ0cmFjdCh0LGUsS2UpLEEubWFnbml0dWRlU3F1YXJlZChLZSl9LEEubm9ybWFsaXplPWZ1bmN0aW9uKHQsZSl7aC50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLGgudHlwZU9mLm9iamVjdCgicmVzdWx0IixlKTtjb25zdCBuPUEubWFnbml0dWRlKHQpO2lmKGUueD10LngvbixlLnk9dC55L24saXNOYU4oZS54KXx8aXNOYU4oZS55KSl0aHJvdyBuZXcgeCgibm9ybWFsaXplZCByZXN1bHQgaXMgbm90IGEgbnVtYmVyIik7cmV0dXJuIGV9LEEuZG90PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgibGVmdCIsdCksaC50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksdC54KmUueCt0LnkqZS55fSxBLmNyb3NzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgibGVmdCIsdCksaC50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksdC54KmUueS10LnkqZS54fSxBLm11bHRpcGx5Q29tcG9uZW50cz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgibGVmdCIsdCksaC50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngqZS54LG4ueT10LnkqZS55LG59LEEuZGl2aWRlQ29tcG9uZW50cz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgibGVmdCIsdCksaC50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngvZS54LG4ueT10LnkvZS55LG59LEEuYWRkPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSxoLnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSxoLnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PXQueCtlLngsbi55PXQueStlLnksbn0sQS5zdWJ0cmFjdD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgibGVmdCIsdCksaC50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngtZS54LG4ueT10LnktZS55LG59LEEubXVsdGlwbHlCeVNjYWxhcj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSxoLnR5cGVPZi5udW1iZXIoInNjYWxhciIsZSksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngqZSxuLnk9dC55KmUsbn0sQS5kaXZpZGVCeVNjYWxhcj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSxoLnR5cGVPZi5udW1iZXIoInNjYWxhciIsZSksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngvZSxuLnk9dC55L2Usbn0sQS5uZWdhdGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLGgudHlwZU9mLm9iamVjdCgicmVzdWx0IixlKSxlLng9LXQueCxlLnk9LXQueSxlfSxBLmFicz1mdW5jdGlvbih0LGUpe3JldHVybiBoLnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpLGUueD1NYXRoLmFicyh0LngpLGUueT1NYXRoLmFicyh0LnkpLGV9O2NvbnN0IHlyPW5ldyBBO0EubGVycD1mdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJzdGFydCIsdCksaC50eXBlT2Yub2JqZWN0KCJlbmQiLGUpLGgudHlwZU9mLm51bWJlcigidCIsbiksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLHIpLEEubXVsdGlwbHlCeVNjYWxhcihlLG4seXIpLHI9QS5tdWx0aXBseUJ5U2NhbGFyKHQsMS1uLHIpLEEuYWRkKHlyLHIscil9O2NvbnN0IEFyPW5ldyBBLFRyPW5ldyBBO0EuYW5nbGVCZXR3ZWVuPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgibGVmdCIsdCksaC50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksQS5ub3JtYWxpemUodCxBciksQS5ub3JtYWxpemUoZSxUciksUi5hY29zQ2xhbXBlZChBLmRvdChBcixUcikpfTtjb25zdCBhbz1uZXcgQTtBLm1vc3RPcnRob2dvbmFsQXhpcz1mdW5jdGlvbih0LGUpe2gudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSxoLnR5cGVPZi5vYmplY3QoInJlc3VsdCIsZSk7Y29uc3Qgbj1BLm5vcm1hbGl6ZSh0LGFvKTtyZXR1cm4gQS5hYnMobixuKSxuLng8PW4ueT9lPUEuY2xvbmUoQS5VTklUX1gsZSk6ZT1BLmNsb25lKEEuVU5JVF9ZLGUpLGV9LEEuZXF1YWxzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PT1lfHxwKHQpJiZwKGUpJiZ0Lng9PT1lLngmJnQueT09PWUueX0sQS5lcXVhbHNBcnJheT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQueD09PWVbbl0mJnQueT09PWVbbisxXX0sQS5lcXVhbHNFcHNpbG9uPWZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiB0PT09ZXx8cCh0KSYmcChlKSYmUi5lcXVhbHNFcHNpbG9uKHQueCxlLngsbixyKSYmUi5lcXVhbHNFcHNpbG9uKHQueSxlLnksbixyKX0sQS5aRVJPPU9iamVjdC5mcmVlemUobmV3IEEoMCwwKSksQS5PTkU9T2JqZWN0LmZyZWV6ZShuZXcgQSgxLDEpKSxBLlVOSVRfWD1PYmplY3QuZnJlZXplKG5ldyBBKDEsMCkpLEEuVU5JVF9ZPU9iamVjdC5mcmVlemUobmV3IEEoMCwxKSksQS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24odCl7cmV0dXJuIEEuY2xvbmUodGhpcyx0KX0sQS5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe3JldHVybiBBLmVxdWFscyh0aGlzLHQpfSxBLnByb3RvdHlwZS5lcXVhbHNFcHNpbG9uPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gQS5lcXVhbHNFcHNpbG9uKHRoaXMsdCxlLG4pfSxBLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybmAoJHt0aGlzLnh9LCAke3RoaXMueX0pYH07ZnVuY3Rpb24gZih0LGUsbil7dGhpcy54PW0odCwwKSx0aGlzLnk9bShlLDApLHRoaXMuej1tKG4sMCl9Zi5mcm9tU3BoZXJpY2FsPWZ1bmN0aW9uKHQsZSl7aC50eXBlT2Yub2JqZWN0KCJzcGhlcmljYWwiLHQpLHAoZSl8fChlPW5ldyBmKTtjb25zdCBuPXQuY2xvY2sscj10LmNvbmUsaT1tKHQubWFnbml0dWRlLDEpLG89aSpNYXRoLnNpbihyKTtyZXR1cm4gZS54PW8qTWF0aC5jb3MobiksZS55PW8qTWF0aC5zaW4obiksZS56PWkqTWF0aC5jb3MociksZX0sZi5mcm9tRWxlbWVudHM9ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIHAocik/KHIueD10LHIueT1lLHIuej1uLHIpOm5ldyBmKHQsZSxuKX0sZi5jbG9uZT1mdW5jdGlvbih0LGUpe2lmKHAodCkpcmV0dXJuIHAoZSk/KGUueD10LngsZS55PXQueSxlLno9dC56LGUpOm5ldyBmKHQueCx0LnksdC56KX0sZi5mcm9tQ2FydGVzaWFuND1mLmNsb25lLGYucGFja2VkTGVuZ3RoPTMsZi5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsdCksaC5kZWZpbmVkKCJhcnJheSIsZSksbj1tKG4sMCksZVtuKytdPXQueCxlW24rK109dC55LGVbbl09dC56LGV9LGYudW5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC5kZWZpbmVkKCJhcnJheSIsdCksZT1tKGUsMCkscChuKXx8KG49bmV3IGYpLG4ueD10W2UrK10sbi55PXRbZSsrXSxuLno9dFtlXSxufSxmLnBhY2tBcnJheT1mdW5jdGlvbih0LGUpe2guZGVmaW5lZCgiYXJyYXkiLHQpO2NvbnN0IG49dC5sZW5ndGgscj1uKjM7aWYoIXAoZSkpZT1uZXcgQXJyYXkocik7ZWxzZXtpZighQXJyYXkuaXNBcnJheShlKSYmZS5sZW5ndGghPT1yKXRocm93IG5ldyB4KCJJZiByZXN1bHQgaXMgYSB0eXBlZCBhcnJheSwgaXQgbXVzdCBoYXZlIGV4YWN0bHkgYXJyYXkubGVuZ3RoICogMyBlbGVtZW50cyIpO2UubGVuZ3RoIT09ciYmKGUubGVuZ3RoPXIpfWZvcihsZXQgaT0wO2k8bjsrK2kpZi5wYWNrKHRbaV0sZSxpKjMpO3JldHVybiBlfSxmLnVucGFja0FycmF5PWZ1bmN0aW9uKHQsZSl7aWYoaC5kZWZpbmVkKCJhcnJheSIsdCksaC50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoImFycmF5Lmxlbmd0aCIsdC5sZW5ndGgsMyksdC5sZW5ndGglMyE9PTApdGhyb3cgbmV3IHgoImFycmF5IGxlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMy4iKTtjb25zdCBuPXQubGVuZ3RoO3AoZSk/ZS5sZW5ndGg9bi8zOmU9bmV3IEFycmF5KG4vMyk7Zm9yKGxldCByPTA7cjxuO3IrPTMpe2NvbnN0IGk9ci8zO2VbaV09Zi51bnBhY2sodCxyLGVbaV0pfXJldHVybiBlfSxmLmZyb21BcnJheT1mLnVucGFjayxmLm1heGltdW1Db21wb25lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSxNYXRoLm1heCh0LngsdC55LHQueil9LGYubWluaW11bUNvbXBvbmVudD1mdW5jdGlvbih0KXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLE1hdGgubWluKHQueCx0LnksdC56KX0sZi5taW5pbXVtQnlDb21wb25lbnQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBoLnR5cGVPZi5vYmplY3QoImZpcnN0Iix0KSxoLnR5cGVPZi5vYmplY3QoInNlY29uZCIsZSksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD1NYXRoLm1pbih0LngsZS54KSxuLnk9TWF0aC5taW4odC55LGUueSksbi56PU1hdGgubWluKHQueixlLnopLG59LGYubWF4aW11bUJ5Q29tcG9uZW50PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJmaXJzdCIsdCksaC50eXBlT2Yub2JqZWN0KCJzZWNvbmQiLGUpLGgudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9TWF0aC5tYXgodC54LGUueCksbi55PU1hdGgubWF4KHQueSxlLnkpLG4uej1NYXRoLm1heCh0LnosZS56KSxufSxmLmNsYW1wPWZ1bmN0aW9uKHQsZSxuLHIpe2gudHlwZU9mLm9iamVjdCgidmFsdWUiLHQpLGgudHlwZU9mLm9iamVjdCgibWluIixlKSxoLnR5cGVPZi5vYmplY3QoIm1heCIsbiksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLHIpO2NvbnN0IGk9Ui5jbGFtcCh0LngsZS54LG4ueCksbz1SLmNsYW1wKHQueSxlLnksbi55KSxzPVIuY2xhbXAodC56LGUueixuLnopO3JldHVybiByLng9aSxyLnk9byxyLno9cyxyfSxmLm1hZ25pdHVkZVNxdWFyZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSx0LngqdC54K3QueSp0LnkrdC56KnQuen0sZi5tYWduaXR1ZGU9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguc3FydChmLm1hZ25pdHVkZVNxdWFyZWQodCkpfTtjb25zdCBaZT1uZXcgZjtmLmRpc3RhbmNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgibGVmdCIsdCksaC50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksZi5zdWJ0cmFjdCh0LGUsWmUpLGYubWFnbml0dWRlKFplKX0sZi5kaXN0YW5jZVNxdWFyZWQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSxoLnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSxmLnN1YnRyYWN0KHQsZSxaZSksZi5tYWduaXR1ZGVTcXVhcmVkKFplKX0sZi5ub3JtYWxpemU9ZnVuY3Rpb24odCxlKXtoLnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpO2NvbnN0IG49Zi5tYWduaXR1ZGUodCk7aWYoZS54PXQueC9uLGUueT10LnkvbixlLno9dC56L24saXNOYU4oZS54KXx8aXNOYU4oZS55KXx8aXNOYU4oZS56KSl0aHJvdyBuZXcgeCgibm9ybWFsaXplZCByZXN1bHQgaXMgbm90IGEgbnVtYmVyIik7cmV0dXJuIGV9LGYuZG90PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgibGVmdCIsdCksaC50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksdC54KmUueCt0LnkqZS55K3QueiplLnp9LGYubXVsdGlwbHlDb21wb25lbnRzPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSxoLnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSxoLnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PXQueCplLngsbi55PXQueSplLnksbi56PXQueiplLnosbn0sZi5kaXZpZGVDb21wb25lbnRzPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSxoLnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSxoLnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PXQueC9lLngsbi55PXQueS9lLnksbi56PXQuei9lLnosbn0sZi5hZGQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBoLnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLGgudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLGgudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9dC54K2UueCxuLnk9dC55K2UueSxuLno9dC56K2UueixufSxmLnN1YnRyYWN0PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSxoLnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSxoLnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PXQueC1lLngsbi55PXQueS1lLnksbi56PXQuei1lLnosbn0sZi5tdWx0aXBseUJ5U2NhbGFyPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLGgudHlwZU9mLm51bWJlcigic2NhbGFyIixlKSxoLnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PXQueCplLG4ueT10LnkqZSxuLno9dC56KmUsbn0sZi5kaXZpZGVCeVNjYWxhcj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSxoLnR5cGVPZi5udW1iZXIoInNjYWxhciIsZSksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngvZSxuLnk9dC55L2Usbi56PXQuei9lLG59LGYubmVnYXRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSxoLnR5cGVPZi5vYmplY3QoInJlc3VsdCIsZSksZS54PS10LngsZS55PS10LnksZS56PS10LnosZX0sZi5hYnM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLGgudHlwZU9mLm9iamVjdCgicmVzdWx0IixlKSxlLng9TWF0aC5hYnModC54KSxlLnk9TWF0aC5hYnModC55KSxlLno9TWF0aC5hYnModC56KSxlfTtjb25zdCBScj1uZXcgZjtmLmxlcnA9ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgic3RhcnQiLHQpLGgudHlwZU9mLm9iamVjdCgiZW5kIixlKSxoLnR5cGVPZi5udW1iZXIoInQiLG4pLGgudHlwZU9mLm9iamVjdCgicmVzdWx0IixyKSxmLm11bHRpcGx5QnlTY2FsYXIoZSxuLFJyKSxyPWYubXVsdGlwbHlCeVNjYWxhcih0LDEtbixyKSxmLmFkZChScixyLHIpfTtjb25zdCBRZT1uZXcgZixPbj1uZXcgZjtmLmFuZ2xlQmV0d2Vlbj1mdW5jdGlvbih0LGUpe2gudHlwZU9mLm9iamVjdCgibGVmdCIsdCksaC50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksZi5ub3JtYWxpemUodCxRZSksZi5ub3JtYWxpemUoZSxPbik7Y29uc3Qgbj1mLmRvdChRZSxPbikscj1mLm1hZ25pdHVkZShmLmNyb3NzKFFlLE9uLFFlKSk7cmV0dXJuIE1hdGguYXRhbjIocixuKX07Y29uc3QgdW89bmV3IGY7Zi5tb3N0T3J0aG9nb25hbEF4aXM9ZnVuY3Rpb24odCxlKXtoLnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpO2NvbnN0IG49Zi5ub3JtYWxpemUodCx1byk7cmV0dXJuIGYuYWJzKG4sbiksbi54PD1uLnk/bi54PD1uLno/ZT1mLmNsb25lKGYuVU5JVF9YLGUpOmU9Zi5jbG9uZShmLlVOSVRfWixlKTpuLnk8PW4uej9lPWYuY2xvbmUoZi5VTklUX1ksZSk6ZT1mLmNsb25lKGYuVU5JVF9aLGUpLGV9LGYucHJvamVjdFZlY3Rvcj1mdW5jdGlvbih0LGUsbil7aC5kZWZpbmVkKCJhIix0KSxoLmRlZmluZWQoImIiLGUpLGguZGVmaW5lZCgicmVzdWx0IixuKTtjb25zdCByPWYuZG90KHQsZSkvZi5kb3QoZSxlKTtyZXR1cm4gZi5tdWx0aXBseUJ5U2NhbGFyKGUscixuKX0sZi5lcXVhbHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD09PWV8fHAodCkmJnAoZSkmJnQueD09PWUueCYmdC55PT09ZS55JiZ0Lno9PT1lLnp9LGYuZXF1YWxzQXJyYXk9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0Lng9PT1lW25dJiZ0Lnk9PT1lW24rMV0mJnQuej09PWVbbisyXX0sZi5lcXVhbHNFcHNpbG9uPWZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiB0PT09ZXx8cCh0KSYmcChlKSYmUi5lcXVhbHNFcHNpbG9uKHQueCxlLngsbixyKSYmUi5lcXVhbHNFcHNpbG9uKHQueSxlLnksbixyKSYmUi5lcXVhbHNFcHNpbG9uKHQueixlLnosbixyKX0sZi5jcm9zcz1mdW5jdGlvbih0LGUsbil7aC50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSxoLnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSxoLnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbik7Y29uc3Qgcj10LngsaT10Lnksbz10Lnoscz1lLngsdT1lLnksYT1lLnosbD1pKmEtbyp1LGQ9bypzLXIqYSxfPXIqdS1pKnM7cmV0dXJuIG4ueD1sLG4ueT1kLG4uej1fLG59LGYubWlkcG9pbnQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBoLnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLGgudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLGgudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9KHQueCtlLngpKi41LG4ueT0odC55K2UueSkqLjUsbi56PSh0LnorZS56KSouNSxufSxmLmZyb21EZWdyZWVzPWZ1bmN0aW9uKHQsZSxuLHIsaSl7cmV0dXJuIGgudHlwZU9mLm51bWJlcigibG9uZ2l0dWRlIix0KSxoLnR5cGVPZi5udW1iZXIoImxhdGl0dWRlIixlKSx0PVIudG9SYWRpYW5zKHQpLGU9Ui50b1JhZGlhbnMoZSksZi5mcm9tUmFkaWFucyh0LGUsbixyLGkpfTtsZXQgbXQ9bmV3IGYseWU9bmV3IGY7Y29uc3QgY289bmV3IGYoNjM3ODEzNyo2Mzc4MTM3LDYzNzgxMzcqNjM3ODEzNyw2MzU2NzUyMzE0MjQ1MTc5ZS05KjYzNTY3NTIzMTQyNDUxNzllLTkpO2YuZnJvbVJhZGlhbnM9ZnVuY3Rpb24odCxlLG4scixpKXtoLnR5cGVPZi5udW1iZXIoImxvbmdpdHVkZSIsdCksaC50eXBlT2YubnVtYmVyKCJsYXRpdHVkZSIsZSksbj1tKG4sMCk7Y29uc3Qgbz1wKHIpP3IucmFkaWlTcXVhcmVkOmNvLHM9TWF0aC5jb3MoZSk7bXQueD1zKk1hdGguY29zKHQpLG10Lnk9cypNYXRoLnNpbih0KSxtdC56PU1hdGguc2luKGUpLG10PWYubm9ybWFsaXplKG10LG10KSxmLm11bHRpcGx5Q29tcG9uZW50cyhvLG10LHllKTtjb25zdCB1PU1hdGguc3FydChmLmRvdChtdCx5ZSkpO3JldHVybiB5ZT1mLmRpdmlkZUJ5U2NhbGFyKHllLHUseWUpLG10PWYubXVsdGlwbHlCeVNjYWxhcihtdCxuLG10KSxwKGkpfHwoaT1uZXcgZiksZi5hZGQoeWUsbXQsaSl9LGYuZnJvbURlZ3JlZXNBcnJheT1mdW5jdGlvbih0LGUsbil7aWYoaC5kZWZpbmVkKCJjb29yZGluYXRlcyIsdCksdC5sZW5ndGg8Mnx8dC5sZW5ndGglMiE9PTApdGhyb3cgbmV3IHgoInRoZSBudW1iZXIgb2YgY29vcmRpbmF0ZXMgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDIgYW5kIGF0IGxlYXN0IDIiKTtjb25zdCByPXQubGVuZ3RoO3Aobik/bi5sZW5ndGg9ci8yOm49bmV3IEFycmF5KHIvMik7Zm9yKGxldCBpPTA7aTxyO2krPTIpe2NvbnN0IG89dFtpXSxzPXRbaSsxXSx1PWkvMjtuW3VdPWYuZnJvbURlZ3JlZXMobyxzLDAsZSxuW3VdKX1yZXR1cm4gbn0sZi5mcm9tUmFkaWFuc0FycmF5PWZ1bmN0aW9uKHQsZSxuKXtpZihoLmRlZmluZWQoImNvb3JkaW5hdGVzIix0KSx0Lmxlbmd0aDwyfHx0Lmxlbmd0aCUyIT09MCl0aHJvdyBuZXcgeCgidGhlIG51bWJlciBvZiBjb29yZGluYXRlcyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMiBhbmQgYXQgbGVhc3QgMiIpO2NvbnN0IHI9dC5sZW5ndGg7cChuKT9uLmxlbmd0aD1yLzI6bj1uZXcgQXJyYXkoci8yKTtmb3IobGV0IGk9MDtpPHI7aSs9Mil7Y29uc3Qgbz10W2ldLHM9dFtpKzFdLHU9aS8yO25bdV09Zi5mcm9tUmFkaWFucyhvLHMsMCxlLG5bdV0pfXJldHVybiBufSxmLmZyb21EZWdyZWVzQXJyYXlIZWlnaHRzPWZ1bmN0aW9uKHQsZSxuKXtpZihoLmRlZmluZWQoImNvb3JkaW5hdGVzIix0KSx0Lmxlbmd0aDwzfHx0Lmxlbmd0aCUzIT09MCl0aHJvdyBuZXcgeCgidGhlIG51bWJlciBvZiBjb29yZGluYXRlcyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMyBhbmQgYXQgbGVhc3QgMyIpO2NvbnN0IHI9dC5sZW5ndGg7cChuKT9uLmxlbmd0aD1yLzM6bj1uZXcgQXJyYXkoci8zKTtmb3IobGV0IGk9MDtpPHI7aSs9Myl7Y29uc3Qgbz10W2ldLHM9dFtpKzFdLHU9dFtpKzJdLGE9aS8zO25bYV09Zi5mcm9tRGVncmVlcyhvLHMsdSxlLG5bYV0pfXJldHVybiBufSxmLmZyb21SYWRpYW5zQXJyYXlIZWlnaHRzPWZ1bmN0aW9uKHQsZSxuKXtpZihoLmRlZmluZWQoImNvb3JkaW5hdGVzIix0KSx0Lmxlbmd0aDwzfHx0Lmxlbmd0aCUzIT09MCl0aHJvdyBuZXcgeCgidGhlIG51bWJlciBvZiBjb29yZGluYXRlcyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMyBhbmQgYXQgbGVhc3QgMyIpO2NvbnN0IHI9dC5sZW5ndGg7cChuKT9uLmxlbmd0aD1yLzM6bj1uZXcgQXJyYXkoci8zKTtmb3IobGV0IGk9MDtpPHI7aSs9Myl7Y29uc3Qgbz10W2ldLHM9dFtpKzFdLHU9dFtpKzJdLGE9aS8zO25bYV09Zi5mcm9tUmFkaWFucyhvLHMsdSxlLG5bYV0pfXJldHVybiBufSxmLlpFUk89T2JqZWN0LmZyZWV6ZShuZXcgZigwLDAsMCkpLGYuT05FPU9iamVjdC5mcmVlemUobmV3IGYoMSwxLDEpKSxmLlVOSVRfWD1PYmplY3QuZnJlZXplKG5ldyBmKDEsMCwwKSksZi5VTklUX1k9T2JqZWN0LmZyZWV6ZShuZXcgZigwLDEsMCkpLGYuVU5JVF9aPU9iamVjdC5mcmVlemUobmV3IGYoMCwwLDEpKSxmLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbih0KXtyZXR1cm4gZi5jbG9uZSh0aGlzLHQpfSxmLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7cmV0dXJuIGYuZXF1YWxzKHRoaXMsdCl9LGYucHJvdG90eXBlLmVxdWFsc0Vwc2lsb249ZnVuY3Rpb24odCxlLG4pe3JldHVybiBmLmVxdWFsc0Vwc2lsb24odGhpcyx0LGUsbil9LGYucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuYCgke3RoaXMueH0sICR7dGhpcy55fSwgJHt0aGlzLnp9KWB9O2NvbnN0IGhvPW5ldyBmLGZvPW5ldyBmO2Z1bmN0aW9uIHhyKHQsZSxuLHIsaSl7aWYoIXAodCkpdGhyb3cgbmV3IHgoImNhcnRlc2lhbiBpcyByZXF1aXJlZC4iKTtpZighcChlKSl0aHJvdyBuZXcgeCgib25lT3ZlclJhZGlpIGlzIHJlcXVpcmVkLiIpO2lmKCFwKG4pKXRocm93IG5ldyB4KCJvbmVPdmVyUmFkaWlTcXVhcmVkIGlzIHJlcXVpcmVkLiIpO2lmKCFwKHIpKXRocm93IG5ldyB4KCJjZW50ZXJUb2xlcmFuY2VTcXVhcmVkIGlzIHJlcXVpcmVkLiIpO2NvbnN0IG89dC54LHM9dC55LHU9dC56LGE9ZS54LGw9ZS55LGQ9ZS56LF89bypvKmEqYSxPPXMqcypsKmwsYj11KnUqZCpkLEY9XytPK2IsUz1NYXRoLnNxcnQoMS9GKSxOPWYubXVsdGlwbHlCeVNjYWxhcih0LFMsaG8pO2lmKEY8cilyZXR1cm4gaXNGaW5pdGUoUyk/Zi5jbG9uZShOLGkpOnZvaWQgMDtjb25zdCBnPW4ueCxHPW4ueSxLPW4ueixWPWZvO1YueD1OLngqZyoyLFYueT1OLnkqRyoyLFYuej1OLnoqSyoyO2xldCBpdD0oMS1TKSpmLm1hZ25pdHVkZSh0KS8oLjUqZi5tYWduaXR1ZGUoVikpLGx0PTAscnQsQnQsVCxCLCQsRCx5dCxvdCxndCxfbixwbjtkb3tpdC09bHQsVD0xLygxK2l0KmcpLEI9MS8oMStpdCpHKSwkPTEvKDEraXQqSyksRD1UKlQseXQ9QipCLG90PSQqJCxndD1EKlQsX249eXQqQixwbj1vdCokLHJ0PV8qRCtPKnl0K2Iqb3QtMSxCdD1fKmd0KmcrTypfbipHK2IqcG4qSztjb25zdCBIZT0tMipCdDtsdD1ydC9IZX13aGlsZShNYXRoLmFicyhydCk+Ui5FUFNJTE9OMTIpO3JldHVybiBwKGkpPyhpLng9bypULGkueT1zKkIsaS56PXUqJCxpKTpuZXcgZihvKlQscypCLHUqJCl9ZnVuY3Rpb24gSCh0LGUsbil7dGhpcy5sb25naXR1ZGU9bSh0LDApLHRoaXMubGF0aXR1ZGU9bShlLDApLHRoaXMuaGVpZ2h0PW0obiwwKX1ILmZyb21SYWRpYW5zPWZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiBoLnR5cGVPZi5udW1iZXIoImxvbmdpdHVkZSIsdCksaC50eXBlT2YubnVtYmVyKCJsYXRpdHVkZSIsZSksbj1tKG4sMCkscChyKT8oci5sb25naXR1ZGU9dCxyLmxhdGl0dWRlPWUsci5oZWlnaHQ9bixyKTpuZXcgSCh0LGUsbil9LEguZnJvbURlZ3JlZXM9ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIGgudHlwZU9mLm51bWJlcigibG9uZ2l0dWRlIix0KSxoLnR5cGVPZi5udW1iZXIoImxhdGl0dWRlIixlKSx0PVIudG9SYWRpYW5zKHQpLGU9Ui50b1JhZGlhbnMoZSksSC5mcm9tUmFkaWFucyh0LGUsbixyKX07Y29uc3QgbG89bmV3IGYsRW89bmV3IGYsX289bmV3IGYscG89bmV3IGYoMS82Mzc4MTM3LDEvNjM3ODEzNywxLzYzNTY3NTIzMTQyNDUxNzllLTkpLHlvPW5ldyBmKDEvKDYzNzgxMzcqNjM3ODEzNyksMS8oNjM3ODEzNyo2Mzc4MTM3KSwxLyg2MzU2NzUyMzE0MjQ1MTc5ZS05KjYzNTY3NTIzMTQyNDUxNzllLTkpKSxBbz1SLkVQU0lMT04xO0guZnJvbUNhcnRlc2lhbj1mdW5jdGlvbih0LGUsbil7Y29uc3Qgcj1wKGUpP2Uub25lT3ZlclJhZGlpOnBvLGk9cChlKT9lLm9uZU92ZXJSYWRpaVNxdWFyZWQ6eW8sbz1wKGUpP2UuX2NlbnRlclRvbGVyYW5jZVNxdWFyZWQ6QW8scz14cih0LHIsaSxvLEVvKTtpZighcChzKSlyZXR1cm47bGV0IHU9Zi5tdWx0aXBseUNvbXBvbmVudHMocyxpLGxvKTt1PWYubm9ybWFsaXplKHUsdSk7Y29uc3QgYT1mLnN1YnRyYWN0KHQscyxfbyksbD1NYXRoLmF0YW4yKHUueSx1LngpLGQ9TWF0aC5hc2luKHUueiksXz1SLnNpZ24oZi5kb3QoYSx0KSkqZi5tYWduaXR1ZGUoYSk7cmV0dXJuIHAobik/KG4ubG9uZ2l0dWRlPWwsbi5sYXRpdHVkZT1kLG4uaGVpZ2h0PV8sbik6bmV3IEgobCxkLF8pfSxILnRvQ2FydGVzaWFuPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC5kZWZpbmVkKCJjYXJ0b2dyYXBoaWMiLHQpLGYuZnJvbVJhZGlhbnModC5sb25naXR1ZGUsdC5sYXRpdHVkZSx0LmhlaWdodCxlLG4pfSxILmNsb25lPWZ1bmN0aW9uKHQsZSl7aWYocCh0KSlyZXR1cm4gcChlKT8oZS5sb25naXR1ZGU9dC5sb25naXR1ZGUsZS5sYXRpdHVkZT10LmxhdGl0dWRlLGUuaGVpZ2h0PXQuaGVpZ2h0LGUpOm5ldyBIKHQubG9uZ2l0dWRlLHQubGF0aXR1ZGUsdC5oZWlnaHQpfSxILmVxdWFscz1mdW5jdGlvbih0LGUpe3JldHVybiB0PT09ZXx8cCh0KSYmcChlKSYmdC5sb25naXR1ZGU9PT1lLmxvbmdpdHVkZSYmdC5sYXRpdHVkZT09PWUubGF0aXR1ZGUmJnQuaGVpZ2h0PT09ZS5oZWlnaHR9LEguZXF1YWxzRXBzaWxvbj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIG49bShuLDApLHQ9PT1lfHxwKHQpJiZwKGUpJiZNYXRoLmFicyh0LmxvbmdpdHVkZS1lLmxvbmdpdHVkZSk8PW4mJk1hdGguYWJzKHQubGF0aXR1ZGUtZS5sYXRpdHVkZSk8PW4mJk1hdGguYWJzKHQuaGVpZ2h0LWUuaGVpZ2h0KTw9bn0sSC5aRVJPPU9iamVjdC5mcmVlemUobmV3IEgoMCwwLDApKSxILnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbih0KXtyZXR1cm4gSC5jbG9uZSh0aGlzLHQpfSxILnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7cmV0dXJuIEguZXF1YWxzKHRoaXMsdCl9LEgucHJvdG90eXBlLmVxdWFsc0Vwc2lsb249ZnVuY3Rpb24odCxlKXtyZXR1cm4gSC5lcXVhbHNFcHNpbG9uKHRoaXMsdCxlKX0sSC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm5gKCR7dGhpcy5sb25naXR1ZGV9LCAke3RoaXMubGF0aXR1ZGV9LCAke3RoaXMuaGVpZ2h0fSlgfTtmdW5jdGlvbiBPcih0LGUsbixyKXtlPW0oZSwwKSxuPW0obiwwKSxyPW0ociwwKSxoLnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygieCIsZSwwKSxoLnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygieSIsbiwwKSxoLnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygieiIsciwwKSx0Ll9yYWRpaT1uZXcgZihlLG4sciksdC5fcmFkaWlTcXVhcmVkPW5ldyBmKGUqZSxuKm4scipyKSx0Ll9yYWRpaVRvVGhlRm91cnRoPW5ldyBmKGUqZSplKmUsbipuKm4qbixyKnIqcipyKSx0Ll9vbmVPdmVyUmFkaWk9bmV3IGYoZT09PTA/MDoxL2Usbj09PTA/MDoxL24scj09PTA/MDoxL3IpLHQuX29uZU92ZXJSYWRpaVNxdWFyZWQ9bmV3IGYoZT09PTA/MDoxLyhlKmUpLG49PT0wPzA6MS8obipuKSxyPT09MD8wOjEvKHIqcikpLHQuX21pbmltdW1SYWRpdXM9TWF0aC5taW4oZSxuLHIpLHQuX21heGltdW1SYWRpdXM9TWF0aC5tYXgoZSxuLHIpLHQuX2NlbnRlclRvbGVyYW5jZVNxdWFyZWQ9Ui5FUFNJTE9OMSx0Ll9yYWRpaVNxdWFyZWQueiE9PTAmJih0Ll9zcXVhcmVkWE92ZXJTcXVhcmVkWj10Ll9yYWRpaVNxdWFyZWQueC90Ll9yYWRpaVNxdWFyZWQueil9ZnVuY3Rpb24gaih0LGUsbil7dGhpcy5fcmFkaWk9dm9pZCAwLHRoaXMuX3JhZGlpU3F1YXJlZD12b2lkIDAsdGhpcy5fcmFkaWlUb1RoZUZvdXJ0aD12b2lkIDAsdGhpcy5fb25lT3ZlclJhZGlpPXZvaWQgMCx0aGlzLl9vbmVPdmVyUmFkaWlTcXVhcmVkPXZvaWQgMCx0aGlzLl9taW5pbXVtUmFkaXVzPXZvaWQgMCx0aGlzLl9tYXhpbXVtUmFkaXVzPXZvaWQgMCx0aGlzLl9jZW50ZXJUb2xlcmFuY2VTcXVhcmVkPXZvaWQgMCx0aGlzLl9zcXVhcmVkWE92ZXJTcXVhcmVkWj12b2lkIDAsT3IodGhpcyx0LGUsbil9T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoai5wcm90b3R5cGUse3JhZGlpOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmFkaWl9fSxyYWRpaVNxdWFyZWQ6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yYWRpaVNxdWFyZWR9fSxyYWRpaVRvVGhlRm91cnRoOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmFkaWlUb1RoZUZvdXJ0aH19LG9uZU92ZXJSYWRpaTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29uZU92ZXJSYWRpaX19LG9uZU92ZXJSYWRpaVNxdWFyZWQ6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9vbmVPdmVyUmFkaWlTcXVhcmVkfX0sbWluaW11bVJhZGl1czp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21pbmltdW1SYWRpdXN9fSxtYXhpbXVtUmFkaXVzOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWF4aW11bVJhZGl1c319fSksai5jbG9uZT1mdW5jdGlvbih0LGUpe2lmKCFwKHQpKXJldHVybjtjb25zdCBuPXQuX3JhZGlpO3JldHVybiBwKGUpPyhmLmNsb25lKG4sZS5fcmFkaWkpLGYuY2xvbmUodC5fcmFkaWlTcXVhcmVkLGUuX3JhZGlpU3F1YXJlZCksZi5jbG9uZSh0Ll9yYWRpaVRvVGhlRm91cnRoLGUuX3JhZGlpVG9UaGVGb3VydGgpLGYuY2xvbmUodC5fb25lT3ZlclJhZGlpLGUuX29uZU92ZXJSYWRpaSksZi5jbG9uZSh0Ll9vbmVPdmVyUmFkaWlTcXVhcmVkLGUuX29uZU92ZXJSYWRpaVNxdWFyZWQpLGUuX21pbmltdW1SYWRpdXM9dC5fbWluaW11bVJhZGl1cyxlLl9tYXhpbXVtUmFkaXVzPXQuX21heGltdW1SYWRpdXMsZS5fY2VudGVyVG9sZXJhbmNlU3F1YXJlZD10Ll9jZW50ZXJUb2xlcmFuY2VTcXVhcmVkLGUpOm5ldyBqKG4ueCxuLnksbi56KX0sai5mcm9tQ2FydGVzaWFuMz1mdW5jdGlvbih0LGUpe3JldHVybiBwKGUpfHwoZT1uZXcgaikscCh0KSYmT3IoZSx0LngsdC55LHQueiksZX0sai5XR1M4ND1PYmplY3QuZnJlZXplKG5ldyBqKDYzNzgxMzcsNjM3ODEzNyw2MzU2NzUyMzE0MjQ1MTc5ZS05KSksai5VTklUX1NQSEVSRT1PYmplY3QuZnJlZXplKG5ldyBqKDEsMSwxKSksai5NT09OPU9iamVjdC5mcmVlemUobmV3IGooUi5MVU5BUl9SQURJVVMsUi5MVU5BUl9SQURJVVMsUi5MVU5BUl9SQURJVVMpKSxqLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbih0KXtyZXR1cm4gai5jbG9uZSh0aGlzLHQpfSxqLnBhY2tlZExlbmd0aD1mLnBhY2tlZExlbmd0aCxqLnBhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBoLnR5cGVPZi5vYmplY3QoInZhbHVlIix0KSxoLmRlZmluZWQoImFycmF5IixlKSxuPW0obiwwKSxmLnBhY2sodC5fcmFkaWksZSxuKSxlfSxqLnVucGFjaz1mdW5jdGlvbih0LGUsbil7aC5kZWZpbmVkKCJhcnJheSIsdCksZT1tKGUsMCk7Y29uc3Qgcj1mLnVucGFjayh0LGUpO3JldHVybiBqLmZyb21DYXJ0ZXNpYW4zKHIsbil9LGoucHJvdG90eXBlLmdlb2NlbnRyaWNTdXJmYWNlTm9ybWFsPWYubm9ybWFsaXplLGoucHJvdG90eXBlLmdlb2RldGljU3VyZmFjZU5vcm1hbENhcnRvZ3JhcGhpYz1mdW5jdGlvbih0LGUpe2gudHlwZU9mLm9iamVjdCgiY2FydG9ncmFwaGljIix0KTtjb25zdCBuPXQubG9uZ2l0dWRlLHI9dC5sYXRpdHVkZSxpPU1hdGguY29zKHIpLG89aSpNYXRoLmNvcyhuKSxzPWkqTWF0aC5zaW4obiksdT1NYXRoLnNpbihyKTtyZXR1cm4gcChlKXx8KGU9bmV3IGYpLGUueD1vLGUueT1zLGUuej11LGYubm9ybWFsaXplKGUsZSl9LGoucHJvdG90eXBlLmdlb2RldGljU3VyZmFjZU5vcm1hbD1mdW5jdGlvbih0LGUpe2lmKCFmLmVxdWFsc0Vwc2lsb24odCxmLlpFUk8sUi5FUFNJTE9OMTQpKXJldHVybiBwKGUpfHwoZT1uZXcgZiksZT1mLm11bHRpcGx5Q29tcG9uZW50cyh0LHRoaXMuX29uZU92ZXJSYWRpaVNxdWFyZWQsZSksZi5ub3JtYWxpemUoZSxlKX07Y29uc3QgVG89bmV3IGYsUm89bmV3IGY7ai5wcm90b3R5cGUuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW49ZnVuY3Rpb24odCxlKXtjb25zdCBuPVRvLHI9Um87dGhpcy5nZW9kZXRpY1N1cmZhY2VOb3JtYWxDYXJ0b2dyYXBoaWModCxuKSxmLm11bHRpcGx5Q29tcG9uZW50cyh0aGlzLl9yYWRpaVNxdWFyZWQsbixyKTtjb25zdCBpPU1hdGguc3FydChmLmRvdChuLHIpKTtyZXR1cm4gZi5kaXZpZGVCeVNjYWxhcihyLGksciksZi5tdWx0aXBseUJ5U2NhbGFyKG4sdC5oZWlnaHQsbikscChlKXx8KGU9bmV3IGYpLGYuYWRkKHIsbixlKX0sai5wcm90b3R5cGUuY2FydG9ncmFwaGljQXJyYXlUb0NhcnRlc2lhbkFycmF5PWZ1bmN0aW9uKHQsZSl7aC5kZWZpbmVkKCJjYXJ0b2dyYXBoaWNzIix0KTtjb25zdCBuPXQubGVuZ3RoO3AoZSk/ZS5sZW5ndGg9bjplPW5ldyBBcnJheShuKTtmb3IobGV0IHI9MDtyPG47cisrKWVbcl09dGhpcy5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbih0W3JdLGVbcl0pO3JldHVybiBlfTtjb25zdCB4bz1uZXcgZixPbz1uZXcgZixibz1uZXcgZjtqLnByb3RvdHlwZS5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYz1mdW5jdGlvbih0LGUpe2NvbnN0IG49dGhpcy5zY2FsZVRvR2VvZGV0aWNTdXJmYWNlKHQsT28pO2lmKCFwKG4pKXJldHVybjtjb25zdCByPXRoaXMuZ2VvZGV0aWNTdXJmYWNlTm9ybWFsKG4seG8pLGk9Zi5zdWJ0cmFjdCh0LG4sYm8pLG89TWF0aC5hdGFuMihyLnksci54KSxzPU1hdGguYXNpbihyLnopLHU9Ui5zaWduKGYuZG90KGksdCkpKmYubWFnbml0dWRlKGkpO3JldHVybiBwKGUpPyhlLmxvbmdpdHVkZT1vLGUubGF0aXR1ZGU9cyxlLmhlaWdodD11LGUpOm5ldyBIKG8scyx1KX0sai5wcm90b3R5cGUuY2FydGVzaWFuQXJyYXlUb0NhcnRvZ3JhcGhpY0FycmF5PWZ1bmN0aW9uKHQsZSl7aC5kZWZpbmVkKCJjYXJ0ZXNpYW5zIix0KTtjb25zdCBuPXQubGVuZ3RoO3AoZSk/ZS5sZW5ndGg9bjplPW5ldyBBcnJheShuKTtmb3IobGV0IHI9MDtyPG47KytyKWVbcl09dGhpcy5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyh0W3JdLGVbcl0pO3JldHVybiBlfSxqLnByb3RvdHlwZS5zY2FsZVRvR2VvZGV0aWNTdXJmYWNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHhyKHQsdGhpcy5fb25lT3ZlclJhZGlpLHRoaXMuX29uZU92ZXJSYWRpaVNxdWFyZWQsdGhpcy5fY2VudGVyVG9sZXJhbmNlU3F1YXJlZCxlKX0sai5wcm90b3R5cGUuc2NhbGVUb0dlb2NlbnRyaWNTdXJmYWNlPWZ1bmN0aW9uKHQsZSl7aC50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLHAoZSl8fChlPW5ldyBmKTtjb25zdCBuPXQueCxyPXQueSxpPXQueixvPXRoaXMuX29uZU92ZXJSYWRpaVNxdWFyZWQscz0xL01hdGguc3FydChuKm4qby54K3IqcipvLnkraSppKm8ueik7cmV0dXJuIGYubXVsdGlwbHlCeVNjYWxhcih0LHMsZSl9LGoucHJvdG90eXBlLnRyYW5zZm9ybVBvc2l0aW9uVG9TY2FsZWRTcGFjZT1mdW5jdGlvbih0LGUpe3JldHVybiBwKGUpfHwoZT1uZXcgZiksZi5tdWx0aXBseUNvbXBvbmVudHModCx0aGlzLl9vbmVPdmVyUmFkaWksZSl9LGoucHJvdG90eXBlLnRyYW5zZm9ybVBvc2l0aW9uRnJvbVNjYWxlZFNwYWNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHAoZSl8fChlPW5ldyBmKSxmLm11bHRpcGx5Q29tcG9uZW50cyh0LHRoaXMuX3JhZGlpLGUpfSxqLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXM9PT10fHxwKHQpJiZmLmVxdWFscyh0aGlzLl9yYWRpaSx0Ll9yYWRpaSl9LGoucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JhZGlpLnRvU3RyaW5nKCl9LGoucHJvdG90eXBlLmdldFN1cmZhY2VOb3JtYWxJbnRlcnNlY3Rpb25XaXRoWkF4aXM9ZnVuY3Rpb24odCxlLG4pe2lmKGgudHlwZU9mLm9iamVjdCgicG9zaXRpb24iLHQpLCFSLmVxdWFsc0Vwc2lsb24odGhpcy5fcmFkaWkueCx0aGlzLl9yYWRpaS55LFIuRVBTSUxPTjE1KSl0aHJvdyBuZXcgeCgiRWxsaXBzb2lkIG11c3QgYmUgYW4gZWxsaXBzb2lkIG9mIHJldm9sdXRpb24gKHJhZGlpLnggPT0gcmFkaWkueSkiKTtoLnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW4oIkVsbGlwc29pZC5yYWRpaS56Iix0aGlzLl9yYWRpaS56LDApLGU9bShlLDApO2NvbnN0IHI9dGhpcy5fc3F1YXJlZFhPdmVyU3F1YXJlZFo7aWYocChuKXx8KG49bmV3IGYpLG4ueD0wLG4ueT0wLG4uej10LnoqKDEtciksIShNYXRoLmFicyhuLnopPj10aGlzLl9yYWRpaS56LWUpKXJldHVybiBufTtjb25zdCBnbz1bLjE0ODg3NDMzODk4MTYzLC40MzMzOTUzOTQxMjkyNSwuNjc5NDA5NTY4Mjk5MDIsLjg2NTA2MzM2NjY4ODk4LC45NzM5MDY1Mjg1MTcxNywwXSxTbz1bLjI5NTUyNDIyNDcxNDc1LC4yNjkyNjY3MTkzMDk5OSwuMjE5MDg2MzYyNTE1OTgsLjE0OTQ1MTM0OTE1MDU4LC4wNjY2NzEzNDQzMDg2ODQsMF07ZnVuY3Rpb24gYnIodCxlLG4pe2gudHlwZU9mLm51bWJlcigiYSIsdCksaC50eXBlT2YubnVtYmVyKCJiIixlKSxoLnR5cGVPZi5mdW5jKCJmdW5jIixuKTtjb25zdCByPS41KihlK3QpLGk9LjUqKGUtdCk7bGV0IG89MDtmb3IobGV0IHM9MDtzPDU7cysrKXtjb25zdCB1PWkqZ29bc107bys9U29bc10qKG4ocit1KStuKHItdSkpfXJldHVybiBvKj1pLG99ai5wcm90b3R5cGUuc3VyZmFjZUFyZWE9ZnVuY3Rpb24odCl7aC50eXBlT2Yub2JqZWN0KCJyZWN0YW5nbGUiLHQpO2NvbnN0IGU9dC53ZXN0O2xldCBuPXQuZWFzdDtjb25zdCByPXQuc291dGgsaT10Lm5vcnRoO2Zvcig7bjxlOyluKz1SLlRXT19QSTtjb25zdCBvPXRoaXMuX3JhZGlpU3F1YXJlZCxzPW8ueCx1PW8ueSxhPW8ueixsPXMqdTtyZXR1cm4gYnIocixpLGZ1bmN0aW9uKGQpe2NvbnN0IF89TWF0aC5jb3MoZCksTz1NYXRoLnNpbihkKTtyZXR1cm4gTWF0aC5jb3MoZCkqYnIoZSxuLGZ1bmN0aW9uKGIpe2NvbnN0IEY9TWF0aC5jb3MoYiksUz1NYXRoLnNpbihiKTtyZXR1cm4gTWF0aC5zcXJ0KGwqTypPK2EqKHUqRipGK3MqUypTKSpfKl8pfSl9KX07ZnVuY3Rpb24gSSh0LGUsbixyKXt0aGlzLndlc3Q9bSh0LDApLHRoaXMuc291dGg9bShlLDApLHRoaXMuZWFzdD1tKG4sMCksdGhpcy5ub3J0aD1tKHIsMCl9T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoSS5wcm90b3R5cGUse3dpZHRoOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gSS5jb21wdXRlV2lkdGgodGhpcyl9fSxoZWlnaHQ6e2dldDpmdW5jdGlvbigpe3JldHVybiBJLmNvbXB1dGVIZWlnaHQodGhpcyl9fX0pLEkucGFja2VkTGVuZ3RoPTQsSS5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsdCksaC5kZWZpbmVkKCJhcnJheSIsZSksbj1tKG4sMCksZVtuKytdPXQud2VzdCxlW24rK109dC5zb3V0aCxlW24rK109dC5lYXN0LGVbbl09dC5ub3J0aCxlfSxJLnVucGFjaz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGguZGVmaW5lZCgiYXJyYXkiLHQpLGU9bShlLDApLHAobil8fChuPW5ldyBJKSxuLndlc3Q9dFtlKytdLG4uc291dGg9dFtlKytdLG4uZWFzdD10W2UrK10sbi5ub3J0aD10W2VdLG59LEkuY29tcHV0ZVdpZHRoPWZ1bmN0aW9uKHQpe2gudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIix0KTtsZXQgZT10LmVhc3Q7Y29uc3Qgbj10Lndlc3Q7cmV0dXJuIGU8biYmKGUrPVIuVFdPX1BJKSxlLW59LEkuY29tcHV0ZUhlaWdodD1mdW5jdGlvbih0KXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJyZWN0YW5nbGUiLHQpLHQubm9ydGgtdC5zb3V0aH0sSS5mcm9tRGVncmVlcz1mdW5jdGlvbih0LGUsbixyLGkpe3JldHVybiB0PVIudG9SYWRpYW5zKG0odCwwKSksZT1SLnRvUmFkaWFucyhtKGUsMCkpLG49Ui50b1JhZGlhbnMobShuLDApKSxyPVIudG9SYWRpYW5zKG0ociwwKSkscChpKT8oaS53ZXN0PXQsaS5zb3V0aD1lLGkuZWFzdD1uLGkubm9ydGg9cixpKTpuZXcgSSh0LGUsbixyKX0sSS5mcm9tUmFkaWFucz1mdW5jdGlvbih0LGUsbixyLGkpe3JldHVybiBwKGkpPyhpLndlc3Q9bSh0LDApLGkuc291dGg9bShlLDApLGkuZWFzdD1tKG4sMCksaS5ub3J0aD1tKHIsMCksaSk6bmV3IEkodCxlLG4scil9LEkuZnJvbUNhcnRvZ3JhcGhpY0FycmF5PWZ1bmN0aW9uKHQsZSl7aC5kZWZpbmVkKCJjYXJ0b2dyYXBoaWNzIix0KTtsZXQgbj1OdW1iZXIuTUFYX1ZBTFVFLHI9LU51bWJlci5NQVhfVkFMVUUsaT1OdW1iZXIuTUFYX1ZBTFVFLG89LU51bWJlci5NQVhfVkFMVUUscz1OdW1iZXIuTUFYX1ZBTFVFLHU9LU51bWJlci5NQVhfVkFMVUU7Zm9yKGxldCBhPTAsbD10Lmxlbmd0aDthPGw7YSsrKXtjb25zdCBkPXRbYV07bj1NYXRoLm1pbihuLGQubG9uZ2l0dWRlKSxyPU1hdGgubWF4KHIsZC5sb25naXR1ZGUpLHM9TWF0aC5taW4ocyxkLmxhdGl0dWRlKSx1PU1hdGgubWF4KHUsZC5sYXRpdHVkZSk7Y29uc3QgXz1kLmxvbmdpdHVkZT49MD9kLmxvbmdpdHVkZTpkLmxvbmdpdHVkZStSLlRXT19QSTtpPU1hdGgubWluKGksXyksbz1NYXRoLm1heChvLF8pfXJldHVybiByLW4+by1pJiYobj1pLHI9byxyPlIuUEkmJihyPXItUi5UV09fUEkpLG4+Ui5QSSYmKG49bi1SLlRXT19QSSkpLHAoZSk/KGUud2VzdD1uLGUuc291dGg9cyxlLmVhc3Q9cixlLm5vcnRoPXUsZSk6bmV3IEkobixzLHIsdSl9LEkuZnJvbUNhcnRlc2lhbkFycmF5PWZ1bmN0aW9uKHQsZSxuKXtoLmRlZmluZWQoImNhcnRlc2lhbnMiLHQpLGU9bShlLGouV0dTODQpO2xldCByPU51bWJlci5NQVhfVkFMVUUsaT0tTnVtYmVyLk1BWF9WQUxVRSxvPU51bWJlci5NQVhfVkFMVUUscz0tTnVtYmVyLk1BWF9WQUxVRSx1PU51bWJlci5NQVhfVkFMVUUsYT0tTnVtYmVyLk1BWF9WQUxVRTtmb3IobGV0IGw9MCxkPXQubGVuZ3RoO2w8ZDtsKyspe2NvbnN0IF89ZS5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyh0W2xdKTtyPU1hdGgubWluKHIsXy5sb25naXR1ZGUpLGk9TWF0aC5tYXgoaSxfLmxvbmdpdHVkZSksdT1NYXRoLm1pbih1LF8ubGF0aXR1ZGUpLGE9TWF0aC5tYXgoYSxfLmxhdGl0dWRlKTtjb25zdCBPPV8ubG9uZ2l0dWRlPj0wP18ubG9uZ2l0dWRlOl8ubG9uZ2l0dWRlK1IuVFdPX1BJO289TWF0aC5taW4obyxPKSxzPU1hdGgubWF4KHMsTyl9cmV0dXJuIGktcj5zLW8mJihyPW8saT1zLGk+Ui5QSSYmKGk9aS1SLlRXT19QSSkscj5SLlBJJiYocj1yLVIuVFdPX1BJKSkscChuKT8obi53ZXN0PXIsbi5zb3V0aD11LG4uZWFzdD1pLG4ubm9ydGg9YSxuKTpuZXcgSShyLHUsaSxhKX0sSS5jbG9uZT1mdW5jdGlvbih0LGUpe2lmKHAodCkpcmV0dXJuIHAoZSk/KGUud2VzdD10Lndlc3QsZS5zb3V0aD10LnNvdXRoLGUuZWFzdD10LmVhc3QsZS5ub3J0aD10Lm5vcnRoLGUpOm5ldyBJKHQud2VzdCx0LnNvdXRoLHQuZWFzdCx0Lm5vcnRoKX0sSS5lcXVhbHNFcHNpbG9uPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbj1tKG4sMCksdD09PWV8fHAodCkmJnAoZSkmJk1hdGguYWJzKHQud2VzdC1lLndlc3QpPD1uJiZNYXRoLmFicyh0LnNvdXRoLWUuc291dGgpPD1uJiZNYXRoLmFicyh0LmVhc3QtZS5lYXN0KTw9biYmTWF0aC5hYnModC5ub3J0aC1lLm5vcnRoKTw9bn0sSS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24odCl7cmV0dXJuIEkuY2xvbmUodGhpcyx0KX0sSS5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe3JldHVybiBJLmVxdWFscyh0aGlzLHQpfSxJLmVxdWFscz1mdW5jdGlvbih0LGUpe3JldHVybiB0PT09ZXx8cCh0KSYmcChlKSYmdC53ZXN0PT09ZS53ZXN0JiZ0LnNvdXRoPT09ZS5zb3V0aCYmdC5lYXN0PT09ZS5lYXN0JiZ0Lm5vcnRoPT09ZS5ub3J0aH0sSS5wcm90b3R5cGUuZXF1YWxzRXBzaWxvbj1mdW5jdGlvbih0LGUpe3JldHVybiBJLmVxdWFsc0Vwc2lsb24odGhpcyx0LGUpfSxJLnZhbGlkYXRlPWZ1bmN0aW9uKHQpe2gudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIix0KTtjb25zdCBlPXQubm9ydGg7aC50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoIm5vcnRoIixlLC1SLlBJX09WRVJfVFdPKSxoLnR5cGVPZi5udW1iZXIubGVzc1RoYW5PckVxdWFscygibm9ydGgiLGUsUi5QSV9PVkVSX1RXTyk7Y29uc3Qgbj10LnNvdXRoO2gudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJzb3V0aCIsbiwtUi5QSV9PVkVSX1RXTyksaC50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoInNvdXRoIixuLFIuUElfT1ZFUl9UV08pO2NvbnN0IHI9dC53ZXN0O2gudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJ3ZXN0IixyLC1NYXRoLlBJKSxoLnR5cGVPZi5udW1iZXIubGVzc1RoYW5PckVxdWFscygid2VzdCIscixNYXRoLlBJKTtjb25zdCBpPXQuZWFzdDtoLnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygiZWFzdCIsaSwtTWF0aC5QSSksaC50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoImVhc3QiLGksTWF0aC5QSSl9LEkuc291dGh3ZXN0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIix0KSxwKGUpPyhlLmxvbmdpdHVkZT10Lndlc3QsZS5sYXRpdHVkZT10LnNvdXRoLGUuaGVpZ2h0PTAsZSk6bmV3IEgodC53ZXN0LHQuc291dGgpfSxJLm5vcnRod2VzdD1mdW5jdGlvbih0LGUpe3JldHVybiBoLnR5cGVPZi5vYmplY3QoInJlY3RhbmdsZSIsdCkscChlKT8oZS5sb25naXR1ZGU9dC53ZXN0LGUubGF0aXR1ZGU9dC5ub3J0aCxlLmhlaWdodD0wLGUpOm5ldyBIKHQud2VzdCx0Lm5vcnRoKX0sSS5ub3J0aGVhc3Q9ZnVuY3Rpb24odCxlKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJyZWN0YW5nbGUiLHQpLHAoZSk/KGUubG9uZ2l0dWRlPXQuZWFzdCxlLmxhdGl0dWRlPXQubm9ydGgsZS5oZWlnaHQ9MCxlKTpuZXcgSCh0LmVhc3QsdC5ub3J0aCl9LEkuc291dGhlYXN0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIix0KSxwKGUpPyhlLmxvbmdpdHVkZT10LmVhc3QsZS5sYXRpdHVkZT10LnNvdXRoLGUuaGVpZ2h0PTAsZSk6bmV3IEgodC5lYXN0LHQuc291dGgpfSxJLmNlbnRlcj1mdW5jdGlvbih0LGUpe2gudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIix0KTtsZXQgbj10LmVhc3Q7Y29uc3Qgcj10Lndlc3Q7bjxyJiYobis9Ui5UV09fUEkpO2NvbnN0IGk9Ui5uZWdhdGl2ZVBpVG9QaSgocituKSouNSksbz0odC5zb3V0aCt0Lm5vcnRoKSouNTtyZXR1cm4gcChlKT8oZS5sb25naXR1ZGU9aSxlLmxhdGl0dWRlPW8sZS5oZWlnaHQ9MCxlKTpuZXcgSChpLG8pfSxJLmludGVyc2VjdGlvbj1mdW5jdGlvbih0LGUsbil7aC50eXBlT2Yub2JqZWN0KCJyZWN0YW5nbGUiLHQpLGgudHlwZU9mLm9iamVjdCgib3RoZXJSZWN0YW5nbGUiLGUpO2xldCByPXQuZWFzdCxpPXQud2VzdCxvPWUuZWFzdCxzPWUud2VzdDtyPGkmJm8+MD9yKz1SLlRXT19QSTpvPHMmJnI+MCYmKG8rPVIuVFdPX1BJKSxyPGkmJnM8MD9zKz1SLlRXT19QSTpvPHMmJmk8MCYmKGkrPVIuVFdPX1BJKTtjb25zdCB1PVIubmVnYXRpdmVQaVRvUGkoTWF0aC5tYXgoaSxzKSksYT1SLm5lZ2F0aXZlUGlUb1BpKE1hdGgubWluKHIsbykpO2lmKCh0Lndlc3Q8dC5lYXN0fHxlLndlc3Q8ZS5lYXN0KSYmYTw9dSlyZXR1cm47Y29uc3QgbD1NYXRoLm1heCh0LnNvdXRoLGUuc291dGgpLGQ9TWF0aC5taW4odC5ub3J0aCxlLm5vcnRoKTtpZighKGw+PWQpKXJldHVybiBwKG4pPyhuLndlc3Q9dSxuLnNvdXRoPWwsbi5lYXN0PWEsbi5ub3J0aD1kLG4pOm5ldyBJKHUsbCxhLGQpfSxJLnNpbXBsZUludGVyc2VjdGlvbj1mdW5jdGlvbih0LGUsbil7aC50eXBlT2Yub2JqZWN0KCJyZWN0YW5nbGUiLHQpLGgudHlwZU9mLm9iamVjdCgib3RoZXJSZWN0YW5nbGUiLGUpO2NvbnN0IHI9TWF0aC5tYXgodC53ZXN0LGUud2VzdCksaT1NYXRoLm1heCh0LnNvdXRoLGUuc291dGgpLG89TWF0aC5taW4odC5lYXN0LGUuZWFzdCkscz1NYXRoLm1pbih0Lm5vcnRoLGUubm9ydGgpO2lmKCEoaT49c3x8cj49bykpcmV0dXJuIHAobik/KG4ud2VzdD1yLG4uc291dGg9aSxuLmVhc3Q9byxuLm5vcnRoPXMsbik6bmV3IEkocixpLG8scyl9LEkudW5pb249ZnVuY3Rpb24odCxlLG4pe2gudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIix0KSxoLnR5cGVPZi5vYmplY3QoIm90aGVyUmVjdGFuZ2xlIixlKSxwKG4pfHwobj1uZXcgSSk7bGV0IHI9dC5lYXN0LGk9dC53ZXN0LG89ZS5lYXN0LHM9ZS53ZXN0O3I8aSYmbz4wP3IrPVIuVFdPX1BJOm88cyYmcj4wJiYobys9Ui5UV09fUEkpLHI8aSYmczwwP3MrPVIuVFdPX1BJOm88cyYmaTwwJiYoaSs9Ui5UV09fUEkpO2NvbnN0IHU9Ui5uZWdhdGl2ZVBpVG9QaShNYXRoLm1pbihpLHMpKSxhPVIubmVnYXRpdmVQaVRvUGkoTWF0aC5tYXgocixvKSk7cmV0dXJuIG4ud2VzdD11LG4uc291dGg9TWF0aC5taW4odC5zb3V0aCxlLnNvdXRoKSxuLmVhc3Q9YSxuLm5vcnRoPU1hdGgubWF4KHQubm9ydGgsZS5ub3J0aCksbn0sSS5leHBhbmQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBoLnR5cGVPZi5vYmplY3QoInJlY3RhbmdsZSIsdCksaC50eXBlT2Yub2JqZWN0KCJjYXJ0b2dyYXBoaWMiLGUpLHAobil8fChuPW5ldyBJKSxuLndlc3Q9TWF0aC5taW4odC53ZXN0LGUubG9uZ2l0dWRlKSxuLnNvdXRoPU1hdGgubWluKHQuc291dGgsZS5sYXRpdHVkZSksbi5lYXN0PU1hdGgubWF4KHQuZWFzdCxlLmxvbmdpdHVkZSksbi5ub3J0aD1NYXRoLm1heCh0Lm5vcnRoLGUubGF0aXR1ZGUpLG59LEkuY29udGFpbnM9ZnVuY3Rpb24odCxlKXtoLnR5cGVPZi5vYmplY3QoInJlY3RhbmdsZSIsdCksaC50eXBlT2Yub2JqZWN0KCJjYXJ0b2dyYXBoaWMiLGUpO2xldCBuPWUubG9uZ2l0dWRlO2NvbnN0IHI9ZS5sYXRpdHVkZSxpPXQud2VzdDtsZXQgbz10LmVhc3Q7cmV0dXJuIG88aSYmKG8rPVIuVFdPX1BJLG48MCYmKG4rPVIuVFdPX1BJKSksKG4+aXx8Ui5lcXVhbHNFcHNpbG9uKG4saSxSLkVQU0lMT04xNCkpJiYobjxvfHxSLmVxdWFsc0Vwc2lsb24obixvLFIuRVBTSUxPTjE0KSkmJnI+PXQuc291dGgmJnI8PXQubm9ydGh9O2NvbnN0IG1vPW5ldyBIO0kuc3Vic2FtcGxlPWZ1bmN0aW9uKHQsZSxuLHIpe2gudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIix0KSxlPW0oZSxqLldHUzg0KSxuPW0obiwwKSxwKHIpfHwocj1bXSk7bGV0IGk9MDtjb25zdCBvPXQubm9ydGgscz10LnNvdXRoLHU9dC5lYXN0LGE9dC53ZXN0LGw9bW87bC5oZWlnaHQ9bixsLmxvbmdpdHVkZT1hLGwubGF0aXR1ZGU9byxyW2ldPWUuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4obCxyW2ldKSxpKyssbC5sb25naXR1ZGU9dSxyW2ldPWUuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4obCxyW2ldKSxpKyssbC5sYXRpdHVkZT1zLHJbaV09ZS5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbihsLHJbaV0pLGkrKyxsLmxvbmdpdHVkZT1hLHJbaV09ZS5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbihsLHJbaV0pLGkrKyxvPDA/bC5sYXRpdHVkZT1vOnM+MD9sLmxhdGl0dWRlPXM6bC5sYXRpdHVkZT0wO2ZvcihsZXQgZD0xO2Q8ODsrK2QpbC5sb25naXR1ZGU9LU1hdGguUEkrZCpSLlBJX09WRVJfVFdPLEkuY29udGFpbnModCxsKSYmKHJbaV09ZS5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbihsLHJbaV0pLGkrKyk7cmV0dXJuIGwubGF0aXR1ZGU9PT0wJiYobC5sb25naXR1ZGU9YSxyW2ldPWUuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4obCxyW2ldKSxpKyssbC5sb25naXR1ZGU9dSxyW2ldPWUuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4obCxyW2ldKSxpKyspLHIubGVuZ3RoPWkscn0sSS5zdWJzZWN0aW9uPWZ1bmN0aW9uKHQsZSxuLHIsaSxvKXtpZihoLnR5cGVPZi5vYmplY3QoInJlY3RhbmdsZSIsdCksaC50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoIndlc3RMZXJwIixlLDApLGgudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJ3ZXN0TGVycCIsZSwxKSxoLnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygic291dGhMZXJwIixuLDApLGgudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJzb3V0aExlcnAiLG4sMSksaC50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoImVhc3RMZXJwIixyLDApLGgudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJlYXN0TGVycCIsciwxKSxoLnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygibm9ydGhMZXJwIixpLDApLGgudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJub3J0aExlcnAiLGksMSksaC50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoIndlc3RMZXJwIixlLHIpLGgudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJzb3V0aExlcnAiLG4saSkscChvKXx8KG89bmV3IEkpLHQud2VzdDw9dC5lYXN0KXtjb25zdCB1PXQuZWFzdC10Lndlc3Q7by53ZXN0PXQud2VzdCtlKnUsby5lYXN0PXQud2VzdCtyKnV9ZWxzZXtjb25zdCB1PVIuVFdPX1BJK3QuZWFzdC10Lndlc3Q7by53ZXN0PVIubmVnYXRpdmVQaVRvUGkodC53ZXN0K2UqdSksby5lYXN0PVIubmVnYXRpdmVQaVRvUGkodC53ZXN0K3IqdSl9Y29uc3Qgcz10Lm5vcnRoLXQuc291dGg7cmV0dXJuIG8uc291dGg9dC5zb3V0aCtuKnMsby5ub3J0aD10LnNvdXRoK2kqcyxlPT09MSYmKG8ud2VzdD10LmVhc3QpLHI9PT0xJiYoby5lYXN0PXQuZWFzdCksbj09PTEmJihvLnNvdXRoPXQubm9ydGgpLGk9PT0xJiYoby5ub3J0aD10Lm5vcnRoKSxvfSxJLk1BWF9WQUxVRT1PYmplY3QuZnJlZXplKG5ldyBJKC1NYXRoLlBJLC1SLlBJX09WRVJfVFdPLE1hdGguUEksUi5QSV9PVkVSX1RXTykpO3ZhciBncj1PYmplY3QuZnJlZXplKHtERVBUSF9CVUZGRVJfQklUOjI1NixTVEVOQ0lMX0JVRkZFUl9CSVQ6MTAyNCxDT0xPUl9CVUZGRVJfQklUOjE2Mzg0LFBPSU5UUzowLExJTkVTOjEsTElORV9MT09QOjIsTElORV9TVFJJUDozLFRSSUFOR0xFUzo0LFRSSUFOR0xFX1NUUklQOjUsVFJJQU5HTEVfRkFOOjYsWkVSTzowLE9ORToxLFNSQ19DT0xPUjo3NjgsT05FX01JTlVTX1NSQ19DT0xPUjo3NjksU1JDX0FMUEhBOjc3MCxPTkVfTUlOVVNfU1JDX0FMUEhBOjc3MSxEU1RfQUxQSEE6NzcyLE9ORV9NSU5VU19EU1RfQUxQSEE6NzczLERTVF9DT0xPUjo3NzQsT05FX01JTlVTX0RTVF9DT0xPUjo3NzUsU1JDX0FMUEhBX1NBVFVSQVRFOjc3NixGVU5DX0FERDozMjc3NCxCTEVORF9FUVVBVElPTjozMjc3NyxCTEVORF9FUVVBVElPTl9SR0I6MzI3NzcsQkxFTkRfRVFVQVRJT05fQUxQSEE6MzQ4NzcsRlVOQ19TVUJUUkFDVDozMjc3OCxGVU5DX1JFVkVSU0VfU1VCVFJBQ1Q6MzI3NzksQkxFTkRfRFNUX1JHQjozMjk2OCxCTEVORF9TUkNfUkdCOjMyOTY5LEJMRU5EX0RTVF9BTFBIQTozMjk3MCxCTEVORF9TUkNfQUxQSEE6MzI5NzEsQ09OU1RBTlRfQ09MT1I6MzI3NjksT05FX01JTlVTX0NPTlNUQU5UX0NPTE9SOjMyNzcwLENPTlNUQU5UX0FMUEhBOjMyNzcxLE9ORV9NSU5VU19DT05TVEFOVF9BTFBIQTozMjc3MixCTEVORF9DT0xPUjozMjc3MyxBUlJBWV9CVUZGRVI6MzQ5NjIsRUxFTUVOVF9BUlJBWV9CVUZGRVI6MzQ5NjMsQVJSQVlfQlVGRkVSX0JJTkRJTkc6MzQ5NjQsRUxFTUVOVF9BUlJBWV9CVUZGRVJfQklORElORzozNDk2NSxTVFJFQU1fRFJBVzozNTA0MCxTVEFUSUNfRFJBVzozNTA0NCxEWU5BTUlDX0RSQVc6MzUwNDgsQlVGRkVSX1NJWkU6MzQ2NjAsQlVGRkVSX1VTQUdFOjM0NjYxLENVUlJFTlRfVkVSVEVYX0FUVFJJQjozNDM0MixGUk9OVDoxMDI4LEJBQ0s6MTAyOSxGUk9OVF9BTkRfQkFDSzoxMDMyLENVTExfRkFDRToyODg0LEJMRU5EOjMwNDIsRElUSEVSOjMwMjQsU1RFTkNJTF9URVNUOjI5NjAsREVQVEhfVEVTVDoyOTI5LFNDSVNTT1JfVEVTVDozMDg5LFBPTFlHT05fT0ZGU0VUX0ZJTEw6MzI4MjMsU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFOjMyOTI2LFNBTVBMRV9DT1ZFUkFHRTozMjkyOCxOT19FUlJPUjowLElOVkFMSURfRU5VTToxMjgwLElOVkFMSURfVkFMVUU6MTI4MSxJTlZBTElEX09QRVJBVElPTjoxMjgyLE9VVF9PRl9NRU1PUlk6MTI4NSxDVzoyMzA0LENDVzoyMzA1LExJTkVfV0lEVEg6Mjg0OSxBTElBU0VEX1BPSU5UX1NJWkVfUkFOR0U6MzM5MDEsQUxJQVNFRF9MSU5FX1dJRFRIX1JBTkdFOjMzOTAyLENVTExfRkFDRV9NT0RFOjI4ODUsRlJPTlRfRkFDRToyODg2LERFUFRIX1JBTkdFOjI5MjgsREVQVEhfV1JJVEVNQVNLOjI5MzAsREVQVEhfQ0xFQVJfVkFMVUU6MjkzMSxERVBUSF9GVU5DOjI5MzIsU1RFTkNJTF9DTEVBUl9WQUxVRToyOTYxLFNURU5DSUxfRlVOQzoyOTYyLFNURU5DSUxfRkFJTDoyOTY0LFNURU5DSUxfUEFTU19ERVBUSF9GQUlMOjI5NjUsU1RFTkNJTF9QQVNTX0RFUFRIX1BBU1M6Mjk2NixTVEVOQ0lMX1JFRjoyOTY3LFNURU5DSUxfVkFMVUVfTUFTSzoyOTYzLFNURU5DSUxfV1JJVEVNQVNLOjI5NjgsU1RFTkNJTF9CQUNLX0ZVTkM6MzQ4MTYsU1RFTkNJTF9CQUNLX0ZBSUw6MzQ4MTcsU1RFTkNJTF9CQUNLX1BBU1NfREVQVEhfRkFJTDozNDgxOCxTVEVOQ0lMX0JBQ0tfUEFTU19ERVBUSF9QQVNTOjM0ODE5LFNURU5DSUxfQkFDS19SRUY6MzYwMDMsU1RFTkNJTF9CQUNLX1ZBTFVFX01BU0s6MzYwMDQsU1RFTkNJTF9CQUNLX1dSSVRFTUFTSzozNjAwNSxWSUVXUE9SVDoyOTc4LFNDSVNTT1JfQk9YOjMwODgsQ09MT1JfQ0xFQVJfVkFMVUU6MzEwNixDT0xPUl9XUklURU1BU0s6MzEwNyxVTlBBQ0tfQUxJR05NRU5UOjMzMTcsUEFDS19BTElHTk1FTlQ6MzMzMyxNQVhfVEVYVFVSRV9TSVpFOjMzNzksTUFYX1ZJRVdQT1JUX0RJTVM6MzM4NixTVUJQSVhFTF9CSVRTOjM0MDgsUkVEX0JJVFM6MzQxMCxHUkVFTl9CSVRTOjM0MTEsQkxVRV9CSVRTOjM0MTIsQUxQSEFfQklUUzozNDEzLERFUFRIX0JJVFM6MzQxNCxTVEVOQ0lMX0JJVFM6MzQxNSxQT0xZR09OX09GRlNFVF9VTklUUzoxMDc1MixQT0xZR09OX09GRlNFVF9GQUNUT1I6MzI4MjQsVEVYVFVSRV9CSU5ESU5HXzJEOjMyODczLFNBTVBMRV9CVUZGRVJTOjMyOTM2LFNBTVBMRVM6MzI5MzcsU0FNUExFX0NPVkVSQUdFX1ZBTFVFOjMyOTM4LFNBTVBMRV9DT1ZFUkFHRV9JTlZFUlQ6MzI5MzksQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFM6MzQ0NjcsRE9OVF9DQVJFOjQzNTIsRkFTVEVTVDo0MzUzLE5JQ0VTVDo0MzU0LEdFTkVSQVRFX01JUE1BUF9ISU5UOjMzMTcwLEJZVEU6NTEyMCxVTlNJR05FRF9CWVRFOjUxMjEsU0hPUlQ6NTEyMixVTlNJR05FRF9TSE9SVDo1MTIzLElOVDo1MTI0LFVOU0lHTkVEX0lOVDo1MTI1LEZMT0FUOjUxMjYsREVQVEhfQ09NUE9ORU5UOjY0MDIsQUxQSEE6NjQwNixSR0I6NjQwNyxSR0JBOjY0MDgsTFVNSU5BTkNFOjY0MDksTFVNSU5BTkNFX0FMUEhBOjY0MTAsVU5TSUdORURfU0hPUlRfNF80XzRfNDozMjgxOSxVTlNJR05FRF9TSE9SVF81XzVfNV8xOjMyODIwLFVOU0lHTkVEX1NIT1JUXzVfNl81OjMzNjM1LEZSQUdNRU5UX1NIQURFUjozNTYzMixWRVJURVhfU0hBREVSOjM1NjMzLE1BWF9WRVJURVhfQVRUUklCUzozNDkyMSxNQVhfVkVSVEVYX1VOSUZPUk1fVkVDVE9SUzozNjM0NyxNQVhfVkFSWUlOR19WRUNUT1JTOjM2MzQ4LE1BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTOjM1NjYxLE1BWF9WRVJURVhfVEVYVFVSRV9JTUFHRV9VTklUUzozNTY2MCxNQVhfVEVYVFVSRV9JTUFHRV9VTklUUzozNDkzMCxNQVhfRlJBR01FTlRfVU5JRk9STV9WRUNUT1JTOjM2MzQ5LFNIQURFUl9UWVBFOjM1NjYzLERFTEVURV9TVEFUVVM6MzU3MTIsTElOS19TVEFUVVM6MzU3MTQsVkFMSURBVEVfU1RBVFVTOjM1NzE1LEFUVEFDSEVEX1NIQURFUlM6MzU3MTcsQUNUSVZFX1VOSUZPUk1TOjM1NzE4LEFDVElWRV9BVFRSSUJVVEVTOjM1NzIxLFNIQURJTkdfTEFOR1VBR0VfVkVSU0lPTjozNTcyNCxDVVJSRU5UX1BST0dSQU06MzU3MjUsTkVWRVI6NTEyLExFU1M6NTEzLEVRVUFMOjUxNCxMRVFVQUw6NTE1LEdSRUFURVI6NTE2LE5PVEVRVUFMOjUxNyxHRVFVQUw6NTE4LEFMV0FZUzo1MTksS0VFUDo3NjgwLFJFUExBQ0U6NzY4MSxJTkNSOjc2ODIsREVDUjo3NjgzLElOVkVSVDo1Mzg2LElOQ1JfV1JBUDozNDA1NSxERUNSX1dSQVA6MzQwNTYsVkVORE9SOjc5MzYsUkVOREVSRVI6NzkzNyxWRVJTSU9OOjc5MzgsTkVBUkVTVDo5NzI4LExJTkVBUjo5NzI5LE5FQVJFU1RfTUlQTUFQX05FQVJFU1Q6OTk4NCxMSU5FQVJfTUlQTUFQX05FQVJFU1Q6OTk4NSxORUFSRVNUX01JUE1BUF9MSU5FQVI6OTk4NixMSU5FQVJfTUlQTUFQX0xJTkVBUjo5OTg3LFRFWFRVUkVfTUFHX0ZJTFRFUjoxMDI0MCxURVhUVVJFX01JTl9GSUxURVI6MTAyNDEsVEVYVFVSRV9XUkFQX1M6MTAyNDIsVEVYVFVSRV9XUkFQX1Q6MTAyNDMsVEVYVFVSRV8yRDozNTUzLFRFWFRVUkU6NTg5MCxURVhUVVJFX0NVQkVfTUFQOjM0MDY3LFRFWFRVUkVfQklORElOR19DVUJFX01BUDozNDA2OCxURVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1g6MzQwNjksVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9YOjM0MDcwLFRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWTozNDA3MSxURVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1k6MzQwNzIsVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9aOjM0MDczLFRFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWjozNDA3NCxNQVhfQ1VCRV9NQVBfVEVYVFVSRV9TSVpFOjM0MDc2LFRFWFRVUkUwOjMzOTg0LFRFWFRVUkUxOjMzOTg1LFRFWFRVUkUyOjMzOTg2LFRFWFRVUkUzOjMzOTg3LFRFWFRVUkU0OjMzOTg4LFRFWFRVUkU1OjMzOTg5LFRFWFRVUkU2OjMzOTkwLFRFWFRVUkU3OjMzOTkxLFRFWFRVUkU4OjMzOTkyLFRFWFRVUkU5OjMzOTkzLFRFWFRVUkUxMDozMzk5NCxURVhUVVJFMTE6MzM5OTUsVEVYVFVSRTEyOjMzOTk2LFRFWFRVUkUxMzozMzk5NyxURVhUVVJFMTQ6MzM5OTgsVEVYVFVSRTE1OjMzOTk5LFRFWFRVUkUxNjozNGUzLFRFWFRVUkUxNzozNDAwMSxURVhUVVJFMTg6MzQwMDIsVEVYVFVSRTE5OjM0MDAzLFRFWFRVUkUyMDozNDAwNCxURVhUVVJFMjE6MzQwMDUsVEVYVFVSRTIyOjM0MDA2LFRFWFRVUkUyMzozNDAwNyxURVhUVVJFMjQ6MzQwMDgsVEVYVFVSRTI1OjM0MDA5LFRFWFRVUkUyNjozNDAxMCxURVhUVVJFMjc6MzQwMTEsVEVYVFVSRTI4OjM0MDEyLFRFWFRVUkUyOTozNDAxMyxURVhUVVJFMzA6MzQwMTQsVEVYVFVSRTMxOjM0MDE1LEFDVElWRV9URVhUVVJFOjM0MDE2LFJFUEVBVDoxMDQ5NyxDTEFNUF9UT19FREdFOjMzMDcxLE1JUlJPUkVEX1JFUEVBVDozMzY0OCxGTE9BVF9WRUMyOjM1NjY0LEZMT0FUX1ZFQzM6MzU2NjUsRkxPQVRfVkVDNDozNTY2NixJTlRfVkVDMjozNTY2NyxJTlRfVkVDMzozNTY2OCxJTlRfVkVDNDozNTY2OSxCT09MOjM1NjcwLEJPT0xfVkVDMjozNTY3MSxCT09MX1ZFQzM6MzU2NzIsQk9PTF9WRUM0OjM1NjczLEZMT0FUX01BVDI6MzU2NzQsRkxPQVRfTUFUMzozNTY3NSxGTE9BVF9NQVQ0OjM1Njc2LFNBTVBMRVJfMkQ6MzU2NzgsU0FNUExFUl9DVUJFOjM1NjgwLFZFUlRFWF9BVFRSSUJfQVJSQVlfRU5BQkxFRDozNDMzOCxWRVJURVhfQVRUUklCX0FSUkFZX1NJWkU6MzQzMzksVkVSVEVYX0FUVFJJQl9BUlJBWV9TVFJJREU6MzQzNDAsVkVSVEVYX0FUVFJJQl9BUlJBWV9UWVBFOjM0MzQxLFZFUlRFWF9BVFRSSUJfQVJSQVlfTk9STUFMSVpFRDozNDkyMixWRVJURVhfQVRUUklCX0FSUkFZX1BPSU5URVI6MzQzNzMsVkVSVEVYX0FUVFJJQl9BUlJBWV9CVUZGRVJfQklORElORzozNDk3NSxJTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX1RZUEU6MzU3MzgsSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9GT1JNQVQ6MzU3MzksQ09NUElMRV9TVEFUVVM6MzU3MTMsTE9XX0ZMT0FUOjM2MzM2LE1FRElVTV9GTE9BVDozNjMzNyxISUdIX0ZMT0FUOjM2MzM4LExPV19JTlQ6MzYzMzksTUVESVVNX0lOVDozNjM0MCxISUdIX0lOVDozNjM0MSxGUkFNRUJVRkZFUjozNjE2MCxSRU5ERVJCVUZGRVI6MzYxNjEsUkdCQTQ6MzI4NTQsUkdCNV9BMTozMjg1NSxSR0I1NjU6MzYxOTQsREVQVEhfQ09NUE9ORU5UMTY6MzMxODksU1RFTkNJTF9JTkRFWDo2NDAxLFNURU5DSUxfSU5ERVg4OjM2MTY4LERFUFRIX1NURU5DSUw6MzQwNDEsUkVOREVSQlVGRkVSX1dJRFRIOjM2MTYyLFJFTkRFUkJVRkZFUl9IRUlHSFQ6MzYxNjMsUkVOREVSQlVGRkVSX0lOVEVSTkFMX0ZPUk1BVDozNjE2NCxSRU5ERVJCVUZGRVJfUkVEX1NJWkU6MzYxNzYsUkVOREVSQlVGRkVSX0dSRUVOX1NJWkU6MzYxNzcsUkVOREVSQlVGRkVSX0JMVUVfU0laRTozNjE3OCxSRU5ERVJCVUZGRVJfQUxQSEFfU0laRTozNjE3OSxSRU5ERVJCVUZGRVJfREVQVEhfU0laRTozNjE4MCxSRU5ERVJCVUZGRVJfU1RFTkNJTF9TSVpFOjM2MTgxLEZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX1RZUEU6MzYwNDgsRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9PQkpFQ1RfTkFNRTozNjA0OSxGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfTEVWRUw6MzYwNTAsRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0NVQkVfTUFQX0ZBQ0U6MzYwNTEsQ09MT1JfQVRUQUNITUVOVDA6MzYwNjQsREVQVEhfQVRUQUNITUVOVDozNjA5NixTVEVOQ0lMX0FUVEFDSE1FTlQ6MzYxMjgsREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UOjMzMzA2LE5PTkU6MCxGUkFNRUJVRkZFUl9DT01QTEVURTozNjA1MyxGUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0FUVEFDSE1FTlQ6MzYwNTQsRlJBTUVCVUZGRVJfSU5DT01QTEVURV9NSVNTSU5HX0FUVEFDSE1FTlQ6MzYwNTUsRlJBTUVCVUZGRVJfSU5DT01QTEVURV9ESU1FTlNJT05TOjM2MDU3LEZSQU1FQlVGRkVSX1VOU1VQUE9SVEVEOjM2MDYxLEZSQU1FQlVGRkVSX0JJTkRJTkc6MzYwMDYsUkVOREVSQlVGRkVSX0JJTkRJTkc6MzYwMDcsTUFYX1JFTkRFUkJVRkZFUl9TSVpFOjM0MDI0LElOVkFMSURfRlJBTUVCVUZGRVJfT1BFUkFUSU9OOjEyODYsVU5QQUNLX0ZMSVBfWV9XRUJHTDozNzQ0MCxVTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0w6Mzc0NDEsQ09OVEVYVF9MT1NUX1dFQkdMOjM3NDQyLFVOUEFDS19DT0xPUlNQQUNFX0NPTlZFUlNJT05fV0VCR0w6Mzc0NDMsQlJPV1NFUl9ERUZBVUxUX1dFQkdMOjM3NDQ0LENPTVBSRVNTRURfUkdCX1MzVENfRFhUMV9FWFQ6MzM3NzYsQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUMV9FWFQ6MzM3NzcsQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUM19FWFQ6MzM3NzgsQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUNV9FWFQ6MzM3NzksQ09NUFJFU1NFRF9SR0JfUFZSVENfNEJQUFYxX0lNRzozNTg0MCxDT01QUkVTU0VEX1JHQl9QVlJUQ18yQlBQVjFfSU1HOjM1ODQxLENPTVBSRVNTRURfUkdCQV9QVlJUQ180QlBQVjFfSU1HOjM1ODQyLENPTVBSRVNTRURfUkdCQV9QVlJUQ18yQlBQVjFfSU1HOjM1ODQzLENPTVBSRVNTRURfUkdCQV9BU1RDXzR4NF9XRUJHTDozNzgwOCxDT01QUkVTU0VEX1JHQl9FVEMxX1dFQkdMOjM2MTk2LENPTVBSRVNTRURfUkdCQV9CUFRDX1VOT1JNOjM2NDkyLEhBTEZfRkxPQVRfT0VTOjM2MTkzLERPVUJMRTo1MTMwLFJFQURfQlVGRkVSOjMwNzQsVU5QQUNLX1JPV19MRU5HVEg6MzMxNCxVTlBBQ0tfU0tJUF9ST1dTOjMzMTUsVU5QQUNLX1NLSVBfUElYRUxTOjMzMTYsUEFDS19ST1dfTEVOR1RIOjMzMzAsUEFDS19TS0lQX1JPV1M6MzMzMSxQQUNLX1NLSVBfUElYRUxTOjMzMzIsQ09MT1I6NjE0NCxERVBUSDo2MTQ1LFNURU5DSUw6NjE0NixSRUQ6NjQwMyxSR0I4OjMyODQ5LFJHQkE4OjMyODU2LFJHQjEwX0EyOjMyODU3LFRFWFRVUkVfQklORElOR18zRDozMjg3NCxVTlBBQ0tfU0tJUF9JTUFHRVM6MzI4NzcsVU5QQUNLX0lNQUdFX0hFSUdIVDozMjg3OCxURVhUVVJFXzNEOjMyODc5LFRFWFRVUkVfV1JBUF9SOjMyODgyLE1BWF8zRF9URVhUVVJFX1NJWkU6MzI4ODMsVU5TSUdORURfSU5UXzJfMTBfMTBfMTBfUkVWOjMzNjQwLE1BWF9FTEVNRU5UU19WRVJUSUNFUzozM2UzLE1BWF9FTEVNRU5UU19JTkRJQ0VTOjMzMDAxLFRFWFRVUkVfTUlOX0xPRDozMzA4MixURVhUVVJFX01BWF9MT0Q6MzMwODMsVEVYVFVSRV9CQVNFX0xFVkVMOjMzMDg0LFRFWFRVUkVfTUFYX0xFVkVMOjMzMDg1LE1JTjozMjc3NSxNQVg6MzI3NzYsREVQVEhfQ09NUE9ORU5UMjQ6MzMxOTAsTUFYX1RFWFRVUkVfTE9EX0JJQVM6MzQwNDUsVEVYVFVSRV9DT01QQVJFX01PREU6MzQ4OTIsVEVYVFVSRV9DT01QQVJFX0ZVTkM6MzQ4OTMsQ1VSUkVOVF9RVUVSWTozNDkxNyxRVUVSWV9SRVNVTFQ6MzQ5MTgsUVVFUllfUkVTVUxUX0FWQUlMQUJMRTozNDkxOSxTVFJFQU1fUkVBRDozNTA0MSxTVFJFQU1fQ09QWTozNTA0MixTVEFUSUNfUkVBRDozNTA0NSxTVEFUSUNfQ09QWTozNTA0NixEWU5BTUlDX1JFQUQ6MzUwNDksRFlOQU1JQ19DT1BZOjM1MDUwLE1BWF9EUkFXX0JVRkZFUlM6MzQ4NTIsRFJBV19CVUZGRVIwOjM0ODUzLERSQVdfQlVGRkVSMTozNDg1NCxEUkFXX0JVRkZFUjI6MzQ4NTUsRFJBV19CVUZGRVIzOjM0ODU2LERSQVdfQlVGRkVSNDozNDg1NyxEUkFXX0JVRkZFUjU6MzQ4NTgsRFJBV19CVUZGRVI2OjM0ODU5LERSQVdfQlVGRkVSNzozNDg2MCxEUkFXX0JVRkZFUjg6MzQ4NjEsRFJBV19CVUZGRVI5OjM0ODYyLERSQVdfQlVGRkVSMTA6MzQ4NjMsRFJBV19CVUZGRVIxMTozNDg2NCxEUkFXX0JVRkZFUjEyOjM0ODY1LERSQVdfQlVGRkVSMTM6MzQ4NjYsRFJBV19CVUZGRVIxNDozNDg2NyxEUkFXX0JVRkZFUjE1OjM0ODY4LE1BWF9GUkFHTUVOVF9VTklGT1JNX0NPTVBPTkVOVFM6MzU2NTcsTUFYX1ZFUlRFWF9VTklGT1JNX0NPTVBPTkVOVFM6MzU2NTgsU0FNUExFUl8zRDozNTY3OSxTQU1QTEVSXzJEX1NIQURPVzozNTY4MixGUkFHTUVOVF9TSEFERVJfREVSSVZBVElWRV9ISU5UOjM1NzIzLFBJWEVMX1BBQ0tfQlVGRkVSOjM1MDUxLFBJWEVMX1VOUEFDS19CVUZGRVI6MzUwNTIsUElYRUxfUEFDS19CVUZGRVJfQklORElORzozNTA1MyxQSVhFTF9VTlBBQ0tfQlVGRkVSX0JJTkRJTkc6MzUwNTUsRkxPQVRfTUFUMngzOjM1Njg1LEZMT0FUX01BVDJ4NDozNTY4NixGTE9BVF9NQVQzeDI6MzU2ODcsRkxPQVRfTUFUM3g0OjM1Njg4LEZMT0FUX01BVDR4MjozNTY4OSxGTE9BVF9NQVQ0eDM6MzU2OTAsU1JHQjozNTkwNCxTUkdCODozNTkwNSxTUkdCOF9BTFBIQTg6MzU5MDcsQ09NUEFSRV9SRUZfVE9fVEVYVFVSRTozNDg5NCxSR0JBMzJGOjM0ODM2LFJHQjMyRjozNDgzNyxSR0JBMTZGOjM0ODQyLFJHQjE2RjozNDg0MyxWRVJURVhfQVRUUklCX0FSUkFZX0lOVEVHRVI6MzUwNjksTUFYX0FSUkFZX1RFWFRVUkVfTEFZRVJTOjM1MDcxLE1JTl9QUk9HUkFNX1RFWEVMX09GRlNFVDozNTA3NixNQVhfUFJPR1JBTV9URVhFTF9PRkZTRVQ6MzUwNzcsTUFYX1ZBUllJTkdfQ09NUE9ORU5UUzozNTY1OSxURVhUVVJFXzJEX0FSUkFZOjM1ODY2LFRFWFRVUkVfQklORElOR18yRF9BUlJBWTozNTg2OSxSMTFGX0cxMUZfQjEwRjozNTg5OCxVTlNJR05FRF9JTlRfMTBGXzExRl8xMUZfUkVWOjM1ODk5LFJHQjlfRTU6MzU5MDEsVU5TSUdORURfSU5UXzVfOV85XzlfUkVWOjM1OTAyLFRSQU5TRk9STV9GRUVEQkFDS19CVUZGRVJfTU9ERTozNTk2NyxNQVhfVFJBTlNGT1JNX0ZFRURCQUNLX1NFUEFSQVRFX0NPTVBPTkVOVFM6MzU5NjgsVFJBTlNGT1JNX0ZFRURCQUNLX1ZBUllJTkdTOjM1OTcxLFRSQU5TRk9STV9GRUVEQkFDS19CVUZGRVJfU1RBUlQ6MzU5NzIsVFJBTlNGT1JNX0ZFRURCQUNLX0JVRkZFUl9TSVpFOjM1OTczLFRSQU5TRk9STV9GRUVEQkFDS19QUklNSVRJVkVTX1dSSVRURU46MzU5NzYsUkFTVEVSSVpFUl9ESVNDQVJEOjM1OTc3LE1BWF9UUkFOU0ZPUk1fRkVFREJBQ0tfSU5URVJMRUFWRURfQ09NUE9ORU5UUzozNTk3OCxNQVhfVFJBTlNGT1JNX0ZFRURCQUNLX1NFUEFSQVRFX0FUVFJJQlM6MzU5NzksSU5URVJMRUFWRURfQVRUUklCUzozNTk4MCxTRVBBUkFURV9BVFRSSUJTOjM1OTgxLFRSQU5TRk9STV9GRUVEQkFDS19CVUZGRVI6MzU5ODIsVFJBTlNGT1JNX0ZFRURCQUNLX0JVRkZFUl9CSU5ESU5HOjM1OTgzLFJHQkEzMlVJOjM2MjA4LFJHQjMyVUk6MzYyMDksUkdCQTE2VUk6MzYyMTQsUkdCMTZVSTozNjIxNSxSR0JBOFVJOjM2MjIwLFJHQjhVSTozNjIyMSxSR0JBMzJJOjM2MjI2LFJHQjMySTozNjIyNyxSR0JBMTZJOjM2MjMyLFJHQjE2STozNjIzMyxSR0JBOEk6MzYyMzgsUkdCOEk6MzYyMzksUkVEX0lOVEVHRVI6MzYyNDQsUkdCX0lOVEVHRVI6MzYyNDgsUkdCQV9JTlRFR0VSOjM2MjQ5LFNBTVBMRVJfMkRfQVJSQVk6MzYyODksU0FNUExFUl8yRF9BUlJBWV9TSEFET1c6MzYyOTIsU0FNUExFUl9DVUJFX1NIQURPVzozNjI5MyxVTlNJR05FRF9JTlRfVkVDMjozNjI5NCxVTlNJR05FRF9JTlRfVkVDMzozNjI5NSxVTlNJR05FRF9JTlRfVkVDNDozNjI5NixJTlRfU0FNUExFUl8yRDozNjI5OCxJTlRfU0FNUExFUl8zRDozNjI5OSxJTlRfU0FNUExFUl9DVUJFOjM2MzAwLElOVF9TQU1QTEVSXzJEX0FSUkFZOjM2MzAzLFVOU0lHTkVEX0lOVF9TQU1QTEVSXzJEOjM2MzA2LFVOU0lHTkVEX0lOVF9TQU1QTEVSXzNEOjM2MzA3LFVOU0lHTkVEX0lOVF9TQU1QTEVSX0NVQkU6MzYzMDgsVU5TSUdORURfSU5UX1NBTVBMRVJfMkRfQVJSQVk6MzYzMTEsREVQVEhfQ09NUE9ORU5UMzJGOjM2MDEyLERFUFRIMzJGX1NURU5DSUw4OjM2MDEzLEZMT0FUXzMyX1VOU0lHTkVEX0lOVF8yNF84X1JFVjozNjI2OSxGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX0NPTE9SX0VOQ09ESU5HOjMzMjk2LEZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfQ09NUE9ORU5UX1RZUEU6MzMyOTcsRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9SRURfU0laRTozMzI5OCxGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX0dSRUVOX1NJWkU6MzMyOTksRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9CTFVFX1NJWkU6MzMzMDAsRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9BTFBIQV9TSVpFOjMzMzAxLEZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfREVQVEhfU0laRTozMzMwMixGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1NURU5DSUxfU0laRTozMzMwMyxGUkFNRUJVRkZFUl9ERUZBVUxUOjMzMzA0LFVOU0lHTkVEX0lOVF8yNF84OjM0MDQyLERFUFRIMjRfU1RFTkNJTDg6MzUwNTYsVU5TSUdORURfTk9STUFMSVpFRDozNTg2MyxEUkFXX0ZSQU1FQlVGRkVSX0JJTkRJTkc6MzYwMDYsUkVBRF9GUkFNRUJVRkZFUjozNjAwOCxEUkFXX0ZSQU1FQlVGRkVSOjM2MDA5LFJFQURfRlJBTUVCVUZGRVJfQklORElORzozNjAxMCxSRU5ERVJCVUZGRVJfU0FNUExFUzozNjAxMSxGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfTEFZRVI6MzYwNTIsTUFYX0NPTE9SX0FUVEFDSE1FTlRTOjM2MDYzLENPTE9SX0FUVEFDSE1FTlQxOjM2MDY1LENPTE9SX0FUVEFDSE1FTlQyOjM2MDY2LENPTE9SX0FUVEFDSE1FTlQzOjM2MDY3LENPTE9SX0FUVEFDSE1FTlQ0OjM2MDY4LENPTE9SX0FUVEFDSE1FTlQ1OjM2MDY5LENPTE9SX0FUVEFDSE1FTlQ2OjM2MDcwLENPTE9SX0FUVEFDSE1FTlQ3OjM2MDcxLENPTE9SX0FUVEFDSE1FTlQ4OjM2MDcyLENPTE9SX0FUVEFDSE1FTlQ5OjM2MDczLENPTE9SX0FUVEFDSE1FTlQxMDozNjA3NCxDT0xPUl9BVFRBQ0hNRU5UMTE6MzYwNzUsQ09MT1JfQVRUQUNITUVOVDEyOjM2MDc2LENPTE9SX0FUVEFDSE1FTlQxMzozNjA3NyxDT0xPUl9BVFRBQ0hNRU5UMTQ6MzYwNzgsQ09MT1JfQVRUQUNITUVOVDE1OjM2MDc5LEZSQU1FQlVGRkVSX0lOQ09NUExFVEVfTVVMVElTQU1QTEU6MzYxODIsTUFYX1NBTVBMRVM6MzYxODMsSEFMRl9GTE9BVDo1MTMxLFJHOjMzMzE5LFJHX0lOVEVHRVI6MzMzMjAsUjg6MzMzMjEsUkc4OjMzMzIzLFIxNkY6MzMzMjUsUjMyRjozMzMyNixSRzE2RjozMzMyNyxSRzMyRjozMzMyOCxSOEk6MzMzMjksUjhVSTozMzMzMCxSMTZJOjMzMzMxLFIxNlVJOjMzMzMyLFIzMkk6MzMzMzMsUjMyVUk6MzMzMzQsUkc4STozMzMzNSxSRzhVSTozMzMzNixSRzE2STozMzMzNyxSRzE2VUk6MzMzMzgsUkczMkk6MzMzMzksUkczMlVJOjMzMzQwLFZFUlRFWF9BUlJBWV9CSU5ESU5HOjM0MjI5LFI4X1NOT1JNOjM2NzU2LFJHOF9TTk9STTozNjc1NyxSR0I4X1NOT1JNOjM2NzU4LFJHQkE4X1NOT1JNOjM2NzU5LFNJR05FRF9OT1JNQUxJWkVEOjM2NzY0LENPUFlfUkVBRF9CVUZGRVI6MzY2NjIsQ09QWV9XUklURV9CVUZGRVI6MzY2NjMsQ09QWV9SRUFEX0JVRkZFUl9CSU5ESU5HOjM2NjYyLENPUFlfV1JJVEVfQlVGRkVSX0JJTkRJTkc6MzY2NjMsVU5JRk9STV9CVUZGRVI6MzUzNDUsVU5JRk9STV9CVUZGRVJfQklORElORzozNTM2OCxVTklGT1JNX0JVRkZFUl9TVEFSVDozNTM2OSxVTklGT1JNX0JVRkZFUl9TSVpFOjM1MzcwLE1BWF9WRVJURVhfVU5JRk9STV9CTE9DS1M6MzUzNzEsTUFYX0ZSQUdNRU5UX1VOSUZPUk1fQkxPQ0tTOjM1MzczLE1BWF9DT01CSU5FRF9VTklGT1JNX0JMT0NLUzozNTM3NCxNQVhfVU5JRk9STV9CVUZGRVJfQklORElOR1M6MzUzNzUsTUFYX1VOSUZPUk1fQkxPQ0tfU0laRTozNTM3NixNQVhfQ09NQklORURfVkVSVEVYX1VOSUZPUk1fQ09NUE9ORU5UUzozNTM3NyxNQVhfQ09NQklORURfRlJBR01FTlRfVU5JRk9STV9DT01QT05FTlRTOjM1Mzc5LFVOSUZPUk1fQlVGRkVSX09GRlNFVF9BTElHTk1FTlQ6MzUzODAsQUNUSVZFX1VOSUZPUk1fQkxPQ0tTOjM1MzgyLFVOSUZPUk1fVFlQRTozNTM4MyxVTklGT1JNX1NJWkU6MzUzODQsVU5JRk9STV9CTE9DS19JTkRFWDozNTM4NixVTklGT1JNX09GRlNFVDozNTM4NyxVTklGT1JNX0FSUkFZX1NUUklERTozNTM4OCxVTklGT1JNX01BVFJJWF9TVFJJREU6MzUzODksVU5JRk9STV9JU19ST1dfTUFKT1I6MzUzOTAsVU5JRk9STV9CTE9DS19CSU5ESU5HOjM1MzkxLFVOSUZPUk1fQkxPQ0tfREFUQV9TSVpFOjM1MzkyLFVOSUZPUk1fQkxPQ0tfQUNUSVZFX1VOSUZPUk1TOjM1Mzk0LFVOSUZPUk1fQkxPQ0tfQUNUSVZFX1VOSUZPUk1fSU5ESUNFUzozNTM5NSxVTklGT1JNX0JMT0NLX1JFRkVSRU5DRURfQllfVkVSVEVYX1NIQURFUjozNTM5NixVTklGT1JNX0JMT0NLX1JFRkVSRU5DRURfQllfRlJBR01FTlRfU0hBREVSOjM1Mzk4LElOVkFMSURfSU5ERVg6NDI5NDk2NzI5NSxNQVhfVkVSVEVYX09VVFBVVF9DT01QT05FTlRTOjM3MTU0LE1BWF9GUkFHTUVOVF9JTlBVVF9DT01QT05FTlRTOjM3MTU3LE1BWF9TRVJWRVJfV0FJVF9USU1FT1VUOjM3MTM3LE9CSkVDVF9UWVBFOjM3MTM4LFNZTkNfQ09ORElUSU9OOjM3MTM5LFNZTkNfU1RBVFVTOjM3MTQwLFNZTkNfRkxBR1M6MzcxNDEsU1lOQ19GRU5DRTozNzE0MixTWU5DX0dQVV9DT01NQU5EU19DT01QTEVURTozNzE0MyxVTlNJR05BTEVEOjM3MTQ0LFNJR05BTEVEOjM3MTQ1LEFMUkVBRFlfU0lHTkFMRUQ6MzcxNDYsVElNRU9VVF9FWFBJUkVEOjM3MTQ3LENPTkRJVElPTl9TQVRJU0ZJRUQ6MzcxNDgsV0FJVF9GQUlMRUQ6MzcxNDksU1lOQ19GTFVTSF9DT01NQU5EU19CSVQ6MSxWRVJURVhfQVRUUklCX0FSUkFZX0RJVklTT1I6MzUwNzAsQU5ZX1NBTVBMRVNfUEFTU0VEOjM1ODg3LEFOWV9TQU1QTEVTX1BBU1NFRF9DT05TRVJWQVRJVkU6MzYyMDIsU0FNUExFUl9CSU5ESU5HOjM1MDk3LFJHQjEwX0EyVUk6MzY5NzUsSU5UXzJfMTBfMTBfMTBfUkVWOjM2MjU1LFRSQU5TRk9STV9GRUVEQkFDSzozNjM4NixUUkFOU0ZPUk1fRkVFREJBQ0tfUEFVU0VEOjM2Mzg3LFRSQU5TRk9STV9GRUVEQkFDS19BQ1RJVkU6MzYzODgsVFJBTlNGT1JNX0ZFRURCQUNLX0JJTkRJTkc6MzYzODksQ09NUFJFU1NFRF9SMTFfRUFDOjM3NDg4LENPTVBSRVNTRURfU0lHTkVEX1IxMV9FQUM6Mzc0ODksQ09NUFJFU1NFRF9SRzExX0VBQzozNzQ5MCxDT01QUkVTU0VEX1NJR05FRF9SRzExX0VBQzozNzQ5MSxDT01QUkVTU0VEX1JHQjhfRVRDMjozNzQ5MixDT01QUkVTU0VEX1NSR0I4X0VUQzI6Mzc0OTMsQ09NUFJFU1NFRF9SR0I4X1BVTkNIVEhST1VHSF9BTFBIQTFfRVRDMjozNzQ5NCxDT01QUkVTU0VEX1NSR0I4X1BVTkNIVEhST1VHSF9BTFBIQTFfRVRDMjozNzQ5NSxDT01QUkVTU0VEX1JHQkE4X0VUQzJfRUFDOjM3NDk2LENPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0VUQzJfRUFDOjM3NDk3LFRFWFRVUkVfSU1NVVRBQkxFX0ZPUk1BVDozNzE2NyxNQVhfRUxFTUVOVF9JTkRFWDozNjIwMyxURVhUVVJFX0lNTVVUQUJMRV9MRVZFTFM6MzM1MDMsTUFYX1RFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhUOjM0MDQ3fSk7Y29uc3QgSmU9e0NMT0NLV0lTRTpnci5DVyxDT1VOVEVSX0NMT0NLV0lTRTpnci5DQ1d9O0plLnZhbGlkYXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0PT09SmUuQ0xPQ0tXSVNFfHx0PT09SmUuQ09VTlRFUl9DTE9DS1dJU0V9O3ZhciBibj1PYmplY3QuZnJlZXplKEplKTtmdW5jdGlvbiBBdCh0KXt0aGlzLl9lbGxpcHNvaWQ9bSh0LGouV0dTODQpLHRoaXMuX3NlbWltYWpvckF4aXM9dGhpcy5fZWxsaXBzb2lkLm1heGltdW1SYWRpdXMsdGhpcy5fb25lT3ZlclNlbWltYWpvckF4aXM9MS90aGlzLl9zZW1pbWFqb3JBeGlzfU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEF0LnByb3RvdHlwZSx7ZWxsaXBzb2lkOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWxsaXBzb2lkfX19KSxBdC5tZXJjYXRvckFuZ2xlVG9HZW9kZXRpY0xhdGl0dWRlPWZ1bmN0aW9uKHQpe3JldHVybiBSLlBJX09WRVJfVFdPLTIqTWF0aC5hdGFuKE1hdGguZXhwKC10KSl9LEF0Lmdlb2RldGljTGF0aXR1ZGVUb01lcmNhdG9yQW5nbGU9ZnVuY3Rpb24odCl7dD5BdC5NYXhpbXVtTGF0aXR1ZGU/dD1BdC5NYXhpbXVtTGF0aXR1ZGU6dDwtQXQuTWF4aW11bUxhdGl0dWRlJiYodD0tQXQuTWF4aW11bUxhdGl0dWRlKTtjb25zdCBlPU1hdGguc2luKHQpO3JldHVybiAuNSpNYXRoLmxvZygoMStlKS8oMS1lKSl9LEF0Lk1heGltdW1MYXRpdHVkZT1BdC5tZXJjYXRvckFuZ2xlVG9HZW9kZXRpY0xhdGl0dWRlKE1hdGguUEkpLEF0LnByb3RvdHlwZS5wcm9qZWN0PWZ1bmN0aW9uKHQsZSl7Y29uc3Qgbj10aGlzLl9zZW1pbWFqb3JBeGlzLHI9dC5sb25naXR1ZGUqbixpPUF0Lmdlb2RldGljTGF0aXR1ZGVUb01lcmNhdG9yQW5nbGUodC5sYXRpdHVkZSkqbixvPXQuaGVpZ2h0O3JldHVybiBwKGUpPyhlLng9cixlLnk9aSxlLno9byxlKTpuZXcgZihyLGksbyl9LEF0LnByb3RvdHlwZS51bnByb2plY3Q9ZnVuY3Rpb24odCxlKXtpZighcCh0KSl0aHJvdyBuZXcgeCgiY2FydGVzaWFuIGlzIHJlcXVpcmVkIik7Y29uc3Qgbj10aGlzLl9vbmVPdmVyU2VtaW1ham9yQXhpcyxyPXQueCpuLGk9QXQubWVyY2F0b3JBbmdsZVRvR2VvZGV0aWNMYXRpdHVkZSh0Lnkqbiksbz10Lno7cmV0dXJuIHAoZSk/KGUubG9uZ2l0dWRlPXIsZS5sYXRpdHVkZT1pLGUuaGVpZ2h0PW8sZSk6bmV3IEgocixpLG8pfTtjbGFzcyBGb3thZGQoZSxuLHIpe2lmKHR5cGVvZiBhcmd1bWVudHNbMF0hPSJzdHJpbmciKWZvcihsZXQgaSBpbiBhcmd1bWVudHNbMF0pdGhpcy5hZGQoaSxhcmd1bWVudHNbMF1baV0sYXJndW1lbnRzWzFdKTtlbHNlKEFycmF5LmlzQXJyYXkoZSk/ZTpbZV0pLmZvckVhY2goZnVuY3Rpb24oaSl7dGhpc1tpXT10aGlzW2ldfHxbXSxuJiZ0aGlzW2ldW3I/InVuc2hpZnQiOiJwdXNoIl0obil9LHRoaXMpfXJ1bihlLG4pe3RoaXNbZV09dGhpc1tlXXx8W10sdGhpc1tlXS5mb3JFYWNoKGZ1bmN0aW9uKHIpe3IuY2FsbChuJiZuLmNvbnRleHQ/bi5jb250ZXh0Om4sbil9KX19Y2xhc3Mgd297Y29uc3RydWN0b3IoZSl7dGhpcy5qc2VwPWUsdGhpcy5yZWdpc3RlcmVkPXt9fXJlZ2lzdGVyKC4uLmUpe2UuZm9yRWFjaChuPT57aWYodHlwZW9mIG4hPSJvYmplY3QifHwhbi5uYW1lfHwhbi5pbml0KXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBKU0VQIHBsdWdpbiBmb3JtYXQiKTt0aGlzLnJlZ2lzdGVyZWRbbi5uYW1lXXx8KG4uaW5pdCh0aGlzLmpzZXApLHRoaXMucmVnaXN0ZXJlZFtuLm5hbWVdPW4pfSl9fWNsYXNzIEV7c3RhdGljIGdldCB2ZXJzaW9uKCl7cmV0dXJuIjEuMy44In1zdGF0aWMgdG9TdHJpbmcoKXtyZXR1cm4iSmF2YVNjcmlwdCBFeHByZXNzaW9uIFBhcnNlciAoSlNFUCkgdiIrRS52ZXJzaW9ufXN0YXRpYyBhZGRVbmFyeU9wKGUpe3JldHVybiBFLm1heF91bm9wX2xlbj1NYXRoLm1heChlLmxlbmd0aCxFLm1heF91bm9wX2xlbiksRS51bmFyeV9vcHNbZV09MSxFfXN0YXRpYyBhZGRCaW5hcnlPcChlLG4scil7cmV0dXJuIEUubWF4X2Jpbm9wX2xlbj1NYXRoLm1heChlLmxlbmd0aCxFLm1heF9iaW5vcF9sZW4pLEUuYmluYXJ5X29wc1tlXT1uLHI/RS5yaWdodF9hc3NvY2lhdGl2ZS5hZGQoZSk6RS5yaWdodF9hc3NvY2lhdGl2ZS5kZWxldGUoZSksRX1zdGF0aWMgYWRkSWRlbnRpZmllckNoYXIoZSl7cmV0dXJuIEUuYWRkaXRpb25hbF9pZGVudGlmaWVyX2NoYXJzLmFkZChlKSxFfXN0YXRpYyBhZGRMaXRlcmFsKGUsbil7cmV0dXJuIEUubGl0ZXJhbHNbZV09bixFfXN0YXRpYyByZW1vdmVVbmFyeU9wKGUpe3JldHVybiBkZWxldGUgRS51bmFyeV9vcHNbZV0sZS5sZW5ndGg9PT1FLm1heF91bm9wX2xlbiYmKEUubWF4X3Vub3BfbGVuPUUuZ2V0TWF4S2V5TGVuKEUudW5hcnlfb3BzKSksRX1zdGF0aWMgcmVtb3ZlQWxsVW5hcnlPcHMoKXtyZXR1cm4gRS51bmFyeV9vcHM9e30sRS5tYXhfdW5vcF9sZW49MCxFfXN0YXRpYyByZW1vdmVJZGVudGlmaWVyQ2hhcihlKXtyZXR1cm4gRS5hZGRpdGlvbmFsX2lkZW50aWZpZXJfY2hhcnMuZGVsZXRlKGUpLEV9c3RhdGljIHJlbW92ZUJpbmFyeU9wKGUpe3JldHVybiBkZWxldGUgRS5iaW5hcnlfb3BzW2VdLGUubGVuZ3RoPT09RS5tYXhfYmlub3BfbGVuJiYoRS5tYXhfYmlub3BfbGVuPUUuZ2V0TWF4S2V5TGVuKEUuYmluYXJ5X29wcykpLEUucmlnaHRfYXNzb2NpYXRpdmUuZGVsZXRlKGUpLEV9c3RhdGljIHJlbW92ZUFsbEJpbmFyeU9wcygpe3JldHVybiBFLmJpbmFyeV9vcHM9e30sRS5tYXhfYmlub3BfbGVuPTAsRX1zdGF0aWMgcmVtb3ZlTGl0ZXJhbChlKXtyZXR1cm4gZGVsZXRlIEUubGl0ZXJhbHNbZV0sRX1zdGF0aWMgcmVtb3ZlQWxsTGl0ZXJhbHMoKXtyZXR1cm4gRS5saXRlcmFscz17fSxFfWdldCBjaGFyKCl7cmV0dXJuIHRoaXMuZXhwci5jaGFyQXQodGhpcy5pbmRleCl9Z2V0IGNvZGUoKXtyZXR1cm4gdGhpcy5leHByLmNoYXJDb2RlQXQodGhpcy5pbmRleCl9Y29uc3RydWN0b3IoZSl7dGhpcy5leHByPWUsdGhpcy5pbmRleD0wfXN0YXRpYyBwYXJzZShlKXtyZXR1cm4gbmV3IEUoZSkucGFyc2UoKX1zdGF0aWMgZ2V0TWF4S2V5TGVuKGUpe3JldHVybiBNYXRoLm1heCgwLC4uLk9iamVjdC5rZXlzKGUpLm1hcChuPT5uLmxlbmd0aCkpfXN0YXRpYyBpc0RlY2ltYWxEaWdpdChlKXtyZXR1cm4gZT49NDgmJmU8PTU3fXN0YXRpYyBiaW5hcnlQcmVjZWRlbmNlKGUpe3JldHVybiBFLmJpbmFyeV9vcHNbZV18fDB9c3RhdGljIGlzSWRlbnRpZmllclN0YXJ0KGUpe3JldHVybiBlPj02NSYmZTw9OTB8fGU+PTk3JiZlPD0xMjJ8fGU+PTEyOCYmIUUuYmluYXJ5X29wc1tTdHJpbmcuZnJvbUNoYXJDb2RlKGUpXXx8RS5hZGRpdGlvbmFsX2lkZW50aWZpZXJfY2hhcnMuaGFzKFN0cmluZy5mcm9tQ2hhckNvZGUoZSkpfXN0YXRpYyBpc0lkZW50aWZpZXJQYXJ0KGUpe3JldHVybiBFLmlzSWRlbnRpZmllclN0YXJ0KGUpfHxFLmlzRGVjaW1hbERpZ2l0KGUpfXRocm93RXJyb3IoZSl7Y29uc3Qgbj1uZXcgRXJyb3IoZSsiIGF0IGNoYXJhY3RlciAiK3RoaXMuaW5kZXgpO3Rocm93IG4uaW5kZXg9dGhpcy5pbmRleCxuLmRlc2NyaXB0aW9uPWUsbn1ydW5Ib29rKGUsbil7aWYoRS5ob29rc1tlXSl7Y29uc3Qgcj17Y29udGV4dDp0aGlzLG5vZGU6bn07cmV0dXJuIEUuaG9va3MucnVuKGUsciksci5ub2RlfXJldHVybiBufXNlYXJjaEhvb2soZSl7aWYoRS5ob29rc1tlXSl7Y29uc3Qgbj17Y29udGV4dDp0aGlzfTtyZXR1cm4gRS5ob29rc1tlXS5maW5kKGZ1bmN0aW9uKHIpe3JldHVybiByLmNhbGwobi5jb250ZXh0LG4pLG4ubm9kZX0pLG4ubm9kZX19Z29iYmxlU3BhY2VzKCl7bGV0IGU9dGhpcy5jb2RlO2Zvcig7ZT09PUUuU1BBQ0VfQ09ERXx8ZT09PUUuVEFCX0NPREV8fGU9PT1FLkxGX0NPREV8fGU9PT1FLkNSX0NPREU7KWU9dGhpcy5leHByLmNoYXJDb2RlQXQoKyt0aGlzLmluZGV4KTt0aGlzLnJ1bkhvb2soImdvYmJsZS1zcGFjZXMiKX1wYXJzZSgpe3RoaXMucnVuSG9vaygiYmVmb3JlLWFsbCIpO2NvbnN0IGU9dGhpcy5nb2JibGVFeHByZXNzaW9ucygpLG49ZS5sZW5ndGg9PT0xP2VbMF06e3R5cGU6RS5DT01QT1VORCxib2R5OmV9O3JldHVybiB0aGlzLnJ1bkhvb2soImFmdGVyLWFsbCIsbil9Z29iYmxlRXhwcmVzc2lvbnMoZSl7bGV0IG49W10scixpO2Zvcig7dGhpcy5pbmRleDx0aGlzLmV4cHIubGVuZ3RoOylpZihyPXRoaXMuY29kZSxyPT09RS5TRU1DT0xfQ09ERXx8cj09PUUuQ09NTUFfQ09ERSl0aGlzLmluZGV4Kys7ZWxzZSBpZihpPXRoaXMuZ29iYmxlRXhwcmVzc2lvbigpKW4ucHVzaChpKTtlbHNlIGlmKHRoaXMuaW5kZXg8dGhpcy5leHByLmxlbmd0aCl7aWYocj09PWUpYnJlYWs7dGhpcy50aHJvd0Vycm9yKCdVbmV4cGVjdGVkICInK3RoaXMuY2hhcisnIicpfXJldHVybiBufWdvYmJsZUV4cHJlc3Npb24oKXtjb25zdCBlPXRoaXMuc2VhcmNoSG9vaygiZ29iYmxlLWV4cHJlc3Npb24iKXx8dGhpcy5nb2JibGVCaW5hcnlFeHByZXNzaW9uKCk7cmV0dXJuIHRoaXMuZ29iYmxlU3BhY2VzKCksdGhpcy5ydW5Ib29rKCJhZnRlci1leHByZXNzaW9uIixlKX1nb2JibGVCaW5hcnlPcCgpe3RoaXMuZ29iYmxlU3BhY2VzKCk7bGV0IGU9dGhpcy5leHByLnN1YnN0cih0aGlzLmluZGV4LEUubWF4X2Jpbm9wX2xlbiksbj1lLmxlbmd0aDtmb3IoO24+MDspe2lmKEUuYmluYXJ5X29wcy5oYXNPd25Qcm9wZXJ0eShlKSYmKCFFLmlzSWRlbnRpZmllclN0YXJ0KHRoaXMuY29kZSl8fHRoaXMuaW5kZXgrZS5sZW5ndGg8dGhpcy5leHByLmxlbmd0aCYmIUUuaXNJZGVudGlmaWVyUGFydCh0aGlzLmV4cHIuY2hhckNvZGVBdCh0aGlzLmluZGV4K2UubGVuZ3RoKSkpKXJldHVybiB0aGlzLmluZGV4Kz1uLGU7ZT1lLnN1YnN0cigwLC0tbil9cmV0dXJuITF9Z29iYmxlQmluYXJ5RXhwcmVzc2lvbigpe2xldCBlLG4scixpLG8scyx1LGEsbDtpZihzPXRoaXMuZ29iYmxlVG9rZW4oKSwhc3x8KG49dGhpcy5nb2JibGVCaW5hcnlPcCgpLCFuKSlyZXR1cm4gcztmb3Iobz17dmFsdWU6bixwcmVjOkUuYmluYXJ5UHJlY2VkZW5jZShuKSxyaWdodF9hOkUucmlnaHRfYXNzb2NpYXRpdmUuaGFzKG4pfSx1PXRoaXMuZ29iYmxlVG9rZW4oKSx1fHx0aGlzLnRocm93RXJyb3IoIkV4cGVjdGVkIGV4cHJlc3Npb24gYWZ0ZXIgIituKSxpPVtzLG8sdV07bj10aGlzLmdvYmJsZUJpbmFyeU9wKCk7KXtpZihyPUUuYmluYXJ5UHJlY2VkZW5jZShuKSxyPT09MCl7dGhpcy5pbmRleC09bi5sZW5ndGg7YnJlYWt9bz17dmFsdWU6bixwcmVjOnIscmlnaHRfYTpFLnJpZ2h0X2Fzc29jaWF0aXZlLmhhcyhuKX0sbD1uO2NvbnN0IGQ9Xz0+by5yaWdodF9hJiZfLnJpZ2h0X2E/cj5fLnByZWM6cjw9Xy5wcmVjO2Zvcig7aS5sZW5ndGg+MiYmZChpW2kubGVuZ3RoLTJdKTspdT1pLnBvcCgpLG49aS5wb3AoKS52YWx1ZSxzPWkucG9wKCksZT17dHlwZTpFLkJJTkFSWV9FWFAsb3BlcmF0b3I6bixsZWZ0OnMscmlnaHQ6dX0saS5wdXNoKGUpO2U9dGhpcy5nb2JibGVUb2tlbigpLGV8fHRoaXMudGhyb3dFcnJvcigiRXhwZWN0ZWQgZXhwcmVzc2lvbiBhZnRlciAiK2wpLGkucHVzaChvLGUpfWZvcihhPWkubGVuZ3RoLTEsZT1pW2FdO2E+MTspZT17dHlwZTpFLkJJTkFSWV9FWFAsb3BlcmF0b3I6aVthLTFdLnZhbHVlLGxlZnQ6aVthLTJdLHJpZ2h0OmV9LGEtPTI7cmV0dXJuIGV9Z29iYmxlVG9rZW4oKXtsZXQgZSxuLHIsaTtpZih0aGlzLmdvYmJsZVNwYWNlcygpLGk9dGhpcy5zZWFyY2hIb29rKCJnb2JibGUtdG9rZW4iKSxpKXJldHVybiB0aGlzLnJ1bkhvb2soImFmdGVyLXRva2VuIixpKTtpZihlPXRoaXMuY29kZSxFLmlzRGVjaW1hbERpZ2l0KGUpfHxlPT09RS5QRVJJT0RfQ09ERSlyZXR1cm4gdGhpcy5nb2JibGVOdW1lcmljTGl0ZXJhbCgpO2lmKGU9PT1FLlNRVU9URV9DT0RFfHxlPT09RS5EUVVPVEVfQ09ERSlpPXRoaXMuZ29iYmxlU3RyaW5nTGl0ZXJhbCgpO2Vsc2UgaWYoZT09PUUuT0JSQUNLX0NPREUpaT10aGlzLmdvYmJsZUFycmF5KCk7ZWxzZXtmb3Iobj10aGlzLmV4cHIuc3Vic3RyKHRoaXMuaW5kZXgsRS5tYXhfdW5vcF9sZW4pLHI9bi5sZW5ndGg7cj4wOyl7aWYoRS51bmFyeV9vcHMuaGFzT3duUHJvcGVydHkobikmJighRS5pc0lkZW50aWZpZXJTdGFydCh0aGlzLmNvZGUpfHx0aGlzLmluZGV4K24ubGVuZ3RoPHRoaXMuZXhwci5sZW5ndGgmJiFFLmlzSWRlbnRpZmllclBhcnQodGhpcy5leHByLmNoYXJDb2RlQXQodGhpcy5pbmRleCtuLmxlbmd0aCkpKSl7dGhpcy5pbmRleCs9cjtjb25zdCBvPXRoaXMuZ29iYmxlVG9rZW4oKTtyZXR1cm4gb3x8dGhpcy50aHJvd0Vycm9yKCJtaXNzaW5nIHVuYXJ5T3AgYXJndW1lbnQiKSx0aGlzLnJ1bkhvb2soImFmdGVyLXRva2VuIix7dHlwZTpFLlVOQVJZX0VYUCxvcGVyYXRvcjpuLGFyZ3VtZW50Om8scHJlZml4OiEwfSl9bj1uLnN1YnN0cigwLC0tcil9RS5pc0lkZW50aWZpZXJTdGFydChlKT8oaT10aGlzLmdvYmJsZUlkZW50aWZpZXIoKSxFLmxpdGVyYWxzLmhhc093blByb3BlcnR5KGkubmFtZSk/aT17dHlwZTpFLkxJVEVSQUwsdmFsdWU6RS5saXRlcmFsc1tpLm5hbWVdLHJhdzppLm5hbWV9OmkubmFtZT09PUUudGhpc19zdHImJihpPXt0eXBlOkUuVEhJU19FWFB9KSk6ZT09PUUuT1BBUkVOX0NPREUmJihpPXRoaXMuZ29iYmxlR3JvdXAoKSl9cmV0dXJuIGk/KGk9dGhpcy5nb2JibGVUb2tlblByb3BlcnR5KGkpLHRoaXMucnVuSG9vaygiYWZ0ZXItdG9rZW4iLGkpKTp0aGlzLnJ1bkhvb2soImFmdGVyLXRva2VuIiwhMSl9Z29iYmxlVG9rZW5Qcm9wZXJ0eShlKXt0aGlzLmdvYmJsZVNwYWNlcygpO2xldCBuPXRoaXMuY29kZTtmb3IoO249PT1FLlBFUklPRF9DT0RFfHxuPT09RS5PQlJBQ0tfQ09ERXx8bj09PUUuT1BBUkVOX0NPREV8fG49PT1FLlFVTUFSS19DT0RFOyl7bGV0IHI7aWYobj09PUUuUVVNQVJLX0NPREUpe2lmKHRoaXMuZXhwci5jaGFyQ29kZUF0KHRoaXMuaW5kZXgrMSkhPT1FLlBFUklPRF9DT0RFKWJyZWFrO3I9ITAsdGhpcy5pbmRleCs9Mix0aGlzLmdvYmJsZVNwYWNlcygpLG49dGhpcy5jb2RlfXRoaXMuaW5kZXgrKyxuPT09RS5PQlJBQ0tfQ09ERT8oZT17dHlwZTpFLk1FTUJFUl9FWFAsY29tcHV0ZWQ6ITAsb2JqZWN0OmUscHJvcGVydHk6dGhpcy5nb2JibGVFeHByZXNzaW9uKCl9LHRoaXMuZ29iYmxlU3BhY2VzKCksbj10aGlzLmNvZGUsbiE9PUUuQ0JSQUNLX0NPREUmJnRoaXMudGhyb3dFcnJvcigiVW5jbG9zZWQgWyIpLHRoaXMuaW5kZXgrKyk6bj09PUUuT1BBUkVOX0NPREU/ZT17dHlwZTpFLkNBTExfRVhQLGFyZ3VtZW50czp0aGlzLmdvYmJsZUFyZ3VtZW50cyhFLkNQQVJFTl9DT0RFKSxjYWxsZWU6ZX06KG49PT1FLlBFUklPRF9DT0RFfHxyKSYmKHImJnRoaXMuaW5kZXgtLSx0aGlzLmdvYmJsZVNwYWNlcygpLGU9e3R5cGU6RS5NRU1CRVJfRVhQLGNvbXB1dGVkOiExLG9iamVjdDplLHByb3BlcnR5OnRoaXMuZ29iYmxlSWRlbnRpZmllcigpfSksciYmKGUub3B0aW9uYWw9ITApLHRoaXMuZ29iYmxlU3BhY2VzKCksbj10aGlzLmNvZGV9cmV0dXJuIGV9Z29iYmxlTnVtZXJpY0xpdGVyYWwoKXtsZXQgZT0iIixuLHI7Zm9yKDtFLmlzRGVjaW1hbERpZ2l0KHRoaXMuY29kZSk7KWUrPXRoaXMuZXhwci5jaGFyQXQodGhpcy5pbmRleCsrKTtpZih0aGlzLmNvZGU9PT1FLlBFUklPRF9DT0RFKWZvcihlKz10aGlzLmV4cHIuY2hhckF0KHRoaXMuaW5kZXgrKyk7RS5pc0RlY2ltYWxEaWdpdCh0aGlzLmNvZGUpOyllKz10aGlzLmV4cHIuY2hhckF0KHRoaXMuaW5kZXgrKyk7aWYobj10aGlzLmNoYXIsbj09PSJlInx8bj09PSJFIil7Zm9yKGUrPXRoaXMuZXhwci5jaGFyQXQodGhpcy5pbmRleCsrKSxuPXRoaXMuY2hhciwobj09PSIrInx8bj09PSItIikmJihlKz10aGlzLmV4cHIuY2hhckF0KHRoaXMuaW5kZXgrKykpO0UuaXNEZWNpbWFsRGlnaXQodGhpcy5jb2RlKTspZSs9dGhpcy5leHByLmNoYXJBdCh0aGlzLmluZGV4KyspO0UuaXNEZWNpbWFsRGlnaXQodGhpcy5leHByLmNoYXJDb2RlQXQodGhpcy5pbmRleC0xKSl8fHRoaXMudGhyb3dFcnJvcigiRXhwZWN0ZWQgZXhwb25lbnQgKCIrZSt0aGlzLmNoYXIrIikiKX1yZXR1cm4gcj10aGlzLmNvZGUsRS5pc0lkZW50aWZpZXJTdGFydChyKT90aGlzLnRocm93RXJyb3IoIlZhcmlhYmxlIG5hbWVzIGNhbm5vdCBzdGFydCB3aXRoIGEgbnVtYmVyICgiK2UrdGhpcy5jaGFyKyIpIik6KHI9PT1FLlBFUklPRF9DT0RFfHxlLmxlbmd0aD09PTEmJmUuY2hhckNvZGVBdCgwKT09PUUuUEVSSU9EX0NPREUpJiZ0aGlzLnRocm93RXJyb3IoIlVuZXhwZWN0ZWQgcGVyaW9kIikse3R5cGU6RS5MSVRFUkFMLHZhbHVlOnBhcnNlRmxvYXQoZSkscmF3OmV9fWdvYmJsZVN0cmluZ0xpdGVyYWwoKXtsZXQgZT0iIjtjb25zdCBuPXRoaXMuaW5kZXgscj10aGlzLmV4cHIuY2hhckF0KHRoaXMuaW5kZXgrKyk7bGV0IGk9ITE7Zm9yKDt0aGlzLmluZGV4PHRoaXMuZXhwci5sZW5ndGg7KXtsZXQgbz10aGlzLmV4cHIuY2hhckF0KHRoaXMuaW5kZXgrKyk7aWYobz09PXIpe2k9ITA7YnJlYWt9ZWxzZSBpZihvPT09IlxcIilzd2l0Y2gobz10aGlzLmV4cHIuY2hhckF0KHRoaXMuaW5kZXgrKyksbyl7Y2FzZSJuIjplKz1gCmA7YnJlYWs7Y2FzZSJyIjplKz0iXHIiO2JyZWFrO2Nhc2UidCI6ZSs9IgkiO2JyZWFrO2Nhc2UiYiI6ZSs9IlxiIjticmVhaztjYXNlImYiOmUrPSJcZiI7YnJlYWs7Y2FzZSJ2IjplKz0iXHYiO2JyZWFrO2RlZmF1bHQ6ZSs9b31lbHNlIGUrPW99cmV0dXJuIGl8fHRoaXMudGhyb3dFcnJvcignVW5jbG9zZWQgcXVvdGUgYWZ0ZXIgIicrZSsnIicpLHt0eXBlOkUuTElURVJBTCx2YWx1ZTplLHJhdzp0aGlzLmV4cHIuc3Vic3RyaW5nKG4sdGhpcy5pbmRleCl9fWdvYmJsZUlkZW50aWZpZXIoKXtsZXQgZT10aGlzLmNvZGUsbj10aGlzLmluZGV4O2ZvcihFLmlzSWRlbnRpZmllclN0YXJ0KGUpP3RoaXMuaW5kZXgrKzp0aGlzLnRocm93RXJyb3IoIlVuZXhwZWN0ZWQgIit0aGlzLmNoYXIpO3RoaXMuaW5kZXg8dGhpcy5leHByLmxlbmd0aCYmKGU9dGhpcy5jb2RlLEUuaXNJZGVudGlmaWVyUGFydChlKSk7KXRoaXMuaW5kZXgrKztyZXR1cm57dHlwZTpFLklERU5USUZJRVIsbmFtZTp0aGlzLmV4cHIuc2xpY2Uobix0aGlzLmluZGV4KX19Z29iYmxlQXJndW1lbnRzKGUpe2NvbnN0IG49W107bGV0IHI9ITEsaT0wO2Zvcig7dGhpcy5pbmRleDx0aGlzLmV4cHIubGVuZ3RoOyl7dGhpcy5nb2JibGVTcGFjZXMoKTtsZXQgbz10aGlzLmNvZGU7aWYobz09PWUpe3I9ITAsdGhpcy5pbmRleCsrLGU9PT1FLkNQQVJFTl9DT0RFJiZpJiZpPj1uLmxlbmd0aCYmdGhpcy50aHJvd0Vycm9yKCJVbmV4cGVjdGVkIHRva2VuICIrU3RyaW5nLmZyb21DaGFyQ29kZShlKSk7YnJlYWt9ZWxzZSBpZihvPT09RS5DT01NQV9DT0RFKXtpZih0aGlzLmluZGV4KyssaSsrLGkhPT1uLmxlbmd0aCl7aWYoZT09PUUuQ1BBUkVOX0NPREUpdGhpcy50aHJvd0Vycm9yKCJVbmV4cGVjdGVkIHRva2VuICwiKTtlbHNlIGlmKGU9PT1FLkNCUkFDS19DT0RFKWZvcihsZXQgcz1uLmxlbmd0aDtzPGk7cysrKW4ucHVzaChudWxsKX19ZWxzZSBpZihuLmxlbmd0aCE9PWkmJmkhPT0wKXRoaXMudGhyb3dFcnJvcigiRXhwZWN0ZWQgY29tbWEiKTtlbHNle2NvbnN0IHM9dGhpcy5nb2JibGVFeHByZXNzaW9uKCk7KCFzfHxzLnR5cGU9PT1FLkNPTVBPVU5EKSYmdGhpcy50aHJvd0Vycm9yKCJFeHBlY3RlZCBjb21tYSIpLG4ucHVzaChzKX19cmV0dXJuIHJ8fHRoaXMudGhyb3dFcnJvcigiRXhwZWN0ZWQgIitTdHJpbmcuZnJvbUNoYXJDb2RlKGUpKSxufWdvYmJsZUdyb3VwKCl7dGhpcy5pbmRleCsrO2xldCBlPXRoaXMuZ29iYmxlRXhwcmVzc2lvbnMoRS5DUEFSRU5fQ09ERSk7aWYodGhpcy5jb2RlPT09RS5DUEFSRU5fQ09ERSlyZXR1cm4gdGhpcy5pbmRleCsrLGUubGVuZ3RoPT09MT9lWzBdOmUubGVuZ3RoP3t0eXBlOkUuU0VRVUVOQ0VfRVhQLGV4cHJlc3Npb25zOmV9OiExO3RoaXMudGhyb3dFcnJvcigiVW5jbG9zZWQgKCIpfWdvYmJsZUFycmF5KCl7cmV0dXJuIHRoaXMuaW5kZXgrKyx7dHlwZTpFLkFSUkFZX0VYUCxlbGVtZW50czp0aGlzLmdvYmJsZUFyZ3VtZW50cyhFLkNCUkFDS19DT0RFKX19fWNvbnN0IElvPW5ldyBGbztPYmplY3QuYXNzaWduKEUse2hvb2tzOklvLHBsdWdpbnM6bmV3IHdvKEUpLENPTVBPVU5EOiJDb21wb3VuZCIsU0VRVUVOQ0VfRVhQOiJTZXF1ZW5jZUV4cHJlc3Npb24iLElERU5USUZJRVI6IklkZW50aWZpZXIiLE1FTUJFUl9FWFA6Ik1lbWJlckV4cHJlc3Npb24iLExJVEVSQUw6IkxpdGVyYWwiLFRISVNfRVhQOiJUaGlzRXhwcmVzc2lvbiIsQ0FMTF9FWFA6IkNhbGxFeHByZXNzaW9uIixVTkFSWV9FWFA6IlVuYXJ5RXhwcmVzc2lvbiIsQklOQVJZX0VYUDoiQmluYXJ5RXhwcmVzc2lvbiIsQVJSQVlfRVhQOiJBcnJheUV4cHJlc3Npb24iLFRBQl9DT0RFOjksTEZfQ09ERToxMCxDUl9DT0RFOjEzLFNQQUNFX0NPREU6MzIsUEVSSU9EX0NPREU6NDYsQ09NTUFfQ09ERTo0NCxTUVVPVEVfQ09ERTozOSxEUVVPVEVfQ09ERTozNCxPUEFSRU5fQ09ERTo0MCxDUEFSRU5fQ09ERTo0MSxPQlJBQ0tfQ09ERTo5MSxDQlJBQ0tfQ09ERTo5MyxRVU1BUktfQ09ERTo2MyxTRU1DT0xfQ09ERTo1OSxDT0xPTl9DT0RFOjU4LHVuYXJ5X29wczp7Ii0iOjEsIiEiOjEsIn4iOjEsIisiOjF9LGJpbmFyeV9vcHM6eyJ8fCI6MSwiJiYiOjIsInwiOjMsIl4iOjQsIiYiOjUsIj09Ijo2LCIhPSI6NiwiPT09Ijo2LCIhPT0iOjYsIjwiOjcsIj4iOjcsIjw9Ijo3LCI+PSI6NywiPDwiOjgsIj4+Ijo4LCI+Pj4iOjgsIisiOjksIi0iOjksIioiOjEwLCIvIjoxMCwiJSI6MTB9LHJpZ2h0X2Fzc29jaWF0aXZlOm5ldyBTZXQsYWRkaXRpb25hbF9pZGVudGlmaWVyX2NoYXJzOm5ldyBTZXQoWyIkIiwiXyJdKSxsaXRlcmFsczp7dHJ1ZTohMCxmYWxzZTohMSxudWxsOm51bGx9LHRoaXNfc3RyOiJ0aGlzIn0pLEUubWF4X3Vub3BfbGVuPUUuZ2V0TWF4S2V5TGVuKEUudW5hcnlfb3BzKSxFLm1heF9iaW5vcF9sZW49RS5nZXRNYXhLZXlMZW4oRS5iaW5hcnlfb3BzKTtjb25zdCBxdD10PT5uZXcgRSh0KS5wYXJzZSgpO09iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKEUpLmZvckVhY2godD0+e3F0W3RdPT09dm9pZCAwJiZ0IT09InByb3RvdHlwZSImJihxdFt0XT1FW3RdKX0pLHF0LkpzZXA9RTtjb25zdCBObz0iQ29uZGl0aW9uYWxFeHByZXNzaW9uIjt2YXIgTW89e25hbWU6InRlcm5hcnkiLGluaXQodCl7dC5ob29rcy5hZGQoImFmdGVyLWV4cHJlc3Npb24iLGZ1bmN0aW9uKG4pe2lmKG4ubm9kZSYmdGhpcy5jb2RlPT09dC5RVU1BUktfQ09ERSl7dGhpcy5pbmRleCsrO2NvbnN0IHI9bi5ub2RlLGk9dGhpcy5nb2JibGVFeHByZXNzaW9uKCk7aWYoaXx8dGhpcy50aHJvd0Vycm9yKCJFeHBlY3RlZCBleHByZXNzaW9uIiksdGhpcy5nb2JibGVTcGFjZXMoKSx0aGlzLmNvZGU9PT10LkNPTE9OX0NPREUpe3RoaXMuaW5kZXgrKztjb25zdCBvPXRoaXMuZ29iYmxlRXhwcmVzc2lvbigpO2lmKG98fHRoaXMudGhyb3dFcnJvcigiRXhwZWN0ZWQgZXhwcmVzc2lvbiIpLG4ubm9kZT17dHlwZTpObyx0ZXN0OnIsY29uc2VxdWVudDppLGFsdGVybmF0ZTpvfSxyLm9wZXJhdG9yJiZ0LmJpbmFyeV9vcHNbci5vcGVyYXRvcl08PS45KXtsZXQgcz1yO2Zvcig7cy5yaWdodC5vcGVyYXRvciYmdC5iaW5hcnlfb3BzW3MucmlnaHQub3BlcmF0b3JdPD0uOTspcz1zLnJpZ2h0O24ubm9kZS50ZXN0PXMucmlnaHQscy5yaWdodD1uLm5vZGUsbi5ub2RlPXJ9fWVsc2UgdGhpcy50aHJvd0Vycm9yKCJFeHBlY3RlZCA6Iil9fSl9fTtxdC5wbHVnaW5zLnJlZ2lzdGVyKE1vKTtmdW5jdGlvbiBrdCh0KXtpZih0PW0odCxtLkVNUFRZX09CSkVDVCksdGhpcy5fZWxsaXBzb2lkPW0odC5lbGxpcHNvaWQsai5XR1M4NCksdGhpcy5fbnVtYmVyT2ZMZXZlbFplcm9UaWxlc1g9bSh0Lm51bWJlck9mTGV2ZWxaZXJvVGlsZXNYLDEpLHRoaXMuX251bWJlck9mTGV2ZWxaZXJvVGlsZXNZPW0odC5udW1iZXJPZkxldmVsWmVyb1RpbGVzWSwxKSx0aGlzLl9wcm9qZWN0aW9uPW5ldyBBdCh0aGlzLl9lbGxpcHNvaWQpLHAodC5yZWN0YW5nbGVTb3V0aHdlc3RJbk1ldGVycykmJnAodC5yZWN0YW5nbGVOb3J0aGVhc3RJbk1ldGVycykpdGhpcy5fcmVjdGFuZ2xlU291dGh3ZXN0SW5NZXRlcnM9dC5yZWN0YW5nbGVTb3V0aHdlc3RJbk1ldGVycyx0aGlzLl9yZWN0YW5nbGVOb3J0aGVhc3RJbk1ldGVycz10LnJlY3RhbmdsZU5vcnRoZWFzdEluTWV0ZXJzO2Vsc2V7Y29uc3Qgcj10aGlzLl9lbGxpcHNvaWQubWF4aW11bVJhZGl1cypNYXRoLlBJO3RoaXMuX3JlY3RhbmdsZVNvdXRod2VzdEluTWV0ZXJzPW5ldyBBKC1yLC1yKSx0aGlzLl9yZWN0YW5nbGVOb3J0aGVhc3RJbk1ldGVycz1uZXcgQShyLHIpfWNvbnN0IGU9dGhpcy5fcHJvamVjdGlvbi51bnByb2plY3QodGhpcy5fcmVjdGFuZ2xlU291dGh3ZXN0SW5NZXRlcnMpLG49dGhpcy5fcHJvamVjdGlvbi51bnByb2plY3QodGhpcy5fcmVjdGFuZ2xlTm9ydGhlYXN0SW5NZXRlcnMpO3RoaXMuX3JlY3RhbmdsZT1uZXcgSShlLmxvbmdpdHVkZSxlLmxhdGl0dWRlLG4ubG9uZ2l0dWRlLG4ubGF0aXR1ZGUpfU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGt0LnByb3RvdHlwZSx7ZWxsaXBzb2lkOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWxsaXBzb2lkfX0scmVjdGFuZ2xlOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmVjdGFuZ2xlfX0scHJvamVjdGlvbjp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Byb2plY3Rpb259fX0pLGt0LnByb3RvdHlwZS5nZXROdW1iZXJPZlhUaWxlc0F0TGV2ZWw9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX251bWJlck9mTGV2ZWxaZXJvVGlsZXNYPDx0fSxrdC5wcm90b3R5cGUuZ2V0TnVtYmVyT2ZZVGlsZXNBdExldmVsPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9udW1iZXJPZkxldmVsWmVyb1RpbGVzWTw8dH0sa3QucHJvdG90eXBlLnJlY3RhbmdsZVRvTmF0aXZlUmVjdGFuZ2xlPWZ1bmN0aW9uKHQsZSl7Y29uc3Qgbj10aGlzLl9wcm9qZWN0aW9uLHI9bi5wcm9qZWN0KEkuc291dGh3ZXN0KHQpKSxpPW4ucHJvamVjdChJLm5vcnRoZWFzdCh0KSk7cmV0dXJuIHAoZSk/KGUud2VzdD1yLngsZS5zb3V0aD1yLnksZS5lYXN0PWkueCxlLm5vcnRoPWkueSxlKTpuZXcgSShyLngsci55LGkueCxpLnkpfSxrdC5wcm90b3R5cGUudGlsZVhZVG9OYXRpdmVSZWN0YW5nbGU9ZnVuY3Rpb24odCxlLG4scil7Y29uc3QgaT10aGlzLmdldE51bWJlck9mWFRpbGVzQXRMZXZlbChuKSxvPXRoaXMuZ2V0TnVtYmVyT2ZZVGlsZXNBdExldmVsKG4pLHM9KHRoaXMuX3JlY3RhbmdsZU5vcnRoZWFzdEluTWV0ZXJzLngtdGhpcy5fcmVjdGFuZ2xlU291dGh3ZXN0SW5NZXRlcnMueCkvaSx1PXRoaXMuX3JlY3RhbmdsZVNvdXRod2VzdEluTWV0ZXJzLngrdCpzLGE9dGhpcy5fcmVjdGFuZ2xlU291dGh3ZXN0SW5NZXRlcnMueCsodCsxKSpzLGw9KHRoaXMuX3JlY3RhbmdsZU5vcnRoZWFzdEluTWV0ZXJzLnktdGhpcy5fcmVjdGFuZ2xlU291dGh3ZXN0SW5NZXRlcnMueSkvbyxkPXRoaXMuX3JlY3RhbmdsZU5vcnRoZWFzdEluTWV0ZXJzLnktZSpsLF89dGhpcy5fcmVjdGFuZ2xlTm9ydGhlYXN0SW5NZXRlcnMueS0oZSsxKSpsO3JldHVybiBwKHIpPyhyLndlc3Q9dSxyLnNvdXRoPV8sci5lYXN0PWEsci5ub3J0aD1kLHIpOm5ldyBJKHUsXyxhLGQpfSxrdC5wcm90b3R5cGUudGlsZVhZVG9SZWN0YW5nbGU9ZnVuY3Rpb24odCxlLG4scil7Y29uc3QgaT10aGlzLnRpbGVYWVRvTmF0aXZlUmVjdGFuZ2xlKHQsZSxuLHIpLG89dGhpcy5fcHJvamVjdGlvbixzPW8udW5wcm9qZWN0KG5ldyBBKGkud2VzdCxpLnNvdXRoKSksdT1vLnVucHJvamVjdChuZXcgQShpLmVhc3QsaS5ub3J0aCkpO3JldHVybiBpLndlc3Q9cy5sb25naXR1ZGUsaS5zb3V0aD1zLmxhdGl0dWRlLGkuZWFzdD11LmxvbmdpdHVkZSxpLm5vcnRoPXUubGF0aXR1ZGUsaX0sa3QucHJvdG90eXBlLnBvc2l0aW9uVG9UaWxlWFk9ZnVuY3Rpb24odCxlLG4pe2NvbnN0IHI9dGhpcy5fcmVjdGFuZ2xlO2lmKCFJLmNvbnRhaW5zKHIsdCkpcmV0dXJuO2NvbnN0IGk9dGhpcy5nZXROdW1iZXJPZlhUaWxlc0F0TGV2ZWwoZSksbz10aGlzLmdldE51bWJlck9mWVRpbGVzQXRMZXZlbChlKSx1PSh0aGlzLl9yZWN0YW5nbGVOb3J0aGVhc3RJbk1ldGVycy54LXRoaXMuX3JlY3RhbmdsZVNvdXRod2VzdEluTWV0ZXJzLngpL2ksbD0odGhpcy5fcmVjdGFuZ2xlTm9ydGhlYXN0SW5NZXRlcnMueS10aGlzLl9yZWN0YW5nbGVTb3V0aHdlc3RJbk1ldGVycy55KS9vLF89dGhpcy5fcHJvamVjdGlvbi5wcm9qZWN0KHQpLE89Xy54LXRoaXMuX3JlY3RhbmdsZVNvdXRod2VzdEluTWV0ZXJzLngsYj10aGlzLl9yZWN0YW5nbGVOb3J0aGVhc3RJbk1ldGVycy55LV8ueTtsZXQgRj1PL3V8MDtGPj1pJiYoRj1pLTEpO2xldCBTPWIvbHwwO3JldHVybiBTPj1vJiYoUz1vLTEpLHAobik/KG4ueD1GLG4ueT1TLG4pOm5ldyBBKEYsUyl9O2Z1bmN0aW9uIGduKCl7dGhpcy5uYW1lPXZvaWQgMCx0aGlzLmRlc2NyaXB0aW9uPXZvaWQgMCx0aGlzLnBvc2l0aW9uPXZvaWQgMCx0aGlzLmRhdGE9dm9pZCAwLHRoaXMuaW1hZ2VyeUxheWVyPXZvaWQgMH1nbi5wcm90b3R5cGUuY29uZmlndXJlTmFtZUZyb21Qcm9wZXJ0aWVzPWZ1bmN0aW9uKHQpe2xldCBlPTEwLG47Zm9yKGNvbnN0IHIgaW4gdClpZih0Lmhhc093blByb3BlcnR5KHIpJiZ0W3JdKXtjb25zdCBpPXIudG9Mb3dlckNhc2UoKTtlPjEmJmk9PT0ibmFtZSI/KGU9MSxuPXIpOmU+MiYmaT09PSJ0aXRsZSI/KGU9MixuPXIpOmU+MyYmL25hbWUvaS50ZXN0KHIpPyhlPTMsbj1yKTplPjQmJi90aXRsZS9pLnRlc3QocikmJihlPTQsbj1yKX1wKG4pJiYodGhpcy5uYW1lPXRbbl0pfSxnbi5wcm90b3R5cGUuY29uZmlndXJlRGVzY3JpcHRpb25Gcm9tUHJvcGVydGllcz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKG4pe2xldCByPSc8dGFibGUgY2xhc3M9ImNlc2l1bS1pbmZvQm94LWRlZmF1bHRUYWJsZSI+Jztmb3IoY29uc3QgaSBpbiBuKWlmKG4uaGFzT3duUHJvcGVydHkoaSkpe2NvbnN0IG89bltpXTtwKG8pJiYodHlwZW9mIG89PSJvYmplY3QiP3IrPWA8dHI+PHRkPiR7aX08L3RkPjx0ZD4ke2Uobyl9PC90ZD48L3RyPmA6cis9YDx0cj48dGQ+JHtpfTwvdGQ+PHRkPiR7b308L3RkPjwvdHI+YCl9cmV0dXJuIHIrPSI8L3RhYmxlPiIscn10aGlzLmRlc2NyaXB0aW9uPWUodCl9O3ZhciBTcj1BZTtmdW5jdGlvbiBBZSh0LGUpe3RoaXMueD10LHRoaXMueT1lfUFlLnByb3RvdHlwZT17Y2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEFlKHRoaXMueCx0aGlzLnkpfSxhZGQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fYWRkKHQpfSxzdWI6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fc3ViKHQpfSxtdWx0QnlQb2ludDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9tdWx0QnlQb2ludCh0KX0sZGl2QnlQb2ludDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9kaXZCeVBvaW50KHQpfSxtdWx0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsb25lKCkuX211bHQodCl9LGRpdjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9kaXYodCl9LHJvdGF0ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9yb3RhdGUodCl9LHJvdGF0ZUFyb3VuZDpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmNsb25lKCkuX3JvdGF0ZUFyb3VuZCh0LGUpfSxtYXRNdWx0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsb25lKCkuX21hdE11bHQodCl9LHVuaXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbG9uZSgpLl91bml0KCl9LHBlcnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9wZXJwKCl9LHJvdW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fcm91bmQoKX0sbWFnOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkpfSxlcXVhbHM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueD09PXQueCYmdGhpcy55PT09dC55fSxkaXN0OmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0U3FyKHQpKX0sZGlzdFNxcjpmdW5jdGlvbih0KXt2YXIgZT10LngtdGhpcy54LG49dC55LXRoaXMueTtyZXR1cm4gZSplK24qbn0sYW5nbGU6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5hdGFuMih0aGlzLnksdGhpcy54KX0sYW5nbGVUbzpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5hdGFuMih0aGlzLnktdC55LHRoaXMueC10LngpfSxhbmdsZVdpdGg6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuYW5nbGVXaXRoU2VwKHQueCx0LnkpfSxhbmdsZVdpdGhTZXA6ZnVuY3Rpb24odCxlKXtyZXR1cm4gTWF0aC5hdGFuMih0aGlzLngqZS10aGlzLnkqdCx0aGlzLngqdCt0aGlzLnkqZSl9LF9tYXRNdWx0OmZ1bmN0aW9uKHQpe3ZhciBlPXRbMF0qdGhpcy54K3RbMV0qdGhpcy55LG49dFsyXSp0aGlzLngrdFszXSp0aGlzLnk7cmV0dXJuIHRoaXMueD1lLHRoaXMueT1uLHRoaXN9LF9hZGQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueCs9dC54LHRoaXMueSs9dC55LHRoaXN9LF9zdWI6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueC09dC54LHRoaXMueS09dC55LHRoaXN9LF9tdWx0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLngqPXQsdGhpcy55Kj10LHRoaXN9LF9kaXY6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueC89dCx0aGlzLnkvPXQsdGhpc30sX211bHRCeVBvaW50OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLngqPXQueCx0aGlzLnkqPXQueSx0aGlzfSxfZGl2QnlQb2ludDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy54Lz10LngsdGhpcy55Lz10LnksdGhpc30sX3VuaXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGl2KHRoaXMubWFnKCkpLHRoaXN9LF9wZXJwOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy55O3JldHVybiB0aGlzLnk9dGhpcy54LHRoaXMueD0tdCx0aGlzfSxfcm90YXRlOmZ1bmN0aW9uKHQpe3ZhciBlPU1hdGguY29zKHQpLG49TWF0aC5zaW4odCkscj1lKnRoaXMueC1uKnRoaXMueSxpPW4qdGhpcy54K2UqdGhpcy55O3JldHVybiB0aGlzLng9cix0aGlzLnk9aSx0aGlzfSxfcm90YXRlQXJvdW5kOmZ1bmN0aW9uKHQsZSl7dmFyIG49TWF0aC5jb3ModCkscj1NYXRoLnNpbih0KSxpPWUueCtuKih0aGlzLngtZS54KS1yKih0aGlzLnktZS55KSxvPWUueStyKih0aGlzLngtZS54KStuKih0aGlzLnktZS55KTtyZXR1cm4gdGhpcy54PWksdGhpcy55PW8sdGhpc30sX3JvdW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJvdW5kKHRoaXMueCksdGhpcy55PU1hdGgucm91bmQodGhpcy55KSx0aGlzfX0sQWUuY29udmVydD1mdW5jdGlvbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIEFlP3Q6QXJyYXkuaXNBcnJheSh0KT9uZXcgQWUodFswXSx0WzFdKTp0fTt2YXIgQ289U3IsbXI9VGU7ZnVuY3Rpb24gVGUodCxlLG4scixpKXt0aGlzLnByb3BlcnRpZXM9e30sdGhpcy5leHRlbnQ9bix0aGlzLnR5cGU9MCx0aGlzLl9wYmY9dCx0aGlzLl9nZW9tZXRyeT0tMSx0aGlzLl9rZXlzPXIsdGhpcy5fdmFsdWVzPWksdC5yZWFkRmllbGRzKHZvLHRoaXMsZSl9ZnVuY3Rpb24gdm8odCxlLG4pe3Q9PTE/ZS5pZD1uLnJlYWRWYXJpbnQoKTp0PT0yP0RvKG4sZSk6dD09Mz9lLnR5cGU9bi5yZWFkVmFyaW50KCk6dD09NCYmKGUuX2dlb21ldHJ5PW4ucG9zKX1mdW5jdGlvbiBEbyh0LGUpe2Zvcih2YXIgbj10LnJlYWRWYXJpbnQoKSt0LnBvczt0LnBvczxuOyl7dmFyIHI9ZS5fa2V5c1t0LnJlYWRWYXJpbnQoKV0saT1lLl92YWx1ZXNbdC5yZWFkVmFyaW50KCldO2UucHJvcGVydGllc1tyXT1pfX1UZS50eXBlcz1bIlVua25vd24iLCJQb2ludCIsIkxpbmVTdHJpbmciLCJQb2x5Z29uIl0sVGUucHJvdG90eXBlLmxvYWRHZW9tZXRyeT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX3BiZjt0LnBvcz10aGlzLl9nZW9tZXRyeTtmb3IodmFyIGU9dC5yZWFkVmFyaW50KCkrdC5wb3Msbj0xLHI9MCxpPTAsbz0wLHM9W10sdTt0LnBvczxlOyl7aWYocjw9MCl7dmFyIGE9dC5yZWFkVmFyaW50KCk7bj1hJjcscj1hPj4zfWlmKHItLSxuPT09MXx8bj09PTIpaSs9dC5yZWFkU1ZhcmludCgpLG8rPXQucmVhZFNWYXJpbnQoKSxuPT09MSYmKHUmJnMucHVzaCh1KSx1PVtdKSx1LnB1c2gobmV3IENvKGksbykpO2Vsc2UgaWYobj09PTcpdSYmdS5wdXNoKHVbMF0uY2xvbmUoKSk7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoInVua25vd24gY29tbWFuZCAiK24pfXJldHVybiB1JiZzLnB1c2godSksc30sVGUucHJvdG90eXBlLmJib3g9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9wYmY7dC5wb3M9dGhpcy5fZ2VvbWV0cnk7Zm9yKHZhciBlPXQucmVhZFZhcmludCgpK3QucG9zLG49MSxyPTAsaT0wLG89MCxzPTEvMCx1PS0xLzAsYT0xLzAsbD0tMS8wO3QucG9zPGU7KXtpZihyPD0wKXt2YXIgZD10LnJlYWRWYXJpbnQoKTtuPWQmNyxyPWQ+PjN9aWYoci0tLG49PT0xfHxuPT09MilpKz10LnJlYWRTVmFyaW50KCksbys9dC5yZWFkU1ZhcmludCgpLGk8cyYmKHM9aSksaT51JiYodT1pKSxvPGEmJihhPW8pLG8+bCYmKGw9byk7ZWxzZSBpZihuIT09Nyl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gY29tbWFuZCAiK24pfXJldHVybltzLGEsdSxsXX0sVGUucHJvdG90eXBlLnRvR2VvSlNPTj1mdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpcy5leHRlbnQqTWF0aC5wb3coMixuKSxpPXRoaXMuZXh0ZW50KnQsbz10aGlzLmV4dGVudCplLHM9dGhpcy5sb2FkR2VvbWV0cnkoKSx1PVRlLnR5cGVzW3RoaXMudHlwZV0sYSxsO2Z1bmN0aW9uIGQoYil7Zm9yKHZhciBGPTA7RjxiLmxlbmd0aDtGKyspe3ZhciBTPWJbRl0sTj0xODAtKFMueStvKSozNjAvcjtiW0ZdPVsoUy54K2kpKjM2MC9yLTE4MCwzNjAvTWF0aC5QSSpNYXRoLmF0YW4oTWF0aC5leHAoTipNYXRoLlBJLzE4MCkpLTkwXX19c3dpdGNoKHRoaXMudHlwZSl7Y2FzZSAxOnZhciBfPVtdO2ZvcihhPTA7YTxzLmxlbmd0aDthKyspX1thXT1zW2FdWzBdO3M9XyxkKHMpO2JyZWFrO2Nhc2UgMjpmb3IoYT0wO2E8cy5sZW5ndGg7YSsrKWQoc1thXSk7YnJlYWs7Y2FzZSAzOmZvcihzPUxvKHMpLGE9MDthPHMubGVuZ3RoO2ErKylmb3IobD0wO2w8c1thXS5sZW5ndGg7bCsrKWQoc1thXVtsXSk7YnJlYWt9cy5sZW5ndGg9PT0xP3M9c1swXTp1PSJNdWx0aSIrdTt2YXIgTz17dHlwZToiRmVhdHVyZSIsZ2VvbWV0cnk6e3R5cGU6dSxjb29yZGluYXRlczpzfSxwcm9wZXJ0aWVzOnRoaXMucHJvcGVydGllc307cmV0dXJuImlkImluIHRoaXMmJihPLmlkPXRoaXMuaWQpLE99O2Z1bmN0aW9uIExvKHQpe3ZhciBlPXQubGVuZ3RoO2lmKGU8PTEpcmV0dXJuW3RdO2Zvcih2YXIgbj1bXSxyLGksbz0wO288ZTtvKyspe3ZhciBzPVBvKHRbb10pO3MhPT0wJiYoaT09PXZvaWQgMCYmKGk9czwwKSxpPT09czwwPyhyJiZuLnB1c2gocikscj1bdFtvXV0pOnIucHVzaCh0W29dKSl9cmV0dXJuIHImJm4ucHVzaChyKSxufWZ1bmN0aW9uIFBvKHQpe2Zvcih2YXIgZT0wLG49MCxyPXQubGVuZ3RoLGk9ci0xLG8scztuPHI7aT1uKyspbz10W25dLHM9dFtpXSxlKz0ocy54LW8ueCkqKG8ueStzLnkpO3JldHVybiBlfXZhciBCbz1tcixVbz1GcjtmdW5jdGlvbiBGcih0LGUpe3RoaXMudmVyc2lvbj0xLHRoaXMubmFtZT1udWxsLHRoaXMuZXh0ZW50PTQwOTYsdGhpcy5sZW5ndGg9MCx0aGlzLl9wYmY9dCx0aGlzLl9rZXlzPVtdLHRoaXMuX3ZhbHVlcz1bXSx0aGlzLl9mZWF0dXJlcz1bXSx0LnJlYWRGaWVsZHMoam8sdGhpcyxlKSx0aGlzLmxlbmd0aD10aGlzLl9mZWF0dXJlcy5sZW5ndGh9ZnVuY3Rpb24gam8odCxlLG4pe3Q9PT0xNT9lLnZlcnNpb249bi5yZWFkVmFyaW50KCk6dD09PTE/ZS5uYW1lPW4ucmVhZFN0cmluZygpOnQ9PT01P2UuZXh0ZW50PW4ucmVhZFZhcmludCgpOnQ9PT0yP2UuX2ZlYXR1cmVzLnB1c2gobi5wb3MpOnQ9PT0zP2UuX2tleXMucHVzaChuLnJlYWRTdHJpbmcoKSk6dD09PTQmJmUuX3ZhbHVlcy5wdXNoKEdvKG4pKX1mdW5jdGlvbiBHbyh0KXtmb3IodmFyIGU9bnVsbCxuPXQucmVhZFZhcmludCgpK3QucG9zO3QucG9zPG47KXt2YXIgcj10LnJlYWRWYXJpbnQoKT4+MztlPXI9PT0xP3QucmVhZFN0cmluZygpOnI9PT0yP3QucmVhZEZsb2F0KCk6cj09PTM/dC5yZWFkRG91YmxlKCk6cj09PTQ/dC5yZWFkVmFyaW50NjQoKTpyPT09NT90LnJlYWRWYXJpbnQoKTpyPT09Nj90LnJlYWRTVmFyaW50KCk6cj09PTc/dC5yZWFkQm9vbGVhbigpOm51bGx9cmV0dXJuIGV9RnIucHJvdG90eXBlLmZlYXR1cmU9ZnVuY3Rpb24odCl7aWYodDwwfHx0Pj10aGlzLl9mZWF0dXJlcy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJmZWF0dXJlIGluZGV4IG91dCBvZiBib3VuZHMiKTt0aGlzLl9wYmYucG9zPXRoaXMuX2ZlYXR1cmVzW3RdO3ZhciBlPXRoaXMuX3BiZi5yZWFkVmFyaW50KCkrdGhpcy5fcGJmLnBvcztyZXR1cm4gbmV3IEJvKHRoaXMuX3BiZixlLHRoaXMuZXh0ZW50LHRoaXMuX2tleXMsdGhpcy5fdmFsdWVzKX07dmFyICRvPVVvLFZvPXpvO2Z1bmN0aW9uIHpvKHQsZSl7dGhpcy5sYXllcnM9dC5yZWFkRmllbGRzKFdvLHt9LGUpfWZ1bmN0aW9uIFdvKHQsZSxuKXtpZih0PT09Myl7dmFyIHI9bmV3ICRvKG4sbi5yZWFkVmFyaW50KCkrbi5wb3MpO3IubGVuZ3RoJiYoZVtyLm5hbWVdPXIpfX12YXIgWG89Vm8scmU9bXIsU249e307LyohIGllZWU3NTQuIEJTRC0zLUNsYXVzZSBMaWNlbnNlLiBGZXJvc3MgQWJvdWtoYWRpamVoIDxodHRwczovL2Zlcm9zcy5vcmcvb3BlbnNvdXJjZT4gKi9Tbi5yZWFkPWZ1bmN0aW9uKHQsZSxuLHIsaSl7dmFyIG8scyx1PWkqOC1yLTEsYT0oMTw8dSktMSxsPWE+PjEsZD0tNyxfPW4/aS0xOjAsTz1uPy0xOjEsYj10W2UrX107Zm9yKF8rPU8sbz1iJigxPDwtZCktMSxiPj49LWQsZCs9dTtkPjA7bz1vKjI1Nit0W2UrX10sXys9TyxkLT04KTtmb3Iocz1vJigxPDwtZCktMSxvPj49LWQsZCs9cjtkPjA7cz1zKjI1Nit0W2UrX10sXys9TyxkLT04KTtpZihvPT09MClvPTEtbDtlbHNle2lmKG89PT1hKXJldHVybiBzP05hTjooYj8tMToxKSooMS8wKTtzPXMrTWF0aC5wb3coMixyKSxvPW8tbH1yZXR1cm4oYj8tMToxKSpzKk1hdGgucG93KDIsby1yKX0sU24ud3JpdGU9ZnVuY3Rpb24odCxlLG4scixpLG8pe3ZhciBzLHUsYSxsPW8qOC1pLTEsZD0oMTw8bCktMSxfPWQ+PjEsTz1pPT09MjM/TWF0aC5wb3coMiwtMjQpLU1hdGgucG93KDIsLTc3KTowLGI9cj8wOm8tMSxGPXI/MTotMSxTPWU8MHx8ZT09PTAmJjEvZTwwPzE6MDtmb3IoZT1NYXRoLmFicyhlKSxpc05hTihlKXx8ZT09PTEvMD8odT1pc05hTihlKT8xOjAscz1kKToocz1NYXRoLmZsb29yKE1hdGgubG9nKGUpL01hdGguTE4yKSxlKihhPU1hdGgucG93KDIsLXMpKTwxJiYocy0tLGEqPTIpLHMrXz49MT9lKz1PL2E6ZSs9TypNYXRoLnBvdygyLDEtXyksZSphPj0yJiYocysrLGEvPTIpLHMrXz49ZD8odT0wLHM9ZCk6cytfPj0xPyh1PShlKmEtMSkqTWF0aC5wb3coMixpKSxzPXMrXyk6KHU9ZSpNYXRoLnBvdygyLF8tMSkqTWF0aC5wb3coMixpKSxzPTApKTtpPj04O3RbbitiXT11JjI1NSxiKz1GLHUvPTI1NixpLT04KTtmb3Iocz1zPDxpfHUsbCs9aTtsPjA7dFtuK2JdPXMmMjU1LGIrPUYscy89MjU2LGwtPTgpO3RbbitiLUZdfD1TKjEyOH07dmFyIEhvPXosdG49U247ZnVuY3Rpb24geih0KXt0aGlzLmJ1Zj1BcnJheUJ1ZmZlci5pc1ZpZXcmJkFycmF5QnVmZmVyLmlzVmlldyh0KT90Om5ldyBVaW50OEFycmF5KHR8fDApLHRoaXMucG9zPTAsdGhpcy50eXBlPTAsdGhpcy5sZW5ndGg9dGhpcy5idWYubGVuZ3RofXouVmFyaW50PTAsei5GaXhlZDY0PTEsei5CeXRlcz0yLHouRml4ZWQzMj01O3ZhciBtbj0oMTw8MTYpKigxPDwxNiksd3I9MS9tbixxbz0xMixJcj10eXBlb2YgVGV4dERlY29kZXI+InUiP251bGw6bmV3IFRleHREZWNvZGVyKCJ1dGY4Iik7ei5wcm90b3R5cGU9e2Rlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmJ1Zj1udWxsfSxyZWFkRmllbGRzOmZ1bmN0aW9uKHQsZSxuKXtmb3Iobj1ufHx0aGlzLmxlbmd0aDt0aGlzLnBvczxuOyl7dmFyIHI9dGhpcy5yZWFkVmFyaW50KCksaT1yPj4zLG89dGhpcy5wb3M7dGhpcy50eXBlPXImNyx0KGksZSx0aGlzKSx0aGlzLnBvcz09PW8mJnRoaXMuc2tpcChyKX1yZXR1cm4gZX0scmVhZE1lc3NhZ2U6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5yZWFkRmllbGRzKHQsZSx0aGlzLnJlYWRWYXJpbnQoKSt0aGlzLnBvcyl9LHJlYWRGaXhlZDMyOmZ1bmN0aW9uKCl7dmFyIHQ9ZW4odGhpcy5idWYsdGhpcy5wb3MpO3JldHVybiB0aGlzLnBvcys9NCx0fSxyZWFkU0ZpeGVkMzI6ZnVuY3Rpb24oKXt2YXIgdD1Ncih0aGlzLmJ1Zix0aGlzLnBvcyk7cmV0dXJuIHRoaXMucG9zKz00LHR9LHJlYWRGaXhlZDY0OmZ1bmN0aW9uKCl7dmFyIHQ9ZW4odGhpcy5idWYsdGhpcy5wb3MpK2VuKHRoaXMuYnVmLHRoaXMucG9zKzQpKm1uO3JldHVybiB0aGlzLnBvcys9OCx0fSxyZWFkU0ZpeGVkNjQ6ZnVuY3Rpb24oKXt2YXIgdD1lbih0aGlzLmJ1Zix0aGlzLnBvcykrTXIodGhpcy5idWYsdGhpcy5wb3MrNCkqbW47cmV0dXJuIHRoaXMucG9zKz04LHR9LHJlYWRGbG9hdDpmdW5jdGlvbigpe3ZhciB0PXRuLnJlYWQodGhpcy5idWYsdGhpcy5wb3MsITAsMjMsNCk7cmV0dXJuIHRoaXMucG9zKz00LHR9LHJlYWREb3VibGU6ZnVuY3Rpb24oKXt2YXIgdD10bi5yZWFkKHRoaXMuYnVmLHRoaXMucG9zLCEwLDUyLDgpO3JldHVybiB0aGlzLnBvcys9OCx0fSxyZWFkVmFyaW50OmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuYnVmLG4scjtyZXR1cm4gcj1lW3RoaXMucG9zKytdLG49ciYxMjcscjwxMjh8fChyPWVbdGhpcy5wb3MrK10sbnw9KHImMTI3KTw8NyxyPDEyOCl8fChyPWVbdGhpcy5wb3MrK10sbnw9KHImMTI3KTw8MTQscjwxMjgpfHwocj1lW3RoaXMucG9zKytdLG58PShyJjEyNyk8PDIxLHI8MTI4KT9uOihyPWVbdGhpcy5wb3NdLG58PShyJjE1KTw8Mjgsa28obix0LHRoaXMpKX0scmVhZFZhcmludDY0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVhZFZhcmludCghMCl9LHJlYWRTVmFyaW50OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5yZWFkVmFyaW50KCk7cmV0dXJuIHQlMj09PTE/KHQrMSkvLTI6dC8yfSxyZWFkQm9vbGVhbjpmdW5jdGlvbigpe3JldHVybiBCb29sZWFuKHRoaXMucmVhZFZhcmludCgpKX0scmVhZFN0cmluZzpmdW5jdGlvbigpe3ZhciB0PXRoaXMucmVhZFZhcmludCgpK3RoaXMucG9zLGU9dGhpcy5wb3M7cmV0dXJuIHRoaXMucG9zPXQsdC1lPj1xbyYmSXI/dXModGhpcy5idWYsZSx0KTphcyh0aGlzLmJ1ZixlLHQpfSxyZWFkQnl0ZXM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnJlYWRWYXJpbnQoKSt0aGlzLnBvcyxlPXRoaXMuYnVmLnN1YmFycmF5KHRoaXMucG9zLHQpO3JldHVybiB0aGlzLnBvcz10LGV9LHJlYWRQYWNrZWRWYXJpbnQ6ZnVuY3Rpb24odCxlKXtpZih0aGlzLnR5cGUhPT16LkJ5dGVzKXJldHVybiB0LnB1c2godGhpcy5yZWFkVmFyaW50KGUpKTt2YXIgbj1XdCh0aGlzKTtmb3IodD10fHxbXTt0aGlzLnBvczxuOyl0LnB1c2godGhpcy5yZWFkVmFyaW50KGUpKTtyZXR1cm4gdH0scmVhZFBhY2tlZFNWYXJpbnQ6ZnVuY3Rpb24odCl7aWYodGhpcy50eXBlIT09ei5CeXRlcylyZXR1cm4gdC5wdXNoKHRoaXMucmVhZFNWYXJpbnQoKSk7dmFyIGU9V3QodGhpcyk7Zm9yKHQ9dHx8W107dGhpcy5wb3M8ZTspdC5wdXNoKHRoaXMucmVhZFNWYXJpbnQoKSk7cmV0dXJuIHR9LHJlYWRQYWNrZWRCb29sZWFuOmZ1bmN0aW9uKHQpe2lmKHRoaXMudHlwZSE9PXouQnl0ZXMpcmV0dXJuIHQucHVzaCh0aGlzLnJlYWRCb29sZWFuKCkpO3ZhciBlPVd0KHRoaXMpO2Zvcih0PXR8fFtdO3RoaXMucG9zPGU7KXQucHVzaCh0aGlzLnJlYWRCb29sZWFuKCkpO3JldHVybiB0fSxyZWFkUGFja2VkRmxvYXQ6ZnVuY3Rpb24odCl7aWYodGhpcy50eXBlIT09ei5CeXRlcylyZXR1cm4gdC5wdXNoKHRoaXMucmVhZEZsb2F0KCkpO3ZhciBlPVd0KHRoaXMpO2Zvcih0PXR8fFtdO3RoaXMucG9zPGU7KXQucHVzaCh0aGlzLnJlYWRGbG9hdCgpKTtyZXR1cm4gdH0scmVhZFBhY2tlZERvdWJsZTpmdW5jdGlvbih0KXtpZih0aGlzLnR5cGUhPT16LkJ5dGVzKXJldHVybiB0LnB1c2godGhpcy5yZWFkRG91YmxlKCkpO3ZhciBlPVd0KHRoaXMpO2Zvcih0PXR8fFtdO3RoaXMucG9zPGU7KXQucHVzaCh0aGlzLnJlYWREb3VibGUoKSk7cmV0dXJuIHR9LHJlYWRQYWNrZWRGaXhlZDMyOmZ1bmN0aW9uKHQpe2lmKHRoaXMudHlwZSE9PXouQnl0ZXMpcmV0dXJuIHQucHVzaCh0aGlzLnJlYWRGaXhlZDMyKCkpO3ZhciBlPVd0KHRoaXMpO2Zvcih0PXR8fFtdO3RoaXMucG9zPGU7KXQucHVzaCh0aGlzLnJlYWRGaXhlZDMyKCkpO3JldHVybiB0fSxyZWFkUGFja2VkU0ZpeGVkMzI6ZnVuY3Rpb24odCl7aWYodGhpcy50eXBlIT09ei5CeXRlcylyZXR1cm4gdC5wdXNoKHRoaXMucmVhZFNGaXhlZDMyKCkpO3ZhciBlPVd0KHRoaXMpO2Zvcih0PXR8fFtdO3RoaXMucG9zPGU7KXQucHVzaCh0aGlzLnJlYWRTRml4ZWQzMigpKTtyZXR1cm4gdH0scmVhZFBhY2tlZEZpeGVkNjQ6ZnVuY3Rpb24odCl7aWYodGhpcy50eXBlIT09ei5CeXRlcylyZXR1cm4gdC5wdXNoKHRoaXMucmVhZEZpeGVkNjQoKSk7dmFyIGU9V3QodGhpcyk7Zm9yKHQ9dHx8W107dGhpcy5wb3M8ZTspdC5wdXNoKHRoaXMucmVhZEZpeGVkNjQoKSk7cmV0dXJuIHR9LHJlYWRQYWNrZWRTRml4ZWQ2NDpmdW5jdGlvbih0KXtpZih0aGlzLnR5cGUhPT16LkJ5dGVzKXJldHVybiB0LnB1c2godGhpcy5yZWFkU0ZpeGVkNjQoKSk7dmFyIGU9V3QodGhpcyk7Zm9yKHQ9dHx8W107dGhpcy5wb3M8ZTspdC5wdXNoKHRoaXMucmVhZFNGaXhlZDY0KCkpO3JldHVybiB0fSxza2lwOmZ1bmN0aW9uKHQpe3ZhciBlPXQmNztpZihlPT09ei5WYXJpbnQpZm9yKDt0aGlzLmJ1Zlt0aGlzLnBvcysrXT4xMjc7KTtlbHNlIGlmKGU9PT16LkJ5dGVzKXRoaXMucG9zPXRoaXMucmVhZFZhcmludCgpK3RoaXMucG9zO2Vsc2UgaWYoZT09PXouRml4ZWQzMil0aGlzLnBvcys9NDtlbHNlIGlmKGU9PT16LkZpeGVkNjQpdGhpcy5wb3MrPTg7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIlVuaW1wbGVtZW50ZWQgdHlwZTogIitlKX0sd3JpdGVUYWc6ZnVuY3Rpb24odCxlKXt0aGlzLndyaXRlVmFyaW50KHQ8PDN8ZSl9LHJlYWxsb2M6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMubGVuZ3RofHwxNjtlPHRoaXMucG9zK3Q7KWUqPTI7aWYoZSE9PXRoaXMubGVuZ3RoKXt2YXIgbj1uZXcgVWludDhBcnJheShlKTtuLnNldCh0aGlzLmJ1ZiksdGhpcy5idWY9bix0aGlzLmxlbmd0aD1lfX0sZmluaXNoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGVuZ3RoPXRoaXMucG9zLHRoaXMucG9zPTAsdGhpcy5idWYuc3ViYXJyYXkoMCx0aGlzLmxlbmd0aCl9LHdyaXRlRml4ZWQzMjpmdW5jdGlvbih0KXt0aGlzLnJlYWxsb2MoNCkseGUodGhpcy5idWYsdCx0aGlzLnBvcyksdGhpcy5wb3MrPTR9LHdyaXRlU0ZpeGVkMzI6ZnVuY3Rpb24odCl7dGhpcy5yZWFsbG9jKDQpLHhlKHRoaXMuYnVmLHQsdGhpcy5wb3MpLHRoaXMucG9zKz00fSx3cml0ZUZpeGVkNjQ6ZnVuY3Rpb24odCl7dGhpcy5yZWFsbG9jKDgpLHhlKHRoaXMuYnVmLHQmLTEsdGhpcy5wb3MpLHhlKHRoaXMuYnVmLE1hdGguZmxvb3IodCp3ciksdGhpcy5wb3MrNCksdGhpcy5wb3MrPTh9LHdyaXRlU0ZpeGVkNjQ6ZnVuY3Rpb24odCl7dGhpcy5yZWFsbG9jKDgpLHhlKHRoaXMuYnVmLHQmLTEsdGhpcy5wb3MpLHhlKHRoaXMuYnVmLE1hdGguZmxvb3IodCp3ciksdGhpcy5wb3MrNCksdGhpcy5wb3MrPTh9LHdyaXRlVmFyaW50OmZ1bmN0aW9uKHQpe2lmKHQ9K3R8fDAsdD4yNjg0MzU0NTV8fHQ8MCl7WW8odCx0aGlzKTtyZXR1cm59dGhpcy5yZWFsbG9jKDQpLHRoaXMuYnVmW3RoaXMucG9zKytdPXQmMTI3fCh0PjEyNz8xMjg6MCksISh0PD0xMjcpJiYodGhpcy5idWZbdGhpcy5wb3MrK109KHQ+Pj49NykmMTI3fCh0PjEyNz8xMjg6MCksISh0PD0xMjcpJiYodGhpcy5idWZbdGhpcy5wb3MrK109KHQ+Pj49NykmMTI3fCh0PjEyNz8xMjg6MCksISh0PD0xMjcpJiYodGhpcy5idWZbdGhpcy5wb3MrK109dD4+PjcmMTI3KSkpfSx3cml0ZVNWYXJpbnQ6ZnVuY3Rpb24odCl7dGhpcy53cml0ZVZhcmludCh0PDA/LXQqMi0xOnQqMil9LHdyaXRlQm9vbGVhbjpmdW5jdGlvbih0KXt0aGlzLndyaXRlVmFyaW50KEJvb2xlYW4odCkpfSx3cml0ZVN0cmluZzpmdW5jdGlvbih0KXt0PVN0cmluZyh0KSx0aGlzLnJlYWxsb2ModC5sZW5ndGgqNCksdGhpcy5wb3MrKzt2YXIgZT10aGlzLnBvczt0aGlzLnBvcz1jcyh0aGlzLmJ1Zix0LHRoaXMucG9zKTt2YXIgbj10aGlzLnBvcy1lO24+PTEyOCYmTnIoZSxuLHRoaXMpLHRoaXMucG9zPWUtMSx0aGlzLndyaXRlVmFyaW50KG4pLHRoaXMucG9zKz1ufSx3cml0ZUZsb2F0OmZ1bmN0aW9uKHQpe3RoaXMucmVhbGxvYyg0KSx0bi53cml0ZSh0aGlzLmJ1Zix0LHRoaXMucG9zLCEwLDIzLDQpLHRoaXMucG9zKz00fSx3cml0ZURvdWJsZTpmdW5jdGlvbih0KXt0aGlzLnJlYWxsb2MoOCksdG4ud3JpdGUodGhpcy5idWYsdCx0aGlzLnBvcywhMCw1Miw4KSx0aGlzLnBvcys9OH0sd3JpdGVCeXRlczpmdW5jdGlvbih0KXt2YXIgZT10Lmxlbmd0aDt0aGlzLndyaXRlVmFyaW50KGUpLHRoaXMucmVhbGxvYyhlKTtmb3IodmFyIG49MDtuPGU7bisrKXRoaXMuYnVmW3RoaXMucG9zKytdPXRbbl19LHdyaXRlUmF3TWVzc2FnZTpmdW5jdGlvbih0LGUpe3RoaXMucG9zKys7dmFyIG49dGhpcy5wb3M7dChlLHRoaXMpO3ZhciByPXRoaXMucG9zLW47cj49MTI4JiZOcihuLHIsdGhpcyksdGhpcy5wb3M9bi0xLHRoaXMud3JpdGVWYXJpbnQociksdGhpcy5wb3MrPXJ9LHdyaXRlTWVzc2FnZTpmdW5jdGlvbih0LGUsbil7dGhpcy53cml0ZVRhZyh0LHouQnl0ZXMpLHRoaXMud3JpdGVSYXdNZXNzYWdlKGUsbil9LHdyaXRlUGFja2VkVmFyaW50OmZ1bmN0aW9uKHQsZSl7ZS5sZW5ndGgmJnRoaXMud3JpdGVNZXNzYWdlKHQsUW8sZSl9LHdyaXRlUGFja2VkU1ZhcmludDpmdW5jdGlvbih0LGUpe2UubGVuZ3RoJiZ0aGlzLndyaXRlTWVzc2FnZSh0LEpvLGUpfSx3cml0ZVBhY2tlZEJvb2xlYW46ZnVuY3Rpb24odCxlKXtlLmxlbmd0aCYmdGhpcy53cml0ZU1lc3NhZ2UodCxucyxlKX0sd3JpdGVQYWNrZWRGbG9hdDpmdW5jdGlvbih0LGUpe2UubGVuZ3RoJiZ0aGlzLndyaXRlTWVzc2FnZSh0LHRzLGUpfSx3cml0ZVBhY2tlZERvdWJsZTpmdW5jdGlvbih0LGUpe2UubGVuZ3RoJiZ0aGlzLndyaXRlTWVzc2FnZSh0LGVzLGUpfSx3cml0ZVBhY2tlZEZpeGVkMzI6ZnVuY3Rpb24odCxlKXtlLmxlbmd0aCYmdGhpcy53cml0ZU1lc3NhZ2UodCxycyxlKX0sd3JpdGVQYWNrZWRTRml4ZWQzMjpmdW5jdGlvbih0LGUpe2UubGVuZ3RoJiZ0aGlzLndyaXRlTWVzc2FnZSh0LGlzLGUpfSx3cml0ZVBhY2tlZEZpeGVkNjQ6ZnVuY3Rpb24odCxlKXtlLmxlbmd0aCYmdGhpcy53cml0ZU1lc3NhZ2UodCxvcyxlKX0sd3JpdGVQYWNrZWRTRml4ZWQ2NDpmdW5jdGlvbih0LGUpe2UubGVuZ3RoJiZ0aGlzLndyaXRlTWVzc2FnZSh0LHNzLGUpfSx3cml0ZUJ5dGVzRmllbGQ6ZnVuY3Rpb24odCxlKXt0aGlzLndyaXRlVGFnKHQsei5CeXRlcyksdGhpcy53cml0ZUJ5dGVzKGUpfSx3cml0ZUZpeGVkMzJGaWVsZDpmdW5jdGlvbih0LGUpe3RoaXMud3JpdGVUYWcodCx6LkZpeGVkMzIpLHRoaXMud3JpdGVGaXhlZDMyKGUpfSx3cml0ZVNGaXhlZDMyRmllbGQ6ZnVuY3Rpb24odCxlKXt0aGlzLndyaXRlVGFnKHQsei5GaXhlZDMyKSx0aGlzLndyaXRlU0ZpeGVkMzIoZSl9LHdyaXRlRml4ZWQ2NEZpZWxkOmZ1bmN0aW9uKHQsZSl7dGhpcy53cml0ZVRhZyh0LHouRml4ZWQ2NCksdGhpcy53cml0ZUZpeGVkNjQoZSl9LHdyaXRlU0ZpeGVkNjRGaWVsZDpmdW5jdGlvbih0LGUpe3RoaXMud3JpdGVUYWcodCx6LkZpeGVkNjQpLHRoaXMud3JpdGVTRml4ZWQ2NChlKX0sd3JpdGVWYXJpbnRGaWVsZDpmdW5jdGlvbih0LGUpe3RoaXMud3JpdGVUYWcodCx6LlZhcmludCksdGhpcy53cml0ZVZhcmludChlKX0sd3JpdGVTVmFyaW50RmllbGQ6ZnVuY3Rpb24odCxlKXt0aGlzLndyaXRlVGFnKHQsei5WYXJpbnQpLHRoaXMud3JpdGVTVmFyaW50KGUpfSx3cml0ZVN0cmluZ0ZpZWxkOmZ1bmN0aW9uKHQsZSl7dGhpcy53cml0ZVRhZyh0LHouQnl0ZXMpLHRoaXMud3JpdGVTdHJpbmcoZSl9LHdyaXRlRmxvYXRGaWVsZDpmdW5jdGlvbih0LGUpe3RoaXMud3JpdGVUYWcodCx6LkZpeGVkMzIpLHRoaXMud3JpdGVGbG9hdChlKX0sd3JpdGVEb3VibGVGaWVsZDpmdW5jdGlvbih0LGUpe3RoaXMud3JpdGVUYWcodCx6LkZpeGVkNjQpLHRoaXMud3JpdGVEb3VibGUoZSl9LHdyaXRlQm9vbGVhbkZpZWxkOmZ1bmN0aW9uKHQsZSl7dGhpcy53cml0ZVZhcmludEZpZWxkKHQsQm9vbGVhbihlKSl9fTtmdW5jdGlvbiBrbyh0LGUsbil7dmFyIHI9bi5idWYsaSxvO2lmKG89cltuLnBvcysrXSxpPShvJjExMik+PjQsbzwxMjh8fChvPXJbbi5wb3MrK10saXw9KG8mMTI3KTw8MyxvPDEyOCl8fChvPXJbbi5wb3MrK10saXw9KG8mMTI3KTw8MTAsbzwxMjgpfHwobz1yW24ucG9zKytdLGl8PShvJjEyNyk8PDE3LG88MTI4KXx8KG89cltuLnBvcysrXSxpfD0obyYxMjcpPDwyNCxvPDEyOCl8fChvPXJbbi5wb3MrK10saXw9KG8mMSk8PDMxLG88MTI4KSlyZXR1cm4gUmUodCxpLGUpO3Rocm93IG5ldyBFcnJvcigiRXhwZWN0ZWQgdmFyaW50IG5vdCBtb3JlIHRoYW4gMTAgYnl0ZXMiKX1mdW5jdGlvbiBXdCh0KXtyZXR1cm4gdC50eXBlPT09ei5CeXRlcz90LnJlYWRWYXJpbnQoKSt0LnBvczp0LnBvcysxfWZ1bmN0aW9uIFJlKHQsZSxuKXtyZXR1cm4gbj9lKjQyOTQ5NjcyOTYrKHQ+Pj4wKTooZT4+PjApKjQyOTQ5NjcyOTYrKHQ+Pj4wKX1mdW5jdGlvbiBZbyh0LGUpe3ZhciBuLHI7aWYodD49MD8obj10JTQyOTQ5NjcyOTZ8MCxyPXQvNDI5NDk2NzI5NnwwKToobj1+KC10JTQyOTQ5NjcyOTYpLHI9figtdC80Mjk0OTY3Mjk2KSxuXjQyOTQ5NjcyOTU/bj1uKzF8MDoobj0wLHI9cisxfDApKSx0Pj0xODQ0Njc0NDA3MzcwOTU1MmUzfHx0PC0xODQ0Njc0NDA3MzcwOTU1MmUzKXRocm93IG5ldyBFcnJvcigiR2l2ZW4gdmFyaW50IGRvZXNuJ3QgZml0IGludG8gMTAgYnl0ZXMiKTtlLnJlYWxsb2MoMTApLEtvKG4scixlKSxabyhyLGUpfWZ1bmN0aW9uIEtvKHQsZSxuKXtuLmJ1ZltuLnBvcysrXT10JjEyN3wxMjgsdD4+Pj03LG4uYnVmW24ucG9zKytdPXQmMTI3fDEyOCx0Pj4+PTcsbi5idWZbbi5wb3MrK109dCYxMjd8MTI4LHQ+Pj49NyxuLmJ1ZltuLnBvcysrXT10JjEyN3wxMjgsdD4+Pj03LG4uYnVmW24ucG9zXT10JjEyN31mdW5jdGlvbiBabyh0LGUpe3ZhciBuPSh0JjcpPDw0O2UuYnVmW2UucG9zKytdfD1ufCgodD4+Pj0zKT8xMjg6MCksdCYmKGUuYnVmW2UucG9zKytdPXQmMTI3fCgodD4+Pj03KT8xMjg6MCksdCYmKGUuYnVmW2UucG9zKytdPXQmMTI3fCgodD4+Pj03KT8xMjg6MCksdCYmKGUuYnVmW2UucG9zKytdPXQmMTI3fCgodD4+Pj03KT8xMjg6MCksdCYmKGUuYnVmW2UucG9zKytdPXQmMTI3fCgodD4+Pj03KT8xMjg6MCksdCYmKGUuYnVmW2UucG9zKytdPXQmMTI3KSkpKSl9ZnVuY3Rpb24gTnIodCxlLG4pe3ZhciByPWU8PTE2MzgzPzE6ZTw9MjA5NzE1MT8yOmU8PTI2ODQzNTQ1NT8zOk1hdGguZmxvb3IoTWF0aC5sb2coZSkvKE1hdGguTE4yKjcpKTtuLnJlYWxsb2Mocik7Zm9yKHZhciBpPW4ucG9zLTE7aT49dDtpLS0pbi5idWZbaStyXT1uLmJ1ZltpXX1mdW5jdGlvbiBRbyh0LGUpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKWUud3JpdGVWYXJpbnQodFtuXSl9ZnVuY3Rpb24gSm8odCxlKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyllLndyaXRlU1ZhcmludCh0W25dKX1mdW5jdGlvbiB0cyh0LGUpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKWUud3JpdGVGbG9hdCh0W25dKX1mdW5jdGlvbiBlcyh0LGUpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKWUud3JpdGVEb3VibGUodFtuXSl9ZnVuY3Rpb24gbnModCxlKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyllLndyaXRlQm9vbGVhbih0W25dKX1mdW5jdGlvbiBycyh0LGUpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKWUud3JpdGVGaXhlZDMyKHRbbl0pfWZ1bmN0aW9uIGlzKHQsZSl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspZS53cml0ZVNGaXhlZDMyKHRbbl0pfWZ1bmN0aW9uIG9zKHQsZSl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspZS53cml0ZUZpeGVkNjQodFtuXSl9ZnVuY3Rpb24gc3ModCxlKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyllLndyaXRlU0ZpeGVkNjQodFtuXSl9ZnVuY3Rpb24gZW4odCxlKXtyZXR1cm4odFtlXXx0W2UrMV08PDh8dFtlKzJdPDwxNikrdFtlKzNdKjE2Nzc3MjE2fWZ1bmN0aW9uIHhlKHQsZSxuKXt0W25dPWUsdFtuKzFdPWU+Pj44LHRbbisyXT1lPj4+MTYsdFtuKzNdPWU+Pj4yNH1mdW5jdGlvbiBNcih0LGUpe3JldHVybih0W2VdfHRbZSsxXTw8OHx0W2UrMl08PDE2KSsodFtlKzNdPDwyNCl9ZnVuY3Rpb24gYXModCxlLG4pe2Zvcih2YXIgcj0iIixpPWU7aTxuOyl7dmFyIG89dFtpXSxzPW51bGwsdT1vPjIzOT80Om8+MjIzPzM6bz4xOTE/MjoxO2lmKGkrdT5uKWJyZWFrO3ZhciBhLGwsZDt1PT09MT9vPDEyOCYmKHM9byk6dT09PTI/KGE9dFtpKzFdLChhJjE5Mik9PT0xMjgmJihzPShvJjMxKTw8NnxhJjYzLHM8PTEyNyYmKHM9bnVsbCkpKTp1PT09Mz8oYT10W2krMV0sbD10W2krMl0sKGEmMTkyKT09PTEyOCYmKGwmMTkyKT09PTEyOCYmKHM9KG8mMTUpPDwxMnwoYSY2Myk8PDZ8bCY2Mywoczw9MjA0N3x8cz49NTUyOTYmJnM8PTU3MzQzKSYmKHM9bnVsbCkpKTp1PT09NCYmKGE9dFtpKzFdLGw9dFtpKzJdLGQ9dFtpKzNdLChhJjE5Mik9PT0xMjgmJihsJjE5Mik9PT0xMjgmJihkJjE5Mik9PT0xMjgmJihzPShvJjE1KTw8MTh8KGEmNjMpPDwxMnwobCY2Myk8PDZ8ZCY2Mywoczw9NjU1MzV8fHM+PTExMTQxMTIpJiYocz1udWxsKSkpLHM9PT1udWxsPyhzPTY1NTMzLHU9MSk6cz42NTUzNSYmKHMtPTY1NTM2LHIrPVN0cmluZy5mcm9tQ2hhckNvZGUocz4+PjEwJjEwMjN8NTUyOTYpLHM9NTYzMjB8cyYxMDIzKSxyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHMpLGkrPXV9cmV0dXJuIHJ9ZnVuY3Rpb24gdXModCxlLG4pe3JldHVybiBJci5kZWNvZGUodC5zdWJhcnJheShlLG4pKX1mdW5jdGlvbiBjcyh0LGUsbil7Zm9yKHZhciByPTAsaSxvO3I8ZS5sZW5ndGg7cisrKXtpZihpPWUuY2hhckNvZGVBdChyKSxpPjU1Mjk1JiZpPDU3MzQ0KWlmKG8paWYoaTw1NjMyMCl7dFtuKytdPTIzOSx0W24rK109MTkxLHRbbisrXT0xODksbz1pO2NvbnRpbnVlfWVsc2UgaT1vLTU1Mjk2PDwxMHxpLTU2MzIwfDY1NTM2LG89bnVsbDtlbHNle2k+NTYzMTl8fHIrMT09PWUubGVuZ3RoPyh0W24rK109MjM5LHRbbisrXT0xOTEsdFtuKytdPTE4OSk6bz1pO2NvbnRpbnVlfWVsc2UgbyYmKHRbbisrXT0yMzksdFtuKytdPTE5MSx0W24rK109MTg5LG89bnVsbCk7aTwxMjg/dFtuKytdPWk6KGk8MjA0OD90W24rK109aT4+NnwxOTI6KGk8NjU1MzY/dFtuKytdPWk+PjEyfDIyNDoodFtuKytdPWk+PjE4fDI0MCx0W24rK109aT4+MTImNjN8MTI4KSx0W24rK109aT4+NiY2M3wxMjgpLHRbbisrXT1pJjYzfDEyOCl9cmV0dXJuIG59dmFyIGhzPXR5cGVvZiBnbG9iYWw9PSJvYmplY3QiJiZnbG9iYWwmJmdsb2JhbC5PYmplY3Q9PT1PYmplY3QmJmdsb2JhbCxDcj1ocyxmcz10eXBlb2Ygc2VsZj09Im9iamVjdCImJnNlbGYmJnNlbGYuT2JqZWN0PT09T2JqZWN0JiZzZWxmLGxzPUNyfHxmc3x8RnVuY3Rpb24oInJldHVybiB0aGlzIikoKSxVdD1scyxkcz1VdC5TeW1ib2wsanQ9ZHMsdnI9T2JqZWN0LnByb3RvdHlwZSxFcz12ci5oYXNPd25Qcm9wZXJ0eSxfcz12ci50b1N0cmluZyx2ZT1qdD9qdC50b1N0cmluZ1RhZzp2b2lkIDA7ZnVuY3Rpb24gcHModCl7dmFyIGU9RXMuY2FsbCh0LHZlKSxuPXRbdmVdO3RyeXt0W3ZlXT12b2lkIDA7dmFyIHI9ITB9Y2F0Y2h7fXZhciBpPV9zLmNhbGwodCk7cmV0dXJuIHImJihlP3RbdmVdPW46ZGVsZXRlIHRbdmVdKSxpfXZhciB5cz1PYmplY3QucHJvdG90eXBlLEFzPXlzLnRvU3RyaW5nO2Z1bmN0aW9uIFRzKHQpe3JldHVybiBBcy5jYWxsKHQpfXZhciBScz0iW29iamVjdCBOdWxsXSIseHM9IltvYmplY3QgVW5kZWZpbmVkXSIsRHI9anQ/anQudG9TdHJpbmdUYWc6dm9pZCAwO2Z1bmN0aW9uIE9lKHQpe3JldHVybiB0PT1udWxsP3Q9PT12b2lkIDA/eHM6UnM6RHImJkRyIGluIE9iamVjdCh0KT9wcyh0KTpUcyh0KX1mdW5jdGlvbiBiZSh0KXtyZXR1cm4gdCE9bnVsbCYmdHlwZW9mIHQ9PSJvYmplY3QifXZhciBPcz0iW29iamVjdCBTeW1ib2xdIjtmdW5jdGlvbiBGbih0KXtyZXR1cm4gdHlwZW9mIHQ9PSJzeW1ib2wifHxiZSh0KSYmT2UodCk9PU9zfWZ1bmN0aW9uIGJzKHQsZSl7Zm9yKHZhciBuPS0xLHI9dD09bnVsbD8wOnQubGVuZ3RoLGk9QXJyYXkocik7KytuPHI7KWlbbl09ZSh0W25dLG4sdCk7cmV0dXJuIGl9dmFyIGdzPUFycmF5LmlzQXJyYXksWXQ9Z3MsU3M9MS8wLExyPWp0P2p0LnByb3RvdHlwZTp2b2lkIDAsUHI9THI/THIudG9TdHJpbmc6dm9pZCAwO2Z1bmN0aW9uIEJyKHQpe2lmKHR5cGVvZiB0PT0ic3RyaW5nIilyZXR1cm4gdDtpZihZdCh0KSlyZXR1cm4gYnModCxCcikrIiI7aWYoRm4odCkpcmV0dXJuIFByP1ByLmNhbGwodCk6IiI7dmFyIGU9dCsiIjtyZXR1cm4gZT09IjAiJiYxL3Q9PS1Tcz8iLTAiOmV9ZnVuY3Rpb24gaWUodCl7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuIHQhPW51bGwmJihlPT0ib2JqZWN0Inx8ZT09ImZ1bmN0aW9uIil9ZnVuY3Rpb24gbXModCl7cmV0dXJuIHR9dmFyIEZzPSJbb2JqZWN0IEFzeW5jRnVuY3Rpb25dIix3cz0iW29iamVjdCBGdW5jdGlvbl0iLElzPSJbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSIsTnM9IltvYmplY3QgUHJveHldIjtmdW5jdGlvbiBVcih0KXtpZighaWUodCkpcmV0dXJuITE7dmFyIGU9T2UodCk7cmV0dXJuIGU9PXdzfHxlPT1Jc3x8ZT09RnN8fGU9PU5zfXZhciBNcz1VdFsiX19jb3JlLWpzX3NoYXJlZF9fIl0sd249TXMsanI9ZnVuY3Rpb24oKXt2YXIgdD0vW14uXSskLy5leGVjKHduJiZ3bi5rZXlzJiZ3bi5rZXlzLklFX1BST1RPfHwiIik7cmV0dXJuIHQ/IlN5bWJvbChzcmMpXzEuIit0OiIifSgpO2Z1bmN0aW9uIENzKHQpe3JldHVybiEhanImJmpyIGluIHR9dmFyIHZzPUZ1bmN0aW9uLnByb3RvdHlwZSxEcz12cy50b1N0cmluZztmdW5jdGlvbiBvZSh0KXtpZih0IT1udWxsKXt0cnl7cmV0dXJuIERzLmNhbGwodCl9Y2F0Y2h7fXRyeXtyZXR1cm4gdCsiIn1jYXRjaHt9fXJldHVybiIifXZhciBMcz0vW1xcXiQuKis/KClbXF17fXxdL2csUHM9L15cW29iamVjdCAuKz9Db25zdHJ1Y3RvclxdJC8sQnM9RnVuY3Rpb24ucHJvdG90eXBlLFVzPU9iamVjdC5wcm90b3R5cGUsanM9QnMudG9TdHJpbmcsR3M9VXMuaGFzT3duUHJvcGVydHksJHM9UmVnRXhwKCJeIitqcy5jYWxsKEdzKS5yZXBsYWNlKExzLCJcXCQmIikucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXCgpfCBmb3IgLis/KD89XFxcXSkvZywiJDEuKj8iKSsiJCIpO2Z1bmN0aW9uIFZzKHQpe2lmKCFpZSh0KXx8Q3ModCkpcmV0dXJuITE7dmFyIGU9VXIodCk/JHM6UHM7cmV0dXJuIGUudGVzdChvZSh0KSl9ZnVuY3Rpb24genModCxlKXtyZXR1cm4gdD09bnVsbD92b2lkIDA6dFtlXX1mdW5jdGlvbiBzZSh0LGUpe3ZhciBuPXpzKHQsZSk7cmV0dXJuIFZzKG4pP246dm9pZCAwfXZhciBXcz1zZShVdCwiV2Vha01hcCIpLEluPVdzLEdyPU9iamVjdC5jcmVhdGUsWHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiBmdW5jdGlvbihlKXtpZighaWUoZSkpcmV0dXJue307aWYoR3IpcmV0dXJuIEdyKGUpO3QucHJvdG90eXBlPWU7dmFyIG49bmV3IHQ7cmV0dXJuIHQucHJvdG90eXBlPXZvaWQgMCxufX0oKSxIcz1YcztmdW5jdGlvbiBxcyh0LGUsbil7c3dpdGNoKG4ubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIHQuY2FsbChlKTtjYXNlIDE6cmV0dXJuIHQuY2FsbChlLG5bMF0pO2Nhc2UgMjpyZXR1cm4gdC5jYWxsKGUsblswXSxuWzFdKTtjYXNlIDM6cmV0dXJuIHQuY2FsbChlLG5bMF0sblsxXSxuWzJdKX1yZXR1cm4gdC5hcHBseShlLG4pfWZ1bmN0aW9uIGtzKHQsZSl7dmFyIG49LTEscj10Lmxlbmd0aDtmb3IoZXx8KGU9QXJyYXkocikpOysrbjxyOyllW25dPXRbbl07cmV0dXJuIGV9dmFyIFlzPTgwMCxLcz0xNixacz1EYXRlLm5vdztmdW5jdGlvbiBRcyh0KXt2YXIgZT0wLG49MDtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcj1acygpLGk9S3MtKHItbik7aWYobj1yLGk+MCl7aWYoKytlPj1ZcylyZXR1cm4gYXJndW1lbnRzWzBdfWVsc2UgZT0wO3JldHVybiB0LmFwcGx5KHZvaWQgMCxhcmd1bWVudHMpfX1mdW5jdGlvbiBKcyh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19dmFyIHRhPWZ1bmN0aW9uKCl7dHJ5e3ZhciB0PXNlKE9iamVjdCwiZGVmaW5lUHJvcGVydHkiKTtyZXR1cm4gdCh7fSwiIix7fSksdH1jYXRjaHt9fSgpLG5uPXRhLGVhPW5uP2Z1bmN0aW9uKHQsZSl7cmV0dXJuIG5uKHQsInRvU3RyaW5nIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITEsdmFsdWU6SnMoZSksd3JpdGFibGU6ITB9KX06bXMsbmE9ZWEscmE9UXMobmEpLGlhPXJhO2Z1bmN0aW9uIG9hKHQsZSl7Zm9yKHZhciBuPS0xLHI9dD09bnVsbD8wOnQubGVuZ3RoOysrbjxyJiZlKHRbbl0sbix0KSE9PSExOyk7cmV0dXJuIHR9dmFyIHNhPTkwMDcxOTkyNTQ3NDA5OTEsYWE9L14oPzowfFsxLTldXGQqKSQvO2Z1bmN0aW9uIE5uKHQsZSl7dmFyIG49dHlwZW9mIHQ7cmV0dXJuIGU9ZT8/c2EsISFlJiYobj09Im51bWJlciJ8fG4hPSJzeW1ib2wiJiZhYS50ZXN0KHQpKSYmdD4tMSYmdCUxPT0wJiZ0PGV9ZnVuY3Rpb24gJHIodCxlLG4pe2U9PSJfX3Byb3RvX18iJiZubj9ubih0LGUse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOm4sd3JpdGFibGU6ITB9KTp0W2VdPW59ZnVuY3Rpb24gVnIodCxlKXtyZXR1cm4gdD09PWV8fHQhPT10JiZlIT09ZX12YXIgdWE9T2JqZWN0LnByb3RvdHlwZSxjYT11YS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBNbih0LGUsbil7dmFyIHI9dFtlXTsoIShjYS5jYWxsKHQsZSkmJlZyKHIsbikpfHxuPT09dm9pZCAwJiYhKGUgaW4gdCkpJiYkcih0LGUsbil9ZnVuY3Rpb24gcm4odCxlLG4scil7dmFyIGk9IW47bnx8KG49e30pO2Zvcih2YXIgbz0tMSxzPWUubGVuZ3RoOysrbzxzOyl7dmFyIHU9ZVtvXSxhPXI/cihuW3VdLHRbdV0sdSxuLHQpOnZvaWQgMDthPT09dm9pZCAwJiYoYT10W3VdKSxpPyRyKG4sdSxhKTpNbihuLHUsYSl9cmV0dXJuIG59dmFyIHpyPU1hdGgubWF4O2Z1bmN0aW9uIGhhKHQsZSxuKXtyZXR1cm4gZT16cihlPT09dm9pZCAwP3QubGVuZ3RoLTE6ZSwwKSxmdW5jdGlvbigpe2Zvcih2YXIgcj1hcmd1bWVudHMsaT0tMSxvPXpyKHIubGVuZ3RoLWUsMCkscz1BcnJheShvKTsrK2k8bzspc1tpXT1yW2UraV07aT0tMTtmb3IodmFyIHU9QXJyYXkoZSsxKTsrK2k8ZTspdVtpXT1yW2ldO3JldHVybiB1W2VdPW4ocykscXModCx0aGlzLHUpfX12YXIgZmE9OTAwNzE5OTI1NDc0MDk5MTtmdW5jdGlvbiBDbih0KXtyZXR1cm4gdHlwZW9mIHQ9PSJudW1iZXIiJiZ0Pi0xJiZ0JTE9PTAmJnQ8PWZhfWZ1bmN0aW9uIFdyKHQpe3JldHVybiB0IT1udWxsJiZDbih0Lmxlbmd0aCkmJiFVcih0KX12YXIgbGE9T2JqZWN0LnByb3RvdHlwZTtmdW5jdGlvbiB2bih0KXt2YXIgZT10JiZ0LmNvbnN0cnVjdG9yLG49dHlwZW9mIGU9PSJmdW5jdGlvbiImJmUucHJvdG90eXBlfHxsYTtyZXR1cm4gdD09PW59ZnVuY3Rpb24gZGEodCxlKXtmb3IodmFyIG49LTEscj1BcnJheSh0KTsrK248dDspcltuXT1lKG4pO3JldHVybiByfXZhciBFYT0iW29iamVjdCBBcmd1bWVudHNdIjtmdW5jdGlvbiBYcih0KXtyZXR1cm4gYmUodCkmJk9lKHQpPT1FYX12YXIgSHI9T2JqZWN0LnByb3RvdHlwZSxfYT1Ici5oYXNPd25Qcm9wZXJ0eSxwYT1Ici5wcm9wZXJ0eUlzRW51bWVyYWJsZSx5YT1YcihmdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHN9KCkpP1hyOmZ1bmN0aW9uKHQpe3JldHVybiBiZSh0KSYmX2EuY2FsbCh0LCJjYWxsZWUiKSYmIXBhLmNhbGwodCwiY2FsbGVlIil9LERuPXlhO2Z1bmN0aW9uIEFhKCl7cmV0dXJuITF9dmFyIHFyPXR5cGVvZiBleHBvcnRzPT0ib2JqZWN0IiYmZXhwb3J0cyYmIWV4cG9ydHMubm9kZVR5cGUmJmV4cG9ydHMsa3I9cXImJnR5cGVvZiBtb2R1bGU9PSJvYmplY3QiJiZtb2R1bGUmJiFtb2R1bGUubm9kZVR5cGUmJm1vZHVsZSxUYT1rciYma3IuZXhwb3J0cz09PXFyLFlyPVRhP1V0LkJ1ZmZlcjp2b2lkIDAsUmE9WXI/WXIuaXNCdWZmZXI6dm9pZCAwLHhhPVJhfHxBYSxLcj14YSxPYT0iW29iamVjdCBBcmd1bWVudHNdIixiYT0iW29iamVjdCBBcnJheV0iLGdhPSJbb2JqZWN0IEJvb2xlYW5dIixTYT0iW29iamVjdCBEYXRlXSIsbWE9IltvYmplY3QgRXJyb3JdIixGYT0iW29iamVjdCBGdW5jdGlvbl0iLHdhPSJbb2JqZWN0IE1hcF0iLElhPSJbb2JqZWN0IE51bWJlcl0iLE5hPSJbb2JqZWN0IE9iamVjdF0iLE1hPSJbb2JqZWN0IFJlZ0V4cF0iLENhPSJbb2JqZWN0IFNldF0iLHZhPSJbb2JqZWN0IFN0cmluZ10iLERhPSJbb2JqZWN0IFdlYWtNYXBdIixMYT0iW29iamVjdCBBcnJheUJ1ZmZlcl0iLFBhPSJbb2JqZWN0IERhdGFWaWV3XSIsQmE9IltvYmplY3QgRmxvYXQzMkFycmF5XSIsVWE9IltvYmplY3QgRmxvYXQ2NEFycmF5XSIsamE9IltvYmplY3QgSW50OEFycmF5XSIsR2E9IltvYmplY3QgSW50MTZBcnJheV0iLCRhPSJbb2JqZWN0IEludDMyQXJyYXldIixWYT0iW29iamVjdCBVaW50OEFycmF5XSIsemE9IltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIixXYT0iW29iamVjdCBVaW50MTZBcnJheV0iLFhhPSJbb2JqZWN0IFVpbnQzMkFycmF5XSIsUT17fTtRW0JhXT1RW1VhXT1RW2phXT1RW0dhXT1RWyRhXT1RW1ZhXT1RW3phXT1RW1dhXT1RW1hhXT0hMCxRW09hXT1RW2JhXT1RW0xhXT1RW2dhXT1RW1BhXT1RW1NhXT1RW21hXT1RW0ZhXT1RW3dhXT1RW0lhXT1RW05hXT1RW01hXT1RW0NhXT1RW3ZhXT1RW0RhXT0hMTtmdW5jdGlvbiBIYSh0KXtyZXR1cm4gYmUodCkmJkNuKHQubGVuZ3RoKSYmISFRW09lKHQpXX1mdW5jdGlvbiBMbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSl9fXZhciBacj10eXBlb2YgZXhwb3J0cz09Im9iamVjdCImJmV4cG9ydHMmJiFleHBvcnRzLm5vZGVUeXBlJiZleHBvcnRzLERlPVpyJiZ0eXBlb2YgbW9kdWxlPT0ib2JqZWN0IiYmbW9kdWxlJiYhbW9kdWxlLm5vZGVUeXBlJiZtb2R1bGUscWE9RGUmJkRlLmV4cG9ydHM9PT1acixQbj1xYSYmQ3IucHJvY2VzcyxrYT1mdW5jdGlvbigpe3RyeXt2YXIgdD1EZSYmRGUucmVxdWlyZSYmRGUucmVxdWlyZSgidXRpbCIpLnR5cGVzO3JldHVybiB0fHxQbiYmUG4uYmluZGluZyYmUG4uYmluZGluZygidXRpbCIpfWNhdGNoe319KCksZ2U9a2EsUXI9Z2UmJmdlLmlzVHlwZWRBcnJheSxZYT1Rcj9MbihRcik6SGEsS2E9WWEsWmE9T2JqZWN0LnByb3RvdHlwZSxRYT1aYS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBKcih0LGUpe3ZhciBuPVl0KHQpLHI9IW4mJkRuKHQpLGk9IW4mJiFyJiZLcih0KSxvPSFuJiYhciYmIWkmJkthKHQpLHM9bnx8cnx8aXx8byx1PXM/ZGEodC5sZW5ndGgsU3RyaW5nKTpbXSxhPXUubGVuZ3RoO2Zvcih2YXIgbCBpbiB0KShlfHxRYS5jYWxsKHQsbCkpJiYhKHMmJihsPT0ibGVuZ3RoInx8aSYmKGw9PSJvZmZzZXQifHxsPT0icGFyZW50Iil8fG8mJihsPT0iYnVmZmVyInx8bD09ImJ5dGVMZW5ndGgifHxsPT0iYnl0ZU9mZnNldCIpfHxObihsLGEpKSkmJnUucHVzaChsKTtyZXR1cm4gdX1mdW5jdGlvbiB0aSh0LGUpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gdChlKG4pKX19dmFyIEphPXRpKE9iamVjdC5rZXlzLE9iamVjdCksdHU9SmEsZXU9T2JqZWN0LnByb3RvdHlwZSxudT1ldS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBydSh0KXtpZighdm4odCkpcmV0dXJuIHR1KHQpO3ZhciBlPVtdO2Zvcih2YXIgbiBpbiBPYmplY3QodCkpbnUuY2FsbCh0LG4pJiZuIT0iY29uc3RydWN0b3IiJiZlLnB1c2gobik7cmV0dXJuIGV9ZnVuY3Rpb24gQm4odCl7cmV0dXJuIFdyKHQpP0pyKHQpOnJ1KHQpfWZ1bmN0aW9uIGl1KHQpe3ZhciBlPVtdO2lmKHQhPW51bGwpZm9yKHZhciBuIGluIE9iamVjdCh0KSllLnB1c2gobik7cmV0dXJuIGV9dmFyIG91PU9iamVjdC5wcm90b3R5cGUsc3U9b3UuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gYXUodCl7aWYoIWllKHQpKXJldHVybiBpdSh0KTt2YXIgZT12bih0KSxuPVtdO2Zvcih2YXIgciBpbiB0KXI9PSJjb25zdHJ1Y3RvciImJihlfHwhc3UuY2FsbCh0LHIpKXx8bi5wdXNoKHIpO3JldHVybiBufWZ1bmN0aW9uIFVuKHQpe3JldHVybiBXcih0KT9Kcih0LCEwKTphdSh0KX12YXIgdXU9L1wufFxbKD86W15bXF1dKnwoWyInXSkoPzooPyFcMSlbXlxcXXxcXC4pKj9cMSlcXS8sY3U9L15cdyokLztmdW5jdGlvbiBodSh0LGUpe2lmKFl0KHQpKXJldHVybiExO3ZhciBuPXR5cGVvZiB0O3JldHVybiBuPT0ibnVtYmVyInx8bj09InN5bWJvbCJ8fG49PSJib29sZWFuInx8dD09bnVsbHx8Rm4odCk/ITA6Y3UudGVzdCh0KXx8IXV1LnRlc3QodCl8fGUhPW51bGwmJnQgaW4gT2JqZWN0KGUpfXZhciBmdT1zZShPYmplY3QsImNyZWF0ZSIpLExlPWZ1O2Z1bmN0aW9uIGx1KCl7dGhpcy5fX2RhdGFfXz1MZT9MZShudWxsKTp7fSx0aGlzLnNpemU9MH1mdW5jdGlvbiBkdSh0KXt2YXIgZT10aGlzLmhhcyh0KSYmZGVsZXRlIHRoaXMuX19kYXRhX19bdF07cmV0dXJuIHRoaXMuc2l6ZS09ZT8xOjAsZX12YXIgRXU9Il9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iLF91PU9iamVjdC5wcm90b3R5cGUscHU9X3UuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24geXUodCl7dmFyIGU9dGhpcy5fX2RhdGFfXztpZihMZSl7dmFyIG49ZVt0XTtyZXR1cm4gbj09PUV1P3ZvaWQgMDpufXJldHVybiBwdS5jYWxsKGUsdCk/ZVt0XTp2b2lkIDB9dmFyIEF1PU9iamVjdC5wcm90b3R5cGUsVHU9QXUuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gUnUodCl7dmFyIGU9dGhpcy5fX2RhdGFfXztyZXR1cm4gTGU/ZVt0XSE9PXZvaWQgMDpUdS5jYWxsKGUsdCl9dmFyIHh1PSJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIjtmdW5jdGlvbiBPdSh0LGUpe3ZhciBuPXRoaXMuX19kYXRhX187cmV0dXJuIHRoaXMuc2l6ZSs9dGhpcy5oYXModCk/MDoxLG5bdF09TGUmJmU9PT12b2lkIDA/eHU6ZSx0aGlzfWZ1bmN0aW9uIGFlKHQpe3ZhciBlPS0xLG49dD09bnVsbD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPG47KXt2YXIgcj10W2VdO3RoaXMuc2V0KHJbMF0sclsxXSl9fWFlLnByb3RvdHlwZS5jbGVhcj1sdSxhZS5wcm90b3R5cGUuZGVsZXRlPWR1LGFlLnByb3RvdHlwZS5nZXQ9eXUsYWUucHJvdG90eXBlLmhhcz1SdSxhZS5wcm90b3R5cGUuc2V0PU91O2Z1bmN0aW9uIGJ1KCl7dGhpcy5fX2RhdGFfXz1bXSx0aGlzLnNpemU9MH1mdW5jdGlvbiBvbih0LGUpe2Zvcih2YXIgbj10Lmxlbmd0aDtuLS07KWlmKFZyKHRbbl1bMF0sZSkpcmV0dXJuIG47cmV0dXJuLTF9dmFyIGd1PUFycmF5LnByb3RvdHlwZSxTdT1ndS5zcGxpY2U7ZnVuY3Rpb24gbXUodCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxuPW9uKGUsdCk7aWYobjwwKXJldHVybiExO3ZhciByPWUubGVuZ3RoLTE7cmV0dXJuIG49PXI/ZS5wb3AoKTpTdS5jYWxsKGUsbiwxKSwtLXRoaXMuc2l6ZSwhMH1mdW5jdGlvbiBGdSh0KXt2YXIgZT10aGlzLl9fZGF0YV9fLG49b24oZSx0KTtyZXR1cm4gbjwwP3ZvaWQgMDplW25dWzFdfWZ1bmN0aW9uIHd1KHQpe3JldHVybiBvbih0aGlzLl9fZGF0YV9fLHQpPi0xfWZ1bmN0aW9uIEl1KHQsZSl7dmFyIG49dGhpcy5fX2RhdGFfXyxyPW9uKG4sdCk7cmV0dXJuIHI8MD8oKyt0aGlzLnNpemUsbi5wdXNoKFt0LGVdKSk6bltyXVsxXT1lLHRoaXN9ZnVuY3Rpb24gWHQodCl7dmFyIGU9LTEsbj10PT1udWxsPzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8bjspe3ZhciByPXRbZV07dGhpcy5zZXQoclswXSxyWzFdKX19WHQucHJvdG90eXBlLmNsZWFyPWJ1LFh0LnByb3RvdHlwZS5kZWxldGU9bXUsWHQucHJvdG90eXBlLmdldD1GdSxYdC5wcm90b3R5cGUuaGFzPXd1LFh0LnByb3RvdHlwZS5zZXQ9SXU7dmFyIE51PXNlKFV0LCJNYXAiKSxQZT1OdTtmdW5jdGlvbiBNdSgpe3RoaXMuc2l6ZT0wLHRoaXMuX19kYXRhX189e2hhc2g6bmV3IGFlLG1hcDpuZXcoUGV8fFh0KSxzdHJpbmc6bmV3IGFlfX1mdW5jdGlvbiBDdSh0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4gZT09InN0cmluZyJ8fGU9PSJudW1iZXIifHxlPT0ic3ltYm9sInx8ZT09ImJvb2xlYW4iP3QhPT0iX19wcm90b19fIjp0PT09bnVsbH1mdW5jdGlvbiBzbih0LGUpe3ZhciBuPXQuX19kYXRhX187cmV0dXJuIEN1KGUpP25bdHlwZW9mIGU9PSJzdHJpbmciPyJzdHJpbmciOiJoYXNoIl06bi5tYXB9ZnVuY3Rpb24gdnUodCl7dmFyIGU9c24odGhpcyx0KS5kZWxldGUodCk7cmV0dXJuIHRoaXMuc2l6ZS09ZT8xOjAsZX1mdW5jdGlvbiBEdSh0KXtyZXR1cm4gc24odGhpcyx0KS5nZXQodCl9ZnVuY3Rpb24gTHUodCl7cmV0dXJuIHNuKHRoaXMsdCkuaGFzKHQpfWZ1bmN0aW9uIFB1KHQsZSl7dmFyIG49c24odGhpcyx0KSxyPW4uc2l6ZTtyZXR1cm4gbi5zZXQodCxlKSx0aGlzLnNpemUrPW4uc2l6ZT09cj8wOjEsdGhpc31mdW5jdGlvbiBLdCh0KXt2YXIgZT0tMSxuPXQ9PW51bGw/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxuOyl7dmFyIHI9dFtlXTt0aGlzLnNldChyWzBdLHJbMV0pfX1LdC5wcm90b3R5cGUuY2xlYXI9TXUsS3QucHJvdG90eXBlLmRlbGV0ZT12dSxLdC5wcm90b3R5cGUuZ2V0PUR1LEt0LnByb3RvdHlwZS5oYXM9THUsS3QucHJvdG90eXBlLnNldD1QdTt2YXIgQnU9IkV4cGVjdGVkIGEgZnVuY3Rpb24iO2Z1bmN0aW9uIGpuKHQsZSl7aWYodHlwZW9mIHQhPSJmdW5jdGlvbiJ8fGUhPW51bGwmJnR5cGVvZiBlIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoQnUpO3ZhciBuPWZ1bmN0aW9uKCl7dmFyIHI9YXJndW1lbnRzLGk9ZT9lLmFwcGx5KHRoaXMscik6clswXSxvPW4uY2FjaGU7aWYoby5oYXMoaSkpcmV0dXJuIG8uZ2V0KGkpO3ZhciBzPXQuYXBwbHkodGhpcyxyKTtyZXR1cm4gbi5jYWNoZT1vLnNldChpLHMpfHxvLHN9O3JldHVybiBuLmNhY2hlPW5ldyhqbi5DYWNoZXx8S3QpLG59am4uQ2FjaGU9S3Q7dmFyIFV1PTUwMDtmdW5jdGlvbiBqdSh0KXt2YXIgZT1qbih0LGZ1bmN0aW9uKHIpe3JldHVybiBuLnNpemU9PT1VdSYmbi5jbGVhcigpLHJ9KSxuPWUuY2FjaGU7cmV0dXJuIGV9dmFyIEd1PS9bXi5bXF1dK3xcWyg/OigtP1xkKyg/OlwuXGQrKT8pfChbIiddKSgoPzooPyFcMilbXlxcXXxcXC4pKj8pXDIpXF18KD89KD86XC58XFtcXSkoPzpcLnxcW1xdfCQpKS9nLCR1PS9cXChcXCk/L2csVnU9anUoZnVuY3Rpb24odCl7dmFyIGU9W107cmV0dXJuIHQuY2hhckNvZGVBdCgwKT09PTQ2JiZlLnB1c2goIiIpLHQucmVwbGFjZShHdSxmdW5jdGlvbihuLHIsaSxvKXtlLnB1c2goaT9vLnJlcGxhY2UoJHUsIiQxIik6cnx8bil9KSxlfSksenU9VnU7ZnVuY3Rpb24gV3UodCl7cmV0dXJuIHQ9PW51bGw/IiI6QnIodCl9ZnVuY3Rpb24gYW4odCxlKXtyZXR1cm4gWXQodCk/dDpodSh0LGUpP1t0XTp6dShXdSh0KSl9dmFyIFh1PTEvMDtmdW5jdGlvbiBHbih0KXtpZih0eXBlb2YgdD09InN0cmluZyJ8fEZuKHQpKXJldHVybiB0O3ZhciBlPXQrIiI7cmV0dXJuIGU9PSIwIiYmMS90PT0tWHU/Ii0wIjplfWZ1bmN0aW9uIEh1KHQsZSl7ZT1hbihlLHQpO2Zvcih2YXIgbj0wLHI9ZS5sZW5ndGg7dCE9bnVsbCYmbjxyOyl0PXRbR24oZVtuKytdKV07cmV0dXJuIG4mJm49PXI/dDp2b2lkIDB9ZnVuY3Rpb24gJG4odCxlKXtmb3IodmFyIG49LTEscj1lLmxlbmd0aCxpPXQubGVuZ3RoOysrbjxyOyl0W2krbl09ZVtuXTtyZXR1cm4gdH12YXIgZWk9anQ/anQuaXNDb25jYXRTcHJlYWRhYmxlOnZvaWQgMDtmdW5jdGlvbiBxdSh0KXtyZXR1cm4gWXQodCl8fERuKHQpfHwhIShlaSYmdCYmdFtlaV0pfWZ1bmN0aW9uIG5pKHQsZSxuLHIsaSl7dmFyIG89LTEscz10Lmxlbmd0aDtmb3Iobnx8KG49cXUpLGl8fChpPVtdKTsrK288czspe3ZhciB1PXRbb107ZT4wJiZuKHUpP2U+MT9uaSh1LGUtMSxuLHIsaSk6JG4oaSx1KTpyfHwoaVtpLmxlbmd0aF09dSl9cmV0dXJuIGl9ZnVuY3Rpb24ga3UodCl7dmFyIGU9dD09bnVsbD8wOnQubGVuZ3RoO3JldHVybiBlP25pKHQsMSk6W119ZnVuY3Rpb24gWXUodCl7cmV0dXJuIGlhKGhhKHQsdm9pZCAwLGt1KSx0KyIiKX12YXIgS3U9dGkoT2JqZWN0LmdldFByb3RvdHlwZU9mLE9iamVjdCkscmk9S3U7ZnVuY3Rpb24gWnUoKXt0aGlzLl9fZGF0YV9fPW5ldyBYdCx0aGlzLnNpemU9MH1mdW5jdGlvbiBRdSh0KXt2YXIgZT10aGlzLl9fZGF0YV9fLG49ZS5kZWxldGUodCk7cmV0dXJuIHRoaXMuc2l6ZT1lLnNpemUsbn1mdW5jdGlvbiBKdSh0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5nZXQodCl9ZnVuY3Rpb24gdGModCl7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHQpfXZhciBlYz0yMDA7ZnVuY3Rpb24gbmModCxlKXt2YXIgbj10aGlzLl9fZGF0YV9fO2lmKG4gaW5zdGFuY2VvZiBYdCl7dmFyIHI9bi5fX2RhdGFfXztpZighUGV8fHIubGVuZ3RoPGVjLTEpcmV0dXJuIHIucHVzaChbdCxlXSksdGhpcy5zaXplPSsrbi5zaXplLHRoaXM7bj10aGlzLl9fZGF0YV9fPW5ldyBLdChyKX1yZXR1cm4gbi5zZXQodCxlKSx0aGlzLnNpemU9bi5zaXplLHRoaXN9ZnVuY3Rpb24gU2UodCl7dmFyIGU9dGhpcy5fX2RhdGFfXz1uZXcgWHQodCk7dGhpcy5zaXplPWUuc2l6ZX1TZS5wcm90b3R5cGUuY2xlYXI9WnUsU2UucHJvdG90eXBlLmRlbGV0ZT1RdSxTZS5wcm90b3R5cGUuZ2V0PUp1LFNlLnByb3RvdHlwZS5oYXM9dGMsU2UucHJvdG90eXBlLnNldD1uYztmdW5jdGlvbiByYyh0LGUpe3JldHVybiB0JiZybihlLEJuKGUpLHQpfWZ1bmN0aW9uIGljKHQsZSl7cmV0dXJuIHQmJnJuKGUsVW4oZSksdCl9dmFyIGlpPXR5cGVvZiBleHBvcnRzPT0ib2JqZWN0IiYmZXhwb3J0cyYmIWV4cG9ydHMubm9kZVR5cGUmJmV4cG9ydHMsb2k9aWkmJnR5cGVvZiBtb2R1bGU9PSJvYmplY3QiJiZtb2R1bGUmJiFtb2R1bGUubm9kZVR5cGUmJm1vZHVsZSxvYz1vaSYmb2kuZXhwb3J0cz09PWlpLHNpPW9jP1V0LkJ1ZmZlcjp2b2lkIDAsYWk9c2k/c2kuYWxsb2NVbnNhZmU6dm9pZCAwO2Z1bmN0aW9uIHNjKHQsZSl7aWYoZSlyZXR1cm4gdC5zbGljZSgpO3ZhciBuPXQubGVuZ3RoLHI9YWk/YWkobik6bmV3IHQuY29uc3RydWN0b3Iobik7cmV0dXJuIHQuY29weShyKSxyfWZ1bmN0aW9uIGFjKHQsZSl7Zm9yKHZhciBuPS0xLHI9dD09bnVsbD8wOnQubGVuZ3RoLGk9MCxvPVtdOysrbjxyOyl7dmFyIHM9dFtuXTtlKHMsbix0KSYmKG9baSsrXT1zKX1yZXR1cm4gb31mdW5jdGlvbiB1aSgpe3JldHVybltdfXZhciB1Yz1PYmplY3QucHJvdG90eXBlLGNjPXVjLnByb3BlcnR5SXNFbnVtZXJhYmxlLGNpPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsaGM9Y2k/ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PW51bGw/W106KHQ9T2JqZWN0KHQpLGFjKGNpKHQpLGZ1bmN0aW9uKGUpe3JldHVybiBjYy5jYWxsKHQsZSl9KSl9OnVpLFZuPWhjO2Z1bmN0aW9uIGZjKHQsZSl7cmV0dXJuIHJuKHQsVm4odCksZSl9dmFyIGxjPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsZGM9bGM/ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdO3Q7KSRuKGUsVm4odCkpLHQ9cmkodCk7cmV0dXJuIGV9OnVpLGhpPWRjO2Z1bmN0aW9uIEVjKHQsZSl7cmV0dXJuIHJuKHQsaGkodCksZSl9ZnVuY3Rpb24gZmkodCxlLG4pe3ZhciByPWUodCk7cmV0dXJuIFl0KHQpP3I6JG4ocixuKHQpKX1mdW5jdGlvbiBfYyh0KXtyZXR1cm4gZmkodCxCbixWbil9ZnVuY3Rpb24gcGModCl7cmV0dXJuIGZpKHQsVW4saGkpfXZhciB5Yz1zZShVdCwiRGF0YVZpZXciKSx6bj15YyxBYz1zZShVdCwiUHJvbWlzZSIpLFduPUFjLFRjPXNlKFV0LCJTZXQiKSxYbj1UYyxsaT0iW29iamVjdCBNYXBdIixSYz0iW29iamVjdCBPYmplY3RdIixkaT0iW29iamVjdCBQcm9taXNlXSIsRWk9IltvYmplY3QgU2V0XSIsX2k9IltvYmplY3QgV2Vha01hcF0iLHBpPSJbb2JqZWN0IERhdGFWaWV3XSIseGM9b2Uoem4pLE9jPW9lKFBlKSxiYz1vZShXbiksZ2M9b2UoWG4pLFNjPW9lKEluKSx1ZT1PZTsoem4mJnVlKG5ldyB6bihuZXcgQXJyYXlCdWZmZXIoMSkpKSE9cGl8fFBlJiZ1ZShuZXcgUGUpIT1saXx8V24mJnVlKFduLnJlc29sdmUoKSkhPWRpfHxYbiYmdWUobmV3IFhuKSE9RWl8fEluJiZ1ZShuZXcgSW4pIT1faSkmJih1ZT1mdW5jdGlvbih0KXt2YXIgZT1PZSh0KSxuPWU9PVJjP3QuY29uc3RydWN0b3I6dm9pZCAwLHI9bj9vZShuKToiIjtpZihyKXN3aXRjaChyKXtjYXNlIHhjOnJldHVybiBwaTtjYXNlIE9jOnJldHVybiBsaTtjYXNlIGJjOnJldHVybiBkaTtjYXNlIGdjOnJldHVybiBFaTtjYXNlIFNjOnJldHVybiBfaX1yZXR1cm4gZX0pO3ZhciBIbj11ZSxtYz1PYmplY3QucHJvdG90eXBlLEZjPW1jLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIHdjKHQpe3ZhciBlPXQubGVuZ3RoLG49bmV3IHQuY29uc3RydWN0b3IoZSk7cmV0dXJuIGUmJnR5cGVvZiB0WzBdPT0ic3RyaW5nIiYmRmMuY2FsbCh0LCJpbmRleCIpJiYobi5pbmRleD10LmluZGV4LG4uaW5wdXQ9dC5pbnB1dCksbn12YXIgSWM9VXQuVWludDhBcnJheSx5aT1JYztmdW5jdGlvbiBxbih0KXt2YXIgZT1uZXcgdC5jb25zdHJ1Y3Rvcih0LmJ5dGVMZW5ndGgpO3JldHVybiBuZXcgeWkoZSkuc2V0KG5ldyB5aSh0KSksZX1mdW5jdGlvbiBOYyh0LGUpe3ZhciBuPWU/cW4odC5idWZmZXIpOnQuYnVmZmVyO3JldHVybiBuZXcgdC5jb25zdHJ1Y3RvcihuLHQuYnl0ZU9mZnNldCx0LmJ5dGVMZW5ndGgpfXZhciBNYz0vXHcqJC87ZnVuY3Rpb24gQ2ModCl7dmFyIGU9bmV3IHQuY29uc3RydWN0b3IodC5zb3VyY2UsTWMuZXhlYyh0KSk7cmV0dXJuIGUubGFzdEluZGV4PXQubGFzdEluZGV4LGV9dmFyIEFpPWp0P2p0LnByb3RvdHlwZTp2b2lkIDAsVGk9QWk/QWkudmFsdWVPZjp2b2lkIDA7ZnVuY3Rpb24gdmModCl7cmV0dXJuIFRpP09iamVjdChUaS5jYWxsKHQpKTp7fX1mdW5jdGlvbiBEYyh0LGUpe3ZhciBuPWU/cW4odC5idWZmZXIpOnQuYnVmZmVyO3JldHVybiBuZXcgdC5jb25zdHJ1Y3RvcihuLHQuYnl0ZU9mZnNldCx0Lmxlbmd0aCl9dmFyIExjPSJbb2JqZWN0IEJvb2xlYW5dIixQYz0iW29iamVjdCBEYXRlXSIsQmM9IltvYmplY3QgTWFwXSIsVWM9IltvYmplY3QgTnVtYmVyXSIsamM9IltvYmplY3QgUmVnRXhwXSIsR2M9IltvYmplY3QgU2V0XSIsJGM9IltvYmplY3QgU3RyaW5nXSIsVmM9IltvYmplY3QgU3ltYm9sXSIsemM9IltvYmplY3QgQXJyYXlCdWZmZXJdIixXYz0iW29iamVjdCBEYXRhVmlld10iLFhjPSJbb2JqZWN0IEZsb2F0MzJBcnJheV0iLEhjPSJbb2JqZWN0IEZsb2F0NjRBcnJheV0iLHFjPSJbb2JqZWN0IEludDhBcnJheV0iLGtjPSJbb2JqZWN0IEludDE2QXJyYXldIixZYz0iW29iamVjdCBJbnQzMkFycmF5XSIsS2M9IltvYmplY3QgVWludDhBcnJheV0iLFpjPSJbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XSIsUWM9IltvYmplY3QgVWludDE2QXJyYXldIixKYz0iW29iamVjdCBVaW50MzJBcnJheV0iO2Z1bmN0aW9uIHRoKHQsZSxuKXt2YXIgcj10LmNvbnN0cnVjdG9yO3N3aXRjaChlKXtjYXNlIHpjOnJldHVybiBxbih0KTtjYXNlIExjOmNhc2UgUGM6cmV0dXJuIG5ldyByKCt0KTtjYXNlIFdjOnJldHVybiBOYyh0LG4pO2Nhc2UgWGM6Y2FzZSBIYzpjYXNlIHFjOmNhc2Uga2M6Y2FzZSBZYzpjYXNlIEtjOmNhc2UgWmM6Y2FzZSBRYzpjYXNlIEpjOnJldHVybiBEYyh0LG4pO2Nhc2UgQmM6cmV0dXJuIG5ldyByO2Nhc2UgVWM6Y2FzZSAkYzpyZXR1cm4gbmV3IHIodCk7Y2FzZSBqYzpyZXR1cm4gQ2ModCk7Y2FzZSBHYzpyZXR1cm4gbmV3IHI7Y2FzZSBWYzpyZXR1cm4gdmModCl9fWZ1bmN0aW9uIGVoKHQpe3JldHVybiB0eXBlb2YgdC5jb25zdHJ1Y3Rvcj09ImZ1bmN0aW9uIiYmIXZuKHQpP0hzKHJpKHQpKTp7fX12YXIgbmg9IltvYmplY3QgTWFwXSI7ZnVuY3Rpb24gcmgodCl7cmV0dXJuIGJlKHQpJiZIbih0KT09bmh9dmFyIFJpPWdlJiZnZS5pc01hcCxpaD1SaT9MbihSaSk6cmgsb2g9aWgsc2g9IltvYmplY3QgU2V0XSI7ZnVuY3Rpb24gYWgodCl7cmV0dXJuIGJlKHQpJiZIbih0KT09c2h9dmFyIHhpPWdlJiZnZS5pc1NldCx1aD14aT9Mbih4aSk6YWgsY2g9dWgsaGg9MSxmaD0yLGxoPTQsT2k9IltvYmplY3QgQXJndW1lbnRzXSIsZGg9IltvYmplY3QgQXJyYXldIixFaD0iW29iamVjdCBCb29sZWFuXSIsX2g9IltvYmplY3QgRGF0ZV0iLHBoPSJbb2JqZWN0IEVycm9yXSIsYmk9IltvYmplY3QgRnVuY3Rpb25dIix5aD0iW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0iLEFoPSJbb2JqZWN0IE1hcF0iLFRoPSJbb2JqZWN0IE51bWJlcl0iLGdpPSJbb2JqZWN0IE9iamVjdF0iLFJoPSJbb2JqZWN0IFJlZ0V4cF0iLHhoPSJbb2JqZWN0IFNldF0iLE9oPSJbb2JqZWN0IFN0cmluZ10iLGJoPSJbb2JqZWN0IFN5bWJvbF0iLGdoPSJbb2JqZWN0IFdlYWtNYXBdIixTaD0iW29iamVjdCBBcnJheUJ1ZmZlcl0iLG1oPSJbb2JqZWN0IERhdGFWaWV3XSIsRmg9IltvYmplY3QgRmxvYXQzMkFycmF5XSIsd2g9IltvYmplY3QgRmxvYXQ2NEFycmF5XSIsSWg9IltvYmplY3QgSW50OEFycmF5XSIsTmg9IltvYmplY3QgSW50MTZBcnJheV0iLE1oPSJbb2JqZWN0IEludDMyQXJyYXldIixDaD0iW29iamVjdCBVaW50OEFycmF5XSIsdmg9IltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIixEaD0iW29iamVjdCBVaW50MTZBcnJheV0iLExoPSJbb2JqZWN0IFVpbnQzMkFycmF5XSIsWj17fTtaW09pXT1aW2RoXT1aW1NoXT1aW21oXT1aW0VoXT1aW19oXT1aW0ZoXT1aW3doXT1aW0loXT1aW05oXT1aW01oXT1aW0FoXT1aW1RoXT1aW2dpXT1aW1JoXT1aW3hoXT1aW09oXT1aW2JoXT1aW0NoXT1aW3ZoXT1aW0RoXT1aW0xoXT0hMCxaW3BoXT1aW2JpXT1aW2doXT0hMTtmdW5jdGlvbiB1bih0LGUsbixyLGksbyl7dmFyIHMsdT1lJmhoLGE9ZSZmaCxsPWUmbGg7aWYobiYmKHM9aT9uKHQscixpLG8pOm4odCkpLHMhPT12b2lkIDApcmV0dXJuIHM7aWYoIWllKHQpKXJldHVybiB0O3ZhciBkPVl0KHQpO2lmKGQpe2lmKHM9d2ModCksIXUpcmV0dXJuIGtzKHQscyl9ZWxzZXt2YXIgXz1Ibih0KSxPPV89PWJpfHxfPT15aDtpZihLcih0KSlyZXR1cm4gc2ModCx1KTtpZihfPT1naXx8Xz09T2l8fE8mJiFpKXtpZihzPWF8fE8/e306ZWgodCksIXUpcmV0dXJuIGE/RWModCxpYyhzLHQpKTpmYyh0LHJjKHMsdCkpfWVsc2V7aWYoIVpbX10pcmV0dXJuIGk/dDp7fTtzPXRoKHQsXyx1KX19b3x8KG89bmV3IFNlKTt2YXIgYj1vLmdldCh0KTtpZihiKXJldHVybiBiO28uc2V0KHQscyksY2godCk/dC5mb3JFYWNoKGZ1bmN0aW9uKE4pe3MuYWRkKHVuKE4sZSxuLE4sdCxvKSl9KTpvaCh0KSYmdC5mb3JFYWNoKGZ1bmN0aW9uKE4sZyl7cy5zZXQoZyx1bihOLGUsbixnLHQsbykpfSk7dmFyIEY9bD9hP3BjOl9jOmE/VW46Qm4sUz1kP3ZvaWQgMDpGKHQpO3JldHVybiBvYShTfHx0LGZ1bmN0aW9uKE4sZyl7UyYmKGc9TixOPXRbZ10pLE1uKHMsZyx1bihOLGUsbixnLHQsbykpfSksc312YXIgUGg9MSxCaD00O2Z1bmN0aW9uIFVoKHQpe3JldHVybiB1bih0LFBofEJoKX1mdW5jdGlvbiBqaCh0LGUpe3JldHVybiB0IT1udWxsJiZlIGluIE9iamVjdCh0KX1mdW5jdGlvbiBHaCh0LGUsbil7ZT1hbihlLHQpO2Zvcih2YXIgcj0tMSxpPWUubGVuZ3RoLG89ITE7KytyPGk7KXt2YXIgcz1HbihlW3JdKTtpZighKG89dCE9bnVsbCYmbih0LHMpKSlicmVhazt0PXRbc119cmV0dXJuIG98fCsrciE9aT9vOihpPXQ9PW51bGw/MDp0Lmxlbmd0aCwhIWkmJkNuKGkpJiZObihzLGkpJiYoWXQodCl8fERuKHQpKSl9ZnVuY3Rpb24gJGgodCxlKXtyZXR1cm4gdCE9bnVsbCYmR2godCxlLGpoKX1mdW5jdGlvbiBWaCh0LGUsbixyKXtpZighaWUodCkpcmV0dXJuIHQ7ZT1hbihlLHQpO2Zvcih2YXIgaT0tMSxvPWUubGVuZ3RoLHM9by0xLHU9dDt1IT1udWxsJiYrK2k8bzspe3ZhciBhPUduKGVbaV0pLGw9bjtpZihhPT09Il9fcHJvdG9fXyJ8fGE9PT0iY29uc3RydWN0b3IifHxhPT09InByb3RvdHlwZSIpcmV0dXJuIHQ7aWYoaSE9cyl7dmFyIGQ9dVthXTtsPXI/cihkLGEsdSk6dm9pZCAwLGw9PT12b2lkIDAmJihsPWllKGQpP2Q6Tm4oZVtpKzFdKT9bXTp7fSl9TW4odSxhLGwpLHU9dVthXX1yZXR1cm4gdH1mdW5jdGlvbiB6aCh0LGUsbil7Zm9yKHZhciByPS0xLGk9ZS5sZW5ndGgsbz17fTsrK3I8aTspe3ZhciBzPWVbcl0sdT1IdSh0LHMpO24odSxzKSYmVmgobyxhbihzLHQpLHUpfXJldHVybiBvfWZ1bmN0aW9uIFdoKHQsZSl7cmV0dXJuIHpoKHQsZSxmdW5jdGlvbihuLHIpe3JldHVybiAkaCh0LHIpfSl9dmFyIFhoPVl1KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PW51bGw/e306V2godCxlKX0pLEhoPVhoO2Z1bmN0aW9uIHFoKHQpe3JldHVybiBPYmplY3Qua2V5cyh0KX1mdW5jdGlvbiBkdCh0LGUpe3JldHVybiB0Pz9lfWNvbnN0IGtoPXQ9PntsZXQgZT0wO2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKXtjb25zdCByPXQuY2hhckNvZGVBdChuKTtlPShlPDw1KS1lK3IsZSY9ZX1yZXR1cm4gZS50b1N0cmluZygxNil9LFloPXFoKHttYXJrZXI6MSxwb2x5bGluZToxLHBvbHlnb246MSxlbGxpcHNvaWQ6MSxlbGxpcHNlOjEsbW9kZWw6MSwiM2R0aWxlcyI6MSxib3g6MSxwaG90b292ZXJsYXk6MSxyZXNvdXJjZToxLHJhc3RlcjoxLGhlYXRNYXA6MSxmcnVzdHVtOjEsdHJhbnNpdGlvbjoxfSk7dmFyIE09KHQ9Pih0W3QuVkFSSUFCTEU9MF09IlZBUklBQkxFIix0W3QuVU5BUlk9MV09IlVOQVJZIix0W3QuQklOQVJZPTJdPSJCSU5BUlkiLHRbdC5URVJOQVJZPTNdPSJURVJOQVJZIix0W3QuQ09ORElUSU9OQUw9NF09IkNPTkRJVElPTkFMIix0W3QuTUVNQkVSPTVdPSJNRU1CRVIiLHRbdC5GVU5DVElPTl9DQUxMPTZdPSJGVU5DVElPTl9DQUxMIix0W3QuQVJSQVk9N109IkFSUkFZIix0W3QuUkVHRVg9OF09IlJFR0VYIix0W3QuVkFSSUFCTEVfSU5fU1RSSU5HPTldPSJWQVJJQUJMRV9JTl9TVFJJTkciLHRbdC5MSVRFUkFMX05VTEw9MTBdPSJMSVRFUkFMX05VTEwiLHRbdC5MSVRFUkFMX0JPT0xFQU49MTFdPSJMSVRFUkFMX0JPT0xFQU4iLHRbdC5MSVRFUkFMX05VTUJFUj0xMl09IkxJVEVSQUxfTlVNQkVSIix0W3QuTElURVJBTF9TVFJJTkc9MTNdPSJMSVRFUkFMX1NUUklORyIsdFt0LkxJVEVSQUxfQ09MT1I9MTRdPSJMSVRFUkFMX0NPTE9SIix0W3QuTElURVJBTF9WRUNUT1I9MTVdPSJMSVRFUkFMX1ZFQ1RPUiIsdFt0LkxJVEVSQUxfUkVHRVg9MTZdPSJMSVRFUkFMX1JFR0VYIix0W3QuTElURVJBTF9VTkRFRklORUQ9MTddPSJMSVRFUkFMX1VOREVGSU5FRCIsdFt0LkJVSUxUSU5fVkFSSUFCTEU9MThdPSJCVUlMVElOX1ZBUklBQkxFIix0KSkoTXx8e30pO2NvbnN0IEtoPVsiISIsIi0iLCIrIl0sWmg9WyIrIiwiLSIsIioiLCIvIiwiJSIsIj09PSIsIiE9PSIsIj4iLCI+PSIsIjwiLCI8PSIsIiYmIiwifHwiLCIhfiIsIj1+IiwiPT0iLCIhPSJdLFFoPS9cXC9nLEpoPSJAIyUiLHRmPS9AIyUvZyxlZj0vXiMoWzAtOWEtZl0pKFswLTlhLWZdKShbMC05YS1mXSkoWzAtOWEtZl0pPyQvaSxuZj0vXiMoWzAtOWEtZl17Mn0pKFswLTlhLWZdezJ9KShbMC05YS1mXXsyfSkoWzAtOWEtZl17Mn0pPyQvaSxTaT17QUxJQ0VCTFVFOiIjRjBGOEZGIixBTlRJUVVFV0hJVEU6IiNGQUVCRDciLEFRVUE6IiMwMEZGRkYiLEFRVUFNQVJJTkU6IiM3RkZGRDQiLEFaVVJFOiIjRjBGRkZGIixCRUlHRToiI0Y1RjVEQyIsQklTUVVFOiIjRkZFNEM0IixCTEFDSzoiIzAwMDAwMCIsQkxBTkNIRURBTE1PTkQ6IiNGRkVCQ0QiLEJMVUU6IiMwMDAwRkYiLEJMVUVWSU9MRVQ6IiM4QTJCRTIiLEJST1dOOiIjQTUyQTJBIixCVVJMWVdPT0Q6IiNERUI4ODciLENBREVUQkxVRToiIzVGOUVBMCIsQ0hBUlRSRVVTRToiIzdGRkYwMCIsQ0hPQ09MQVRFOiIjRDI2OTFFIixDT1JBTDoiI0ZGN0Y1MCIsQ09STkZMT1dFUkJMVUU6IiM2NDk1RUQiLENPUk5TSUxLOiIjRkZGOERDIixDUklNU09OOiIjREMxNDNDIixDWUFOOiIjMDBGRkZGIixEQVJLQkxVRToiIzAwMDA4QiIsREFSS0NZQU46IiMwMDhCOEIiLERBUktHT0xERU5ST0Q6IiNCODg2MEIiLERBUktHUkFZOiIjQTlBOUE5IixEQVJLR1JFRU46IiMwMDY0MDAiLERBUktHUkVZOiIjQTlBOUE5IixEQVJLS0hBS0k6IiNCREI3NkIiLERBUktNQUdFTlRBOiIjOEIwMDhCIixEQVJLT0xJVkVHUkVFTjoiIzU1NkIyRiIsREFSS09SQU5HRToiI0ZGOEMwMCIsREFSS09SQ0hJRDoiIzk5MzJDQyIsREFSS1JFRDoiIzhCMDAwMCIsREFSS1NBTE1PTjoiI0U5OTY3QSIsREFSS1NFQUdSRUVOOiIjOEZCQzhGIixEQVJLU0xBVEVCTFVFOiIjNDgzRDhCIixEQVJLU0xBVEVHUkFZOiIjMkY0RjRGIixEQVJLU0xBVEVHUkVZOiIjMkY0RjRGIixEQVJLVFVSUVVPSVNFOiIjMDBDRUQxIixEQVJLVklPTEVUOiIjOTQwMEQzIixERUVQUElOSzoiI0ZGMTQ5MyIsREVFUFNLWUJMVUU6IiMwMEJGRkYiLERJTUdSQVk6IiM2OTY5NjkiLERJTUdSRVk6IiM2OTY5NjkiLERPREdFUkJMVUU6IiMxRTkwRkYiLEZJUkVCUklDSzoiI0IyMjIyMiIsRkxPUkFMV0hJVEU6IiNGRkZBRjAiLEZPUkVTVEdSRUVOOiIjMjI4QjIyIixGVUNIU0lBOiIjRkYwMEZGIixHQUlOU0JPUk86IiNEQ0RDREMiLEdIT1NUV0hJVEU6IiNGOEY4RkYiLEdPTEQ6IiNGRkQ3MDAiLEdPTERFTlJPRDoiI0RBQTUyMCIsR1JBWToiIzgwODA4MCIsR1JFRU46IiMwMDgwMDAiLEdSRUVOWUVMTE9XOiIjQURGRjJGIixHUkVZOiIjODA4MDgwIixIT05FWURFVzoiI0YwRkZGMCIsSE9UUElOSzoiI0ZGNjlCNCIsSU5ESUFOUkVEOiIjQ0Q1QzVDIixJTkRJR086IiM0QjAwODIiLElWT1JZOiIjRkZGRkYwIixLSEFLSToiI0YwRTY4QyIsTEFWRU5ERVI6IiNFNkU2RkEiLExBVkVOREFSX0JMVVNIOiIjRkZGMEY1IixMQVdOR1JFRU46IiM3Q0ZDMDAiLExFTU9OQ0hJRkZPTjoiI0ZGRkFDRCIsTElHSFRCTFVFOiIjQUREOEU2IixMSUdIVENPUkFMOiIjRjA4MDgwIixMSUdIVENZQU46IiNFMEZGRkYiLExJR0hUR09MREVOUk9EWUVMTE9XOiIjRkFGQUQyIixMSUdIVEdSQVk6IiNEM0QzRDMiLExJR0hUR1JFRU46IiM5MEVFOTAiLExJR0hUR1JFWToiI0QzRDNEMyIsTElHSFRQSU5LOiIjRkZCNkMxIixMSUdIVFNFQUdSRUVOOiIjMjBCMkFBIixMSUdIVFNLWUJMVUU6IiM4N0NFRkEiLExJR0hUU0xBVEVHUkFZOiIjNzc4ODk5IixMSUdIVFNMQVRFR1JFWToiIzc3ODg5OSIsTElHSFRTVEVFTEJMVUU6IiNCMEM0REUiLExJR0hUWUVMTE9XOiIjRkZGRkUwIixMSU1FOiIjMDBGRjAwIixMSU1FR1JFRU46IiMzMkNEMzIiLExJTkVOOiIjRkFGMEU2IixNQUdFTlRBOiIjRkYwMEZGIixNQVJPT046IiM4MDAwMDAiLE1FRElVTUFRVUFNQVJJTkU6IiM2NkNEQUEiLE1FRElVTUJMVUU6IiMwMDAwQ0QiLE1FRElVTU9SQ0hJRDoiI0JBNTVEMyIsTUVESVVNUFVSUExFOiIjOTM3MERCIixNRURJVU1TRUFHUkVFTjoiIzNDQjM3MSIsTUVESVVNU0xBVEVCTFVFOiIjN0I2OEVFIixNRURJVU1TUFJJTkdHUkVFTjoiIzAwRkE5QSIsTUVESVVNVFVSUVVPSVNFOiIjNDhEMUNDIixNRURJVU1WSU9MRVRSRUQ6IiNDNzE1ODUiLE1JRE5JR0hUQkxVRToiIzE5MTk3MCIsTUlOVENSRUFNOiIjRjVGRkZBIixNSVNUWVJPU0U6IiNGRkU0RTEiLE1PQ0NBU0lOOiIjRkZFNEI1IixOQVZBSk9XSElURToiI0ZGREVBRCIsTkFWWToiIzAwMDA4MCIsT0xETEFDRToiI0ZERjVFNiIsT0xJVkU6IiM4MDgwMDAiLE9MSVZFRFJBQjoiIzZCOEUyMyIsT1JBTkdFOiIjRkZBNTAwIixPUkFOR0VSRUQ6IiNGRjQ1MDAiLE9SQ0hJRDoiI0RBNzBENiIsUEFMRUdPTERFTlJPRDoiI0VFRThBQSIsUEFMRUdSRUVOOiIjOThGQjk4IixQQUxFVFVSUVVPSVNFOiIjQUZFRUVFIixQQUxFVklPTEVUUkVEOiIjREI3MDkzIixQQVBBWUFXSElQOiIjRkZFRkQ1IixQRUFDSFBVRkY6IiNGRkRBQjkiLFBFUlU6IiNDRDg1M0YiLFBJTks6IiNGRkMwQ0IiLFBMVU06IiNEREEwREQiLFBPV0RFUkJMVUU6IiNCMEUwRTYiLFBVUlBMRToiIzgwMDA4MCIsUkVEOiIjRkYwMDAwIixST1NZQlJPV046IiNCQzhGOEYiLFJPWUFMQkxVRToiIzQxNjlFMSIsU0FERExFQlJPV046IiM4QjQ1MTMiLFNBTE1PTjoiI0ZBODA3MiIsU0FORFlCUk9XTjoiI0Y0QTQ2MCIsU0VBR1JFRU46IiMyRThCNTciLFNFQVNIRUxMOiIjRkZGNUVFIixTSUVOTkE6IiNBMDUyMkQiLFNJTFZFUjoiI0MwQzBDMCIsU0tZQkxVRToiIzg3Q0VFQiIsU0xBVEVCTFVFOiIjNkE1QUNEIixTTEFURUdSQVk6IiM3MDgwOTAiLFNMQVRFR1JFWToiIzcwODA5MCIsU05PVzoiI0ZGRkFGQSIsU1BSSU5HR1JFRU46IiMwMEZGN0YiLFNURUVMQkxVRToiIzQ2ODJCNCIsVEFOOiIjRDJCNDhDIixURUFMOiIjMDA4MDgwIixUSElTVExFOiIjRDhCRkQ4IixUT01BVE86IiNGRjYzNDciLFRVUlFVT0lTRToiIzQwRTBEMCIsVklPTEVUOiIjRUU4MkVFIixXSEVBVDoiI0Y1REVCMyIsV0hJVEU6IiNGRkZGRkYiLFdISVRFU01PS0U6IiNGNUY1RjUiLFlFTExPVzoiI0ZGRkYwMCIsWUVMTE9XR1JFRU46IiM5QUNEMzIifTtmdW5jdGlvbiByZih0KXtjb25zdCBlPWtuW3RdO3JldHVybiBmdW5jdGlvbihuKXtjb25zdCByPXRoaXMuX2xlZnQuZXZhbHVhdGUobiksaT10aGlzLl9yaWdodC5ldmFsdWF0ZShuKTtyZXR1cm4gZSh0LHIsaSl9fWNvbnN0IGtuPXthdGFuMjpCZShNYXRoLmF0YW4yLCExKSxwb3c6QmUoTWF0aC5wb3csITEpLG1pbjpCZShNYXRoLm1pbiwhMCksbWF4OkJlKE1hdGgubWF4LCEwKSxzdGFydHNXaXRoOkJlKG9mLCExKX07ZnVuY3Rpb24gQmUodCxlKXtyZXR1cm4gZnVuY3Rpb24obixyLGkpe2lmKGUmJnR5cGVvZiBpPT0ibnVtYmVyIiYmdHlwZW9mIHI9PSJudW1iZXIifHx0eXBlb2Ygcj09Im51bWJlciImJnR5cGVvZiBpPT0ibnVtYmVyInx8dHlwZW9mIHI9PSJzdHJpbmciJiZ0eXBlb2YgaT09InN0cmluZyIpcmV0dXJuIHQocixpKTt0aHJvdyBuZXcgRXJyb3IoYEZ1bmN0aW9uICIke259IiByZXF1aXJlcyB2ZWN0b3Igb3IgbnVtYmVyIGFyZ3VtZW50cyBvZiBtYXRjaGluZyB0eXBlcy4gQXJndW1lbnRzIGFyZSAke3J9IGFuZCAke2l9LmApfX1mdW5jdGlvbiBvZih0LGUpe3JldHVybiB0LnN0YXJ0c1dpdGgoZSl9ZnVuY3Rpb24gc2YodCl7Y29uc3QgZT1Zblt0XTtyZXR1cm4gZnVuY3Rpb24obil7Y29uc3Qgcj10aGlzLl9sZWZ0LmV2YWx1YXRlKG4pO3JldHVybiBlKHQscil9fWNvbnN0IFluPXthYnM6Y3QoTWF0aC5hYnMpLHNxcnQ6Y3QoTWF0aC5zcXJ0KSxjb3M6Y3QoTWF0aC5jb3MpLHNpbjpjdChNYXRoLnNpbiksdGFuOmN0KE1hdGgudGFuKSxhY29zOmN0KE1hdGguYWNvcyksYXNpbjpjdChNYXRoLmFzaW4pLGF0YW46Y3QoTWF0aC5hdGFuKSxyYWRpYW5zOmN0KFIudG9SYWRpYW5zKSxkZWdyZWVzOmN0KFIudG9EZWdyZWVzKSxzaWduOmN0KFIuc2lnbiksZmxvb3I6Y3QoTWF0aC5mbG9vciksY2VpbDpjdChNYXRoLmNlaWwpLHJvdW5kOmN0KE1hdGgucm91bmQpLGV4cDI6Y3QodWYpLGxvZzpjdChNYXRoLmxvZyksbG9nMjpjdChjZiksZnJhY3Q6Y3QoYWYpfTtmdW5jdGlvbiBjdCh0KXtyZXR1cm4gZnVuY3Rpb24oZSxuKXtpZih0eXBlb2Ygbj09Im51bWJlciIpcmV0dXJuIHQobik7dGhyb3cgbmV3IEVycm9yKGBGdW5jdGlvbiAiJHtlfSIgcmVxdWlyZXMgYSB2ZWN0b3Igb3IgbnVtYmVyIGFyZ3VtZW50LiBBcmd1bWVudCBpcyAke259LmApfX1mdW5jdGlvbiBhZih0KXtyZXR1cm4gdC1NYXRoLmZsb29yKHQpfWZ1bmN0aW9uIHVmKHQpe3JldHVybiBNYXRoLnBvdygyLHQpfWZ1bmN0aW9uIGNmKHQpe3JldHVybiBSLmxvZzIodCl9Y29uc3QgaGY9L15yZ2JhP1woXHMqKFswLTkuXSslPylccyosXHMqKFswLTkuXSslPylccyosXHMqKFswLTkuXSslPykoPzpccyosXHMqKFswLTkuXSspKT9ccypcKSQvaSxmZj0vXmhzbGE/XChccyooWzAtOS5dKylccyosXHMqKFswLTkuXSslKVxzKixccyooWzAtOS5dKyUpKD86XHMqLFxzKihbMC05Ll0rKSk/XHMqXCkkL2k7Y2xhc3MgSntjb25zdHJ1Y3RvcihlLG4scixpKXt2KHRoaXMsInJlZCIpO3YodGhpcywiZ3JlZW4iKTt2KHRoaXMsImJsdWUiKTt2KHRoaXMsImFscGhhIik7dGhpcy5yZWQ9ZHQoZSwxKSx0aGlzLmdyZWVuPWR0KG4sMSksdGhpcy5ibHVlPWR0KHIsMSksdGhpcy5hbHBoYT1kdChpLDEpfXN0YXRpYyBieXRlVG9GbG9hdChlKXtyZXR1cm4gZS8yNTV9c3RhdGljIGZsb2F0VG9CeXRlKGUpe3JldHVybiBlPT09MT8yNTU6ZSoyNTZ8MH1zdGF0aWMgZnJvbUNzc0NvbG9yU3RyaW5nKGUpe2U9ZS5yZXBsYWNlKC9ccy9nLCIiKTtjb25zdCBuPWxmKGUpO2lmKHR5cGVvZiBuPCJ1IilyZXR1cm4gbjtsZXQgcj1lZi5leGVjKGUpO2lmKHIhPT1udWxsKXtjb25zdCBpPW5ldyBKO3JldHVybiBpLnJlZD1wYXJzZUludChyWzFdLDE2KS8xNSxpLmdyZWVuPXBhcnNlSW50KHJbMl0sMTYpLzE1LGkuYmx1ZT1wYXJzZUludChyWzNdLDE2KS8xNSxpLmFscGhhPXBhcnNlSW50KGR0KHJbNF0sImYiKSwxNikvMTUsaX1pZihyPW5mLmV4ZWMoZSksciE9PW51bGwpe2NvbnN0IGk9bmV3IEo7cmV0dXJuIGkucmVkPXBhcnNlSW50KHJbMV0sMTYpLzI1NSxpLmdyZWVuPXBhcnNlSW50KHJbMl0sMTYpLzI1NSxpLmJsdWU9cGFyc2VJbnQoclszXSwxNikvMjU1LGkuYWxwaGE9cGFyc2VJbnQoZHQocls0XSwiZmYiKSwxNikvMjU1LGl9aWYocj1oZi5leGVjKGUpLHIhPT1udWxsKXtjb25zdCBpPW5ldyBKO3JldHVybiBpLnJlZD1wYXJzZUZsb2F0KHJbMV0pLyhyWzFdLnN1YnN0cigtMSk9PT0iJSI/MTAwOjI1NSksaS5ncmVlbj1wYXJzZUZsb2F0KHJbMl0pLyhyWzJdLnN1YnN0cigtMSk9PT0iJSI/MTAwOjI1NSksaS5ibHVlPXBhcnNlRmxvYXQoclszXSkvKHJbM10uc3Vic3RyKC0xKT09PSIlIj8xMDA6MjU1KSxpLmFscGhhPXBhcnNlRmxvYXQoZHQocls0XSwiMS4wIikpLGl9aWYocj1mZi5leGVjKGUpLHIhPT1udWxsKXJldHVybiBKLmZyb21Ic2wocGFyc2VGbG9hdChyWzFdKS8zNjAscGFyc2VGbG9hdChyWzJdKS8xMDAscGFyc2VGbG9hdChyWzNdKS8xMDAscGFyc2VGbG9hdChkdChyWzRdLCIxLjAiKSkpfXN0YXRpYyBmcm9tSHNsKGUsbixyLGkpe2lmKGU9ZHQoZSwwKSUxLG49ZHQobiwwKSxyPWR0KHIsMCksaT1kdChpLDEpLGUmJm4mJnImJmkpe2xldCBvPXIscz1yLHU9cjtjb25zdCBhPW5ldyBKO2lmKG4hPT0wKXtsZXQgbDtyPC41P2w9ciooMStuKTpsPXIrbi1yKm47Y29uc3QgZD0yKnItbDtvPUtuKGQsbCxlKzEvMykscz1LbihkLGwsZSksdT1LbihkLGwsZS0xLzMpfXJldHVybiB0eXBlb2YgYT4idSI/bmV3IEoobyxzLHUsaSk6KGEucmVkPW8sYS5ncmVlbj1zLGEuYmx1ZT11LGEuYWxwaGE9aSxhKX19dG9Dc3NIZXhTdHJpbmcoKXtsZXQgZT1KLmZsb2F0VG9CeXRlKHRoaXMucmVkKS50b1N0cmluZygxNik7ZS5sZW5ndGg8MiYmKGU9YDAke2V9YCk7bGV0IG49Si5mbG9hdFRvQnl0ZSh0aGlzLmdyZWVuKS50b1N0cmluZygxNik7bi5sZW5ndGg8MiYmKG49YDAke259YCk7bGV0IHI9Si5mbG9hdFRvQnl0ZSh0aGlzLmJsdWUpLnRvU3RyaW5nKDE2KTtpZihyLmxlbmd0aDwyJiYocj1gMCR7cn1gKSx0aGlzLmFscGhhPDEpe2xldCBpPUouZmxvYXRUb0J5dGUodGhpcy5hbHBoYSkudG9TdHJpbmcoMTYpO3JldHVybiBpLmxlbmd0aDwyJiYoaT1gMCR7aX1gKSxgIyR7ZX0ke259JHtyfSR7aX1gfXJldHVybmAjJHtlfSR7bn0ke3J9YC50b1VwcGVyQ2FzZSgpfXN0YXRpYyBmcm9tQnl0ZXMoZSxuLHIsaSl7cmV0dXJuIGU9dGhpcy5ieXRlVG9GbG9hdChkdChlLDI1NSkpLG49Si5ieXRlVG9GbG9hdChkdChuLDI1NSkpLHI9Si5ieXRlVG9GbG9hdChkdChyLDI1NSkpLGk9Si5ieXRlVG9GbG9hdChkdChpLDI1NSkpLG5ldyBKKGUsbixyLGkpfX1mdW5jdGlvbiBsZih0KXtpZih0PXQudG9VcHBlckNhc2UoKSxTaVt0XSlyZXR1cm4gSi5mcm9tQ3NzQ29sb3JTdHJpbmcoU2lbdF0pO3N3aXRjaCh0KXtjYXNlIlRSQU5TUEFSRU5UIjpyZXR1cm4gbmV3IEooMCwwLDAsMCk7ZGVmYXVsdDpyZXR1cm59fWZ1bmN0aW9uIEtuKHQsZSxuKXtyZXR1cm4gbjwwJiYobis9MSksbj4xJiYobi09MSksbio2PDE/dCsoZS10KSo2Km46bioyPDE/ZTpuKjM8Mj90KyhlLXQpKigyLzMtbikqNjp0fWNsYXNzIFB7Y29uc3RydWN0b3IoZSxuLHIsaSxvKXt2KHRoaXMsIl90eXBlIik7dih0aGlzLCJfdmFsdWUiKTt2KHRoaXMsIl9sZWZ0Iik7dih0aGlzLCJfcmlnaHQiKTt2KHRoaXMsIl90ZXN0Iik7dih0aGlzLCJldmFsdWF0ZSIpO3RoaXMuX3R5cGU9ZSx0aGlzLl92YWx1ZT1uLHRoaXMuX2xlZnQ9cix0aGlzLl9yaWdodD1pLHRoaXMuX3Rlc3Q9byx0aGlzLnNldEV2YWx1YXRlRnVuY3Rpb24oKX1zZXRFdmFsdWF0ZUZ1bmN0aW9uKCl7Y29uc3QgZT10aGlzLl90eXBlLG49dGhpcy5fdmFsdWU7c3dpdGNoKGUpe2Nhc2UgTS5DT05ESVRJT05BTDp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlQ29uZGl0aW9uYWw7YnJlYWs7Y2FzZSBNLkZVTkNUSU9OX0NBTEw6c3dpdGNoKG4pe2Nhc2UidG9TdHJpbmciOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVUb1N0cmluZzticmVha31icmVhaztjYXNlIE0uVU5BUlk6c3dpdGNoKG4pe2Nhc2UiISI6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZU5vdDticmVhaztjYXNlIi0iOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVOZWdhdGl2ZTticmVhaztjYXNlIisiOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVQb3NpdGl2ZTticmVhaztjYXNlImlzTmFOIjp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlTmFOO2JyZWFrO2Nhc2UiaXNGaW5pdGUiOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVJc0Zpbml0ZTticmVhaztjYXNlIkJvb2xlYW4iOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVCb29sZWFuQ29udmVyc2lvbjticmVhaztjYXNlIk51bWJlciI6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZU51bWJlckNvbnZlcnNpb247YnJlYWs7Y2FzZSJTdHJpbmciOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVTdHJpbmdDb252ZXJzaW9uO2JyZWFrO2RlZmF1bHQ6dHlwZW9mIFluW25dPCJ1IiYmKHRoaXMuZXZhbHVhdGU9c2YobikpO2JyZWFrfWJyZWFrO2Nhc2UgTS5CSU5BUlk6c3dpdGNoKG4pe2Nhc2UiKyI6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZVBsdXM7YnJlYWs7Y2FzZSItIjp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlTWludXM7YnJlYWs7Y2FzZSIqIjp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlVGltZXM7YnJlYWs7Y2FzZSIvIjp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlRGl2aWRlO2JyZWFrO2Nhc2UiJSI6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZU1vZDticmVhaztjYXNlIj09PSI6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZUVxdWFsc1N0cmljdDticmVhaztjYXNlIiE9PSI6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZU5vdEVxdWFsc1N0cmljdDticmVhaztjYXNlIjwiOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVMZXNzVGhhbjticmVhaztjYXNlIjw9Ijp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlTGVzc1RoYW5PckVxdWFsczticmVhaztjYXNlIj4iOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVHcmVhdGVyVGhhbjticmVhaztjYXNlIj49Ijp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlR3JlYXRlclRoYW5PckVxdWFsczticmVhaztjYXNlIiYmIjp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlQW5kO2JyZWFrO2Nhc2UifHwiOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVPcjticmVhaztjYXNlIj09Ijp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlRXF1YWxzO2JyZWFrO2Nhc2UiIT0iOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVOb3RFcXVhbHM7YnJlYWs7ZGVmYXVsdDp0eXBlb2Yga25bbl08InUiJiYodGhpcy5ldmFsdWF0ZT1yZihuKSk7YnJlYWt9YnJlYWs7Y2FzZSBNLk1FTUJFUjpuPT09ImJyYWNrZXRzIj90aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlTWVtYmVyQnJhY2tldHM6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZU1lbWJlckRvdDticmVhaztjYXNlIE0uQVJSQVk6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZUFycmF5O2JyZWFrO2Nhc2UgTS5WQVJJQUJMRTp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlVmFyaWFibGU7YnJlYWs7Y2FzZSBNLlZBUklBQkxFX0lOX1NUUklORzp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlVmFyaWFibGVTdHJpbmc7YnJlYWs7Y2FzZSBNLkxJVEVSQUxfQ09MT1I6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZUxpdGVyYWxDb2xvcjticmVhaztjYXNlIE0uTElURVJBTF9TVFJJTkc6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZUxpdGVyYWxTdHJpbmc7YnJlYWs7ZGVmYXVsdDp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlTGl0ZXJhbDticmVha319X2V2YWx1YXRlTGl0ZXJhbCgpe3JldHVybiB0aGlzLl92YWx1ZX1fZXZhbHVhdGVMaXRlcmFsU3RyaW5nKCl7cmV0dXJuIHRoaXMuX3ZhbHVlfV9ldmFsdWF0ZVZhcmlhYmxlU3RyaW5nKGUpe2NvbnN0IG49L1wkeyguKj8pfS9nO2xldCByPXRoaXMuX3ZhbHVlLGk9bi5leGVjKHIpO2Zvcig7aSE9PW51bGw7KXtjb25zdCBvPWlbMF0scz1pWzFdO2xldCB1PWU9PW51bGw/dm9pZCAwOmUucHJvcGVydGllc1tzXTt0eXBlb2YgdT4idSImJih1PSIiKSxyPXIucmVwbGFjZShvLHUpLGk9bi5leGVjKHIpfXJldHVybiByfV9ldmFsdWF0ZVZhcmlhYmxlKGUpe2xldCBuO3JldHVybiBlJiZTdHJpbmcodGhpcy5fdmFsdWUpaW4gZS5wcm9wZXJ0aWVzP249ZS5wcm9wZXJ0aWVzW1N0cmluZyh0aGlzLl92YWx1ZSldOlN0cmluZyh0aGlzLl92YWx1ZSk9PT0iaWQiP249ZT09bnVsbD92b2lkIDA6ZS5pZDplJiZTdHJpbmcodGhpcy5fdmFsdWUpPT09InJvb3RQcm9wZXJ0aWVzIiYmKG49ZS5wcm9wZXJ0aWVzKSx0eXBlb2Ygbj4idSImJihuPSIiKSxufV9ldmFsdWF0ZU1lbWJlckRvdChlKXtpZihtaSh0aGlzLl9sZWZ0KSlyZXR1cm4gZT09bnVsbD92b2lkIDA6ZS5wcm9wZXJ0aWVzW3RoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpXTtjb25zdCBuPXRoaXMuX2xlZnQuZXZhbHVhdGUoZSk7aWYodHlwZW9mIG4+InUiKXJldHVybjtjb25zdCByPXRoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpO3JldHVybiBuW3JdfV9ldmFsdWF0ZU1lbWJlckJyYWNrZXRzKGUpe2lmKG1pKHRoaXMuX2xlZnQpKXJldHVybiBlPT1udWxsP3ZvaWQgMDplLnByb3BlcnRpZXNbdGhpcy5fcmlnaHQuZXZhbHVhdGUoZSldO2NvbnN0IG49dGhpcy5fbGVmdC5ldmFsdWF0ZShlKTtpZih0eXBlb2Ygbj4idSIpcmV0dXJuO2NvbnN0IHI9dGhpcy5fcmlnaHQuZXZhbHVhdGUoZSk7cmV0dXJuIG5bcl19X2V2YWx1YXRlQXJyYXkoZSl7Y29uc3Qgbj1bXTtmb3IobGV0IHI9MDtyPHRoaXMuX3ZhbHVlLmxlbmd0aDtyKyspbltyXT10aGlzLl92YWx1ZVtyXS5ldmFsdWF0ZShlKTtyZXR1cm4gbn1fZXZhbHVhdGVOb3QoZSl7Y29uc3Qgbj10aGlzLl9sZWZ0LmV2YWx1YXRlKGUpO2lmKHR5cGVvZiBuIT0iYm9vbGVhbiIpdGhyb3cgbmV3IEVycm9yKGBPcGVyYXRvciAiISIgcmVxdWlyZXMgYSBib29sZWFuIGFyZ3VtZW50LiBBcmd1bWVudCBpcyAke259LmApO3JldHVybiFufV9ldmFsdWF0ZU5lZ2F0aXZlKGUpe2NvbnN0IG49dGhpcy5fbGVmdC5ldmFsdWF0ZShlKTtpZih0eXBlb2Ygbj09Im51bWJlciIpcmV0dXJuLW47dGhyb3cgbmV3IEVycm9yKGBPcGVyYXRvciAiLSIgcmVxdWlyZXMgYSB2ZWN0b3Igb3IgbnVtYmVyIGFyZ3VtZW50LiBBcmd1bWVudCBpcyAke259LmApfV9ldmFsdWF0ZVBvc2l0aXZlKGUpe2NvbnN0IG49dGhpcy5fbGVmdC5ldmFsdWF0ZShlKTtpZih0eXBlb2YgbiE9Im51bWJlciIpdGhyb3cgbmV3IEVycm9yKGBPcGVyYXRvciAiKyIgcmVxdWlyZXMgYSB2ZWN0b3Igb3IgbnVtYmVyIGFyZ3VtZW50LiBBcmd1bWVudCBpcyAke259LmApO3JldHVybiBufV9ldmFsdWF0ZUxlc3NUaGFuKGUpe2NvbnN0IG49dGhpcy5fbGVmdC5ldmFsdWF0ZShlKSxyPXRoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpO3JldHVybiB0eXBlb2YgbiE9Im51bWJlciJ8fHR5cGVvZiByIT0ibnVtYmVyIj8oY29uc29sZS53YXJuKGBPcGVyYXRvciAiPCIgcmVxdWlyZXMgbnVtYmVyIGFyZ3VtZW50cy4gQXJndW1lbnRzIGFyZSAke259IGFuZCAke3J9LmApLCExKTpuPHJ9X2V2YWx1YXRlTGVzc1RoYW5PckVxdWFscyhlKXtjb25zdCBuPXRoaXMuX2xlZnQuZXZhbHVhdGUoZSkscj10aGlzLl9yaWdodC5ldmFsdWF0ZShlKTtyZXR1cm4gdHlwZW9mIG4hPSJudW1iZXIifHx0eXBlb2YgciE9Im51bWJlciI/KGNvbnNvbGUud2FybihgT3BlcmF0b3IgIjw9IiByZXF1aXJlcyBudW1iZXIgYXJndW1lbnRzLiBBcmd1bWVudHMgYXJlICR7bn0gYW5kICR7cn0uYCksITEpOm48PXJ9X2V2YWx1YXRlR3JlYXRlclRoYW4oZSl7Y29uc3Qgbj10aGlzLl9sZWZ0LmV2YWx1YXRlKGUpLHI9dGhpcy5fcmlnaHQuZXZhbHVhdGUoZSk7cmV0dXJuIHR5cGVvZiBuIT0ibnVtYmVyInx8dHlwZW9mIHIhPSJudW1iZXIiPyhjb25zb2xlLndhcm4oYE9wZXJhdG9yICI+IiByZXF1aXJlcyBudW1iZXIgYXJndW1lbnRzLiBBcmd1bWVudHMgYXJlICR7bn0gYW5kICR7cn0uYCksITEpOm4+cn1fZXZhbHVhdGVHcmVhdGVyVGhhbk9yRXF1YWxzKGUpe2NvbnN0IG49dGhpcy5fbGVmdC5ldmFsdWF0ZShlKSxyPXRoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpO3JldHVybiB0eXBlb2YgbiE9Im51bWJlciJ8fHR5cGVvZiByIT0ibnVtYmVyIj8oY29uc29sZS53YXJuKGBPcGVyYXRvciAiPj0iIHJlcXVpcmVzIG51bWJlciBhcmd1bWVudHMuIEFyZ3VtZW50cyBhcmUgJHtufSBhbmQgJHtyfS5gKSwhMSk6bj49cn1fZXZhbHVhdGVPcihlKXtjb25zdCBuPXRoaXMuX2xlZnQuZXZhbHVhdGUoZSk7aWYodHlwZW9mIG4hPSJib29sZWFuIilyZXR1cm4gY29uc29sZS53YXJuKGBPcGVyYXRvciAifHwiIHJlcXVpcmVzIGJvb2xlYW4gYXJndW1lbnRzLiBGaXJzdCBhcmd1bWVudCBpcyAke259LmApLCExO2lmKG4pcmV0dXJuITA7Y29uc3Qgcj10aGlzLl9yaWdodC5ldmFsdWF0ZShlKTtyZXR1cm4gdHlwZW9mIHIhPSJib29sZWFuIj8oY29uc29sZS53YXJuKGBPcGVyYXRvciAifHwiIHJlcXVpcmVzIGJvb2xlYW4gYXJndW1lbnRzLiBTZWNvbmQgYXJndW1lbnQgaXMgJHtyfS5gKSwhMSk6bnx8cn1fZXZhbHVhdGVBbmQoZSl7Y29uc3Qgbj10aGlzLl9sZWZ0LmV2YWx1YXRlKGUpO2lmKHR5cGVvZiBuIT0iYm9vbGVhbiIpcmV0dXJuIGNvbnNvbGUud2FybihgT3BlcmF0b3IgIiYmIiByZXF1aXJlcyBib29sZWFuIGFyZ3VtZW50cy4gRmlyc3QgYXJndW1lbnQgaXMgJHtufS5gKSwhMTtpZighbilyZXR1cm4hMTtjb25zdCByPXRoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpO3JldHVybiB0eXBlb2YgciE9ImJvb2xlYW4iPyhjb25zb2xlLndhcm4oYE9wZXJhdG9yICImJiIgcmVxdWlyZXMgYm9vbGVhbiBhcmd1bWVudHMuIFNlY29uZCBhcmd1bWVudCBpcyAke3J9LmApLCExKTpuJiZyfV9ldmFsdWF0ZVBsdXMoZSl7Y29uc3Qgbj10aGlzLl9sZWZ0LmV2YWx1YXRlKGUpLHI9dGhpcy5fcmlnaHQuZXZhbHVhdGUoZSk7aWYodHlwZW9mIG49PSJudW1iZXIiJiZ0eXBlb2Ygcj09Im51bWJlciIpcmV0dXJuIG4rcjt0aHJvdyBuZXcgRXJyb3IoYE9wZXJhdG9yICIrIiByZXF1aXJlcyB2ZWN0b3Igb3IgbnVtYmVyIGFyZ3VtZW50cyBvZiBtYXRjaGluZyB0eXBlcywgb3IgYXQgbGVhc3Qgb25lIHN0cmluZyBhcmd1bWVudC4gQXJndW1lbnRzIGFyZSAke259IGFuZCAke3J9LmApfV9ldmFsdWF0ZU1pbnVzKGUpe2NvbnN0IG49dGhpcy5fbGVmdC5ldmFsdWF0ZShlKSxyPXRoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpO2lmKHR5cGVvZiBuPT0ibnVtYmVyIiYmdHlwZW9mIHI9PSJudW1iZXIiKXJldHVybiBuLXI7dGhyb3cgbmV3IEVycm9yKGBPcGVyYXRvciAiLSIgcmVxdWlyZXMgdmVjdG9yIG9yIG51bWJlciBhcmd1bWVudHMgb2YgbWF0Y2hpbmcgdHlwZXMuIEFyZ3VtZW50cyBhcmUgJHtufSBhbmQgJHtyfS5gKX1fZXZhbHVhdGVUaW1lcyhlKXtjb25zdCBuPXRoaXMuX2xlZnQuZXZhbHVhdGUoZSkscj10aGlzLl9yaWdodC5ldmFsdWF0ZShlKTtpZih0eXBlb2Ygbj09Im51bWJlciImJnR5cGVvZiByPT0ibnVtYmVyIilyZXR1cm4gbipyO3Rocm93IG5ldyBFcnJvcihgT3BlcmF0b3IgIioiIHJlcXVpcmVzIHZlY3RvciBvciBudW1iZXIgYXJndW1lbnRzLiBJZiBib3RoIGFyZ3VtZW50cyBhcmUgdmVjdG9ycyB0aGV5IG11c3QgYmUgbWF0Y2hpbmcgdHlwZXMuIEFyZ3VtZW50cyBhcmUgJHtufSBhbmQgJHtyfS5gKX1fZXZhbHVhdGVEaXZpZGUoZSl7Y29uc3Qgbj10aGlzLl9sZWZ0LmV2YWx1YXRlKGUpLHI9dGhpcy5fcmlnaHQuZXZhbHVhdGUoZSk7aWYodHlwZW9mIG49PSJudW1iZXIiJiZ0eXBlb2Ygcj09Im51bWJlciIpcmV0dXJuIG4vcjt0aHJvdyBuZXcgRXJyb3IoYE9wZXJhdG9yICIvIiByZXF1aXJlcyB2ZWN0b3Igb3IgbnVtYmVyIGFyZ3VtZW50cyBvZiBtYXRjaGluZyB0eXBlcywgb3IgYSBudW1iZXIgYXMgdGhlIHNlY29uZCBhcmd1bWVudC4gQXJndW1lbnRzIGFyZSAke259IGFuZCAke3J9LmApfV9ldmFsdWF0ZU1vZChlKXtjb25zdCBuPXRoaXMuX2xlZnQuZXZhbHVhdGUoZSkscj10aGlzLl9yaWdodC5ldmFsdWF0ZShlKTtpZih0eXBlb2Ygbj09Im51bWJlciImJnR5cGVvZiByPT0ibnVtYmVyIilyZXR1cm4gbiVyO3Rocm93IG5ldyBFcnJvcihgT3BlcmF0b3IgIiUiIHJlcXVpcmVzIHZlY3RvciBvciBudW1iZXIgYXJndW1lbnRzIG9mIG1hdGNoaW5nIHR5cGVzLiBBcmd1bWVudHMgYXJlICR7bn0gYW5kICR7cn0uYCl9X2V2YWx1YXRlRXF1YWxzU3RyaWN0KGUpe2NvbnN0IG49dGhpcy5fbGVmdC5ldmFsdWF0ZShlKSxyPXRoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpO3JldHVybiBuPT09cn1fZXZhbHVhdGVOb3RFcXVhbHNTdHJpY3QoZSl7Y29uc3Qgbj10aGlzLl9sZWZ0LmV2YWx1YXRlKGUpLHI9dGhpcy5fcmlnaHQuZXZhbHVhdGUoZSk7cmV0dXJuIG4hPT1yfV9ldmFsdWF0ZUNvbmRpdGlvbmFsKGUpe2NvbnN0IG49dGhpcy5fdGVzdC5ldmFsdWF0ZShlKTtpZih0eXBlb2YgbiE9ImJvb2xlYW4iKXRocm93IG5ldyBFcnJvcihgQ29uZGl0aW9uYWwgYXJndW1lbnQgb2YgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBtdXN0IGJlIGEgYm9vbGVhbi4gQXJndW1lbnQgaXMgJHtufS5gKTtyZXR1cm4gbj90aGlzLl9sZWZ0LmV2YWx1YXRlKGUpOnRoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpfV9ldmFsdWF0ZU5hTihlKXtyZXR1cm4gaXNOYU4odGhpcy5fbGVmdC5ldmFsdWF0ZShlKSl9X2V2YWx1YXRlSXNGaW5pdGUoZSl7cmV0dXJuIGlzRmluaXRlKHRoaXMuX2xlZnQuZXZhbHVhdGUoZSkpfV9ldmFsdWF0ZUJvb2xlYW5Db252ZXJzaW9uKGUpe3JldHVybiBCb29sZWFuKHRoaXMuX2xlZnQuZXZhbHVhdGUoZSkpfV9ldmFsdWF0ZU51bWJlckNvbnZlcnNpb24oZSl7Y29uc3Qgbj1kZih0aGlzLl9sZWZ0LmV2YWx1YXRlKGUpKTtyZXR1cm4gTnVtYmVyKG4pfV9ldmFsdWF0ZVN0cmluZ0NvbnZlcnNpb24oZSl7cmV0dXJuIFN0cmluZyh0aGlzLl9sZWZ0LmV2YWx1YXRlKGUpKX1fZXZhbHVhdGVUb1N0cmluZyhlKXtjb25zdCBuPXRoaXMuX2xlZnQuZXZhbHVhdGUoZSk7aWYobiBpbnN0YW5jZW9mIFJlZ0V4cClyZXR1cm4gU3RyaW5nKG4pO3Rocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBmdW5jdGlvbiBjYWxsICIke3RoaXMuX3ZhbHVlfSIuYCl9X2V2YWx1YXRlTGl0ZXJhbENvbG9yKGUpe2NvbnN0IG49dGhpcy5fbGVmdDtsZXQgcj1uZXcgSjtpZih0aGlzLl92YWx1ZT09PSJjb2xvciIpaWYodHlwZW9mIG4+InUiKXI9Si5mcm9tQnl0ZXMoMjU1LDI1NSwyNTUsMjU1KTtlbHNlIGlmKG4ubGVuZ3RoPjEpe2NvbnN0IGk9Si5mcm9tQ3NzQ29sb3JTdHJpbmcoblswXS5ldmFsdWF0ZShlKSk7aWYoaSlyPWk7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoYHdyb25nIGxpdGVyYWxDb2xvciBjYWxsICIke3RoaXMuX3ZhbHVlfSwgJHtufX0iYCk7ci5hbHBoYT1uWzFdLmV2YWx1YXRlKGUpfWVsc2V7Y29uc3QgaT1KLmZyb21Dc3NDb2xvclN0cmluZyhuWzBdLmV2YWx1YXRlKGUpKTtpZihpKXI9aTtlbHNlIHRocm93IG5ldyBFcnJvcihgd3JvbmcgbGl0ZXJhbENvbG9yIGNhbGwgIiR7dGhpcy5fdmFsdWV9LCAke259fSJgKX1lbHNlIGlmKHRoaXMuX3ZhbHVlPT09InJnYiIpcj1KLmZyb21CeXRlcyhuWzBdLmV2YWx1YXRlKGUpLG5bMV0uZXZhbHVhdGUoZSksblsyXS5ldmFsdWF0ZShlKSwyNTUpO2Vsc2UgaWYodGhpcy5fdmFsdWU9PT0icmdiYSIpe2NvbnN0IGk9blszXS5ldmFsdWF0ZShlKSoyNTU7cj1KLmZyb21CeXRlcyhuWzBdLmV2YWx1YXRlKGUpLG5bMV0uZXZhbHVhdGUoZSksblsyXS5ldmFsdWF0ZShlKSxpKX1lbHNlIGlmKHRoaXMuX3ZhbHVlPT09ImhzbCIpe2NvbnN0IGk9Si5mcm9tSHNsKG5bMF0uZXZhbHVhdGUoZSksblsxXS5ldmFsdWF0ZShlKSxuWzJdLmV2YWx1YXRlKGUpLDEpO2kmJihyPWkpfWVsc2UgaWYodGhpcy5fdmFsdWU9PT0iaHNsYSIpe2NvbnN0IGk9Si5mcm9tSHNsKG5bMF0uZXZhbHVhdGUoZSksblsxXS5ldmFsdWF0ZShlKSxuWzJdLmV2YWx1YXRlKGUpLG5bM10uZXZhbHVhdGUoZSkpO2kmJihyPWkpfXJldHVybiByLnRvQ3NzSGV4U3RyaW5nKCl9X2V2YWx1YXRlRXF1YWxzKGUpe2NvbnN0IG49dGhpcy5fbGVmdC5ldmFsdWF0ZShlKSxyPXRoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpO3JldHVybiBGdChuKSYmIUZ0KHIpP24uaW5jbHVkZXMocik6RnQocikmJiFGdChuKT9yLmluY2x1ZGVzKG4pOihGdChyKSYmRnQobikmJmNvbnNvbGUuZXJyb3IoIkVxdWFscyBsZWZ0IGFuZCByaWdodCBib3RoIGNhbid0IGJlIGFycmF5IGF0IHRoZSBzYW1lIHRpbWUiKSxuPT1yKX1fZXZhbHVhdGVOb3RFcXVhbHMoZSl7Y29uc3Qgbj10aGlzLl9sZWZ0LmV2YWx1YXRlKGUpLHI9dGhpcy5fcmlnaHQuZXZhbHVhdGUoZSk7cmV0dXJuIEZ0KG4pJiYhRnQocik/IW4uaW5jbHVkZXMocik6RnQocikmJiFGdChuKT8hci5pbmNsdWRlcyhuKTooRnQocikmJkZ0KG4pJiZjb25zb2xlLmVycm9yKCJOb3RFcXVhbHMgbGVmdCBhbmQgcmlnaHQgYm90aCBjYW4ndCBiZSBhcnJheSBhdCB0aGUgc2FtZSB0aW1lIiksbiE9cil9fWZ1bmN0aW9uIGRmKHQpe2lmKHR5cGVvZiB0IT0ic3RyaW5nIilyZXR1cm4gdDtjb25zdCBlPVsiJSJdO2Zvcihjb25zdCBuIG9mIGUpaWYodC5lbmRzV2l0aChuKSlyZXR1cm4gdC5zbGljZSgwLC1uLmxlbmd0aCkudHJpbSgpO3JldHVybiB0LnRyaW0oKX1mdW5jdGlvbiBtaSh0KXtyZXR1cm4gdC5fdmFsdWU9PT0iZmVhdHVyZSJ9ZnVuY3Rpb24gRnQodCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCl9ZnVuY3Rpb24gRWYodCxlLG4pe3JldHVybiBlPVVlKGUpLFJmKHQsWm4oKT9SZWZsZWN0LmNvbnN0cnVjdChlLG58fFtdLFVlKHQpLmNvbnN0cnVjdG9yKTplLmFwcGx5KHQsbikpfWZ1bmN0aW9uIEZpKHQsZSxuKXtpZihabigpKXJldHVybiBSZWZsZWN0LmNvbnN0cnVjdC5hcHBseShudWxsLGFyZ3VtZW50cyk7dmFyIHI9W251bGxdO3IucHVzaC5hcHBseShyLGUpO3ZhciBpPW5ldyh0LmJpbmQuYXBwbHkodCxyKSk7cmV0dXJuIG4mJmplKGksbi5wcm90b3R5cGUpLGl9ZnVuY3Rpb24gWm4oKXt0cnl7dmFyIHQ9IUJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLFtdLGZ1bmN0aW9uKCl7fSkpfWNhdGNoe31yZXR1cm4oWm49ZnVuY3Rpb24oKXtyZXR1cm4hIXR9KSgpfWZ1bmN0aW9uIF9mKHQsZSl7aWYodHlwZW9mIHQhPSJvYmplY3QifHwhdClyZXR1cm4gdDt2YXIgbj10W1N5bWJvbC50b1ByaW1pdGl2ZV07aWYobiE9PXZvaWQgMCl7dmFyIHI9bi5jYWxsKHQsZXx8ImRlZmF1bHQiKTtpZih0eXBlb2YgciE9Im9iamVjdCIpcmV0dXJuIHI7dGhyb3cgbmV3IFR5cGVFcnJvcigiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS4iKX1yZXR1cm4oZT09PSJzdHJpbmciP1N0cmluZzpOdW1iZXIpKHQpfWZ1bmN0aW9uIHBmKHQpe3ZhciBlPV9mKHQsInN0cmluZyIpO3JldHVybiB0eXBlb2YgZT09InN5bWJvbCI/ZTpTdHJpbmcoZSl9ZnVuY3Rpb24gR3QodCl7cmV0dXJuIEd0PXR5cGVvZiBTeW1ib2w9PSJmdW5jdGlvbiImJnR5cGVvZiBTeW1ib2wuaXRlcmF0b3I9PSJzeW1ib2wiP2Z1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZX06ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJnR5cGVvZiBTeW1ib2w9PSJmdW5jdGlvbiImJmUuY29uc3RydWN0b3I9PT1TeW1ib2wmJmUhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiBlfSxHdCh0KX1mdW5jdGlvbiB3aSh0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIElpKHQsZSl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciByPWVbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxwZihyLmtleSkscil9fWZ1bmN0aW9uIE5pKHQsZSxuKXtyZXR1cm4gZSYmSWkodC5wcm90b3R5cGUsZSksbiYmSWkodCxuKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCwicHJvdG90eXBlIix7d3JpdGFibGU6ITF9KSx0fWZ1bmN0aW9uIHlmKHQsZSl7aWYodHlwZW9mIGUhPSJmdW5jdGlvbiImJmUhPT1udWxsKXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uIik7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlJiZlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJwcm90b3R5cGUiLHt3cml0YWJsZTohMX0pLGUmJmplKHQsZSl9ZnVuY3Rpb24gVWUodCl7cmV0dXJuIFVlPU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3QuZ2V0UHJvdG90eXBlT2YuYmluZCgpOmZ1bmN0aW9uKG4pe3JldHVybiBuLl9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKG4pfSxVZSh0KX1mdW5jdGlvbiBqZSh0LGUpe3JldHVybiBqZT1PYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mLmJpbmQoKTpmdW5jdGlvbihyLGkpe3JldHVybiByLl9fcHJvdG9fXz1pLHJ9LGplKHQsZSl9ZnVuY3Rpb24gQWYodCl7dHJ5e3JldHVybiBGdW5jdGlvbi50b1N0cmluZy5jYWxsKHQpLmluZGV4T2YoIltuYXRpdmUgY29kZV0iKSE9PS0xfWNhdGNoe3JldHVybiB0eXBlb2YgdD09ImZ1bmN0aW9uIn19ZnVuY3Rpb24gUW4odCl7dmFyIGU9dHlwZW9mIE1hcD09ImZ1bmN0aW9uIj9uZXcgTWFwOnZvaWQgMDtyZXR1cm4gUW49ZnVuY3Rpb24ocil7aWYocj09PW51bGx8fCFBZihyKSlyZXR1cm4gcjtpZih0eXBlb2YgciE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpO2lmKHR5cGVvZiBlPCJ1Iil7aWYoZS5oYXMocikpcmV0dXJuIGUuZ2V0KHIpO2Uuc2V0KHIsaSl9ZnVuY3Rpb24gaSgpe3JldHVybiBGaShyLGFyZ3VtZW50cyxVZSh0aGlzKS5jb25zdHJ1Y3Rvcil9cmV0dXJuIGkucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoci5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTppLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLGplKGkscil9LFFuKHQpfWZ1bmN0aW9uIFRmKHQpe2lmKHQ9PT12b2lkIDApdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4gdH1mdW5jdGlvbiBSZih0LGUpe2lmKGUmJih0eXBlb2YgZT09Im9iamVjdCJ8fHR5cGVvZiBlPT0iZnVuY3Rpb24iKSlyZXR1cm4gZTtpZihlIT09dm9pZCAwKXRocm93IG5ldyBUeXBlRXJyb3IoIkRlcml2ZWQgY29uc3RydWN0b3JzIG1heSBvbmx5IHJldHVybiBvYmplY3Qgb3IgdW5kZWZpbmVkIik7cmV0dXJuIFRmKHQpfWZ1bmN0aW9uIHhmKHQpe3JldHVybiBPZih0KXx8YmYodCl8fE1pKHQpfHxnZigpfWZ1bmN0aW9uIE9mKHQpe2lmKEFycmF5LmlzQXJyYXkodCkpcmV0dXJuIEpuKHQpfWZ1bmN0aW9uIGJmKHQpe2lmKHR5cGVvZiBTeW1ib2w8InUiJiZ0W1N5bWJvbC5pdGVyYXRvcl0hPW51bGx8fHRbIkBAaXRlcmF0b3IiXSE9bnVsbClyZXR1cm4gQXJyYXkuZnJvbSh0KX1mdW5jdGlvbiBNaSh0LGUpe2lmKHQpe2lmKHR5cGVvZiB0PT0ic3RyaW5nIilyZXR1cm4gSm4odCxlKTt2YXIgbj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkuc2xpY2UoOCwtMSk7aWYobj09PSJPYmplY3QiJiZ0LmNvbnN0cnVjdG9yJiYobj10LmNvbnN0cnVjdG9yLm5hbWUpLG49PT0iTWFwInx8bj09PSJTZXQiKXJldHVybiBBcnJheS5mcm9tKHQpO2lmKG49PT0iQXJndW1lbnRzInx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpcmV0dXJuIEpuKHQsZSl9fWZ1bmN0aW9uIEpuKHQsZSl7KGU9PW51bGx8fGU+dC5sZW5ndGgpJiYoZT10Lmxlbmd0aCk7Zm9yKHZhciBuPTAscj1uZXcgQXJyYXkoZSk7bjxlO24rKylyW25dPXRbbl07cmV0dXJuIHJ9ZnVuY3Rpb24gZ2YoKXt0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS4KSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLmApfWZ1bmN0aW9uIFNmKHQsZSl7dmFyIG49dHlwZW9mIFN5bWJvbDwidSImJnRbU3ltYm9sLml0ZXJhdG9yXXx8dFsiQEBpdGVyYXRvciJdO2lmKCFuKXtpZihBcnJheS5pc0FycmF5KHQpfHwobj1NaSh0KSl8fGUmJnQmJnR5cGVvZiB0Lmxlbmd0aD09Im51bWJlciIpe24mJih0PW4pO3ZhciByPTAsaT1mdW5jdGlvbigpe307cmV0dXJue3M6aSxuOmZ1bmN0aW9uKCl7cmV0dXJuIHI+PXQubGVuZ3RoP3tkb25lOiEwfTp7ZG9uZTohMSx2YWx1ZTp0W3IrK119fSxlOmZ1bmN0aW9uKGEpe3Rocm93IGF9LGY6aX19dGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLgpJbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuYCl9dmFyIG89ITAscz0hMSx1O3JldHVybntzOmZ1bmN0aW9uKCl7bj1uLmNhbGwodCl9LG46ZnVuY3Rpb24oKXt2YXIgYT1uLm5leHQoKTtyZXR1cm4gbz1hLmRvbmUsYX0sZTpmdW5jdGlvbihhKXtzPSEwLHU9YX0sZjpmdW5jdGlvbigpe3RyeXshbyYmbi5yZXR1cm4hPW51bGwmJm4ucmV0dXJuKCl9ZmluYWxseXtpZihzKXRocm93IHV9fX19dmFyIFR0PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gWnQodCxlKXtyZXR1cm4gdD10LnNsaWNlKCksdC5wdXNoKGUpLHR9ZnVuY3Rpb24gdHIodCxlKXtyZXR1cm4gZT1lLnNsaWNlKCksZS51bnNoaWZ0KHQpLGV9dmFyIG1mPWZ1bmN0aW9uKHQpe3lmKGUsdCk7ZnVuY3Rpb24gZShuKXt2YXIgcjtyZXR1cm4gd2kodGhpcyxlKSxyPUVmKHRoaXMsZSxbJ0pTT05QYXRoIHNob3VsZCBub3QgYmUgY2FsbGVkIHdpdGggIm5ldyIgKGl0IHByZXZlbnRzIHJldHVybiBvZiAodW53cmFwcGVkKSBzY2FsYXIgdmFsdWVzKSddKSxyLmF2b2lkTmV3PSEwLHIudmFsdWU9bixyLm5hbWU9Ik5ld0Vycm9yIixyfXJldHVybiBOaShlKX0oUW4oRXJyb3IpKTtmdW5jdGlvbiBxKHQsZSxuLHIsaSl7aWYoISh0aGlzIGluc3RhbmNlb2YgcSkpdHJ5e3JldHVybiBuZXcgcSh0LGUsbixyLGkpfWNhdGNoKGEpe2lmKCFhLmF2b2lkTmV3KXRocm93IGE7cmV0dXJuIGEudmFsdWV9dHlwZW9mIHQ9PSJzdHJpbmciJiYoaT1yLHI9bixuPWUsZT10LHQ9bnVsbCk7dmFyIG89dCYmR3QodCk9PT0ib2JqZWN0IjtpZih0PXR8fHt9LHRoaXMuanNvbj10Lmpzb258fG4sdGhpcy5wYXRoPXQucGF0aHx8ZSx0aGlzLnJlc3VsdFR5cGU9dC5yZXN1bHRUeXBlfHwidmFsdWUiLHRoaXMuZmxhdHRlbj10LmZsYXR0ZW58fCExLHRoaXMud3JhcD1UdC5jYWxsKHQsIndyYXAiKT90LndyYXA6ITAsdGhpcy5zYW5kYm94PXQuc2FuZGJveHx8e30sdGhpcy5wcmV2ZW50RXZhbD10LnByZXZlbnRFdmFsfHwhMSx0aGlzLnBhcmVudD10LnBhcmVudHx8bnVsbCx0aGlzLnBhcmVudFByb3BlcnR5PXQucGFyZW50UHJvcGVydHl8fG51bGwsdGhpcy5jYWxsYmFjaz10LmNhbGxiYWNrfHxyfHxudWxsLHRoaXMub3RoZXJUeXBlQ2FsbGJhY2s9dC5vdGhlclR5cGVDYWxsYmFja3x8aXx8ZnVuY3Rpb24oKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJZb3UgbXVzdCBzdXBwbHkgYW4gb3RoZXJUeXBlQ2FsbGJhY2sgY2FsbGJhY2sgb3B0aW9uIHdpdGggdGhlIEBvdGhlcigpIG9wZXJhdG9yLiIpfSx0LmF1dG9zdGFydCE9PSExKXt2YXIgcz17cGF0aDpvP3QucGF0aDplfTtvPyJqc29uImluIHQmJihzLmpzb249dC5qc29uKTpzLmpzb249bjt2YXIgdT10aGlzLmV2YWx1YXRlKHMpO2lmKCF1fHxHdCh1KSE9PSJvYmplY3QiKXRocm93IG5ldyBtZih1KTtyZXR1cm4gdX19cS5wcm90b3R5cGUuZXZhbHVhdGU9ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9dGhpcyxvPXRoaXMucGFyZW50LHM9dGhpcy5wYXJlbnRQcm9wZXJ0eSx1PXRoaXMuZmxhdHRlbixhPXRoaXMud3JhcDtpZih0aGlzLmN1cnJSZXN1bHRUeXBlPXRoaXMucmVzdWx0VHlwZSx0aGlzLmN1cnJQcmV2ZW50RXZhbD10aGlzLnByZXZlbnRFdmFsLHRoaXMuY3VyclNhbmRib3g9dGhpcy5zYW5kYm94LG49bnx8dGhpcy5jYWxsYmFjayx0aGlzLmN1cnJPdGhlclR5cGVDYWxsYmFjaz1yfHx0aGlzLm90aGVyVHlwZUNhbGxiYWNrLGU9ZXx8dGhpcy5qc29uLHQ9dHx8dGhpcy5wYXRoLHQmJkd0KHQpPT09Im9iamVjdCImJiFBcnJheS5pc0FycmF5KHQpKXtpZighdC5wYXRoJiZ0LnBhdGghPT0iIil0aHJvdyBuZXcgVHlwZUVycm9yKCdZb3UgbXVzdCBzdXBwbHkgYSAicGF0aCIgcHJvcGVydHkgd2hlbiBwcm92aWRpbmcgYW4gb2JqZWN0IGFyZ3VtZW50IHRvIEpTT05QYXRoLmV2YWx1YXRlKCkuJyk7aWYoIVR0LmNhbGwodCwianNvbiIpKXRocm93IG5ldyBUeXBlRXJyb3IoJ1lvdSBtdXN0IHN1cHBseSBhICJqc29uIiBwcm9wZXJ0eSB3aGVuIHByb3ZpZGluZyBhbiBvYmplY3QgYXJndW1lbnQgdG8gSlNPTlBhdGguZXZhbHVhdGUoKS4nKTt2YXIgbD10O2U9bC5qc29uLHU9VHQuY2FsbCh0LCJmbGF0dGVuIik/dC5mbGF0dGVuOnUsdGhpcy5jdXJyUmVzdWx0VHlwZT1UdC5jYWxsKHQsInJlc3VsdFR5cGUiKT90LnJlc3VsdFR5cGU6dGhpcy5jdXJyUmVzdWx0VHlwZSx0aGlzLmN1cnJTYW5kYm94PVR0LmNhbGwodCwic2FuZGJveCIpP3Quc2FuZGJveDp0aGlzLmN1cnJTYW5kYm94LGE9VHQuY2FsbCh0LCJ3cmFwIik/dC53cmFwOmEsdGhpcy5jdXJyUHJldmVudEV2YWw9VHQuY2FsbCh0LCJwcmV2ZW50RXZhbCIpP3QucHJldmVudEV2YWw6dGhpcy5jdXJyUHJldmVudEV2YWwsbj1UdC5jYWxsKHQsImNhbGxiYWNrIik/dC5jYWxsYmFjazpuLHRoaXMuY3Vyck90aGVyVHlwZUNhbGxiYWNrPVR0LmNhbGwodCwib3RoZXJUeXBlQ2FsbGJhY2siKT90Lm90aGVyVHlwZUNhbGxiYWNrOnRoaXMuY3Vyck90aGVyVHlwZUNhbGxiYWNrLG89VHQuY2FsbCh0LCJwYXJlbnQiKT90LnBhcmVudDpvLHM9VHQuY2FsbCh0LCJwYXJlbnRQcm9wZXJ0eSIpP3QucGFyZW50UHJvcGVydHk6cyx0PXQucGF0aH1pZihvPW98fG51bGwscz1zfHxudWxsLEFycmF5LmlzQXJyYXkodCkmJih0PXEudG9QYXRoU3RyaW5nKHQpKSwhKCF0JiZ0IT09IiJ8fCFlKSl7dmFyIGQ9cS50b1BhdGhBcnJheSh0KTtkWzBdPT09IiQiJiZkLmxlbmd0aD4xJiZkLnNoaWZ0KCksdGhpcy5faGFzUGFyZW50U2VsZWN0b3I9bnVsbDt2YXIgXz10aGlzLl90cmFjZShkLGUsWyIkIl0sbyxzLG4pLmZpbHRlcihmdW5jdGlvbihPKXtyZXR1cm4gTyYmIU8uaXNQYXJlbnRTZWxlY3Rvcn0pO3JldHVybiBfLmxlbmd0aD8hYSYmXy5sZW5ndGg9PT0xJiYhX1swXS5oYXNBcnJFeHByP3RoaXMuX2dldFByZWZlcnJlZE91dHB1dChfWzBdKTpfLnJlZHVjZShmdW5jdGlvbihPLGIpe3ZhciBGPWkuX2dldFByZWZlcnJlZE91dHB1dChiKTtyZXR1cm4gdSYmQXJyYXkuaXNBcnJheShGKT9PPU8uY29uY2F0KEYpOk8ucHVzaChGKSxPfSxbXSk6YT9bXTp2b2lkIDB9fSxxLnByb3RvdHlwZS5fZ2V0UHJlZmVycmVkT3V0cHV0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuY3VyclJlc3VsdFR5cGU7c3dpdGNoKGUpe2Nhc2UiYWxsIjp7dmFyIG49QXJyYXkuaXNBcnJheSh0LnBhdGgpP3QucGF0aDpxLnRvUGF0aEFycmF5KHQucGF0aCk7cmV0dXJuIHQucG9pbnRlcj1xLnRvUG9pbnRlcihuKSx0LnBhdGg9dHlwZW9mIHQucGF0aD09InN0cmluZyI/dC5wYXRoOnEudG9QYXRoU3RyaW5nKHQucGF0aCksdH1jYXNlInZhbHVlIjpjYXNlInBhcmVudCI6Y2FzZSJwYXJlbnRQcm9wZXJ0eSI6cmV0dXJuIHRbZV07Y2FzZSJwYXRoIjpyZXR1cm4gcS50b1BhdGhTdHJpbmcodFtlXSk7Y2FzZSJwb2ludGVyIjpyZXR1cm4gcS50b1BvaW50ZXIodC5wYXRoKTtkZWZhdWx0OnRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gcmVzdWx0IHR5cGUiKX19LHEucHJvdG90eXBlLl9oYW5kbGVDYWxsYmFjaz1mdW5jdGlvbih0LGUsbil7aWYoZSl7dmFyIHI9dGhpcy5fZ2V0UHJlZmVycmVkT3V0cHV0KHQpO3QucGF0aD10eXBlb2YgdC5wYXRoPT0ic3RyaW5nIj90LnBhdGg6cS50b1BhdGhTdHJpbmcodC5wYXRoKSxlKHIsbix0KX19LHEucHJvdG90eXBlLl90cmFjZT1mdW5jdGlvbih0LGUsbixyLGksbyxzLHUpe3ZhciBhPXRoaXMsbDtpZighdC5sZW5ndGgpcmV0dXJuIGw9e3BhdGg6bix2YWx1ZTplLHBhcmVudDpyLHBhcmVudFByb3BlcnR5OmksaGFzQXJyRXhwcjpzfSx0aGlzLl9oYW5kbGVDYWxsYmFjayhsLG8sInZhbHVlIiksbDt2YXIgZD10WzBdLF89dC5zbGljZSgxKSxPPVtdO2Z1bmN0aW9uIGIoRCl7QXJyYXkuaXNBcnJheShEKT9ELmZvckVhY2goZnVuY3Rpb24oeXQpe08ucHVzaCh5dCl9KTpPLnB1c2goRCl9aWYoKHR5cGVvZiBkIT0ic3RyaW5nInx8dSkmJmUmJlR0LmNhbGwoZSxkKSliKHRoaXMuX3RyYWNlKF8sZVtkXSxadChuLGQpLGUsZCxvLHMpKTtlbHNlIGlmKGQ9PT0iKiIpdGhpcy5fd2FsayhlLGZ1bmN0aW9uKEQpe2IoYS5fdHJhY2UoXyxlW0RdLFp0KG4sRCksZSxELG8sITAsITApKX0pO2Vsc2UgaWYoZD09PSIuLiIpYih0aGlzLl90cmFjZShfLGUsbixyLGksbyxzKSksdGhpcy5fd2FsayhlLGZ1bmN0aW9uKEQpe0d0KGVbRF0pPT09Im9iamVjdCImJmIoYS5fdHJhY2UodC5zbGljZSgpLGVbRF0sWnQobixEKSxlLEQsbywhMCkpfSk7ZWxzZXtpZihkPT09Il4iKXJldHVybiB0aGlzLl9oYXNQYXJlbnRTZWxlY3Rvcj0hMCx7cGF0aDpuLnNsaWNlKDAsLTEpLGV4cHI6Xyxpc1BhcmVudFNlbGVjdG9yOiEwfTtpZihkPT09In4iKXJldHVybiBsPXtwYXRoOlp0KG4sZCksdmFsdWU6aSxwYXJlbnQ6cixwYXJlbnRQcm9wZXJ0eTpudWxsfSx0aGlzLl9oYW5kbGVDYWxsYmFjayhsLG8sInByb3BlcnR5IiksbDtpZihkPT09IiQiKWIodGhpcy5fdHJhY2UoXyxlLG4sbnVsbCxudWxsLG8scykpO2Vsc2UgaWYoL14oXHgyRD9bMC05XSopOihceDJEP1swLTldKik6PyhbMC05XSopJC8udGVzdChkKSliKHRoaXMuX3NsaWNlKGQsXyxlLG4scixpLG8pKTtlbHNlIGlmKGQuaW5kZXhPZigiPygiKT09PTApe2lmKHRoaXMuY3VyclByZXZlbnRFdmFsKXRocm93IG5ldyBFcnJvcigiRXZhbCBbPyhleHByKV0gcHJldmVudGVkIGluIEpTT05QYXRoIGV4cHJlc3Npb24uIik7dmFyIEY9ZC5yZXBsYWNlKC9eXD9cKCgoPzpbXDAtXHRceDBCXGZceDBFLVx1MjAyN1x1MjAyQS1cdUQ3RkZcdUUwMDAtXHVGRkZGXXxbXHVEODAwLVx1REJGRl1bXHVEQzAwLVx1REZGRl18W1x1RDgwMC1cdURCRkZdKD8hW1x1REMwMC1cdURGRkZdKXwoPzpbXlx1RDgwMC1cdURCRkZdfF4pW1x1REMwMC1cdURGRkZdKSo/KVwpJC8sIiQxIiksUz0vQCg/OltcMC1cdFx4MEJcZlx4MEUtXHUyMDI3XHUyMDJBLVx1RDdGRlx1RTAwMC1cdUZGRkZdfFtcdUQ4MDAtXHVEQkZGXVtcdURDMDAtXHVERkZGXXxbXHVEODAwLVx1REJGRl0oPyFbXHVEQzAwLVx1REZGRl0pfCg/OlteXHVEODAwLVx1REJGRl18XilbXHVEQzAwLVx1REZGRl0pPygoPzpbXDAtPkAtXHVEN0ZGXHVFMDAwLVx1RkZGRl18W1x1RDgwMC1cdURCRkZdW1x1REMwMC1cdURGRkZdfFtcdUQ4MDAtXHVEQkZGXSg/IVtcdURDMDAtXHVERkZGXSl8KD86W15cdUQ4MDAtXHVEQkZGXXxeKVtcdURDMDAtXHVERkZGXSkqKVsnXFtdKFw/P1woKD86W1wwLVx0XHgwQlxmXHgwRS1cdTIwMjdcdTIwMkEtXHVEN0ZGXHVFMDAwLVx1RkZGRl18W1x1RDgwMC1cdURCRkZdW1x1REMwMC1cdURGRkZdfFtcdUQ4MDAtXHVEQkZGXSg/IVtcdURDMDAtXHVERkZGXSl8KD86W15cdUQ4MDAtXHVEQkZGXXxeKVtcdURDMDAtXHVERkZGXSkqP1wpKSg/ISg/OltcMC1cdFx4MEJcZlx4MEUtXHUyMDI3XHUyMDJBLVx1RDdGRlx1RTAwMC1cdUZGRkZdfFtcdUQ4MDAtXHVEQkZGXVtcdURDMDAtXHVERkZGXXxbXHVEODAwLVx1REJGRl0oPyFbXHVEQzAwLVx1REZGRl0pfCg/OlteXHVEODAwLVx1REJGRl18XilbXHVEQzAwLVx1REZGRl0pXClcXSlbJ1xdXS9nLmV4ZWMoRik7Uz90aGlzLl93YWxrKGUsZnVuY3Rpb24oRCl7dmFyIHl0PVtTWzJdXSxvdD1TWzFdP2VbRF1bU1sxXV06ZVtEXSxndD1hLl90cmFjZSh5dCxvdCxuLHIsaSxvLCEwKTtndC5sZW5ndGg+MCYmYihhLl90cmFjZShfLGVbRF0sWnQobixEKSxlLEQsbywhMCkpfSk6dGhpcy5fd2FsayhlLGZ1bmN0aW9uKEQpe2EuX2V2YWwoRixlW0RdLEQsbixyLGkpJiZiKGEuX3RyYWNlKF8sZVtEXSxadChuLEQpLGUsRCxvLCEwKSl9KX1lbHNlIGlmKGRbMF09PT0iKCIpe2lmKHRoaXMuY3VyclByZXZlbnRFdmFsKXRocm93IG5ldyBFcnJvcigiRXZhbCBbKGV4cHIpXSBwcmV2ZW50ZWQgaW4gSlNPTlBhdGggZXhwcmVzc2lvbi4iKTtiKHRoaXMuX3RyYWNlKHRyKHRoaXMuX2V2YWwoZCxlLG5bbi5sZW5ndGgtMV0sbi5zbGljZSgwLC0xKSxyLGkpLF8pLGUsbixyLGksbyxzKSl9ZWxzZSBpZihkWzBdPT09IkAiKXt2YXIgTj0hMSxnPWQuc2xpY2UoMSwtMik7c3dpdGNoKGcpe2Nhc2Uic2NhbGFyIjooIWV8fCFbIm9iamVjdCIsImZ1bmN0aW9uIl0uaW5jbHVkZXMoR3QoZSkpKSYmKE49ITApO2JyZWFrO2Nhc2UiYm9vbGVhbiI6Y2FzZSJzdHJpbmciOmNhc2UidW5kZWZpbmVkIjpjYXNlImZ1bmN0aW9uIjpHdChlKT09PWcmJihOPSEwKTticmVhaztjYXNlImludGVnZXIiOk51bWJlci5pc0Zpbml0ZShlKSYmIShlJTEpJiYoTj0hMCk7YnJlYWs7Y2FzZSJudW1iZXIiOk51bWJlci5pc0Zpbml0ZShlKSYmKE49ITApO2JyZWFrO2Nhc2Uibm9uRmluaXRlIjp0eXBlb2YgZT09Im51bWJlciImJiFOdW1iZXIuaXNGaW5pdGUoZSkmJihOPSEwKTticmVhaztjYXNlIm9iamVjdCI6ZSYmR3QoZSk9PT1nJiYoTj0hMCk7YnJlYWs7Y2FzZSJhcnJheSI6QXJyYXkuaXNBcnJheShlKSYmKE49ITApO2JyZWFrO2Nhc2Uib3RoZXIiOk49dGhpcy5jdXJyT3RoZXJUeXBlQ2FsbGJhY2soZSxuLHIsaSk7YnJlYWs7Y2FzZSJudWxsIjplPT09bnVsbCYmKE49ITApO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biB2YWx1ZSB0eXBlICIrZyl9aWYoTilyZXR1cm4gbD17cGF0aDpuLHZhbHVlOmUscGFyZW50OnIscGFyZW50UHJvcGVydHk6aX0sdGhpcy5faGFuZGxlQ2FsbGJhY2sobCxvLCJ2YWx1ZSIpLGx9ZWxzZSBpZihkWzBdPT09ImAiJiZlJiZUdC5jYWxsKGUsZC5zbGljZSgxKSkpe3ZhciBHPWQuc2xpY2UoMSk7Yih0aGlzLl90cmFjZShfLGVbR10sWnQobixHKSxlLEcsbyxzLCEwKSl9ZWxzZSBpZihkLmluY2x1ZGVzKCIsIikpe3ZhciBLPWQuc3BsaXQoIiwiKSxWPVNmKEspLGl0O3RyeXtmb3IoVi5zKCk7IShpdD1WLm4oKSkuZG9uZTspe3ZhciBsdD1pdC52YWx1ZTtiKHRoaXMuX3RyYWNlKHRyKGx0LF8pLGUsbixyLGksbywhMCkpfX1jYXRjaChEKXtWLmUoRCl9ZmluYWxseXtWLmYoKX19ZWxzZSF1JiZlJiZUdC5jYWxsKGUsZCkmJmIodGhpcy5fdHJhY2UoXyxlW2RdLFp0KG4sZCksZSxkLG8scywhMCkpfWlmKHRoaXMuX2hhc1BhcmVudFNlbGVjdG9yKWZvcih2YXIgcnQ9MDtydDxPLmxlbmd0aDtydCsrKXt2YXIgQnQ9T1tydF07aWYoQnQmJkJ0LmlzUGFyZW50U2VsZWN0b3Ipe3ZhciBUPXRoaXMuX3RyYWNlKEJ0LmV4cHIsZSxCdC5wYXRoLHIsaSxvLHMpO2lmKEFycmF5LmlzQXJyYXkoVCkpe09bcnRdPVRbMF07Zm9yKHZhciBCPVQubGVuZ3RoLCQ9MTskPEI7JCsrKXJ0KyssTy5zcGxpY2UocnQsMCxUWyRdKX1lbHNlIE9bcnRdPVR9fXJldHVybiBPfSxxLnByb3RvdHlwZS5fd2Fsaz1mdW5jdGlvbih0LGUpe2lmKEFycmF5LmlzQXJyYXkodCkpZm9yKHZhciBuPXQubGVuZ3RoLHI9MDtyPG47cisrKWUocik7ZWxzZSB0JiZHdCh0KT09PSJvYmplY3QiJiZPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGZ1bmN0aW9uKGkpe2UoaSl9KX0scS5wcm90b3R5cGUuX3NsaWNlPWZ1bmN0aW9uKHQsZSxuLHIsaSxvLHMpe2lmKEFycmF5LmlzQXJyYXkobikpe3ZhciB1PW4ubGVuZ3RoLGE9dC5zcGxpdCgiOiIpLGw9YVsyXSYmTnVtYmVyLnBhcnNlSW50KGFbMl0pfHwxLGQ9YVswXSYmTnVtYmVyLnBhcnNlSW50KGFbMF0pfHwwLF89YVsxXSYmTnVtYmVyLnBhcnNlSW50KGFbMV0pfHx1O2Q9ZDwwP01hdGgubWF4KDAsZCt1KTpNYXRoLm1pbih1LGQpLF89XzwwP01hdGgubWF4KDAsXyt1KTpNYXRoLm1pbih1LF8pO2Zvcih2YXIgTz1bXSxiPWQ7YjxfO2IrPWwpe3ZhciBGPXRoaXMuX3RyYWNlKHRyKGIsZSksbixyLGksbyxzLCEwKTtGLmZvckVhY2goZnVuY3Rpb24oUyl7Ty5wdXNoKFMpfSl9cmV0dXJuIE99fSxxLnByb3RvdHlwZS5fZXZhbD1mdW5jdGlvbih0LGUsbixyLGksbyl7dGhpcy5jdXJyU2FuZGJveC5fJF9wYXJlbnRQcm9wZXJ0eT1vLHRoaXMuY3VyclNhbmRib3guXyRfcGFyZW50PWksdGhpcy5jdXJyU2FuZGJveC5fJF9wcm9wZXJ0eT1uLHRoaXMuY3VyclNhbmRib3guXyRfcm9vdD10aGlzLmpzb24sdGhpcy5jdXJyU2FuZGJveC5fJF92PWU7dmFyIHM9dC5pbmNsdWRlcygiQHBhdGgiKTtzJiYodGhpcy5jdXJyU2FuZGJveC5fJF9wYXRoPXEudG9QYXRoU3RyaW5nKHIuY29uY2F0KFtuXSkpKTt2YXIgdT0ic2NyaXB0OiIrdDtpZighcS5jYWNoZVt1XSl7dmFyIGE9dC5yZXBsYWNlKC9AcGFyZW50UHJvcGVydHkvZywiXyRfcGFyZW50UHJvcGVydHkiKS5yZXBsYWNlKC9AcGFyZW50L2csIl8kX3BhcmVudCIpLnJlcGxhY2UoL0Bwcm9wZXJ0eS9nLCJfJF9wcm9wZXJ0eSIpLnJlcGxhY2UoL0Byb290L2csIl8kX3Jvb3QiKS5yZXBsYWNlKC9AKFtcdC1cciBcKVwuXFtceEEwXHUxNjgwXHUyMDAwLVx1MjAwQVx1MjAyOFx1MjAyOVx1MjAyRlx1MjA1Rlx1MzAwMFx1RkVGRl0pL2csIl8kX3YkMSIpO3MmJihhPWEucmVwbGFjZSgvQHBhdGgvZywiXyRfcGF0aCIpKSxxLmNhY2hlW3VdPW5ldyB0aGlzLnZtLlNjcmlwdChhKX10cnl7cmV0dXJuIHEuY2FjaGVbdV0ucnVuSW5OZXdDb250ZXh0KHRoaXMuY3VyclNhbmRib3gpfWNhdGNoKGwpe3Rocm93IG5ldyBFcnJvcigianNvblBhdGg6ICIrbC5tZXNzYWdlKyI6ICIrdCl9fSxxLmNhY2hlPXt9LHEudG9QYXRoU3RyaW5nPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10LG49ZS5sZW5ndGgscj0iJCIsaT0xO2k8bjtpKyspL14ofnxcXnxAKD86W1wwLVx0XHgwQlxmXHgwRS1cdTIwMjdcdTIwMkEtXHVEN0ZGXHVFMDAwLVx1RkZGRl18W1x1RDgwMC1cdURCRkZdW1x1REMwMC1cdURGRkZdfFtcdUQ4MDAtXHVEQkZGXSg/IVtcdURDMDAtXHVERkZGXSl8KD86W15cdUQ4MDAtXHVEQkZGXXxeKVtcdURDMDAtXHVERkZGXSkqP1woXCkpJC8udGVzdChlW2ldKXx8KHIrPS9eW1wqMC05XSskLy50ZXN0KGVbaV0pPyJbIitlW2ldKyJdIjoiWyciK2VbaV0rIiddIik7cmV0dXJuIHJ9LHEudG9Qb2ludGVyPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10LG49ZS5sZW5ndGgscj0iIixpPTE7aTxuO2krKykvXih+fFxefEAoPzpbXDAtXHRceDBCXGZceDBFLVx1MjAyN1x1MjAyQS1cdUQ3RkZcdUUwMDAtXHVGRkZGXXxbXHVEODAwLVx1REJGRl1bXHVEQzAwLVx1REZGRl18W1x1RDgwMC1cdURCRkZdKD8hW1x1REMwMC1cdURGRkZdKXwoPzpbXlx1RDgwMC1cdURCRkZdfF4pW1x1REMwMC1cdURGRkZdKSo/XChcKSkkLy50ZXN0KGVbaV0pfHwocis9Ii8iK2VbaV0udG9TdHJpbmcoKS5yZXBsYWNlKC9+L2csIn4wIikucmVwbGFjZSgvXC8vZywifjEiKSk7cmV0dXJuIHJ9LHEudG9QYXRoQXJyYXk9ZnVuY3Rpb24odCl7dmFyIGU9cS5jYWNoZTtpZihlW3RdKXJldHVybiBlW3RdLmNvbmNhdCgpO3ZhciBuPVtdLHI9dC5yZXBsYWNlKC9AKD86bnVsbHxib29sZWFufG51bWJlcnxzdHJpbmd8aW50ZWdlcnx1bmRlZmluZWR8bm9uRmluaXRlfHNjYWxhcnxhcnJheXxvYmplY3R8ZnVuY3Rpb258b3RoZXIpXChcKS9nLCI7JCY7IikucmVwbGFjZSgvWydcW10oXD8/XCgoPzpbXDAtXHRceDBCXGZceDBFLVx1MjAyN1x1MjAyQS1cdUQ3RkZcdUUwMDAtXHVGRkZGXXxbXHVEODAwLVx1REJGRl1bXHVEQzAwLVx1REZGRl18W1x1RDgwMC1cdURCRkZdKD8hW1x1REMwMC1cdURGRkZdKXwoPzpbXlx1RDgwMC1cdURCRkZdfF4pW1x1REMwMC1cdURGRkZdKSo/XCkpWydcXV0oPyEoPzpbXDAtXHRceDBCXGZceDBFLVx1MjAyN1x1MjAyQS1cdUQ3RkZcdUUwMDAtXHVGRkZGXXxbXHVEODAwLVx1REJGRl1bXHVEQzAwLVx1REZGRl18W1x1RDgwMC1cdURCRkZdKD8hW1x1REMwMC1cdURGRkZdKXwoPzpbXlx1RDgwMC1cdURCRkZdfF4pW1x1REMwMC1cdURGRkZdKVxdKS9nLGZ1bmN0aW9uKG8scyl7cmV0dXJuIlsjIisobi5wdXNoKHMpLTEpKyJdIn0pLnJlcGxhY2UoL1xbWyInXSgoPzpbXDAtJlwoLVxcXF4tXHVEN0ZGXHVFMDAwLVx1RkZGRl18W1x1RDgwMC1cdURCRkZdW1x1REMwMC1cdURGRkZdfFtcdUQ4MDAtXHVEQkZGXSg/IVtcdURDMDAtXHVERkZGXSl8KD86W15cdUQ4MDAtXHVEQkZGXXxeKVtcdURDMDAtXHVERkZGXSkqKVsiJ11cXS9nLGZ1bmN0aW9uKG8scyl7cmV0dXJuIlsnIitzLnJlcGxhY2UoL1wuL2csIiVAJSIpLnJlcGxhY2UoL34vZywiJSVAQCUlIikrIiddIn0pLnJlcGxhY2UoL34vZywiO347IikucmVwbGFjZSgvWyInXT9cLlsiJ10/KD8hKD86W1wwLVpcXC1cdUQ3RkZcdUUwMDAtXHVGRkZGXXxbXHVEODAwLVx1REJGRl1bXHVEQzAwLVx1REZGRl18W1x1RDgwMC1cdURCRkZdKD8hW1x1REMwMC1cdURGRkZdKXwoPzpbXlx1RDgwMC1cdURCRkZdfF4pW1x1REMwMC1cdURGRkZdKSpcXSl8XFtbIiddPy9nLCI7IikucmVwbGFjZSgvJUAlL2csIi4iKS5yZXBsYWNlKC8lJUBAJSUvZywifiIpLnJlcGxhY2UoLyg/OjspPyhcXispKD86Oyk/L2csZnVuY3Rpb24obyxzKXtyZXR1cm4iOyIrcy5zcGxpdCgiIikuam9pbigiOyIpKyI7In0pLnJlcGxhY2UoLzs7O3w7Oy9nLCI7Li47IikucmVwbGFjZSgvOyR8Jz9cXXwnJC9nLCIiKSxpPXIuc3BsaXQoIjsiKS5tYXAoZnVuY3Rpb24obyl7dmFyIHM9by5tYXRjaCgvIyhbMC05XSspLyk7cmV0dXJuIXN8fCFzWzFdP286bltzWzFdXX0pO3JldHVybiBlW3RdPWksZVt0XS5jb25jYXQoKX07dmFyIEZmPWZ1bmN0aW9uKGUsbixyKXtmb3IodmFyIGk9ZS5sZW5ndGgsbz0wO288aTtvKyspe3ZhciBzPWVbb107cihzKSYmbi5wdXNoKGUuc3BsaWNlKG8tLSwxKVswXSl9fSx3Zj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSl7d2kodGhpcyx0KSx0aGlzLmNvZGU9ZX1yZXR1cm4gTmkodCxbe2tleToicnVuSW5OZXdDb250ZXh0Iix2YWx1ZTpmdW5jdGlvbihuKXt2YXIgcj10aGlzLmNvZGUsaT1PYmplY3Qua2V5cyhuKSxvPVtdO0ZmKGksbyxmdW5jdGlvbihkKXtyZXR1cm4gdHlwZW9mIG5bZF09PSJmdW5jdGlvbiJ9KTt2YXIgcz1pLm1hcChmdW5jdGlvbihkKXtyZXR1cm4gbltkXX0pLHU9by5yZWR1Y2UoZnVuY3Rpb24oZCxfKXt2YXIgTz1uW19dLnRvU3RyaW5nKCk7cmV0dXJuL2Z1bmN0aW9uLy50ZXN0KE8pfHwoTz0iZnVuY3Rpb24gIitPKSwidmFyICIrXysiPSIrTysiOyIrZH0sIiIpO3I9dStyLCEvKFsiJ10pdXNlIHN0cmljdFwxLy50ZXN0KHIpJiYhaS5pbmNsdWRlcygiYXJndW1lbnRzIikmJihyPSJ2YXIgYXJndW1lbnRzID0gdW5kZWZpbmVkOyIrcikscj1yLnJlcGxhY2UoLztbXHQtXHIgXHhBMFx1MTY4MFx1MjAwMC1cdTIwMEFcdTIwMjhcdTIwMjlcdTIwMkZcdTIwNUZcdTMwMDBcdUZFRkZdKiQvLCIiKTt2YXIgYT1yLmxhc3RJbmRleE9mKCI7IiksbD1hPi0xP3Iuc2xpY2UoMCxhKzEpKyIgcmV0dXJuICIrci5zbGljZShhKzEpOiIgcmV0dXJuICIrcjtyZXR1cm4gRmkoRnVuY3Rpb24saS5jb25jYXQoW2xdKSkuYXBwbHkodm9pZCAwLHhmKHMpKX19XSksdH0oKTtxLnByb3RvdHlwZS52bT17U2NyaXB0OndmfTtjb25zdCBJZj0iYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NTY3ODkiLE5mPXQ9PkFycmF5LmZyb20od2luZG93LmNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkodCkpKS5tYXAoZT0+SWZbZSV0XSkuam9pbigiIikudG9Mb3dlckNhc2UoKSxDaT10PT57aWYodHlwZW9mIHQhPSJvYmplY3QifHx0PT09bnVsbClyZXR1cm4gdDtmb3IoY29uc3QgZSBpbiB0KWlmKHR5cGVvZiB0W2VdPT0ic3RyaW5nIil0cnl7dFtlXS5zdGFydHNXaXRoKCJ7IikmJnRbZV0uZW5kc1dpdGgoIn0iKSYmKHRbZV09SlNPTi5wYXJzZSh0W2VdKSl9Y2F0Y2h7Y29uc29sZS5lcnJvcigiSW52YWxpZCBKU09OOiIsdFtlXSl9ZWxzZSB0eXBlb2YgdFtlXT09Im9iamVjdCImJih0W2VdPUNpKHRbZV0pKTtyZXR1cm4gdH0sZXI9ImN6bV8iO2Z1bmN0aW9uIE1mKHQsZSl7bGV0IG49dCxyPSIiO2NvbnN0IGk9W107bGV0IG89bi5pbmRleE9mKCIkeyIpO2NvbnN0IHM9dHlwZW9mIGU8InUiLHU9e30sYT0vXlwkLi87Zm9yKDtvPj0wOylpZihDZihuLG8pKXtjb25zdCBsPXZmKG4sbyk7cis9bi5zbGljZSgwLGwrMSksbj1uLnNsaWNlKGwrMSksbz1uLmluZGV4T2YoIiR7Iil9ZWxzZXtyKz1uLnNsaWNlKDAsbyk7Y29uc3QgbD1EZihuLG8pLGQ9bi5zbGljZShvKzIsbCk7aWYoYS50ZXN0KGQpKXtpZighcylyZXR1cm5bcixbXV07bGV0IF89dVtkXTtpZighXyl0cnl7Xz1xKHtqc29uOmUscGF0aDpkfSksdVtkXT1ffWNhdGNoe3JldHVybltyLFtdXX1pZihfLmxlbmd0aCE9PTApe2NvbnN0IE89TmYoMTApO2kucHVzaCh7bGl0ZXJhbE5hbWU6TyxsaXRlcmFsVmFsdWU6X1swXX0pLHIrPU99ZWxzZSByZXR1cm5bImZhbHNlIixbXV19ZWxzZXtjb25zdCBfPUxmKGQpO3IrPWAke2VyfSR7X31gfW49bi5zbGljZShsKzEpLG89bi5pbmRleE9mKCIkeyIpfXJldHVybiByKz1uLFtyLGldfWZ1bmN0aW9uIENmKHQsZSl7Y29uc3Qgbj10LmluZGV4T2YoIiciKSxyPXQuaW5kZXhPZignIicpO3JldHVybiBuPj0wJiZuPGU/dC5pbmRleE9mKCInIixuKzEpPj1lOnI+PTAmJnI8ZT90LmluZGV4T2YoJyInLHIrMSk+PWU6ITF9ZnVuY3Rpb24gdmYodCxlKXtjb25zdCBuPXQuaW5kZXhPZigiJyIpLHI9dC5pbmRleE9mKCciJyk7cmV0dXJuIG4+PTAmJm48ZT90LmluZGV4T2YoIiciLG4rMSk6cj49MCYmcjxlP3QuaW5kZXhPZignIicscisxKTotMX1mdW5jdGlvbiBEZih0LGUpe2NvbnN0IG49dC5pbmRleE9mKCJ9IixlKTtpZihuPDApdGhyb3cgbmV3IEVycm9yKCJyZXBsYWNlVmFyaWFibGU6IFVubWF0Y2hlZCB7LiIpO3JldHVybiBufWNvbnN0IGNlPXQ9PmAkcmVlYXJ0aF8ke3R9XyRgLG5yPXsiWyI6Y2UoIm9wZW5lZF9zcXVhcmVfYnJhY2tldCIpLCJdIjpjZSgiY2xvc2VkX3NxdWFyZV9icmFja2V0IiksInsiOmNlKCJvcGVuZWRfY3VybHlfYnJhY2tldCIpLCJ9IjpjZSgiY2xvc2VkX2N1cmx5X2JyYWNrZXQiKSwiKCI6Y2UoIm9wZW5lZF9wYXJlbnRoZXNlcyIpLCIpIjpjZSgiY2xvc2VkX3BhcmVudGhlc2VzIiksIi0iOmNlKCJoeXBoZW4iKX0sTGY9dD0+e2NvbnN0IGU9dC5yZXBsYWNlKC8tL2csbnJbIi0iXSk7cmV0dXJuLyhcXXxcKXxcfSlbXlsuXSskLy50ZXN0KGUpP09iamVjdC5lbnRyaWVzKG5yKS5yZWR1Y2UoKG4sW3IsaV0pPT5uLnJlcGxhY2VBbGwocixpKSxlKTplfSxQZj10PT5PYmplY3QuZW50cmllcyhucikucmVkdWNlKChlLFtuLHJdKT0+ZS5yZXBsYWNlQWxsKHIsbiksdCksQmY9bmV3IFNldChLaCksdmk9bmV3IFNldChaaCk7ZnVuY3Rpb24gVyh0LGUpe2xldCBuPW5ldyBFcnJvcigiZmFpbGVkIHRvIHBhcnNlIik7Y29uc3Qgcj1lLnR5cGU7aWYocj09PSJMaXRlcmFsIiluPVVmKGUpO2Vsc2UgaWYocj09PSJDYWxsRXhwcmVzc2lvbiIpbj1HZih0LGUpO2Vsc2UgaWYocj09PSJJZGVudGlmaWVyIiluPSRmKGUpO2Vsc2UgaWYocj09PSJVbmFyeUV4cHJlc3Npb24iKXtjb25zdCBpPWUub3BlcmF0b3Isbz1XKHQsZS5hcmd1bWVudCk7aWYoQmYuaGFzKGkpKW49bmV3IFAoTS5VTkFSWSxpLG8pO2Vsc2UgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIG9wZXJhdG9yICIke2l9Ii5gKX1lbHNlIGlmKHI9PT0iQmluYXJ5RXhwcmVzc2lvbiIpe2NvbnN0IGk9ZS5vcGVyYXRvcixvPVcodCxlLmxlZnQpLHM9Vyh0LGUucmlnaHQpO2lmKHZpLmhhcyhpKSluPW5ldyBQKE0uQklOQVJZLGksbyxzKTtlbHNlIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBvcGVyYXRvciAiJHtpfSIuYCl9ZWxzZSBpZihyPT09IkxvZ2ljYWxFeHByZXNzaW9uIil7Y29uc3QgaT1lLm9wZXJhdG9yLG89Vyh0LGUubGVmdCkscz1XKHQsZS5yaWdodCk7dmkuaGFzKGkpJiYobj1uZXcgUChNLkJJTkFSWSxpLG8scykpfWVsc2UgaWYocj09PSJDb25kaXRpb25hbEV4cHJlc3Npb24iKXtjb25zdCBpPVcodCxlLnRlc3QpLG89Vyh0LGUuY29uc2VxdWVudCkscz1XKHQsZS5hbHRlcm5hdGUpO249bmV3IFAoTS5DT05ESVRJT05BTCwiPyIsbyxzLGkpfWVsc2UgaWYocj09PSJNZW1iZXJFeHByZXNzaW9uIiluPVdmKHQsZSk7ZWxzZSBpZihyPT09IkFycmF5RXhwcmVzc2lvbiIpe2NvbnN0IGk9W107Zm9yKGxldCBvPTA7bzxlLmVsZW1lbnRzLmxlbmd0aDtvKyspaVtvXT1XKHQsZS5lbGVtZW50c1tvXSk7bj1uZXcgUChNLkFSUkFZLGkpfWVsc2UgdGhyb3cgcj09PSJDb21wb3VuZCI/bmV3IEVycm9yKCJQcm92aWRlIGV4YWN0bHkgb25lIGV4cHJlc3Npb24uIik6bmV3IEVycm9yKCJDYW5ub3QgcGFyc2UgZXhwcmVzc2lvbi4iKTtyZXR1cm4gbn1mdW5jdGlvbiBVZih0KXtjb25zdCBlPXR5cGVvZiB0LnZhbHVlO2lmKHQudmFsdWU9PT1udWxsKXJldHVybiBuZXcgUChNLkxJVEVSQUxfTlVMTCxudWxsKTtpZihlPT09ImJvb2xlYW4iKXJldHVybiBuZXcgUChNLkxJVEVSQUxfQk9PTEVBTix0LnZhbHVlKTtpZihlPT09Im51bWJlciIpcmV0dXJuIG5ldyBQKE0uTElURVJBTF9OVU1CRVIsdC52YWx1ZSk7aWYoZT09PSJzdHJpbmciKXJldHVybiB0LnZhbHVlLmluZGV4T2YoIiR7Iik+PTA/bmV3IFAoTS5WQVJJQUJMRV9JTl9TVFJJTkcsdC52YWx1ZSk6bmV3IFAoTS5MSVRFUkFMX1NUUklORyxqZih0LnZhbHVlKSk7dGhyb3cgbmV3IEVycm9yKGAke3R9IGlzIG5vdCBhIGZ1bmN0aW9uLmApfWZ1bmN0aW9uIGpmKHQpe3JldHVybiB0LnJlcGxhY2UodGYsIlxcIil9ZnVuY3Rpb24gR2YodCxlKXtjb25zdCBuPWUuYXJndW1lbnRzLHI9bi5sZW5ndGg7aWYoZS5jYWxsZWUudHlwZT09PSJNZW1iZXJFeHByZXNzaW9uIil7Y29uc3Qgbz1lLmNhbGxlZS5wcm9wZXJ0eS5uYW1lLHM9ZS5jYWxsZWUub2JqZWN0O2lmKG89PT0idGVzdCJ8fG89PT0iZXhlYyIpe2lmKHMuY2FsbGVlLm5hbWUhPT0icmVnRXhwIil0aHJvdyBuZXcgRXJyb3IoYCR7b30gaXMgbm90IGEgZnVuY3Rpb24uYCk7aWYocj09PTApcmV0dXJuIG89PT0idGVzdCI/bmV3IFAoTS5MSVRFUkFMX0JPT0xFQU4sITEpOm5ldyBQKE0uTElURVJBTF9OVUxMLG51bGwpO2NvbnN0IHU9Vyh0LHMpLGE9Vyh0LG5bMF0pO3JldHVybiBuZXcgUChNLkZVTkNUSU9OX0NBTEwsbyx1LGEpfWVsc2UgaWYobz09PSJ0b1N0cmluZyIpe2NvbnN0IHU9Vyh0LHMpO3JldHVybiBuZXcgUChNLkZVTkNUSU9OX0NBTEwsbyx1KX10aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgZnVuY3Rpb24gY2FsbCAiJHtvfSIuYCl9Y29uc3QgaT1lLmNhbGxlZS5uYW1lO2lmKGk9PT0iY29sb3IiKXtpZihyPT09MClyZXR1cm4gbmV3IFAoTS5MSVRFUkFMX0NPTE9SLGkpO2NvbnN0IG89Vyh0LG5bMF0pO2lmKHR5cGVvZiBuWzFdPCJ1Iil7Y29uc3Qgcz1XKHQsblsxXSk7cmV0dXJuIG5ldyBQKE0uTElURVJBTF9DT0xPUixpLFtvLHNdKX1yZXR1cm4gbmV3IFAoTS5MSVRFUkFMX0NPTE9SLGksW29dKX1lbHNlIGlmKGk9PT0icmdiInx8aT09PSJoc2wiKXtpZihyPDMpdGhyb3cgbmV3IEVycm9yKGAke2l9IHJlcXVpcmVzIHRocmVlIGFyZ3VtZW50cy5gKTtjb25zdCBvPVtXKHQsblswXSksVyh0LG5bMV0pLFcodCxuWzJdKV07cmV0dXJuIG5ldyBQKE0uTElURVJBTF9DT0xPUixpLG8pfWVsc2UgaWYoaT09PSJyZ2JhInx8aT09PSJoc2xhIil7aWYocjw0KXRocm93IG5ldyBFcnJvcihgJHtpfSByZXF1aXJlcyBmb3VyIGFyZ3VtZW50cy5gKTtjb25zdCBvPVtXKHQsblswXSksVyh0LG5bMV0pLFcodCxuWzJdKSxXKHQsblszXSldO3JldHVybiBuZXcgUChNLkxJVEVSQUxfQ09MT1IsaSxvKX1lbHNlIGlmKGk9PT0iaXNOYU4ifHxpPT09ImlzRmluaXRlIil7aWYocj09PTApcmV0dXJuIGk9PT0iaXNOYU4iP25ldyBQKE0uTElURVJBTF9CT09MRUFOLCEwKTpuZXcgUChNLkxJVEVSQUxfQk9PTEVBTiwhMSk7Y29uc3Qgbz1XKHQsblswXSk7cmV0dXJuIG5ldyBQKE0uVU5BUlksaSxvKX1lbHNlIGlmKHR5cGVvZiBZbltpXTwidSIpe2lmKHIhPT0xKXRocm93IG5ldyBFcnJvcihgJHtpfSByZXF1aXJlcyBleGFjdGx5IG9uZSBhcmd1bWVudC5gKTtjb25zdCBvPVcodCxuWzBdKTtyZXR1cm4gbmV3IFAoTS5VTkFSWSxpLG8pfWVsc2UgaWYodHlwZW9mIGtuW2ldPCJ1Iil7aWYociE9PTIpdGhyb3cgbmV3IEVycm9yKGAke2l9IHJlcXVpcmVzIGV4YWN0bHkgdHdvIGFyZ3VtZW50cy5gKTtjb25zdCBvPVcodCxuWzBdKSxzPVcodCxuWzFdKTtyZXR1cm4gbmV3IFAoTS5CSU5BUlksaSxvLHMpfWVsc2UgaWYoaT09PSJCb29sZWFuIil7aWYocj09PTApcmV0dXJuIG5ldyBQKE0uTElURVJBTF9CT09MRUFOLCExKTtjb25zdCBvPVcodCxuWzBdKTtyZXR1cm4gbmV3IFAoTS5VTkFSWSxpLG8pfWVsc2UgaWYoaT09PSJOdW1iZXIiKXtpZihyPT09MClyZXR1cm4gbmV3IFAoTS5MSVRFUkFMX05VTUJFUiwwKTtjb25zdCBvPVcodCxuWzBdKTtyZXR1cm4gbmV3IFAoTS5VTkFSWSxpLG8pfWVsc2UgaWYoaT09PSJTdHJpbmciKXtpZihyPT09MClyZXR1cm4gbmV3IFAoTS5MSVRFUkFMX1NUUklORywiIik7Y29uc3Qgbz1XKHQsblswXSk7cmV0dXJuIG5ldyBQKE0uVU5BUlksaSxvKX10aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgZnVuY3Rpb24gY2FsbCAiJHtpfSIuYCl9ZnVuY3Rpb24gJGYodCl7Y29uc3QgZT10Lm5hbWU7aWYoWGYoZSkpe2NvbnN0IG49SGYoZSk7cmV0dXJuIG4uc3Vic3RyaW5nKDAsOCk9PT0idGlsZXMzZF8iP25ldyBQKE0uQlVJTFRJTl9WQVJJQUJMRSxuKTpuZXcgUChNLlZBUklBQkxFLG4pfWVsc2V7aWYoZT09PSJOYU4iKXJldHVybiBuZXcgUChNLkxJVEVSQUxfTlVNQkVSLE5hTik7aWYoZT09PSJJbmZpbml0eSIpcmV0dXJuIG5ldyBQKE0uTElURVJBTF9OVU1CRVIsMS8wKTtpZihlPT09InVuZGVmaW5lZCIpcmV0dXJuIG5ldyBQKE0uTElURVJBTF9VTkRFRklORUQsdm9pZCAwKX10aHJvdyBuZXcgRXJyb3IoYCR7ZX0gaXMgbm90IGRlZmluZWQuYCl9ZnVuY3Rpb24gVmYodCl7Y29uc3QgZT10LnByb3BlcnR5Lm5hbWU7aWYoZT09PSJQSSIpcmV0dXJuIG5ldyBQKE0uTElURVJBTF9OVU1CRVIsTWF0aC5QSSk7aWYoZT09PSJFIilyZXR1cm4gbmV3IFAoTS5MSVRFUkFMX05VTUJFUixNYXRoLkUpO3Rocm93IG5ldyBFcnJvcihgJHtlfSBNYXRoIENvbnN0YW50IGlzIG5vdCBzdXBwb3J0ZWQgYXQgdGhlIG1vbWVudGApfWZ1bmN0aW9uIHpmKHQpe2NvbnN0IGU9dC5wcm9wZXJ0eS5uYW1lO2lmKGU9PT0iUE9TSVRJVkVfSU5GSU5JVFkiKXJldHVybiBuZXcgUChNLkxJVEVSQUxfTlVNQkVSLE51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7dGhyb3cgbmV3IEVycm9yKGAke2V9IE51bWJlciBDb25zdGFudCBpcyBub3Qgc3VwcG9ydGVkIGF0IHRoZSBtb21lbnRgKX1mdW5jdGlvbiBXZih0LGUpe2lmKGUub2JqZWN0Lm5hbWU9PT0iTWF0aCIpcmV0dXJuIFZmKGUpO2lmKGUub2JqZWN0Lm5hbWU9PT0iTnVtYmVyIilyZXR1cm4gemYoZSk7bGV0IG47Y29uc3Qgcj1XKHQsZS5vYmplY3QpO3JldHVybiBlLmNvbXB1dGVkPyhuPVcodCxlLnByb3BlcnR5KSxuZXcgUChNLk1FTUJFUiwiYnJhY2tldHMiLHIsbikpOihuPW5ldyBQKE0uTElURVJBTF9TVFJJTkcsZS5wcm9wZXJ0eS5uYW1lKSxuZXcgUChNLk1FTUJFUiwiZG90IixyLG4pKX1mdW5jdGlvbiBYZih0KXtyZXR1cm4gdC5zdWJzdHJpbmcoMCw0KT09PWVyfWZ1bmN0aW9uIEhmKHQpe3JldHVybiBQZih0KS5zdWJzdHJpbmcoNCl9Y29uc3QgRGk9bmV3IE1hcCxMaT1uZXcgTWFwLFBpPW5ldyBNYXAsQmk9bmV3IE1hcDtjbGFzcyBjbntjb25zdHJ1Y3RvcihlLG4scil7dih0aGlzLCJfcnVudGltZUFzdCIpO3YodGhpcywiX2ZlYXR1cmUiKTt2YXIgdTt0aGlzLl9mZWF0dXJlPW47bGV0IGk9W107ZT1xZihlLHIpO2NvbnN0IG89TGkuZ2V0KGUpO2lmKG8pW2UsaV09bztlbHNle2NvbnN0IGE9ZTtbZSxpXT1NZihrZihlKSwodT10aGlzLl9mZWF0dXJlKT09bnVsbD92b2lkIDA6dS5wcm9wZXJ0aWVzKSxlLmluY2x1ZGVzKGVyKSYmTGkuc2V0KGEsW2UsaV0pfWNvbnN0IHM9RGkuZ2V0KGUpO2lmKHMpdGhpcy5fcnVudGltZUFzdD1zO2Vsc2V7aWYoaS5sZW5ndGghPT0wKWZvcihjb25zdCBsIG9mIGkpcXQuYWRkTGl0ZXJhbChsLmxpdGVyYWxOYW1lLGwubGl0ZXJhbFZhbHVlKTtxdC5hZGRCaW5hcnlPcCgiPX4iLDApLHF0LmFkZEJpbmFyeU9wKCIhfiIsMCk7bGV0IGE7dHJ5e2E9cXQoZSl9Y2F0Y2gobCl7dGhyb3cgbmV3IEVycm9yKGBmYWlsZWQgdG8gZ2VuZXJhdGUgYXN0OiAke2x9YCl9dGhpcy5fcnVudGltZUFzdD1XKHRoaXMsYSksRGkuc2V0KGUsdGhpcy5fcnVudGltZUFzdCl9fWV2YWx1YXRlKCl7cmV0dXJuIHRoaXMuX3J1bnRpbWVBc3QuZXZhbHVhdGUodGhpcy5fZmVhdHVyZSl9fWZ1bmN0aW9uIHFmKHQsZSl7aWYodHlwZW9mIGU+InUiKXJldHVybiB0O2NvbnN0IG49SlNPTi5zdHJpbmdpZnkoT2JqZWN0LmVudHJpZXMoZSkuc29ydCgpKSxyPXQrbixpPUJpLmdldChyKTtpZihpKXJldHVybiBpO2xldCBvPVBpLmdldCh0KTtvfHwobz1uZXcgUmVnRXhwKGBcXCRcXHsoJHtPYmplY3Qua2V5cyhlKS5qb2luKCJ8Iil9KVxcfWAsImciKSxQaS5zZXQodCxvKSk7Y29uc3Qgcz10LnJlcGxhY2UobywodSxhKT0+dHlwZW9mIGVbYV08InUiP2AoJHtlW2FdfSlgOiIiKTtyZXR1cm4gQmkuc2V0KHIscyksc31mdW5jdGlvbiBrZih0KXtyZXR1cm4gdC5yZXBsYWNlKFFoLEpoKX1jbGFzcyBZZntjb25zdHJ1Y3RvcihlLG4scil7dih0aGlzLCJfY29uZGl0aW9ucyIpO3YodGhpcywiX3J1bnRpbWVDb25kaXRpb25zIik7dih0aGlzLCJfZmVhdHVyZSIpO3YodGhpcywiX21lbW9pemVkUmVzdWx0Iik7dGhpcy5fY29uZGl0aW9ucz1lLmNvbmRpdGlvbnMsdGhpcy5fcnVudGltZUNvbmRpdGlvbnM9W10sdGhpcy5fZmVhdHVyZT1uLHRoaXMuX21lbW9pemVkUmVzdWx0PXZvaWQgMCx0aGlzLnNldFJ1bnRpbWUocil9c2V0UnVudGltZShlKXt2YXIgcjtjb25zdCBuPShyPXRoaXMuX2NvbmRpdGlvbnMpPT1udWxsP3ZvaWQgMDpyLm1hcChpPT57Y29uc3Qgbz1TdHJpbmcoaVswXSkscz1TdHJpbmcoaVsxXSk7cmV0dXJuIG5ldyBLZihuZXcgY24obyx0aGlzLl9mZWF0dXJlLGUpLG5ldyBjbihzLHRoaXMuX2ZlYXR1cmUsZSkpfSk7dGhpcy5fcnVudGltZUNvbmRpdGlvbnM9bj8/W10sdGhpcy5fbWVtb2l6ZWRSZXN1bHQ9dm9pZCAwfWV2YWx1YXRlKCl7aWYodHlwZW9mIHRoaXMuX21lbW9pemVkUmVzdWx0PCJ1IilyZXR1cm4gdGhpcy5fbWVtb2l6ZWRSZXN1bHQ7Y29uc3QgZT10aGlzLl9ydW50aW1lQ29uZGl0aW9ucyxuPWUubGVuZ3RoO2ZvcihsZXQgaT0wO2k8bjtpKyspe2NvbnN0IG89ZVtpXTtpZihvLmNvbmRpdGlvbi5ldmFsdWF0ZSgpKXtjb25zdCBzPW8uZXhwcmVzc2lvbi5ldmFsdWF0ZSgpO3JldHVybiB0aGlzLl9tZW1vaXplZFJlc3VsdD1zLHN9fWNvbnN0IHI9dm9pZCAwO3JldHVybiB0aGlzLl9tZW1vaXplZFJlc3VsdD1yLHJ9fWNsYXNzIEtme2NvbnN0cnVjdG9yKGUsbil7dih0aGlzLCJjb25kaXRpb24iKTt2KHRoaXMsImV4cHJlc3Npb24iKTt0aGlzLmNvbmRpdGlvbj1lLHRoaXMuZXhwcmVzc2lvbj1ufX1jb25zdCBaZj0odCxlLG4pPT57Y29uc3Qgcj1IaCh0LFloKSxpPW4wKHQsZSk7cmV0dXJuey4uLmksLi4uUWYocix0LGkpLHR5cGU6ImNvbXB1dGVkRmVhdHVyZSIsaW50ZXJ2YWw6bn19O2Z1bmN0aW9uIFFmKHQsZSxuKXtpZighbil7aWYoIWUuaWQpdGhyb3cgbmV3IEVycm9yKCJsYXllciBpZCBpcyByZXF1aXJlZCIpO249e3R5cGU6ImZlYXR1cmUiLGlkOmUuaWQscHJvcGVydGllczplLnByb3BlcnRpZXN8fHt9fX1yZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHQpLm1hcCgoW3IsaV0pPT5pP1tyLFVpKGksZSxuKV06dm9pZCAwKS5maWx0ZXIocj0+ISFyKSl9ZnVuY3Rpb24gVWkodCxlLG4pe3JldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXModCkubWFwKChbcixpXSk9PnQwKGkpP1tyLFVpKGksZSxuKV06W3IsZTAoaSxlLG4pXSkpfWZ1bmN0aW9uIEpmKHQpe3JldHVybiB0eXBlb2YgdD09Im9iamVjdCImJnQmJiJleHByZXNzaW9uImluIHR9ZnVuY3Rpb24gdDAodCl7cmV0dXJuIHR5cGVvZiB0PT0ib2JqZWN0IiYmdCYmISgiZXhwcmVzc2lvbiJpbiB0KSYmIUFycmF5LmlzQXJyYXkodCl9ZnVuY3Rpb24gZTAodCxlLG4pe3RyeXtpZihKZih0KSl7Y29uc3Qgcj10LmV4cHJlc3Npb24saT1DaShVaChuKSk7cmV0dXJuIHR5cGVvZiByPiJ1Ij92b2lkIDA6dHlwZW9mIHI9PSJvYmplY3QiJiZyLmNvbmRpdGlvbnM/bmV3IFlmKHIsaSxlLmRlZmluZXMpLmV2YWx1YXRlKCk6dHlwZW9mIHI9PSJib29sZWFuInx8dHlwZW9mIHI9PSJudW1iZXIiP25ldyBjbihTdHJpbmcociksaSxlLmRlZmluZXMpLmV2YWx1YXRlKCk6dHlwZW9mIHI9PSJzdHJpbmciP25ldyBjbihyLGksZS5kZWZpbmVzKS5ldmFsdWF0ZSgpOnJ9cmV0dXJuIHR9Y2F0Y2gocil7Y29uc29sZS5lcnJvcihyKTtyZXR1cm59fWZ1bmN0aW9uIG4wKHQsZSl7dmFyIGk7Y29uc3Qgbj0oaT10LmRhdGEpPT1udWxsP3ZvaWQgMDppLmpzb25Qcm9wZXJ0aWVzO2lmKCFlLnByb3BlcnRpZXN8fCFufHwhbi5sZW5ndGgpcmV0dXJuIGU7Y29uc3Qgcj17Li4uZSwuLi5lIT1udWxsJiZlLnByb3BlcnRpZXM/e3Byb3BlcnRpZXM6ey4uLmUucHJvcGVydGllc319Ont9fTtyZXR1cm4gbi5mb3JFYWNoKG89PntyLnByb3BlcnRpZXNbb109KCgpPT57Y29uc3Qgcz1yLnByb3BlcnRpZXNbb107dHJ5e3JldHVybiBKU09OLnBhcnNlKHMpfWNhdGNoe3JldHVybiBzfX0pKCl9KSxyfWZ1bmN0aW9uIGhuKHQsZSl7aWYodC50eXBlPT09InNpbXBsZSIpcmV0dXJuIFpmKHQsZSl9Y29uc3QgcjA9KHQsZSxuKT0+e2lmKCFuKXJldHVybjtjb25zdCByPSgoKT0+e3N3aXRjaChyZS50eXBlc1t0LnR5cGVdKXtjYXNlIlBvbHlnb24iOnJldHVybiJwb2x5Z29uIjtjYXNlIkxpbmVTdHJpbmciOnJldHVybiJwb2x5bGluZSI7Y2FzZSJQb2ludCI6cmV0dXJuIm1hcmtlciI7ZGVmYXVsdDpyZXR1cm59fSkoKTtpZighcilyZXR1cm47Y29uc3QgaT10LmlkP1N0cmluZyh0LmlkKTppMCh0LmxvYWRHZW9tZXRyeSgpLGUpLG89aG4obixvMChpLHQsZSxyKSkscz1uZXcgZ247cmV0dXJuIHMuZGF0YT17bGF5ZXJJZDpuPT1udWxsP3ZvaWQgMDpuLmlkLGZlYXR1cmVJZDppLGZlYXR1cmU6byxhcHBlYXJhbmNlVHlwZTpyZS50eXBlc1t0LnR5cGVdLnRvTG93ZXJDYXNlKCl9LHN9LGkwPSh0LGUpPT57Y29uc3Qgbj1bZS54LGUueSxlLmxldmVsLC4uLnQuZmxhdE1hcChyPT5yLm1hcChpPT5baS54LGkueV0pKV0uam9pbigiOiIpO3JldHVybiBraChuKX0sbzA9KHQsZSxuLHIpPT57Y29uc3QgaT1lLmxvYWRHZW9tZXRyeSgpLFtvLHNdPSgoKT0+e2lmKHI9PT0icG9seWdvbiIpcmV0dXJuWyJQb2x5Z29uIixpLm1hcCh1PT51Lm1hcChhPT5bYS54LGEueV0pKV07aWYocj09PSJwb2x5bGluZSIpcmV0dXJuWyJMaW5lU3RyaW5nIixpWzBdLm1hcCh1PT5bdS54LHUueV0pXTtpZihyPT09Im1hcmtlciIpcmV0dXJuWyJQb2ludCIsW2lbMF1bMF0ueCxpWzBdWzBdLnldXTt0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgYXBwZWFyYW5jZSAke3J9YCl9KSgpO3JldHVybnt0eXBlOiJmZWF0dXJlIixpZDp0LGdlb21ldHJ5Ont0eXBlOm8sY29vcmRpbmF0ZXM6c30scHJvcGVydGllczplLnByb3BlcnRpZXMscmFuZ2U6e3g6bi54LHk6bi55LHo6bi5sZXZlbH19fSxtZT10eXBlb2YgcGVyZm9ybWFuY2U9PSJvYmplY3QiJiZwZXJmb3JtYW5jZSYmdHlwZW9mIHBlcmZvcm1hbmNlLm5vdz09ImZ1bmN0aW9uIj9wZXJmb3JtYW5jZTpEYXRlLGppPW5ldyBTZXQscnI9dHlwZW9mIHByb2Nlc3M9PSJvYmplY3QiJiZwcm9jZXNzP3Byb2Nlc3M6e30sR2k9KHQsZSxuLHIpPT57dHlwZW9mIHJyLmVtaXRXYXJuaW5nPT0iZnVuY3Rpb24iP3JyLmVtaXRXYXJuaW5nKHQsZSxuLHIpOmNvbnNvbGUuZXJyb3IoYFske259XSAke2V9OiAke3R9YCl9O2xldCBmbj1nbG9iYWxUaGlzLkFib3J0Q29udHJvbGxlciwkaT1nbG9iYWxUaGlzLkFib3J0U2lnbmFsO2lmKHR5cGVvZiBmbj4idSIpeyRpPWNsYXNze2NvbnN0cnVjdG9yKCl7dih0aGlzLCJvbmFib3J0Iik7dih0aGlzLCJfb25hYm9ydCIsW10pO3YodGhpcywicmVhc29uIik7dih0aGlzLCJhYm9ydGVkIiwhMSl9YWRkRXZlbnRMaXN0ZW5lcihyLGkpe3RoaXMuX29uYWJvcnQucHVzaChpKX19LGZuPWNsYXNze2NvbnN0cnVjdG9yKCl7dih0aGlzLCJzaWduYWwiLG5ldyAkaSk7ZSgpfWFib3J0KHIpe3ZhciBpLG87aWYoIXRoaXMuc2lnbmFsLmFib3J0ZWQpe3RoaXMuc2lnbmFsLnJlYXNvbj1yLHRoaXMuc2lnbmFsLmFib3J0ZWQ9ITA7Zm9yKGNvbnN0IHMgb2YgdGhpcy5zaWduYWwuX29uYWJvcnQpcyhyKTsobz0oaT10aGlzLnNpZ25hbCkub25hYm9ydCk9PW51bGx8fG8uY2FsbChpLHIpfX19O2xldCB0PSgoSGk9cnIuZW52KT09bnVsbD92b2lkIDA6SGkuTFJVX0NBQ0hFX0lHTk9SRV9BQ19XQVJOSU5HKSE9PSIxIjtjb25zdCBlPSgpPT57dCYmKHQ9ITEsR2koIkFib3J0Q29udHJvbGxlciBpcyBub3QgZGVmaW5lZC4gSWYgdXNpbmcgbHJ1LWNhY2hlIGluIG5vZGUgMTQsIGxvYWQgYW4gQWJvcnRDb250cm9sbGVyIHBvbHlmaWxsIGZyb20gdGhlIGBub2RlLWFib3J0LWNvbnRyb2xsZXJgIHBhY2thZ2UuIEEgbWluaW1hbCBwb2x5ZmlsbCBpcyBwcm92aWRlZCBmb3IgdXNlIGJ5IExSVUNhY2hlLmZldGNoKCksIGJ1dCBpdCBzaG91bGQgbm90IGJlIHJlbGllZCB1cG9uIGluIG90aGVyIGNvbnRleHRzIChlZywgcGFzc2luZyBpdCB0byBvdGhlciBBUElzIHRoYXQgdXNlIEFib3J0Q29udHJvbGxlci9BYm9ydFNpZ25hbCBtaWdodCBoYXZlIHVuZGVzaXJhYmxlIGVmZmVjdHMpLiBZb3UgbWF5IGRpc2FibGUgdGhpcyB3aXRoIExSVV9DQUNIRV9JR05PUkVfQUNfV0FSTklORz0xIGluIHRoZSBlbnYuIiwiTk9fQUJPUlRfQ09OVFJPTExFUiIsIkVOT1RTVVAiLGUpKX19Y29uc3QgczA9dD0+IWppLmhhcyh0KSxRdD10PT50JiZ0PT09TWF0aC5mbG9vcih0KSYmdD4wJiZpc0Zpbml0ZSh0KSxWaT10PT5RdCh0KT90PD1NYXRoLnBvdygyLDgpP1VpbnQ4QXJyYXk6dDw9TWF0aC5wb3coMiwxNik/VWludDE2QXJyYXk6dDw9TWF0aC5wb3coMiwzMik/VWludDMyQXJyYXk6dDw9TnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI/bG46bnVsbDpudWxsO2NsYXNzIGxuIGV4dGVuZHMgQXJyYXl7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSksdGhpcy5maWxsKDApfX1jb25zdCB3ZT1jbGFzc3tjb25zdHJ1Y3RvcihlLG4pe3YodGhpcywiaGVhcCIpO3YodGhpcywibGVuZ3RoIik7aWYoIWMod2UsRmUpKXRocm93IG5ldyBUeXBlRXJyb3IoImluc3RhbnRpYXRlIFN0YWNrIHVzaW5nIFN0YWNrLmNyZWF0ZShuKSIpO3RoaXMuaGVhcD1uZXcgbihlKSx0aGlzLmxlbmd0aD0wfXN0YXRpYyBjcmVhdGUoZSl7Y29uc3Qgbj1WaShlKTtpZighbilyZXR1cm5bXTtDKHdlLEZlLCEwKTtjb25zdCByPW5ldyB3ZShlLG4pO3JldHVybiBDKHdlLEZlLCExKSxyfXB1c2goZSl7dGhpcy5oZWFwW3RoaXMubGVuZ3RoKytdPWV9cG9wKCl7cmV0dXJuIHRoaXMuaGVhcFstLXRoaXMubGVuZ3RoXX19O2xldCBkbj13ZTtGZT1uZXcgV2Vha01hcCxVKGRuLEZlLCExKTtjb25zdCBvcj1jbGFzc3tjb25zdHJ1Y3RvcihlKXtVKHRoaXMsJGUpO1UodGhpcyxFbik7VSh0aGlzLCR0KTtVKHRoaXMsVnQpO1UodGhpcyxXZSk7VSh0aGlzLE1lKTtVKHRoaXMsQ2UpO1UodGhpcyxZKTtVKHRoaXMsWGUpO1UodGhpcyxsZSk7VSh0aGlzLEl0LHZvaWQgMCk7VSh0aGlzLFJ0LHZvaWQgMCk7VSh0aGlzLE50LHZvaWQgMCk7VSh0aGlzLE10LHZvaWQgMCk7VSh0aGlzLEllLHZvaWQgMCk7dih0aGlzLCJ0dGwiKTt2KHRoaXMsInR0bFJlc29sdXRpb24iKTt2KHRoaXMsInR0bEF1dG9wdXJnZSIpO3YodGhpcywidXBkYXRlQWdlT25HZXQiKTt2KHRoaXMsInVwZGF0ZUFnZU9uSGFzIik7dih0aGlzLCJhbGxvd1N0YWxlIik7dih0aGlzLCJub0Rpc3Bvc2VPblNldCIpO3YodGhpcywibm9VcGRhdGVUVEwiKTt2KHRoaXMsIm1heEVudHJ5U2l6ZSIpO3YodGhpcywic2l6ZUNhbGN1bGF0aW9uIik7dih0aGlzLCJub0RlbGV0ZU9uRmV0Y2hSZWplY3Rpb24iKTt2KHRoaXMsIm5vRGVsZXRlT25TdGFsZUdldCIpO3YodGhpcywiYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydCIpO3YodGhpcywiYWxsb3dTdGFsZU9uRmV0Y2hSZWplY3Rpb24iKTt2KHRoaXMsImlnbm9yZUZldGNoQWJvcnQiKTtVKHRoaXMsdXQsdm9pZCAwKTtVKHRoaXMsQ3Qsdm9pZCAwKTtVKHRoaXMsYXQsdm9pZCAwKTtVKHRoaXMsdHQsdm9pZCAwKTtVKHRoaXMsTCx2b2lkIDApO1UodGhpcyxfdCx2b2lkIDApO1UodGhpcyx4dCx2b2lkIDApO1UodGhpcyxFdCx2b2lkIDApO1UodGhpcyxodCx2b2lkIDApO1UodGhpcyx2dCx2b2lkIDApO1UodGhpcyxmdCx2b2lkIDApO1UodGhpcyxEdCx2b2lkIDApO1UodGhpcyxMdCx2b2lkIDApO1UodGhpcyxPdCx2b2lkIDApO1UodGhpcyxQdCx2b2lkIDApO1UodGhpcyxKdCx2b2lkIDApO1UodGhpcyxwdCx2b2lkIDApO1UodGhpcyxoZSwoKT0+e30pO1UodGhpcyxIdCwoKT0+e30pO1UodGhpcyxWZSwoKT0+e30pO1UodGhpcyxidCwoKT0+ITEpO1UodGhpcyxmZSxlPT57fSk7VSh0aGlzLE5lLChlLG4scik9Pnt9KTtVKHRoaXMsemUsKGUsbixyLGkpPT57aWYocnx8aSl0aHJvdyBuZXcgVHlwZUVycm9yKCJjYW5ub3Qgc2V0IHNpemUgd2l0aG91dCBzZXR0aW5nIG1heFNpemUgb3IgbWF4RW50cnlTaXplIG9uIGNhY2hlIik7cmV0dXJuIDB9KTt2KHRoaXMsUjAsIkxSVUNhY2hlIik7Y29uc3R7bWF4Om49MCx0dGw6cix0dGxSZXNvbHV0aW9uOmk9MSx0dGxBdXRvcHVyZ2U6byx1cGRhdGVBZ2VPbkdldDpzLHVwZGF0ZUFnZU9uSGFzOnUsYWxsb3dTdGFsZTphLGRpc3Bvc2U6bCxkaXNwb3NlQWZ0ZXI6ZCxub0Rpc3Bvc2VPblNldDpfLG5vVXBkYXRlVFRMOk8sbWF4U2l6ZTpiPTAsbWF4RW50cnlTaXplOkY9MCxzaXplQ2FsY3VsYXRpb246UyxmZXRjaE1ldGhvZDpOLG5vRGVsZXRlT25GZXRjaFJlamVjdGlvbjpnLG5vRGVsZXRlT25TdGFsZUdldDpHLGFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uOkssYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydDpWLGlnbm9yZUZldGNoQWJvcnQ6aXR9PWU7aWYobiE9PTAmJiFRdChuKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtYXggb3B0aW9uIG11c3QgYmUgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIik7Y29uc3QgbHQ9bj9WaShuKTpBcnJheTtpZighbHQpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIG1heCB2YWx1ZTogIituKTtpZihDKHRoaXMsSXQsbiksQyh0aGlzLFJ0LGIpLHRoaXMubWF4RW50cnlTaXplPUZ8fGModGhpcyxSdCksdGhpcy5zaXplQ2FsY3VsYXRpb249Uyx0aGlzLnNpemVDYWxjdWxhdGlvbil7aWYoIWModGhpcyxSdCkmJiF0aGlzLm1heEVudHJ5U2l6ZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJjYW5ub3Qgc2V0IHNpemVDYWxjdWxhdGlvbiB3aXRob3V0IHNldHRpbmcgbWF4U2l6ZSBvciBtYXhFbnRyeVNpemUiKTtpZih0eXBlb2YgdGhpcy5zaXplQ2FsY3VsYXRpb24hPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcigic2l6ZUNhbGN1bGF0aW9uIHNldCB0byBub24tZnVuY3Rpb24iKX1pZihOIT09dm9pZCAwJiZ0eXBlb2YgTiE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKCJmZXRjaE1ldGhvZCBtdXN0IGJlIGEgZnVuY3Rpb24gaWYgc3BlY2lmaWVkIik7aWYoQyh0aGlzLEllLE4pLEModGhpcyxKdCwhIU4pLEModGhpcyxhdCxuZXcgTWFwKSxDKHRoaXMsdHQsbmV3IEFycmF5KG4pLmZpbGwodm9pZCAwKSksQyh0aGlzLEwsbmV3IEFycmF5KG4pLmZpbGwodm9pZCAwKSksQyh0aGlzLF90LG5ldyBsdChuKSksQyh0aGlzLHh0LG5ldyBsdChuKSksQyh0aGlzLEV0LDApLEModGhpcyxodCwwKSxDKHRoaXMsdnQsZG4uY3JlYXRlKG4pKSxDKHRoaXMsdXQsMCksQyh0aGlzLEN0LDApLHR5cGVvZiBsPT0iZnVuY3Rpb24iJiZDKHRoaXMsTnQsbCksdHlwZW9mIGQ9PSJmdW5jdGlvbiI/KEModGhpcyxNdCxkKSxDKHRoaXMsZnQsW10pKTooQyh0aGlzLE10LHZvaWQgMCksQyh0aGlzLGZ0LHZvaWQgMCkpLEModGhpcyxQdCwhIWModGhpcyxOdCkpLEModGhpcyxwdCwhIWModGhpcyxNdCkpLHRoaXMubm9EaXNwb3NlT25TZXQ9ISFfLHRoaXMubm9VcGRhdGVUVEw9ISFPLHRoaXMubm9EZWxldGVPbkZldGNoUmVqZWN0aW9uPSEhZyx0aGlzLmFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uPSEhSyx0aGlzLmFsbG93U3RhbGVPbkZldGNoQWJvcnQ9ISFWLHRoaXMuaWdub3JlRmV0Y2hBYm9ydD0hIWl0LHRoaXMubWF4RW50cnlTaXplIT09MCl7aWYoYyh0aGlzLFJ0KSE9PTAmJiFRdChjKHRoaXMsUnQpKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtYXhTaXplIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIGlmIHNwZWNpZmllZCIpO2lmKCFRdCh0aGlzLm1heEVudHJ5U2l6ZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigibWF4RW50cnlTaXplIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIGlmIHNwZWNpZmllZCIpO3codGhpcyxFbixxaSkuY2FsbCh0aGlzKX1pZih0aGlzLmFsbG93U3RhbGU9ISFhLHRoaXMubm9EZWxldGVPblN0YWxlR2V0PSEhRyx0aGlzLnVwZGF0ZUFnZU9uR2V0PSEhcyx0aGlzLnVwZGF0ZUFnZU9uSGFzPSEhdSx0aGlzLnR0bFJlc29sdXRpb249UXQoaSl8fGk9PT0wP2k6MSx0aGlzLnR0bEF1dG9wdXJnZT0hIW8sdGhpcy50dGw9cnx8MCx0aGlzLnR0bCl7aWYoIVF0KHRoaXMudHRsKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJ0dGwgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgaWYgc3BlY2lmaWVkIik7dyh0aGlzLCRlLHVyKS5jYWxsKHRoaXMpfWlmKGModGhpcyxJdCk9PT0wJiZ0aGlzLnR0bD09PTAmJmModGhpcyxSdCk9PT0wKXRocm93IG5ldyBUeXBlRXJyb3IoIkF0IGxlYXN0IG9uZSBvZiBtYXgsIG1heFNpemUsIG9yIHR0bCBpcyByZXF1aXJlZCIpO2lmKCF0aGlzLnR0bEF1dG9wdXJnZSYmIWModGhpcyxJdCkmJiFjKHRoaXMsUnQpKXtjb25zdCBydD0iTFJVX0NBQ0hFX1VOQk9VTkRFRCI7czAocnQpJiYoamkuYWRkKHJ0KSxHaSgiVFRMIGNhY2hpbmcgd2l0aG91dCB0dGxBdXRvcHVyZ2UsIG1heCwgb3IgbWF4U2l6ZSBjYW4gcmVzdWx0IGluIHVuYm91bmRlZCBtZW1vcnkgY29uc3VtcHRpb24uIiwiVW5ib3VuZGVkQ2FjaGVXYXJuaW5nIixydCxvcikpfX1zdGF0aWMgdW5zYWZlRXhwb3NlSW50ZXJuYWxzKGUpe3JldHVybntzdGFydHM6YyhlLEx0KSx0dGxzOmMoZSxPdCksc2l6ZXM6YyhlLER0KSxrZXlNYXA6YyhlLGF0KSxrZXlMaXN0OmMoZSx0dCksdmFsTGlzdDpjKGUsTCksbmV4dDpjKGUsX3QpLHByZXY6YyhlLHh0KSxnZXQgaGVhZCgpe3JldHVybiBjKGUsRXQpfSxnZXQgdGFpbCgpe3JldHVybiBjKGUsaHQpfSxmcmVlOmMoZSx2dCksaXNCYWNrZ3JvdW5kRmV0Y2g6bj0+e3ZhciByO3JldHVybiB3KHI9ZSxZLGV0KS5jYWxsKHIsbil9LGJhY2tncm91bmRGZXRjaDoobixyLGksbyk9Pnt2YXIgcztyZXR1cm4gdyhzPWUsQ2UsVG4pLmNhbGwocyxuLHIsaSxvKX0sbW92ZVRvVGFpbDpuPT57dmFyIHI7cmV0dXJuIHcocj1lLGxlLHFlKS5jYWxsKHIsbil9LGluZGV4ZXM6bj0+e3ZhciByO3JldHVybiB3KHI9ZSwkdCx0ZSkuY2FsbChyLG4pfSxyaW5kZXhlczpuPT57dmFyIHI7cmV0dXJuIHcocj1lLFZ0LGVlKS5jYWxsKHIsbil9LGlzU3RhbGU6bj0+e3ZhciByO3JldHVybiBjKHI9ZSxidCkuY2FsbChyLG4pfX19Z2V0IG1heCgpe3JldHVybiBjKHRoaXMsSXQpfWdldCBtYXhTaXplKCl7cmV0dXJuIGModGhpcyxSdCl9Z2V0IGNhbGN1bGF0ZWRTaXplKCl7cmV0dXJuIGModGhpcyxDdCl9Z2V0IHNpemUoKXtyZXR1cm4gYyh0aGlzLHV0KX1nZXQgZmV0Y2hNZXRob2QoKXtyZXR1cm4gYyh0aGlzLEllKX1nZXQgZGlzcG9zZSgpe3JldHVybiBjKHRoaXMsTnQpfWdldCBkaXNwb3NlQWZ0ZXIoKXtyZXR1cm4gYyh0aGlzLE10KX1nZXRSZW1haW5pbmdUVEwoZSl7cmV0dXJuIGModGhpcyxhdCkuaGFzKGUpPzEvMDowfSplbnRyaWVzKCl7Zm9yKGNvbnN0IGUgb2Ygdyh0aGlzLCR0LHRlKS5jYWxsKHRoaXMpKWModGhpcyxMKVtlXSE9PXZvaWQgMCYmYyh0aGlzLHR0KVtlXSE9PXZvaWQgMCYmIXcodGhpcyxZLGV0KS5jYWxsKHRoaXMsYyh0aGlzLEwpW2VdKSYmKHlpZWxkW2ModGhpcyx0dClbZV0sYyh0aGlzLEwpW2VdXSl9KnJlbnRyaWVzKCl7Zm9yKGNvbnN0IGUgb2Ygdyh0aGlzLFZ0LGVlKS5jYWxsKHRoaXMpKWModGhpcyxMKVtlXSE9PXZvaWQgMCYmYyh0aGlzLHR0KVtlXSE9PXZvaWQgMCYmIXcodGhpcyxZLGV0KS5jYWxsKHRoaXMsYyh0aGlzLEwpW2VdKSYmKHlpZWxkW2ModGhpcyx0dClbZV0sYyh0aGlzLEwpW2VdXSl9KmtleXMoKXtmb3IoY29uc3QgZSBvZiB3KHRoaXMsJHQsdGUpLmNhbGwodGhpcykpe2NvbnN0IG49Yyh0aGlzLHR0KVtlXTtuIT09dm9pZCAwJiYhdyh0aGlzLFksZXQpLmNhbGwodGhpcyxjKHRoaXMsTClbZV0pJiYoeWllbGQgbil9fSpya2V5cygpe2Zvcihjb25zdCBlIG9mIHcodGhpcyxWdCxlZSkuY2FsbCh0aGlzKSl7Y29uc3Qgbj1jKHRoaXMsdHQpW2VdO24hPT12b2lkIDAmJiF3KHRoaXMsWSxldCkuY2FsbCh0aGlzLGModGhpcyxMKVtlXSkmJih5aWVsZCBuKX19KnZhbHVlcygpe2Zvcihjb25zdCBlIG9mIHcodGhpcywkdCx0ZSkuY2FsbCh0aGlzKSljKHRoaXMsTClbZV0hPT12b2lkIDAmJiF3KHRoaXMsWSxldCkuY2FsbCh0aGlzLGModGhpcyxMKVtlXSkmJih5aWVsZCBjKHRoaXMsTClbZV0pfSpydmFsdWVzKCl7Zm9yKGNvbnN0IGUgb2Ygdyh0aGlzLFZ0LGVlKS5jYWxsKHRoaXMpKWModGhpcyxMKVtlXSE9PXZvaWQgMCYmIXcodGhpcyxZLGV0KS5jYWxsKHRoaXMsYyh0aGlzLEwpW2VdKSYmKHlpZWxkIGModGhpcyxMKVtlXSl9W1N5bWJvbC5pdGVyYXRvcl0oKXtyZXR1cm4gdGhpcy5lbnRyaWVzKCl9ZmluZChlLG49e30pe2Zvcihjb25zdCByIG9mIHcodGhpcywkdCx0ZSkuY2FsbCh0aGlzKSl7Y29uc3QgaT1jKHRoaXMsTClbcl0sbz13KHRoaXMsWSxldCkuY2FsbCh0aGlzLGkpP2kuX19zdGFsZVdoaWxlRmV0Y2hpbmc6aTtpZihvIT09dm9pZCAwJiZlKG8sYyh0aGlzLHR0KVtyXSx0aGlzKSlyZXR1cm4gdGhpcy5nZXQoYyh0aGlzLHR0KVtyXSxuKX19Zm9yRWFjaChlLG49dGhpcyl7Zm9yKGNvbnN0IHIgb2Ygdyh0aGlzLCR0LHRlKS5jYWxsKHRoaXMpKXtjb25zdCBpPWModGhpcyxMKVtyXSxvPXcodGhpcyxZLGV0KS5jYWxsKHRoaXMsaSk/aS5fX3N0YWxlV2hpbGVGZXRjaGluZzppO28hPT12b2lkIDAmJmUuY2FsbChuLG8sYyh0aGlzLHR0KVtyXSx0aGlzKX19cmZvckVhY2goZSxuPXRoaXMpe2Zvcihjb25zdCByIG9mIHcodGhpcyxWdCxlZSkuY2FsbCh0aGlzKSl7Y29uc3QgaT1jKHRoaXMsTClbcl0sbz13KHRoaXMsWSxldCkuY2FsbCh0aGlzLGkpP2kuX19zdGFsZVdoaWxlRmV0Y2hpbmc6aTtvIT09dm9pZCAwJiZlLmNhbGwobixvLGModGhpcyx0dClbcl0sdGhpcyl9fXB1cmdlU3RhbGUoKXtsZXQgZT0hMTtmb3IoY29uc3QgbiBvZiB3KHRoaXMsVnQsZWUpLmNhbGwodGhpcyx7YWxsb3dTdGFsZTohMH0pKWModGhpcyxidCkuY2FsbCh0aGlzLG4pJiYodGhpcy5kZWxldGUoYyh0aGlzLHR0KVtuXSksZT0hMCk7cmV0dXJuIGV9aW5mbyhlKXtjb25zdCBuPWModGhpcyxhdCkuZ2V0KGUpO2lmKG49PT12b2lkIDApcmV0dXJuO2NvbnN0IHI9Yyh0aGlzLEwpW25dLGk9dyh0aGlzLFksZXQpLmNhbGwodGhpcyxyKT9yLl9fc3RhbGVXaGlsZUZldGNoaW5nOnI7aWYoaT09PXZvaWQgMClyZXR1cm47Y29uc3Qgbz17dmFsdWU6aX07aWYoYyh0aGlzLE90KSYmYyh0aGlzLEx0KSl7Y29uc3Qgcz1jKHRoaXMsT3QpW25dLHU9Yyh0aGlzLEx0KVtuXTtpZihzJiZ1KXtjb25zdCBhPXMtKG1lLm5vdygpLXUpO28udHRsPWEsby5zdGFydD1EYXRlLm5vdygpfX1yZXR1cm4gYyh0aGlzLER0KSYmKG8uc2l6ZT1jKHRoaXMsRHQpW25dKSxvfWR1bXAoKXtjb25zdCBlPVtdO2Zvcihjb25zdCBuIG9mIHcodGhpcywkdCx0ZSkuY2FsbCh0aGlzLHthbGxvd1N0YWxlOiEwfSkpe2NvbnN0IHI9Yyh0aGlzLHR0KVtuXSxpPWModGhpcyxMKVtuXSxvPXcodGhpcyxZLGV0KS5jYWxsKHRoaXMsaSk/aS5fX3N0YWxlV2hpbGVGZXRjaGluZzppO2lmKG89PT12b2lkIDB8fHI9PT12b2lkIDApY29udGludWU7Y29uc3Qgcz17dmFsdWU6b307aWYoYyh0aGlzLE90KSYmYyh0aGlzLEx0KSl7cy50dGw9Yyh0aGlzLE90KVtuXTtjb25zdCB1PW1lLm5vdygpLWModGhpcyxMdClbbl07cy5zdGFydD1NYXRoLmZsb29yKERhdGUubm93KCktdSl9Yyh0aGlzLER0KSYmKHMuc2l6ZT1jKHRoaXMsRHQpW25dKSxlLnVuc2hpZnQoW3Isc10pfXJldHVybiBlfWxvYWQoZSl7dGhpcy5jbGVhcigpO2Zvcihjb25zdFtuLHJdb2YgZSl7aWYoci5zdGFydCl7Y29uc3QgaT1EYXRlLm5vdygpLXIuc3RhcnQ7ci5zdGFydD1tZS5ub3coKS1pfXRoaXMuc2V0KG4sci52YWx1ZSxyKX19c2V0KGUsbixyPXt9KXt2YXIgTyxiLEYsUyxOO2lmKG49PT12b2lkIDApcmV0dXJuIHRoaXMuZGVsZXRlKGUpLHRoaXM7Y29uc3R7dHRsOmk9dGhpcy50dGwsc3RhcnQ6byxub0Rpc3Bvc2VPblNldDpzPXRoaXMubm9EaXNwb3NlT25TZXQsc2l6ZUNhbGN1bGF0aW9uOnU9dGhpcy5zaXplQ2FsY3VsYXRpb24sc3RhdHVzOmF9PXI7bGV0e25vVXBkYXRlVFRMOmw9dGhpcy5ub1VwZGF0ZVRUTH09cjtjb25zdCBkPWModGhpcyx6ZSkuY2FsbCh0aGlzLGUsbixyLnNpemV8fDAsdSk7aWYodGhpcy5tYXhFbnRyeVNpemUmJmQ+dGhpcy5tYXhFbnRyeVNpemUpcmV0dXJuIGEmJihhLnNldD0ibWlzcyIsYS5tYXhFbnRyeVNpemVFeGNlZWRlZD0hMCksdGhpcy5kZWxldGUoZSksdGhpcztsZXQgXz1jKHRoaXMsdXQpPT09MD92b2lkIDA6Yyh0aGlzLGF0KS5nZXQoZSk7aWYoXz09PXZvaWQgMClfPWModGhpcyx1dCk9PT0wP2ModGhpcyxodCk6Yyh0aGlzLHZ0KS5sZW5ndGghPT0wP2ModGhpcyx2dCkucG9wKCk6Yyh0aGlzLHV0KT09PWModGhpcyxJdCk/dyh0aGlzLE1lLEFuKS5jYWxsKHRoaXMsITEpOmModGhpcyx1dCksYyh0aGlzLHR0KVtfXT1lLGModGhpcyxMKVtfXT1uLGModGhpcyxhdCkuc2V0KGUsXyksYyh0aGlzLF90KVtjKHRoaXMsaHQpXT1fLGModGhpcyx4dClbX109Yyh0aGlzLGh0KSxDKHRoaXMsaHQsXykseW4odGhpcyx1dCkuXysrLGModGhpcyxOZSkuY2FsbCh0aGlzLF8sZCxhKSxhJiYoYS5zZXQ9ImFkZCIpLGw9ITE7ZWxzZXt3KHRoaXMsbGUscWUpLmNhbGwodGhpcyxfKTtjb25zdCBnPWModGhpcyxMKVtfXTtpZihuIT09Zyl7aWYoYyh0aGlzLEp0KSYmdyh0aGlzLFksZXQpLmNhbGwodGhpcyxnKSl7Zy5fX2Fib3J0Q29udHJvbGxlci5hYm9ydChuZXcgRXJyb3IoInJlcGxhY2VkIikpO2NvbnN0e19fc3RhbGVXaGlsZUZldGNoaW5nOkd9PWc7RyE9PXZvaWQgMCYmIXMmJihjKHRoaXMsUHQpJiYoKE89Yyh0aGlzLE50KSk9PW51bGx8fE8uY2FsbCh0aGlzLEcsZSwic2V0IikpLGModGhpcyxwdCkmJigoYj1jKHRoaXMsZnQpKT09bnVsbHx8Yi5wdXNoKFtHLGUsInNldCJdKSkpfWVsc2Ugc3x8KGModGhpcyxQdCkmJigoRj1jKHRoaXMsTnQpKT09bnVsbHx8Ri5jYWxsKHRoaXMsZyxlLCJzZXQiKSksYyh0aGlzLHB0KSYmKChTPWModGhpcyxmdCkpPT1udWxsfHxTLnB1c2goW2csZSwic2V0Il0pKSk7aWYoYyh0aGlzLGZlKS5jYWxsKHRoaXMsXyksYyh0aGlzLE5lKS5jYWxsKHRoaXMsXyxkLGEpLGModGhpcyxMKVtfXT1uLGEpe2Euc2V0PSJyZXBsYWNlIjtjb25zdCBHPWcmJncodGhpcyxZLGV0KS5jYWxsKHRoaXMsZyk/Zy5fX3N0YWxlV2hpbGVGZXRjaGluZzpnO0chPT12b2lkIDAmJihhLm9sZFZhbHVlPUcpfX1lbHNlIGEmJihhLnNldD0idXBkYXRlIil9aWYoaSE9PTAmJiFjKHRoaXMsT3QpJiZ3KHRoaXMsJGUsdXIpLmNhbGwodGhpcyksYyh0aGlzLE90KSYmKGx8fGModGhpcyxWZSkuY2FsbCh0aGlzLF8saSxvKSxhJiZjKHRoaXMsSHQpLmNhbGwodGhpcyxhLF8pKSwhcyYmYyh0aGlzLHB0KSYmYyh0aGlzLGZ0KSl7Y29uc3QgZz1jKHRoaXMsZnQpO2xldCBHO2Zvcig7Rz1nPT1udWxsP3ZvaWQgMDpnLnNoaWZ0KCk7KShOPWModGhpcyxNdCkpPT1udWxsfHxOLmNhbGwodGhpcywuLi5HKX1yZXR1cm4gdGhpc31wb3AoKXt2YXIgZTt0cnl7Zm9yKDtjKHRoaXMsdXQpOyl7Y29uc3Qgbj1jKHRoaXMsTClbYyh0aGlzLEV0KV07aWYodyh0aGlzLE1lLEFuKS5jYWxsKHRoaXMsITApLHcodGhpcyxZLGV0KS5jYWxsKHRoaXMsbikpe2lmKG4uX19zdGFsZVdoaWxlRmV0Y2hpbmcpcmV0dXJuIG4uX19zdGFsZVdoaWxlRmV0Y2hpbmd9ZWxzZSBpZihuIT09dm9pZCAwKXJldHVybiBufX1maW5hbGx5e2lmKGModGhpcyxwdCkmJmModGhpcyxmdCkpe2NvbnN0IG49Yyh0aGlzLGZ0KTtsZXQgcjtmb3IoO3I9bj09bnVsbD92b2lkIDA6bi5zaGlmdCgpOykoZT1jKHRoaXMsTXQpKT09bnVsbHx8ZS5jYWxsKHRoaXMsLi4ucil9fX1oYXMoZSxuPXt9KXtjb25zdHt1cGRhdGVBZ2VPbkhhczpyPXRoaXMudXBkYXRlQWdlT25IYXMsc3RhdHVzOml9PW4sbz1jKHRoaXMsYXQpLmdldChlKTtpZihvIT09dm9pZCAwKXtjb25zdCBzPWModGhpcyxMKVtvXTtpZih3KHRoaXMsWSxldCkuY2FsbCh0aGlzLHMpJiZzLl9fc3RhbGVXaGlsZUZldGNoaW5nPT09dm9pZCAwKXJldHVybiExO2lmKGModGhpcyxidCkuY2FsbCh0aGlzLG8pKWkmJihpLmhhcz0ic3RhbGUiLGModGhpcyxIdCkuY2FsbCh0aGlzLGksbykpO2Vsc2UgcmV0dXJuIHImJmModGhpcyxoZSkuY2FsbCh0aGlzLG8pLGkmJihpLmhhcz0iaGl0IixjKHRoaXMsSHQpLmNhbGwodGhpcyxpLG8pKSwhMH1lbHNlIGkmJihpLmhhcz0ibWlzcyIpO3JldHVybiExfXBlZWsoZSxuPXt9KXtjb25zdHthbGxvd1N0YWxlOnI9dGhpcy5hbGxvd1N0YWxlfT1uLGk9Yyh0aGlzLGF0KS5nZXQoZSk7aWYoaT09PXZvaWQgMHx8IXImJmModGhpcyxidCkuY2FsbCh0aGlzLGkpKXJldHVybjtjb25zdCBvPWModGhpcyxMKVtpXTtyZXR1cm4gdyh0aGlzLFksZXQpLmNhbGwodGhpcyxvKT9vLl9fc3RhbGVXaGlsZUZldGNoaW5nOm99YXN5bmMgZmV0Y2goZSxuPXt9KXtjb25zdHthbGxvd1N0YWxlOnI9dGhpcy5hbGxvd1N0YWxlLHVwZGF0ZUFnZU9uR2V0Omk9dGhpcy51cGRhdGVBZ2VPbkdldCxub0RlbGV0ZU9uU3RhbGVHZXQ6bz10aGlzLm5vRGVsZXRlT25TdGFsZUdldCx0dGw6cz10aGlzLnR0bCxub0Rpc3Bvc2VPblNldDp1PXRoaXMubm9EaXNwb3NlT25TZXQsc2l6ZTphPTAsc2l6ZUNhbGN1bGF0aW9uOmw9dGhpcy5zaXplQ2FsY3VsYXRpb24sbm9VcGRhdGVUVEw6ZD10aGlzLm5vVXBkYXRlVFRMLG5vRGVsZXRlT25GZXRjaFJlamVjdGlvbjpfPXRoaXMubm9EZWxldGVPbkZldGNoUmVqZWN0aW9uLGFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uOk89dGhpcy5hbGxvd1N0YWxlT25GZXRjaFJlamVjdGlvbixpZ25vcmVGZXRjaEFib3J0OmI9dGhpcy5pZ25vcmVGZXRjaEFib3J0LGFsbG93U3RhbGVPbkZldGNoQWJvcnQ6Rj10aGlzLmFsbG93U3RhbGVPbkZldGNoQWJvcnQsY29udGV4dDpTLGZvcmNlUmVmcmVzaDpOPSExLHN0YXR1czpnLHNpZ25hbDpHfT1uO2lmKCFjKHRoaXMsSnQpKXJldHVybiBnJiYoZy5mZXRjaD0iZ2V0IiksdGhpcy5nZXQoZSx7YWxsb3dTdGFsZTpyLHVwZGF0ZUFnZU9uR2V0Omksbm9EZWxldGVPblN0YWxlR2V0Om8sc3RhdHVzOmd9KTtjb25zdCBLPXthbGxvd1N0YWxlOnIsdXBkYXRlQWdlT25HZXQ6aSxub0RlbGV0ZU9uU3RhbGVHZXQ6byx0dGw6cyxub0Rpc3Bvc2VPblNldDp1LHNpemU6YSxzaXplQ2FsY3VsYXRpb246bCxub1VwZGF0ZVRUTDpkLG5vRGVsZXRlT25GZXRjaFJlamVjdGlvbjpfLGFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uOk8sYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydDpGLGlnbm9yZUZldGNoQWJvcnQ6YixzdGF0dXM6ZyxzaWduYWw6R307bGV0IFY9Yyh0aGlzLGF0KS5nZXQoZSk7aWYoVj09PXZvaWQgMCl7ZyYmKGcuZmV0Y2g9Im1pc3MiKTtjb25zdCBpdD13KHRoaXMsQ2UsVG4pLmNhbGwodGhpcyxlLFYsSyxTKTtyZXR1cm4gaXQuX19yZXR1cm5lZD1pdH1lbHNle2NvbnN0IGl0PWModGhpcyxMKVtWXTtpZih3KHRoaXMsWSxldCkuY2FsbCh0aGlzLGl0KSl7Y29uc3QgQj1yJiZpdC5fX3N0YWxlV2hpbGVGZXRjaGluZyE9PXZvaWQgMDtyZXR1cm4gZyYmKGcuZmV0Y2g9ImluZmxpZ2h0IixCJiYoZy5yZXR1cm5lZFN0YWxlPSEwKSksQj9pdC5fX3N0YWxlV2hpbGVGZXRjaGluZzppdC5fX3JldHVybmVkPWl0fWNvbnN0IGx0PWModGhpcyxidCkuY2FsbCh0aGlzLFYpO2lmKCFOJiYhbHQpcmV0dXJuIGcmJihnLmZldGNoPSJoaXQiKSx3KHRoaXMsbGUscWUpLmNhbGwodGhpcyxWKSxpJiZjKHRoaXMsaGUpLmNhbGwodGhpcyxWKSxnJiZjKHRoaXMsSHQpLmNhbGwodGhpcyxnLFYpLGl0O2NvbnN0IHJ0PXcodGhpcyxDZSxUbikuY2FsbCh0aGlzLGUsVixLLFMpLFQ9cnQuX19zdGFsZVdoaWxlRmV0Y2hpbmchPT12b2lkIDAmJnI7cmV0dXJuIGcmJihnLmZldGNoPWx0PyJzdGFsZSI6InJlZnJlc2giLFQmJmx0JiYoZy5yZXR1cm5lZFN0YWxlPSEwKSksVD9ydC5fX3N0YWxlV2hpbGVGZXRjaGluZzpydC5fX3JldHVybmVkPXJ0fX1nZXQoZSxuPXt9KXtjb25zdHthbGxvd1N0YWxlOnI9dGhpcy5hbGxvd1N0YWxlLHVwZGF0ZUFnZU9uR2V0Omk9dGhpcy51cGRhdGVBZ2VPbkdldCxub0RlbGV0ZU9uU3RhbGVHZXQ6bz10aGlzLm5vRGVsZXRlT25TdGFsZUdldCxzdGF0dXM6c309bix1PWModGhpcyxhdCkuZ2V0KGUpO2lmKHUhPT12b2lkIDApe2NvbnN0IGE9Yyh0aGlzLEwpW3VdLGw9dyh0aGlzLFksZXQpLmNhbGwodGhpcyxhKTtyZXR1cm4gcyYmYyh0aGlzLEh0KS5jYWxsKHRoaXMscyx1KSxjKHRoaXMsYnQpLmNhbGwodGhpcyx1KT8ocyYmKHMuZ2V0PSJzdGFsZSIpLGw/KHMmJnImJmEuX19zdGFsZVdoaWxlRmV0Y2hpbmchPT12b2lkIDAmJihzLnJldHVybmVkU3RhbGU9ITApLHI/YS5fX3N0YWxlV2hpbGVGZXRjaGluZzp2b2lkIDApOihvfHx0aGlzLmRlbGV0ZShlKSxzJiZyJiYocy5yZXR1cm5lZFN0YWxlPSEwKSxyP2E6dm9pZCAwKSk6KHMmJihzLmdldD0iaGl0IiksbD9hLl9fc3RhbGVXaGlsZUZldGNoaW5nOih3KHRoaXMsbGUscWUpLmNhbGwodGhpcyx1KSxpJiZjKHRoaXMsaGUpLmNhbGwodGhpcyx1KSxhKSl9ZWxzZSBzJiYocy5nZXQ9Im1pc3MiKX1kZWxldGUoZSl7dmFyIHIsaSxvLHM7bGV0IG49ITE7aWYoYyh0aGlzLHV0KSE9PTApe2NvbnN0IHU9Yyh0aGlzLGF0KS5nZXQoZSk7aWYodSE9PXZvaWQgMClpZihuPSEwLGModGhpcyx1dCk9PT0xKXRoaXMuY2xlYXIoKTtlbHNle2ModGhpcyxmZSkuY2FsbCh0aGlzLHUpO2NvbnN0IGE9Yyh0aGlzLEwpW3VdO2lmKHcodGhpcyxZLGV0KS5jYWxsKHRoaXMsYSk/YS5fX2Fib3J0Q29udHJvbGxlci5hYm9ydChuZXcgRXJyb3IoImRlbGV0ZWQiKSk6KGModGhpcyxQdCl8fGModGhpcyxwdCkpJiYoYyh0aGlzLFB0KSYmKChyPWModGhpcyxOdCkpPT1udWxsfHxyLmNhbGwodGhpcyxhLGUsImRlbGV0ZSIpKSxjKHRoaXMscHQpJiYoKGk9Yyh0aGlzLGZ0KSk9PW51bGx8fGkucHVzaChbYSxlLCJkZWxldGUiXSkpKSxjKHRoaXMsYXQpLmRlbGV0ZShlKSxjKHRoaXMsdHQpW3VdPXZvaWQgMCxjKHRoaXMsTClbdV09dm9pZCAwLHU9PT1jKHRoaXMsaHQpKUModGhpcyxodCxjKHRoaXMseHQpW3VdKTtlbHNlIGlmKHU9PT1jKHRoaXMsRXQpKUModGhpcyxFdCxjKHRoaXMsX3QpW3VdKTtlbHNle2NvbnN0IGw9Yyh0aGlzLHh0KVt1XTtjKHRoaXMsX3QpW2xdPWModGhpcyxfdClbdV07Y29uc3QgZD1jKHRoaXMsX3QpW3VdO2ModGhpcyx4dClbZF09Yyh0aGlzLHh0KVt1XX15bih0aGlzLHV0KS5fLS0sYyh0aGlzLHZ0KS5wdXNoKHUpfX1pZihjKHRoaXMscHQpJiYoKG89Yyh0aGlzLGZ0KSkhPW51bGwmJm8ubGVuZ3RoKSl7Y29uc3QgdT1jKHRoaXMsZnQpO2xldCBhO2Zvcig7YT11PT1udWxsP3ZvaWQgMDp1LnNoaWZ0KCk7KShzPWModGhpcyxNdCkpPT1udWxsfHxzLmNhbGwodGhpcywuLi5hKX1yZXR1cm4gbn1jbGVhcigpe3ZhciBlLG4scjtmb3IoY29uc3QgaSBvZiB3KHRoaXMsVnQsZWUpLmNhbGwodGhpcyx7YWxsb3dTdGFsZTohMH0pKXtjb25zdCBvPWModGhpcyxMKVtpXTtpZih3KHRoaXMsWSxldCkuY2FsbCh0aGlzLG8pKW8uX19hYm9ydENvbnRyb2xsZXIuYWJvcnQobmV3IEVycm9yKCJkZWxldGVkIikpO2Vsc2V7Y29uc3Qgcz1jKHRoaXMsdHQpW2ldO2ModGhpcyxQdCkmJigoZT1jKHRoaXMsTnQpKT09bnVsbHx8ZS5jYWxsKHRoaXMsbyxzLCJkZWxldGUiKSksYyh0aGlzLHB0KSYmKChuPWModGhpcyxmdCkpPT1udWxsfHxuLnB1c2goW28scywiZGVsZXRlIl0pKX19aWYoYyh0aGlzLGF0KS5jbGVhcigpLGModGhpcyxMKS5maWxsKHZvaWQgMCksYyh0aGlzLHR0KS5maWxsKHZvaWQgMCksYyh0aGlzLE90KSYmYyh0aGlzLEx0KSYmKGModGhpcyxPdCkuZmlsbCgwKSxjKHRoaXMsTHQpLmZpbGwoMCkpLGModGhpcyxEdCkmJmModGhpcyxEdCkuZmlsbCgwKSxDKHRoaXMsRXQsMCksQyh0aGlzLGh0LDApLGModGhpcyx2dCkubGVuZ3RoPTAsQyh0aGlzLEN0LDApLEModGhpcyx1dCwwKSxjKHRoaXMscHQpJiZjKHRoaXMsZnQpKXtjb25zdCBpPWModGhpcyxmdCk7bGV0IG87Zm9yKDtvPWk9PW51bGw/dm9pZCAwOmkuc2hpZnQoKTspKHI9Yyh0aGlzLE10KSk9PW51bGx8fHIuY2FsbCh0aGlzLC4uLm8pfX19O2xldCBpcj1vcjtSMD1TeW1ib2wudG9TdHJpbmdUYWcsSXQ9bmV3IFdlYWtNYXAsUnQ9bmV3IFdlYWtNYXAsTnQ9bmV3IFdlYWtNYXAsTXQ9bmV3IFdlYWtNYXAsSWU9bmV3IFdlYWtNYXAsdXQ9bmV3IFdlYWtNYXAsQ3Q9bmV3IFdlYWtNYXAsYXQ9bmV3IFdlYWtNYXAsdHQ9bmV3IFdlYWtNYXAsTD1uZXcgV2Vha01hcCxfdD1uZXcgV2Vha01hcCx4dD1uZXcgV2Vha01hcCxFdD1uZXcgV2Vha01hcCxodD1uZXcgV2Vha01hcCx2dD1uZXcgV2Vha01hcCxmdD1uZXcgV2Vha01hcCxEdD1uZXcgV2Vha01hcCxMdD1uZXcgV2Vha01hcCxPdD1uZXcgV2Vha01hcCxQdD1uZXcgV2Vha01hcCxKdD1uZXcgV2Vha01hcCxwdD1uZXcgV2Vha01hcCwkZT1uZXcgV2Vha1NldCx1cj1mdW5jdGlvbigpe2NvbnN0IGU9bmV3IGxuKGModGhpcyxJdCkpLG49bmV3IGxuKGModGhpcyxJdCkpO0ModGhpcyxPdCxlKSxDKHRoaXMsTHQsbiksQyh0aGlzLFZlLChvLHMsdT1tZS5ub3coKSk9PntpZihuW29dPXMhPT0wP3U6MCxlW29dPXMscyE9PTAmJnRoaXMudHRsQXV0b3B1cmdlKXtjb25zdCBhPXNldFRpbWVvdXQoKCk9PntjKHRoaXMsYnQpLmNhbGwodGhpcyxvKSYmdGhpcy5kZWxldGUoYyh0aGlzLHR0KVtvXSl9LHMrMSk7YS51bnJlZiYmYS51bnJlZigpfX0pLEModGhpcyxoZSxvPT57bltvXT1lW29dIT09MD9tZS5ub3coKTowfSksQyh0aGlzLEh0LChvLHMpPT57aWYoZVtzXSl7Y29uc3QgdT1lW3NdLGE9bltzXTtpZighdXx8IWEpcmV0dXJuO28udHRsPXUsby5zdGFydD1hLG8ubm93PXJ8fGkoKTtjb25zdCBsPW8ubm93LWE7by5yZW1haW5pbmdUVEw9dS1sfX0pO2xldCByPTA7Y29uc3QgaT0oKT0+e2NvbnN0IG89bWUubm93KCk7aWYodGhpcy50dGxSZXNvbHV0aW9uPjApe3I9bztjb25zdCBzPXNldFRpbWVvdXQoKCk9PnI9MCx0aGlzLnR0bFJlc29sdXRpb24pO3MudW5yZWYmJnMudW5yZWYoKX1yZXR1cm4gb307dGhpcy5nZXRSZW1haW5pbmdUVEw9bz0+e2NvbnN0IHM9Yyh0aGlzLGF0KS5nZXQobyk7aWYocz09PXZvaWQgMClyZXR1cm4gMDtjb25zdCB1PWVbc10sYT1uW3NdO2lmKCF1fHwhYSlyZXR1cm4gMS8wO2NvbnN0IGw9KHJ8fGkoKSktYTtyZXR1cm4gdS1sfSxDKHRoaXMsYnQsbz0+e2NvbnN0IHM9bltvXSx1PWVbb107cmV0dXJuISF1JiYhIXMmJihyfHxpKCkpLXM+dX0pfSxoZT1uZXcgV2Vha01hcCxIdD1uZXcgV2Vha01hcCxWZT1uZXcgV2Vha01hcCxidD1uZXcgV2Vha01hcCxFbj1uZXcgV2Vha1NldCxxaT1mdW5jdGlvbigpe2NvbnN0IGU9bmV3IGxuKGModGhpcyxJdCkpO0ModGhpcyxDdCwwKSxDKHRoaXMsRHQsZSksQyh0aGlzLGZlLG49PntDKHRoaXMsQ3QsYyh0aGlzLEN0KS1lW25dKSxlW25dPTB9KSxDKHRoaXMsemUsKG4scixpLG8pPT57aWYodyh0aGlzLFksZXQpLmNhbGwodGhpcyxyKSlyZXR1cm4gMDtpZighUXQoaSkpaWYobyl7aWYodHlwZW9mIG8hPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcigic2l6ZUNhbGN1bGF0aW9uIG11c3QgYmUgYSBmdW5jdGlvbiIpO2lmKGk9byhyLG4pLCFRdChpKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJzaXplQ2FsY3VsYXRpb24gcmV0dXJuIGludmFsaWQgKGV4cGVjdCBwb3NpdGl2ZSBpbnRlZ2VyKSIpfWVsc2UgdGhyb3cgbmV3IFR5cGVFcnJvcigiaW52YWxpZCBzaXplIHZhbHVlIChtdXN0IGJlIHBvc2l0aXZlIGludGVnZXIpLiBXaGVuIG1heFNpemUgb3IgbWF4RW50cnlTaXplIGlzIHVzZWQsIHNpemVDYWxjdWxhdGlvbiBvciBzaXplIG11c3QgYmUgc2V0LiIpO3JldHVybiBpfSksQyh0aGlzLE5lLChuLHIsaSk9PntpZihlW25dPXIsYyh0aGlzLFJ0KSl7Y29uc3Qgbz1jKHRoaXMsUnQpLWVbbl07Zm9yKDtjKHRoaXMsQ3QpPm87KXcodGhpcyxNZSxBbikuY2FsbCh0aGlzLCEwKX1DKHRoaXMsQ3QsYyh0aGlzLEN0KStlW25dKSxpJiYoaS5lbnRyeVNpemU9cixpLnRvdGFsQ2FsY3VsYXRlZFNpemU9Yyh0aGlzLEN0KSl9KX0sZmU9bmV3IFdlYWtNYXAsTmU9bmV3IFdlYWtNYXAsemU9bmV3IFdlYWtNYXAsJHQ9bmV3IFdlYWtTZXQsdGU9ZnVuY3Rpb24qKHthbGxvd1N0YWxlOmU9dGhpcy5hbGxvd1N0YWxlfT17fSl7aWYoYyh0aGlzLHV0KSlmb3IobGV0IG49Yyh0aGlzLGh0KTshKCF3KHRoaXMsV2UsY3IpLmNhbGwodGhpcyxuKXx8KChlfHwhYyh0aGlzLGJ0KS5jYWxsKHRoaXMsbikpJiYoeWllbGQgbiksbj09PWModGhpcyxFdCkpKTspbj1jKHRoaXMseHQpW25dfSxWdD1uZXcgV2Vha1NldCxlZT1mdW5jdGlvbiooe2FsbG93U3RhbGU6ZT10aGlzLmFsbG93U3RhbGV9PXt9KXtpZihjKHRoaXMsdXQpKWZvcihsZXQgbj1jKHRoaXMsRXQpOyEoIXcodGhpcyxXZSxjcikuY2FsbCh0aGlzLG4pfHwoKGV8fCFjKHRoaXMsYnQpLmNhbGwodGhpcyxuKSkmJih5aWVsZCBuKSxuPT09Yyh0aGlzLGh0KSkpOyluPWModGhpcyxfdClbbl19LFdlPW5ldyBXZWFrU2V0LGNyPWZ1bmN0aW9uKGUpe3JldHVybiBlIT09dm9pZCAwJiZjKHRoaXMsYXQpLmdldChjKHRoaXMsdHQpW2VdKT09PWV9LE1lPW5ldyBXZWFrU2V0LEFuPWZ1bmN0aW9uKGUpe3ZhciBvLHM7Y29uc3Qgbj1jKHRoaXMsRXQpLHI9Yyh0aGlzLHR0KVtuXSxpPWModGhpcyxMKVtuXTtyZXR1cm4gYyh0aGlzLEp0KSYmdyh0aGlzLFksZXQpLmNhbGwodGhpcyxpKT9pLl9fYWJvcnRDb250cm9sbGVyLmFib3J0KG5ldyBFcnJvcigiZXZpY3RlZCIpKTooYyh0aGlzLFB0KXx8Yyh0aGlzLHB0KSkmJihjKHRoaXMsUHQpJiYoKG89Yyh0aGlzLE50KSk9PW51bGx8fG8uY2FsbCh0aGlzLGksciwiZXZpY3QiKSksYyh0aGlzLHB0KSYmKChzPWModGhpcyxmdCkpPT1udWxsfHxzLnB1c2goW2ksciwiZXZpY3QiXSkpKSxjKHRoaXMsZmUpLmNhbGwodGhpcyxuKSxlJiYoYyh0aGlzLHR0KVtuXT12b2lkIDAsYyh0aGlzLEwpW25dPXZvaWQgMCxjKHRoaXMsdnQpLnB1c2gobikpLGModGhpcyx1dCk9PT0xPyhDKHRoaXMsRXQsQyh0aGlzLGh0LDApKSxjKHRoaXMsdnQpLmxlbmd0aD0wKTpDKHRoaXMsRXQsYyh0aGlzLF90KVtuXSksYyh0aGlzLGF0KS5kZWxldGUocikseW4odGhpcyx1dCkuXy0tLG59LENlPW5ldyBXZWFrU2V0LFRuPWZ1bmN0aW9uKGUsbixyLGkpe2NvbnN0IG89bj09PXZvaWQgMD92b2lkIDA6Yyh0aGlzLEwpW25dO2lmKHcodGhpcyxZLGV0KS5jYWxsKHRoaXMsbykpcmV0dXJuIG87Y29uc3Qgcz1uZXcgZm4se3NpZ25hbDp1fT1yO3U9PW51bGx8fHUuYWRkRXZlbnRMaXN0ZW5lcigiYWJvcnQiLCgpPT5zLmFib3J0KHUucmVhc29uKSx7c2lnbmFsOnMuc2lnbmFsfSk7Y29uc3QgYT17c2lnbmFsOnMuc2lnbmFsLG9wdGlvbnM6cixjb250ZXh0Oml9LGw9KFMsTj0hMSk9Pntjb25zdHthYm9ydGVkOmd9PXMuc2lnbmFsLEc9ci5pZ25vcmVGZXRjaEFib3J0JiZTIT09dm9pZCAwO2lmKHIuc3RhdHVzJiYoZyYmIU4/KHIuc3RhdHVzLmZldGNoQWJvcnRlZD0hMCxyLnN0YXR1cy5mZXRjaEVycm9yPXMuc2lnbmFsLnJlYXNvbixHJiYoci5zdGF0dXMuZmV0Y2hBYm9ydElnbm9yZWQ9ITApKTpyLnN0YXR1cy5mZXRjaFJlc29sdmVkPSEwKSxnJiYhRyYmIU4pcmV0dXJuIF8ocy5zaWduYWwucmVhc29uKTtjb25zdCBLPWI7cmV0dXJuIGModGhpcyxMKVtuXT09PWImJihTPT09dm9pZCAwP0suX19zdGFsZVdoaWxlRmV0Y2hpbmc/Yyh0aGlzLEwpW25dPUsuX19zdGFsZVdoaWxlRmV0Y2hpbmc6dGhpcy5kZWxldGUoZSk6KHIuc3RhdHVzJiYoci5zdGF0dXMuZmV0Y2hVcGRhdGVkPSEwKSx0aGlzLnNldChlLFMsYS5vcHRpb25zKSkpLFN9LGQ9Uz0+KHIuc3RhdHVzJiYoci5zdGF0dXMuZmV0Y2hSZWplY3RlZD0hMCxyLnN0YXR1cy5mZXRjaEVycm9yPVMpLF8oUykpLF89Uz0+e2NvbnN0e2Fib3J0ZWQ6Tn09cy5zaWduYWwsZz1OJiZyLmFsbG93U3RhbGVPbkZldGNoQWJvcnQsRz1nfHxyLmFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uLEs9R3x8ci5ub0RlbGV0ZU9uRmV0Y2hSZWplY3Rpb24sVj1iO2lmKGModGhpcyxMKVtuXT09PWImJighS3x8Vi5fX3N0YWxlV2hpbGVGZXRjaGluZz09PXZvaWQgMD90aGlzLmRlbGV0ZShlKTpnfHwoYyh0aGlzLEwpW25dPVYuX19zdGFsZVdoaWxlRmV0Y2hpbmcpKSxHKXJldHVybiByLnN0YXR1cyYmVi5fX3N0YWxlV2hpbGVGZXRjaGluZyE9PXZvaWQgMCYmKHIuc3RhdHVzLnJldHVybmVkU3RhbGU9ITApLFYuX19zdGFsZVdoaWxlRmV0Y2hpbmc7aWYoVi5fX3JldHVybmVkPT09Vil0aHJvdyBTfSxPPShTLE4pPT57dmFyIEc7Y29uc3QgZz0oRz1jKHRoaXMsSWUpKT09bnVsbD92b2lkIDA6Ry5jYWxsKHRoaXMsZSxvLGEpO2cmJmcgaW5zdGFuY2VvZiBQcm9taXNlJiZnLnRoZW4oSz0+UyhLPT09dm9pZCAwP3ZvaWQgMDpLKSxOKSxzLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsKCk9PnsoIXIuaWdub3JlRmV0Y2hBYm9ydHx8ci5hbGxvd1N0YWxlT25GZXRjaEFib3J0KSYmKFModm9pZCAwKSxyLmFsbG93U3RhbGVPbkZldGNoQWJvcnQmJihTPUs9PmwoSywhMCkpKX0pfTtyLnN0YXR1cyYmKHIuc3RhdHVzLmZldGNoRGlzcGF0Y2hlZD0hMCk7Y29uc3QgYj1uZXcgUHJvbWlzZShPKS50aGVuKGwsZCksRj1PYmplY3QuYXNzaWduKGIse19fYWJvcnRDb250cm9sbGVyOnMsX19zdGFsZVdoaWxlRmV0Y2hpbmc6byxfX3JldHVybmVkOnZvaWQgMH0pO3JldHVybiBuPT09dm9pZCAwPyh0aGlzLnNldChlLEYsey4uLmEub3B0aW9ucyxzdGF0dXM6dm9pZCAwfSksbj1jKHRoaXMsYXQpLmdldChlKSk6Yyh0aGlzLEwpW25dPUYsRn0sWT1uZXcgV2Vha1NldCxldD1mdW5jdGlvbihlKXtpZighYyh0aGlzLEp0KSlyZXR1cm4hMTtjb25zdCBuPWU7cmV0dXJuISFuJiZuIGluc3RhbmNlb2YgUHJvbWlzZSYmbi5oYXNPd25Qcm9wZXJ0eSgiX19zdGFsZVdoaWxlRmV0Y2hpbmciKSYmbi5fX2Fib3J0Q29udHJvbGxlciBpbnN0YW5jZW9mIGZufSxYZT1uZXcgV2Vha1NldCxocj1mdW5jdGlvbihlLG4pe2ModGhpcyx4dClbbl09ZSxjKHRoaXMsX3QpW2VdPW59LGxlPW5ldyBXZWFrU2V0LHFlPWZ1bmN0aW9uKGUpe2UhPT1jKHRoaXMsaHQpJiYoZT09PWModGhpcyxFdCk/Qyh0aGlzLEV0LGModGhpcyxfdClbZV0pOncodGhpcyxYZSxocikuY2FsbCh0aGlzLGModGhpcyx4dClbZV0sYyh0aGlzLF90KVtlXSksdyh0aGlzLFhlLGhyKS5jYWxsKHRoaXMsYyh0aGlzLGh0KSxlKSxDKHRoaXMsaHQsZSkpfTtjb25zdCB6aT1uZXcgaXIoe21heDoxZTN9KSxhMD0odCxlLG4pPT57Y29uc3Qgcj1KU09OLnN0cmluZ2lmeSh0LnByb3BlcnRpZXMpLGk9emkuZ2V0KHIpO2lmKGkpcmV0dXJuIGk7Y29uc3Qgbz0oKCk9Pntzd2l0Y2gocmUudHlwZXNbdC50eXBlXSl7Y2FzZSJQb2x5Z29uIjpyZXR1cm4icG9seWdvbiI7Y2FzZSJMaW5lU3RyaW5nIjpyZXR1cm4icG9seWxpbmUiO2Nhc2UiUG9pbnQiOnJldHVybiJtYXJrZXIiO2RlZmF1bHQ6cmV0dXJufX0pKCkscz0oKCk9PntpZigobj09bnVsbD92b2lkIDA6bi50eXBlKSE9PSJzaW1wbGUifHwhbylyZXR1cm47Y29uc3QgYT11MCgiIix0LGUsbyk7aWYoYSlyZXR1cm4gaG49PW51bGw/dm9pZCAwOmhuKG4sYSl9KSgpLHU9KCgpPT57aWYobz09PSJwb2x5Z29uIil7Y29uc3QgYT1zPT1udWxsP3ZvaWQgMDpzLnBvbHlnb247cmV0dXJue2ZpbGxTdHlsZTooKGE9PW51bGw/dm9pZCAwOmEuZmlsbCk/PyEwKSYmKChhPT1udWxsP3ZvaWQgMDphLnNob3cpPz8hMCk/YT09bnVsbD92b2lkIDA6YS5maWxsQ29sb3I6InJnYmEoMCwwLDAsMCkiLHN0cm9rZVN0eWxlOmEhPW51bGwmJmEuc3Ryb2tlJiYoKGE9PW51bGw/dm9pZCAwOmEuc2hvdyk/PyEwKT9hPT1udWxsP3ZvaWQgMDphLnN0cm9rZUNvbG9yOiJyZ2JhKDAsMCwwLDApIixsaW5lV2lkdGg6YT09bnVsbD92b2lkIDA6YS5zdHJva2VXaWR0aCxsaW5lSm9pbjphPT1udWxsP3ZvaWQgMDphLmxpbmVKb2lufX1pZihvPT09InBvbHlsaW5lIil7Y29uc3QgYT1zPT1udWxsP3ZvaWQgMDpzLnBvbHlsaW5lO3JldHVybntmaWxsU3R5bGU6KChhPT1udWxsP3ZvaWQgMDphLnN0cm9rZUNvbG9yKT8/ITApJiYoKGE9PW51bGw/dm9pZCAwOmEuc2hvdyk/PyEwKT9hPT1udWxsP3ZvaWQgMDphLnN0cm9rZUNvbG9yOiJyZ2JhKDAsMCwwLDApIixzdHJva2VTdHlsZTphIT1udWxsJiZhLnN0cm9rZUNvbG9yJiYoKGE9PW51bGw/dm9pZCAwOmEuc2hvdyk/PyEwKT9hPT1udWxsP3ZvaWQgMDphLnN0cm9rZUNvbG9yOiJyZ2JhKDAsMCwwLDApIixsaW5lV2lkdGg6YT09bnVsbD92b2lkIDA6YS5zdHJva2VXaWR0aH19aWYobz09PSJtYXJrZXIiKXtjb25zdCBhPXM9PW51bGw/dm9pZCAwOnMubWFya2VyO3JldHVybntmaWxsU3R5bGU6KChhPT1udWxsP3ZvaWQgMDphLnBvaW50Q29sb3IpPz8hMCkmJigoYT09bnVsbD92b2lkIDA6YS5zaG93KT8/ITApP2E9PW51bGw/dm9pZCAwOmEucG9pbnRDb2xvcjoicmdiYSgwLDAsMCwwKSIsc3Ryb2tlU3R5bGU6YSE9bnVsbCYmYS5wb2ludENvbG9yJiYoKGE9PW51bGw/dm9pZCAwOmEuc2hvdyk/PyEwKT9hPT1udWxsP3ZvaWQgMDphLnBvaW50Q29sb3I6InJnYmEoMCwwLDAsMCkiLGxpbmVXaWR0aDphPT1udWxsP3ZvaWQgMDphLnBvaW50U2l6ZX19fSkoKTtyZXR1cm4gemkuc2V0KHIsdSksdX0sdTA9KHQsZSxuLHIpPT57Y29uc3QgaT1lLmxvYWRHZW9tZXRyeSgpLFtvLHNdPSgoKT0+e2lmKHI9PT0icG9seWdvbiIpcmV0dXJuWyJQb2x5Z29uIixpLm1hcCh1PT51Lm1hcChhPT5bYS54LGEueV0pKV07aWYocj09PSJwb2x5bGluZSIpcmV0dXJuWyJMaW5lU3RyaW5nIixpWzBdLm1hcCh1PT5bdS54LHUueV0pXTtpZihyPT09Im1hcmtlciIpcmV0dXJuWyJQb2ludCIsW2lbMF1bMF0ueCxpWzBdWzBdLnldXTt0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgYXBwZWFyYW5jZSAke3J9YCl9KSgpO3JldHVybnt0eXBlOiJmZWF0dXJlIixpZDp0LGdlb21ldHJ5Ont0eXBlOm8sY29vcmRpbmF0ZXM6c30scHJvcGVydGllczplLnByb3BlcnRpZXMscmFuZ2U6e3g6bi54LHk6bi55LHo6bi5sZXZlbH19fTtmdW5jdGlvbiBjMCh0KXtyZXR1cm4gZjAodCk9PT1ibi5DT1VOVEVSX0NMT0NLV0lTRX1mdW5jdGlvbiBXaSh0LGUpe2NvbnN0IG49dC54LHI9dC55O2xldCBpPSExO2ZvcihsZXQgbz0wLHM9ZS5sZW5ndGgtMTtvPGUubGVuZ3RoO3M9bysrKXtjb25zdCB1PWVbb10ueCxhPWVbb10ueSxsPWVbc10ueCxkPWVbc10ueTthPnIhPWQ+ciYmbjwobC11KSooci1hKS8oZC1hKSt1JiYoaT0haSl9cmV0dXJuIGl9ZnVuY3Rpb24gaDAodCxlKXtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKylpZihXaShlLHRbbl0pKXtsZXQgcj0hMTtmb3IoO24rMTx0Lmxlbmd0aCYmIWMwKHRbbisxXSk7KW4rKywhciYmV2koZSx0W25dKSYmKHI9ITApO2lmKCFyKXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIGYwKHQpe2NvbnN0IGU9dC5sZW5ndGg7bGV0IG49dFtlLTFdLngqKHRbMF0ueS10W2UtMl0ueSkrdFswXS54Kih0WzFdLnktdFtlLTFdLnkpO2ZvcihsZXQgcj0xO3I8PWUtMjtyKyspbis9dFtyXS54Kih0W3IrMV0ueS10W3ItMV0ueSk7aWYoaXNOYU4obikpdGhyb3cgbmV3IEVycm9yO3JldHVybiBuPjA/Ym4uQ09VTlRFUl9DTE9DS1dJU0U6Ym4uQ0xPQ0tXSVNFfWNvbnN0IEdlPTI1NjtjbGFzcyBsMHtjb25zdHJ1Y3RvcihlKXt2KHRoaXMsIl91cmxUZW1wbGF0ZSIpO3YodGhpcywiX3BhcnNlVGlsZSIpO3YodGhpcywiX3RpbGluZ1NjaGVtZSIpO3YodGhpcywiX2xheWVyTmFtZXMiKTt2KHRoaXMsIl90aWxlV2lkdGgiKTt2KHRoaXMsIl90aWxlSGVpZ2h0Iik7dih0aGlzLCJfdGlsZUNhY2hlcyIpO3RoaXMuX3BhcnNlVGlsZT1kMCx0aGlzLl91cmxUZW1wbGF0ZT1lLnVybFRlbXBsYXRlLHRoaXMuX3RpbGVXaWR0aD1HZSx0aGlzLl90aWxlSGVpZ2h0PUdlLHRoaXMuX2xheWVyTmFtZXM9ZS5sYXllck5hbWVzLHRoaXMuX3RpbGluZ1NjaGVtZT1uZXcga3R9YXN5bmMgcmVuZGVyKGUsbixyLGkpe2NvbnN0IG89WGkodGhpcy5fdXJsVGVtcGxhdGUsbik7YXdhaXQgUHJvbWlzZS5hbGwodGhpcy5fbGF5ZXJOYW1lcy5tYXAocz0+dGhpcy5fcmVuZGVyQ2FudmFzKG8sZSxuLHMscixpKSkpfWFzeW5jIF9yZW5kZXJDYW52YXMoZSxuLHIsaSxvLHMpe2lmKCFlKXJldHVybjtjb25zdCB1PWF3YWl0IHRoaXMuX2NhY2hlZFRpbGUoZSksbD1pLnNwbGl0KC8sICovKS5maWx0ZXIoQm9vbGVhbikubWFwKGQ9PnU9PW51bGw/dm9pZCAwOnUubGF5ZXJzW2RdKTtsJiYobi5zdHJva2VTdHlsZT0iYmxhY2siLG4uZmlsbFN0eWxlPSJibGFjayIsbi5saW5lV2lkdGg9MSxuLm1pdGVyTGltaXQ9MixuLnNldFRyYW5zZm9ybSh0aGlzLl90aWxlV2lkdGgqby9HZSwwLDAsdGhpcy5fdGlsZUhlaWdodCpvL0dlLDAsMCksbC5mb3JFYWNoKGQ9PntpZighZClyZXR1cm47Y29uc3QgXz1HZS9kLmV4dGVudDtmb3IobGV0IE89MDtPPGQubGVuZ3RoO08rKyl7Y29uc3QgYj1kLmZlYXR1cmUoTyksRj1hMChiLHIscyk7aWYoIUYpY29udGludWU7bi5maWxsU3R5bGU9Ri5maWxsU3R5bGU/P24uZmlsbFN0eWxlLG4uc3Ryb2tlU3R5bGU9Ri5zdHJva2VTdHlsZT8/bi5zdHJva2VTdHlsZSxuLmxpbmVXaWR0aD1GLmxpbmVXaWR0aD8/bi5saW5lV2lkdGgsbi5saW5lSm9pbj1GLmxpbmVKb2luPz9uLmxpbmVKb2luO2NvbnN0IFM9Yi5sb2FkR2VvbWV0cnkoKTtyZS50eXBlc1tiLnR5cGVdPT09IlBvbHlnb24iP3RoaXMuX3JlbmRlclBvbHlnb24obixTLF8sKEYubGluZVdpZHRoPz8xKT4wKTpyZS50eXBlc1tiLnR5cGVdPT09IlBvaW50Ij90aGlzLl9yZW5kZXJQb2ludChuLFMsXyk6cmUudHlwZXNbYi50eXBlXT09PSJMaW5lU3RyaW5nIj90aGlzLl9yZW5kZXJMaW5lU3RyaW5nKG4sUyxfKTpjb25zb2xlLmVycm9yKGBVbmV4cGVjdGVkIGdlb21ldHJ5IHR5cGU6ICR7Yi50eXBlfSBpbiByZWdpb24gbWFwIG9uIHRpbGUgJHtbci5sZXZlbCxyLngsci55XS5qb2luKCIvIil9YCl9fSkpfV9yZW5kZXJQb2x5Z29uKGUsbixyLGkpe2UuYmVnaW5QYXRoKCk7Y29uc3Qgbz0oKT0+e2kmJmUuc3Ryb2tlKCksZS5maWxsKCl9O2xldCBzPTA7Zm9yKGxldCB1PTA7dTxuLmxlbmd0aDt1Kyspe2NvbnN0IGE9blt1XTtzK2EubGVuZ3RoPjU0MDAmJihvKCkscz0wLGUuYmVnaW5QYXRoKCkpO2xldCBsPWFbMF07ZS5tb3ZlVG8obC54KnIsbC55KnIpO2ZvcihsZXQgZD0xO2Q8YS5sZW5ndGg7ZCsrKWw9YVtkXSxlLmxpbmVUbyhsLngqcixsLnkqcik7cys9YS5sZW5ndGh9cz4wJiZvKCl9X3JlbmRlclBvaW50KGUsbixyKXtlLmJlZ2luUGF0aCgpO2ZvcihsZXQgaT0wO2k8bi5sZW5ndGg7aSsrKXtjb25zdCBvPW5baV1bMF0sW3MsdV09W28ueCpyLG8ueSpyXSxhPWUubGluZVdpZHRoO2UuYmVnaW5QYXRoKCksZS5hcmMocyx1LGEsMCwyKk1hdGguUEkpLGUuZmlsbCgpfX1fcmVuZGVyTGluZVN0cmluZyhlLG4scil7ZS5iZWdpblBhdGgoKTtmb3IobGV0IGk9MDtpPG4ubGVuZ3RoO2krKyl7bGV0IG89bltpXVswXTtlLm1vdmVUbyhvLngqcixvLnkqcik7Zm9yKGxldCBzPTE7czxuW2ldLmxlbmd0aDtzKyspbz1uW2ldW3NdLGUubGluZVRvKG8ueCpyLG8ueSpyKX1lLnN0cm9rZSgpfXBpY2tGZWF0dXJlcyhlLG4scixpKXtjb25zdCBvPVhpKHRoaXMuX3VybFRlbXBsYXRlLGUpO3JldHVybiB0aGlzLl9waWNrRmVhdHVyZXNGcm9tTGF5ZXIobyxlLG4scixpKX1hc3luYyBfcGlja0ZlYXR1cmVzRnJvbUxheWVyKGUsbixyLGksbyl7dHJ5e2NvbnN0IHM9YXdhaXQgdGhpcy5fY2FjaGVkVGlsZShlKTtyZXR1cm4gcz8oYXdhaXQgUHJvbWlzZS5hbGwodGhpcy5fbGF5ZXJOYW1lcy5tYXAoYXN5bmMgYT0+e2NvbnN0IGw9cy5sYXllcnNbYV07aWYoIWwpcmV0dXJuW107Y29uc3QgZD1hd2FpdCB0aGlzLl9waWNrRmVhdHVyZXMobixyLGksbCxvKTtyZXR1cm4gZHx8W119KSkpLmZsYXQoKTpbXX1jYXRjaHtyZXR1cm5bXX19YXN5bmMgX3BpY2tGZWF0dXJlcyhlLG4scixpLG8pe2NvbnN0IHM9dGhpcy5fdGlsaW5nU2NoZW1lLnRpbGVYWVRvTmF0aXZlUmVjdGFuZ2xlKGUueCxlLnksZS5sZXZlbCksdT1bcy53ZXN0LHMuZWFzdF0sYT1bcy5ub3J0aCxzLnNvdXRoXSxsPWZ1bmN0aW9uKEYsUyxOLGcsRyl7Y29uc3QgSz1uZXcgQTtBLnN1YnRyYWN0KEYsbmV3IEEoU1swXSxOWzBdKSxLKTtjb25zdCBWPW5ldyBBKChnWzFdLWdbMF0pLyhTWzFdLVNbMF0pLChHWzFdLUdbMF0pLyhOWzFdLU5bMF0pKTtyZXR1cm4gQS5hZGQoQS5tdWx0aXBseUNvbXBvbmVudHMoSyxWLG5ldyBBKSxuZXcgQShnWzBdLEdbMF0pLG5ldyBBKX0sZD1bXSxfPVswLGkuZXh0ZW50LTFdLE89bChBLmZyb21DYXJ0ZXNpYW4zKHRoaXMuX3RpbGluZ1NjaGVtZS5wcm9qZWN0aW9uLnByb2plY3QobmV3IEgobixyKSkpLHUsYSxfLF8pLGI9bmV3IFNyKE8ueCxPLnkpO2ZvcihsZXQgRj0wO0Y8aS5sZW5ndGg7RisrKXtjb25zdCBTPWkuZmVhdHVyZShGKTtpZihyZS50eXBlc1tTLnR5cGVdPT09IlBvbHlnb24iJiZoMChTLmxvYWRHZW9tZXRyeSgpLGIpKXtjb25zdCBOPXIwKFMsZSxvKTtOJiZkLnB1c2goTil9fXJldHVybiBkfWFzeW5jIF9jYWNoZWRUaWxlKGUpe3ZhciBuLHI7aWYoZSl7aWYoKG49dGhpcy5fdGlsZUNhY2hlcykhPW51bGwmJm4uaGFzKGUpKXJldHVybiB0aGlzLl90aWxlQ2FjaGVzLmdldChlKTt0cnl7Y29uc3QgaT1wMChhd2FpdCB0aGlzLl9wYXJzZVRpbGUoZSkpO3JldHVybiBpJiYoKHI9dGhpcy5fdGlsZUNhY2hlcyk9PW51bGx8fHIuc2V0KGUsaSkpLGl9Y2F0Y2h7cmV0dXJufX19Y2xlYXJDYWNoZSgpe3ZhciBlOyhlPXRoaXMuX3RpbGVDYWNoZXMpPT1udWxsfHxlLmNsZWFyKCl9fWNvbnN0IGQwPWFzeW5jIHQ9Pnt0cnl7Y29uc3QgZT1hd2FpdCBfMCh0KTtyZXR1cm4gZT9FMChlKTp2b2lkIDB9Y2F0Y2h7cmV0dXJufX0sRTA9dD0+bmV3IFhvKG5ldyBIbyh0KSksXzA9YXN5bmMgdD0+e2lmKCF0KXtjb25zb2xlLmVycm9yKCJmZXRjaCByZXF1ZXN0IGZhaWxlZCBiZWNhdXNlIHJlcXVlc3QgdXJsIGlzIHVuZGVmaW5lZCIpO3JldHVybn10cnl7Y29uc3QgZT1hd2FpdCBmZXRjaCh0KTtyZXR1cm4gZS5vaz9hd2FpdCBlLmFycmF5QnVmZmVyKCk6dm9pZCAwfWNhdGNoe3JldHVybn19LHAwPXQ9Pnt2YXIgbjtpZighdClyZXR1cm47Y29uc3QgZT17fTtmb3IoY29uc3RbcixpXW9mIE9iamVjdC5lbnRyaWVzKHQubGF5ZXJzKSl7Y29uc3Qgbz1bXSxzPWk7Zm9yKGxldCB1PTA7dTxzLmxlbmd0aDt1Kyspe2NvbnN0IGE9cy5mZWF0dXJlKHUpO2xldCBsO2NvbnN0IGQ9KG49YS5iYm94KT09bnVsbD92b2lkIDA6bi5jYWxsKGEpLF89ey4uLmEsaWQ6YS5pZCxsb2FkR2VvbWV0cnk6KCk9PihsfHwobD1hLmxvYWRHZW9tZXRyeSgpKSxsKSxiYm94OmQ/KCk9PmQ6dm9pZCAwLHRvR2VvSlNPTjphLnRvR2VvSlNPTn07by5wdXNoKF8pfWVbcl09ey4uLnMsZmVhdHVyZTp1PT5vW3VdfX1yZXR1cm57bGF5ZXJzOmV9fSxYaT0odCxlKT0+ZGVjb2RlVVJJQ29tcG9uZW50KHQpLnJlcGxhY2UoInt6fSIsU3RyaW5nKGUubGV2ZWwpKS5yZXBsYWNlKCJ7eH0iLFN0cmluZyhlLngpKS5yZXBsYWNlKCJ7eX0iLFN0cmluZyhlLnkpKSx5MD1uZXcgTWFwO2Z1bmN0aW9uIEEwKHt1cmxUZW1wbGF0ZTp0LG1heGltdW1MZXZlbDplfSl7cmV0dXJuYCR7dH06JHtlfWB9YXN5bmMgZnVuY3Rpb24gVDAodCl7Y29uc3QgZT1BMCh0KTtsZXQgbjtyZXR1cm4gbj09bnVsbCYmKG49bmV3IGwwKHQpLHkwLnNldChlLG4pKSxufW9vKHtyZW5kZXJUaWxlOmFzeW5jKHtyZXF1ZXN0ZWRUaWxlOnQsY2FudmFzOmUsc2NhbGVGYWN0b3I6biwuLi5yfSk9Pntjb25zdCBpPWUuZ2V0Q29udGV4dCgiMmQiKTtpZighaSlyZXR1cm47Y29uc3Qgbz1hd2FpdCBUMChyKTthd2FpdCBvLnJlbmRlcihpLHQsbixyLmN1cnJlbnRMYXllciksby5jbGVhckNhY2hlKCksYXdhaXQgbmV3IFByb21pc2Uocz0+e3JlcXVlc3RBbmltYXRpb25GcmFtZShzKX0pfX0pfSkoKTsK",nc=typeof window<"u"&&window.Blob&&new Blob([atob(rd)],{type:"text/javascript;charset=utf-8"});function Cm(){const t=nc&&(window.URL||window.webkitURL).createObjectURL(nc);try{return t?new Worker(t):new Worker("data:application/javascript;base64,"+rd)}finally{t&&(window.URL||window.webkitURL).revokeObjectURL(t)}}const xe=[];function Km(t){let n=xe.find(o=>o.layerId===t);return n==null&&(n=Ym(async()=>await Um(new Cm),{size:Math.ceil(navigator.hardwareConcurrency/4)}),n.layerId=t,xe.push(n)),n}function gm(t,n){return Km(n).queue(o=>t(o,n))}function Nm(t,n){const o=xe.find(s=>s.layerId===t);return o==null||o.taskQueue.length<n}async function Mm(t){const n=xe.findIndex(o=>o.layerId===t);n!==-1&&(await xe[n].terminate(!0),xe.splice(n,1))}async function Hm(t){var n;const{canvas:o,...s}=t,c=o.transferControlToOffscreen();await gm(async d=>{await d.renderTile(Jm({canvas:c,...s},[c]))},(n=t.currentLayer)==null?void 0:n.id)}let Be;const ki=class{constructor(t){Y(this,"taskCount",0),Y(this,"tileCache"),Y(this,"_minimumLevel"),Y(this,"_maximumLevel"),Y(this,"_credit"),Y(this,"_resolution"),Y(this,"_tilingScheme"),Y(this,"_tileWidth"),Y(this,"_tileHeight"),Y(this,"_rectangle"),Y(this,"_ready"),Y(this,"_readyPromise",Promise.resolve(!0)),Y(this,"_errorEvent",new Cesium$1.Event),Y(this,"_currentLayer"),Y(this,"_useWorker"),Y(this,"_urlTemplate"),Y(this,"_layerNames"),this._minimumLevel=t.minimumLevel??0,this._maximumLevel=t.maximumLevel??24,this._credit=t.credit,this._resolution=t.resolution??10,this._tilingScheme=new Cesium$1.WebMercatorTilingScheme,this._tileWidth=ue,this._tileHeight=ue,this._rectangle=this._tilingScheme.rectangle,this._ready=!0,this._urlTemplate=t.urlTemplate,this._layerNames=t.layerName.split(/, */).filter(Boolean),this._currentLayer=t.layer,this._useWorker=t.worker??!1}get tileWidth(){return this._tileWidth}get tileHeight(){return this._tileHeight}get maximumLevel(){return this._maximumLevel}get minimumLevel(){return this._minimumLevel}get tilingScheme(){return this._tilingScheme}get rectangle(){return this._rectangle}get errorEvent(){return this._errorEvent}get ready(){return this._ready}get hasAlphaChannel(){return!0}get credit(){return this._credit?new Cesium$1.Credit(this._credit):void 0}get defaultNightAlpha(){}get defaultDayAlpha(){}get defaultAlpha(){}get defaultBrightness(){}get defaultContrast(){}get defaultHue(){}get defaultSaturation(){}get defaultGamma(){}get defaultMinificationFilter(){}get defaultMagnificationFilter(){}get readyPromise(){return this._readyPromise}get tileDiscardPolicy(){}get proxy(){}getTileCredits(t,n,o){return[]}requestImage(t,n,o,s){var c;const d=this._currentLayer;if(!d||(Be&&d&&!Fr(Be,d)&&Be.id===d.id&&Mm(Be.id),Be=d,this._useWorker&&(this.taskCount>=ki.maximumTasksPerImagery||!Nm(d==null?void 0:d.id,ki.maximumTasks))))return;const h=`${t}/${n}/${o}`;if(((c=this.tileCache)==null?void 0:c.has(h))===!0){const z=this.tileCache.get(h);return Promise.resolve(z)}const p=document.createElement("canvas"),y={x:t,y:n,level:o},E=(o>=this.maximumLevel?this._resolution:void 0)??1;p.width=this._tileWidth*E,p.height=this._tileHeight*E;const L=this._urlTemplate,F=this._layerNames,N=this._maximumLevel;return++this.taskCount,Hm({canvas:p,requestedTile:y,scaleFactor:E,urlTemplate:L,layerNames:F,maximumLevel:N,currentLayer:d}).then(()=>{var z;return(z=this.tileCache)==null||z.set(h,p),p}).catch(z=>{if(z instanceof Error&&z.message.startsWith("Unimplemented type"))return p;throw z}).finally(()=>{--this.taskCount})}async pickFeatures(t,n,o,s,c){const d={x:t,y:n,level:o},h=this._currentLayer,p=this._urlTemplate,y=this._layerNames;return await new lb({urlTemplate:p,layerNames:y}).pickFeatures(d,s,c,h)??[]}};let Gi=ki;Y(Gi,"maximumTasks",50),Y(Gi,"maximumTasksPerImagery",6);const useImageryProvider=(t,n,o)=>{const{hideIndicator:s}=o??{},{viewer:c}=we$1(),d=o==null?void 0:o.alpha;React.useEffect(()=>{if(!t||!c)return;const h=c.imageryLayers,p=h.addImageryProvider(t);return Object.assign(p,{bringToFront:()=>{h.raiseToTop(p)},sendToBack:()=>{h.lowerToBottom(p)}}),d!==void 0&&typeof d=="number"&&(p.alpha=d),attachTag(p,{layerId:n,hideIndicator:s}),()=>{h.remove(p)}},[t,c,n,d,s])},useData$1=t=>React.useMemo(()=>{const n=extractSimpleLayerData(t);return{type:n==null?void 0:n.type,url:n==null?void 0:n.url,layers:n!=null&&n.layers?Array.isArray(n.layers)?n.layers.join(","):n==null?void 0:n.layers:void 0,parameters:n==null?void 0:n.parameters}},[t]);function normalizeUrl(t,n){if(!t)return"";let o=t.replace("/%7Bz%7D","/{z}").replace("/%7Bx%7D","/{x}").replace("/%7By%7D","/{y}");return o.includes("/{z}/{x}/{y}.")||(o[o.length-1]!=="/"&&(o+="/"),o+="{z}/{x}/{y}."+n),o}const useMVT=({isVisible:t,property:n,layer:o})=>{const{show:s=!0,minimumLevel:c,maximumLevel:d,credit:h}=n??{},{type:p,url:y,layers:E}=useData$1(o),L=extractSimpleLayer(o)||void 0,F=React.useMemo(()=>{if(!(!t||!s||!y||!E||p!=="mvt"))return new Gi({minimumLevel:c,maximumLevel:d,credit:h,urlTemplate:normalizeUrl(y,"mvt"),layerName:E,layer:L,worker:!0})},[t,s,y,E,p,c,d,h,L]);useImageryProvider(F,o==null?void 0:o.id,n)},useTiles=({isVisible:t,property:n,layer:o})=>{const{show:s=!0,minimumLevel:c,maximumLevel:d,credit:h}=n??{},{type:p,url:y}=useData$1(o),E=React.useMemo(()=>{if(!(!t||!s||!y||p!=="tiles"))return new Cesium$1.UrlTemplateImageryProvider({url:normalizeUrl(y,"png"),minimumLevel:c,maximumLevel:d,credit:h})},[t,s,y,p,c,d,h]);useImageryProvider(E,o==null?void 0:o.id,n)},useTMS=({isVisible:t,property:n,layer:o})=>{const{show:s=!0,minimumLevel:c,maximumLevel:d,credit:h}=n??{},{type:p,url:y}=useData$1(o),[E,L]=React.useState();React.useEffect(()=>{if(!t||!s||!y||p!=="tms")return;(async()=>{L(await Cesium$1.TileMapServiceImageryProvider.fromUrl(y,{minimumLevel:c,maximumLevel:d,credit:h}))})()},[t,s,y,p,c,d,h]),useImageryProvider(E,o==null?void 0:o.id,n)},useWMS=({isVisible:t,property:n,layer:o})=>{const{show:s=!0,minimumLevel:c,maximumLevel:d,credit:h}=n??{},{type:p,url:y,layers:E,parameters:L}=useData$1(o),F=React.useMemo(()=>{if(!(!t||!s||!y||!E||p!=="wms"))return new Cesium$1.WebMapServiceImageryProvider({url:y,layers:E,minimumLevel:c,maximumLevel:d,credit:h,parameters:L})},[t,s,y,E,p,c,d,h,L]);useImageryProvider(F,o==null?void 0:o.id,n)};function Raster({isVisible:t,layer:n,property:o}){return useWMS({isVisible:t,layer:n,property:o}),useTiles({isVisible:t,layer:n,property:o}),useTMS({isVisible:t,layer:n,property:o}),useMVT({isVisible:t,layer:n,property:o}),null}const Raster$1=React.memo(Raster,(t,n)=>{var o,s,c,d,h,p;return isEqual((o=extractSimpleLayer(t.layer))==null?void 0:o.polygon,(s=extractSimpleLayer(n.layer))==null?void 0:s.polygon)&&isEqual((c=extractSimpleLayer(t.layer))==null?void 0:c.polyline,(d=extractSimpleLayer(n.layer))==null?void 0:d.polyline)&&isEqual((h=extractSimpleLayer(t.layer))==null?void 0:h.marker,(p=extractSimpleLayer(n.layer))==null?void 0:p.marker)&&isEqual(extractSimpleLayerData(t.layer),extractSimpleLayerData(n.layer))&&isEqual(t.property,n.property)&&t.isVisible===n.isVisible&&t.evalFeature===n.evalFeature&&t.onComputedFeatureFetch===n.onComputedFeatureFetch}),config$3={noFeature:!0};function overrideOriginalProperties(t,n,o,s){const c=(n==null?void 0:n.originalProperties)||{};attachTag(t,{...n||{},originalProperties:{...c,[o]:{...c[o],...s}}})}function attachProperties(t,n,o,s){const[c,d]=o,h=t[d]??{};if(!t[d])return;const p=getTag(t);overrideOriginalProperties(t,p,d,Object.keys(s).reduce((y,E)=>(y[E]=h[E],y),{})),Object.entries(s).forEach(([y,E])=>{var z;const L=E.name,F=E.type;let N=E.override??((z=n==null?void 0:n[c])==null?void 0:z[L])??E.default;switch(F){case"color":N=toColor$1(N);break;case"shadows":N=shadowMode(N);break;case"heightReference":N=heightReference(N)}t[d][y]=N??h[y]})}const hasAppearance=(t,n,o)=>{var s;return!!((s=extractSimpleLayer(t))!=null&&s[o[0]]||n[o[1]])},makeFeatureId$1=t=>String(t.id),attachStyle=(t,n,o,s)=>{var p,y,E,L,F,N,z,Z,H,nt,lt,J,mt,pi;if(!n)return;const c=hasAppearance(n,t,["marker","point"]),d=hasAppearance(n,t,["marker","billboard"]),h=hasAppearance(n,t,["marker","label"]);if(c||d||h){const Ai=(p=t.position)==null?void 0:p.getValue(s),md=[(Ai==null?void 0:Ai.x)??0,(Ai==null?void 0:Ai.y)??0,(Ai==null?void 0:Ai.z)??0],Gd={type:"feature",id:makeFeatureId$1(t),geometry:{type:"Point",coordinates:md},properties:convertEntityProperties(s,t),metaData:{description:convertEntityDescription(s,t)},range:{x:md[0],y:md[1],z:md[2]}},Xd=o(n.layer,Gd);return Xd?(c&&(((y=Xd==null?void 0:Xd.marker)==null?void 0:y.style)==="point"&&!t.point&&(t.point=new Cesium$1.PointGraphics,t.billboard=void 0),attachProperties(t,Xd,["marker","point"],{show:{name:"show",...(E=Xd==null?void 0:Xd.marker)!=null&&E.style?{override:((L=Xd==null?void 0:Xd.marker)==null?void 0:L.style)==="point"&&((Xd==null?void 0:Xd.marker.show)??!0)}:{}},pixelSize:{name:"pointSize"},color:{name:"pointColor",type:"color"},outlineColor:{name:"pointOutlineColor",type:"color"},outlineWidth:{name:"pointOutlineWidth"},heightReference:{name:"heightReference",type:"heightReference"}})),d&&(((F=Xd==null?void 0:Xd.marker)==null?void 0:F.style)==="image"&&!t.billboard&&(t.billboard=new Cesium$1.BillboardGraphics,t.point=void 0),attachProperties(t,Xd,["marker","billboard"],{show:{name:"show",...(N=Xd==null?void 0:Xd.marker)!=null&&N.style?{override:((z=Xd==null?void 0:Xd.marker)==null?void 0:z.style)==="image"&&((Xd==null?void 0:Xd.marker.show)??!0)}:{}},image:{name:"image"},color:{name:"imageColor",type:"color"},scale:{name:"imageSize"},sizeInMeters:{name:"imageSizeInMeters"},heightReference:{name:"heightReference",type:"heightReference"},horizontalOrigin:{name:"imageHorizontalOrigin"},verticalOrigin:{name:"imageVerticalOrigin"}}),h&&attachProperties(t,Xd,["marker","label"],{show:{name:"show",default:!0},text:{name:"labelText"},backgroundColor:{name:"labelBackground",type:"color"},heightReference:{name:"heightReference",type:"heightReference"}})),[Gd,Xd]):void 0}if(hasAppearance(n,t,["polyline","polyline"])){const Ai=(Z=t.position)==null?void 0:Z.getValue(s),md=(nt=(H=t.polyline)==null?void 0:H.positions)==null?void 0:nt.getValue(s),Gd=md==null?void 0:md.map(nf=>[(nf==null?void 0:nf.x)??0,(nf==null?void 0:nf.y)??0,(nf==null?void 0:nf.z)??0]),Xd={type:"feature",id:makeFeatureId$1(t),geometry:{type:"LineString",coordinates:Gd},properties:convertEntityProperties(s,t),metaData:{description:convertEntityDescription(s,t)},range:{x:(Ai==null?void 0:Ai.x)??0,y:(Ai==null?void 0:Ai.y)??0,z:(Ai==null?void 0:Ai.z)??0}},Vd=o(n.layer,Xd);return Vd?(attachProperties(t,Vd,["polyline","polyline"],{show:{name:"show",default:!0},width:{name:"strokeWidth"},material:{name:"strokeColor",type:"color"},shadows:{name:"shadows",type:"shadows"},clampToGround:{name:"clampToGround"}}),[Xd,Vd]):void 0}if(hasAppearance(n,t,["polygon","polygon"])){const Ai=(lt=t.position)==null?void 0:lt.getValue(s),md=(mt=(J=t.polygon)==null?void 0:J.hierarchy)==null?void 0:mt.getValue(s),Gd=(pi=md==null?void 0:md.holes)==null?void 0:pi.map(nf=>nf.positions.map(rf=>[(rf==null?void 0:rf.x)??0,(rf==null?void 0:rf.y)??0,(rf==null?void 0:rf.z)??0])),Xd={type:"feature",id:makeFeatureId$1(t),geometry:{type:"Polygon",coordinates:Gd},properties:convertEntityProperties(s,t),metaData:{description:convertEntityDescription(s,t)},range:{x:(Ai==null?void 0:Ai.x)??0,y:(Ai==null?void 0:Ai.y)??0,z:(Ai==null?void 0:Ai.z)??0}},Vd=o(n.layer,Xd);return Vd?(attachProperties(t,Vd,["polygon","polygon"],{show:{name:"show",default:!0},fill:{name:"fill"},material:{name:"fillColor",type:"color"},outline:{name:"stroke"},outlineColor:{name:"strokeColor",type:"color"},outlineWidth:{name:"strokeWidth"},shadows:{name:"shadows",type:"shadows"},heightReference:{name:"heightReference",type:"heightReference"},extrudedHeight:{name:"extrudedHeight"}}),[Xd,Vd]):void 0}},types={kml:"kml",geojson:"geojson",czml:"czml"},comps={kml:qs$1,czml:As$1,geojson:js$1};function Resource({isVisible:t,property:n,layer:o,onComputedFeatureFetch:s,onComputedFeatureDelete:c}){var oe,sl,Zd,af,df,uf;const{show:d=!0,clampToGround:h,stroke:p,strokeWidth:y,markerColor:E,markerSize:L,fill:F,hideIndicator:N}=n??{},[z,Z,H]=React.useMemo(()=>{var mf;const cf=extractSimpleLayerData(o),of=n==null?void 0:n.type,lf=n==null?void 0:n.url;return[of??(cf==null?void 0:cf.type),lf??(cf==null?void 0:cf.url),((mf=cf==null?void 0:cf.time)==null?void 0:mf.updateClockOnLoad)??!0]},[n,o]),{viewer:nt}=we$1(),lt=React.useRef([]),J=React.useRef(new Set),mt=React.useMemo(()=>!z||z==="auto"?guessType(Z):void 0,[z,Z]),pi=mt?types[mt]:z!=="auto"?z:void 0,Ai=pi?comps[pi]:void 0,{requestRender:md,timelineManagerRef:Gd}=useContext(),Xd=React.useCallback(cf=>{if(!nt)return;const of=[],lf=[];cf.entities.values.forEach(mf=>{var Pf;const pf=attachStyle(mf,o,evalFeature,nt.clock.currentTime),[gf,Ef]=pf||[];attachTag(mf,{layerId:o==null?void 0:o.id,featureId:gf==null?void 0:gf.id,hideIndicator:(Pf=Ef==null?void 0:Ef.resource)==null?void 0:Pf.hideIndicator}),gf&&!J.current.has(gf.id)&&(of.push(gf),lt.current.push({feature:gf,raw:mf}),J.current.add(gf.id)),Ef&&lf.push(Ef)}),z!=="geojson"&&(s==null||s(of,lf)),md==null||md()},[o,nt,s,z,md]),Vd=React.useRef({start:(sl=(oe=Gd==null?void 0:Gd.current)==null?void 0:oe.timeline)==null?void 0:sl.start,stop:(af=(Zd=Gd==null?void 0:Gd.current)==null?void 0:Zd.timeline)==null?void 0:af.stop,current:(uf=(df=Gd==null?void 0:Gd.current)==null?void 0:df.timeline)==null?void 0:uf.current}),nf=React.useCallback(cf=>{var of,lf;if(cf.entities.values.forEach(mf=>requestAnimationFrame(()=>{const pf=getTag(mf);attachTag(mf,{layerId:o==null?void 0:o.id,featureId:makeFeatureId$1(mf),hideIndicator:N??(pf==null?void 0:pf.hideIndicator)})})),!H){Vd.current.current&&Vd.current.start&&Vd.current.stop&&((of=Gd==null?void 0:Gd.current)==null||of.commit({cmd:"SET_TIME",payload:{start:Vd.current.start,stop:Vd.current.stop,current:Vd.current.current},committer:{source:"featureResource",id:o==null?void 0:o.id}}));return}cf.clock&&((lf=Gd==null?void 0:Gd.current)==null||lf.commit({cmd:"SET_TIME",payload:{start:Cesium$1.JulianDate.toDate(cf.clock.startTime),stop:Cesium$1.JulianDate.toDate(cf.clock.stopTime),current:Cesium$1.JulianDate.toDate(cf.clock.currentTime)},committer:{source:"featureResource",id:o==null?void 0:o.id}})),md==null||md()},[H,Gd,o==null?void 0:o.id,md,N]),rf=React.useMemo(()=>p?Cesium$1.Color.fromCssColorString(p):void 0,[p]),ef=React.useMemo(()=>F?Cesium$1.Color.fromCssColorString(F):void 0,[F]),yt=React.useMemo(()=>E?Cesium$1.Color.fromCssColorString(E):void 0,[E]);return React.useEffect(()=>{nt&<.current.forEach(cf=>{attachStyle(cf.raw,o,evalFeature,nt.clock.currentTime)})},[o,nt]),React.useEffect(()=>()=>{requestIdleCallbackWithRequiredWork(()=>{c==null||c(Array.from(J.current.values()))})},[]),!t||!d||!Ai||!Z?null:jsxRuntimeExports.jsx(Ai,{data:Z,show:!0,clampToGround:h,onChange:Xd,onLoad:nf,stroke:rf,fill:ef,strokeWidth:y,markerSize:L,markerColor:yt})}const config$2={noFeature:!0},DEFAULT_CLIPPING_POLYGON_STYLE={fill:!0,fillColor:"#FFFFFF22",stroke:!0,strokeColor:"#FFFFFF",strokeWidth:1},DrawClippingPolygon=({coordiantes:t,top:n=0,bottom:o=0,visible:s,style:c,ready:d})=>{const h=useCustomCompareMemo(()=>t?new Cesium$1.PolygonHierarchy(t.map(y=>Cesium$1.Cartesian3.fromDegrees(y[0],y[1],y[2]??0))):void 0,[t??[]],isEqual),p=React.useMemo(()=>({...DEFAULT_CLIPPING_POLYGON_STYLE,...c,fillColor:toColor((c==null?void 0:c.fillColor)??DEFAULT_CLIPPING_POLYGON_STYLE.fillColor),strokeColor:toColor((c==null?void 0:c.strokeColor)??DEFAULT_CLIPPING_POLYGON_STYLE.strokeColor)}),[c]);return jsxRuntimeExports.jsx(EntityExt,{hideIndicator:!0,children:jsxRuntimeExports.jsx(ca$1,{hierarchy:h,fill:p.fill,material:p.fillColor,outline:p.stroke,outlineColor:p.strokeColor,outlineWidth:p.strokeWidth,height:o,extrudedHeight:n,show:s&&d})})},useRefValue=t=>{const n=React.useRef(t);return n.current=t,n},useImmutableFunction=t=>{const n=React.useRef(t),o=React.useCallback(()=>n.current,[]);return React.useEffect(()=>{n.current=t},[t]),o};class FeatureIndex{constructor(){Bf(this,"records",new Map)}has(n){return this.records.has(n)}find(n){}}class TilesetFeatureIndex extends FeatureIndex{has(n){return this.records.has(n)}find(n){const o=this.records.get(n);if(o!=null)return o.map(({content:s,batchId:c})=>s.getFeature(c))}addFeature(n,o,s){if(s==null)return;const c=this.records.get(s);c==null?this.records.set(s,[{content:n,batchId:o}]):c.push({content:n,batchId:o})}deleteFeature(n){n!=null&&this.records.has(n)&&this.records.delete(n)}}const BUILTIN_BOX_SIDE_PLANES=[{normal:{x:0,y:0,z:1},distance:.5},{normal:{x:0,y:0,z:-1},distance:.5},{normal:{x:0,y:1,z:0},distance:.5},{normal:{x:0,y:-1,z:0},distance:.5},{normal:{x:1,y:0,z:0},distance:.5},{normal:{x:-1,y:0,z:0},distance:.5}],useClippingBox=({clipping:t,boxId:n})=>{const{useBuiltinBox:o,visible:s,allowEnterGround:c,coordinates:d,width:h,height:p,length:y,heading:E,pitch:L,roll:F,disabledSelection:N}=t||{},{viewer:z}=we$1(),Z=React.useRef(!1),H=React.useRef(!1),nt=React.useRef(),[lt,J]=React.useState(d);React.useEffect(()=>{o&&!lt&&J(d)},[lt,d,o]);const[mt,pi]=React.useState({width:h,height:p,length:y,heading:E,pitch:L,roll:F});React.useEffect(()=>{o&&!mt&&pi({width:h,height:p,length:y,heading:E,pitch:L,roll:F})},[mt,h,p,y,E,L,F,o]);const[Ai,md]=React.useState({activeBox:!1,activeScalePointIndex:void 0,isScalePointClicked:!1,activeEdgeIndex:void 0,isEdgeClicked:!1,cursor:"default"}),Gd=React.useCallback(cf=>{md(of=>({...of,...cf}))},[]),Xd=React.useCallback(cf=>{if(!z||!N)return;const of=z.scene.pick(cf.position),lf=getLayerId$1(of);if(lf!=null&&lf.startsWith(`${n}-scale-point`)){const mf=Number(lf.split("-").slice(-1)[0]);Gd({cursor:"nesw-resize",activeScalePointIndex:mf,isScalePointClicked:!0})}if(lf!=null&&lf.startsWith(`${n}-edge-draggable`)){const mf=Number(lf.split("-").slice(-1)[0]);Gd({cursor:"grabbing",activeEdgeIndex:mf,isEdgeClicked:!0})}if(lf!=null&&lf.startsWith(`${n}-plane`)&&(Z.current=!0,H.current=lf.endsWith("top")||lf.endsWith("bottom")),Z.current){const mf=getCamera(z);nt.current=mf,updateMapController(z,!1),(!Ai.isScalePointClicked||!Ai.isEdgeClicked)&&Gd({cursor:"grabbing",activeBox:!0})}},[n,Ai,Gd,z,N]),Vd=React.useCallback(()=>{!z||!N||((Ai.activeScalePointIndex||Ai.activeEdgeIndex)&&Gd({cursor:"default",activeScalePointIndex:void 0,isScalePointClicked:!1,activeEdgeIndex:void 0,isEdgeClicked:!1}),Z.current&&(updateMapController(z,!0),nt.current=void 0,Z.current=!1,H.current=!1,Ai.activeBox=!1,Ai.cursor="default",Gd({activeBox:!1,cursor:"default"})))},[Ai,Gd,z,N]),nf=React.useRef(0),rf=React.useCallback(async cf=>{if(!Z.current||!z||!N)return;const of=Cesium$1.Cartesian3.fromDegrees((lt==null?void 0:lt[0])||0,(lt==null?void 0:lt[1])||0,lt==null?void 0:lt[2]);if(H.current){const lf=(lt==null?void 0:lt[2])||0,mf=(()=>{if(!c){const Vf=lf-((mt==null?void 0:mt.height)||0)/2,Uf=nf.current;if(Vf<Uf)return lf+(Uf-Vf)}})(),pf=new Cesium$1.Cartesian2(cf.startPosition.x,cf.startPosition.y),gf=new Cesium$1.Cartesian2(cf.endPosition.x,cf.endPosition.y),Ef=Cesium$1.Cartesian2.subtract(gf,pf,new Cesium$1.Cartesian2),Pf=new Cesium$1.Cartesian3(0,0,Ef.y<0?-1:1),{moveAmount:Df}=computeMoveAmount(z.scene,{startPosition:pf,endPosition:gf},of,Pf),Nf=Cesium$1.Cartesian3.multiplyByScalar(Pf,Df,new Cesium$1.Cartesian3);J(Vf=>[(Vf==null?void 0:Vf[0])||0,(Vf==null?void 0:Vf[1])||0,(mf||(Vf==null?void 0:Vf[2])||0)+Nf.z])}else{const lf=cf.endPosition?getLocationFromScreen(z.scene,cf.endPosition.x,cf.endPosition.y,!c):void 0;J(mf=>[(lf==null?void 0:lf.lng)||0,(lf==null?void 0:lf.lat)||0,(c?mf==null?void 0:mf[2]:lf==null?void 0:lf.height)||0]),sampleTerrainHeight(z.scene,(lt==null?void 0:lt[0])||0,(lt==null?void 0:lt[1])||0).then(mf=>{nf.current=mf||0})}},[c,lt,mt==null?void 0:mt.height,z,N]),ef=React.useCallback(({layerId:cf}={})=>{const of=!Ai.isScalePointClicked&&!Ai.isEdgeClicked&&!Z.current;if(cf!=null&&cf.startsWith(`${n}-scale-point`)&&of){const lf=Number(cf.split("-").slice(-1)[0]);Gd({cursor:"nesw-resize",activeScalePointIndex:lf})}if(cf!=null&&cf.startsWith(`${n}-edge-draggable`)&&of){const lf=Number(cf.split("-").slice(-1)[0]);Gd({cursor:"grab",activeEdgeIndex:lf})}cf!=null&&cf.startsWith(`${n}-plane`)&&of&&Gd({cursor:"grab",activeBox:!0})},[n,Ai.isEdgeClicked,Ai.isScalePointClicked,Gd]),yt=React.useCallback(({layerId:cf}={})=>{const of=!Ai.isScalePointClicked&&!Ai.isEdgeClicked&&!Z.current;cf!=null&&cf.startsWith(`${n}-scale-point`)&&of&&Gd({cursor:"default",activeScalePointIndex:void 0}),cf!=null&&cf.startsWith(`${n}-edge-draggable`)&&of&&Gd({cursor:"default",activeEdgeIndex:void 0}),cf!=null&&cf.startsWith(`${n}-plane`)&&of&&Gd({cursor:"default",activeBox:!1})},[n,Ai.isEdgeClicked,Ai.isScalePointClicked,Gd]),oe=React.useRef(),sl=React.useCallback(cf=>{const of=z==null?void 0:z.scene.pick(cf.endPosition);if(oe.current!==of){if(oe.current){const lf=getLayerId$1(oe.current);yt({layerId:lf}),yt()}if(of){const lf=getLayerId$1(of);ef({layerId:lf}),ef()}}rf(cf),oe.current=of},[ef,yt,rf,z==null?void 0:z.scene]),Zd=React.useCallback(cf=>{var of,lf;if((of=cf.layerId)!=null&&of.startsWith(`${n}-scale-point`)&&cf.scale){const mf=cf.scale;pi(pf=>({...pf,width:mf.width,height:mf.height,length:mf.length})),J([mf.location.lng,mf.location.lat,mf.location.height])}if((lf=cf.layerId)!=null&&lf.startsWith(`${n}-edge-draggable`)&&cf.rotate){const mf=cf.rotate;pi(pf=>({...pf,heading:mf.heading,pitch:mf.pitch,roll:mf.roll}))}},[n]),af=React.useMemo(()=>new Cesium$1.ScreenSpaceEventHandler(z==null?void 0:z.scene.canvas),[z]);React.useEffect(()=>{af.setInputAction(Xd,Cesium$1.ScreenSpaceEventType.LEFT_DOWN),af.setInputAction(sl,Cesium$1.ScreenSpaceEventType.MOUSE_MOVE),af.setInputAction(Vd,Cesium$1.ScreenSpaceEventType.LEFT_UP)},[af,Xd,sl,Vd]),React.useEffect(()=>()=>af.destroy(),[af]);const df=React.useMemo(()=>({...Ai,...mt,allowEnterGround:c}),[Ai,mt,c]),uf=React.useMemo(()=>o?{visible:s,handleLayerEdit:Zd,geometry:{type:"Point",coordinates:lt||d||[0,0,0]},property:df}:void 0,[df,d,lt,Zd,o,s]);return{...t,planes:o?BUILTIN_BOX_SIDE_PLANES:t==null?void 0:t.planes,width:o?mt==null?void 0:mt.width:t==null?void 0:t.width,height:o?mt==null?void 0:mt.height:t==null?void 0:t.height,length:o?mt==null?void 0:mt.length:t==null?void 0:t.length,heading:o?mt==null?void 0:mt.heading:t==null?void 0:t.heading,pitch:o?mt==null?void 0:mt.pitch:t==null?void 0:t.pitch,roll:o?mt==null?void 0:mt.roll:t==null?void 0:t.roll,coordinates:o?lt:t==null?void 0:t.coordinates,builtinBoxProps:uf}};function getLayerId$1(t){var n,o;if(t&&"id"in t&&t.id instanceof Cesium$1.Entity)return(n=getTag(t.id))==null?void 0:n.layerId;if(t&&t instanceof Cesium$1.Cesium3DTileFeature)return(o=getTag(t.tileset))==null?void 0:o.layerId}const useDrawClipping=({enabled:t,surfacePoints:n,direction:o="inside",top:s,bottom:c,visible:d=!0,style:h,tilesetRef:p,viewer:y,clippingPlanes:E,isTilesetReady:L})=>{const[F,N]=React.useState(0),z=React.useMemo(()=>s??100,[s]),Z=React.useMemo(()=>c??10,[c]),[H,nt]=React.useState(!1),{requestRender:lt}=useContext();React.useEffect(()=>{(async()=>{if(!(p!=null&&p.current)||!L)return;if(!t||!n||(n==null?void 0:n.length)<2){E.removeAll(),N(0),lt==null||lt();return}E.modelMatrix=Cesium$1.Matrix4.IDENTITY.clone(),nt(!1);const pi=polygon([n.map(Vd=>[Vd.lng,Vd.lat])]),Ai=centroid(pi),md=y!=null&&y.scene?await sampleTerrainHeight(y==null?void 0:y.scene,Ai.geometry.coordinates[0],Ai.geometry.coordinates[1])??0:0;N(md);const Gd=Cesium$1.Matrix4.inverse(Cesium$1.Transforms.eastNorthUpToFixedFrame(p.current.boundingSphere.center),new Cesium$1.Matrix4);let Xd=0;for(let Vd=0;Vd<n.length;Vd++){const nf=n[Vd],rf=n[(Vd+1)%n.length];Xd+=(rf.lng-nf.lng)*(rf.lat+nf.lat)}Xd>0&&n.reverse(),E.removeAll();for(let Vd=0;Vd<n.length-1;Vd++){const nf=n[Vd],rf=n[Vd+1];E.add(createSidePlane(nf,rf,Gd,o))}E.add(createHorizontalPlane(n[0],md+z,Gd,o==="inside"?1:-1)),E.add(createHorizontalPlane(n[0],md-Z,Gd,o==="inside"?-1:1)),nt(!0)})()},[n,p,E,z,Z,t,o,y,L,lt]),React.useEffect(()=>{E.unionClippingRegions=o==="outside"},[E,o,t]);const J=React.useMemo(()=>({coordiantes:(n==null?void 0:n.map(mt=>[mt.lng,mt.lat]))??[],top:F+z,bottom:F-Z,visible:d,style:h,ready:H}),[n,F,z,Z,d,h,H]);return{drawClippingEnabled:t,drawClippingEdgeProps:J}},getOriginCoordinateSystemPoint=(t,n,o)=>{const s=Cesium$1.Cartesian3.fromDegrees(t.lng,t.lat,o);return Cesium$1.Matrix4.multiplyByPoint(n,s,new Cesium$1.Cartesian3)},createSidePlane=(t,n,o,s)=>{const c=getOriginCoordinateSystemPoint(t,o),d=getOriginCoordinateSystemPoint(n,o),h=new Cesium$1.Cartesian3(0,0,1),p=new Cesium$1.Cartesian3(0,0,-1),y=Cesium$1.Cartesian3.subtract(d,c,new Cesium$1.Cartesian3),E=s==="inside"?Cesium$1.Cartesian3.normalize(Cesium$1.Cartesian3.cross(y,h,new Cesium$1.Cartesian3),new Cesium$1.Cartesian3):Cesium$1.Cartesian3.normalize(Cesium$1.Cartesian3.cross(y,p,new Cesium$1.Cartesian3),new Cesium$1.Cartesian3),L=Cesium$1.Plane.fromPointNormal(c,E);return Cesium$1.ClippingPlane.fromPlane(L)},createHorizontalPlane=(t,n,o,s)=>{const c=getOriginCoordinateSystemPoint(t,o,n),d=new Cesium$1.Cartesian3(0,0,s),h=Cesium$1.Plane.fromPointNormal(c,d);return Cesium$1.ClippingPlane.fromPlane(h)},DEFAULT_FEATURE_COLOR=Cesium$1.Color.WHITE,useData=t=>React.useMemo(()=>{const n=extractSimpleLayerData(t);return{type:n==null?void 0:n.type,url:n==null?void 0:n.url,idProperty:n==null?void 0:n.idProperty,layers:n!=null&&n.layers?Array.isArray(n.layers)?n.layers.join(","):n==null?void 0:n.layers:void 0}},[t]),makeFeatureId=(t,n,o)=>{const s=n.tile.boundingSphere.center,c=o&&!(t instanceof Cesium$1.Model)?t.getProperty(o):void 0;if(c)return c;const d=getBuiltinFeatureId(t);return generateIDWithMD5(`${s.x}-${s.y}-${s.z}-${d}-${t instanceof Cesium$1.Model?"":JSON.stringify(Object.entries(convertCesium3DTileFeatureProperties(t)).filter((h,p)=>typeof p=="string"||typeof p=="number").map(([h,p])=>`${h}${p}`))}`)},makeFeatureFrom3DTile=(t,n,o)=>{const s=n.tile.boundingSphere.center;return{type:"feature",id:makeFeatureId(t,n,o),geometry:{type:"Point",coordinates:[s.x,s.y,s.z]},range:{x:s.x,y:s.y,z:s.z}}},getBuiltinFeatureId=t=>(t instanceof Cesium$1.Model?t.id:t instanceof Cesium$1.Cesium3DTileFeature?t.featureId:"")??"",MAX_NUMBER_OF_CONCURRENT_COMPUTING_FEATURES=5e3,COMMON_STYLE_PROPERTIES=[{name:"color",convert:"color"},{name:"show"}],MODEL_STYLE_PROPERTIES=[{name:"color",convert:"colorFunctionString"},{name:"show"},{name:"pointSize"},{name:"meta"}],POINT_STYLE_PROPERTIES=[{name:"pointSize"}],TILESET_APPEARANCE_FIELDS=["show","color","pointSize","meta"],convertStyle=(t,n)=>n==="color"?toColor(t):n==="colorFunctionString"?t===void 0?t:`color("${t}")`:t,useFeature=({id:t,tileset:n,idProperty:o,layer:s,viewer:c,featureIndex:d,selectedFeatureIdsRef:h,evalFeature:p,onComputedFeatureFetch:y,shouldUseFeatureIndex:E,isTilesetReady:L})=>{const F=React.useRef([]),N=React.useRef(s),z=React.useRef(new Set),Z=(s==null?void 0:s.id)||t,H=useRefValue(Z),nt=React.useCallback(async yt=>{var sl;const oe=(sl=N==null?void 0:N.current)==null?void 0:sl.layer;if((oe==null?void 0:oe.type)==="simple"&&(yt!=null&&yt.feature)){const Zd=yt.raw,af=getTag(Zd),df=c&&!(Zd instanceof Cesium$1.Model)?convertCesium3DTileFeatureProperties(Zd):{},uf=E?h.current.includes((af==null?void 0:af.featureId)??""):af==null?void 0:af.isFeatureSelected,cf=p(oe,{...yt==null?void 0:yt.feature,properties:df}),of=cf==null?void 0:cf["3dtiles"];return COMMON_STYLE_PROPERTIES.forEach(({name:lf,convert:mf})=>{var gf,Ef;if(lf==="color"){if(uf){Zd.color=typeof((gf=oe["3dtiles"])==null?void 0:gf.selectedFeatureColor)=="string"?toColor((Ef=oe["3dtiles"])==null?void 0:Ef.selectedFeatureColor)??Zd.color:Zd.color;return}Zd.color=DEFAULT_FEATURE_COLOR}const pf=convertStyle(of==null?void 0:of[lf],mf);pf!==void 0&&(Zd[lf]=pf)}),Zd instanceof Cesium$1.Cesium3DTilePointFeature&&POINT_STYLE_PROPERTIES.forEach(({name:lf,convert:mf})=>{const pf=convertStyle(of==null?void 0:of[lf],mf);pf!==void 0&&(Zd[lf]=pf)}),"style"in Zd&&(Zd.style=new Cesium$1.Cesium3DTileStyle(MODEL_STYLE_PROPERTIES.reduce((lf,{name:mf,convert:pf})=>{const gf=convertStyle(of==null?void 0:of[mf],pf);return gf===void 0?lf:{...lf,[mf]:gf}},{}))),attachTag(yt.raw,{layerId:Z,featureId:yt.feature.id,computedFeature:cf,isFeatureSelected:af==null?void 0:af.isFeatureSelected}),cf}},[p,Z,c,E,h]),lt=React.useCallback(async yt=>{if(yt.tileset.isDestroyed())return;const oe=new Set;await lookupFeatures(yt.content,async(sl,Zd,af)=>{const df={feature:makeFeatureFrom3DTile(sl,Zd,o),raw:sl};attachTag(df.raw,{layerId:H.current,featureId:df.feature.id}),af!=null&&E&&d.addFeature(Zd,af,df.feature.id),await nt(df),F.current.push(df),z.current.add(df.feature.id),oe.add(pick(df.feature,["id","type","range"]))}),y==null||y(Array.from(oe.values()),[])},[F,nt,y,o,d,E,H]),J=React.useRef(lt);J.current=lt,React.useEffect(()=>{var yt;return(yt=n.current)==null?void 0:yt.tileLoad.addEventListener(oe=>J.current(oe))},[n,L]);const mt=React.useCallback(async yt=>{yt.tileset.isDestroyed()||!E||await lookupFeatures(yt.content,async(oe,sl)=>{d.deleteFeature(makeFeatureId(oe,sl,o))})},[o,d,E]),pi=React.useRef(mt);pi.current=mt,React.useEffect(()=>{var yt;return(yt=n.current)==null?void 0:yt.tileUnload.addEventListener(oe=>pi.current(oe))},[n,L]),React.useEffect(()=>{N.current=s},[s]);const Ai=React.useMemo(()=>{var yt;return(yt=extractSimpleLayer(s))==null?void 0:yt["3dtiles"]},[s]),md=usePick(Ai,TILESET_APPEARANCE_FIELDS),Gd=E?0:s==null?void 0:s.layer._updateStyle,Xd=React.useRef(Gd),Vd=React.useRef();React.useEffect(()=>{Vd.current=Date.now()},[md,Gd]);const nf=React.useCallback(async(yt,oe)=>new Promise(sl=>requestAnimationFrame(()=>{if(Vd.current&&Vd.current>oe){sl(void 0);return}(md||Gd)&&nt(yt),sl(void 0)})),[md,nt,Gd]),rf=React.useCallback(async yt=>{const oe=[];let sl=!1;for(const Zd of F.current){if(Vd.current&&Vd.current>yt){sl=!0;break}oe.push(nf(Zd,yt)),oe.length>MAX_NUMBER_OF_CONCURRENT_COMPUTING_FEATURES&&(await Promise.all(oe),oe.length=0)}sl||await Promise.all(oe),Xd.current=Gd,oe.length=0},[nf,Gd]),{requestRender:ef}=useContext();React.useEffect(()=>{(async()=>{const oe=Date.now();await rf(oe),ef==null||ef()})()},[rf,ef,Gd])},useHooks$2=({id:t,boxId:n,isVisible:o,property:s,sceneProperty:c,layer:d,meta:h,evalFeature:p,onComputedFeatureFetch:y,onLayerFetch:E})=>{var Zf,xf,zf;const{viewer:L}=we$1(),F=React.useRef(),{onLayerLoad:N}=useContext(),z=React.useRef(d==null?void 0:d.id);z.current=d==null?void 0:d.id;const{tileset:Z,styleUrl:H,edgeColor:nt,edgeWidth:lt,experimental_clipping:J,apiKey:mt,selectedFeatureColor:pi,disableIndexingFeature:Ai}=s??{},{width:md,height:Gd,length:Xd,location:Vd,coordinates:nf,heading:rf,roll:ef,pitch:yt,planes:oe,visible:sl=!0,direction:Zd="inside",builtinBoxProps:af,allowEnterGround:df}=useClippingBox({clipping:J,boxId:n}),[uf,cf]=React.useState(),{url:of,type:lf,idProperty:mf}=useData(d),pf=!Ai&&!!mf,[gf,Ef]=React.useState(!1),Pf=React.useRef(oe),Df=React.useMemo(()=>{var Lf,wf;return(!((Lf=Pf.current)!=null&&Lf.length)||!((wf=Pf.current)!=null&&wf.every((Af,qf)=>{var Yf,Pm,Qm,qm,$m,zm;return((Yf=Af.normal)==null?void 0:Yf.x)===((Pm=oe==null?void 0:oe[qf].normal)==null?void 0:Pm.x)&&((Qm=Af.normal)==null?void 0:Qm.y)===((qm=oe==null?void 0:oe[qf].normal)==null?void 0:qm.y)&&(($m=Af.normal)==null?void 0:$m.z)===((zm=oe==null?void 0:oe[qf].normal)==null?void 0:zm.z)&&Af.distance===(oe==null?void 0:oe[qf].distance)})))&&(Pf.current=oe),Pf.current},[oe]),Nf=Zd==="inside"?-1:1,[Vf]=React.useState(()=>new Cesium$1.ClippingPlaneCollection({planes:Df==null?void 0:Df.map(Lf=>{var wf,Af,qf;return new Cesium$1.ClippingPlane(new Cesium$1.Cartesian3((wf=Lf.normal)==null?void 0:wf.x,(Af=Lf.normal)==null?void 0:Af.y,(qf=Lf.normal)==null?void 0:qf.z),(Lf.distance||0)*Nf)}),unionClippingRegions:Zd==="outside",edgeWidth:lt,edgeColor:toColor(nt)})),{drawClippingEnabled:Uf,drawClippingEdgeProps:Jf}=useDrawClipping({...J==null?void 0:J.draw,tilesetRef:F,viewer:L,clippingPlanes:Vf,isTilesetReady:gf}),[If]=React.useState(()=>new TilesetFeatureIndex),tf=React.useCallback(Lf=>{Lf!=null&&Lf.cesiumElement&&attachTag(Lf.cesiumElement,{layerId:(d==null?void 0:d.id)||t,featureIndex:pf?If:void 0,appearanceType:"3dtiles"}),d!=null&&d.id&&(Lf!=null&&Lf.cesiumElement)&&((Lf==null?void 0:Lf.cesiumElement)[layerIdField]=d.id),F.current=Lf==null?void 0:Lf.cesiumElement},[t,d==null?void 0:d.id,If,pf]),Cf=React.useRef([]),vf=React.useRef(pi);vf.current=pi;const[ff]=React.useState(()=>new Map);React.useEffect(()=>{!F.current||!pf||!gf||Object.assign(F.current,{onSelectFeature:Lf=>{const wf=getTag(Lf);wf!=null&&wf.featureId&&(Cf.current.push(wf.featureId),ff.set(wf.featureId,Lf.color)),vf.current&&(Lf.color=toColor(vf.current)??Lf.color)},onUnselectFeature:Lf=>{const wf=getTag(Lf);wf!=null&&wf.featureId&&(Cf.current=Cf.current.filter(Af=>Af!==wf.featureId)),Lf.color=ff.get((wf==null?void 0:wf.featureId)??"")??DEFAULT_FEATURE_COLOR}})},[ff,If,pf,gf]),useFeature({id:t,tileset:F,layer:d,idProperty:mf,viewer:L,evalFeature:p,onComputedFeatureFetch:y,featureIndex:If,selectedFeatureIdsRef:Cf,shouldUseFeatureIndex:pf,isTilesetReady:gf});const[hf,bf]=React.useState(0),Tf=React.useRef(!1),Mf=React.useCallback(Lf=>{Tf.current||!L||df||(Tf.current=!0,sampleTerrainHeightFromCartesian(L.scene,Lf).then(wf=>{bf(wf??0),Tf.current=!1}))},[df,L]);React.useEffect(()=>{if(J!=null&&J.draw)return;const Lf=nf||(Vd?[Vd.lng,Vd.lat,Vd.height??0]:void 0),wf=Cesium$1.Cartesian3.fromDegrees((Lf==null?void 0:Lf[0])||0,(Lf==null?void 0:Lf[1])||0,(Lf==null?void 0:Lf[2])||0);(async()=>{if(!F.current||!gf)return;const qf=F.current.clippingPlanesOriginMatrix.clone(),Yf=new Cesium$1.Cartesian3(md||100,Xd||100,Gd||100);if(!df){const $m=new Cesium$1.TranslationRotationScale(wf,void 0,Yf);translationWithClamping($m,!!df,hf),wf.x=$m.translation.x,wf.y=$m.translation.y,wf.z=$m.translation.z}const Pm=rf&&yt&&ef?new Cesium$1.HeadingPitchRoll(rf,yt,ef):void 0,Qm=Cesium$1.Matrix4.multiply(Pm?Cesium$1.Matrix4.fromRotationTranslation(Cesium$1.Matrix3.fromHeadingPitchRoll(Pm),wf):Cesium$1.Transforms.eastNorthUpToFixedFrame(wf),Cesium$1.Matrix4.fromScale(Yf,new Cesium$1.Matrix4),new Cesium$1.Matrix4),qm=Cesium$1.Matrix4.inverse(qf,new Cesium$1.Matrix4);Cesium$1.Matrix4.multiply(qm,Qm,Vf.modelMatrix)})(),df||Mf(wf)},[md,Xd,Gd,rf,yt,ef,Vd,nf,Vf.modelMatrix,Mf,df,hf,J==null?void 0:J.draw,gf]),React.useEffect(()=>{J!=null&&J.draw||(Vf.enabled=sl)},[Vf,sl,J==null?void 0:J.draw]),React.useEffect(()=>{J!=null&&J.draw||(Vf.unionClippingRegions=Zd==="outside")},[Vf,Zd,J==null?void 0:J.draw]),React.useEffect(()=>{J!=null&&J.draw||(Vf.removeAll(),Df==null||Df.forEach(Lf=>{var wf,Af,qf;return Vf.add(new Cesium$1.ClippingPlane(new Cesium$1.Cartesian3((wf=Lf.normal)==null?void 0:wf.x,(Af=Lf.normal)==null?void 0:Af.y,(qf=Lf.normal)==null?void 0:qf.z),(Lf.distance||0)*Nf))}))},[Df,Vf,Nf,J==null?void 0:J.draw]),React.useEffect(()=>{if(!H){cf(void 0);return}(async()=>{const Lf=await fetch(H);Lf.ok&&cf(new Cesium$1.Cesium3DTileStyle(await Lf.json()))})()},[H]);const _f=React.useMemo(()=>{if(lf!=="google-photorealistic"||!o)return;const Lf=Cesium$1.GoogleMaps,wf=Cesium$1.defaultValue(mt,Lf.defaultApiKey),Af=Lf.getDefaultApiKeyCredit(wf);return new Cesium$1.Resource({url:`${Lf.mapTilesApiEndpoint}3dtiles/root.json`,queryParameters:{key:wf},credits:Af?[Af]:void 0})},[mt,lf,o]),kf=React.useMemo(()=>lf==="osm-buildings"&&o?Cesium$1.IonResource.fromAssetId(96188,{accessToken:h==null?void 0:h.cesiumIonAccessToken}):_f||(lf==="3dtiles"&&o?of??Z:null),[o,Z,of,lf,h,_f]),Xf=React.useMemo(()=>{var Yf,Pm,Qm,qm,$m;if(!(s!=null&&s.specularEnvironmentMaps)&&!(s!=null&&s.sphericalHarmonicCoefficients)&&!((Yf=c==null?void 0:c.light)!=null&&Yf.specularEnvironmentMaps)&&!((Pm=c==null?void 0:c.light)!=null&&Pm.sphericalHarmonicCoefficients))return;const Lf=new Cesium$1.ImageBasedLighting,wf=(s==null?void 0:s.specularEnvironmentMaps)??((Qm=c==null?void 0:c.light)==null?void 0:Qm.specularEnvironmentMaps),Af=(s==null?void 0:s.imageBasedLightIntensity)??((qm=c==null?void 0:c.light)==null?void 0:qm.imageBasedLightIntensity),qf=arrayToCartecian3((s==null?void 0:s.sphericalHarmonicCoefficients)??(($m=c==null?void 0:c.light)==null?void 0:$m.sphericalHarmonicCoefficients),Af);return wf&&(Lf.specularEnvironmentMaps=wf),qf&&(Lf.sphericalHarmonicCoefficients=qf),Lf},[s==null?void 0:s.specularEnvironmentMaps,s==null?void 0:s.sphericalHarmonicCoefficients,s==null?void 0:s.imageBasedLightIntensity,(Zf=c==null?void 0:c.light)==null?void 0:Zf.specularEnvironmentMaps,(xf=c==null?void 0:c.light)==null?void 0:xf.sphericalHarmonicCoefficients,(zf=c==null?void 0:c.light)==null?void 0:zf.imageBasedLightIntensity]),Gf=React.useCallback(Lf=>{Ef(!0),E==null||E({properties:Lf.properties}),N==null||N({layerId:z.current})},[E,N]);return{tilesetUrl:kf,ref:tf,style:uf,clippingPlanes:Vf,drawClippingEnabled:Uf,drawClippingEdgeProps:Jf,builtinBoxProps:af,imageBasedLighting:Xf,handleReady:Gf}};function Tileset({id:t,isVisible:n,property:o,layer:s,feature:c,sceneProperty:d,meta:h,evalFeature:p,onComputedFeatureFetch:y,onLayerFetch:E,...L}){const{shadows:F,colorBlendMode:N,pbr:z,showWireframe:Z,showBoundingVolume:H,cacheBytes:nt}=o??{},lt=`${s==null?void 0:s.id}_box`,{tilesetUrl:J,ref:mt,style:pi,clippingPlanes:Ai,drawClippingEnabled:md,drawClippingEdgeProps:Gd,builtinBoxProps:Xd,imageBasedLighting:Vd,handleReady:nf}=useHooks$2({id:t,boxId:lt,isVisible:n,layer:s,feature:c,property:o,sceneProperty:d,meta:h,evalFeature:p,onComputedFeatureFetch:y,onLayerFetch:E}),rf=React.useMemo(()=>{var yt,oe;return{...((yt=s==null?void 0:s.layer)==null?void 0:yt.type)==="simple"?(oe=s==null?void 0:s.layer)==null?void 0:oe.box:{},...(Xd==null?void 0:Xd.property)||{}}},[s==null?void 0:s.layer,Xd==null?void 0:Xd.property]),ef=React.useMemo(()=>({...s,id:lt}),[s,lt]);return!n||!J?null:jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment,{children:[jsxRuntimeExports.jsx(Rs$1,{ref:mt,url:J,customShader:z===!1?NonPBRLightingShader:z==="withTexture"?NonPBRWithTextureLightingShader:void 0,cacheBytes:nt,style:pi,shadows:shadowMode(F),clippingPlanes:Ai,colorBlendMode:colorBlendModeFor3DTile(N),imageBasedLighting:Vd,onReady:nf,debugWireframe:Z,debugShowBoundingVolume:H}),Xd&&jsxRuntimeExports.jsx(Box,{...L,id:lt,sceneProperty:d,property:rf,geometry:Xd.geometry,feature:c,layer:ef,isVisible:Xd.visible,evalFeature:p,onLayerEdit:Xd.handleLayerEdit}),md&&jsxRuntimeExports.jsx(DrawClippingPolygon,{...Gd})]})}const Tileset$1=React.memo(Tileset,(t,n)=>{var o,s;return t.id===n.id&&t.isVisible===n.isVisible&&t.property===n.property&&((o=t.layer)==null?void 0:o.layer)===((s=n.layer)==null?void 0:s.layer)&&t.sceneProperty===n.sceneProperty&&t.meta===n.meta&&t.evalFeature===n.evalFeature&&t.onComputedFeatureFetch===n.onComputedFeatureFetch&&t.onFeatureDelete===n.onFeatureDelete}),config$1={noFeature:!0},NON_RENDERABLE_APPEARANCE=["transition"],isRenderableAppearance=t=>!NON_RENDERABLE_APPEARANCE.includes(t),components={marker:[Marker,config$8],polyline:[Polyline,config$4],polygon:[Polygon,config$5],ellipsoid:[Ellipsoid,config$b],ellipse:[Ellipse,config$c],model:[Model,config$7],"3dtiles":[Tileset$1,config$1],box:[Box,config$d],photooverlay:[PhotoOverlay,config$6],resource:[Resource,config$2],raster:[Raster$1,config$3],heatMap:[HeatMap,config$9],frustum:[Frustum,config$a]},displayConfig={geojson:"auto",csv:"auto",czml:["resource"],kml:["resource"],wms:["raster"],mvt:["raster"],tms:["raster"],"3dtiles":["3dtiles"],"osm-buildings":["3dtiles"],"google-photorealistic":["3dtiles"],gpx:"auto",shapefile:"auto",gtfs:"auto",georss:[],gml:[],gltf:["model"],tiles:["raster"],heatMap:["heatMap"]},PICKABLE_APPEARANCE=["raster","3dtiles"],pickProperty=(t,n)=>{if(PICKABLE_APPEARANCE.includes(t)&&n.layer.type==="simple")return n.layer[t]},CACHED_COMPONENTS=new LRUCache({max:1e4}),FEATURE_DELEGATE_THRESHOLD=6e3;function Feature$1({layer:t,isHidden:n,...o}){var z,Z,H;const s=extractSimpleLayerData(t),c=!(s!=null&&s.type)||s.type==="auto"?guessType(s==null?void 0:s.url):void 0;let d=(s==null?void 0:s.type)&&displayConfig[c??s.type];(((z=t.features)==null?void 0:z.length)>FEATURE_DELEGATE_THRESHOLD||(Z=s==null?void 0:s.geojson)!=null&&Z.useAsResource)&&(d=["resource"]);const h=Array.isArray(d)&&d.every(nt=>components[nt][1].noFeature&&!components[nt][1].noLayer),p=!!((H=t==null?void 0:t.transition)!=null&&H.useTransition),y=!(s!=null&&s.updateInterval)&&!p,E=React.useMemo(()=>s!=null&&s.url?generateIDWithMD5(s.url):"",[s==null?void 0:s.url]),{requestRender:L}=useContext();React.useEffect(()=>{setTimeout(()=>{L==null||L()},300)}),React.useEffect(()=>()=>L==null?void 0:L(),[L]);const F=(nt,lt)=>{var md,Gd,Xd,Vd;if(!isRenderableAppearance(nt))return null;const J=!!((Gd=(md=o.sceneProperty)==null?void 0:md.light)!=null&&Gd.sphericalHarmonicCoefficients),mt=!!((Vd=(Xd=o.sceneProperty)==null?void 0:Xd.light)!=null&&Vd.specularEnvironmentMaps),pi=t.layer.visible!==!1&&!n,Ai=E+generateIDWithMD5(`${t.id}_${(lt==null?void 0:lt.id)??""}_${nt}_${pi}_${J}_${mt}_${JSON.stringify(lt==null?void 0:lt[nt])??""}_${JSON.stringify(t.transition)??""}`);if(y){const nf=CACHED_COMPONENTS.get(Ai);if(y&&nf)return nf}try{const[nf,rf]=components[nt]??[];if(!nf||lt&&!lt[nt]||rf.noLayer&&!lt||rf.noFeature&<||Array.isArray(d)&&!d.includes(nt)||!Array.isArray(d)&&d!=="auto"||(s==null?void 0:s.type)==="geojson"&&d==="auto"&&nt==="resource")return null;const ef=React.createElement(nf,{...o,key:p?void 0:Ai,id:p?(lt==null?void 0:lt.id)??t.id:Ai,property:lt?lt[nt]:t[nt]||pickProperty(nt,t),geometry:lt==null?void 0:lt.geometry,feature:lt,layer:t,isVisible:pi});return y&&CACHED_COMPONENTS.set(Ai,ef),ef}catch(nf){return console.error(`Error rendering component ${Ai}`,nf),null}},N=React.useMemo(()=>!h||!d||!Array.isArray(d)?null:jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment,{children:d.map(nt=>{var Xd,Vd,nf,rf,ef,yt,oe,sl,Zd,af;const[lt]=components[nt]??[],J=t.layer.visible!==!1&&!n,mt=!!((Vd=(Xd=o.sceneProperty)==null?void 0:Xd.light)!=null&&Vd.sphericalHarmonicCoefficients),pi=!!((rf=(nf=o.sceneProperty)==null?void 0:nf.light)!=null&&rf.specularEnvironmentMaps),Ai=((ef=t==null?void 0:t.layer)==null?void 0:ef.type)==="simple"&&!!((oe=(yt=t==null?void 0:t.layer)==null?void 0:yt["3dtiles"])!=null&&oe.sphericalHarmonicCoefficients),md=((sl=t==null?void 0:t.layer)==null?void 0:sl.type)==="simple"&&!!((af=(Zd=t==null?void 0:t.layer)==null?void 0:Zd["3dtiles"])!=null&&af.specularEnvironmentMaps),Gd=E+generateIDWithMD5(`${(t==null?void 0:t.id)||""}_${nt}_${J}_${mt}_${pi}_${Ai}}_${md}`);return React.createElement(lt,{...o,key:Gd,id:`${t.id}_${nt}`,property:pickProperty(nt,t)||t[nt],layer:t,isVisible:J})})}),[h,d,t,n,E,o]);return jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment,{children:N||[void 0,...t.features].flatMap(nt=>Object.keys(components).map(lt=>F(lt,nt)))})}var __defProp=Object.defineProperty,__defProps=Object.defineProperties,__getOwnPropDescs=Object.getOwnPropertyDescriptors,__getOwnPropSymbols=Object.getOwnPropertySymbols,__hasOwnProp=Object.prototype.hasOwnProperty,__propIsEnum=Object.prototype.propertyIsEnumerable,__defNormalProp=(t,n,o)=>n in t?__defProp(t,n,{enumerable:!0,configurable:!0,writable:!0,value:o}):t[n]=o,__spreadValues=(t,n)=>{for(var o in n||(n={}))__hasOwnProp.call(n,o)&&__defNormalProp(t,o,n[o]);if(__getOwnPropSymbols)for(var o of __getOwnPropSymbols(n))__propIsEnum.call(n,o)&&__defNormalProp(t,o,n[o]);return t},__spreadProps=(t,n)=>__defProps(t,__getOwnPropDescs(n));class CesiumDnD{constructor(n,o){this._initialEnableRotate=!0,this._initialEnableTranslate=!0,this._callbackProperty=new Cesium$1.CallbackProperty(()=>{var s;return(s=this._position)!=null?s:this._initialPosition},!1),this.cancelDragging=()=>{clearTimeout(this._timeout),this._entity&&(this._entity.position=this._initialPosition),this._entity=void 0,this._initialPosition=void 0,this._initialScreenPosition=void 0,this._timeout=void 0,this.viewer.scene.screenSpaceCameraController.enableRotate=this._initialEnableRotate,this.viewer.scene.screenSpaceCameraController.enableTranslate=this._initialEnableTranslate,this.viewer.canvas.removeEventListener("blur",this.cancelDragging)},this._handleDrag=s=>{var c;if(this._entity||this.viewer.isDestroyed()||!(s!=null&&s.position))return;const d=this._pick(s.position);if(!d)return;const h=()=>{var p,y,E;if(this._entity||this.viewer.isDestroyed())return;this._timeout=void 0,this._initialPosition=d.position,this._initialScreenPosition=s.position.clone();const L=(p=d.position)==null?void 0:p.getValue(this.viewer.clock.currentTime);if(L){const z=this.viewer.scene.globe.ellipsoid.cartesianToCartographic(L).height;this._ellipsoid=CesiumDnD.enlargeEllipsoid(this.viewer.scene.globe.ellipsoid,z),this.viewer.scene.mode===Cesium$1.SceneMode.SCENE2D||this.viewer.scene.mode===Cesium$1.SceneMode.COLUMBUS_VIEW?this._initialHeight=z:this._initialHeight=void 0}const F=this._resetHeight(this._convertCartesian2ToPosition(s.position)),N=this._context(F,s.position);if(N&&((E=(y=this.options)==null?void 0:y.onDrag)==null?void 0:E.call(y,d,F,N))===!1){this._initialPosition=void 0,this._initialScreenPosition=void 0,this._ellipsoid=void 0;return}this._position=F,this._entity=d,this._initialEnableRotate=this.viewer.scene.screenSpaceCameraController.enableRotate,this._initialEnableTranslate=this.viewer.scene.screenSpaceCameraController.enableTranslate,this.viewer.scene.mode===Cesium$1.SceneMode.SCENE3D?this.viewer.scene.screenSpaceCameraController.enableRotate=!1:this.viewer.scene.screenSpaceCameraController.enableTranslate=!1,this.viewer.canvas.addEventListener("blur",this.cancelDragging),d.position=this._callbackProperty};if(window.clearTimeout(this._timeout),typeof((c=this.options)==null?void 0:c.dragDelay)>"u"){h();return}this._timeout=window.setTimeout(h,this.options.dragDelay)},this._handleDragging=s=>{var c,d;if(clearTimeout(this._timeout),!this._entity||this.viewer.isDestroyed()||!(s!=null&&s.endPosition))return;const h=this._resetHeight(this._convertCartesian2ToPosition(s.endPosition)),p=this._context(h,s.endPosition);if(!p)return;const y=(d=(c=this.options)==null?void 0:c.onDragging)==null?void 0:d.call(c,this._entity,h,__spreadProps(__spreadValues({},p),{previousScreenPosition:s.startPosition}));y!==!1&&(typeof y<"u"?this._position=y:h&&(this._position=h))},this._handleDrop=s=>{var c,d;if(clearTimeout(this._timeout),!this._entity||this.viewer.isDestroyed()||!(s!=null&&s.position))return;const h=this._entity;h.position=this._initialPosition,this._position=void 0,this._entity=void 0,this._timeout=void 0,this.viewer.scene.screenSpaceCameraController.enableRotate=this._initialEnableRotate,this.viewer.scene.screenSpaceCameraController.enableTranslate=this._initialEnableTranslate,this.viewer.canvas.removeEventListener("blur",this.cancelDragging);const p=this._resetHeight(this._convertCartesian2ToPosition(s.position)),y=this._context(p,s.position);this._initialPosition=void 0,this._initialScreenPosition=void 0,this._initialHeight=void 0,this._ellipsoid=void 0,y&&((d=(c=this.options)==null?void 0:c.onDrop)==null?void 0:d.call(c,h,p,y))!==!1&&p&&(h.position=p)},this.viewer=n,this.options=o,o!=null&&o.initialDisabled||this.enable()}get isDragging(){return!!this._entity}enable(){var n,o,s,c,d,h;this._handler=new Cesium$1.ScreenSpaceEventHandler(this.viewer.canvas),this._handler.setInputAction(this._handleDrag,(o=(n=this.options)==null?void 0:n.dragInputType)!=null?o:Cesium$1.ScreenSpaceEventType.LEFT_DOWN),this._handler.setInputAction(this._handleDragging,(c=(s=this.options)==null?void 0:s.draggingInputType)!=null?c:Cesium$1.ScreenSpaceEventType.MOUSE_MOVE),this._handler.setInputAction(this._handleDrop,(h=(d=this.options)==null?void 0:d.dropInputType)!=null?h:Cesium$1.ScreenSpaceEventType.LEFT_UP)}disable(){var n;this.cancelDragging(),(n=this._handler)==null||n.destroy(),this._handler=void 0}get isActive(){return!!this._handler}_pick(n){var o;return(o=this.viewer.scene.pick(n))==null?void 0:o.id}_context(n,o){if(this._initialScreenPosition)return{position:n,screenPosition:o,initialPosition:this._initialPosition,initialScreenPosition:this._initialScreenPosition}}_convertCartesian2ToPosition(n){var o;return this.viewer.scene.camera.pickEllipsoid(n,(o=this._ellipsoid)!=null?o:this.viewer.scene.globe.ellipsoid)}_resetHeight(n){if(n&&(this.viewer.scene.mode===Cesium$1.SceneMode.SCENE2D||this.viewer.scene.mode===Cesium$1.SceneMode.COLUMBUS_VIEW)&&this._initialHeight){const o=this.viewer.scene.globe.ellipsoid.cartesianToCartographic(n);return Cesium$1.Cartesian3.fromRadians(o.longitude,o.latitude,this._initialHeight)}return n}static enlargeEllipsoid(n,o){return new Cesium$1.Ellipsoid(n.radii.x+o,n.radii.y+o,n.radii.z+o)}}function e2eAccessToken(){return window.REEARTH_E2E_ACCESS_TOKEN}function setE2ECesiumViewer(t){t?window.REEARTH_E2E_CESIUM_VIEWER=t:delete window.REEARTH_E2E_CESIUM_VIEWER}const targetWidth=1e6,targetLength=1e6;function useCameraLimiter(t,n,o){var p,y;const s=React.useMemo(()=>{var L,F;const E=(L=t.current)==null?void 0:L.cesiumElement;if(!(!E||E.isDestroyed()||!(o!=null&&o.cameraLimitterEnabled)||!((F=o.cameraLimitterTargetArea)!=null&&F.lng)||!o.cameraLimitterTargetArea.lat))return getGeodesic(E,o.cameraLimitterTargetArea.lng,o.cameraLimitterTargetArea.lat)},[t,o==null?void 0:o.cameraLimitterEnabled,(p=o==null?void 0:o.cameraLimitterTargetArea)==null?void 0:p.lng,(y=o==null?void 0:o.cameraLimitterTargetArea)==null?void 0:y.lat]),c=React.useMemo(()=>{if(!s)return;const E=typeof(o==null?void 0:o.cameraLimitterTargetWidth)=="number"?o.cameraLimitterTargetWidth:targetWidth,L=typeof(o==null?void 0:o.cameraLimitterTargetLength)=="number"?o.cameraLimitterTargetLength:targetLength,{cartesianArray:F,cartographicDimensions:N}=calcBoundaryBox(s,L/2,E/2);return{cartographicDimensions:N,cartesianArray:F}},[o==null?void 0:o.cameraLimitterTargetWidth,o==null?void 0:o.cameraLimitterTargetLength,s]),[d,h]=React.useState();return React.useEffect(()=>{var lt;const E=(lt=t.current)==null?void 0:lt.cesiumElement;if(!E||E.isDestroyed()||!(o!=null&&o.cameraLimitterTargetArea)||!s)return;const L=new Cesium$1.Camera(E.scene);L.setView({destination:Cesium$1.Cartesian3.fromDegrees(o.cameraLimitterTargetArea.lng,o.cameraLimitterTargetArea.lat,o.cameraLimitterTargetArea.height),orientation:{heading:o==null?void 0:o.cameraLimitterTargetArea.heading,pitch:o==null?void 0:o.cameraLimitterTargetArea.pitch,roll:o==null?void 0:o.cameraLimitterTargetArea.roll,up:L.up}});const F=L.computeViewRectangle();if(!F)return;const N=Cesium$1.Rectangle.computeWidth(F)*Cesium$1.Math.PI*1e6,z=Cesium$1.Rectangle.computeHeight(F)*Cesium$1.Math.PI*1e6,{cameraLimitterTargetWidth:Z=targetWidth,cameraLimitterTargetLength:H=targetLength}=o??{},{cartesianArray:nt}=calcBoundaryBox(s,H/2+z,Z/2+N);h(nt)},[t,o,s]),React.useEffect(()=>{var F,N;const E=(F=t==null?void 0:t.current)==null?void 0:F.cesiumElement,L=getCamera((N=t==null?void 0:t.current)==null?void 0:N.cesiumElement);!E||E.isDestroyed()||!L||!(o!=null&&o.cameraLimitterEnabled)||!c||E.camera.setView({destination:getAllowedCameraDestination(L,c),orientation:{heading:E.camera.heading,pitch:E.camera.pitch,roll:E.camera.roll,up:E.camera.up}})},[n,t,o,c]),{cameraViewBoundaries:c==null?void 0:c.cartesianArray,cameraViewOuterBoundaries:d,cameraViewBoundariesMaterial}}const cameraViewBoundariesMaterial=new Cesium$1.PolylineDashMaterialProperty({color:Cesium$1.Color.RED}),getGeodesic=(t,n,o)=>{const s=t.scene.globe.ellipsoid,c=Cesium$1.Cartesian3.fromDegrees(n,o,0),d=Cesium$1.Cartographic.fromCartesian(c),h=s.geodeticSurfaceNormal(c),p=Cesium$1.Cartesian3.normalize(Cesium$1.Cartesian3.cross(Cesium$1.Cartesian3.UNIT_Z,h,new Cesium$1.Cartesian3),new Cesium$1.Cartesian3),y=Cesium$1.Cartesian3.normalize(Cesium$1.Cartesian3.cross(h,p,new Cesium$1.Cartesian3),new Cesium$1.Cartesian3),E=new Cesium$1.EllipsoidGeodesic(d,Cesium$1.Cartographic.fromCartesian(y),s),L=new Cesium$1.EllipsoidGeodesic(d,Cesium$1.Cartographic.fromCartesian(p),s);return{vertical:E,horizontal:L}},calcBoundaryBox=(t,n,o)=>{const s=t.vertical.interpolateUsingSurfaceDistance(n),c=t.vertical.interpolateUsingSurfaceDistance(-n),d=t.horizontal.interpolateUsingSurfaceDistance(o),h=t.horizontal.interpolateUsingSurfaceDistance(-o),p=new Cesium$1.Cartographic(d.longitude,s.latitude,0),y=new Cesium$1.Cartographic(h.longitude,s.latitude,0),E=new Cesium$1.Cartographic(d.longitude,c.latitude,0),L=new Cesium$1.Cartographic(h.longitude,c.latitude,0);return{cartographicDimensions:{rightDimension:d,leftDimension:h,topDimension:s,bottomDimension:c},cartesianArray:[Cesium$1.Cartographic.toCartesian(p),Cesium$1.Cartographic.toCartesian(y),Cesium$1.Cartographic.toCartesian(L),Cesium$1.Cartographic.toCartesian(E),Cesium$1.Cartographic.toCartesian(p)]}},getAllowedCameraDestination=(t,n)=>{const o=Cesium$1.Cartographic.fromDegrees(t==null?void 0:t.lng,t==null?void 0:t.lat,t==null?void 0:t.height),s=new Cesium$1.Cartographic(Cesium$1.Math.clamp(o.longitude,n.cartographicDimensions.leftDimension.longitude,n.cartographicDimensions.rightDimension.longitude),Cesium$1.Math.clamp(o.latitude,n.cartographicDimensions.bottomDimension.latitude,n.cartographicDimensions.topDimension.latitude),o.height);return Cesium$1.Cartographic.toCartesian(s)},makeMouseEventProps=(t,n)=>{if(!t||t.isDestroyed())return;const o=n.position||n.startPosition;return{x:o==null?void 0:o.x,y:o==null?void 0:o.y,...o?getLocationFromScreen(t.scene,o.x,o.y,!0)??{}:{}}},useLayerSelectWithRect=({cesium:t,engineAPI:n,featureFlags:o,onLayerSelectWithRectStart:s,onLayerSelectWithRectMove:c,onLayerSelectWithRectEnd:d})=>{const h=React.useRef([0,0]),p=React.useRef(!1),y=React.useRef(!1),E=React.useCallback((z,Z)=>{var nt;if(p.current||y.current||o!==INTERACTION_MODES.selection||!((nt=t.current)!=null&&nt.cesiumElement)||t.current.cesiumElement.isDestroyed())return;const H=makeMouseEventProps(t.current.cesiumElement,z)??{};h.current=[H.x??0,H.y??0],y.current=!0,p.current=!1,s==null||s({...H,pressedKey:Z})},[s,t,o]),L=React.useCallback((z,Z,H)=>{var md;if(!y.current||!((md=t.current)!=null&&md.cesiumElement)||t.current.cesiumElement.isDestroyed())return;const nt=makeMouseEventProps(t.current.cesiumElement,z)??{};let[lt,J]=h.current,[mt,pi]=[nt.x??0,nt.y??0];if(mt-lt===0&&pi-J===0)return nt;H||(p.current=!0),lt>mt&&([mt,lt]=[lt,mt]),J>pi&&([pi,J]=[J,pi]);const Ai={...nt,pressedKey:Z,x:mt,y:pi,startX:lt,startY:J,width:mt-lt,height:pi-J};return c==null||c(Ai),Ai},[c,t]),F=React.useCallback((z,Z)=>{var Vd;if(!y.current||!((Vd=t.current)!=null&&Vd.cesiumElement)||t.current.cesiumElement.isDestroyed())return;const H=L(z,Z,!0),{startX:nt=0,startY:lt=0,x:J=0,y:mt=0,width:pi=0,height:Ai=0}=H??{},[md,Gd]=[nt+pi/2,lt+Ai/2],Xd=p.current?n.pickManyFromViewport([md,Gd],pi,Ai):n.pickManyFromViewport([J,mt],1,1);d==null||d({...H,pressedKey:Z,features:Xd??[],isClick:!p.current}),p.current=!1,y.current=!1},[d,t,n,L]);return React.useMemo(()=>Object.fromEntries(Object.entries({start:{handler:E,keys:["shift"]},move:{handler:L,keys:["shift"]},end:{handler:F,keys:["shift"]}}).map(([Z,H])=>[Z,{handler:H.handler,...Object.fromEntries(H.keys.map(nt=>[nt,lt=>H.handler(lt,nt)]))}])),[F,L,E])},colorScratch=new Cesium$1.Color;function pickFramebufferEnd(t){const n=t.width??1,o=t.height??1,s=this._context,c=s.readPixels({x:t.x,y:t.y,width:n,height:o,framebuffer:this._fb.framebuffer}),d=new Set;for(let h=0;h<c.length;h+=4)try{colorScratch.red=Cesium$1.Color.byteToFloat(c[h]),colorScratch.green=Cesium$1.Color.byteToFloat(c[h+1]),colorScratch.blue=Cesium$1.Color.byteToFloat(c[h+2]),colorScratch.alpha=Cesium$1.Color.byteToFloat(c[h+3]);const p=s.getObjectByPickColor(colorScratch);p!=null&&d.add(p)}catch(p){console.error(p)}return Array.from(d.values())}const pickingFrustumScratch=new Cesium$1.PerspectiveOffCenterFrustum,pixelSizeScratch=new Cesium$1.Cartesian2;function getPickCullingVolume(t,n,o,s,c){const d=t.camera,h=d.frustum;invariant$1(h instanceof Cesium$1.PerspectiveFrustum);const p=h.near,y=Math.tan(h.fovy/2),E=h.aspectRatio*y,L=n.x,F=n.y,N=2*(L-c.x)/c.width-1,z=2*(c.height-F-c.y)/c.height-1,Z=N*p*E,H=z*p*y,nt=h.getPixelDimensions(c.width,c.height,p,getPixelRatio(t),pixelSizeScratch),lt=nt.x*o/2,J=nt.y*s/2,mt=pickingFrustumScratch;return mt.top=H+J,mt.bottom=H-J,mt.right=Z+lt,mt.left=Z-lt,mt.near=p,mt.far=h.far,mt.computeCullingVolume(d.positionWC,d.directionWC,d.upWC)}function getIntersection(t,n,o=new Cesium$1.BoundingRectangle){invariant$1(t.width>=0&&t.height>=0),invariant$1(n.width>=0&&n.height>=0);const s=Math.max(t.x,n.x),c=Math.min(t.x+t.width,n.x+n.width),d=Math.max(t.y,n.y),h=Math.min(t.y+t.height,n.y+n.height);if(!(s>=c||d>=h))return o.x=s,o.y=d,o.width=c-s,o.height=h-d,o.clone(new Cesium$1.BoundingRectangle)}const pickTilesetPassState=new Cesium3DTilePassState({pass:Cesium3DTilePass$1.PICK}),zeroColor=new Cesium$1.Color(0,0,0,0),positionScratch=new Cesium$1.Cartesian2,rectangleScratch=new Cesium$1.BoundingRectangle;function pickManyFromViewport(t,n,o,s){const c=t.groundPrimitives.show;t.groundPrimitives.show=!1,invariant$1(o>0&&s>0);const d=t.context,h=t.defaultView;t.view=h;const p=h.viewport;p.x=0,p.y=0,p.width=d.drawingBufferWidth,p.height=d.drawingBufferHeight,h.passState.viewport=Cesium$1.BoundingRectangle.clone(p,h.passState.viewport),t.jobScheduler.disableThisFrame(),t.updateFrameState();const y=SceneTransforms.transformWindowToDrawingBuffer(t,n,positionScratch),E=getPixelRatio(t),L=o*E,F=s*E,N=t.frameState;N.cullingVolume=getPickCullingVolume(t,y,L,F,p),N.invertClassification=!1,N.passes.pick=!0,N.tilesetPassState=pickTilesetPassState,d.uniformState.update(N),t.updateEnvironment(),rectangleScratch.x=y.x-L/2,rectangleScratch.y=t.drawingBufferHeight-y.y-F/2,rectangleScratch.height=F,rectangleScratch.width=L;const z=getIntersection(rectangleScratch,h.viewport,rectangleScratch);invariant$1(z!=null);const Z=h.pickFramebuffer.begin(z,h.viewport);t.updateAndExecuteCommands(Z,zeroColor),t.resolveFramebuffers(Z);const H=pickFramebufferEnd.apply(h.pickFramebuffer,[rectangleScratch]);return d.endFrame(),t.groundPrimitives.show=c,H}const pickManyFromViewportAsFeature=(t,n,o,s,c)=>{const d=pickManyFromViewport(t.scene,n,o,s),h=[];for(const p of d){const[y,E]=convertObjToComputedFeature(t.clock.currentTime,p)??[],L=E?{...E,layerId:y}:void 0;!L||c&&!c(L)||h.push(L)}return h},cartographicScratch=new Cartographic,cartesianScratch1$1=new Cartesian3,cartesianScratch2$1=new Cartesian3;function createPoint(t,n){if(t.length===1)try{const o=Cartographic.fromCartesian(t[0],n,cartographicScratch);return point([CesiumMath$1.toDegrees(o.longitude),CesiumMath$1.toDegrees(o.latitude)]).geometry}catch(o){console.error(o)}}function createCircle(t,n){if(t.length!==2)return;const o=Cartesian3.distance(t[0],t[1]);if(o!==0)try{const s=Cartographic.fromCartesian(t[0],n,cartographicScratch);return ellipse([CesiumMath$1.toDegrees(s.longitude),CesiumMath$1.toDegrees(s.latitude)],o,o,{units:"meters"}).geometry}catch(s){console.error(s)}}function createRectangle(t,n){if(!(t.length!==2&&t.length!==3))try{if(t.length===2)return lineString(t.map(F=>{const N=Cartographic.fromCartesian(F,n,cartographicScratch);return[CesiumMath$1.toDegrees(N.longitude),CesiumMath$1.toDegrees(N.latitude)]})).geometry;const[o,s,c]=t,d=Cartesian3.projectVector(Cartesian3.subtract(c,o,cartesianScratch1$1),Cartesian3.subtract(s,o,cartesianScratch2$1),cartesianScratch1$1),h=Cartesian3.subtract(c,Cartesian3.add(o,d,cartesianScratch1$1),cartesianScratch2$1),p=Cartesian3.add(o,h,cartesianScratch1$1),y=Cartesian3.add(s,h,cartesianScratch2$1);return polygon([[o,s,y,p,o].map(L=>{const F=Cartographic.fromCartesian(L,n,cartographicScratch);return[CesiumMath$1.toDegrees(F.longitude),CesiumMath$1.toDegrees(F.latitude)]})]).geometry}catch(o){console.error(o)}}function createPolyline(t,n){if(!(t.length<2))try{return lineString(t.map(s=>{const c=Cartographic.fromCartesian(s,n,cartographicScratch);return[CesiumMath$1.toDegrees(c.longitude),CesiumMath$1.toDegrees(c.latitude)]})).geometry}catch(o){console.error(o)}}function createPolygon(t,n){if(!(t.length<2))try{return t.length===2?lineString(t.map(c=>{const d=Cartographic.fromCartesian(c,n,cartographicScratch);return[CesiumMath$1.toDegrees(d.longitude),CesiumMath$1.toDegrees(d.latitude)]})).geometry:polygon([[...t,t[0]].map(s=>{const c=Cartographic.fromCartesian(s,n,cartographicScratch);return[CesiumMath$1.toDegrees(c.longitude),CesiumMath$1.toDegrees(c.latitude)]})]).geometry}catch(o){console.error(o)}}function createGeometry({type:t,controlPoints:n}){switch(t){case"marker":return createPoint(n);case"polyline":return createPolyline(n);case"circle":case"extrudedCircle":return createCircle(n);case"rectangle":case"extrudedRectangle":return createRectangle(n);case"polygon":case"extrudedPolygon":return createPolygon(n);default:return}}function useEngineRef(t,n){const o=React.useRef(),s=React.useRef({click:[],doubleclick:[],mousedown:[],mouseup:[],rightclick:[],rightdown:[],rightup:[],middleclick:[],middledown:[],middleup:[],mousemove:[],mouseenter:[],mouseleave:[],wheel:[]}),c=React.useRef([]),d=React.useMemo(()=>({name:"cesium",requestRender:()=>{var p,y;const h=(p=n.current)==null?void 0:p.cesiumElement;!h||h.isDestroyed()||(y=h.scene)==null||y.requestRender()},getCamera:()=>{var p;const h=(p=n.current)==null?void 0:p.cesiumElement;if(!(!h||h.isDestroyed()))return getCamera(h)},getLocationFromScreen:(h,p,y)=>{var L;const E=(L=n.current)==null?void 0:L.cesiumElement;if(!(!E||E.isDestroyed()))return getLocationFromScreen(E.scene,h,p,y)},getCameraFovInfo:({withTerrain:h,calcViewSize:p})=>{var E;const y=(E=n.current)==null?void 0:E.cesiumElement;if(!(!y||y.isDestroyed()))try{let L,F,N;return h&&(F=getCameraTerrainIntersection(y.scene),F&&(L=cartesianToLatLngHeight(F,y.scene))),L||(F=new Cesium__namespace.Cartesian3,getCameraEllipsoidIntersection(y.scene,F),L=cartesianToLatLngHeight(F,y.scene)),p&&F&&y.scene.camera.frustum instanceof Cesium__namespace.PerspectiveFrustum&&(N=Cesium__namespace.Cartesian3.distance(y.scene.camera.positionWC,F)*Math.tan(y.scene.camera.frustum.fov/2)),{center:L,viewSize:N}}catch{return}},sampleTerrainHeight:async(h,p)=>{var E;const y=(E=n.current)==null?void 0:E.cesiumElement;if(!(!y||y.isDestroyed()))return await sampleTerrainHeight(y.scene,h,p)},computeGlobeHeight:(h,p,y)=>{var L;const E=(L=n.current)==null?void 0:L.cesiumElement;if(!(!E||E.isDestroyed()))return E.scene.globe.getHeight(Cesium__namespace.Cartographic.fromDegrees(h,p,y))},getGlobeHeight:()=>{var E;const h=(E=n.current)==null?void 0:E.cesiumElement;if(!h||h.isDestroyed())return;const p=h.scene,{globeHeight:y}=p;if(!(!p||y==null))return y},toXYZ:(h,p,y,E)=>{var N;const L=(N=n.current)==null?void 0:N.cesiumElement;if(!L||L.isDestroyed())return;const F=Cesium__namespace.Cartesian3.fromDegrees(h,p,y,E!=null&&E.useGlobeEllipsoid?L.scene.globe.ellipsoid:void 0);return[F.x,F.y,F.z]},toLngLatHeight:(h,p,y,E)=>{var N;const L=(N=n.current)==null?void 0:N.cesiumElement;if(!L||L.isDestroyed())return;const F=Cesium__namespace.Cartographic.fromCartesian(Cesium__namespace.Cartesian3.fromElements(h,p,y),E!=null&&E.useGlobeEllipsoid?L.scene.globe.ellipsoid:void 0);return[Cesium$1.Math.toDegrees(F.longitude),Cesium$1.Math.toDegrees(F.latitude),F.height]},toWindowPosition:h=>{var E;const p=(E=n.current)==null?void 0:E.cesiumElement;if(!p||p.isDestroyed())return;const y=Cesium__namespace.SceneTransforms.wgs84ToWindowCoordinates(p.scene,Cesium__namespace.Cartesian3.fromElements(...h));return[y.x,y.y]},convertScreenToPositionOffset:(h,p)=>{var Vd;const y=(Vd=n.current)==null?void 0:Vd.cesiumElement;if(!y||y.isDestroyed())return;const E=Cesium__namespace.Cartesian3.fromElements(...h),L=new Cesium__namespace.Cartesian3,F=new Cesium__namespace.Cartographic,N=new Cesium__namespace.Cartesian3,z=new Cesium__namespace.Ellipsoid,Z=new Cesium__namespace.Ray,H=new Cesium__namespace.Cartesian3,nt=y.scene,lt=nt.globe.ellipsoid;let J;try{J=Cesium__namespace.Cartographic.fromCartesian(E,lt,F)}catch{return}N.x=lt.radii.x+J.height,N.y=lt.radii.y+J.height,N.z=lt.radii.z+J.height;const mt=Cesium__namespace.Ellipsoid.fromCartesian3(N,z),pi=new Cesium__namespace.Cartesian2;try{[pi.x,pi.y]=d.toWindowPosition(h)??[0,0]}catch{return}pi.x+=p[0],pi.y+=p[1];const Ai=nt.camera.getPickRay(pi,Z);if(Ai==null)return;const md=Cesium__namespace.IntersectionTests.rayEllipsoid(Ai,mt);if(md==null)return;const Gd=Cesium__namespace.Ray.getPoint(Ai,md.start,H),Xd=Cesium__namespace.Cartesian3.subtract(Gd,E,L);return[Xd.x,Xd.y,Xd.z]},isPositionVisible:h=>{var E;const p=(E=n.current)==null?void 0:E.cesiumElement;if(!p||p.isDestroyed())return!1;const y=new EllipsoidalOccluder(Cesium__namespace.Ellipsoid.WGS84,Cesium__namespace.Cartesian3.ZERO);return y.cameraPosition=p.scene.camera.position,y.isPointVisible(Cesium__namespace.Cartesian3.fromElements(...h))},setView:h=>{var E;const p=(E=n.current)==null?void 0:E.cesiumElement;if(!p||p.isDestroyed())return!1;const y=p.scene;if(h.lng||h.lat||h.height){const L=Cesium__namespace.Cartesian3.fromDegrees(h.lng,h.lat,h.height);y.camera.position.x=L.x,y.camera.position.y=L.y,y.camera.position.z=L.z}(h.heading||h.pitch)&&y.camera.setView({orientation:{heading:h.heading,pitch:h.pitch}}),h.fov&&y.camera.frustum instanceof Cesium__namespace.PerspectiveFrustum&&(y.camera.frustum.fov=h.fov)},getExtrudedHeight:(h,p)=>{var E;const y=(E=n.current)==null?void 0:E.cesiumElement;if(!(!y||y.isDestroyed()))return getExtrudedHeight(y.scene,new Cesium__namespace.Cartesian3(h[0],h[1],h[2]),new Cesium__namespace.Cartesian2(p[0],p[1]))},getSurfaceDistance:(h,p)=>{var F;const y=(F=n.current)==null?void 0:F.cesiumElement;if(!y||y.isDestroyed())return;const E=y.scene,L=new Cesium__namespace.EllipsoidGeodesic(void 0,void 0,E.globe.ellipsoid);return L.setEndPoints(Cesium__namespace.Cartographic.fromCartesian(h,E.globe.ellipsoid,new Cesium__namespace.Cartographic),Cesium__namespace.Cartographic.fromCartesian(p,E.globe.ellipsoid,new Cesium__namespace.Cartographic)),L.surfaceDistance},equalsEpsilon2d:(h,p,y=0,E=0)=>Cesium__namespace.Cartesian2.equalsEpsilon(new Cesium__namespace.Cartesian2(h[0],h[1]),new Cesium__namespace.Cartesian2(p[0],p[1]),y,E),equalsEpsilon3d:(h,p,y=0,E=0)=>Cesium__namespace.Cartesian3.equalsEpsilon(new Cesium__namespace.Cartesian3(h[0],h[1],h[2]),new Cesium__namespace.Cartesian3(p[0],p[1],p[2]),y,E),createGeometry:({type:h,controlPoints:p})=>createGeometry({type:h,controlPoints:p.map(y=>new Cesium__namespace.Cartesian3(...y))}),setCursor:h=>{var y;const p=(y=n.current)==null?void 0:y.cesiumElement;if(!(!p||p.isDestroyed()))return p.canvas.style.cursor=h??"auto",null},flyTo:(h,p)=>{var y,E,L,F,N;if(h&&typeof h=="object"){const z=(y=n.current)==null?void 0:y.cesiumElement;if(!z||z.isDestroyed())return;(E=o.current)==null||E.call(o),o.current=flyTo((L=z.scene)==null?void 0:L.camera,{...getCamera(z),...h},p)}if(h&&typeof h=="string"){const z=(F=n.current)==null?void 0:F.cesiumElement;if(!z||z.isDestroyed())return;const Z=h,H=findEntity(z,Z,Z,!0),nt=getTag(H);if(H instanceof Cesium__namespace.Primitive){z.scene.camera.flyToBoundingSphere(Cesium__namespace.BoundingSphere.fromTransformation(H.modelMatrix));return}if(H instanceof Cesium__namespace.GroundPrimitive){z.scene.camera.flyToBoundingSphere(nt==null?void 0:nt.originalProperties);return}if(H&&!(H instanceof Cesium__namespace.Cesium3DTileFeature||H instanceof Cesium__namespace.Cesium3DTilePointFeature||H instanceof Cesium__namespace.Model||H instanceof Cesium__namespace.Primitive||H instanceof Cesium__namespace.GroundPrimitive))z.flyTo(H,p);else{for(const mt of[z.dataSourceDisplay.dataSources,z.dataSources])for(let pi=0;pi<mt.length;pi++){const Ai=mt.get(pi);if(Ai.entities.values.find(Xd=>{var Vd;return((Vd=getTag(Xd))==null?void 0:Vd.layerId)===Z})){z.flyTo(Ai,p);return}}const lt=[];for(const mt of z.entities.values)((N=getTag(mt))==null?void 0:N.layerId)===Z&<.push(mt);if(lt.length){z.flyTo(lt,p);return}const J=findEntity(z,Z);if(J instanceof Cesium__namespace.Primitive){z.scene.camera.flyToBoundingSphere(Cesium__namespace.BoundingSphere.fromTransformation(J.modelMatrix));return}J&&!(J instanceof Cesium__namespace.Cesium3DTileFeature||J instanceof Cesium__namespace.Cesium3DTilePointFeature||J instanceof Cesium__namespace.Model||J instanceof Cesium__namespace.Primitive||J instanceof Cesium__namespace.GroundPrimitive)&&z.flyTo(J,p)}}},flyToBBox:(h,p)=>{var F,N;const y=(F=n.current)==null?void 0:F.cesiumElement;if(!y||y.isDestroyed())return;(N=o.current)==null||N.call(o);const E=Cesium__namespace.BoundingSphere.fromRectangle3D(Cesium__namespace.Rectangle.fromDegrees(...h)),L=y.scene.camera;y.camera.flyToBoundingSphere(E,{offset:{heading:p!=null&&p.heading?Cesium$1.Math.toDegrees(p.heading):y.scene.camera.heading,pitch:p!=null&&p.pitch?Cesium$1.Math.toDegrees(p.pitch):L.pitch,range:(p==null?void 0:p.range)??0},duration:p==null?void 0:p.duration}),o.current=()=>{L==null||L.cancelFlight()}},rotateOnCenter:h=>{var L;const p=(L=n.current)==null?void 0:L.cesiumElement;if(!p||p.isDestroyed())return;const y=p.scene,E=getCameraEllipsoidIntersection(y,new Cesium__namespace.Cartesian3);E&&y.camera.rotate(E,h)},overrideScreenSpaceController:h=>{var L,F;const p=(L=n.current)==null?void 0:L.cesiumElement;if(!p||p.isDestroyed())return;const y=(F=p.scene)==null?void 0:F.screenSpaceCameraController,E=getOverriddenScreenSpaceCameraOptions(h);Object.assign(y,E)},lookAt:(h,p)=>{var E,L,F;const y=(E=n.current)==null?void 0:E.cesiumElement;if(!(!y||y.isDestroyed())){if(p!=null&&p.withoutAnimation)return lookAtWithoutAnimation(y.scene,{...getCamera(y),...h});(L=o.current)==null||L.call(o),o.current=lookAt((F=y.scene)==null?void 0:F.camera,{...getCamera(y),...h},p)}},lookAtLayer:h=>{var Z,H;const p=(Z=n.current)==null?void 0:Z.cesiumElement;if(!p||p.isDestroyed())return;const y=p.entities.getById(h);if(!y)return;const E=(H=y.position)==null?void 0:H.getValue(p.clock.currentTime);if(!E)return;const L=p.camera.positionWC,F=Cesium__namespace.Cartesian3.distance(E,L);if(Math.round(F*1e3)/1e3===5e3)return;const N=getCamera(p),z=new Cesium__namespace.HeadingPitchRange((N==null?void 0:N.heading)??0,(N==null?void 0:N.pitch)??-90,5e3);p.zoomTo(y,z)},getViewport:()=>{var y;const h=(y=n.current)==null?void 0:y.cesiumElement;if(!h||h.isDestroyed())return;const p=h.camera.computeViewRectangle();return p?{north:Cesium$1.Math.toDegrees(p.north),south:Cesium$1.Math.toDegrees(p.south),west:Cesium$1.Math.toDegrees(p.west),east:Cesium$1.Math.toDegrees(p.east)}:void 0},zoomIn:(h,p)=>{var E;const y=(E=n.current)==null?void 0:E.cesiumElement;!y||y.isDestroyed()||zoom({viewer:y,relativeAmount:1/h},p)},zoomOut:(h,p)=>{var E;const y=(E=n.current)==null?void 0:E.cesiumElement;!y||y.isDestroyed()||zoom({viewer:y,relativeAmount:h},p)},orbit:h=>{var lt;const p=(lt=n.current)==null?void 0:lt.cesiumElement;if(!p||p.isDestroyed())return;const y=p.scene,E=y.camera,L=.02,F=h+Cesium$1.Math.PI_OVER_TWO,N=Math.cos(F)*L,z=Math.sin(F)*L,Z=Cesium__namespace.Matrix4.clone(E.transform),H=getCenterCamera({camera:E,scene:y}),nt=Cesium__namespace.Transforms.eastNorthUpToFixedFrame(H||E.positionWC,y.globe.ellipsoid);E.lookAtTransform(nt),p.scene.mode!==Cesium__namespace.SceneMode.SCENE3D?E.move(new Cesium__namespace.Cartesian3(N,z,0),Math.max(y.canvas.clientWidth,y.canvas.clientHeight)/100*E.positionCartographic.height*L):H?(E.rotateLeft(N),E.rotateUp(z)):(E.look(Cesium__namespace.Cartesian3.UNIT_Z,N),E.look(E.right,z)),E.lookAtTransform(Z)},rotateRight:h=>{var N;const p=(N=n.current)==null?void 0:N.cesiumElement;if(!p||p.isDestroyed())return;const y=p.scene,E=y.camera,L=Cesium__namespace.Matrix4.clone(E.transform),F=Cesium__namespace.Transforms.eastNorthUpToFixedFrame(E.positionWC,y.globe.ellipsoid);p.scene.mode!==Cesium__namespace.SceneMode.SCENE3D?(E.twistRight(h- -E.heading),E.twistLeft(h- -E.heading)):(E.lookAtTransform(F),E.rotateRight(h- -E.heading),E.lookAtTransform(L))},changeSceneMode:(h,p=2)=>{var E,L,F,N;const y=(E=n.current)==null?void 0:E.cesiumElement;if(!(!y||y.isDestroyed()||!y.scene))switch(h){case"2d":(L=y==null?void 0:y.scene)==null||L.morphTo2D(p);break;case"columbus":(F=y==null?void 0:y.scene)==null||F.morphToColumbusView(p);break;case"3d":default:(N=y==null?void 0:y.scene)==null||N.morphTo3D(p);break}},getClock:()=>{var y;const h=(y=n.current)==null?void 0:y.cesiumElement;if(!h||h.isDestroyed()||!h.clock)return;const p=h.clock;return getClock(p)},captureScreen:(h,p)=>{var E;const y=(E=n.current)==null?void 0:E.cesiumElement;if(!(!y||y.isDestroyed()))return y.scene.requestRender(),y.render(),y.canvas.toDataURL(h,p)},enableScreenSpaceCameraController:(h=!0)=>{var E;const p=(E=n.current)==null?void 0:E.cesiumElement;if(!p||p.isDestroyed()||!p.scene)return;const y=!!h;p.scene.screenSpaceCameraController.enableRotate=y,p.scene.screenSpaceCameraController.enableTranslate=y,p.scene.screenSpaceCameraController.enableZoom=y,p.scene.screenSpaceCameraController.enableTilt=y,p.scene.screenSpaceCameraController.enableLook=y},lookHorizontal:h=>{var y;const p=(y=n.current)==null?void 0:y.cesiumElement;!p||p.isDestroyed()||!p.scene||!h||lookHorizontal(p.scene,h)},lookVertical:h=>{var y;const p=(y=n.current)==null?void 0:y.cesiumElement;!p||p.isDestroyed()||!p.scene||!h||lookVertical(p.scene,h)},moveForward:h=>{var y;const p=(y=n.current)==null?void 0:y.cesiumElement;!p||p.isDestroyed()||!p.scene||!h||moveForward(p.scene,h)},moveBackward:h=>{var y;const p=(y=n.current)==null?void 0:y.cesiumElement;!p||p.isDestroyed()||!p.scene||!h||moveBackward(p.scene,h)},moveUp:h=>{var y;const p=(y=n.current)==null?void 0:y.cesiumElement;!p||p.isDestroyed()||!p.scene||!h||moveUp(p.scene,h)},moveDown:h=>{var y;const p=(y=n.current)==null?void 0:y.cesiumElement;!p||p.isDestroyed()||!p.scene||!h||moveDown(p.scene,h)},moveLeft:h=>{var y;const p=(y=n.current)==null?void 0:y.cesiumElement;!p||p.isDestroyed()||!p.scene||!h||moveLeft(p.scene,h)},moveRight:h=>{var y;const p=(y=n.current)==null?void 0:y.cesiumElement;!p||p.isDestroyed()||!p.scene||!h||moveRight(p.scene,h)},moveOverTerrain:async h=>{var y;const p=(y=n.current)==null?void 0:y.cesiumElement;!p||p.isDestroyed()||moveOverTerrain(p,h)},flyToGround:async(h,p,y)=>{var L;const E=(L=n.current)==null?void 0:L.cesiumElement;!E||E.isDestroyed()||flyToGround(E,o,h,p,y)},onClick:h=>{s.current.click.push(h)},onDoubleClick:h=>{s.current.doubleclick.push(h)},onMouseDown:h=>{s.current.mousedown.push(h)},onMouseUp:h=>{s.current.mouseup.push(h)},onRightClick:h=>{s.current.rightclick.push(h)},onRightDown:h=>{s.current.rightdown.push(h)},onRightUp:h=>{s.current.rightup.push(h)},onMiddleClick:h=>{s.current.middleclick.push(h)},onMiddleDown:h=>{s.current.middledown.push(h)},onMiddleUp:h=>{s.current.middleup.push(h)},onMouseMove:h=>{s.current.mousemove.push(h)},onMouseEnter:h=>{s.current.mouseenter.push(h)},onMouseLeave:h=>{s.current.mouseleave.push(h)},onWheel:h=>{s.current.wheel.push(h)},mouseEventCallbacks:s.current,changeSpeed:h=>{var y;const p=(y=n.current)==null?void 0:y.cesiumElement;!p||p.isDestroyed()||(p.clock.multiplier=h,p.clock.clockStep=Cesium$1.ClockStep.SYSTEM_CLOCK_MULTIPLIER)},changeTime:h=>{var y;const p=(y=n.current)==null?void 0:y.cesiumElement;!p||p.isDestroyed()||(p.clock.currentTime=Cesium$1.JulianDate.fromDate(h))},pause:()=>{var p;const h=(p=n.current)==null?void 0:p.cesiumElement;!h||h.isDestroyed()||(h.clock.shouldAnimate=!1)},play:()=>{var p;const h=(p=n.current)==null?void 0:p.cesiumElement;!h||h.isDestroyed()||(h.clock.shouldAnimate=!0)},tick:()=>{var p;const h=(p=n.current)==null?void 0:p.cesiumElement;if(!(!h||h.isDestroyed()))return Cesium$1.JulianDate.toDate(h.clock.tick())},changeStart:h=>{var y;const p=(y=n.current)==null?void 0:y.cesiumElement;!p||p.isDestroyed()||(p.clock.startTime=Cesium$1.JulianDate.fromDate(h))},changeStop:h=>{var y;const p=(y=n.current)==null?void 0:y.cesiumElement;!p||p.isDestroyed()||(p.clock.stopTime=Cesium$1.JulianDate.fromDate(h))},inViewport:h=>{const p=d.getViewport();return!!(p&&h&&typeof h.lng=="number"&&typeof h.lat=="number"&&Cesium__namespace.Rectangle.contains(new Cesium__namespace.Rectangle(Cesium$1.Math.toRadians(p.west),Cesium$1.Math.toRadians(p.south),Cesium$1.Math.toRadians(p.east),Cesium$1.Math.toRadians(p.north)),Cesium__namespace.Cartographic.fromDegrees(h.lng,h.lat)))},findFeatureById:(h,p)=>{var F;const y=(F=n.current)==null?void 0:F.cesiumElement;if(!y||y.isDestroyed())return;const E=findEntity(y,h,p),L=getTag(E);if(L!=null&&L.featureId){if(E instanceof Cesium__namespace.Entity)return{type:"feature",id:L.featureId,properties:convertEntityProperties(y.clock.currentTime,E),metaData:{description:convertEntityDescription(y.clock.currentTime,E)}};if(E instanceof Cesium__namespace.Cesium3DTileFeature||E instanceof Cesium__namespace.Cesium3DTilePointFeature)return{type:"feature",id:L.featureId,properties:convertCesium3DTileFeatureProperties(E)}}},findFeaturesByIds:(h,p)=>{var E;const y=(E=n.current)==null?void 0:E.cesiumElement;if(!(!y||y.isDestroyed()))return findFeaturesFromLayer(y,h,p,L=>{var N;const F=(N=convertObjToComputedFeature(y.clock.currentTime,L))==null?void 0:N[1];return F?{...F,type:"feature"}:void 0})},findComputedFeatureById:(h,p)=>{var F;const y=(F=n.current)==null?void 0:F.cesiumElement;if(!y||y.isDestroyed())return;const E=findEntity(y,h,p),L=getTag(E);if(L!=null&&L.featureId){if(E instanceof Cesium__namespace.Entity)return L.computedFeature??{type:"computedFeature",id:L.featureId,properties:convertEntityProperties(y.clock.currentTime,E),metaData:{description:convertEntityDescription(y.clock.currentTime,E)}};if(E instanceof Cesium__namespace.Cesium3DTileFeature||E instanceof Cesium__namespace.Cesium3DTilePointFeature)return L.computedFeature??{type:"computedFeature",id:L.featureId,properties:convertCesium3DTileFeatureProperties(E)}}},findComputedFeaturesByIds:(h,p)=>{var E;const y=(E=n.current)==null?void 0:E.cesiumElement;if(!(!y||y.isDestroyed()))return findFeaturesFromLayer(y,h,p,L=>{var F;return(F=convertObjToComputedFeature(y.clock.currentTime,L))==null?void 0:F[1]})},bringToFront:h=>{var E;const p=(E=n.current)==null?void 0:E.cesiumElement;if(!p||p.isDestroyed())return;const y=findEntity(p,h);y&&"bringToFront"in y&&typeof y.bringToFront=="function"&&y.bringToFront()},sendToBack:h=>{var E;const p=(E=n.current)==null?void 0:E.cesiumElement;if(!p||p.isDestroyed())return;const y=findEntity(p,h);y&&"sendToBack"in y&&typeof y.sendToBack=="function"&&y.sendToBack()},selectFeatures:(h,p)=>{var E;const y=(E=n.current)==null?void 0:E.cesiumElement;!y||y.isDestroyed()||findFeaturesFromLayer(y,h,p,(L,F)=>{F&&"onSelectFeature"in F&&typeof F.onSelectFeature=="function"&&F.onSelectFeature(L);const z={...getTag(L)??{},isFeatureSelected:!0};return attachTag(L,z),L})},unselectFeatures:(h,p)=>{var E;const y=(E=n.current)==null?void 0:E.cesiumElement;!y||y.isDestroyed()||findFeaturesFromLayer(y,h,p,(L,F)=>{F&&"onUnselectFeature"in F&&typeof F.onUnselectFeature=="function"&&F.onUnselectFeature(L);const N=getTag(L)??{};return N.isFeatureSelected=!1,attachTag(L,N),L})},pickManyFromViewport:(h,p,y,E)=>{var F;const L=(F=n.current)==null?void 0:F.cesiumElement;if(!(!L||L.isDestroyed()))return pickManyFromViewportAsFeature(L,new Cesium__namespace.Cartesian2(h[0],h[1]),p,y,E)},onTick:h=>{c.current.push(h)},removeTickEventListener:h=>{c.current=c.current.filter(p=>p!==h)||[]},tickEventCallback:c}),[n]);return React.useImperativeHandle(t,()=>d,[d]),d}const GlobeFSDefinitions=`uniform vec3 u_reearth_sphericalHarmonicCoefficients[9];
|
|
6054
6054
|
uniform bool u_reearth_globeImageBasedLighting;
|
|
6055
6055
|
|
|
6056
6056
|
vec4 reearth_computeImageBasedLightingColor(vec4 color);
|