diff --git a/src/Blazor.Extensions.Canvas/BECanvas.razor b/src/Blazor.Extensions.Canvas/BECanvas.razor
index 3c0e45f..7d04e6a 100644
--- a/src/Blazor.Extensions.Canvas/BECanvas.razor
+++ b/src/Blazor.Extensions.Canvas/BECanvas.razor
@@ -1,3 +1,15 @@
@inherits BECanvasComponent
-
+
diff --git a/src/Blazor.Extensions.Canvas/BECanvasComponent.cs b/src/Blazor.Extensions.Canvas/BECanvasComponent.cs
index 98fb03b..67757b7 100644
--- a/src/Blazor.Extensions.Canvas/BECanvasComponent.cs
+++ b/src/Blazor.Extensions.Canvas/BECanvasComponent.cs
@@ -1,4 +1,5 @@
using Microsoft.AspNetCore.Components;
+using Microsoft.AspNetCore.Components.Web;
using Microsoft.JSInterop;
using System;
@@ -12,6 +13,42 @@ public class BECanvasComponent : ComponentBase
[Parameter]
public long Width { get; set; }
+ [Parameter]
+ public Action OnClick { get; set; }
+
+ [Parameter]
+ public Action OnContextMenu { get; set; }
+
+ [Parameter]
+ public Action OnDblClick { get; set; }
+
+ [Parameter]
+ public Action OnMouseDown { get; set; }
+
+ [Parameter]
+ public Action OnMouseMove { get; set; }
+
+ [Parameter]
+ public Action OnMouseOut { get; set; }
+
+ [Parameter]
+ public Action OnMouseOver { get; set; }
+
+ [Parameter]
+ public Action OnMouseUp { get; set; }
+
+ [Parameter]
+ public Action OnMouseWheel { get; set; }
+
+ [Parameter]
+ public Action OnPointerDown { get; set; }
+
+ [Parameter]
+ public Action OnPointerUp { get; set; }
+
+ [Parameter]
+ public Action OnPointerMove { get; set; }
+
protected readonly string Id = Guid.NewGuid().ToString();
protected ElementReference _canvasRef;
diff --git a/src/Blazor.Extensions.Canvas/wwwroot/blazor.extensions.canvas.js b/src/Blazor.Extensions.Canvas/wwwroot/blazor.extensions.canvas.js
index a87515b..2447ea5 100644
--- a/src/Blazor.Extensions.Canvas/wwwroot/blazor.extensions.canvas.js
+++ b/src/Blazor.Extensions.Canvas/wwwroot/blazor.extensions.canvas.js
@@ -1,2 +1,2 @@
-!function(t){var e={};function r(n){if(e[n])return e[n].exports;var o=e[n]={i:n,l:!1,exports:{}};return t[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}r.m=t,r.c=e,r.d=function(t,e,n){r.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:n})},r.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},r.t=function(t,e){if(1&e&&(t=r(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)r.d(n,o,function(e){return t[e]}.bind(null,o));return n},r.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(e,"a",e),e},r.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},r.p="",r(r.s=0)}([function(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0});const n=r(1);var o;!function(t){const e="BlazorExtensions",r={Canvas2d:new n.ContextManager("2d"),WebGL:new n.ContextManager("webgl")};t.initialize=function(){"undefined"==typeof window||window[e]?window[e]=Object.assign({},window[e],r):window[e]=Object.assign({},r)}}(o||(o={})),o.initialize()},function(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0});const n=r(2);e.ContextManager=class{constructor(t){if(this.contexts=new Map,this.webGLObject=new Array,this.webGLContext=!1,this.patterns=new Map,this.webGLTypes=[WebGLBuffer,WebGLShader,WebGLProgram,WebGLFramebuffer,WebGLRenderbuffer,WebGLTexture,WebGLUniformLocation],this.add=((t,e)=>{if(!t)throw new Error("Invalid canvas.");if(!this.contexts.get(t.id)){var r;if(!(r=e?t.getContext(this.contextName,e):t.getContext(this.contextName)))throw new Error("Invalid context.");this.contexts.set(t.id,r)}}),this.remove=(t=>{this.contexts.delete(t.id)}),this.setProperty=((t,e,r)=>{const n=this.getContext(t);this.setPropertyWithContext(n,e,r)}),this.getProperty=((t,e)=>{const r=this.getContext(t);return this.serialize(r[e])}),this.call=((t,e,r)=>{const n=this.getContext(t);return this.callWithContext(n,e,r)}),this.callBatch=((t,e)=>{const r=this.getContext(t);for(let t=0;t0?n[0]:null)}}),this.callWithContext=((t,e,r)=>{const o=this.prototypes[e].apply(t,void 0!=r?r.map(t=>this.deserialize(e,t)):[]);if("createPattern"==e){const t=n.v4();return this.patterns.set(t,o),t}return this.serialize(o)}),this.setPropertyWithContext=((t,e,r)=>{"fillStyle"==e&&(r=this.patterns.get(r)||r),t[e]=this.deserialize(e,r)}),this.getContext=(t=>{if(!t)throw new Error("Invalid canvas.");const e=this.contexts.get(t.id);if(!e)throw new Error("Invalid context.");return e}),this.deserialize=((t,e)=>{if(!this.webGLContext||void 0==e)return e;if(e.hasOwnProperty("webGLType")&&e.hasOwnProperty("id"))return this.webGLObject[e.id];if(Array.isArray(e)&&!t.endsWith("v"))return Int8Array.of(...e);if("string"!=typeof e||"bufferData"!==t&&"bufferSubData"!==t)return e;{let t=window.atob(e),n=t.length,o=new Uint8Array(n);for(var r=0;r{if(t instanceof TextMetrics)return{width:t.width};if(!this.webGLContext||void 0==t)return t;const e=this.webGLTypes.find(e=>t instanceof e);if(void 0!=e){const r=this.webGLObject.length;return this.webGLObject.push(t),{webGLType:e.name,id:r}}return t}),this.contextName=t,"2d"===t)this.prototypes=CanvasRenderingContext2D.prototype;else{if("webgl"!==t&&"experimental-webgl"!==t)throw new Error(`Invalid context name: ${t}`);this.prototypes=WebGLRenderingContext.prototype,this.webGLContext=!0}}}},function(t,e,r){"use strict";r.r(e);var n="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto),o=new Uint8Array(16);function i(){if(!n)throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return n(o)}var a=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;for(var s=function(t){return"string"==typeof t&&a.test(t)},u=[],c=0;c<256;++c)u.push((c+256).toString(16).substr(1));var f,l,d=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,r=(u[t[e+0]]+u[t[e+1]]+u[t[e+2]]+u[t[e+3]]+"-"+u[t[e+4]]+u[t[e+5]]+"-"+u[t[e+6]]+u[t[e+7]]+"-"+u[t[e+8]]+u[t[e+9]]+"-"+u[t[e+10]]+u[t[e+11]]+u[t[e+12]]+u[t[e+13]]+u[t[e+14]]+u[t[e+15]]).toLowerCase();if(!s(r))throw TypeError("Stringified UUID is invalid");return r},h=0,p=0;var v=function(t,e,r){var n=e&&r||0,o=e||new Array(16),a=(t=t||{}).node||f,s=void 0!==t.clockseq?t.clockseq:l;if(null==a||null==s){var u=t.random||(t.rng||i)();null==a&&(a=f=[1|u[0],u[1],u[2],u[3],u[4],u[5]]),null==s&&(s=l=16383&(u[6]<<8|u[7]))}var c=void 0!==t.msecs?t.msecs:Date.now(),v=void 0!==t.nsecs?t.nsecs:p+1,y=c-h+(v-p)/1e4;if(y<0&&void 0===t.clockseq&&(s=s+1&16383),(y<0||c>h)&&void 0===t.nsecs&&(v=0),v>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");h=c,p=v,l=s;var w=(1e4*(268435455&(c+=122192928e5))+v)%4294967296;o[n++]=w>>>24&255,o[n++]=w>>>16&255,o[n++]=w>>>8&255,o[n++]=255&w;var b=c/4294967296*1e4&268435455;o[n++]=b>>>8&255,o[n++]=255&b,o[n++]=b>>>24&15|16,o[n++]=b>>>16&255,o[n++]=s>>>8|128,o[n++]=255&s;for(var g=0;g<6;++g)o[n+g]=a[g];return e||d(o)};var y=function(t){if(!s(t))throw TypeError("Invalid UUID");var e,r=new Uint8Array(16);return r[0]=(e=parseInt(t.slice(0,8),16))>>>24,r[1]=e>>>16&255,r[2]=e>>>8&255,r[3]=255&e,r[4]=(e=parseInt(t.slice(9,13),16))>>>8,r[5]=255&e,r[6]=(e=parseInt(t.slice(14,18),16))>>>8,r[7]=255&e,r[8]=(e=parseInt(t.slice(19,23),16))>>>8,r[9]=255&e,r[10]=(e=parseInt(t.slice(24,36),16))/1099511627776&255,r[11]=e/4294967296&255,r[12]=e>>>24&255,r[13]=e>>>16&255,r[14]=e>>>8&255,r[15]=255&e,r};var w=function(t,e,r){function n(t,n,o,i){if("string"==typeof t&&(t=function(t){t=unescape(encodeURIComponent(t));for(var e=[],r=0;r>>9<<4)+1}function g(t,e){var r=(65535&t)+(65535&e);return(t>>16)+(e>>16)+(r>>16)<<16|65535&r}function x(t,e,r,n,o,i){return g(function(t,e){return t<>>32-e}(g(g(e,t),g(n,i)),o),r)}function m(t,e,r,n,o,i,a){return x(e&r|~e&n,t,e,o,i,a)}function C(t,e,r,n,o,i,a){return x(e&n|r&~n,t,e,o,i,a)}function A(t,e,r,n,o,i,a){return x(e^r^n,t,e,o,i,a)}function L(t,e,r,n,o,i,a){return x(r^(e|~n),t,e,o,i,a)}var I=w("v3",48,function(t){if("string"==typeof t){var e=unescape(encodeURIComponent(t));t=new Uint8Array(e.length);for(var r=0;r>5]>>>n%32&255,i=parseInt("0123456789abcdef".charAt(o>>>4&15)+"0123456789abcdef".charAt(15&o),16);e.push(i)}return e}(function(t,e){t[e>>5]|=128<>5]|=(255&t[n/8])<>>32-e}var O=w("v5",80,function(t){var e=[1518500249,1859775393,2400959708,3395469782],r=[1732584193,4023233417,2562383102,271733878,3285377520];if("string"==typeof t){var n=unescape(encodeURIComponent(t));t=[];for(var o=0;o>>0;g=b,b=w,w=M(y,30)>>>0,y=v,v=C}r[0]=r[0]+v>>>0,r[1]=r[1]+y>>>0,r[2]=r[2]+w>>>0,r[3]=r[3]+b>>>0,r[4]=r[4]+g>>>0}return[r[0]>>24&255,r[0]>>16&255,r[0]>>8&255,255&r[0],r[1]>>24&255,r[1]>>16&255,r[1]>>8&255,255&r[1],r[2]>>24&255,r[2]>>16&255,r[2]>>8&255,255&r[2],r[3]>>24&255,r[3]>>16&255,r[3]>>8&255,255&r[3],r[4]>>24&255,r[4]>>16&255,r[4]>>8&255,255&r[4]]});var j=function(t){if(!s(t))throw TypeError("Invalid UUID");return parseInt(t.substr(14,1),16)};r.d(e,"v1",function(){return v}),r.d(e,"v3",function(){return I}),r.d(e,"v4",function(){return G}),r.d(e,"v5",function(){return O}),r.d(e,"NIL",function(){return"00000000-0000-0000-0000-000000000000"}),r.d(e,"version",function(){return j}),r.d(e,"validate",function(){return s}),r.d(e,"stringify",function(){return d}),r.d(e,"parse",function(){return y})}]);
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vc3JjL0luaXRpYWxpemVDYW52YXMudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0NhbnZhc0NvbnRleHRNYW5hZ2VyLnRzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvcm5nLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvcmVnZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9zdHJpbmdpZnkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci92YWxpZGF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3YxLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvcGFyc2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci92MzUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9tZDUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci92My5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3Y0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvc2hhMS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3Y1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdmVyc2lvbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL25pbC5qcyJdLCJuYW1lcyI6WyJpbnN0YWxsZWRNb2R1bGVzIiwiX193ZWJwYWNrX3JlcXVpcmVfXyIsIm1vZHVsZUlkIiwiZXhwb3J0cyIsIm1vZHVsZSIsImkiLCJsIiwibW9kdWxlcyIsImNhbGwiLCJtIiwiYyIsImQiLCJuYW1lIiwiZ2V0dGVyIiwibyIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZW51bWVyYWJsZSIsImdldCIsInIiLCJTeW1ib2wiLCJ0b1N0cmluZ1RhZyIsInZhbHVlIiwidCIsIm1vZGUiLCJfX2VzTW9kdWxlIiwibnMiLCJjcmVhdGUiLCJrZXkiLCJiaW5kIiwibiIsIm9iamVjdCIsInByb3BlcnR5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJwIiwicyIsIkNhbnZhc0NvbnRleHRNYW5hZ2VyXzEiLCJDYW52YXMiLCJibGF6b3JFeHRlbnNpb25zIiwiZXh0ZW5zaW9uT2JqZWN0IiwiQ2FudmFzMmQiLCJDb250ZXh0TWFuYWdlciIsIldlYkdMIiwiaW5pdGlhbGl6ZSIsIndpbmRvdyIsImFzc2lnbiIsInV1aWRfMSIsIltvYmplY3QgT2JqZWN0XSIsImNvbnRleHROYW1lIiwidGhpcyIsImNvbnRleHRzIiwiTWFwIiwid2ViR0xPYmplY3QiLCJBcnJheSIsIndlYkdMQ29udGV4dCIsInBhdHRlcm5zIiwid2ViR0xUeXBlcyIsIldlYkdMQnVmZmVyIiwiV2ViR0xTaGFkZXIiLCJXZWJHTFByb2dyYW0iLCJXZWJHTEZyYW1lYnVmZmVyIiwiV2ViR0xSZW5kZXJidWZmZXIiLCJXZWJHTFRleHR1cmUiLCJXZWJHTFVuaWZvcm1Mb2NhdGlvbiIsImFkZCIsImNhbnZhcyIsInBhcmFtZXRlcnMiLCJFcnJvciIsImlkIiwiY29udGV4dCIsImdldENvbnRleHQiLCJzZXQiLCJyZW1vdmUiLCJkZWxldGUiLCJzZXRQcm9wZXJ0eSIsInNldFByb3BlcnR5V2l0aENvbnRleHQiLCJnZXRQcm9wZXJ0eSIsInNlcmlhbGl6ZSIsIm1ldGhvZCIsImFyZ3MiLCJjYWxsV2l0aENvbnRleHQiLCJjYWxsQmF0Y2giLCJiYXRjaGVkQ2FsbHMiLCJsZW5ndGgiLCJwYXJhbXMiLCJzbGljZSIsImlzQXJyYXkiLCJyZXN1bHQiLCJwcm90b3R5cGVzIiwiYXBwbHkiLCJ1bmRlZmluZWQiLCJtYXAiLCJkZXNlcmlhbGl6ZSIsInY0IiwiZW5kc1dpdGgiLCJJbnQ4QXJyYXkiLCJvZiIsImJpblN0ciIsImF0b2IiLCJieXRlcyIsIlVpbnQ4QXJyYXkiLCJjaGFyQ29kZUF0IiwiVGV4dE1ldHJpY3MiLCJ3aWR0aCIsInR5cGUiLCJmaW5kIiwicHVzaCIsIndlYkdMVHlwZSIsIkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCIsIldlYkdMUmVuZGVyaW5nQ29udGV4dCIsImdldFJhbmRvbVZhbHVlcyIsImNyeXB0byIsIm1zQ3J5cHRvIiwicm5kczgiLCJybmciLCJyZWdleCIsImVzbV9icm93c2VyX3ZhbGlkYXRlIiwidXVpZCIsInRlc3QiLCJieXRlVG9IZXgiLCJzdHJpbmdpZnlfaSIsInRvU3RyaW5nIiwic3Vic3RyIiwiX25vZGVJZCIsIl9jbG9ja3NlcSIsImVzbV9icm93c2VyX3N0cmluZ2lmeSIsImFyciIsIm9mZnNldCIsImFyZ3VtZW50cyIsInRvTG93ZXJDYXNlIiwiVHlwZUVycm9yIiwiX2xhc3RNU2VjcyIsIl9sYXN0TlNlY3MiLCJlc21fYnJvd3Nlcl92MSIsIm9wdGlvbnMiLCJidWYiLCJiIiwibm9kZSIsImNsb2Nrc2VxIiwic2VlZEJ5dGVzIiwicmFuZG9tIiwibXNlY3MiLCJEYXRlIiwibm93IiwibnNlY3MiLCJkdCIsInRsIiwidG1oIiwiZXNtX2Jyb3dzZXJfcGFyc2UiLCJ2IiwicGFyc2VJbnQiLCJ2MzUiLCJ2ZXJzaW9uIiwiaGFzaGZ1bmMiLCJnZW5lcmF0ZVVVSUQiLCJuYW1lc3BhY2UiLCJzdHIiLCJ1bmVzY2FwZSIsImVuY29kZVVSSUNvbXBvbmVudCIsInN0cmluZ1RvQnl0ZXMiLCJlcnIiLCJETlMiLCJVUkwiLCJnZXRPdXRwdXRMZW5ndGgiLCJpbnB1dExlbmd0aDgiLCJzYWZlQWRkIiwieCIsInkiLCJsc3ciLCJtZDVjbW4iLCJxIiwiYSIsIm51bSIsImNudCIsImJpdFJvdGF0ZUxlZnQiLCJtZDVmZiIsIm1kNWdnIiwibWQ1aGgiLCJtZDVpaSIsImVzbV9icm93c2VyX3YzIiwibXNnIiwiaW5wdXQiLCJvdXRwdXQiLCJsZW5ndGgzMiIsImhleCIsImNoYXJBdCIsIm1kNVRvSGV4RW5jb2RlZEFycmF5IiwibGVuIiwib2xkYSIsIm9sZGIiLCJvbGRjIiwib2xkZCIsIndvcmRzVG9NZDUiLCJsZW5ndGg4IiwiVWludDMyQXJyYXkiLCJieXRlc1RvV29yZHMiLCJlc21fYnJvd3Nlcl92NCIsInJuZHMiLCJmIiwieiIsIlJPVEwiLCJlc21fYnJvd3Nlcl92NSIsIksiLCJIIiwiTiIsIk1hdGgiLCJjZWlsIiwiTSIsIl9pIiwiaiIsInBvdyIsImZsb29yIiwiX2kyIiwiVyIsIl90IiwiZSIsIl90MiIsIlQiLCJlc21fYnJvd3Nlcl92ZXJzaW9uIl0sIm1hcHBpbmdzIjoiYUFDQSxJQUFBQSxLQUdBLFNBQUFDLEVBQUFDLEdBR0EsR0FBQUYsRUFBQUUsR0FDQSxPQUFBRixFQUFBRSxHQUFBQyxRQUdBLElBQUFDLEVBQUFKLEVBQUFFLElBQ0FHLEVBQUFILEVBQ0FJLEdBQUEsRUFDQUgsWUFVQSxPQU5BSSxFQUFBTCxHQUFBTSxLQUFBSixFQUFBRCxRQUFBQyxJQUFBRCxRQUFBRixHQUdBRyxFQUFBRSxHQUFBLEVBR0FGLEVBQUFELFFBS0FGLEVBQUFRLEVBQUFGLEVBR0FOLEVBQUFTLEVBQUFWLEVBR0FDLEVBQUFVLEVBQUEsU0FBQVIsRUFBQVMsRUFBQUMsR0FDQVosRUFBQWEsRUFBQVgsRUFBQVMsSUFDQUcsT0FBQUMsZUFBQWIsRUFBQVMsR0FBMENLLFlBQUEsRUFBQUMsSUFBQUwsS0FLMUNaLEVBQUFrQixFQUFBLFNBQUFoQixHQUNBLG9CQUFBaUIsZUFBQUMsYUFDQU4sT0FBQUMsZUFBQWIsRUFBQWlCLE9BQUFDLGFBQXdEQyxNQUFBLFdBRXhEUCxPQUFBQyxlQUFBYixFQUFBLGNBQWlEbUIsT0FBQSxLQVFqRHJCLEVBQUFzQixFQUFBLFNBQUFELEVBQUFFLEdBRUEsR0FEQSxFQUFBQSxJQUFBRixFQUFBckIsRUFBQXFCLElBQ0EsRUFBQUUsRUFBQSxPQUFBRixFQUNBLEtBQUFFLEdBQUEsaUJBQUFGLFFBQUFHLFdBQUEsT0FBQUgsRUFDQSxJQUFBSSxFQUFBWCxPQUFBWSxPQUFBLE1BR0EsR0FGQTFCLEVBQUFrQixFQUFBTyxHQUNBWCxPQUFBQyxlQUFBVSxFQUFBLFdBQXlDVCxZQUFBLEVBQUFLLFVBQ3pDLEVBQUFFLEdBQUEsaUJBQUFGLEVBQUEsUUFBQU0sS0FBQU4sRUFBQXJCLEVBQUFVLEVBQUFlLEVBQUFFLEVBQUEsU0FBQUEsR0FBZ0gsT0FBQU4sRUFBQU0sSUFBcUJDLEtBQUEsS0FBQUQsSUFDckksT0FBQUYsR0FJQXpCLEVBQUE2QixFQUFBLFNBQUExQixHQUNBLElBQUFTLEVBQUFULEtBQUFxQixXQUNBLFdBQTJCLE9BQUFyQixFQUFBLFNBQzNCLFdBQWlDLE9BQUFBLEdBRWpDLE9BREFILEVBQUFVLEVBQUFFLEVBQUEsSUFBQUEsR0FDQUEsR0FJQVosRUFBQWEsRUFBQSxTQUFBaUIsRUFBQUMsR0FBc0QsT0FBQWpCLE9BQUFrQixVQUFBQyxlQUFBMUIsS0FBQXVCLEVBQUFDLElBR3REL0IsRUFBQWtDLEVBQUEsR0FJQWxDLElBQUFtQyxFQUFBLG1GQ2xGQSxNQUFBQyxFQUFBcEMsRUFBQSxHQUVBLElBQVVxQyxHQUFWLFNBQVVBLEdBQ1IsTUFBTUMsRUFBMkIsbUJBRTNCQyxHQUNKQyxTQUFVLElBQUlKLEVBQUFLLGVBQWUsTUFDN0JDLE1BQU8sSUFBSU4sRUFBQUssZUFBZSxVQUdaSixFQUFBTSxXQUFoQixXQUN3QixvQkFBWEMsUUFBMkJBLE9BQU9OLEdBTzNDTSxPQUFPTixHQUFpQnhCLE9BQUErQixVQUNuQkQsT0FBT04sR0FDUEMsR0FOTEssT0FBT04sR0FBaUJ4QixPQUFBK0IsVUFDbkJOLElBYlgsQ0FBVUYsV0F3QlZBLEVBQU9NLDRGQzFCUCxNQUFBRyxFQUFBOUMsRUFBQSxHQUVBRSxFQUFBdUMscUJBYUVNLFlBQW1CQyxHQUVqQixHQWRlQyxLQUFBQyxTQUFXLElBQUlDLElBQ2ZGLEtBQUFHLFlBQWMsSUFBSUMsTUFFM0JKLEtBQUFLLGNBQWUsRUFHTkwsS0FBQU0sU0FBVyxJQUFJSixJQUVmRixLQUFBTyxZQUNmQyxZQUFhQyxZQUFhQyxhQUFjQyxpQkFBa0JDLGtCQUFtQkMsYUFBY0Msc0JBY3RGZCxLQUFBZSxJQUFNLEVBQUNDLEVBQTJCQyxLQUN2QyxJQUFLRCxFQUFRLE1BQU0sSUFBSUUsTUFBTSxtQkFDN0IsSUFBSWxCLEtBQUtDLFNBQVNqQyxJQUFJZ0QsRUFBT0csSUFBN0IsQ0FFQSxJQUFJQyxFQU1KLEtBSkVBLEVBREVILEVBQ1FELEVBQU9LLFdBQVdyQixLQUFLRCxZQUFha0IsR0FFcENELEVBQU9LLFdBQVdyQixLQUFLRCxjQUVyQixNQUFNLElBQUltQixNQUFNLG9CQUU5QmxCLEtBQUtDLFNBQVNxQixJQUFJTixFQUFPRyxHQUFJQyxNQUd4QnBCLEtBQUF1QixPQUFTLENBQUNQLElBQ2ZoQixLQUFLQyxTQUFTdUIsT0FBT1IsRUFBT0csTUFHdkJuQixLQUFBeUIsWUFBYyxFQUFDVCxFQUEyQmxDLEVBQWtCVixLQUNqRSxNQUFNZ0QsRUFBVXBCLEtBQUtxQixXQUFXTCxHQUNoQ2hCLEtBQUswQix1QkFBdUJOLEVBQVN0QyxFQUFVVixLQUcxQzRCLEtBQUEyQixZQUFjLEVBQUNYLEVBQTJCbEMsS0FDL0MsTUFBTXNDLEVBQVVwQixLQUFLcUIsV0FBV0wsR0FDaEMsT0FBT2hCLEtBQUs0QixVQUFVUixFQUFRdEMsTUFHekJrQixLQUFBMUMsS0FBTyxFQUFDMEQsRUFBMkJhLEVBQWdCQyxLQUN4RCxNQUFNVixFQUFVcEIsS0FBS3FCLFdBQVdMLEdBQ2hDLE9BQU9oQixLQUFLK0IsZ0JBQWdCWCxFQUFTUyxFQUFRQyxLQUd4QzlCLEtBQUFnQyxVQUFZLEVBQUNoQixFQUEyQmlCLEtBQzdDLE1BQU1iLEVBQVVwQixLQUFLcUIsV0FBV0wsR0FDaEMsSUFBSyxJQUFJN0QsRUFBSSxFQUFHQSxFQUFJOEUsRUFBYUMsT0FBUS9FLElBQUssQ0FDNUMsSUFBSWdGLEVBQVNGLEVBQWE5RSxHQUFHaUYsTUFBTSxHQUMvQkgsRUFBYTlFLEdBQUcsR0FDbEI2QyxLQUFLK0IsZ0JBQWdCWCxFQUFTYSxFQUFhOUUsR0FBRyxHQUFJZ0YsR0FFbERuQyxLQUFLMEIsdUJBQ0hOLEVBQ0FhLEVBQWE5RSxHQUFHLEdBQ2hCaUQsTUFBTWlDLFFBQVFGLElBQVdBLEVBQU9ELE9BQVMsRUFBSUMsRUFBTyxHQUFLLFNBS3pEbkMsS0FBQStCLGdCQUFrQixFQUFDWCxFQUFjUyxFQUFnQkMsS0FDdkQsTUFBTVEsRUFBU3RDLEtBQUt1QyxXQUFXVixHQUFRVyxNQUFNcEIsT0FBaUJxQixHQUFSWCxFQUFvQkEsRUFBS1ksSUFBS3RFLEdBQVU0QixLQUFLMkMsWUFBWWQsRUFBUXpELFFBRXZILEdBQWMsaUJBQVZ5RCxFQUEyQixDQUM3QixNQUFNbkQsRUFBTW1CLEVBQUErQyxLQUVaLE9BREE1QyxLQUFLTSxTQUFTZ0IsSUFBSTVDLEVBQUs0RCxHQUNoQjVELEVBR1QsT0FBT3NCLEtBQUs0QixVQUFVVSxLQUdoQnRDLEtBQUEwQix1QkFBeUIsRUFBQ04sRUFBY3RDLEVBQWtCVixLQUVoRCxhQUFaVSxJQUNGVixFQUFRNEIsS0FBS00sU0FBU3RDLElBQUlJLElBQVVBLEdBR3RDZ0QsRUFBUXRDLEdBQVlrQixLQUFLMkMsWUFBWTdELEVBQVVWLEtBR3pDNEIsS0FBQXFCLFdBQWEsQ0FBQ0wsSUFDcEIsSUFBS0EsRUFBUSxNQUFNLElBQUlFLE1BQU0sbUJBRTdCLE1BQU1FLEVBQVVwQixLQUFLQyxTQUFTakMsSUFBSWdELEVBQU9HLElBQ3pDLElBQUtDLEVBQVMsTUFBTSxJQUFJRixNQUFNLG9CQUU5QixPQUFPRSxJQUdEcEIsS0FBQTJDLFlBQWMsRUFBQ2QsRUFBZ0JoRCxLQUNyQyxJQUFLbUIsS0FBS0ssbUJBQTBCb0MsR0FBVjVELEVBQXFCLE9BQU9BLEVBRXRELEdBQUlBLEVBQU9HLGVBQWUsY0FBZ0JILEVBQU9HLGVBQWUsTUFDOUQsT0FBUWdCLEtBQUtHLFlBQVl0QixFQUFXLElBQy9CLEdBQUl1QixNQUFNaUMsUUFBUXhELEtBQVlnRCxFQUFPZ0IsU0FBUyxLQUNuRCxPQUFPQyxVQUFVQyxNQUFPbEUsR0FDbkIsR0FBdUIsaUJBQWIsR0FBcUMsZUFBWGdELEdBQXNDLGtCQUFYQSxFQVNwRSxPQUFPaEQsRUFUMEYsQ0FDakcsSUFBSW1FLEVBQVNyRCxPQUFPc0QsS0FBS3BFLEdBQ3JCcUQsRUFBU2MsRUFBT2QsT0FDaEJnQixFQUFRLElBQUlDLFdBQVdqQixHQUMzQixJQUFLLElBQUkvRSxFQUFJLEVBQUdBLEVBQUkrRSxFQUFRL0UsSUFDeEIrRixFQUFNL0YsR0FBSzZGLEVBQU9JLFdBQVdqRyxHQUVqQyxPQUFPK0YsS0FLSGxELEtBQUE0QixVQUFZLENBQUMvQyxJQUNuQixHQUFJQSxhQUFrQndFLFlBQ2xCLE9BQVNDLE1BQU96RSxFQUFPeUUsT0FHM0IsSUFBS3RELEtBQUtLLG1CQUEwQm9DLEdBQVY1RCxFQUFxQixPQUFPQSxFQUV0RCxNQUFNMEUsRUFBT3ZELEtBQUtPLFdBQVdpRCxLQUFNRCxHQUFTMUUsYUFBa0IwRSxHQUM5RCxRQUFZZCxHQUFSYyxFQUFtQixDQUNyQixNQUFNcEMsRUFBS25CLEtBQUtHLFlBQVkrQixPQUc1QixPQUZBbEMsS0FBS0csWUFBWXNELEtBQUs1RSxJQUdwQjZFLFVBQVdILEVBQUs3RixLQUNoQnlELEdBQUlBLEdBR04sT0FBT3RDLElBN0hUbUIsS0FBS0QsWUFBY0EsRUFDQyxPQUFoQkEsRUFDRkMsS0FBS3VDLFdBQWFvQix5QkFBeUI1RSxjQUN4QyxJQUFvQixVQUFoQmdCLEdBQTJDLHVCQUFoQkEsRUFJbEMsTUFBTSxJQUFJbUIsK0JBQStCbkIsS0FIekNDLEtBQUt1QyxXQUFhcUIsc0JBQXNCN0UsVUFDeENpQixLQUFLSyxjQUFlLDBDQ2hCMUIsSUFBQXdELEVBQUEsb0JBQUFDLGVBQUFELGlCQUFBQyxPQUFBRCxnQkFBQWxGLEtBQUFtRixTQUFBLG9CQUFBQyxVQUFBLG1CQUFBQSxTQUFBRixpQkFBQUUsU0FBQUYsZ0JBQUFsRixLQUFBb0YsVUFDQUMsRUFBQSxJQUFBYixXQUFBLElBQ0EsU0FBQWMsSUFDQSxJQUFBSixFQUNBLFVBQUEzQyxNQUFBLDRHQUdBLE9BQUEyQyxFQUFBRyxHQ1pBLElBQUFFLEVBQUEsc0hDUUEsSUNGQSxJQUFBQyxFQUpBLFNBQUFDLEdBQ0EsdUJBQUFBLEdBQUFGLEVBQUFHLEtBQUFELElER0FFLEtBRUFDLEVBQUEsRUFBZUEsRUFBQSxNQUFTQSxFQUN4QkQsRUFBQWIsTUFBQWMsRUFBQSxLQUFBQyxTQUFBLElBQUFDLE9BQUEsSUFvQkEsSUV2QkFDLEVBRUFDLEVGcUJBQyxFQWpCQSxTQUFBQyxHQUNBLElBQUFDLEVBQUFDLFVBQUE3QyxPQUFBLFFBQUFPLElBQUFzQyxVQUFBLEdBQUFBLFVBQUEsS0FHQVgsR0FBQUUsRUFBQU8sRUFBQUMsRUFBQSxJQUFBUixFQUFBTyxFQUFBQyxFQUFBLElBQUFSLEVBQUFPLEVBQUFDLEVBQUEsSUFBQVIsRUFBQU8sRUFBQUMsRUFBQSxRQUFBUixFQUFBTyxFQUFBQyxFQUFBLElBQUFSLEVBQUFPLEVBQUFDLEVBQUEsUUFBQVIsRUFBQU8sRUFBQUMsRUFBQSxJQUFBUixFQUFBTyxFQUFBQyxFQUFBLFFBQUFSLEVBQUFPLEVBQUFDLEVBQUEsSUFBQVIsRUFBQU8sRUFBQUMsRUFBQSxRQUFBUixFQUFBTyxFQUFBQyxFQUFBLEtBQUFSLEVBQUFPLEVBQUFDLEVBQUEsS0FBQVIsRUFBQU8sRUFBQUMsRUFBQSxLQUFBUixFQUFBTyxFQUFBQyxFQUFBLEtBQUFSLEVBQUFPLEVBQUFDLEVBQUEsS0FBQVIsRUFBQU8sRUFBQUMsRUFBQSxNQUFBRSxjQU1BLElBQUFiLEVBQUFDLEdBQ0EsTUFBQWEsVUFBQSwrQkFHQSxPQUFBYixHRWZBYyxFQUFBLEVBQ0FDLEVBQUEsRUFrRkEsSUFBQUMsRUFoRkEsU0FBQUMsRUFBQUMsRUFBQVIsR0FDQSxJQUFBM0gsRUFBQW1JLEdBQUFSLEdBQUEsRUFDQVMsRUFBQUQsR0FBQSxJQUFBbEYsTUFBQSxJQUVBb0YsR0FEQUgsU0FDQUcsTUFBQWQsRUFDQWUsT0FBQWhELElBQUE0QyxFQUFBSSxTQUFBSixFQUFBSSxTQUFBZCxFQUlBLFNBQUFhLEdBQUEsTUFBQUMsRUFBQSxDQUNBLElBQUFDLEVBQUFMLEVBQUFNLFNBQUFOLEVBQUFwQixVQUVBLE1BQUF1QixJQUVBQSxFQUFBZCxHQUFBLEVBQUFnQixFQUFBLEdBQUFBLEVBQUEsR0FBQUEsRUFBQSxHQUFBQSxFQUFBLEdBQUFBLEVBQUEsR0FBQUEsRUFBQSxLQUdBLE1BQUFELElBRUFBLEVBQUFkLEVBQUEsT0FBQWUsRUFBQSxNQUFBQSxFQUFBLEtBUUEsSUFBQUUsT0FBQW5ELElBQUE0QyxFQUFBTyxNQUFBUCxFQUFBTyxNQUFBQyxLQUFBQyxNQUdBQyxPQUFBdEQsSUFBQTRDLEVBQUFVLE1BQUFWLEVBQUFVLE1BQUFaLEVBQUEsRUFFQWEsRUFBQUosRUFBQVYsR0FBQWEsRUFBQVosR0FBQSxJQWFBLEdBWEFhLEVBQUEsUUFBQXZELElBQUE0QyxFQUFBSSxXQUNBQSxJQUFBLFVBS0FPLEVBQUEsR0FBQUosRUFBQVYsU0FBQXpDLElBQUE0QyxFQUFBVSxRQUNBQSxFQUFBLEdBSUFBLEdBQUEsSUFDQSxVQUFBN0UsTUFBQSxtREFHQWdFLEVBQUFVLEVBQ0FULEVBQUFZLEVBQ0FwQixFQUFBYyxFQUlBLElBQUFRLEdBQUEsZ0JBRkFMLEdBQUEsY0FFQUcsR0FBQSxXQUNBUixFQUFBcEksS0FBQThJLElBQUEsT0FDQVYsRUFBQXBJLEtBQUE4SSxJQUFBLE9BQ0FWLEVBQUFwSSxLQUFBOEksSUFBQSxNQUNBVixFQUFBcEksS0FBQSxJQUFBOEksRUFFQSxJQUFBQyxFQUFBTixFQUFBLHlCQUNBTCxFQUFBcEksS0FBQStJLElBQUEsTUFDQVgsRUFBQXBJLEtBQUEsSUFBQStJLEVBRUFYLEVBQUFwSSxLQUFBK0ksSUFBQSxTQUVBWCxFQUFBcEksS0FBQStJLElBQUEsT0FFQVgsRUFBQXBJLEtBQUFzSSxJQUFBLE1BRUFGLEVBQUFwSSxLQUFBLElBQUFzSSxFQUVBLFFBQUE3RyxFQUFBLEVBQWlCQSxFQUFBLElBQU9BLEVBQ3hCMkcsRUFBQXBJLEVBQUF5QixHQUFBNEcsRUFBQTVHLEdBR0EsT0FBQTBHLEdBQUFWLEVBQUFXLElDekRBLElBQUFZLEVBaENBLFNBQUEvQixHQUNBLElBQUFELEVBQUFDLEdBQ0EsTUFBQWEsVUFBQSxnQkFHQSxJQUFBbUIsRUFDQXZCLEVBQUEsSUFBQTFCLFdBQUEsSUF1QkEsT0FyQkEwQixFQUFBLElBQUF1QixFQUFBQyxTQUFBakMsRUFBQWhDLE1BQUEsZUFDQXlDLEVBQUEsR0FBQXVCLElBQUEsT0FDQXZCLEVBQUEsR0FBQXVCLElBQUEsTUFDQXZCLEVBQUEsT0FBQXVCLEVBRUF2QixFQUFBLElBQUF1QixFQUFBQyxTQUFBakMsRUFBQWhDLE1BQUEsZUFDQXlDLEVBQUEsT0FBQXVCLEVBRUF2QixFQUFBLElBQUF1QixFQUFBQyxTQUFBakMsRUFBQWhDLE1BQUEsZ0JBQ0F5QyxFQUFBLE9BQUF1QixFQUVBdkIsRUFBQSxJQUFBdUIsRUFBQUMsU0FBQWpDLEVBQUFoQyxNQUFBLGdCQUNBeUMsRUFBQSxPQUFBdUIsRUFHQXZCLEVBQUEsS0FBQXVCLEVBQUFDLFNBQUFqQyxFQUFBaEMsTUFBQSw4QkFDQXlDLEVBQUEsSUFBQXVCLEVBQUEsZUFDQXZCLEVBQUEsSUFBQXVCLElBQUEsT0FDQXZCLEVBQUEsSUFBQXVCLElBQUEsT0FDQXZCLEVBQUEsSUFBQXVCLElBQUEsTUFDQXZCLEVBQUEsUUFBQXVCLEVBQ0F2QixHQ2hCQSxJQUVBeUIsRUFBQSxTQUFBNUksRUFBQTZJLEVBQUFDLEdBQ0EsU0FBQUMsRUFBQXJJLEVBQUFzSSxFQUFBcEIsRUFBQVIsR0FTQSxHQVJBLGlCQUFBMUcsSUFDQUEsRUFqQkEsU0FBQXVJLEdBQ0FBLEVBQUFDLFNBQUFDLG1CQUFBRixJQUlBLElBRkEsSUFBQXpELEtBRUEvRixFQUFBLEVBQWlCQSxFQUFBd0osRUFBQXpFLFNBQWdCL0UsRUFDakMrRixFQUFBTyxLQUFBa0QsRUFBQXZELFdBQUFqRyxJQUdBLE9BQUErRixFQVFBNEQsQ0FBQTFJLElBR0EsaUJBQUFzSSxJQUNBQSxFQUFBUCxFQUFBTyxJQUdBLEtBQUFBLEVBQUF4RSxPQUNBLE1BQUErQyxVQUFBLG9FQU1BLElBQUEvQixFQUFBLElBQUFDLFdBQUEsR0FBQS9FLEVBQUE4RCxRQU9BLEdBTkFnQixFQUFBNUIsSUFBQW9GLEdBQ0F4RCxFQUFBNUIsSUFBQWxELEVBQUFzSSxFQUFBeEUsU0FDQWdCLEVBQUFzRCxFQUFBdEQsSUFDQSxNQUFBQSxFQUFBLEdBQUFxRCxFQUNBckQsRUFBQSxNQUFBQSxFQUFBLE9BRUFvQyxFQUFBLENBQ0FSLEtBQUEsRUFFQSxRQUFBM0gsRUFBQSxFQUFxQkEsRUFBQSxLQUFRQSxFQUM3Qm1JLEVBQUFSLEVBQUEzSCxHQUFBK0YsRUFBQS9GLEdBR0EsT0FBQW1JLEVBR0EsT0FBQVYsRUFBQTFCLEdBSUEsSUFDQXVELEVBQUEvSSxPQUNHLE1BQUFxSixJQUtILE9BRkFOLEVBQUFPLElBN0NBLHVDQThDQVAsRUFBQVEsSUE3Q0EsdUNBOENBUixHQ05BLFNBQUFTLEVBQUFDLEdBQ0EsV0FBQUEsRUFBQSxhQXVIQSxTQUFBQyxFQUFBQyxFQUFBQyxHQUNBLElBQUFDLEdBQUEsTUFBQUYsSUFBQSxNQUFBQyxHQUVBLE9BREFELEdBQUEsS0FBQUMsR0FBQSxLQUFBQyxHQUFBLEtBQ0EsU0FBQUEsRUFlQSxTQUFBQyxFQUFBQyxFQUFBQyxFQUFBbkMsRUFBQThCLEVBQUFuSSxFQUFBYixHQUNBLE9BQUErSSxFQVRBLFNBQUFPLEVBQUFDLEdBQ0EsT0FBQUQsR0FBQUMsRUFBQUQsSUFBQSxHQUFBQyxFQVFBQyxDQUFBVCxJQUFBTSxFQUFBRCxHQUFBTCxFQUFBQyxFQUFBaEosSUFBQWEsR0FBQXFHLEdBR0EsU0FBQXVDLEVBQUFKLEVBQUFuQyxFQUFBL0gsRUFBQUMsRUFBQTRKLEVBQUFuSSxFQUFBYixHQUNBLE9BQUFtSixFQUFBakMsRUFBQS9ILEdBQUErSCxFQUFBOUgsRUFBQWlLLEVBQUFuQyxFQUFBOEIsRUFBQW5JLEVBQUFiLEdBR0EsU0FBQTBKLEVBQUFMLEVBQUFuQyxFQUFBL0gsRUFBQUMsRUFBQTRKLEVBQUFuSSxFQUFBYixHQUNBLE9BQUFtSixFQUFBakMsRUFBQTlILEVBQUFELEdBQUFDLEVBQUFpSyxFQUFBbkMsRUFBQThCLEVBQUFuSSxFQUFBYixHQUdBLFNBQUEySixFQUFBTixFQUFBbkMsRUFBQS9ILEVBQUFDLEVBQUE0SixFQUFBbkksRUFBQWIsR0FDQSxPQUFBbUosRUFBQWpDLEVBQUEvSCxFQUFBQyxFQUFBaUssRUFBQW5DLEVBQUE4QixFQUFBbkksRUFBQWIsR0FHQSxTQUFBNEosRUFBQVAsRUFBQW5DLEVBQUEvSCxFQUFBQyxFQUFBNEosRUFBQW5JLEVBQUFiLEdBQ0EsT0FBQW1KLEVBQUFoSyxHQUFBK0gsR0FBQTlILEdBQUFpSyxFQUFBbkMsRUFBQThCLEVBQUFuSSxFQUFBYixHQUdBLElDbk5BNkosRUFEQTVCLEVBQUEsUURrQkEsU0FBQXBELEdBQ0Esb0JBQUFBLEVBQUEsQ0FDQSxJQUFBaUYsRUFBQXZCLFNBQUFDLG1CQUFBM0QsSUFFQUEsRUFBQSxJQUFBQyxXQUFBZ0YsRUFBQWpHLFFBRUEsUUFBQS9FLEVBQUEsRUFBbUJBLEVBQUFnTCxFQUFBakcsU0FBZ0IvRSxFQUNuQytGLEVBQUEvRixHQUFBZ0wsRUFBQS9FLFdBQUFqRyxHQUlBLE9BT0EsU0FBQWlMLEdBS0EsSUFKQSxJQUFBQyxLQUNBQyxFQUFBLEdBQUFGLEVBQUFsRyxPQUdBL0UsRUFBQSxFQUFpQkEsRUFBQW1MLEVBQWNuTCxHQUFBLEdBQy9CLElBQUFrSyxFQUFBZSxFQUFBakwsR0FBQSxLQUFBQSxFQUFBLE9BQ0FvTCxFQUFBbEMsU0FKQSxtQkFJQW1DLE9BQUFuQixJQUFBLE1BSkEsbUJBSUFtQixPQUFBLEdBQUFuQixHQUFBLElBQ0FnQixFQUFBNUUsS0FBQThFLEdBR0EsT0FBQUYsRUFsQkFJLENBaUNBLFNBQUFwQixFQUFBcUIsR0FFQXJCLEVBQUFxQixHQUFBLFNBQUFBLEVBQUEsR0FDQXJCLEVBQUFILEVBQUF3QixHQUFBLEdBQUFBLEVBTUEsSUFMQSxJQUFBaEIsRUFBQSxXQUNBbkMsR0FBQSxVQUNBL0gsR0FBQSxXQUNBQyxFQUFBLFVBRUFOLEVBQUEsRUFBaUJBLEVBQUFrSyxFQUFBbkYsT0FBYy9FLEdBQUEsSUFDL0IsSUFBQXdMLEVBQUFqQixFQUNBa0IsRUFBQXJELEVBQ0FzRCxFQUFBckwsRUFDQXNMLEVBQUFyTCxFQUNBaUssRUFBQUksRUFBQUosRUFBQW5DLEVBQUEvSCxFQUFBQyxFQUFBNEosRUFBQWxLLEdBQUEsY0FDQU0sRUFBQXFLLEVBQUFySyxFQUFBaUssRUFBQW5DLEVBQUEvSCxFQUFBNkosRUFBQWxLLEVBQUEsa0JBQ0FLLEVBQUFzSyxFQUFBdEssRUFBQUMsRUFBQWlLLEVBQUFuQyxFQUFBOEIsRUFBQWxLLEVBQUEsaUJBQ0FvSSxFQUFBdUMsRUFBQXZDLEVBQUEvSCxFQUFBQyxFQUFBaUssRUFBQUwsRUFBQWxLLEVBQUEsbUJBQ0F1SyxFQUFBSSxFQUFBSixFQUFBbkMsRUFBQS9ILEVBQUFDLEVBQUE0SixFQUFBbEssRUFBQSxpQkFDQU0sRUFBQXFLLEVBQUFySyxFQUFBaUssRUFBQW5DLEVBQUEvSCxFQUFBNkosRUFBQWxLLEVBQUEsa0JBQ0FLLEVBQUFzSyxFQUFBdEssRUFBQUMsRUFBQWlLLEVBQUFuQyxFQUFBOEIsRUFBQWxLLEVBQUEsbUJBQ0FvSSxFQUFBdUMsRUFBQXZDLEVBQUEvSCxFQUFBQyxFQUFBaUssRUFBQUwsRUFBQWxLLEVBQUEsaUJBQ0F1SyxFQUFBSSxFQUFBSixFQUFBbkMsRUFBQS9ILEVBQUFDLEVBQUE0SixFQUFBbEssRUFBQSxpQkFDQU0sRUFBQXFLLEVBQUFySyxFQUFBaUssRUFBQW5DLEVBQUEvSCxFQUFBNkosRUFBQWxLLEVBQUEsbUJBQ0FLLEVBQUFzSyxFQUFBdEssRUFBQUMsRUFBQWlLLEVBQUFuQyxFQUFBOEIsRUFBQWxLLEVBQUEsZUFDQW9JLEVBQUF1QyxFQUFBdkMsRUFBQS9ILEVBQUFDLEVBQUFpSyxFQUFBTCxFQUFBbEssRUFBQSxvQkFDQXVLLEVBQUFJLEVBQUFKLEVBQUFuQyxFQUFBL0gsRUFBQUMsRUFBQTRKLEVBQUFsSyxFQUFBLGtCQUNBTSxFQUFBcUssRUFBQXJLLEVBQUFpSyxFQUFBbkMsRUFBQS9ILEVBQUE2SixFQUFBbEssRUFBQSxrQkFDQUssRUFBQXNLLEVBQUF0SyxFQUFBQyxFQUFBaUssRUFBQW5DLEVBQUE4QixFQUFBbEssRUFBQSxvQkFDQW9JLEVBQUF1QyxFQUFBdkMsRUFBQS9ILEVBQUFDLEVBQUFpSyxFQUFBTCxFQUFBbEssRUFBQSxtQkFDQXVLLEVBQUFLLEVBQUFMLEVBQUFuQyxFQUFBL0gsRUFBQUMsRUFBQTRKLEVBQUFsSyxFQUFBLGlCQUNBTSxFQUFBc0ssRUFBQXRLLEVBQUFpSyxFQUFBbkMsRUFBQS9ILEVBQUE2SixFQUFBbEssRUFBQSxrQkFDQUssRUFBQXVLLEVBQUF2SyxFQUFBQyxFQUFBaUssRUFBQW5DLEVBQUE4QixFQUFBbEssRUFBQSxrQkFDQW9JLEVBQUF3QyxFQUFBeEMsRUFBQS9ILEVBQUFDLEVBQUFpSyxFQUFBTCxFQUFBbEssR0FBQSxlQUNBdUssRUFBQUssRUFBQUwsRUFBQW5DLEVBQUEvSCxFQUFBQyxFQUFBNEosRUFBQWxLLEVBQUEsaUJBQ0FNLEVBQUFzSyxFQUFBdEssRUFBQWlLLEVBQUFuQyxFQUFBL0gsRUFBQTZKLEVBQUFsSyxFQUFBLGdCQUNBSyxFQUFBdUssRUFBQXZLLEVBQUFDLEVBQUFpSyxFQUFBbkMsRUFBQThCLEVBQUFsSyxFQUFBLG1CQUNBb0ksRUFBQXdDLEVBQUF4QyxFQUFBL0gsRUFBQUMsRUFBQWlLLEVBQUFMLEVBQUFsSyxFQUFBLGtCQUNBdUssRUFBQUssRUFBQUwsRUFBQW5DLEVBQUEvSCxFQUFBQyxFQUFBNEosRUFBQWxLLEVBQUEsZ0JBQ0FNLEVBQUFzSyxFQUFBdEssRUFBQWlLLEVBQUFuQyxFQUFBL0gsRUFBQTZKLEVBQUFsSyxFQUFBLG1CQUNBSyxFQUFBdUssRUFBQXZLLEVBQUFDLEVBQUFpSyxFQUFBbkMsRUFBQThCLEVBQUFsSyxFQUFBLGtCQUNBb0ksRUFBQXdDLEVBQUF4QyxFQUFBL0gsRUFBQUMsRUFBQWlLLEVBQUFMLEVBQUFsSyxFQUFBLGtCQUNBdUssRUFBQUssRUFBQUwsRUFBQW5DLEVBQUEvSCxFQUFBQyxFQUFBNEosRUFBQWxLLEVBQUEsbUJBQ0FNLEVBQUFzSyxFQUFBdEssRUFBQWlLLEVBQUFuQyxFQUFBL0gsRUFBQTZKLEVBQUFsSyxFQUFBLGdCQUNBSyxFQUFBdUssRUFBQXZLLEVBQUFDLEVBQUFpSyxFQUFBbkMsRUFBQThCLEVBQUFsSyxFQUFBLGtCQUNBb0ksRUFBQXdDLEVBQUF4QyxFQUFBL0gsRUFBQUMsRUFBQWlLLEVBQUFMLEVBQUFsSyxFQUFBLG9CQUNBdUssRUFBQU0sRUFBQU4sRUFBQW5DLEVBQUEvSCxFQUFBQyxFQUFBNEosRUFBQWxLLEVBQUEsY0FDQU0sRUFBQXVLLEVBQUF2SyxFQUFBaUssRUFBQW5DLEVBQUEvSCxFQUFBNkosRUFBQWxLLEVBQUEsbUJBQ0FLLEVBQUF3SyxFQUFBeEssRUFBQUMsRUFBQWlLLEVBQUFuQyxFQUFBOEIsRUFBQWxLLEVBQUEsbUJBQ0FvSSxFQUFBeUMsRUFBQXpDLEVBQUEvSCxFQUFBQyxFQUFBaUssRUFBQUwsRUFBQWxLLEVBQUEsa0JBQ0F1SyxFQUFBTSxFQUFBTixFQUFBbkMsRUFBQS9ILEVBQUFDLEVBQUE0SixFQUFBbEssRUFBQSxrQkFDQU0sRUFBQXVLLEVBQUF2SyxFQUFBaUssRUFBQW5DLEVBQUEvSCxFQUFBNkosRUFBQWxLLEVBQUEsa0JBQ0FLLEVBQUF3SyxFQUFBeEssRUFBQUMsRUFBQWlLLEVBQUFuQyxFQUFBOEIsRUFBQWxLLEVBQUEsa0JBQ0FvSSxFQUFBeUMsRUFBQXpDLEVBQUEvSCxFQUFBQyxFQUFBaUssRUFBQUwsRUFBQWxLLEVBQUEsb0JBQ0F1SyxFQUFBTSxFQUFBTixFQUFBbkMsRUFBQS9ILEVBQUFDLEVBQUE0SixFQUFBbEssRUFBQSxpQkFDQU0sRUFBQXVLLEVBQUF2SyxFQUFBaUssRUFBQW5DLEVBQUEvSCxFQUFBNkosRUFBQWxLLEdBQUEsZUFDQUssRUFBQXdLLEVBQUF4SyxFQUFBQyxFQUFBaUssRUFBQW5DLEVBQUE4QixFQUFBbEssRUFBQSxrQkFDQW9JLEVBQUF5QyxFQUFBekMsRUFBQS9ILEVBQUFDLEVBQUFpSyxFQUFBTCxFQUFBbEssRUFBQSxnQkFDQXVLLEVBQUFNLEVBQUFOLEVBQUFuQyxFQUFBL0gsRUFBQUMsRUFBQTRKLEVBQUFsSyxFQUFBLGlCQUNBTSxFQUFBdUssRUFBQXZLLEVBQUFpSyxFQUFBbkMsRUFBQS9ILEVBQUE2SixFQUFBbEssRUFBQSxtQkFDQUssRUFBQXdLLEVBQUF4SyxFQUFBQyxFQUFBaUssRUFBQW5DLEVBQUE4QixFQUFBbEssRUFBQSxrQkFDQW9JLEVBQUF5QyxFQUFBekMsRUFBQS9ILEVBQUFDLEVBQUFpSyxFQUFBTCxFQUFBbEssRUFBQSxrQkFDQXVLLEVBQUFPLEVBQUFQLEVBQUFuQyxFQUFBL0gsRUFBQUMsRUFBQTRKLEVBQUFsSyxHQUFBLGNBQ0FNLEVBQUF3SyxFQUFBeEssRUFBQWlLLEVBQUFuQyxFQUFBL0gsRUFBQTZKLEVBQUFsSyxFQUFBLGtCQUNBSyxFQUFBeUssRUFBQXpLLEVBQUFDLEVBQUFpSyxFQUFBbkMsRUFBQThCLEVBQUFsSyxFQUFBLG9CQUNBb0ksRUFBQTBDLEVBQUExQyxFQUFBL0gsRUFBQUMsRUFBQWlLLEVBQUFMLEVBQUFsSyxFQUFBLGlCQUNBdUssRUFBQU8sRUFBQVAsRUFBQW5DLEVBQUEvSCxFQUFBQyxFQUFBNEosRUFBQWxLLEVBQUEsa0JBQ0FNLEVBQUF3SyxFQUFBeEssRUFBQWlLLEVBQUFuQyxFQUFBL0gsRUFBQTZKLEVBQUFsSyxFQUFBLG1CQUNBSyxFQUFBeUssRUFBQXpLLEVBQUFDLEVBQUFpSyxFQUFBbkMsRUFBQThCLEVBQUFsSyxFQUFBLGlCQUNBb0ksRUFBQTBDLEVBQUExQyxFQUFBL0gsRUFBQUMsRUFBQWlLLEVBQUFMLEVBQUFsSyxFQUFBLG1CQUNBdUssRUFBQU8sRUFBQVAsRUFBQW5DLEVBQUEvSCxFQUFBQyxFQUFBNEosRUFBQWxLLEVBQUEsaUJBQ0FNLEVBQUF3SyxFQUFBeEssRUFBQWlLLEVBQUFuQyxFQUFBL0gsRUFBQTZKLEVBQUFsSyxFQUFBLGtCQUNBSyxFQUFBeUssRUFBQXpLLEVBQUFDLEVBQUFpSyxFQUFBbkMsRUFBQThCLEVBQUFsSyxFQUFBLG1CQUNBb0ksRUFBQTBDLEVBQUExQyxFQUFBL0gsRUFBQUMsRUFBQWlLLEVBQUFMLEVBQUFsSyxFQUFBLG1CQUNBdUssRUFBQU8sRUFBQVAsRUFBQW5DLEVBQUEvSCxFQUFBQyxFQUFBNEosRUFBQWxLLEVBQUEsaUJBQ0FNLEVBQUF3SyxFQUFBeEssRUFBQWlLLEVBQUFuQyxFQUFBL0gsRUFBQTZKLEVBQUFsSyxFQUFBLG9CQUNBSyxFQUFBeUssRUFBQXpLLEVBQUFDLEVBQUFpSyxFQUFBbkMsRUFBQThCLEVBQUFsSyxFQUFBLGlCQUNBb0ksRUFBQTBDLEVBQUExQyxFQUFBL0gsRUFBQUMsRUFBQWlLLEVBQUFMLEVBQUFsSyxFQUFBLGtCQUNBdUssRUFBQU4sRUFBQU0sRUFBQWlCLEdBQ0FwRCxFQUFBNkIsRUFBQTdCLEVBQUFxRCxHQUNBcEwsRUFBQTRKLEVBQUE1SixFQUFBcUwsR0FDQXBMLEVBQUEySixFQUFBM0osRUFBQXFMLEdBR0EsT0FBQXBCLEVBQUFuQyxFQUFBL0gsRUFBQUMsR0FySEFzTCxDQTZIQSxTQUFBWCxHQUNBLE9BQUFBLEVBQUFsRyxPQUNBLFNBTUEsSUFIQSxJQUFBOEcsRUFBQSxFQUFBWixFQUFBbEcsT0FDQW1HLEVBQUEsSUFBQVksWUFBQS9CLEVBQUE4QixJQUVBN0wsRUFBQSxFQUFpQkEsRUFBQTZMLEVBQWE3TCxHQUFBLEVBQzlCa0wsRUFBQWxMLEdBQUEsU0FBQWlMLEVBQUFqTCxFQUFBLEtBQUFBLEVBQUEsR0FHQSxPQUFBa0wsRUF6SUFhLENBQUFoRyxHQUFBLEVBQUFBLEVBQUFoQixXRVJBLElBQUFpSCxFQXBCQSxTQUFBOUQsRUFBQUMsRUFBQVIsR0FFQSxJQUFBc0UsR0FEQS9ELFNBQ0FNLFNBQUFOLEVBQUFwQixVQUtBLEdBSEFtRixFQUFBLE1BQUFBLEVBQUEsTUFDQUEsRUFBQSxNQUFBQSxFQUFBLE9BRUE5RCxFQUFBLENBQ0FSLEtBQUEsRUFFQSxRQUFBM0gsRUFBQSxFQUFtQkEsRUFBQSxLQUFRQSxFQUMzQm1JLEVBQUFSLEVBQUEzSCxHQUFBaU0sRUFBQWpNLEdBR0EsT0FBQW1JLEVBR0EsT0FBQVYsRUFBQXdFLElDbEJBLFNBQUFDLEVBQUFuSyxFQUFBbUksRUFBQUMsRUFBQWdDLEdBQ0EsT0FBQXBLLEdBQ0EsT0FDQSxPQUFBbUksRUFBQUMsR0FBQUQsRUFBQWlDLEVBRUEsT0FDQSxPQUFBakMsRUFBQUMsRUFBQWdDLEVBRUEsT0FDQSxPQUFBakMsRUFBQUMsRUFBQUQsRUFBQWlDLEVBQUFoQyxFQUFBZ0MsRUFFQSxPQUNBLE9BQUFqQyxFQUFBQyxFQUFBZ0MsR0FJQSxTQUFBQyxFQUFBbEMsRUFBQXpJLEdBQ0EsT0FBQXlJLEdBQUF6SSxFQUFBeUksSUFBQSxHQUFBekksRUE0RUEsSUM1RkE0SyxFQURBbEQsRUFBQSxRRG9CQSxTQUFBcEQsR0FDQSxJQUFBdUcsR0FBQSw2Q0FDQUMsR0FBQSx1REFFQSxvQkFBQXhHLEVBQUEsQ0FDQSxJQUFBaUYsRUFBQXZCLFNBQUFDLG1CQUFBM0QsSUFFQUEsS0FFQSxRQUFBL0YsRUFBQSxFQUFtQkEsRUFBQWdMLEVBQUFqRyxTQUFnQi9FLEVBQ25DK0YsRUFBQU8sS0FBQTBFLEVBQUEvRSxXQUFBakcsU0FFR2lELE1BQUFpQyxRQUFBYSxLQUVIQSxFQUFBOUMsTUFBQXJCLFVBQUFxRCxNQUFBOUUsS0FBQTRGLElBR0FBLEVBQUFPLEtBQUEsS0FLQSxJQUpBLElBQUFyRyxFQUFBOEYsRUFBQWhCLE9BQUEsSUFDQXlILEVBQUFDLEtBQUFDLEtBQUF6TSxFQUFBLElBQ0EwTSxFQUFBLElBQUExSixNQUFBdUosR0FFQUksRUFBQSxFQUFrQkEsRUFBQUosSUFBUUksRUFBQSxDQUcxQixJQUZBLElBQUFsRixFQUFBLElBQUFvRSxZQUFBLElBRUFlLEVBQUEsRUFBbUJBLEVBQUEsS0FBUUEsRUFDM0JuRixFQUFBbUYsR0FBQTlHLEVBQUEsR0FBQTZHLEVBQUEsRUFBQUMsSUFBQSxHQUFBOUcsRUFBQSxHQUFBNkcsRUFBQSxFQUFBQyxFQUFBLE9BQUE5RyxFQUFBLEdBQUE2RyxFQUFBLEVBQUFDLEVBQUEsTUFBQTlHLEVBQUEsR0FBQTZHLEVBQUEsRUFBQUMsRUFBQSxHQUdBRixFQUFBQyxHQUFBbEYsRUFHQWlGLEVBQUFILEVBQUEsVUFBQXpHLEVBQUFoQixPQUFBLEdBQUEwSCxLQUFBSyxJQUFBLE1BQ0FILEVBQUFILEVBQUEsT0FBQUMsS0FBQU0sTUFBQUosRUFBQUgsRUFBQSxRQUNBRyxFQUFBSCxFQUFBLFVBQUF6RyxFQUFBaEIsT0FBQSxjQUVBLFFBQUFpSSxFQUFBLEVBQW1CQSxFQUFBUixJQUFTUSxFQUFBLENBRzVCLElBRkEsSUFBQUMsRUFBQSxJQUFBbkIsWUFBQSxJQUVBNUssRUFBQSxFQUFtQkEsRUFBQSxLQUFRQSxFQUMzQitMLEVBQUEvTCxHQUFBeUwsRUFBQUssR0FBQTlMLEdBR0EsUUFBQWdNLEVBQUEsR0FBcUJBLEVBQUEsS0FBU0EsRUFDOUJELEVBQUFDLEdBQUFkLEVBQUFhLEVBQUFDLEVBQUEsR0FBQUQsRUFBQUMsRUFBQSxHQUFBRCxFQUFBQyxFQUFBLElBQUFELEVBQUFDLEVBQUEsT0FTQSxJQU5BLElBQUEzQyxFQUFBZ0MsRUFBQSxHQUNBbkUsRUFBQW1FLEVBQUEsR0FDQWxNLEVBQUFrTSxFQUFBLEdBQ0FqTSxFQUFBaU0sRUFBQSxHQUNBWSxFQUFBWixFQUFBLEdBRUFhLEVBQUEsRUFBcUJBLEVBQUEsS0FBVUEsRUFBQSxDQUMvQixJQUFBckwsRUFBQTBLLEtBQUFNLE1BQUFLLEVBQUEsSUFDQUMsRUFBQWpCLEVBQUE3QixFQUFBLEdBQUEyQixFQUFBbkssRUFBQXFHLEVBQUEvSCxFQUFBQyxHQUFBNk0sRUFBQWIsRUFBQXZLLEdBQUFrTCxFQUFBRyxLQUFBLEVBQ0FELEVBQUE3TSxFQUNBQSxFQUFBRCxFQUNBQSxFQUFBK0wsRUFBQWhFLEVBQUEsUUFDQUEsRUFBQW1DLEVBQ0FBLEVBQUE4QyxFQUdBZCxFQUFBLEdBQUFBLEVBQUEsR0FBQWhDLElBQUEsRUFDQWdDLEVBQUEsR0FBQUEsRUFBQSxHQUFBbkUsSUFBQSxFQUNBbUUsRUFBQSxHQUFBQSxFQUFBLEdBQUFsTSxJQUFBLEVBQ0FrTSxFQUFBLEdBQUFBLEVBQUEsR0FBQWpNLElBQUEsRUFDQWlNLEVBQUEsR0FBQUEsRUFBQSxHQUFBWSxJQUFBLEVBR0EsT0FBQVosRUFBQSxXQUFBQSxFQUFBLFdBQUFBLEVBQUEsY0FBQUEsRUFBQSxHQUFBQSxFQUFBLFdBQUFBLEVBQUEsV0FBQUEsRUFBQSxjQUFBQSxFQUFBLEdBQUFBLEVBQUEsV0FBQUEsRUFBQSxXQUFBQSxFQUFBLGNBQUFBLEVBQUEsR0FBQUEsRUFBQSxXQUFBQSxFQUFBLFdBQUFBLEVBQUEsY0FBQUEsRUFBQSxHQUFBQSxFQUFBLFdBQUFBLEVBQUEsV0FBQUEsRUFBQSxjQUFBQSxFQUFBLE1FbEZBLElBQUFlLEVBUkEsU0FBQXJHLEdBQ0EsSUFBQUQsRUFBQUMsR0FDQSxNQUFBYSxVQUFBLGdCQUdBLE9BQUFvQixTQUFBakMsRUFBQUssT0FBQSw0S0NQQSIsImZpbGUiOiJibGF6b3IuZXh0ZW5zaW9ucy5jYW52YXMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMCk7XG4iLCJpbXBvcnQgeyBDb250ZXh0TWFuYWdlciB9IGZyb20gJy4vQ2FudmFzQ29udGV4dE1hbmFnZXInO1xuXG5uYW1lc3BhY2UgQ2FudmFzIHtcbiAgY29uc3QgYmxhem9yRXh0ZW5zaW9uczogc3RyaW5nID0gJ0JsYXpvckV4dGVuc2lvbnMnO1xuICAvLyBkZWZpbmUgd2hhdCB0aGlzIGV4dGVuc2lvbiBhZGRzIHRvIHRoZSB3aW5kb3cgb2JqZWN0IGluc2lkZSBCbGF6b3JFeHRlbnNpb25zXG4gIGNvbnN0IGV4dGVuc2lvbk9iamVjdCA9IHtcbiAgICBDYW52YXMyZDogbmV3IENvbnRleHRNYW5hZ2VyKFwiMmRcIiksXG4gICAgV2ViR0w6IG5ldyBDb250ZXh0TWFuYWdlcihcIndlYmdsXCIpXG4gIH07XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGluaXRpYWxpemUoKTogdm9pZCB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmICF3aW5kb3dbYmxhem9yRXh0ZW5zaW9uc10pIHtcbiAgICAgIC8vIHdoZW4gdGhlIGxpYnJhcnkgaXMgbG9hZGVkIGluIGEgYnJvd3NlciB2aWEgYSA8c2NyaXB0PiBlbGVtZW50LCBtYWtlIHRoZVxuICAgICAgLy8gZm9sbG93aW5nIEFQSXMgYXZhaWxhYmxlIGluIGdsb2JhbCBzY29wZSBmb3IgaW52b2NhdGlvbiBmcm9tIEpTXG4gICAgICB3aW5kb3dbYmxhem9yRXh0ZW5zaW9uc10gPSB7XG4gICAgICAgIC4uLmV4dGVuc2lvbk9iamVjdFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgd2luZG93W2JsYXpvckV4dGVuc2lvbnNdID0ge1xuICAgICAgICAuLi53aW5kb3dbYmxhem9yRXh0ZW5zaW9uc10sXG4gICAgICAgIC4uLmV4dGVuc2lvbk9iamVjdFxuICAgICAgfTtcbiAgICB9XG4gIH1cbn1cblxuQ2FudmFzLmluaXRpYWxpemUoKTtcbiIsImltcG9ydCB7IHY0IGFzIHV1aWR2NCB9IGZyb20gJ3V1aWQnO1xuXG5leHBvcnQgY2xhc3MgQ29udGV4dE1hbmFnZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbnRleHRzID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSB3ZWJHTE9iamVjdCA9IG5ldyBBcnJheTxhbnk+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29udGV4dE5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSB3ZWJHTENvbnRleHQgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZWFkb25seSBwcm90b3R5cGVzOiBhbnk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBwYXR0ZXJucyA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSB3ZWJHTFR5cGVzID0gW1xuICAgIFdlYkdMQnVmZmVyLCBXZWJHTFNoYWRlciwgV2ViR0xQcm9ncmFtLCBXZWJHTEZyYW1lYnVmZmVyLCBXZWJHTFJlbmRlcmJ1ZmZlciwgV2ViR0xUZXh0dXJlLCBXZWJHTFVuaWZvcm1Mb2NhdGlvblxuICBdO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihjb250ZXh0TmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5jb250ZXh0TmFtZSA9IGNvbnRleHROYW1lO1xuICAgIGlmIChjb250ZXh0TmFtZSA9PT0gXCIyZFwiKVxuICAgICAgdGhpcy5wcm90b3R5cGVzID0gQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELnByb3RvdHlwZTtcbiAgICBlbHNlIGlmIChjb250ZXh0TmFtZSA9PT0gXCJ3ZWJnbFwiIHx8IGNvbnRleHROYW1lID09PSBcImV4cGVyaW1lbnRhbC13ZWJnbFwiKSB7XG4gICAgICB0aGlzLnByb3RvdHlwZXMgPSBXZWJHTFJlbmRlcmluZ0NvbnRleHQucHJvdG90eXBlO1xuICAgICAgdGhpcy53ZWJHTENvbnRleHQgPSB0cnVlO1xuICAgIH0gZWxzZVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNvbnRleHQgbmFtZTogJHtjb250ZXh0TmFtZX1gKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGQgPSAoY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCwgcGFyYW1ldGVyczogYW55KSA9PiB7XG4gICAgaWYgKCFjYW52YXMpIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjYW52YXMuJyk7XG4gICAgaWYgKHRoaXMuY29udGV4dHMuZ2V0KGNhbnZhcy5pZCkpIHJldHVybjtcblxuICAgIHZhciBjb250ZXh0O1xuICAgIGlmIChwYXJhbWV0ZXJzKVxuICAgICAgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KHRoaXMuY29udGV4dE5hbWUsIHBhcmFtZXRlcnMpO1xuICAgIGVsc2VcbiAgICAgIGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCh0aGlzLmNvbnRleHROYW1lKTtcblxuICAgIGlmICghY29udGV4dCkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvbnRleHQuJyk7XG5cbiAgICB0aGlzLmNvbnRleHRzLnNldChjYW52YXMuaWQsIGNvbnRleHQpO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZSA9IChjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50KSA9PiB7XG4gICAgdGhpcy5jb250ZXh0cy5kZWxldGUoY2FudmFzLmlkKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRQcm9wZXJ0eSA9IChjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50LCBwcm9wZXJ0eTogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMuZ2V0Q29udGV4dChjYW52YXMpO1xuICAgIHRoaXMuc2V0UHJvcGVydHlXaXRoQ29udGV4dChjb250ZXh0LCBwcm9wZXJ0eSwgdmFsdWUpO1xuICB9XG5cbiAgcHVibGljIGdldFByb3BlcnR5ID0gKGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQsIHByb3BlcnR5OiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5nZXRDb250ZXh0KGNhbnZhcyk7XG4gICAgcmV0dXJuIHRoaXMuc2VyaWFsaXplKGNvbnRleHRbcHJvcGVydHldKTtcbiAgfVxuXG4gIHB1YmxpYyBjYWxsID0gKGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQsIG1ldGhvZDogc3RyaW5nLCBhcmdzOiBhbnkpID0+IHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5nZXRDb250ZXh0KGNhbnZhcyk7XG4gICAgcmV0dXJuIHRoaXMuY2FsbFdpdGhDb250ZXh0KGNvbnRleHQsIG1ldGhvZCwgYXJncyk7XG4gIH1cblxuICBwdWJsaWMgY2FsbEJhdGNoID0gKGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQsIGJhdGNoZWRDYWxsczogYW55W11bXSkgPT4ge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmdldENvbnRleHQoY2FudmFzKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJhdGNoZWRDYWxscy5sZW5ndGg7IGkrKykge1xuICAgICAgbGV0IHBhcmFtcyA9IGJhdGNoZWRDYWxsc1tpXS5zbGljZSgyKTtcbiAgICAgIGlmIChiYXRjaGVkQ2FsbHNbaV1bMV0pIHtcbiAgICAgICAgdGhpcy5jYWxsV2l0aENvbnRleHQoY29udGV4dCwgYmF0Y2hlZENhbGxzW2ldWzBdLCBwYXJhbXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZXRQcm9wZXJ0eVdpdGhDb250ZXh0KFxuICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgYmF0Y2hlZENhbGxzW2ldWzBdLFxuICAgICAgICAgIEFycmF5LmlzQXJyYXkocGFyYW1zKSAmJiBwYXJhbXMubGVuZ3RoID4gMCA/IHBhcmFtc1swXSA6IG51bGwpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2FsbFdpdGhDb250ZXh0ID0gKGNvbnRleHQ6IGFueSwgbWV0aG9kOiBzdHJpbmcsIGFyZ3M6IGFueSkgPT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMucHJvdG90eXBlc1ttZXRob2RdLmFwcGx5KGNvbnRleHQsIGFyZ3MgIT0gdW5kZWZpbmVkID8gYXJncy5tYXAoKHZhbHVlKSA9PiB0aGlzLmRlc2VyaWFsaXplKG1ldGhvZCwgdmFsdWUpKSA6IFtdKTtcblxuICAgIGlmIChtZXRob2QgPT0gJ2NyZWF0ZVBhdHRlcm4nKSB7XG4gICAgICBjb25zdCBrZXkgPSB1dWlkdjQoKTsgXG4gICAgICB0aGlzLnBhdHRlcm5zLnNldChrZXksIHJlc3VsdCk7XG4gICAgICByZXR1cm4ga2V5O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNlcmlhbGl6ZShyZXN1bHQpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRQcm9wZXJ0eVdpdGhDb250ZXh0ID0gKGNvbnRleHQ6IGFueSwgcHJvcGVydHk6IHN0cmluZywgdmFsdWU6IGFueSkgPT4ge1xuXG4gICAgaWYgKHByb3BlcnR5ID09ICdmaWxsU3R5bGUnKSB7XG4gICAgICB2YWx1ZSA9IHRoaXMucGF0dGVybnMuZ2V0KHZhbHVlKSB8fCB2YWx1ZTtcbiAgICB9XG5cbiAgICBjb250ZXh0W3Byb3BlcnR5XSA9IHRoaXMuZGVzZXJpYWxpemUocHJvcGVydHksIHZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29udGV4dCA9IChjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50KSA9PiB7XG4gICAgaWYgKCFjYW52YXMpIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjYW52YXMuJyk7XG5cbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jb250ZXh0cy5nZXQoY2FudmFzLmlkKTtcbiAgICBpZiAoIWNvbnRleHQpIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb250ZXh0LicpO1xuXG4gICAgcmV0dXJuIGNvbnRleHQ7XG4gIH1cblxuICBwcml2YXRlIGRlc2VyaWFsaXplID0gKG1ldGhvZDogc3RyaW5nLCBvYmplY3Q6IGFueSkgPT4ge1xuICAgIGlmICghdGhpcy53ZWJHTENvbnRleHQgfHwgb2JqZWN0ID09IHVuZGVmaW5lZCkgcmV0dXJuIG9iamVjdDsgLy9kZXNlcmlhbGl6YXRpb24gb25seSBuZWVkcyB0byBoYXBwZW4gZm9yIHdlYkdMXG5cbiAgICBpZiAob2JqZWN0Lmhhc093blByb3BlcnR5KFwid2ViR0xUeXBlXCIpICYmIG9iamVjdC5oYXNPd25Qcm9wZXJ0eShcImlkXCIpKSB7XG4gICAgICByZXR1cm4gKHRoaXMud2ViR0xPYmplY3Rbb2JqZWN0W1wiaWRcIl1dKTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkob2JqZWN0KSAmJiAhbWV0aG9kLmVuZHNXaXRoKFwidlwiKSkge1xuICAgICAgcmV0dXJuIEludDhBcnJheS5vZiguLi4ob2JqZWN0IGFzIG51bWJlcltdKSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2Yob2JqZWN0KSA9PT0gXCJzdHJpbmdcIiAmJiAobWV0aG9kID09PSBcImJ1ZmZlckRhdGFcIiB8fCBtZXRob2QgPT09IFwiYnVmZmVyU3ViRGF0YVwiKSkge1xuICAgICAgbGV0IGJpblN0ciA9IHdpbmRvdy5hdG9iKG9iamVjdCk7XG4gICAgICBsZXQgbGVuZ3RoID0gYmluU3RyLmxlbmd0aDtcbiAgICAgIGxldCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgYnl0ZXNbaV0gPSBiaW5TdHIuY2hhckNvZGVBdChpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBieXRlcztcbiAgICB9IGVsc2VcbiAgICAgIHJldHVybiBvYmplY3Q7XG4gIH1cblxuICBwcml2YXRlIHNlcmlhbGl6ZSA9IChvYmplY3Q6IGFueSkgPT4ge1xuICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBUZXh0TWV0cmljcykge1xuICAgICAgICByZXR1cm4geyB3aWR0aDogb2JqZWN0LndpZHRoIH07XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLndlYkdMQ29udGV4dCB8fCBvYmplY3QgPT0gdW5kZWZpbmVkKSByZXR1cm4gb2JqZWN0OyAvL3NlcmlhbGl6YXRpb24gb25seSBuZWVkcyB0byBoYXBwZW4gZm9yIHdlYkdMXG5cbiAgICBjb25zdCB0eXBlID0gdGhpcy53ZWJHTFR5cGVzLmZpbmQoKHR5cGUpID0+IG9iamVjdCBpbnN0YW5jZW9mIHR5cGUpO1xuICAgIGlmICh0eXBlICE9IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgaWQgPSB0aGlzLndlYkdMT2JqZWN0Lmxlbmd0aDtcbiAgICAgIHRoaXMud2ViR0xPYmplY3QucHVzaChvYmplY3QpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB3ZWJHTFR5cGU6IHR5cGUubmFtZSxcbiAgICAgICAgaWQ6IGlkXG4gICAgICAgIH07XG4gICAgfSBlbHNlXG4gICAgICByZXR1cm4gb2JqZWN0O1xuICB9XG59XG4iLCIvLyBVbmlxdWUgSUQgY3JlYXRpb24gcmVxdWlyZXMgYSBoaWdoIHF1YWxpdHkgcmFuZG9tICMgZ2VuZXJhdG9yLiBJbiB0aGUgYnJvd3NlciB3ZSB0aGVyZWZvcmVcbi8vIHJlcXVpcmUgdGhlIGNyeXB0byBBUEkgYW5kIGRvIG5vdCBzdXBwb3J0IGJ1aWx0LWluIGZhbGxiYWNrIHRvIGxvd2VyIHF1YWxpdHkgcmFuZG9tIG51bWJlclxuLy8gZ2VuZXJhdG9ycyAobGlrZSBNYXRoLnJhbmRvbSgpKS5cbi8vIGdldFJhbmRvbVZhbHVlcyBuZWVkcyB0byBiZSBpbnZva2VkIGluIGEgY29udGV4dCB3aGVyZSBcInRoaXNcIiBpcyBhIENyeXB0byBpbXBsZW1lbnRhdGlvbi4gQWxzbyxcbi8vIGZpbmQgdGhlIGNvbXBsZXRlIGltcGxlbWVudGF0aW9uIG9mIGNyeXB0byAobXNDcnlwdG8pIG9uIElFMTEuXG52YXIgZ2V0UmFuZG9tVmFsdWVzID0gdHlwZW9mIGNyeXB0byAhPT0gJ3VuZGVmaW5lZCcgJiYgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyAmJiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzLmJpbmQoY3J5cHRvKSB8fCB0eXBlb2YgbXNDcnlwdG8gIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBtc0NyeXB0by5nZXRSYW5kb21WYWx1ZXMgPT09ICdmdW5jdGlvbicgJiYgbXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzLmJpbmQobXNDcnlwdG8pO1xudmFyIHJuZHM4ID0gbmV3IFVpbnQ4QXJyYXkoMTYpO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcm5nKCkge1xuICBpZiAoIWdldFJhbmRvbVZhbHVlcykge1xuICAgIHRocm93IG5ldyBFcnJvcignY3J5cHRvLmdldFJhbmRvbVZhbHVlcygpIG5vdCBzdXBwb3J0ZWQuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdXVpZGpzL3V1aWQjZ2V0cmFuZG9tdmFsdWVzLW5vdC1zdXBwb3J0ZWQnKTtcbiAgfVxuXG4gIHJldHVybiBnZXRSYW5kb21WYWx1ZXMocm5kczgpO1xufSIsImV4cG9ydCBkZWZhdWx0IC9eKD86WzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzEtNV1bMC05YS1mXXszfS1bODlhYl1bMC05YS1mXXszfS1bMC05YS1mXXsxMn18MDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwKSQvaTsiLCJpbXBvcnQgdmFsaWRhdGUgZnJvbSAnLi92YWxpZGF0ZS5qcyc7XG4vKipcbiAqIENvbnZlcnQgYXJyYXkgb2YgMTYgYnl0ZSB2YWx1ZXMgdG8gVVVJRCBzdHJpbmcgZm9ybWF0IG9mIHRoZSBmb3JtOlxuICogWFhYWFhYWFgtWFhYWC1YWFhYLVhYWFgtWFhYWFhYWFhYWFhYXG4gKi9cblxudmFyIGJ5dGVUb0hleCA9IFtdO1xuXG5mb3IgKHZhciBpID0gMDsgaSA8IDI1NjsgKytpKSB7XG4gIGJ5dGVUb0hleC5wdXNoKChpICsgMHgxMDApLnRvU3RyaW5nKDE2KS5zdWJzdHIoMSkpO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnkoYXJyKSB7XG4gIHZhciBvZmZzZXQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IDA7XG4gIC8vIE5vdGU6IEJlIGNhcmVmdWwgZWRpdGluZyB0aGlzIGNvZGUhICBJdCdzIGJlZW4gdHVuZWQgZm9yIHBlcmZvcm1hbmNlXG4gIC8vIGFuZCB3b3JrcyBpbiB3YXlzIHlvdSBtYXkgbm90IGV4cGVjdC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS91dWlkanMvdXVpZC9wdWxsLzQzNFxuICB2YXIgdXVpZCA9IChieXRlVG9IZXhbYXJyW29mZnNldCArIDBdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMV1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAyXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDNdXSArICctJyArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgNF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA1XV0gKyAnLScgKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDZdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgN11dICsgJy0nICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA4XV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDldXSArICctJyArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTBdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTFdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTJdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTNdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTRdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTVdXSkudG9Mb3dlckNhc2UoKTsgLy8gQ29uc2lzdGVuY3kgY2hlY2sgZm9yIHZhbGlkIFVVSUQuICBJZiB0aGlzIHRocm93cywgaXQncyBsaWtlbHkgZHVlIHRvIG9uZVxuICAvLyBvZiB0aGUgZm9sbG93aW5nOlxuICAvLyAtIE9uZSBvciBtb3JlIGlucHV0IGFycmF5IHZhbHVlcyBkb24ndCBtYXAgdG8gYSBoZXggb2N0ZXQgKGxlYWRpbmcgdG9cbiAgLy8gXCJ1bmRlZmluZWRcIiBpbiB0aGUgdXVpZClcbiAgLy8gLSBJbnZhbGlkIGlucHV0IHZhbHVlcyBmb3IgdGhlIFJGQyBgdmVyc2lvbmAgb3IgYHZhcmlhbnRgIGZpZWxkc1xuXG4gIGlmICghdmFsaWRhdGUodXVpZCkpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ1N0cmluZ2lmaWVkIFVVSUQgaXMgaW52YWxpZCcpO1xuICB9XG5cbiAgcmV0dXJuIHV1aWQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHN0cmluZ2lmeTsiLCJpbXBvcnQgUkVHRVggZnJvbSAnLi9yZWdleC5qcyc7XG5cbmZ1bmN0aW9uIHZhbGlkYXRlKHV1aWQpIHtcbiAgcmV0dXJuIHR5cGVvZiB1dWlkID09PSAnc3RyaW5nJyAmJiBSRUdFWC50ZXN0KHV1aWQpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB2YWxpZGF0ZTsiLCJpbXBvcnQgcm5nIGZyb20gJy4vcm5nLmpzJztcbmltcG9ydCBzdHJpbmdpZnkgZnJvbSAnLi9zdHJpbmdpZnkuanMnOyAvLyAqKmB2MSgpYCAtIEdlbmVyYXRlIHRpbWUtYmFzZWQgVVVJRCoqXG4vL1xuLy8gSW5zcGlyZWQgYnkgaHR0cHM6Ly9naXRodWIuY29tL0xpb3NLL1VVSUQuanNcbi8vIGFuZCBodHRwOi8vZG9jcy5weXRob24ub3JnL2xpYnJhcnkvdXVpZC5odG1sXG5cbnZhciBfbm9kZUlkO1xuXG52YXIgX2Nsb2Nrc2VxOyAvLyBQcmV2aW91cyB1dWlkIGNyZWF0aW9uIHRpbWVcblxuXG52YXIgX2xhc3RNU2VjcyA9IDA7XG52YXIgX2xhc3ROU2VjcyA9IDA7IC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdXVpZGpzL3V1aWQgZm9yIEFQSSBkZXRhaWxzXG5cbmZ1bmN0aW9uIHYxKG9wdGlvbnMsIGJ1Ziwgb2Zmc2V0KSB7XG4gIHZhciBpID0gYnVmICYmIG9mZnNldCB8fCAwO1xuICB2YXIgYiA9IGJ1ZiB8fCBuZXcgQXJyYXkoMTYpO1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIG5vZGUgPSBvcHRpb25zLm5vZGUgfHwgX25vZGVJZDtcbiAgdmFyIGNsb2Nrc2VxID0gb3B0aW9ucy5jbG9ja3NlcSAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5jbG9ja3NlcSA6IF9jbG9ja3NlcTsgLy8gbm9kZSBhbmQgY2xvY2tzZXEgbmVlZCB0byBiZSBpbml0aWFsaXplZCB0byByYW5kb20gdmFsdWVzIGlmIHRoZXkncmUgbm90XG4gIC8vIHNwZWNpZmllZC4gIFdlIGRvIHRoaXMgbGF6aWx5IHRvIG1pbmltaXplIGlzc3VlcyByZWxhdGVkIHRvIGluc3VmZmljaWVudFxuICAvLyBzeXN0ZW0gZW50cm9weS4gIFNlZSAjMTg5XG5cbiAgaWYgKG5vZGUgPT0gbnVsbCB8fCBjbG9ja3NlcSA9PSBudWxsKSB7XG4gICAgdmFyIHNlZWRCeXRlcyA9IG9wdGlvbnMucmFuZG9tIHx8IChvcHRpb25zLnJuZyB8fCBybmcpKCk7XG5cbiAgICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgICAvLyBQZXIgNC41LCBjcmVhdGUgYW5kIDQ4LWJpdCBub2RlIGlkLCAoNDcgcmFuZG9tIGJpdHMgKyBtdWx0aWNhc3QgYml0ID0gMSlcbiAgICAgIG5vZGUgPSBfbm9kZUlkID0gW3NlZWRCeXRlc1swXSB8IDB4MDEsIHNlZWRCeXRlc1sxXSwgc2VlZEJ5dGVzWzJdLCBzZWVkQnl0ZXNbM10sIHNlZWRCeXRlc1s0XSwgc2VlZEJ5dGVzWzVdXTtcbiAgICB9XG5cbiAgICBpZiAoY2xvY2tzZXEgPT0gbnVsbCkge1xuICAgICAgLy8gUGVyIDQuMi4yLCByYW5kb21pemUgKDE0IGJpdCkgY2xvY2tzZXFcbiAgICAgIGNsb2Nrc2VxID0gX2Nsb2Nrc2VxID0gKHNlZWRCeXRlc1s2XSA8PCA4IHwgc2VlZEJ5dGVzWzddKSAmIDB4M2ZmZjtcbiAgICB9XG4gIH0gLy8gVVVJRCB0aW1lc3RhbXBzIGFyZSAxMDAgbmFuby1zZWNvbmQgdW5pdHMgc2luY2UgdGhlIEdyZWdvcmlhbiBlcG9jaCxcbiAgLy8gKDE1ODItMTAtMTUgMDA6MDApLiAgSlNOdW1iZXJzIGFyZW4ndCBwcmVjaXNlIGVub3VnaCBmb3IgdGhpcywgc29cbiAgLy8gdGltZSBpcyBoYW5kbGVkIGludGVybmFsbHkgYXMgJ21zZWNzJyAoaW50ZWdlciBtaWxsaXNlY29uZHMpIGFuZCAnbnNlY3MnXG4gIC8vICgxMDAtbmFub3NlY29uZHMgb2Zmc2V0IGZyb20gbXNlY3MpIHNpbmNlIHVuaXggZXBvY2gsIDE5NzAtMDEtMDEgMDA6MDAuXG5cblxuICB2YXIgbXNlY3MgPSBvcHRpb25zLm1zZWNzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLm1zZWNzIDogRGF0ZS5ub3coKTsgLy8gUGVyIDQuMi4xLjIsIHVzZSBjb3VudCBvZiB1dWlkJ3MgZ2VuZXJhdGVkIGR1cmluZyB0aGUgY3VycmVudCBjbG9ja1xuICAvLyBjeWNsZSB0byBzaW11bGF0ZSBoaWdoZXIgcmVzb2x1dGlvbiBjbG9ja1xuXG4gIHZhciBuc2VjcyA9IG9wdGlvbnMubnNlY3MgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMubnNlY3MgOiBfbGFzdE5TZWNzICsgMTsgLy8gVGltZSBzaW5jZSBsYXN0IHV1aWQgY3JlYXRpb24gKGluIG1zZWNzKVxuXG4gIHZhciBkdCA9IG1zZWNzIC0gX2xhc3RNU2VjcyArIChuc2VjcyAtIF9sYXN0TlNlY3MpIC8gMTAwMDA7IC8vIFBlciA0LjIuMS4yLCBCdW1wIGNsb2Nrc2VxIG9uIGNsb2NrIHJlZ3Jlc3Npb25cblxuICBpZiAoZHQgPCAwICYmIG9wdGlvbnMuY2xvY2tzZXEgPT09IHVuZGVmaW5lZCkge1xuICAgIGNsb2Nrc2VxID0gY2xvY2tzZXEgKyAxICYgMHgzZmZmO1xuICB9IC8vIFJlc2V0IG5zZWNzIGlmIGNsb2NrIHJlZ3Jlc3NlcyAobmV3IGNsb2Nrc2VxKSBvciB3ZSd2ZSBtb3ZlZCBvbnRvIGEgbmV3XG4gIC8vIHRpbWUgaW50ZXJ2YWxcblxuXG4gIGlmICgoZHQgPCAwIHx8IG1zZWNzID4gX2xhc3RNU2VjcykgJiYgb3B0aW9ucy5uc2VjcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgbnNlY3MgPSAwO1xuICB9IC8vIFBlciA0LjIuMS4yIFRocm93IGVycm9yIGlmIHRvbyBtYW55IHV1aWRzIGFyZSByZXF1ZXN0ZWRcblxuXG4gIGlmIChuc2VjcyA+PSAxMDAwMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcInV1aWQudjEoKTogQ2FuJ3QgY3JlYXRlIG1vcmUgdGhhbiAxME0gdXVpZHMvc2VjXCIpO1xuICB9XG5cbiAgX2xhc3RNU2VjcyA9IG1zZWNzO1xuICBfbGFzdE5TZWNzID0gbnNlY3M7XG4gIF9jbG9ja3NlcSA9IGNsb2Nrc2VxOyAvLyBQZXIgNC4xLjQgLSBDb252ZXJ0IGZyb20gdW5peCBlcG9jaCB0byBHcmVnb3JpYW4gZXBvY2hcblxuICBtc2VjcyArPSAxMjIxOTI5MjgwMDAwMDsgLy8gYHRpbWVfbG93YFxuXG4gIHZhciB0bCA9ICgobXNlY3MgJiAweGZmZmZmZmYpICogMTAwMDAgKyBuc2VjcykgJSAweDEwMDAwMDAwMDtcbiAgYltpKytdID0gdGwgPj4+IDI0ICYgMHhmZjtcbiAgYltpKytdID0gdGwgPj4+IDE2ICYgMHhmZjtcbiAgYltpKytdID0gdGwgPj4+IDggJiAweGZmO1xuICBiW2krK10gPSB0bCAmIDB4ZmY7IC8vIGB0aW1lX21pZGBcblxuICB2YXIgdG1oID0gbXNlY3MgLyAweDEwMDAwMDAwMCAqIDEwMDAwICYgMHhmZmZmZmZmO1xuICBiW2krK10gPSB0bWggPj4+IDggJiAweGZmO1xuICBiW2krK10gPSB0bWggJiAweGZmOyAvLyBgdGltZV9oaWdoX2FuZF92ZXJzaW9uYFxuXG4gIGJbaSsrXSA9IHRtaCA+Pj4gMjQgJiAweGYgfCAweDEwOyAvLyBpbmNsdWRlIHZlcnNpb25cblxuICBiW2krK10gPSB0bWggPj4+IDE2ICYgMHhmZjsgLy8gYGNsb2NrX3NlcV9oaV9hbmRfcmVzZXJ2ZWRgIChQZXIgNC4yLjIgLSBpbmNsdWRlIHZhcmlhbnQpXG5cbiAgYltpKytdID0gY2xvY2tzZXEgPj4+IDggfCAweDgwOyAvLyBgY2xvY2tfc2VxX2xvd2BcblxuICBiW2krK10gPSBjbG9ja3NlcSAmIDB4ZmY7IC8vIGBub2RlYFxuXG4gIGZvciAodmFyIG4gPSAwOyBuIDwgNjsgKytuKSB7XG4gICAgYltpICsgbl0gPSBub2RlW25dO1xuICB9XG5cbiAgcmV0dXJuIGJ1ZiB8fCBzdHJpbmdpZnkoYik7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHYxOyIsImltcG9ydCB2YWxpZGF0ZSBmcm9tICcuL3ZhbGlkYXRlLmpzJztcblxuZnVuY3Rpb24gcGFyc2UodXVpZCkge1xuICBpZiAoIXZhbGlkYXRlKHV1aWQpKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKCdJbnZhbGlkIFVVSUQnKTtcbiAgfVxuXG4gIHZhciB2O1xuICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkoMTYpOyAvLyBQYXJzZSAjIyMjIyMjIy0uLi4uLS4uLi4tLi4uLi0uLi4uLi4uLi4uLi5cblxuICBhcnJbMF0gPSAodiA9IHBhcnNlSW50KHV1aWQuc2xpY2UoMCwgOCksIDE2KSkgPj4+IDI0O1xuICBhcnJbMV0gPSB2ID4+PiAxNiAmIDB4ZmY7XG4gIGFyclsyXSA9IHYgPj4+IDggJiAweGZmO1xuICBhcnJbM10gPSB2ICYgMHhmZjsgLy8gUGFyc2UgLi4uLi4uLi4tIyMjIy0uLi4uLS4uLi4tLi4uLi4uLi4uLi4uXG5cbiAgYXJyWzRdID0gKHYgPSBwYXJzZUludCh1dWlkLnNsaWNlKDksIDEzKSwgMTYpKSA+Pj4gODtcbiAgYXJyWzVdID0gdiAmIDB4ZmY7IC8vIFBhcnNlIC4uLi4uLi4uLS4uLi4tIyMjIy0uLi4uLS4uLi4uLi4uLi4uLlxuXG4gIGFycls2XSA9ICh2ID0gcGFyc2VJbnQodXVpZC5zbGljZSgxNCwgMTgpLCAxNikpID4+PiA4O1xuICBhcnJbN10gPSB2ICYgMHhmZjsgLy8gUGFyc2UgLi4uLi4uLi4tLi4uLi0uLi4uLSMjIyMtLi4uLi4uLi4uLi4uXG5cbiAgYXJyWzhdID0gKHYgPSBwYXJzZUludCh1dWlkLnNsaWNlKDE5LCAyMyksIDE2KSkgPj4+IDg7XG4gIGFycls5XSA9IHYgJiAweGZmOyAvLyBQYXJzZSAuLi4uLi4uLi0uLi4uLS4uLi4tLi4uLi0jIyMjIyMjIyMjIyNcbiAgLy8gKFVzZSBcIi9cIiB0byBhdm9pZCAzMi1iaXQgdHJ1bmNhdGlvbiB3aGVuIGJpdC1zaGlmdGluZyBoaWdoLW9yZGVyIGJ5dGVzKVxuXG4gIGFyclsxMF0gPSAodiA9IHBhcnNlSW50KHV1aWQuc2xpY2UoMjQsIDM2KSwgMTYpKSAvIDB4MTAwMDAwMDAwMDAgJiAweGZmO1xuICBhcnJbMTFdID0gdiAvIDB4MTAwMDAwMDAwICYgMHhmZjtcbiAgYXJyWzEyXSA9IHYgPj4+IDI0ICYgMHhmZjtcbiAgYXJyWzEzXSA9IHYgPj4+IDE2ICYgMHhmZjtcbiAgYXJyWzE0XSA9IHYgPj4+IDggJiAweGZmO1xuICBhcnJbMTVdID0gdiAmIDB4ZmY7XG4gIHJldHVybiBhcnI7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHBhcnNlOyIsImltcG9ydCBzdHJpbmdpZnkgZnJvbSAnLi9zdHJpbmdpZnkuanMnO1xuaW1wb3J0IHBhcnNlIGZyb20gJy4vcGFyc2UuanMnO1xuXG5mdW5jdGlvbiBzdHJpbmdUb0J5dGVzKHN0cikge1xuICBzdHIgPSB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoc3RyKSk7IC8vIFVURjggZXNjYXBlXG5cbiAgdmFyIGJ5dGVzID0gW107XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICBieXRlcy5wdXNoKHN0ci5jaGFyQ29kZUF0KGkpKTtcbiAgfVxuXG4gIHJldHVybiBieXRlcztcbn1cblxuZXhwb3J0IHZhciBETlMgPSAnNmJhN2I4MTAtOWRhZC0xMWQxLTgwYjQtMDBjMDRmZDQzMGM4JztcbmV4cG9ydCB2YXIgVVJMID0gJzZiYTdiODExLTlkYWQtMTFkMS04MGI0LTAwYzA0ZmQ0MzBjOCc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAobmFtZSwgdmVyc2lvbiwgaGFzaGZ1bmMpIHtcbiAgZnVuY3Rpb24gZ2VuZXJhdGVVVUlEKHZhbHVlLCBuYW1lc3BhY2UsIGJ1Ziwgb2Zmc2V0KSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHZhbHVlID0gc3RyaW5nVG9CeXRlcyh2YWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBuYW1lc3BhY2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICBuYW1lc3BhY2UgPSBwYXJzZShuYW1lc3BhY2UpO1xuICAgIH1cblxuICAgIGlmIChuYW1lc3BhY2UubGVuZ3RoICE9PSAxNikge1xuICAgICAgdGhyb3cgVHlwZUVycm9yKCdOYW1lc3BhY2UgbXVzdCBiZSBhcnJheS1saWtlICgxNiBpdGVyYWJsZSBpbnRlZ2VyIHZhbHVlcywgMC0yNTUpJyk7XG4gICAgfSAvLyBDb21wdXRlIGhhc2ggb2YgbmFtZXNwYWNlIGFuZCB2YWx1ZSwgUGVyIDQuM1xuICAgIC8vIEZ1dHVyZTogVXNlIHNwcmVhZCBzeW50YXggd2hlbiBzdXBwb3J0ZWQgb24gYWxsIHBsYXRmb3JtcywgZS5nLiBgYnl0ZXMgPVxuICAgIC8vIGhhc2hmdW5jKFsuLi5uYW1lc3BhY2UsIC4uLiB2YWx1ZV0pYFxuXG5cbiAgICB2YXIgYnl0ZXMgPSBuZXcgVWludDhBcnJheSgxNiArIHZhbHVlLmxlbmd0aCk7XG4gICAgYnl0ZXMuc2V0KG5hbWVzcGFjZSk7XG4gICAgYnl0ZXMuc2V0KHZhbHVlLCBuYW1lc3BhY2UubGVuZ3RoKTtcbiAgICBieXRlcyA9IGhhc2hmdW5jKGJ5dGVzKTtcbiAgICBieXRlc1s2XSA9IGJ5dGVzWzZdICYgMHgwZiB8IHZlcnNpb247XG4gICAgYnl0ZXNbOF0gPSBieXRlc1s4XSAmIDB4M2YgfCAweDgwO1xuXG4gICAgaWYgKGJ1Zikge1xuICAgICAgb2Zmc2V0ID0gb2Zmc2V0IHx8IDA7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMTY7ICsraSkge1xuICAgICAgICBidWZbb2Zmc2V0ICsgaV0gPSBieXRlc1tpXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGJ1ZjtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RyaW5naWZ5KGJ5dGVzKTtcbiAgfSAvLyBGdW5jdGlvbiNuYW1lIGlzIG5vdCBzZXR0YWJsZSBvbiBzb21lIHBsYXRmb3JtcyAoIzI3MClcblxuXG4gIHRyeSB7XG4gICAgZ2VuZXJhdGVVVUlELm5hbWUgPSBuYW1lOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZW1wdHlcbiAgfSBjYXRjaCAoZXJyKSB7fSAvLyBGb3IgQ29tbW9uSlMgZGVmYXVsdCBleHBvcnQgc3VwcG9ydFxuXG5cbiAgZ2VuZXJhdGVVVUlELkROUyA9IEROUztcbiAgZ2VuZXJhdGVVVUlELlVSTCA9IFVSTDtcbiAgcmV0dXJuIGdlbmVyYXRlVVVJRDtcbn0iLCIvKlxuICogQnJvd3Nlci1jb21wYXRpYmxlIEphdmFTY3JpcHQgTUQ1XG4gKlxuICogTW9kaWZpY2F0aW9uIG9mIEphdmFTY3JpcHQgTUQ1XG4gKiBodHRwczovL2dpdGh1Yi5jb20vYmx1ZWltcC9KYXZhU2NyaXB0LU1ENVxuICpcbiAqIENvcHlyaWdodCAyMDExLCBTZWJhc3RpYW4gVHNjaGFuXG4gKiBodHRwczovL2JsdWVpbXAubmV0XG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlOlxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVRcbiAqXG4gKiBCYXNlZCBvblxuICogQSBKYXZhU2NyaXB0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBSU0EgRGF0YSBTZWN1cml0eSwgSW5jLiBNRDUgTWVzc2FnZVxuICogRGlnZXN0IEFsZ29yaXRobSwgYXMgZGVmaW5lZCBpbiBSRkMgMTMyMS5cbiAqIFZlcnNpb24gMi4yIENvcHlyaWdodCAoQykgUGF1bCBKb2huc3RvbiAxOTk5IC0gMjAwOVxuICogT3RoZXIgY29udHJpYnV0b3JzOiBHcmVnIEhvbHQsIEFuZHJldyBLZXBlcnQsIFlkbmFyLCBMb3N0aW5ldFxuICogRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlXG4gKiBTZWUgaHR0cDovL3BhamhvbWUub3JnLnVrL2NyeXB0L21kNSBmb3IgbW9yZSBpbmZvLlxuICovXG5mdW5jdGlvbiBtZDUoYnl0ZXMpIHtcbiAgaWYgKHR5cGVvZiBieXRlcyA9PT0gJ3N0cmluZycpIHtcbiAgICB2YXIgbXNnID0gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KGJ5dGVzKSk7IC8vIFVURjggZXNjYXBlXG5cbiAgICBieXRlcyA9IG5ldyBVaW50OEFycmF5KG1zZy5sZW5ndGgpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyArK2kpIHtcbiAgICAgIGJ5dGVzW2ldID0gbXNnLmNoYXJDb2RlQXQoaSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1kNVRvSGV4RW5jb2RlZEFycmF5KHdvcmRzVG9NZDUoYnl0ZXNUb1dvcmRzKGJ5dGVzKSwgYnl0ZXMubGVuZ3RoICogOCkpO1xufVxuLypcbiAqIENvbnZlcnQgYW4gYXJyYXkgb2YgbGl0dGxlLWVuZGlhbiB3b3JkcyB0byBhbiBhcnJheSBvZiBieXRlc1xuICovXG5cblxuZnVuY3Rpb24gbWQ1VG9IZXhFbmNvZGVkQXJyYXkoaW5wdXQpIHtcbiAgdmFyIG91dHB1dCA9IFtdO1xuICB2YXIgbGVuZ3RoMzIgPSBpbnB1dC5sZW5ndGggKiAzMjtcbiAgdmFyIGhleFRhYiA9ICcwMTIzNDU2Nzg5YWJjZGVmJztcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDMyOyBpICs9IDgpIHtcbiAgICB2YXIgeCA9IGlucHV0W2kgPj4gNV0gPj4+IGkgJSAzMiAmIDB4ZmY7XG4gICAgdmFyIGhleCA9IHBhcnNlSW50KGhleFRhYi5jaGFyQXQoeCA+Pj4gNCAmIDB4MGYpICsgaGV4VGFiLmNoYXJBdCh4ICYgMHgwZiksIDE2KTtcbiAgICBvdXRwdXQucHVzaChoZXgpO1xuICB9XG5cbiAgcmV0dXJuIG91dHB1dDtcbn1cbi8qKlxuICogQ2FsY3VsYXRlIG91dHB1dCBsZW5ndGggd2l0aCBwYWRkaW5nIGFuZCBiaXQgbGVuZ3RoXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRPdXRwdXRMZW5ndGgoaW5wdXRMZW5ndGg4KSB7XG4gIHJldHVybiAoaW5wdXRMZW5ndGg4ICsgNjQgPj4+IDkgPDwgNCkgKyAxNCArIDE7XG59XG4vKlxuICogQ2FsY3VsYXRlIHRoZSBNRDUgb2YgYW4gYXJyYXkgb2YgbGl0dGxlLWVuZGlhbiB3b3JkcywgYW5kIGEgYml0IGxlbmd0aC5cbiAqL1xuXG5cbmZ1bmN0aW9uIHdvcmRzVG9NZDUoeCwgbGVuKSB7XG4gIC8qIGFwcGVuZCBwYWRkaW5nICovXG4gIHhbbGVuID4+IDVdIHw9IDB4ODAgPDwgbGVuICUgMzI7XG4gIHhbZ2V0T3V0cHV0TGVuZ3RoKGxlbikgLSAxXSA9IGxlbjtcbiAgdmFyIGEgPSAxNzMyNTg0MTkzO1xuICB2YXIgYiA9IC0yNzE3MzM4Nzk7XG4gIHZhciBjID0gLTE3MzI1ODQxOTQ7XG4gIHZhciBkID0gMjcxNzMzODc4O1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgeC5sZW5ndGg7IGkgKz0gMTYpIHtcbiAgICB2YXIgb2xkYSA9IGE7XG4gICAgdmFyIG9sZGIgPSBiO1xuICAgIHZhciBvbGRjID0gYztcbiAgICB2YXIgb2xkZCA9IGQ7XG4gICAgYSA9IG1kNWZmKGEsIGIsIGMsIGQsIHhbaV0sIDcsIC02ODA4NzY5MzYpO1xuICAgIGQgPSBtZDVmZihkLCBhLCBiLCBjLCB4W2kgKyAxXSwgMTIsIC0zODk1NjQ1ODYpO1xuICAgIGMgPSBtZDVmZihjLCBkLCBhLCBiLCB4W2kgKyAyXSwgMTcsIDYwNjEwNTgxOSk7XG4gICAgYiA9IG1kNWZmKGIsIGMsIGQsIGEsIHhbaSArIDNdLCAyMiwgLTEwNDQ1MjUzMzApO1xuICAgIGEgPSBtZDVmZihhLCBiLCBjLCBkLCB4W2kgKyA0XSwgNywgLTE3NjQxODg5Nyk7XG4gICAgZCA9IG1kNWZmKGQsIGEsIGIsIGMsIHhbaSArIDVdLCAxMiwgMTIwMDA4MDQyNik7XG4gICAgYyA9IG1kNWZmKGMsIGQsIGEsIGIsIHhbaSArIDZdLCAxNywgLTE0NzMyMzEzNDEpO1xuICAgIGIgPSBtZDVmZihiLCBjLCBkLCBhLCB4W2kgKyA3XSwgMjIsIC00NTcwNTk4Myk7XG4gICAgYSA9IG1kNWZmKGEsIGIsIGMsIGQsIHhbaSArIDhdLCA3LCAxNzcwMDM1NDE2KTtcbiAgICBkID0gbWQ1ZmYoZCwgYSwgYiwgYywgeFtpICsgOV0sIDEyLCAtMTk1ODQxNDQxNyk7XG4gICAgYyA9IG1kNWZmKGMsIGQsIGEsIGIsIHhbaSArIDEwXSwgMTcsIC00MjA2Myk7XG4gICAgYiA9IG1kNWZmKGIsIGMsIGQsIGEsIHhbaSArIDExXSwgMjIsIC0xOTkwNDA0MTYyKTtcbiAgICBhID0gbWQ1ZmYoYSwgYiwgYywgZCwgeFtpICsgMTJdLCA3LCAxODA0NjAzNjgyKTtcbiAgICBkID0gbWQ1ZmYoZCwgYSwgYiwgYywgeFtpICsgMTNdLCAxMiwgLTQwMzQxMTAxKTtcbiAgICBjID0gbWQ1ZmYoYywgZCwgYSwgYiwgeFtpICsgMTRdLCAxNywgLTE1MDIwMDIyOTApO1xuICAgIGIgPSBtZDVmZihiLCBjLCBkLCBhLCB4W2kgKyAxNV0sIDIyLCAxMjM2NTM1MzI5KTtcbiAgICBhID0gbWQ1Z2coYSwgYiwgYywgZCwgeFtpICsgMV0sIDUsIC0xNjU3OTY1MTApO1xuICAgIGQgPSBtZDVnZyhkLCBhLCBiLCBjLCB4W2kgKyA2XSwgOSwgLTEwNjk1MDE2MzIpO1xuICAgIGMgPSBtZDVnZyhjLCBkLCBhLCBiLCB4W2kgKyAxMV0sIDE0LCA2NDM3MTc3MTMpO1xuICAgIGIgPSBtZDVnZyhiLCBjLCBkLCBhLCB4W2ldLCAyMCwgLTM3Mzg5NzMwMik7XG4gICAgYSA9IG1kNWdnKGEsIGIsIGMsIGQsIHhbaSArIDVdLCA1LCAtNzAxNTU4NjkxKTtcbiAgICBkID0gbWQ1Z2coZCwgYSwgYiwgYywgeFtpICsgMTBdLCA5LCAzODAxNjA4Myk7XG4gICAgYyA9IG1kNWdnKGMsIGQsIGEsIGIsIHhbaSArIDE1XSwgMTQsIC02NjA0NzgzMzUpO1xuICAgIGIgPSBtZDVnZyhiLCBjLCBkLCBhLCB4W2kgKyA0XSwgMjAsIC00MDU1Mzc4NDgpO1xuICAgIGEgPSBtZDVnZyhhLCBiLCBjLCBkLCB4W2kgKyA5XSwgNSwgNTY4NDQ2NDM4KTtcbiAgICBkID0gbWQ1Z2coZCwgYSwgYiwgYywgeFtpICsgMTRdLCA5LCAtMTAxOTgwMzY5MCk7XG4gICAgYyA9IG1kNWdnKGMsIGQsIGEsIGIsIHhbaSArIDNdLCAxNCwgLTE4NzM2Mzk2MSk7XG4gICAgYiA9IG1kNWdnKGIsIGMsIGQsIGEsIHhbaSArIDhdLCAyMCwgMTE2MzUzMTUwMSk7XG4gICAgYSA9IG1kNWdnKGEsIGIsIGMsIGQsIHhbaSArIDEzXSwgNSwgLTE0NDQ2ODE0NjcpO1xuICAgIGQgPSBtZDVnZyhkLCBhLCBiLCBjLCB4W2kgKyAyXSwgOSwgLTUxNDAzNzg0KTtcbiAgICBjID0gbWQ1Z2coYywgZCwgYSwgYiwgeFtpICsgN10sIDE0LCAxNzM1MzI4NDczKTtcbiAgICBiID0gbWQ1Z2coYiwgYywgZCwgYSwgeFtpICsgMTJdLCAyMCwgLTE5MjY2MDc3MzQpO1xuICAgIGEgPSBtZDVoaChhLCBiLCBjLCBkLCB4W2kgKyA1XSwgNCwgLTM3ODU1OCk7XG4gICAgZCA9IG1kNWhoKGQsIGEsIGIsIGMsIHhbaSArIDhdLCAxMSwgLTIwMjI1NzQ0NjMpO1xuICAgIGMgPSBtZDVoaChjLCBkLCBhLCBiLCB4W2kgKyAxMV0sIDE2LCAxODM5MDMwNTYyKTtcbiAgICBiID0gbWQ1aGgoYiwgYywgZCwgYSwgeFtpICsgMTRdLCAyMywgLTM1MzA5NTU2KTtcbiAgICBhID0gbWQ1aGgoYSwgYiwgYywgZCwgeFtpICsgMV0sIDQsIC0xNTMwOTkyMDYwKTtcbiAgICBkID0gbWQ1aGgoZCwgYSwgYiwgYywgeFtpICsgNF0sIDExLCAxMjcyODkzMzUzKTtcbiAgICBjID0gbWQ1aGgoYywgZCwgYSwgYiwgeFtpICsgN10sIDE2LCAtMTU1NDk3NjMyKTtcbiAgICBiID0gbWQ1aGgoYiwgYywgZCwgYSwgeFtpICsgMTBdLCAyMywgLTEwOTQ3MzA2NDApO1xuICAgIGEgPSBtZDVoaChhLCBiLCBjLCBkLCB4W2kgKyAxM10sIDQsIDY4MTI3OTE3NCk7XG4gICAgZCA9IG1kNWhoKGQsIGEsIGIsIGMsIHhbaV0sIDExLCAtMzU4NTM3MjIyKTtcbiAgICBjID0gbWQ1aGgoYywgZCwgYSwgYiwgeFtpICsgM10sIDE2LCAtNzIyNTIxOTc5KTtcbiAgICBiID0gbWQ1aGgoYiwgYywgZCwgYSwgeFtpICsgNl0sIDIzLCA3NjAyOTE4OSk7XG4gICAgYSA9IG1kNWhoKGEsIGIsIGMsIGQsIHhbaSArIDldLCA0LCAtNjQwMzY0NDg3KTtcbiAgICBkID0gbWQ1aGgoZCwgYSwgYiwgYywgeFtpICsgMTJdLCAxMSwgLTQyMTgxNTgzNSk7XG4gICAgYyA9IG1kNWhoKGMsIGQsIGEsIGIsIHhbaSArIDE1XSwgMTYsIDUzMDc0MjUyMCk7XG4gICAgYiA9IG1kNWhoKGIsIGMsIGQsIGEsIHhbaSArIDJdLCAyMywgLTk5NTMzODY1MSk7XG4gICAgYSA9IG1kNWlpKGEsIGIsIGMsIGQsIHhbaV0sIDYsIC0xOTg2MzA4NDQpO1xuICAgIGQgPSBtZDVpaShkLCBhLCBiLCBjLCB4W2kgKyA3XSwgMTAsIDExMjY4OTE0MTUpO1xuICAgIGMgPSBtZDVpaShjLCBkLCBhLCBiLCB4W2kgKyAxNF0sIDE1LCAtMTQxNjM1NDkwNSk7XG4gICAgYiA9IG1kNWlpKGIsIGMsIGQsIGEsIHhbaSArIDVdLCAyMSwgLTU3NDM0MDU1KTtcbiAgICBhID0gbWQ1aWkoYSwgYiwgYywgZCwgeFtpICsgMTJdLCA2LCAxNzAwNDg1NTcxKTtcbiAgICBkID0gbWQ1aWkoZCwgYSwgYiwgYywgeFtpICsgM10sIDEwLCAtMTg5NDk4NjYwNik7XG4gICAgYyA9IG1kNWlpKGMsIGQsIGEsIGIsIHhbaSArIDEwXSwgMTUsIC0xMDUxNTIzKTtcbiAgICBiID0gbWQ1aWkoYiwgYywgZCwgYSwgeFtpICsgMV0sIDIxLCAtMjA1NDkyMjc5OSk7XG4gICAgYSA9IG1kNWlpKGEsIGIsIGMsIGQsIHhbaSArIDhdLCA2LCAxODczMzEzMzU5KTtcbiAgICBkID0gbWQ1aWkoZCwgYSwgYiwgYywgeFtpICsgMTVdLCAxMCwgLTMwNjExNzQ0KTtcbiAgICBjID0gbWQ1aWkoYywgZCwgYSwgYiwgeFtpICsgNl0sIDE1LCAtMTU2MDE5ODM4MCk7XG4gICAgYiA9IG1kNWlpKGIsIGMsIGQsIGEsIHhbaSArIDEzXSwgMjEsIDEzMDkxNTE2NDkpO1xuICAgIGEgPSBtZDVpaShhLCBiLCBjLCBkLCB4W2kgKyA0XSwgNiwgLTE0NTUyMzA3MCk7XG4gICAgZCA9IG1kNWlpKGQsIGEsIGIsIGMsIHhbaSArIDExXSwgMTAsIC0xMTIwMjEwMzc5KTtcbiAgICBjID0gbWQ1aWkoYywgZCwgYSwgYiwgeFtpICsgMl0sIDE1LCA3MTg3ODcyNTkpO1xuICAgIGIgPSBtZDVpaShiLCBjLCBkLCBhLCB4W2kgKyA5XSwgMjEsIC0zNDM0ODU1NTEpO1xuICAgIGEgPSBzYWZlQWRkKGEsIG9sZGEpO1xuICAgIGIgPSBzYWZlQWRkKGIsIG9sZGIpO1xuICAgIGMgPSBzYWZlQWRkKGMsIG9sZGMpO1xuICAgIGQgPSBzYWZlQWRkKGQsIG9sZGQpO1xuICB9XG5cbiAgcmV0dXJuIFthLCBiLCBjLCBkXTtcbn1cbi8qXG4gKiBDb252ZXJ0IGFuIGFycmF5IGJ5dGVzIHRvIGFuIGFycmF5IG9mIGxpdHRsZS1lbmRpYW4gd29yZHNcbiAqIENoYXJhY3RlcnMgPjI1NSBoYXZlIHRoZWlyIGhpZ2gtYnl0ZSBzaWxlbnRseSBpZ25vcmVkLlxuICovXG5cblxuZnVuY3Rpb24gYnl0ZXNUb1dvcmRzKGlucHV0KSB7XG4gIGlmIChpbnB1dC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICB2YXIgbGVuZ3RoOCA9IGlucHV0Lmxlbmd0aCAqIDg7XG4gIHZhciBvdXRwdXQgPSBuZXcgVWludDMyQXJyYXkoZ2V0T3V0cHV0TGVuZ3RoKGxlbmd0aDgpKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDg7IGkgKz0gOCkge1xuICAgIG91dHB1dFtpID4+IDVdIHw9IChpbnB1dFtpIC8gOF0gJiAweGZmKSA8PCBpICUgMzI7XG4gIH1cblxuICByZXR1cm4gb3V0cHV0O1xufVxuLypcbiAqIEFkZCBpbnRlZ2Vycywgd3JhcHBpbmcgYXQgMl4zMi4gVGhpcyB1c2VzIDE2LWJpdCBvcGVyYXRpb25zIGludGVybmFsbHlcbiAqIHRvIHdvcmsgYXJvdW5kIGJ1Z3MgaW4gc29tZSBKUyBpbnRlcnByZXRlcnMuXG4gKi9cblxuXG5mdW5jdGlvbiBzYWZlQWRkKHgsIHkpIHtcbiAgdmFyIGxzdyA9ICh4ICYgMHhmZmZmKSArICh5ICYgMHhmZmZmKTtcbiAgdmFyIG1zdyA9ICh4ID4+IDE2KSArICh5ID4+IDE2KSArIChsc3cgPj4gMTYpO1xuICByZXR1cm4gbXN3IDw8IDE2IHwgbHN3ICYgMHhmZmZmO1xufVxuLypcbiAqIEJpdHdpc2Ugcm90YXRlIGEgMzItYml0IG51bWJlciB0byB0aGUgbGVmdC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGJpdFJvdGF0ZUxlZnQobnVtLCBjbnQpIHtcbiAgcmV0dXJuIG51bSA8PCBjbnQgfCBudW0gPj4+IDMyIC0gY250O1xufVxuLypcbiAqIFRoZXNlIGZ1bmN0aW9ucyBpbXBsZW1lbnQgdGhlIGZvdXIgYmFzaWMgb3BlcmF0aW9ucyB0aGUgYWxnb3JpdGhtIHVzZXMuXG4gKi9cblxuXG5mdW5jdGlvbiBtZDVjbW4ocSwgYSwgYiwgeCwgcywgdCkge1xuICByZXR1cm4gc2FmZUFkZChiaXRSb3RhdGVMZWZ0KHNhZmVBZGQoc2FmZUFkZChhLCBxKSwgc2FmZUFkZCh4LCB0KSksIHMpLCBiKTtcbn1cblxuZnVuY3Rpb24gbWQ1ZmYoYSwgYiwgYywgZCwgeCwgcywgdCkge1xuICByZXR1cm4gbWQ1Y21uKGIgJiBjIHwgfmIgJiBkLCBhLCBiLCB4LCBzLCB0KTtcbn1cblxuZnVuY3Rpb24gbWQ1Z2coYSwgYiwgYywgZCwgeCwgcywgdCkge1xuICByZXR1cm4gbWQ1Y21uKGIgJiBkIHwgYyAmIH5kLCBhLCBiLCB4LCBzLCB0KTtcbn1cblxuZnVuY3Rpb24gbWQ1aGgoYSwgYiwgYywgZCwgeCwgcywgdCkge1xuICByZXR1cm4gbWQ1Y21uKGIgXiBjIF4gZCwgYSwgYiwgeCwgcywgdCk7XG59XG5cbmZ1bmN0aW9uIG1kNWlpKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHtcbiAgcmV0dXJuIG1kNWNtbihjIF4gKGIgfCB+ZCksIGEsIGIsIHgsIHMsIHQpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBtZDU7IiwiaW1wb3J0IHYzNSBmcm9tICcuL3YzNS5qcyc7XG5pbXBvcnQgbWQ1IGZyb20gJy4vbWQ1LmpzJztcbnZhciB2MyA9IHYzNSgndjMnLCAweDMwLCBtZDUpO1xuZXhwb3J0IGRlZmF1bHQgdjM7IiwiaW1wb3J0IHJuZyBmcm9tICcuL3JuZy5qcyc7XG5pbXBvcnQgc3RyaW5naWZ5IGZyb20gJy4vc3RyaW5naWZ5LmpzJztcblxuZnVuY3Rpb24gdjQob3B0aW9ucywgYnVmLCBvZmZzZXQpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHZhciBybmRzID0gb3B0aW9ucy5yYW5kb20gfHwgKG9wdGlvbnMucm5nIHx8IHJuZykoKTsgLy8gUGVyIDQuNCwgc2V0IGJpdHMgZm9yIHZlcnNpb24gYW5kIGBjbG9ja19zZXFfaGlfYW5kX3Jlc2VydmVkYFxuXG4gIHJuZHNbNl0gPSBybmRzWzZdICYgMHgwZiB8IDB4NDA7XG4gIHJuZHNbOF0gPSBybmRzWzhdICYgMHgzZiB8IDB4ODA7IC8vIENvcHkgYnl0ZXMgdG8gYnVmZmVyLCBpZiBwcm92aWRlZFxuXG4gIGlmIChidWYpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgfHwgMDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMTY7ICsraSkge1xuICAgICAgYnVmW29mZnNldCArIGldID0gcm5kc1tpXTtcbiAgICB9XG5cbiAgICByZXR1cm4gYnVmO1xuICB9XG5cbiAgcmV0dXJuIHN0cmluZ2lmeShybmRzKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdjQ7IiwiLy8gQWRhcHRlZCBmcm9tIENocmlzIFZlbmVzcycgU0hBMSBjb2RlIGF0XG4vLyBodHRwOi8vd3d3Lm1vdmFibGUtdHlwZS5jby51ay9zY3JpcHRzL3NoYTEuaHRtbFxuZnVuY3Rpb24gZihzLCB4LCB5LCB6KSB7XG4gIHN3aXRjaCAocykge1xuICAgIGNhc2UgMDpcbiAgICAgIHJldHVybiB4ICYgeSBeIH54ICYgejtcblxuICAgIGNhc2UgMTpcbiAgICAgIHJldHVybiB4IF4geSBeIHo7XG5cbiAgICBjYXNlIDI6XG4gICAgICByZXR1cm4geCAmIHkgXiB4ICYgeiBeIHkgJiB6O1xuXG4gICAgY2FzZSAzOlxuICAgICAgcmV0dXJuIHggXiB5IF4gejtcbiAgfVxufVxuXG5mdW5jdGlvbiBST1RMKHgsIG4pIHtcbiAgcmV0dXJuIHggPDwgbiB8IHggPj4+IDMyIC0gbjtcbn1cblxuZnVuY3Rpb24gc2hhMShieXRlcykge1xuICB2YXIgSyA9IFsweDVhODI3OTk5LCAweDZlZDllYmExLCAweDhmMWJiY2RjLCAweGNhNjJjMWQ2XTtcbiAgdmFyIEggPSBbMHg2NzQ1MjMwMSwgMHhlZmNkYWI4OSwgMHg5OGJhZGNmZSwgMHgxMDMyNTQ3NiwgMHhjM2QyZTFmMF07XG5cbiAgaWYgKHR5cGVvZiBieXRlcyA9PT0gJ3N0cmluZycpIHtcbiAgICB2YXIgbXNnID0gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KGJ5dGVzKSk7IC8vIFVURjggZXNjYXBlXG5cbiAgICBieXRlcyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyArK2kpIHtcbiAgICAgIGJ5dGVzLnB1c2gobXNnLmNoYXJDb2RlQXQoaSkpO1xuICAgIH1cbiAgfSBlbHNlIGlmICghQXJyYXkuaXNBcnJheShieXRlcykpIHtcbiAgICAvLyBDb252ZXJ0IEFycmF5LWxpa2UgdG8gQXJyYXlcbiAgICBieXRlcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGJ5dGVzKTtcbiAgfVxuXG4gIGJ5dGVzLnB1c2goMHg4MCk7XG4gIHZhciBsID0gYnl0ZXMubGVuZ3RoIC8gNCArIDI7XG4gIHZhciBOID0gTWF0aC5jZWlsKGwgLyAxNik7XG4gIHZhciBNID0gbmV3IEFycmF5KE4pO1xuXG4gIGZvciAodmFyIF9pID0gMDsgX2kgPCBOOyArK19pKSB7XG4gICAgdmFyIGFyciA9IG5ldyBVaW50MzJBcnJheSgxNik7XG5cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IDE2OyArK2opIHtcbiAgICAgIGFycltqXSA9IGJ5dGVzW19pICogNjQgKyBqICogNF0gPDwgMjQgfCBieXRlc1tfaSAqIDY0ICsgaiAqIDQgKyAxXSA8PCAxNiB8IGJ5dGVzW19pICogNjQgKyBqICogNCArIDJdIDw8IDggfCBieXRlc1tfaSAqIDY0ICsgaiAqIDQgKyAzXTtcbiAgICB9XG5cbiAgICBNW19pXSA9IGFycjtcbiAgfVxuXG4gIE1bTiAtIDFdWzE0XSA9IChieXRlcy5sZW5ndGggLSAxKSAqIDggLyBNYXRoLnBvdygyLCAzMik7XG4gIE1bTiAtIDFdWzE0XSA9IE1hdGguZmxvb3IoTVtOIC0gMV1bMTRdKTtcbiAgTVtOIC0gMV1bMTVdID0gKGJ5dGVzLmxlbmd0aCAtIDEpICogOCAmIDB4ZmZmZmZmZmY7XG5cbiAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgTjsgKytfaTIpIHtcbiAgICB2YXIgVyA9IG5ldyBVaW50MzJBcnJheSg4MCk7XG5cbiAgICBmb3IgKHZhciB0ID0gMDsgdCA8IDE2OyArK3QpIHtcbiAgICAgIFdbdF0gPSBNW19pMl1bdF07XG4gICAgfVxuXG4gICAgZm9yICh2YXIgX3QgPSAxNjsgX3QgPCA4MDsgKytfdCkge1xuICAgICAgV1tfdF0gPSBST1RMKFdbX3QgLSAzXSBeIFdbX3QgLSA4XSBeIFdbX3QgLSAxNF0gXiBXW190IC0gMTZdLCAxKTtcbiAgICB9XG5cbiAgICB2YXIgYSA9IEhbMF07XG4gICAgdmFyIGIgPSBIWzFdO1xuICAgIHZhciBjID0gSFsyXTtcbiAgICB2YXIgZCA9IEhbM107XG4gICAgdmFyIGUgPSBIWzRdO1xuXG4gICAgZm9yICh2YXIgX3QyID0gMDsgX3QyIDwgODA7ICsrX3QyKSB7XG4gICAgICB2YXIgcyA9IE1hdGguZmxvb3IoX3QyIC8gMjApO1xuICAgICAgdmFyIFQgPSBST1RMKGEsIDUpICsgZihzLCBiLCBjLCBkKSArIGUgKyBLW3NdICsgV1tfdDJdID4+PiAwO1xuICAgICAgZSA9IGQ7XG4gICAgICBkID0gYztcbiAgICAgIGMgPSBST1RMKGIsIDMwKSA+Pj4gMDtcbiAgICAgIGIgPSBhO1xuICAgICAgYSA9IFQ7XG4gICAgfVxuXG4gICAgSFswXSA9IEhbMF0gKyBhID4+PiAwO1xuICAgIEhbMV0gPSBIWzFdICsgYiA+Pj4gMDtcbiAgICBIWzJdID0gSFsyXSArIGMgPj4+IDA7XG4gICAgSFszXSA9IEhbM10gKyBkID4+PiAwO1xuICAgIEhbNF0gPSBIWzRdICsgZSA+Pj4gMDtcbiAgfVxuXG4gIHJldHVybiBbSFswXSA+PiAyNCAmIDB4ZmYsIEhbMF0gPj4gMTYgJiAweGZmLCBIWzBdID4+IDggJiAweGZmLCBIWzBdICYgMHhmZiwgSFsxXSA+PiAyNCAmIDB4ZmYsIEhbMV0gPj4gMTYgJiAweGZmLCBIWzFdID4+IDggJiAweGZmLCBIWzFdICYgMHhmZiwgSFsyXSA+PiAyNCAmIDB4ZmYsIEhbMl0gPj4gMTYgJiAweGZmLCBIWzJdID4+IDggJiAweGZmLCBIWzJdICYgMHhmZiwgSFszXSA+PiAyNCAmIDB4ZmYsIEhbM10gPj4gMTYgJiAweGZmLCBIWzNdID4+IDggJiAweGZmLCBIWzNdICYgMHhmZiwgSFs0XSA+PiAyNCAmIDB4ZmYsIEhbNF0gPj4gMTYgJiAweGZmLCBIWzRdID4+IDggJiAweGZmLCBIWzRdICYgMHhmZl07XG59XG5cbmV4cG9ydCBkZWZhdWx0IHNoYTE7IiwiaW1wb3J0IHYzNSBmcm9tICcuL3YzNS5qcyc7XG5pbXBvcnQgc2hhMSBmcm9tICcuL3NoYTEuanMnO1xudmFyIHY1ID0gdjM1KCd2NScsIDB4NTAsIHNoYTEpO1xuZXhwb3J0IGRlZmF1bHQgdjU7IiwiaW1wb3J0IHZhbGlkYXRlIGZyb20gJy4vdmFsaWRhdGUuanMnO1xuXG5mdW5jdGlvbiB2ZXJzaW9uKHV1aWQpIHtcbiAgaWYgKCF2YWxpZGF0ZSh1dWlkKSkge1xuICAgIHRocm93IFR5cGVFcnJvcignSW52YWxpZCBVVUlEJyk7XG4gIH1cblxuICByZXR1cm4gcGFyc2VJbnQodXVpZC5zdWJzdHIoMTQsIDEpLCAxNik7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHZlcnNpb247IiwiZXhwb3J0IGRlZmF1bHQgJzAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCc7Il0sInNvdXJjZVJvb3QiOiIifQ==
\ No newline at end of file
+!function(t){var e={};function n(r){if(e[r])return e[r].exports;var i=e[r]={i:r,l:!1,exports:{}};return t[r].call(i.exports,i,i.exports,n),i.l=!0,i.exports}n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:r})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var i in t)n.d(r,i,function(e){return t[e]}.bind(null,i));return r},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=0)}([function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});const r=n(1);var i;!function(t){const e="BlazorExtensions",n={Canvas2d:new r.ContextManager("2d"),WebGL:new r.ContextManager("webgl")};t.initialize=function(){"undefined"==typeof window||window[e]?window[e]=Object.assign({},window[e],n):window[e]=Object.assign({},n)}}(i||(i={})),i.initialize()},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});e.ContextManager=class{constructor(t){if(this.contexts=new Map,this.webGLObject=new Array,this.webGLContext=!1,this.webGLTypes=[WebGLBuffer,WebGLShader,WebGLProgram,WebGLFramebuffer,WebGLRenderbuffer,WebGLTexture,WebGLUniformLocation],this.add=((t,e)=>{if(!t)throw new Error("Invalid canvas.");if(!this.contexts.get(t.id)){var n;if(!(n=e?t.getContext(this.contextName,e):t.getContext(this.contextName)))throw new Error("Invalid context.");this.contexts.set(t.id,n)}}),this.remove=(t=>{this.contexts.delete(t.id)}),this.setProperty=((t,e,n)=>{const r=this.getContext(t);this.setPropertyWithContext(r,e,n)}),this.getProperty=((t,e)=>{const n=this.getContext(t);return this.serialize(n[e])}),this.call=((t,e,n)=>{const r=this.getContext(t);return this.callWithContext(r,e,n)}),this.callBatch=((t,e)=>{const n=this.getContext(t);for(let t=0;t0?r[0]:null)}}),this.callWithContext=((t,e,n)=>this.serialize(this.prototypes[e].apply(t,void 0!=n?n.map(t=>this.deserialize(e,t)):[]))),this.setPropertyWithContext=((t,e,n)=>{t[e]=this.deserialize(e,n)}),this.getContext=(t=>{if(!t)throw new Error("Invalid canvas.");const e=this.contexts.get(t.id);if(!e)throw new Error("Invalid context.");return e}),this.deserialize=((t,e)=>{if(!this.webGLContext||void 0==e)return e;if(e.hasOwnProperty("webGLType")&&e.hasOwnProperty("id"))return this.webGLObject[e.id];if(Array.isArray(e)&&!t.endsWith("v"))return Int8Array.of(...e);if("string"!=typeof e||"bufferData"!==t&&"bufferSubData"!==t)return e;{let t=window.atob(e),r=t.length,i=new Uint8Array(r);for(var n=0;n{if(t instanceof TextMetrics)return{width:t.width};if(!this.webGLContext||void 0==t)return t;const e=this.webGLTypes.find(e=>t instanceof e);if(void 0!=e){const n=this.webGLObject.length;return this.webGLObject.push(t),{webGLType:e.name,id:n}}return t}),this.contextName=t,"2d"===t)this.prototypes=CanvasRenderingContext2D.prototype;else{if("webgl"!==t&&"experimental-webgl"!==t)throw new Error(`Invalid context name: ${t}`);this.prototypes=WebGLRenderingContext.prototype,this.webGLContext=!0}}}}]);
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vc3JjL0luaXRpYWxpemVDYW52YXMudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0NhbnZhc0NvbnRleHRNYW5hZ2VyLnRzIl0sIm5hbWVzIjpbImluc3RhbGxlZE1vZHVsZXMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJleHBvcnRzIiwibW9kdWxlIiwiaSIsImwiLCJtb2R1bGVzIiwiY2FsbCIsIm0iLCJjIiwiZCIsIm5hbWUiLCJnZXR0ZXIiLCJvIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJlbnVtZXJhYmxlIiwiZ2V0IiwiciIsIlN5bWJvbCIsInRvU3RyaW5nVGFnIiwidmFsdWUiLCJ0IiwibW9kZSIsIl9fZXNNb2R1bGUiLCJucyIsImNyZWF0ZSIsImtleSIsImJpbmQiLCJuIiwib2JqZWN0IiwicHJvcGVydHkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsInAiLCJzIiwiQ2FudmFzQ29udGV4dE1hbmFnZXJfMSIsIkNhbnZhcyIsImJsYXpvckV4dGVuc2lvbnMiLCJleHRlbnNpb25PYmplY3QiLCJDYW52YXMyZCIsIkNvbnRleHRNYW5hZ2VyIiwiV2ViR0wiLCJpbml0aWFsaXplIiwid2luZG93IiwiYXNzaWduIiwiW29iamVjdCBPYmplY3RdIiwiY29udGV4dE5hbWUiLCJ0aGlzIiwiY29udGV4dHMiLCJNYXAiLCJ3ZWJHTE9iamVjdCIsIkFycmF5Iiwid2ViR0xDb250ZXh0Iiwid2ViR0xUeXBlcyIsIldlYkdMQnVmZmVyIiwiV2ViR0xTaGFkZXIiLCJXZWJHTFByb2dyYW0iLCJXZWJHTEZyYW1lYnVmZmVyIiwiV2ViR0xSZW5kZXJidWZmZXIiLCJXZWJHTFRleHR1cmUiLCJXZWJHTFVuaWZvcm1Mb2NhdGlvbiIsImFkZCIsImNhbnZhcyIsInBhcmFtZXRlcnMiLCJFcnJvciIsImlkIiwiY29udGV4dCIsImdldENvbnRleHQiLCJzZXQiLCJyZW1vdmUiLCJkZWxldGUiLCJzZXRQcm9wZXJ0eSIsInNldFByb3BlcnR5V2l0aENvbnRleHQiLCJnZXRQcm9wZXJ0eSIsInNlcmlhbGl6ZSIsIm1ldGhvZCIsImFyZ3MiLCJjYWxsV2l0aENvbnRleHQiLCJjYWxsQmF0Y2giLCJiYXRjaGVkQ2FsbHMiLCJsZW5ndGgiLCJwYXJhbXMiLCJzbGljZSIsImlzQXJyYXkiLCJwcm90b3R5cGVzIiwiYXBwbHkiLCJ1bmRlZmluZWQiLCJtYXAiLCJkZXNlcmlhbGl6ZSIsImVuZHNXaXRoIiwiSW50OEFycmF5Iiwib2YiLCJiaW5TdHIiLCJhdG9iIiwiYnl0ZXMiLCJVaW50OEFycmF5IiwiY2hhckNvZGVBdCIsIlRleHRNZXRyaWNzIiwid2lkdGgiLCJ0eXBlIiwiZmluZCIsInB1c2giLCJ3ZWJHTFR5cGUiLCJDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQiLCJXZWJHTFJlbmRlcmluZ0NvbnRleHQiXSwibWFwcGluZ3MiOiJhQUNBLElBQUFBLEtBR0EsU0FBQUMsRUFBQUMsR0FHQSxHQUFBRixFQUFBRSxHQUNBLE9BQUFGLEVBQUFFLEdBQUFDLFFBR0EsSUFBQUMsRUFBQUosRUFBQUUsSUFDQUcsRUFBQUgsRUFDQUksR0FBQSxFQUNBSCxZQVVBLE9BTkFJLEVBQUFMLEdBQUFNLEtBQUFKLEVBQUFELFFBQUFDLElBQUFELFFBQUFGLEdBR0FHLEVBQUFFLEdBQUEsRUFHQUYsRUFBQUQsUUFLQUYsRUFBQVEsRUFBQUYsRUFHQU4sRUFBQVMsRUFBQVYsRUFHQUMsRUFBQVUsRUFBQSxTQUFBUixFQUFBUyxFQUFBQyxHQUNBWixFQUFBYSxFQUFBWCxFQUFBUyxJQUNBRyxPQUFBQyxlQUFBYixFQUFBUyxHQUEwQ0ssWUFBQSxFQUFBQyxJQUFBTCxLQUsxQ1osRUFBQWtCLEVBQUEsU0FBQWhCLEdBQ0Esb0JBQUFpQixlQUFBQyxhQUNBTixPQUFBQyxlQUFBYixFQUFBaUIsT0FBQUMsYUFBd0RDLE1BQUEsV0FFeERQLE9BQUFDLGVBQUFiLEVBQUEsY0FBaURtQixPQUFB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RCxFQUFTWSxFQUFPWixPQUNoQmMsRUFBUSxJQUFJQyxXQUFXZixHQUMzQixJQUFLLElBQUk3RSxFQUFJLEVBQUdBLEVBQUk2RSxFQUFRN0UsSUFDeEIyRixFQUFNM0YsR0FBS3lGLEVBQU9JLFdBQVc3RixHQUVqQyxPQUFPMkYsS0FLSC9DLEtBQUEyQixVQUFZLENBQUM3QyxJQUNuQixHQUFJQSxhQUFrQm9FLFlBQ2xCLE9BQVNDLE1BQU9yRSxFQUFPcUUsT0FHM0IsSUFBS25ELEtBQUtLLG1CQUEwQmtDLEdBQVZ6RCxFQUFxQixPQUFPQSxFQUV0RCxNQUFNc0UsRUFBT3BELEtBQUtNLFdBQVcrQyxLQUFNRCxHQUFTdEUsYUFBa0JzRSxHQUM5RCxRQUFZYixHQUFSYSxFQUFtQixDQUNyQixNQUFNbEMsRUFBS2xCLEtBQUtHLFlBQVk4QixPQUc1QixPQUZBakMsS0FBS0csWUFBWW1ELEtBQUt4RSxJQUdwQnlFLFVBQVdILEVBQUt6RixLQUNoQnVELEdBQUlBLEdBR04sT0FBT3BDLElBaEhUa0IsS0FBS0QsWUFBY0EsRUFDQyxPQUFoQkEsRUFDRkMsS0FBS3FDLFdBQWFtQix5QkFBeUJ4RSxjQUN4QyxJQUFvQixVQUFoQmUsR0FBMkMsdUJBQWhCQSxFQUlsQyxNQUFNLElBQUlrQiwrQkFBK0JsQixLQUh6Q0MsS0FBS3FDLFdBQWFvQixzQkFBc0J6RSxVQUN4Q2dCLEtBQUtLLGNBQWUiLCJmaWxlIjoiYmxhem9yLmV4dGVuc2lvbnMuY2FudmFzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDApO1xuIiwiaW1wb3J0IHsgQ29udGV4dE1hbmFnZXIgfSBmcm9tICcuL0NhbnZhc0NvbnRleHRNYW5hZ2VyJztcblxubmFtZXNwYWNlIENhbnZhcyB7XG4gIGNvbnN0IGJsYXpvckV4dGVuc2lvbnM6IHN0cmluZyA9ICdCbGF6b3JFeHRlbnNpb25zJztcbiAgLy8gZGVmaW5lIHdoYXQgdGhpcyBleHRlbnNpb24gYWRkcyB0byB0aGUgd2luZG93IG9iamVjdCBpbnNpZGUgQmxhem9yRXh0ZW5zaW9uc1xuICBjb25zdCBleHRlbnNpb25PYmplY3QgPSB7XG4gICAgQ2FudmFzMmQ6IG5ldyBDb250ZXh0TWFuYWdlcihcIjJkXCIpLFxuICAgIFdlYkdMOiBuZXcgQ29udGV4dE1hbmFnZXIoXCJ3ZWJnbFwiKVxuICB9O1xuXG4gIGV4cG9ydCBmdW5jdGlvbiBpbml0aWFsaXplKCk6IHZvaWQge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiAhd2luZG93W2JsYXpvckV4dGVuc2lvbnNdKSB7XG4gICAgICAvLyB3aGVuIHRoZSBsaWJyYXJ5IGlzIGxvYWRlZCBpbiBhIGJyb3dzZXIgdmlhIGEgPHNjcmlwdD4gZWxlbWVudCwgbWFrZSB0aGVcbiAgICAgIC8vIGZvbGxvd2luZyBBUElzIGF2YWlsYWJsZSBpbiBnbG9iYWwgc2NvcGUgZm9yIGludm9jYXRpb24gZnJvbSBKU1xuICAgICAgd2luZG93W2JsYXpvckV4dGVuc2lvbnNdID0ge1xuICAgICAgICAuLi5leHRlbnNpb25PYmplY3RcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHdpbmRvd1tibGF6b3JFeHRlbnNpb25zXSA9IHtcbiAgICAgICAgLi4ud2luZG93W2JsYXpvckV4dGVuc2lvbnNdLFxuICAgICAgICAuLi5leHRlbnNpb25PYmplY3RcbiAgICAgIH07XG4gICAgfVxuICB9XG59XG5cbkNhbnZhcy5pbml0aWFsaXplKCk7XG4iLCJleHBvcnQgY2xhc3MgQ29udGV4dE1hbmFnZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbnRleHRzID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSB3ZWJHTE9iamVjdCA9IG5ldyBBcnJheTxhbnk+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29udGV4dE5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSB3ZWJHTENvbnRleHQgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZWFkb25seSBwcm90b3R5cGVzOiBhbnk7XG4gIHByaXZhdGUgcmVhZG9ubHkgd2ViR0xUeXBlcyA9IFtcbiAgICBXZWJHTEJ1ZmZlciwgV2ViR0xTaGFkZXIsIFdlYkdMUHJvZ3JhbSwgV2ViR0xGcmFtZWJ1ZmZlciwgV2ViR0xSZW5kZXJidWZmZXIsIFdlYkdMVGV4dHVyZSwgV2ViR0xVbmlmb3JtTG9jYXRpb25cbiAgXTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoY29udGV4dE5hbWU6IHN0cmluZykge1xuICAgIHRoaXMuY29udGV4dE5hbWUgPSBjb250ZXh0TmFtZTtcbiAgICBpZiAoY29udGV4dE5hbWUgPT09IFwiMmRcIilcbiAgICAgIHRoaXMucHJvdG90eXBlcyA9IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRC5wcm90b3R5cGU7XG4gICAgZWxzZSBpZiAoY29udGV4dE5hbWUgPT09IFwid2ViZ2xcIiB8fCBjb250ZXh0TmFtZSA9PT0gXCJleHBlcmltZW50YWwtd2ViZ2xcIikge1xuICAgICAgdGhpcy5wcm90b3R5cGVzID0gV2ViR0xSZW5kZXJpbmdDb250ZXh0LnByb3RvdHlwZTtcbiAgICAgIHRoaXMud2ViR0xDb250ZXh0ID0gdHJ1ZTtcbiAgICB9IGVsc2VcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjb250ZXh0IG5hbWU6ICR7Y29udGV4dE5hbWV9YCk7XG4gIH1cblxuICBwdWJsaWMgYWRkID0gKGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQsIHBhcmFtZXRlcnM6IGFueSkgPT4ge1xuICAgIGlmICghY2FudmFzKSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY2FudmFzLicpO1xuICAgIGlmICh0aGlzLmNvbnRleHRzLmdldChjYW52YXMuaWQpKSByZXR1cm47XG5cbiAgICB2YXIgY29udGV4dDtcbiAgICBpZiAocGFyYW1ldGVycylcbiAgICAgIGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCh0aGlzLmNvbnRleHROYW1lLCBwYXJhbWV0ZXJzKTtcbiAgICBlbHNlXG4gICAgICBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQodGhpcy5jb250ZXh0TmFtZSk7XG5cbiAgICBpZiAoIWNvbnRleHQpIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb250ZXh0LicpO1xuXG4gICAgdGhpcy5jb250ZXh0cy5zZXQoY2FudmFzLmlkLCBjb250ZXh0KTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmUgPSAoY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCkgPT4ge1xuICAgIHRoaXMuY29udGV4dHMuZGVsZXRlKGNhbnZhcy5pZCk7XG4gIH1cblxuICBwdWJsaWMgc2V0UHJvcGVydHkgPSAoY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCwgcHJvcGVydHk6IHN0cmluZywgdmFsdWU6IGFueSkgPT4ge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmdldENvbnRleHQoY2FudmFzKTtcbiAgICB0aGlzLnNldFByb3BlcnR5V2l0aENvbnRleHQoY29udGV4dCwgcHJvcGVydHksIHZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRQcm9wZXJ0eSA9IChjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50LCBwcm9wZXJ0eTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMuZ2V0Q29udGV4dChjYW52YXMpO1xuICAgIHJldHVybiB0aGlzLnNlcmlhbGl6ZShjb250ZXh0W3Byb3BlcnR5XSk7XG4gIH1cblxuICBwdWJsaWMgY2FsbCA9IChjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50LCBtZXRob2Q6IHN0cmluZywgYXJnczogYW55KSA9PiB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMuZ2V0Q29udGV4dChjYW52YXMpO1xuICAgIHJldHVybiB0aGlzLmNhbGxXaXRoQ29udGV4dChjb250ZXh0LCBtZXRob2QsIGFyZ3MpO1xuICB9XG5cbiAgcHVibGljIGNhbGxCYXRjaCA9IChjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50LCBiYXRjaGVkQ2FsbHM6IGFueVtdW10pID0+IHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5nZXRDb250ZXh0KGNhbnZhcyk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiYXRjaGVkQ2FsbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBwYXJhbXMgPSBiYXRjaGVkQ2FsbHNbaV0uc2xpY2UoMik7XG4gICAgICBpZiAoYmF0Y2hlZENhbGxzW2ldWzFdKSB7XG4gICAgICAgIHRoaXMuY2FsbFdpdGhDb250ZXh0KGNvbnRleHQsIGJhdGNoZWRDYWxsc1tpXVswXSwgcGFyYW1zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2V0UHJvcGVydHlXaXRoQ29udGV4dChcbiAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgIGJhdGNoZWRDYWxsc1tpXVswXSxcbiAgICAgICAgICBBcnJheS5pc0FycmF5KHBhcmFtcykgJiYgcGFyYW1zLmxlbmd0aCA+IDAgPyBwYXJhbXNbMF0gOiBudWxsKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNhbGxXaXRoQ29udGV4dCA9IChjb250ZXh0OiBhbnksIG1ldGhvZDogc3RyaW5nLCBhcmdzOiBhbnkpID0+IHtcbiAgICByZXR1cm4gdGhpcy5zZXJpYWxpemUodGhpcy5wcm90b3R5cGVzW21ldGhvZF0uYXBwbHkoY29udGV4dCwgYXJncyAhPSB1bmRlZmluZWQgPyBhcmdzLm1hcCgodmFsdWUpID0+IHRoaXMuZGVzZXJpYWxpemUobWV0aG9kLCB2YWx1ZSkpIDogW10pKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0UHJvcGVydHlXaXRoQ29udGV4dCA9IChjb250ZXh0OiBhbnksIHByb3BlcnR5OiBzdHJpbmcsIHZhbHVlOiBhbnkpID0+IHtcbiAgICBjb250ZXh0W3Byb3BlcnR5XSA9IHRoaXMuZGVzZXJpYWxpemUocHJvcGVydHksIHZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29udGV4dCA9IChjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50KSA9PiB7XG4gICAgaWYgKCFjYW52YXMpIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjYW52YXMuJyk7XG5cbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jb250ZXh0cy5nZXQoY2FudmFzLmlkKTtcbiAgICBpZiAoIWNvbnRleHQpIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb250ZXh0LicpO1xuXG4gICAgcmV0dXJuIGNvbnRleHQ7XG4gIH1cblxuICBwcml2YXRlIGRlc2VyaWFsaXplID0gKG1ldGhvZDogc3RyaW5nLCBvYmplY3Q6IGFueSkgPT4ge1xuICAgIGlmICghdGhpcy53ZWJHTENvbnRleHQgfHwgb2JqZWN0ID09IHVuZGVmaW5lZCkgcmV0dXJuIG9iamVjdDsgLy9kZXNlcmlhbGl6YXRpb24gb25seSBuZWVkcyB0byBoYXBwZW4gZm9yIHdlYkdMXG5cbiAgICBpZiAob2JqZWN0Lmhhc093blByb3BlcnR5KFwid2ViR0xUeXBlXCIpICYmIG9iamVjdC5oYXNPd25Qcm9wZXJ0eShcImlkXCIpKSB7XG4gICAgICByZXR1cm4gKHRoaXMud2ViR0xPYmplY3Rbb2JqZWN0W1wiaWRcIl1dKTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkob2JqZWN0KSAmJiAhbWV0aG9kLmVuZHNXaXRoKFwidlwiKSkge1xuICAgICAgcmV0dXJuIEludDhBcnJheS5vZiguLi4ob2JqZWN0IGFzIG51bWJlcltdKSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2Yob2JqZWN0KSA9PT0gXCJzdHJpbmdcIiAmJiAobWV0aG9kID09PSBcImJ1ZmZlckRhdGFcIiB8fCBtZXRob2QgPT09IFwiYnVmZmVyU3ViRGF0YVwiKSkge1xuICAgICAgbGV0IGJpblN0ciA9IHdpbmRvdy5hdG9iKG9iamVjdCk7XG4gICAgICBsZXQgbGVuZ3RoID0gYmluU3RyLmxlbmd0aDtcbiAgICAgIGxldCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgYnl0ZXNbaV0gPSBiaW5TdHIuY2hhckNvZGVBdChpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBieXRlcztcbiAgICB9IGVsc2VcbiAgICAgIHJldHVybiBvYmplY3Q7XG4gIH1cblxuICBwcml2YXRlIHNlcmlhbGl6ZSA9IChvYmplY3Q6IGFueSkgPT4ge1xuICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBUZXh0TWV0cmljcykge1xuICAgICAgICByZXR1cm4geyB3aWR0aDogb2JqZWN0LndpZHRoIH07XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLndlYkdMQ29udGV4dCB8fCBvYmplY3QgPT0gdW5kZWZpbmVkKSByZXR1cm4gb2JqZWN0OyAvL3NlcmlhbGl6YXRpb24gb25seSBuZWVkcyB0byBoYXBwZW4gZm9yIHdlYkdMXG5cbiAgICBjb25zdCB0eXBlID0gdGhpcy53ZWJHTFR5cGVzLmZpbmQoKHR5cGUpID0+IG9iamVjdCBpbnN0YW5jZW9mIHR5cGUpO1xuICAgIGlmICh0eXBlICE9IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgaWQgPSB0aGlzLndlYkdMT2JqZWN0Lmxlbmd0aDtcbiAgICAgIHRoaXMud2ViR0xPYmplY3QucHVzaChvYmplY3QpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB3ZWJHTFR5cGU6IHR5cGUubmFtZSxcbiAgICAgICAgaWQ6IGlkXG4gICAgICAgIH07XG4gICAgfSBlbHNlXG4gICAgICByZXR1cm4gb2JqZWN0O1xuICB9XG59XG4iXSwic291cmNlUm9vdCI6IiJ9
\ No newline at end of file